Week 3: 深度学习补遗:反向传播与逻辑回归

摘要

本周内容主要围绕深度学习的数学本质、激活函数、前向传播与反向传播展开。介绍了深度学习的数学本质,介绍引入非线性激活函数对模型表达能力的重要性。通过矩阵形式描述了神经网络的前向传播过程,展示了多层网络的计算结构。详细推导了反向传播算法,阐明了梯度计算和参数更新的数学原理。最后,结合线性代数矩阵表示,系统总结了神经网络训练的整体流程,阐述了梯度下降法及其在多层网络中的的形态。

Abstract

This week’s content primarily revolves around the mathematical essence of deep learning, activation functions, forward propagation, and backpropagation. It introduces the mathematical essence of deep learning and highlights the importance of introducing nonlinear activation functions to enhance the model’s expressive power. The forward propagation process of neural networks is described in matrix form, illustrating the computational structure of multi-layer networks. The backpropagation algorithm is derived in detail, elucidating the mathematical principles of gradient computation and parameter updating. Finally, combined with linear algebra matrix representation, the overall process of neural network training is systematically summarized, and the gradient descent method and its forms in multi-layer networks are elaborated.

1 深度学习

1.1 数学本质

深度学习的本质实际上还是基本的数学运算的叠加。借用李宏毅老师的例子:期望对视频浏览量进行预测,假设有当日浏览量输入 x x x第二天浏览量作为目标输出 y y y,希望有一个函数 f ( x ) f(x) f(x)对其的关系进行拟合。可以假设其关系是线性的。
y = w x + b \begin{equation} y=wx+b \end{equation} y=wx+b
就可以尝试用线性回归的方法求得 w w w b b b的估计值。但线性的关系对于实际问题往往太过简单,而线性关系的组合仍然是线性的关系,就要考虑给其引入非线性。

1.2 激活函数

S i g m o i d Sigmoid Sigmoid函数是一个在生物学中常见的S型函数,也称为S型生长曲线。在信息科学中,由于其单增以及反函数单增等性质, S i g m o i d Sigmoid Sigmoid函数常被用作神经网络的激活函数,变量映射到 [ 0 , 1 ] [0,1] [0,1]之间。
σ ( x ) = 1 1 + e − x \sigma(x) = \frac {1} {1+e^{-x}} σ(x)=1+ex1
其导数为 σ ′ ( x ) = e − x ( 1 + e − x ) 2 = σ ( x ) ( 1 − σ ( x ) ) \sigma'(x)=\frac{e^{-x}}{(1+e^{-x})^2}=\sigma(x)(1-\sigma(x)) σ(x)=(1+ex)2ex=σ(x)(1σ(x))

Sigmoid函数图像

因此, y y y x x x之间的关系可以改写为 y = c S i g m o i d ( w x + b ) y=cSigmoid(wx+b) y=cSigmoid(wx+b),通过 c c c w w w b b b的更改来调整 S i g m o i d Sigmoid Sigmoid函数的形状,并通过多段 S i g m o i d Sigmoid Sigmoid的组合拟合原函数。通过使用激活函数 S i g m o i d Sigmoid Sigmoid引入非线性,使神经网络能建模复杂的关系。

1.3 矩阵表示与前向传播

有时输入并不是单特征,我们将输入 x x x看做是一个输入向量 x = [ x 1 x 2 . . . x n ] \mathbf{x}=\begin{bmatrix} x_1 \\ x_2 \\ ... \\ x_n \end{bmatrix} x= x1x2...xn ,就可以把其转化为线性代数中的矩阵运算。 z = ∑ i = 1 n w i x i + b = w T x + b z = \sum_{i=1}^n w_i x_i + b = \mathbf{w}^T \mathbf{x} + b z=i=1nwixi+b=wTx+b为各特征的加权和,经过激活函数 S i g m o i d Sigmoid Sigmoid,得到 f ( x ) = S i g m i o d ( x ) = S i g m o i d ( ∑ i = 1 n w i x i + b ) f(\mathbf{x})=Sigmiod(\mathbf{x})=Sigmoid(\sum_{i=1}^n w_i x_i + b) f(x)=Sigmiod(x)=Sigmoid(i=1nwixi+b),这样就完成了一次前向传播。

