Guest User

Untitled

a guest
Nov 15th, 2018
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.70 KB | None | 0 0
  1. #Understanding neural networks
  2. #Random approach
  3. def forward_multiply_gate(x,y):
  4. return x*y
  5.  
  6. x = -2
  7. y = 3
  8.  
  9. tweak_amount = 0.01
  10. import random
  11. best_out = -999999999999999999
  12.  
  13. for var in range(100):
  14. x_try = x + tweak_amount*(random.uniform(0, 1)*2 -1)
  15. y_try = y + tweak_amount*(random.uniform(0,1)*2-1)
  16. out = forward_multiply_gate(x_try,y_try)
  17. if (out > best_out):
  18. best_out = out
  19. best_x = x_try
  20. best_y = y_try
  21.  
  22. print (x_try)
  23. print (y_try)
  24. print (best_out)
  25.  
  26.  
  27. strategy approach
  28. compute dervivative
  29. out = forward_multiply_gate(x,y)
  30. h = 0.001
  31. x_h = x + h
  32. out2 = forward_multiply_gate(x_h,y)
  33. x_derivative = (out2-out)/h
  34. y_h = y + h
  35. out3 = forward_multiply_gate(x,y_h)
  36. y_derivative = (out3-out)/h
  37.  
  38. print (x_derivative)
  39. print (y_derivative)
  40.  
  41.  
  42. for var in range(100):
  43. x_try = x + tweak_amount*x_derivative
  44. y_try = y + tweak_amount*y_derivative
  45. out = forward_multiply_gate(x_try,y_try)
  46. if (out > best_out):
  47. best_out = out
  48. best_x = x_try
  49. best_y = y_try
  50.  
  51. print (x_try)
  52. print (y_try)
  53. print (best_out)
  54.  
  55. x_try = x + tweak_amount*y
  56. y_try = y + tweak_amount*x
  57. print (forward_multiply_gate(x_try,y_try))
  58.  
  59.  
  60. def forward_multiply_gate(x,y):
  61. return x*y
  62.  
  63. def forward_add_gate(x,y):
  64. return x+y
  65.  
  66. def forward_circuit(x,y,z):
  67. q = forward_add_gate(x,y)
  68. out = forward_multiply_gate(q,z)
  69. return out
  70.  
  71. x = -2
  72. y = 5
  73. z = -4
  74.  
  75. q = forward_add_gate(x,y)
  76. f = forward_circuit(x,y,z)
  77. derivative_f_wrt_z = q
  78. derivative_f_wrt_q = z
  79. derivative_q_wrt_y = 1.0
  80. derivative_q_wrt_x = 1.0
  81. derivative_f_wrt_x = derivative_q_wrt_x * derivative_f_wrt_q
  82. derivative_f_wrt_y = derivative_q_wrt_y * derivative_f_wrt_q
  83. # print derivative_f_wrt_x
  84. # print derivative_f_wrt_y
  85. # print derivative_f_wrt_z
  86. step_zize = 0.01
  87. x = x + step_zize*derivative_f_wrt_x
  88. y = y + step_zize*derivative_f_wrt_y
  89. z = z + step_zize*derivative_f_wrt_z
  90.  
  91. q = forward_add_gate(x,y)
  92. f = forward_multiply_gate(q,z)
  93.  
  94. print(q)
  95. print(f)
  96.  
  97. print forward_circuit(x,y,z)
  98. print forward_circuit(x,y,z)
  99. print forward_circuit(x_try,y_try,z_try)
  100.  
  101. numerical derivative
  102. x,y,z = -2,5,-4
  103. h = 0.0001
  104. x_derivative = (forward_circuit(x+h,y,z)-forward_circuit(x,y,z))/h
  105. y_derivative = (forward_circuit(x,y+h,z)-forward_circuit(x,y,z))/h
  106. z_derivative = (forward_circuit(x,y,z+h)-forward_circuit(x,y,z))/h
  107. print x_derivative
  108. print y_derivative
  109. print z_derivative
  110. computing analytical derivative properly has made mme correct the function
  111.  
  112. import math
  113.  
  114. def sigmoid(x):
  115. return 1 / (1 + math.exp(-x))
  116.  
  117. class unit():
  118. def __init__(self,value,grad):
  119. self.value = value
  120. self.grad = grad
  121.  
  122. class multiply_gate():
  123. def forward(self,u0,u1):
  124. self.u0 = u0
  125. self.u1 = u1
  126. self.utop = unit(u0.value*u1.value,0.0)
  127. return self.utop
  128.  
  129. def backward(self):
  130. self.u0.grad += self.u1.grad*self.utop.grad
  131. self.u1.grad += self.u0.grad*self.utop.grad
  132.  
  133. class add_gate():
  134. def forward(self,u0,u1):
  135. self.u0 = u0
  136. self.u1 = u1
  137. self.utop = unit(u0.value+u1.value,0.0)
  138. return self.utop
  139.  
  140. def backward(self):
  141. self.u0.grad += 1*self.utop.grad
  142. self.u1.grad += 1*self.utop.grad
  143.  
  144. class sigmoid_gate():
  145. def forward(self,u0):
  146. self.u0 = u0
  147. self.utop = unit(sigmoid(self.u0.value),0.0)
  148. return self.utop
  149.  
  150. def backward(self):
  151. s = sigmoid(self.u0.value)
  152. self.u0.grad += s*(1-s)*self.utop.grad
  153.  
  154. a = unit(1,0)
  155. b = unit(2,0)
  156. c = unit(-3,0)
  157. x = unit(-1,0)
  158. y = unit(3,0)
  159.  
  160. mulg0 = multiply_gate()
  161. mulg1 = multiply_gate()
  162. addg0 = add_gate()
  163. addg1 = add_gate()
  164. sg0 = sigmoid_gate()
  165.  
  166.  
  167. ax = mulg0.forward(a,x)
  168. by = mulg1.forward(b,y)
  169. axpby = addg0.forward(ax,by)
  170. axpbypc = addg1.forward(axpby,c)
  171. s = sg0.forward(axpbypc)
  172.  
  173. # print s.value
  174. # print s.grad
  175.  
  176. s.grad = 1.0
  177. sg0.backward()
  178. addg1.backward()
  179. addg0.backward()
  180. mulg1.backward()
  181. mulg0.backward()
  182.  
  183. print a.grad
  184. print b.grad
  185. print c.grad
  186. print x.grad
  187. print y.grad
  188.  
  189. step_zize = 0.01
  190. a.value += step_zize*a.grad
  191. b.value += step_zize*b.grad
Add Comment
Please, Sign In to add comment