业余民科学习者阅读笔记,垃圾内容
代价函数最小值回顾
在《深度学习的数学:神经网络的数学基础 - 阅读笔记》中提到了,如果要求模型的参数 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)=−η⟮∂x1∂f,∂x2∂f,...,∂xn∂f⟯
求梯度也就是通过链式法则求偏导,这个工作量也是十分巨大的,例如要求
C
T
C_T
CT关于
w
w
w的导数,神经网络有多少层,链式法则就要应用多长;训练数据有多少组,求导相加的项就要多少。这显然是很容易陷入所谓的“导数地狱”。
反向传播算法
原有梯度下降法的缺陷
原有的梯度下降法问题是求导不易,求导过程依赖于训练数据,如果训练数据有上万,层数有个几十层,整个求导估计就炸了。可能我需要观察神经网络的特点,有针对性找到合适的办法来降低复杂度。
反向传播算法是什么
反向传播算法的特点是将繁杂的导数计算替换为数列的递推关系式 - 《深度学习的数学》。
从上图中手工求导的过程中我们可以发现,其实有很多可以复用的地方,例如
如果我们要求
∂
Z
3
1
x
\frac{\partial Z_3^1}{x}
x∂Z31,神经网络与求导过程如下所示:
如果我们要求
∂
Z
3
2
x
\frac{\partial Z_3^2}{x}
x∂Z32,神经网络与求导过程如下所示:
从中我们可以看到整个求导过程,有很多可以复用的地方,这些部分我都使用相同颜色标识了出来。那么如果我们尽可能地求出所有的
∂
Z
i
j
∂
x
\frac {\partial Z_i^j}{\partial x}
∂x∂Zij,那么我都就可以通过搭积木的方式组装出偏导数。其实从这点来看,反向传播算法求解其实就是动态规划。链式求导和复合求导明确了子问题的分解。
如下图所示,如果重新求
∂
Z
3
1
∂
x
\frac {\partial Z_3^1}{\partial x}
∂x∂Z31,我们就可以直接使用,(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}
∂x∂CT,但是大同小异。3Blue2Brown的视频《反向传播演算|附录深入学习第3章》有非常直观的图形化动态展示,如下图所示。
但视频中使用的是个单链的神经网络,其图形更类似于一个有乘法加法交叉构成的树形结构。
反向传播算法的优势
所以我不认为反向传播算法是多么有价值的方法,它只是对神经网络有效。因为每个节点的值 Z j i Z_j^i Zji可能对很多节点 Z j + 1 i Z_{j+1}^i Zj+1i有贡献,所以有些值可以共享,它只是对梯度下降的一种改进。
如果出现了另外一种神经网络结构(虽然可能性很小),可以共享的部分很少,那么反向传播也就是求导中的动态规划没有可以重复使用的子问题,那么还是遇到求导爆炸的问题。
注:动态规划的本质不是复用,不是复用,不是复用
注:31Blue1Brown的视频非常有帮助
读书的重点在于思考和理解,否则无疑是向脑子里倾倒垃圾