一个简单的带三层隐藏层的神经网络可以用如下图表示。

Hidden Layer 3
Hidden Layer 2
Hidden Layer 1
Input Layer
w_11=1
w_12=-2
w_21=-1
w_22=1
h_31
h_32
h_21
h_22
h_11 = 4, b_1 = 1
h_12 = -2, b_2 = 0
x_1 = 1
x_2 = -1
y_1
y_2

输入层到隐藏层1的数学计算可以表示为:

[ 1 − 2 − 1 1 ] [ 1 − 1 ] + [ 1 0 ] = [ 4 − 2 ] \begin{bmatrix} 1 & -2\\ -1 & 1\\ \end{bmatrix} \begin{bmatrix} 1 \\ -1 \\ \end{bmatrix} + \begin{bmatrix} 1 \\ 0 \\ \end{bmatrix}= \begin{bmatrix} 4 \\ -2 \\ \end{bmatrix} [1121][11]+[10]=[42]
其中, [ 1 − 2 − 1 1 ] \begin{bmatrix} 1 & -2 \\ -1 & 1 \end{bmatrix} [1121]的第一行是第一个神经元的权重、第二行是第二个神经元的权重, [ 1 0 ] \begin{bmatrix} 1 \\ 0 \end{bmatrix} [10]为偏差值Bias,而 [ 1 − 1 ] \begin{bmatrix} 1 \\ -1 \end{bmatrix} [11]为输入特征,这个算式实际上为 w x + b wx+b wx+b的矩阵表示。每一个神经元实质上还包含了一个激活函数(比如 S i g m o i d Sigmoid Sigmoid),因此实际上一层的运算过程为 f ( w x + b ) f(wx+b) f(wx+b)

1.4 损失函数

在训练过程中,需要有一个标准,用来判断预测结果的好坏,于是引入了损失函数。在Week 2[Github / CSDN]中, M S E ( y , y ^ ) = 1 n ∑ i = 1 n ( y i − y i ^ ) 2 MSE(y, \hat{y}) = \frac{1}{n}\sum^{n}_{i=1}(y_i-\hat{y_i})^2 MSE(y,y^)=n1i=1n(yiyi^)2 M A E ( y , y ^ ) = 1 n ∑ i = 1 n ∣ y i − y i ^ ∣ MAE(y, \hat{y})=\frac{1}{n}\sum^n_{i=1}\left|y_i-\hat{y_i}\right| MAE(y,y^)=n1i=1nyiyi^可以作为回归任务的损失函数,一般称为 L ( y , y ^ ) L(y,\hat{y}) L(y,y^) y ^ \hat{y} y^为预测值, y y y为真实值。

在回归任务中, L 1 l o s s ( y , y ^ ) = w ( θ ) ∑ i = 1 n ∣ y ^ i − y i ∣ L1loss(y, \hat{y}) = w(\theta)\sum_{i=1}^n |\hat{y}_i - y_i| L1loss(y,y^)=w(θ)i=1ny^iyi L 2 l o s s ( y , y ^ ) = w ( θ ) ∑ i = 1 n ( y ^ i − y i ) 2 L2loss(y, \hat{y}) = w(\theta)\sum_{i=1}^n (\hat{y}_i - y_i)^2 L2loss(y,y^)=w(θ)i=1n(y^iyi)2 w ( θ ) w(\theta) w(θ)为对应真实值的权重。可以注意到 M A E ( y , y ^ ) = 1 n L 1 l o s s ( y , y ^ ) MAE(y, \hat{y})=\frac{1}{n}L1loss(y, \hat{y}) MAE(y,y^)=n1L1loss(y,y^) M S E ( y , y ^ ) = 1 n L 2 l o s s ( y , y ^ ) MSE(y, \hat{y})=\frac{1}{n}L2loss(y, \hat{y}) MSE(y,y^)=n1L2loss(y,y^),实质上就是对应的未均质化形式。因此 L 2 l o s s L2loss L2loss M S E MSE MSE类似,更加凸显异常值,放大误差,梯度更加平滑;同时, L 1 l o s s L1loss L1loss M A E MAE MAE类似,对异常值不敏感,梯度线性增长。

