一动机:一直感觉神经网络很简单,神经元加权,然后前向、反向传播调整权值,然后就OK了,可是反向传播一直感觉理解的不透彻,于是萌生手撸的想法,看它到底怎么实现的。
二原理:理解起来不是很难,因为每次层信号A是通过一个权重矩阵W做了向量空间变换,然后又用了激活函数G,所以产生的错误E是一个反向传播的过程。
先定义一下L层神经元输入为Z(L),输出为A(L), A(L)=g(Z(L)),g为激活函数,
第L-1层产生的错误E(L-1)=E(L)*W(L+1).T*g'(z) Cost Function C(L)=E(L-1)*E(L-1) 以此更新W, W=W+rate*
因为要用SGD,我们要找到梯度,然后W在梯度下降的方向更新就可以找到局部最优了。
E(L-1)=A(L-1)-Y=g(Z(L+1))-Y=g(A(L)W+b)-Y
=A(L)*g'
因此=A(L)*g'*E,前向计算A,反向计算E,即可以算出第一层的偏导,更新,相应的W值了。
更详细严格的推导证明见:https://www.cnblogs.com/andywenzhi/p/7295262.html?utm_source=itdadao&utm_medium=referral
三过程
啥也不说,show代码。
效果还不错,嘿嘿。