【发布时间】:2017-12-25 00:46:24
【问题描述】:
我是深度学习的初学者。我目前正在为反向传播算法而苦苦挣扎。我在网上找到了一段带有 sigmoid 激活函数的简单神经网络的反向传播的代码。
#Step 1 Collect Data
x = np.array([[0,0,1], [0,1,1], [1,0,1], [1,1,1]])
y = np.array([[0], [1], [1], [0]])
#Step 2 build model
num_epochs = 60000
#initialize weights
syn0 = 2np.random.random((3,4)) - 1
syn1 = 2np.random.random((4,1)) - 1
def nonlin(x,deriv=False):
if(deriv==True): return x*(1-x)
return 1/(1+np.exp(-x))
for j in xrange(num_epochs): #feed forward through layers 0,1, and 2
k0 = x
k1 = nonlin(np.dot(k0, syn0))
k2 = nonlin(np.dot(k1, syn1))
#how much did we miss the target value?
k2_error = y - k2
if (j% 10000) == 0:
print "Error:" + str(np.mean(np.abs(k2_error)))
#in what direction is the target value?
k2_delta = k2_error*nonlin(k2, deriv=True)
#how much did each k1 value contribute to k2 error
k1_error = k2_delta.dot(syn1.T)
k1_delta= k1_error * nonlin(k1,deriv=True)
syn1 += k1.T.dot(k2_delta)
syn0 += k0.T.dot(k1_delta)
我没有得到这行代码:k2_delta = k2_error*nonlin(k2, deriv=True)。在计算局部梯度时,为什么它使用k2_error 乘以 k2 的导数。我们应该使用不同的东西来代替k2_error,因为该算法中的成本函数是绝对值,那么我应该使用[-1,1,1,-1] 的向量作为成本函数的局部梯度吗?我假设这里它使用分析梯度。
【问题讨论】:
-
你展示的表达方式,它们是使用任何特定语言的吗?使用任何特定的框架?然后请edit your question 包含语言和可能的框架作为标签。
标签: python numpy machine-learning neural-network backpropagation