1.5 反向传播

利用损失函数求得损失值后,进行反向传播更新参数,并沿着负梯度方向更新梯度的方法,称为梯度下降法,梯度可以表示为 ∂ L ∂ θ \frac{\partial L}{\partial \theta} θL,即损失函数对反向传播目标变量的偏导数。梯度下降法的本质,是在曲线上随机取一个点,计算其在函数曲线上梯度的值,沿着梯度下降的方向走 η ∂ L ∂ θ \eta\frac{\partial L}{\partial \theta} ηθL,逼近损失函数 L ( θ ) L(\theta) L(θ)的全局最小值。

反向传播的过程可以表示为:
w ← w − η ∂ L ∂ w \begin{equation} w \gets {}w-\eta\frac{\partial L}{\partial w} \end{equation} wwηwL
在几何上来说,梯度就是函数增加变快速度最大的方向,而其反方向,就应当是函数减小速度最快的方向,沿着梯度下降,就能更快找到其最小值。

1.6 反向传播的数学演算

对于这样一个简单的单隐藏层的神经网络,使用 M S E MSE MSE作为损失函数 L ( y , y ^ ) = 1 2 ( y − y ^ ) 2 L(y, \hat{y}) = \frac{1}{2} (y - \hat{y})^2 L(y,y^)=21(yy^)2 S i g m o i d Sigmoid Sigmoid作为激活函数。

Hidden Layer
Input Layer
w_11
w_12
w_21
w_22
w_1
w_2
h_1, bias, sigma
h_2, bias, sigma
x_1
x_2
a, bias, sigma
y
1.6.1 前向传播

