我一直在尝试从头开始编写一个神经网络,并且观看了一些视频来了解它的实现方式。
于是我发现了这个指南,它用Python构建了一个简单的神经网络。
X = np.array([ [0,0,1],[0,1,1],[1,0,1],[1,1,1] ])y = np.array([[0,1,1,0]]).Tsyn0 = 2*np.random.random((3,4)) - 1syn1 = 2*np.random.random((4,1)) - 1for j in xrange(60000): l1 = 1/(1+np.exp(-(np.dot(X,syn0)))) l2 = 1/(1+np.exp(-(np.dot(l1,syn1)))) l2_delta = (y - l2)*(l2*(1-l2)) l1_delta = l2_delta.dot(syn1.T) * (l1 * (1-l1)) syn1 += l1.T.dot(l2_delta) syn0 += X.T.dot(l1_delta)
我发现最后两行有些 confusing,不应该是 syn1 -= l1.T.dot(l2_delta)
和 syn0 -= X.T.dot(l1_delta)
吗?
我以为在梯度下降中你应该减去斜率,但这里似乎是加上的。这是梯度上升吗?
能有人解释一下最后两行是如何工作的吗?
回答:
你是对的:在梯度下降中,你应该减去斜率。
这个程序正是这么做的,减去斜率。l1.T.dot(l2_delta)
和 X.T.dot(l1_delta)
是负斜率,这就是为什么代码的作者使用 +=
而不是 -=
。