深度学习的数学:反向传播算法

业余民科学习者阅读笔记,垃圾内容

代价函数最小值回顾

在《深度学习的数学:神经网络的数学基础 - 阅读笔记》中提到了,如果要求模型的参数 A r g 0 ,   A r g 1 ,   . . . ,   A r g n Arg_0,\ Arg_1,\ ...,\ Arg_n Arg0, Arg1, ..., Argn。给定一组打了标签的数据 < i n p u t 1 ,   t 1 > ,   < i n p u t 2 ,   t 2 > ,   . . . ,   < i n p u t n ,   t n > <input_1,\ t_1>,\ <input_2,\ t_2>,\ ...,\ <input_n,\ t_n> <input1, t1>, <input2, t2>, ..., <inputn, tn>,我们可以通过平方差的方式,构造代价函数 C T C_T CT

C T = C 1 + C 2 + . . . + C n C_T = C_1 + C_2 + ... + C_n CT=C1+C2+...+Cn

其中

C n = 1 2 ( M ( i n p u t n ) − t n ) 2 C_n=\frac{1}{2}(M(input_n) - t_n)^2 Cn=21(M(inputn)tn)2,其中 M M M是包含 A r g 0 ,   A r g 1 ,   . . . ,   A r g n Arg_0,\ Arg_1,\ ...,\ Arg_n Arg0, Arg1, ..., Argn

我们要求的是多元函数 C T C_T CT在自变量 A r g 0 ,   A r g 1 ,   . . . ,   A r g n Arg_0,\ Arg_1,\ ...,\ Arg_n Arg0, Arg1, ..., Argn取什么值的时候,函数值 C T C_T CT取得最小值。

传统的方法是通过下面的方式求 C T C_T CT的最小值,但是对于深度神经网络来说,参数动辄成千上万,使得求导数不太可能。

对于函数 z = f ( x , y ) z=f(x,y) z=f(x,y)取得最小值的必要条件是 δ f δ x = 0 , δ f δ y = 0 \frac{\delta f}{\delta x}=0, \frac{\delta f}{\delta y}=0 δxδf=0,δyδf=0

既然求所有所有偏导不太可行,那么在神经网络中使用梯度下降法行不行呢?梯度下降法也需要求代价函数 C T C_T CT在某个点的导数,

( Δ x 1 , Δ x 2 ,   . . . ,   Δ x n ) = − η ⟮ ∂ f ∂ x 1 , ∂ f ∂ x 2 , . . . , ∂ f ∂ x n ⟯ (\Delta x_1, \Delta x_2,\ ...,\ \Delta x_n ) = -\eta \lgroup \frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2}, ..., \frac{\partial f}{\partial x_n} \rgroup (Δx1,Δx2, ..., Δxn)=ηx1f,x2f,...,xnf

求梯度也就是通过链式法则求偏导,这个工作量也是十分巨大的,例如要求 C T C_T CT关于 w w w的导数,神经网络有多少层,链式法则就要应用多长;训练数据有多少组,求导相加的项就要多少。这显然是很容易陷入所谓的“导数地狱”。
梯度下降

反向传播算法

原有梯度下降法的缺陷

原有的梯度下降法问题是求导不易,求导过程依赖于训练数据,如果训练数据有上万,层数有个几十层,整个求导估计就炸了。可能我需要观察神经网络的特点,有针对性找到合适的办法来降低复杂度。

反向传播算法是什么

反向传播算法的特点是将繁杂的导数计算替换为数列的递推关系式 - 《深度学习的数学》。

从上图中手工求导的过程中我们可以发现,其实有很多可以复用的地方,例如

如果我们要求 ∂ Z 3 1 x \frac{\partial Z_3^1}{x} xZ31,神经网络与求导过程如下所示:
第一幅

如果我们要求 ∂ Z 3 2 x \frac{\partial Z_3^2}{x} xZ32,神经网络与求导过程如下所示:
第二幅
从中我们可以看到整个求导过程,有很多可以复用的地方,这些部分我都使用相同颜色标识了出来。那么如果我们尽可能地求出所有的 ∂ Z i j ∂ x \frac {\partial Z_i^j}{\partial x} xZij那么我都就可以通过搭积木的方式组装出偏导数其实从这点来看,反向传播算法求解其实就是动态规划。链式求导和复合求导明确了子问题的分解

如下图所示,如果重新求 ∂ Z 3 1 ∂ x \frac {\partial Z_3^1}{\partial x} xZ31,我们就可以直接使用,(1 * 2 * 2 + 1 * (-1) * 0) + (1 * 2 * 2 + 1 * (-1) * 0) + (1 * 2 * 0 + 1 * 1 * 2) = 6。
搭积木
而反向传播的求的是 ∂ C T ∂ x \frac{\partial C_T}{\partial x} xCT,但是大同小异。3Blue2Brown的视频《反向传播演算|附录深入学习第3章》有非常直观的图形化动态展示,如下图所示。
图形化展示
但视频中使用的是个单链的神经网络,其图形更类似于一个有乘法加法交叉构成的树形结构。

反向传播算法的优势

所以我不认为反向传播算法是多么有价值的方法,它只是对神经网络有效。因为每个节点的值 Z j i Z_j^i Zji可能对很多节点 Z j + 1 i Z_{j+1}^i Zj+1i有贡献,所以有些值可以共享,它只是对梯度下降的一种改进。

如果出现了另外一种神经网络结构(虽然可能性很小),可以共享的部分很少,那么反向传播也就是求导中的动态规划没有可以重复使用的子问题,那么还是遇到求导爆炸的问题。
注:动态规划的本质不是复用,不是复用,不是复用

注:31Blue1Brown的视频非常有帮助

读书的重点在于思考和理解,否则无疑是向脑子里倾倒垃圾

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值