易得,隐藏层神经元1的激活后加权和为
{ h 1 = σ ( w 11 x 1 + w 12 x 2 + b 1 ) h 2 = σ ( w 21 x 1 + w 22 x 2 + b 2 ) \begin{cases} h_1 = \sigma(w_{11} x_1 + w_{12} x_2 + b_1) \\ h_2 = \sigma(w_{21} x_1 + w_{22} x_2 + b_2) \end{cases} {h1=σ(w11x1+w12x2+b1)h2=σ(w21x1+w22x2+b2)
输出层为
y ^ = σ ( w 1 h 1 + w 2 h 2 + b ) \hat{y}= \sigma( w_{1} h_1 + w_{2} h_2 + b) y^=σ(w1h1+w2h2+b)
这样就完成了一次前向传播。

1.6.2 反向传播

先求输出 y ^ \hat{y} y^对权重 w 1 w_1 w1的梯度,根据链式求导法则, ∂ L ∂ w 1 = ∂ L ∂ a ⋅ ∂ a ∂ w 1 \frac{\partial L}{\partial w_1}=\frac{\partial L}{\partial a} \cdot \frac{\partial a}{\partial w_1} w1L=aLw1a a a a为输出层 S i g m o i d Sigmoid Sigmoid函数的输入,因此可以求出梯度。
∂ L ∂ w 1 = ∂ L ∂ a ⋅ ∂ a ∂ w 1 \frac{\partial L}{\partial w_1}=\frac{\partial L}{\partial a} \cdot \frac{\partial a}{\partial w_1} w1L=aLw1a

∂ L ∂ a = ∂ L ∂ y ^ ⋅ ∂ y ^ ∂ a = − ( y − y ^ ) ⋅ σ ′ ( a ) \frac{\partial L}{\partial a} = \frac{\partial L}{\partial \hat{y}} \cdot \frac{\partial \hat{y}}{\partial a} = - (y - \hat{y}) \cdot \sigma'(a) aL=y^Lay^=(yy^)σ(a)

可得, ∂ L ∂ y ^ = ∂ ∂ y ^ ( 1 2 ( y − y ^ ) 2 ) = − ( y − y ^ ) \frac{\partial L}{\partial \hat{y}}=\frac{\partial}{\partial \hat{y}}(\frac{1}{2} (y - \hat{y})^2)=-(y-\hat{y}) y^L=y^(21(yy^)2)=(yy^),而 σ ′ ( x ) = e − x ( 1 + e − x ) 2 = σ ( x ) ( 1 − σ ( x ) ) = y ^ ( 1 − y ^ ) \sigma'(x)=\frac{e^{-x}}{(1+e^{-x})^2}=\sigma(x)(1-\sigma(x))=\hat{y}(1-\hat{y}) σ(x)=(1+ex)2ex=σ(x)(1σ(x))=y^(1y^)

因此, ∂ L ∂ a = − ( y − y ^ ) ⋅ y ^ ⋅ ( 1 − y ^ ) \frac{\partial L}{\partial a} = - (y - \hat{y}) \cdot \hat{y} \cdot (1 - \hat{y}) aL=(yy^)y^(1y^),而 ∂ a ∂ w 1 = ∂ ∂ w 1 ( w 1 h 1 + w 2 h 2 + b ) = h 1 \frac{\partial a}{\partial w_1}=\frac{\partial} {\partial w_1}(w_1h_1+w_2h_2+b)=h_1 w1a=w1(w1h1+w2h2+b)=h1,即 ∂ L ∂ w 1 = ∂ L ∂ a ⋅ ∂ a ∂ w 1 = − ( y − y ^ ) ⋅ y ^ ⋅ ( 1 − y ^ ) ⋅ h 1 \frac{\partial L}{\partial w_1} = \frac{\partial L}{\partial a} \cdot \frac{\partial a}{\partial w_1} = - (y - \hat{y}) \cdot \hat{y} \cdot (1 - \hat{y}) \cdot h_1 w1L=aLw1a=(yy^)y^(1y^)h1。同理, ∂ L ∂ b = ∂ L ∂ a ⋅ ∂ a ∂ b = − ( y − y ^ ) ⋅ y ^ ⋅ ( 1 − y ^ ) ⋅ 1 \frac{\partial L}{\partial b} = \frac{\partial L}{\partial a} \cdot \frac{\partial a}{\partial b} = - (y - \hat{y}) \cdot \hat{y} \cdot (1 - \hat{y}) \cdot 1 bL=aLba=(yy^)y^(1y^)1,可求出对偏置 b b b的梯度。

这样就完成了输出层和隐藏层之间的权重以及偏置的梯度求解。

接着求解隐藏层的梯度,先求解损失对隐藏层输出 h 1 h_1 h1 的梯度: ∂ L ∂ h 1 = ∂ L ∂ a ⋅ ∂ a ∂ h 1 = − ( y − y ^ ) ⋅ y ^ ⋅ ( 1 − y ^ ) ⋅ w 1 \frac{\partial L}{\partial h_1} = \frac{\partial L}{\partial a} \cdot \frac{\partial a}{\partial h_1} = - (y - \hat{y}) \cdot \hat{y} \cdot (1 - \hat{y}) \cdot w_1 h1L=aLh1a=(yy^)y^(1y^)w1;再求解隐藏层激活输入 $ a_1 $ 的梯度: ∂ L ∂ a 1 = ∂ L ∂ h 1 ⋅ ∂ h 1 ∂ a 1 = [ − ( y − y ^ ) ⋅ y ^ ⋅ ( 1 − y ^ ) ⋅ w 1 ] ⋅ σ ′ ( a 1 ) = [ − ( y − y ^ ) ⋅ y ^ ⋅ ( 1 − y ^ ) ⋅ w 1 ] ⋅ h 1 ⋅ ( 1 − h 1 ) \frac{\partial L}{\partial a_1} = \frac{\partial L}{\partial h_1} \cdot \frac{\partial h_1}{\partial a_1} = \left[ - (y - \hat{y}) \cdot \hat{y} \cdot (1 - \hat{y}) \cdot w_1 \right] \cdot \sigma'(a_1) = \left[ - (y - \hat{y}) \cdot \hat{y} \cdot (1 - \hat{y}) \cdot w_1 \right] \cdot h_1 \cdot (1 - h_1) a1L=h1La1h1=[(yy^)y^(1y^)w1]σ(a1)=[(yy^)y^(1y^)w1]h1(1h1)

最后完成对权重 w 11 w_{11} w11和偏置 b 1 b_1 b1的梯度求解, ∂ L ∂ w 11 = ∂ L ∂ a 1 ⋅ ∂ a 1 ∂ w 11 = [ − ( y − y ^ ) ⋅ y ^ ⋅ ( 1 − y ^ ) ⋅ w 1 ⋅ h 1 ⋅ ( 1 − h 1 ) ] ⋅ x 1 \frac{\partial L}{\partial w_{11}} = \frac{\partial L}{\partial a_1} \cdot \frac{\partial a_1}{\partial w_{11}} = \left[ - (y - \hat{y}) \cdot \hat{y} \cdot (1 - \hat{y}) \cdot w_1 \cdot h_1 \cdot (1 - h_1) \right] \cdot x_1 w11L=a1Lw11a1=[(yy^)y^(1y^)w1h1(1h1)]x1 ∂ L ∂ b 1 = ∂ L ∂ a 1 ⋅ ∂ a 1 ∂ b 1 = [ − ( y − y ^ ) ⋅ y ^ ⋅ ( 1 − y ^ ) ⋅ w 1 ⋅ h 1 ⋅ ( 1 − h 1 ) ] \frac{\partial L}{\partial b_1} = \frac{\partial L}{\partial a_1} \cdot \frac{\partial a_1}{\partial b_1} = \left[ - (y - \hat{y}) \cdot \hat{y} \cdot (1 - \hat{y}) \cdot w_1 \cdot h_1 \cdot (1 - h_1) \right] b1L=a1Lb1a1=[(yy^)y^(1y^)w1h1(1h1)]

最后还需要完成所有权重与偏置参数的更新,即可完成一次反向传播,其中 η \eta η是学习率,学习率需要人工指定,这种需要人工指定的参数被称为超参数
w i j ← w i j − η ∂ L ∂ w i j , w i ← w i − η ∂ L ∂ w i , b i ← b i − η ∂ L ∂ b i \begin{equation} w_{ij} \gets w_{ij} - \eta \frac{\partial L}{\partial w_{ij}}, \quad w_i \gets w_i - \eta \frac{\partial L}{\partial w_i}, \quad b_i \gets b_i - \eta \frac{\partial L}{\partial b_i} \end{equation} wijwijηwijL,wiwiηwiL,bibiηbiL

1.6.3 线性代数表示

利用线性代数中的矩阵,这个过程可以被非常简洁的表示出来,正向传播可以有表示如下。

  1. 输入层到隐藏层

h = [ h 1 h 2 ] = σ ( W x + b ) = σ ( [ w 11 w 12 w 21 w 22 ] [ x 1 x 2 ] + [ b 1 b 2 ] ) = σ ( [ w 11 x 1 + w 12 x 2 + b 1 w 21 x 1 + w 22 x 2 + b 2 ] ) \mathbf{h}=\begin{bmatrix} h_1 \\ h_2 \end{bmatrix} = \sigma(\mathbf{W}\mathbf{x}+\mathbf{b}) = \sigma(\begin{bmatrix} w_{11} & w_{12} \\ w_{21} & w_{22} \end{bmatrix} \begin{bmatrix} x_1 \\ x_2 \end{bmatrix} + \begin{bmatrix} b_1 \\ b_2 \end{bmatrix}) = \sigma(\begin{bmatrix} w_{11} x_1 + w_{12} x_2 + b_1 \\ w_{21} x_1 + w_{22} x_2 + b_2 \end{bmatrix}) h=[h1h2]=σ(Wx+b)=σ([w11w21w12w22][x1x2]+[b1b2])=σ([w11x1+w12x2+b1w21x1+w22x2+b2])

  1. 隐藏层到输出层

y ^ = σ ( w T h + b ) = [ w 1 w 2 ] [ h 1 h 2 ] = w 1 h 1 + w 2 h 2 + b \begin{equation} \hat{y}=\sigma(\mathbf{w}^T \mathbf{h} + \mathbf{b}) = [\begin{matrix}w_1 & w_2\end{matrix}] \begin{bmatrix} h_1 \\ h_2 \\\end{bmatrix} = w_1 h_1 + w_2 h_2 + b \end{equation} y^=σ(wTh+b)=[w1w2][h1h2]=w1h1+w2h2+b

而对于所有的参数 θ ⃗ = [ θ 1 θ 2 … ] \vec{\theta}=\begin{bmatrix}\theta_1\\\theta_2\\\dots\end{bmatrix} θ = θ1θ2 ,进行模型训练的目标是求得令损失函数 L L L最小的一组 θ ∗ = a r g   min ⁡ θ ( ) \theta^*=arg\,\underset{\theta}{\min}() θ=argθmin()。首先,需要对 θ \theta θ初始化为随机值,记为 θ 0 \theta^0 θ0

进行完正向传播的步骤即需要进行反向传播,求梯度过程如下。
g g r a d i e n t = [ ∂ L ∂ θ 1 ∣ θ = θ 0 ∂ L ∂ θ 2 ∣ θ = θ 0 … ] \begin{equation} \underset{gradient}{\mathbf{g}}=\begin{bmatrix} \left.\frac{\partial L}{\partial \theta_1}\right|_{\theta=\theta^0} \\ \left.\frac{\partial L}{\partial \theta_2}\right|_{\theta=\theta^0} \\ \dots\end{bmatrix} \end{equation} gradientg= θ1L θ=θ0θ2L θ=θ0
也可以写为 g = ∇ L ( θ 0 ) \mathbf{g}=\nabla L(\theta^0) g=L(θ0)

求得各参数梯度,进行参数更新。
[ θ 1 1 θ 2 1 … ] ← [ θ 1 1 θ 2 1 … ] − [ η ∂ L ∂ θ 1 ∣ θ = θ 0 η ∂ L ∂ θ 2 ∣ θ = θ 0 … ] \begin{equation} \begin{bmatrix} \theta_1^1 \\ \theta_2^1 \\ \dots \end{bmatrix} \gets \begin{bmatrix} \theta_1^1 \\ \theta_2^1 \\ \dots \end{bmatrix}- \begin{bmatrix} \eta \left.\frac{\partial L}{\partial \theta_1}\right|_{\theta=\theta^0} \\ \eta \left.\frac{\partial L}{\partial \theta_2}\right|_{\theta=\theta^0} \\ \dots \end{bmatrix} \end{equation} θ11θ21 θ11θ21 ηθ1L θ=θ0ηθ2L θ=θ0
即前述的公式(3),可以写成 θ 1 ← θ 0 − η g \theta^1\gets\theta^0-\eta\mathbf{g} θ1θ0ηg

每完成一次这样的步骤,就完成了一次训练,即一个Epoch。需要做出区分的是,一个Epoch可以被划分为多个Batch,而完成了一个Batch就是完成了一次Update,但只有完成了所有的Batch才是完成了一个Epoch。

1.7 神经网络

一个在Week 1[Github / CSDN]中提到的有 n n n层隐藏层的全连接前馈神经网络结构利用线性代数可以表示为:
y ⃗ = f ( x ⃗ ) = σ ( W n … σ ( W 2 ( σ ( W 1 x ⃗ + b 1 ) + b 2 ) ⋯ + b n ) \vec{y}=f(\vec{x})=\sigma(\mathbf{W}^n\dots\sigma(\mathbf{W}^2(\sigma(\mathbf{W}^1 \vec{x}+\mathbf{b}^1)+\mathbf{b}^2)\dots+\mathbf{b}^n) y =f(x )=σ(Wnσ(W2(σ(W1x +b1)+b2)+bn)
利用矩阵的形式表示,能充分利用GPU的并行计算能力,指数级加速运算。···

总结

本周参考了李宏毅老师的课程,对深度学习神经网络正向传播与反向传播的过程进行了手推,并利用了Latex和Mermaid进行书写和神经网络图的绘制,复习了神经网络正向传播的原理以及基本的概念,利用手推反向传播的方式夯实了梯度下降的思想以及链式求导法则,同时借助线性代数夯实了对神经网络的理解。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