深度学习流程(四)之反向传播

本文深入探讨了深度学习中的前向传播、梯度下降和反向传播原理,特别是针对交叉熵损失函数的梯度计算。此外,讨论了梯度爆炸和梯度消失现象,解释了它们对模型训练的影响,并提出了包括ReLU激活函数、梯度裁剪和权重正则化在内的解决方案。
摘要由CSDN通过智能技术生成

一、前向传播

在前向传播过程中,要保留神经元的输出。

二、梯度下降

首先定义残差,设有 L 层,损失为 c ∂ c ∂ z j L = ∂ c ∂ a j L ⋅ ∂ a j L ∂ z j L = δ j L \frac{\partial c}{\partial z_j^L}=\frac{\partial c}{\partial a_j^L}\cdot \frac{\partial a_j^L}{\partial z_j^L}=\delta_j^L zjLc=ajLczjLajL=δjL 对于网络中,任意一层 l ∂ c ∂ z j l = ∑ k ∂ c ∂ z k l + 1 ⋅ ∂ z k l + 1 ∂ a j l ⋅ ∂ a j l ∂ z j l = ∑ k δ j l + 1 ⋅ w j k l + 1 ⋅ ∂ a j l ∂ z j l = δ j l \begin{aligned} \frac{\partial c}{\partial z_j^l} &= \sum_k \frac{\partial c}{\partial z_k^{l+1}}\cdot \frac{\partial z_k^{l+1}}{\partial a_j^l} \cdot \frac{\partial a_j^{l}}{\partial z_j^l}\\ &=\sum_k \delta_j^{l+1} \cdot w_{jk}^{l+1} \cdot \frac{\partial a_j^{l}}{\partial z_j^l} \\ &= \delta_j^l \end{aligned} zjlc=kzkl+1cajlzkl+1zjlajl=kδjl+1wjkl+1zjlajl=δjl 然后计算参数的梯度 ∂ c ∂ w k j c = ∂ c ∂ z j l ⋅ ∂ z j l ∂ w k j l = δ l l ⋅ a k l − 1 \frac{\partial c}{\partial w_{kj}^c}=\frac{\partial c}{\partial z_j^l}\cdot \frac{\partial z_j^l}{\partial w_{kj}^l}=\delta_l^l \cdot a_k^{l-1} wkjcc=zjlcwkjlzjl=δllakl1 w k j ← w k j − l r ⋅ ∂ c ∂ w i j w_{kj} \leftarrow w_{kj}-lr \cdot \frac{\partial c}{\partial w_{ij}} wkjwkjlrwijc

三、交叉熵反向传播

损失函数 L = − [ y l o g y ^ + ( 1 − y ) l o g ( 1 − y ^ ) ] , y = σ ( h θ ( x ) ) L=-[ylog\hat{y}+(1-y)log(1-\hat{y})], y=\sigma(h_\theta(x)) L=[ylogy^+(1y)log(1y^)],y=σ(hθ(x)) 所以其导数为 ∂ L ∂ θ j = − [ y ⋅ 1 y ^ ⋅ ∂ y ^ ∂ θ j + ( 1 − y ) ⋅ 1 1 − y ^ ⋅ ( − 1 ) ⋅ ∂ y ^ ∂ θ j ] = − [ y ⋅ 1 σ ⋅ σ ⋅ ( 1 − σ ) ⋅ ∂ h θ ( x ) ∂ θ j + ( 1 − y ) ⋅ σ ⋅ ( 1 − σ ) 1 − σ ⋅ ( − 1 ) ∂ h θ ( x ) ∂ θ j ] = ( σ − y ) ∂ h θ ( x ) ∂ θ j \begin{aligned} \frac{\partial L}{\partial \theta_j} &= -[y\cdot \frac{1}{\hat y}\cdot \frac{\partial \hat y}{\partial \theta_j} +(1-y)\cdot \frac{1}{1-\hat y} \cdot (-1) \cdot \frac{\partial \hat y}{\partial\theta_j}]\\ &=-[y\cdot \frac{1}{\sigma}\cdot\sigma \cdot(1-\sigma)\cdot \frac{\partial h_\theta(x)}{\partial \theta_j}+(1-y)\cdot\frac{\sigma\cdot(1-\sigma)}{1-\sigma}\cdot(-1)\frac{\partial h_\theta(x)}{\partial \theta_j}] \\ &= (\sigma -y)\frac{\partial h_\theta(x)}{\partial \theta_j}\end{aligned} θjL=[yy^1θjy^+(1y)1y^1(1)θjy^]=[yσ1σ(1σ)θjhθ(x)+(1y)1σσ(1σ)(1)θjhθ(x)]=(σy)θjhθ(x)

四、softmax+交叉熵损失求梯度

softmax函数为 p = e z k ∑ k e z k p = \frac{e^{z_k}}{\sum_k e^{z_k}} p=kezkezk
令前一层的输出是 a p a_p ap,输入参数为 w p k w_{pk} wpk ,激活函数前的输出 z k = ∑ p w p k a p z_k =\sum_p w_{pk}a_p zk=pwpkap,输出 a k = e z k ∑ k e z k a_k= \frac{e^{z_k}}{\sum_k e^{z_k}} ak=kezkezk

