天天看点

【NLP理论到实战】03 梯度下降和反向传播梯度下降和反向传播

文章目录

  • 梯度下降和反向传播
    • 目标
    • 1. 梯度是什么?
    • 2. 偏导的计算
      • 2.1 常见的导数计算
      • 2.2 多元函数求偏导
    • 3. 反向传播算法
      • 3.1 计算图和反向传播
      • 3.2 神经网络中的反向传播
        • 3.2.1 神经网络的示意图
        • 3.2.2 神经网络的计算图

梯度下降和反向传播

目标

  1. 知道什么是梯度下降
  2. 知道什么是反向传播

1. 梯度是什么?

梯度:是一个向量,导数+变化最快的方向(学习的前进方向)

回顾机器学习

收集数据 x x x ,构建机器学习模型 f f f,得到 f ( x , w ) = Y p r e d i c t ​ f(x,w) = Y_{predict}​ f(x,w)=Ypredict​​

判断模型好坏的方法:

l o s s = ( Y p r e d i c t − Y t r u e ) 2 ( 回 归 损 失 ) l o s s = Y t r u e ⋅ l o g ( Y p r e d i c t ) ( 分 类 损 失 ) \begin{aligned} loss & = (Y_{predict}-Y_{true})^2 &(回归损失)\\ loss & = Y_{true} \cdot log(Y_{predict}) &(分类损失) \end{aligned} lossloss​=(Ypredict​−Ytrue​)2=Ytrue​⋅log(Ypredict​)​(回归损失)(分类损失)​

目标:通过调整(学习)参数 w w w,尽可能的降低 l o s s loss loss,那么我们该如何调整 w w w呢?

【NLP理论到实战】03 梯度下降和反向传播梯度下降和反向传播
随机选择一个起始点 w 0 w_0 w0​,通过调整 w 0 w_0 w0​,让loss函数取到最小值
【NLP理论到实战】03 梯度下降和反向传播梯度下降和反向传播
w ​ w​ w​的更新方法:
  1. 计算 w w w的梯度(导数)

    ∇ w = f ( w + 0.000001 ) − f ( w − 0.000001 ) 2 ∗ 0.000001 \begin{aligned} \nabla w = \frac{f(w+0.000001)-f(w-0.000001)}{2*0.000001} \end{aligned} ∇w=2∗0.000001f(w+0.000001)−f(w−0.000001)​​

  2. 更新 w w w

    w = w − α ∇ w w = w - \alpha \nabla w w=w−α∇w

  • 其中:
    • ∇ w < 0 ​ \nabla w <0​ ∇w<0​ ,意味着w将增大
    • ∇ w > 0 \nabla w >0 ∇w>0 ,意味着w将减小
总结:梯度就是多元函数参数的变化趋势(参数学习的方向),只有一个自变量时称为导数

2. 偏导的计算

