如何理解“梯度下降法”?什么是“反向传播”?通过一个视频,一步一步全部搞明...

梯度下降法
(我是借鉴了up主小黑晚安喵的关于这个视频的笔记,在他的基础上稍微加上了自己的理解)
前文回顾:用交叉熵作为损失函数,结果是理想模型与神经网络计算出来的模型的差距的定量表达
调整网络来减小差距 -> 反向传播
梯度下降法,是反向传播中的一种
权值W和偏置b对结果产生影响,优先调整那些对结果有重大影响的参数。
反向传播是把偏差反向传到参数上,根据参数对偏差的贡献大小来修改参数
a[3],第三层的输出值;a[2],第二层的输出值
σ,激活函数
J,损失函数
调整a[2]就是向前传播的过程。
第1层中,每个神经元要修改的偏差是根据所有第2层的来的
方向:梯度的反方向,即数值减小最快的方向;数值:偏差
过曲面做切面,黑色切线指向定点最快的方向
梯度就是左图的红色向量,该向量与黑线在xy平面上投影
梯度分解
我们知道损失函数就是训练值和目标值的偏差,我们训练的目的就是让训练值趋向于目标值,也就是让损失函数最小化,而如何让损失函数尽快最小化呢,就是利用梯度,因为梯度就是上升最快的方向,对他取反,也就是使得损失函数趋向于0最快的方向,然后考虑到长远的利益,我们需要人为设置一个超参数,即学习η,接下来就可以进行修正操作
显然,损失函数J(3)是关于W(3),a(2),b(3)的函数,我们用α,β,γ分别表示J对W,a,b的偏导,因此W和b的修正就是W=W-η*α,b=b-η*γ,而由于a作为上一层的输出结果,我们不能直接改变它,只有通过修改上一层的参数W和b,从而达到间接修改a的目的。所以我们先将β记下。
事实上,β与损失函数是相似的,他们都是隐藏层和目标的一个差值,所以我们可以把β同样的看作是一个损失函数,记为J(2)=a(2)(修正前)-a(2)(修正后)=β,然后继续进行反向传播,开启下一轮
倒数第三层,a[0]就是输入了,是一个常量,因此到此为止参数修正全部完成,也就意味着一轮学习结束
根据W[l]i和b[l]i,得出z[l]i,通过激活函数,得到感知机结果a[l]i
利用矩阵写出第l层的感知机输出a[l]
输出层,损失函数就是y和a[l]的差
拓展成多个输出分类,去掉常数y,反向传播偏差如图
假定有L+1层,链式求导
注意,这里的W,a,b均为向量,因为每一个感知机都受前面一层所有感知机的影响(我觉得这里的J(l+1)应该写成J(l)更合适,因为最终的损失函数J是a(l)的输出与a(l)的目标之间的误差,写成J(l)更合适,但是他是通过J+1层算出来的,后面我都写成J(l))
显然J(l)是关于W(l),a(l-1),b(l)的函数,而且输出层l层有i个感知机,每一个感知机都可以对其求梯度,如图
由于a(l)=σ(z(l))=σ(W(l)*a(l-1)+b(l)),利用链式法则,我们可以得到最下方的梯度
注:W是向量,是分别对每个分量求偏导
通过J(l)修改W和b,作为l层的参数;
a(l-1)不能直接上手修改,但可以当作l-1层的损失函数的值J(l-1)
从上图的最下方我们可以看到损失函数的形式,仍然是一个求偏导的形式,所以第一个视频里面的类似链式法则的形式就是这么来的
至此,形成递归,迭代
需要注意的是,现在的l层(原l-1层)的每一个感知机都接受l+1层(原l层)所有感知机传过来的损失函数J(l),也就是说相当于每个感知机(假设是第i个)都接受传进来的m=n(l+1)个损失函数(事实上是每一个损失函数这个向量在i上的分量),这时候求平均就可以降维当做只有一个偏差了!
反向传播到输入层,a[0]分量不存在,则只剩下可以修改的W和b