那么损失为 L = ∑ k y k log ⁡ a k L=\sum_k y_k\log a_k L=kyklogak 因为最后的预测为其中一类,设预测为第 j 类,那么 L = y j log ⁡ a j L = y_j\log a_j L=yjlogaj y j y_j yj 为 1, L = log ⁡ a j L=\log a_j L=logaj ∂ L ∂ w p k = ∂ L ∂ a j ⋅ ∂ a j ∂ z i ⋅ ∂ z i ∂ w p k = ∂ L ∂ a j ⋅ ∂ a j ∂ z i ⋅ a p \frac{\partial L}{\partial w_{pk}}=\frac{\partial L}{\partial a_j}\cdot \frac{\partial a_j}{\partial z_i}\cdot \frac{\partial z_i}{\partial w_{pk}}=\frac{\partial L}{\partial a_j}\cdot \frac{\partial a_j}{\partial z_i}\cdot a_p wpkL=ajLziajwpkzi=ajLziajap
i = j i=j i=j 时,也就是第 i 类的 z i z_i zi 求偏导 ∂ a j ∂ z i = ∂ ( e z j ∑ k e z k ) ∂ z i = ∂ ( e z j ∑ k e z k ) ∂ z j = e z j ∑ k e z k − e z j e z j [ ∑ k e z k ] 2 = e z j ∑ k e z k ( 1 − e z j ∑ k e z k ) = a j ( 1 − a j ) \begin{aligned} \frac{\partial a_j}{\partial z_i} &= \frac{\partial(\frac{e^{z_j}}{\sum_ke^{z_k}})}{\partial z_i}\\&= \frac{\partial(\frac{e^{z_j}}{\sum_ke^{z_k}})}{\partial z_j} \\ &= \frac{e^{z_j}}{\sum_ke^{z_k}}-\frac{e^{z_j}e^{z_j}}{[\sum_ke^{z_k}]^2} \\ &= \frac{e^{z_j}}{\sum_ke^{z_k}}(1- \frac{e^{z_j}}{\sum_ke^{z_k}})\\&=a_j(1-a_j)\end{aligned} ziaj=zi(kezkezj)=zj(kezkezj)=kezkezj[kezk]2ezjezj=kezkezj(1kezkezj)=aj(1aj) i ≠ j i\neq j i=j 时, ∂ a j ∂ z i = ∂ ( e z j ∑ k e z k ) ∂ z i = 0 ∑ k e z k − e z j e z i [ ∑ k e z k ] 2 = − a j a i \begin{aligned} \frac{\partial a_j}{\partial z_i} &= \frac{\partial(\frac{e^{z_j}}{\sum_ke^{z_k}})}{\partial z_i}\\&=\frac{0}{\sum_ke^{z_k}}-\frac{e^{z_j}e^{z_i}}{[\sum_ke^{z_k}]^2} \\ &=-a_ja_i \end{aligned} ziaj=zi(kezkezj)=kezk0[kezk]2ezjezi=ajai 所以,当 i = j i=j i=j 时, ∂ L ∂ z i = − 1 a j ⋅ ( − a j a i ) = a i \frac{\partial L}{\partial z_i}=-\frac{1}{a_j}\cdot (-a_ja_i)=a_i ziL=aj1(ajai)=ai i ≠ j i\neq j i=j 时, ∂ L ∂ z i = − 1 a j ⋅ a j ( 1 − a j ) = a j − 1 \frac{\partial L}{\partial z_i}=-\frac{1}{a_j}\cdot a_j(1-a_j)=a_j-1 ziL=aj1aj(1aj)=aj1

五、梯度消失和爆炸

5.1 梯度爆炸

5.1.1 什么是梯度爆炸

梯度爆炸指的是神经网络在训练过程中大的误差梯度不断累积,导致模型权重出现重大更新,造成模型的不稳定,无法利用训练数据进行学习。

误差梯度是神经网络训练过程中计算的方向和数量,用于以正确的方向和合适的量更新网络权重。在深层网络或者循环神经网络中,误差梯度可以再更新中累积,变成非常大的梯度,然后导致网络权重的大幅更新,并因此使网络变得不稳定,在极端情况下,权重的值变得非常大,以至于溢出,导致NaN值。

5.1.2 梯度爆炸解决办法

  1. 重新设计网络模型
    在深度神经网络中,梯度爆炸可以通过重新设计层数更少的网络来解决。同时使用更新小的batch也有好处。
  2. 使用ReLU激活函数
    在深度多层感知机神经网络,梯度爆炸的发生可能是因为激活函数。
  3. 梯度裁剪
  4. 权重正则化

5.2 梯度消失

  1. 更换激活函数,使用 relu 等
  2. Batch Normalization
  3. 更换网络,使用 resnet 或者 LSTM
  4. 使用预训练的网络加fine-tuning
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值