最近正在学习吴恩达机器学习神经网络的反向传播算法,主要通过反向传播来求解损失函数的导出来降低梯度下降的复杂性。学到这里发现感觉难以能够理解其中的思想,甚至视频也反复看了好多遍,因此也网上找了一些资料进行参考和学习,在这里整理一下子的思路,推导一下涉及到的公式。
课程中的结论
下面的公式是是课程中得出来的结论,也告诉了我们如何用这是公式求解梯度,但并未告诉其由来。
正向传播法递推公式
下面是正向传播的公式,比较好理解,因此不在赘述
.......
输出层的误差公式
通过下面的公式可以计算出最后一层的误差值
隐藏层的误差公式
通过下面公式依次向前递推每个神精元的随时函数
损失函数的导数公式
通过下面公式对损失函数进行求导
梯度下降公式
为什么不直接求导
我们先看一下具体的代价函数
可以知道假设函数并不简单,是整个神经元组成的网络,因此求导过程十分复杂,而且交由程序计算梯度时计算量也十分庞大,效率极低。
反向传播法
接下来我们到了正题,我们需要找到一个方便的方法来进行梯度下降,这时候我们将损失函数的导数公式进行变形
这个偏微分的含义就是
层的输入对输出产生的影响大小,我们先记它为
深入理解“误差δ”
通过这个 可以代替计算
层相关
的损失函数偏导数 ,也就是计算
层这个
来计算
层的梯度 。另外通过
的定义我们知道是某一个神经元输入对最终神经网络输出的影响大小,然而代价函数中的
,展开来是一个非常复杂的解构,但是也能够知道当前层
会受到下一层
的影响。有兴趣的同学可以展开来看一下。有了上面思路,我们就能够很好的反向传输法的原理了,如图
反向传播法与正向传播时倒过来的,其中
代表最后一层的误差,依次往前传递,这里除了最后一层的误差是真实存在的,其他神经元的误差实际上并不真实存在,所以这边的是广义上的误差,其中
代表是
层的第个神经元所产生的误差。其中定义为:
推导输出层的δ
在不考虑正则项的情况下,我们先推导 层(也就是输出层)的"误差":
因为 时候的导数项不存在,因此可以将第二个Σ符号去除,变为下式
因为 是最后一层,
就是最终输出,因此
,也就是
,继续推导得到:
我们来展开一下
最终可得输出层的δ:
推导隐藏层的δ
推导隐藏层的δ,这里可以直接使用上一次的δ来计算。
这是计算层某个δ的公式:
这是计算计算层δ向量的公式:
结尾
这就是课程结论中的公式,个人理解和推导规程都在这边了。
具体过程应该算比较详细了,其他的公式应该也就很轻松的就能知道的。
通过这种方式计算梯度的好出就是可以简化程序的计算量。
如果有推导错误或者理解错误的地方,还请各位同学见谅,谢谢。