2.1 常见的导数计算

  • 多项式求导数: f ( x ) = x 5 ​ f(x) = x^5​ f(x)=x5​ , f ′ ( x ) = 5 x ( 5 − 1 ) ​ f^{'}(x) = 5x^{(5-1)}​ f′(x)=5x(5−1)​
  • 基本运算求导: f ( x ) = x y ​ f(x) = xy​ f(x)=xy​ , f ′ ( x ) = y ​ f^{'}(x) = y​ f′(x)=y​
  • 指数求导: f ( x ) = 5 e x ​ f(x) = 5e^x​ f(x)=5ex​ , f ′ ( x ) = 5 e x ​ f^{'}(x) = 5e^x​ f′(x)=5ex​
  • 对数求导: f ( x ) = 5 l n x ​ f(x) = 5lnx​ f(x)=5lnx​ , f ′ ( x ) = 5 x ​ f^{'}(x) = \frac{5}{x}​ f′(x)=x5​​,ln 表示log以e为底的对数
  • 导数的微分形式:

    f ′ ( x ) = d f ( x ) d x 牛 顿 莱 布 尼 兹 \begin{aligned} & f^{'}(x) = & \frac{d f(x)}{dx} \\ & 牛顿 &莱布尼兹 \end{aligned} ​f′(x)=牛顿​dxdf(x)​莱布尼兹​

那么:如何求 f ( x ) = ( 1 + e − x ) − 1 f(x) = (1+e^{-x})^{-1} f(x)=(1+e−x)−1 的导数呢?那就可以使用

f ( x ) = ( 1 + e − x ) − 1 ​ f(x) = (1+e^{-x})^{-1}​ f(x)=(1+e−x)−1​ ==>

f ( a ) = a − 1 , a ( b ) = ( 1 + b ) , b ( c ) = e c , c ( x ) = − x ​ f(a) = a^{-1},a(b) = (1+b),b(c) = e^c,c(x) = -x​ f(a)=a−1,a(b)=(1+b),b(c)=ec,c(x)=−x​

则由求导法则有:

d f ( x ) d x = d f d a × d a d b × d b d c × d c d x = − a − 2 × 1 × e c × ( − 1 ) = − ( 1 + e − x ) − 2 × e − x × ( − 1 ) = e − x ( 1 + e − x ) − 2 \begin{aligned} \frac{d f(x)}{dx} & = \frac{df}{da} \times \frac{da}{db} \times \frac{db}{dc}\times \frac{dc}{dx} \\ &=-a^{-2} \times 1\times e^c \times (-1) \\ &= -(1+e^{-x})^{-2} \times e^{-x} \times (-1) \\ &= e^{-x}(1+e^{-x})^{-2} \end{aligned} dxdf(x)​​=dadf​×dbda​×dcdb​×dxdc​=−a−2×1×ec×(−1)=−(1+e−x)−2×e−x×(−1)=e−x(1+e−x)−2​

2.2 多元函数求偏导

一元函数,即有一个自变量。类似 f ( x ) f(x) f(x)

多元函数,即有多个自变量。类似 f ( x , y , z ) , 三 个 自 变 量 x , y , z f(x,y,z),三个自变量x,y,z f(x,y,z),三个自变量x,y,z

多元函数求偏导过程中:对某一个自变量求导,其他自变量当做常量即可

例1:

f ( x , y , z ) = a x + b y + c z d f ( x , y , z ) d x = a d f ( x , y , z ) d y = b d f ( x , y , z ) d z = c \begin{aligned} &f(x,y,z) &= &ax+by+cz \\ &\frac{df(x,y,z)}{dx} &= &a \\ &\frac{df(x,y,z)}{dy} &= &b \\ &\frac{df(x,y,z)}{dz} &= &c \end{aligned} ​f(x,y,z)dxdf(x,y,z)​dydf(x,y,z)​dzdf(x,y,z)​​====​ax+by+czabc​

例2:

f ( x , y ) = x y d f ( x , y ) d x = y d f ( x , y ) d y = x \begin{aligned} &f(x,y) &= &xy \\ &\frac{df(x,y)}{dx} &= & y\\ &\frac{df(x,y)}{dy} &= &x \end{aligned} ​f(x,y)dxdf(x,y)​dydf(x,y)​​===​xyyx​

例3:

f ( x , w ) = ( y − x w ) 2 d f ( x , w ) d x = − 2 w ( y − x w ) d f ( x , w ) d w = − 2 x ( y − x w ) \begin{aligned} &f(x,w) &= &(y-xw)^2 \\ &\frac{df(x,w)}{dx} &= & -2w(y-xw)\\ &\frac{df(x,w)}{dw} &= & -2x(y-xw) \end{aligned} ​f(x,w)dxdf(x,w)​dwdf(x,w)​​===​(y−xw)2−2w(y−xw)−2x(y−xw)​

练习:

已知 J ( a , b , c ) = 3 ( a + b c ) , 令 u = a + v , v = b c ​ J(a,b,c) = 3(a+bc),令u=a+v,v = bc​ J(a,b,c)=3(a+bc),令u=a+v,v=bc​,求a,b,c各自的偏导数。

令 : J ( a , b , c ) = 3 u d J d a = d J d u × d u d a = 3 × 1 d J d b = d J d u × d u d v × d v d b = 3 × 1 × c d J d c = d J d u × d u d v × d v d c = 3 × 1 × b \begin{aligned} 令:& J(a,b,c) = 3u\\ \frac{dJ}{da} &=\frac{dJ}{du} \times \frac{du}{da} = 3\times1 \\ \frac{dJ}{db} &=\frac{dJ}{du} \times \frac{du}{dv} \times \frac{dv}{db} = 3\times1\times c \\ \frac{dJ}{dc} &=\frac{dJ}{du} \times \frac{du}{dv} \times \frac{dv}{dc} = 3\times1\times b \\ \end{aligned} 令:dadJ​dbdJ​dcdJ​​J(a,b,c)=3u=dudJ​×dadu​=3×1=dudJ​×dvdu​×dbdv​=3×1×c=dudJ​×dvdu​×dcdv​=3×1×b​

3. 反向传播算法

3.1 计算图和反向传播

计算图:通过图的方式来描述函数的图形

在上面的练习中, J ( a , b , c ) = 3 ( a + b c ) , 令 u = a + v , v = b c J(a,b,c) = 3(a+bc),令u=a+v,v = bc J(a,b,c)=3(a+bc),令u=a+v,v=bc,把它绘制成计算图可以表示为:

【NLP理论到实战】03 梯度下降和反向传播梯度下降和反向传播

绘制成为计算图之后,可以清楚的看到向前计算的过程

之后,对每个节点求偏导可有:

【NLP理论到实战】03 梯度下降和反向传播梯度下降和反向传播

那么反向传播的过程就是一个上图的从右往左的过程,自变量 a , b , c a,b,c a,b,c各自的偏导就是连线上的梯度的乘积:

d J d a = 3 × 1 d J d b = 3 × 1 × c d J d c = 3 × 1 × b \begin{aligned} \frac{dJ}{da} &= 3 \times 1 \\ \frac{dJ}{db} &= 3 \times 1 \times c \\ \frac{dJ}{dc} &= 3 \times 1 \times b \end{aligned} dadJ​dbdJ​dcdJ​​=3×1=3×1×c=3×1×b​

3.2 神经网络中的反向传播

3.2.1 神经网络的示意图

w 1 , w 2 , . . . . w n ​ w_1,w_2,....w_n​ w1​,w2​,....wn​​表示网络第n层权重

w n [ i , j ] w_n[i,j] wn​[i,j]表示第n层第i个神经元,连接到第n+1层第j个神经元的权重。

【NLP理论到实战】03 梯度下降和反向传播梯度下降和反向传播

3.2.2 神经网络的计算图

将3.2.1的神经网络示意图转化为计算图如下:
【NLP理论到实战】03 梯度下降和反向传播梯度下降和反向传播
其中:
  1. ∇ o u t ​ \nabla out​ ∇out​是根据损失函数对预测值进行求导得到的结果
  2. f函数可以理解为激活函数

问题:那么此时 w 1 [ 1 , 2 ] w_1[1,2] w1​[1,2]的偏导该如何求解呢?

通过观察,发现从 o u t out out 到 w 1 [ 1 , 2 ] w_1[1,2] w1​[1,2]的来连接线有两条

【NLP理论到实战】03 梯度下降和反向传播梯度下降和反向传播

所以结果如下:

d o u t d W 1 [ 1 , 2 ] = x 1 ∗ f ′ ( a 2 ) ∗ ( W 2 [ 2 , 1 ] ∗ f ′ ( b 1 ) ∗ W 3 [ 1 , 1 ] ∗ ∇ o u t + W 2 [ 2 , 2 ] ∗ f ′ ( b 2 ) ∗ W 3 [ 2 , 1 ] ∗ ∇ o u t ) \frac{dout}{dW_1[1,2]} = x1*f^{'}(a2)*(W_2[2,1]*f^{'}(b1)*W_3[1,1]*\nabla out +W_2[2,2]*f^{'}(b2)*W_3[2,1]*\nabla out) dW1​[1,2]dout​=x1∗f′(a2)∗(W2​[2,1]∗f′(b1)∗W3​[1,1]∗∇out+W2​[2,2]∗f′(b2)∗W3​[2,1]∗∇out)

公式分为两部分:

  • 括号外:左边红线部分
  • 括号内
    • 加号左边:右边红线部分
    • 加号右边:右边蓝线部分
但是这样做,当模型很大的时候,更新某一个神经元的参数,需要计算该神经元连接到输出的后面所有神经元参数的导数,计算量非常大
所以反向传播的思想就是一个递归的形式,一层一层的向后传播误差即可,这样能大大减小计算量,同时很容易实现,如下图所示:
【NLP理论到实战】03 梯度下降和反向传播梯度下降和反向传播

计算过程如下

∇ W 3 [ 1 , 1 ] = f ( b 1 ) ∗ ∇ o u t ( 计 算 W 3 [ 1 , 1 ] 梯 度 ) ∇ W 3 [ 2 , 1 ] = f ( b 2 ) ∗ ∇ o u t ( 计 算 W 3 [ 2 , 1 ] 梯 度 ) ∇ b 1 = f ′ ( b 1 ) ∗ W 3 [ 1 , 1 ] ∗ ∇ o u t ( 计 算 W 3 [ 2 , 1 ] 梯 度 ) ∇ b 2 = f ′ ( b 2 ) ∗ W 3 [ 2 , 1 ] ∗ ∇ o u t ( 计 算 W 3 [ 2 , 1 ] 梯 度 ) \begin{aligned} &\nabla W_3[1,1] = f(b_1)*\nabla out & (计算W_3[1,1]梯度)\\ &\nabla W_3[2,1] = f(b_2)*\nabla out & (计算W_3[2,1]梯度)\\ \\ &\nabla b_1= f^{'}(b_1)*W_3[1,1]*\nabla out & (计算W_3[2,1]梯度)\\ &\nabla b_2= f^{'}(b_2)*W_3[2,1]*\nabla out & (计算W_3[2,1]梯度)\\ \end{aligned} ​∇W3​[1,1]=f(b1​)∗∇out∇W3​[2,1]=f(b2​)∗∇out∇b1​=f′(b1​)∗W3​[1,1]∗∇out∇b2​=f′(b2​)∗W3​[2,1]∗∇out​(计算W3​[1,1]梯度)(计算W3​[2,1]梯度)(计算W3​[2,1]梯度)(计算W3​[2,1]梯度)​

更新参数之后,继续反向传播

【NLP理论到实战】03 梯度下降和反向传播梯度下降和反向传播

计算过程如下(计算该层以计算 ∇ W 2 [ 1 , 2 ] \nabla W_2[1,2] ∇W2​[1,2]和 ∇ a 2 \nabla a_2 ∇a2​为例):

∇ W 2 [ 1 , 2 ] = f ( a 1 ) ∗ ∇ b 2 ∇ a 2 = f ′ ( a 2 ) ∗ ( w 2 [ 2 , 1 ] ∇ b 1 + W 2 [ 2 , 2 ] ∇ b 2 ) \begin{aligned} &\nabla W_2[1,2] = f(a_1)* \nabla b_2 \\ &\nabla a_2 = f^{'}(a_2)*(w_2[2,1]\nabla b_1 +W_2[2,2] \nabla b_2) \end{aligned} ​∇W2​[1,2]=f(a1​)∗∇b2​∇a2​=f′(a2​)∗(w2​[2,1]∇b1​+W2​[2,2]∇b2​)​

继续反向传播

【NLP理论到实战】03 梯度下降和反向传播梯度下降和反向传播

计算过程如下(计算该层以计算 ∇ W 1 [ 1 , 2 ] \nabla W_1[1,2] ∇W1​[1,2]和 ∇ x 1 \nabla x_1 ∇x1​为例):

▽ W 1 [ 1 , 2 ] = x 1 ∗ ▽ a 2 ▽ x 1 = ( W 1 [ 1 , 1 ] ∗ ▽ a 1 + w 1 [ 1 , 2 ] ∗ ▽ a 2 ) ∗ x 1 ′ \begin{aligned} &▽W_1[1,2]= x_1*▽a_2\\ &▽x_1= (W_1[1,1]*▽a_1+w_1[1,2]*▽a_2)*x_1^{'} \end{aligned} ​▽W1​[1,2]=x1​∗▽a2​▽x1​=(W1​[1,1]∗▽a1​+w1​[1,2]∗▽a2​)∗x1′​​

通用递归式子的描述如下

∇ w i , j l = f ( a i l ) ∗ ∇ a j i + 1 ∇ a i l = f ′ ( a i l ) ∗ ( ∑ j = 1 m w i , j ∗ ∇ a j l + 1 ) \nabla w^{l}_{i,j} = f(a^l_i)* \nabla a^{i+1}_{j}\\ \nabla a^{l}_i = f'(a^l_i)*(\sum_{j=1}^{m}w_{i,j}*\nabla a_j^{l+1}) ∇wi,jl​=f(ail​)∗∇aji+1​∇ail​=f′(ail​)∗(j=1∑m​wi,j​∗∇ajl+1​)

继续阅读