上一期,神奇的神经网络说的是:
神经网络是多个神经元按照一定规则连接起来的网络。它之所以神奇,是因为它可以用激励函数不断逼近我们想要“拟合”的目标。
神经元表达式:
假设我们有一个目标target,要使得输出Output=Target,我们可以:
1、更改激励函数F ;
2、更改权重w ;
3,更改输入x;
4、更改偏差b
其实,只有权重w,和偏差b可以不断更新,其他都在建立模型时候就确定好了。我们假设只更新权重w,b=0。
那么,权重w应该怎样更新,来满足输出的要求呢?
我们先来抛个砖:随机更新。权重w的值随机生成,假设随机100次,这100次更新中,我们选择输出Output最接近目标Target的一次就好了。
但是这个方法太不机智,浪费计算量,而且找到的不一定就是最优的。我们应该找到一个方法,朝着最优的权重w值不断更新,使我们的Output = Target。也就是我们今天的主题——误差反向传播 Back Propagation。
WHAT:什么是误差反向传播(Back Propagation)?
1、反向传播算法的发展目标:找到一种训练多层神经网络的方法,于是呢,它可以学习合适的表达,使得目标Target与输出Output不断接近。这个“不断接近”,可以量化为:
2、以上就是更新权重的目标方程式。我们要使得Loss 损失降到最小,得到想要的输出。那么,现在问题变成:如何找一个方程式的最小值——梯度下降法 (Gradient Descent)。
3、什么是梯度下降法(Gradient Descent)?
如下图,假设初始权重就是我们的小黑球, 目标函数为 J(w), 我们的任务是找到目标函数最小值 Global cost minimum。小黑球可以去到曲线上的任何一个位置,我们应该给它怎样一个指令,让它一步步的走向最低点呢?
我们可以告诉它,朝着斜率变小的方向走!斜率就是此时的梯度,而这个方法就是梯度下降法。当梯度变得足够小的时候,我们就认为已经找到了最低点。
值得注意的是,我们也需要限小黑球的步长,因为如果步长太小,小黑球要花很多的时间找到最低点;如果步长太大,它可能错过最低点。
4、同理,权重w的更新,利用梯度下降法,可以表达如下。
其中,ŋ是学习率(即步长),是损失函数Loss Function对于w的偏微分。随着权重w的更新,损失函数沿着其偏微分相反方向逐渐变小。
HOW: 误差反向传播是怎样实现的
贴心的部分来了,看下面的图解。
5、图中,每一个节点,都包含两个值:该节点的输出值和梯度值。输出值有正向传播计算得到,梯度值由反向传播计算得到。
6、绿色部分就是正向传播,数值从左往右进行计算。
首先,从左往右,x,y,z初始赋值分别为-2,5,-4
然后,计算公式 f(x, y, z) = (x + y)*z
结果, q = z +y => 3, f = q*z => -12。
7、正向传播结束后,反向传播会从后往前依次计算出各个节点的梯度值。然后,根据梯度下降法则一步步,重复的更新的权重值,最终达到误差函数的最小值。
8、红色的部分就是反向传播,数值反向,从右往左进行计算。
公式f(x, y, z) = (x + y)*z ,我们可以用链式原则,把公式拆分开来。
首先 q = x + y,分别对x,y的偏导是:
然后 f = q*z,分别对q,z的偏导是:
最后链接到一起,x的偏导是。对y,z的偏导同理。
初始值为1,那么,计算q和z的偏导,分别是-4,3。对x,y对z的偏导分别是-4,-4,3。
9、权重的更新
(真的勇士,敢于直面惨淡的计算!来吧,勇士,过了这关,后面就平坦多了)
假设此时学习率η=0.1,仅对一个输入点进行采样,且目标输出为Target=-10,那么此时的误差Loss应该为:
x对于Loss Function的偏导为:
x根据梯度下降法,更新为:
同理,也可用来更新y和z。
WHAT'S MORE:
反向传播会重复n次, 不断更新权重w,直到输出值的误差收敛到足够小。下图反映了两种方法的收敛结果。
两条曲线的总体趋势都是随着反向传播的次数增加,权重的不断更新,误差越来越小,直到趋近于0,达到收敛。
批量训练Batch Training是一次选取一定量的多个训练样本,这些样本我们称为一个Batch。然后将一个Batch作为训练数据,计算一个Batch的输出与目标之间的误差,求它们的平均值,并用这个平均误差来计算梯度。这样的误差收敛会更加平稳,如红色折线所示。
随机训练Stochastic Training是仅仅随机输入一个训练样本,也就是Batch Training 的Batch为1 的时候,计算该训练样本的输出Output与目标Target的差值。这样的误差收敛过程可能不平稳,如蓝线所示。
好的,神奇的神经网络介绍结束啦~~
下期我们聊聊Word2Vec吧~
那下次见~~
————————The End————————
停了两周没有更新,感觉很愧疚。。。上上周是五一,我疲于旅游,本来还想要不要更新一篇游记,然后,泰国网很差就是发不出去。气,不发了。
上周,就开始写back propagation了,真的好难写啊。。。写写改改的。。。总觉得没说清楚。。。back propagation应该算得上神经网络最难啃的部分了。。。过了这part,后面应该会顺畅很多吧。。。
关于这个公众号的一些小事情
公众号叫做OOOCaptain,致敬死亡诗社。同时感谢我成长的路上,那些像船长一样引导着我的人~ O Captain! My Captain!
我接下来的每一篇文章,都是我的成长(主要是在Deep learning的路上)。希望,它们也能变成你的成长~!
少年,要记得以梦为马,要记得抖腿吃瓜,要记得关注我哦~~~
领取专属 10元无门槛券
私享最新 技术干货