深度学习:梯度裁剪

在深度学习领域,梯度裁剪是一个常用的技巧,用于防止梯度过小或过大。下面简单介绍一下 梯度裁剪的原理与方法。

梯度裁剪简介

在深度学习模型的训练过程中,通过梯度下降算法更新网络参数。一般地,梯度下降算法分为前向传播和反向更新两个阶段。
在前向传播阶段,输入向量通过各层神经元的计算,得到输出向量,假设网络可以用一个抽象函数 f f f表示,则公式为:
y = f ( x ) \begin{equation} y = f(x) \end{equation} y=f(x)
在计算出网络的估计值后,使用类似均方误差的方法,计算出真值和估计值之间的差距,即损失函数loss:
l o s s = 1 n ∑ i = 1 n ( y i g t − y i ) 2 \begin{equation} loss = \frac{1}{n}\sum_{i=1}^{n}(y^{gt}_i-y_i)^2 \end{equation} loss=n1i=1n(yigtyi)2
在反向更新阶段,调整网络参数 θ \theta θ包括权重 W W W和偏差 b b b。为了更新网络参数,首先要计算损失函数对于参数的梯度 ∂ l o s s ∂ θ \frac{\partial loss}{\partial \theta} θloss,然后使用某种梯度更新算法,执行一步梯度下降,以减小损失函数值。如下式:
θ t + 1 = θ t − α ( ∂ l o s s ∂ θ ) \begin{equation} \theta_{t+1} = \theta_{t} - \alpha (\frac{\partial loss}{\partial \theta}) \end{equation} θt+1=θtα(θloss)
注意:从上式可以看出有时候,减小学习率和梯度裁剪是等效的。
在上述训练过程中,可能出现梯度值变得特别小或者特别大甚至溢出的情况,这就是所谓的“梯度消失”和“梯度爆炸”,这时候训练很难收敛 。梯度爆炸一般出现在由初始权重计算的损失特别大的情况,大的梯度值会导致参数更新量过大,最终梯度下降将发散,无法收敛到全局最优。此外, 随着网络层数的增加,"梯度爆炸"的问题可能会越来越明显。考虑具有三层隐藏层网络的链式法则公式,如果每一层的输出相对输入的偏导 > 1,随着网络层数的增加,梯度会越来越大,则有可能发生 “梯度爆炸”。
∂ l o s s ∂ W 1 = ∂ l o s s ∂ f 3 ∂ f 3 ∂ f 2 ∂ f 2 ∂ f 1 ∂ f 1 ∂ w 1 \begin{equation} \frac{\partial loss}{\partial W_1} = \frac{\partial loss}{\partial f_3}\frac{\partial f_3}{\partial f_2}\frac{\partial f_2}{\partial f_1}\frac{\partial f_1}{\partial w_1} \end{equation} W1loss=f3lossf2f3f1f2w1f1

当出现下列情形时,可以认为发生了梯度爆炸:两次迭代间的参数变化剧烈,或者模型参数和损失函数值变为 NaN

如果发生了 “梯度爆炸”,在网络学习过程中会直接跳过最优解,甚至可能会发散(无法收敛),所以有必要进行梯度裁剪,防止网络在学习过程中越过最优解。梯度裁剪方式:设置范围值裁剪和通过 L2 范数裁剪。

梯度裁剪方法

设置范围值裁剪

设置范围值裁剪方法简单,将参数的梯度限定在一个范围内,如果超出这个范围,则进行裁剪(大于阈值为上限阈值 max ⁡ \max max;小于阈值为下限阈值 min ⁡ \min min),但是阈值通常较难确定一个合适的。
y = { x , i f min ⁡ ≤ x ≤ max ⁡ , max ⁡ , i f x ≥ max ⁡ , min ⁡ , x ≤ min ⁡ . \begin{equation} y=\left\{ \begin{aligned} & x , & if \min \leq x \leq \max , \\ & \max , & if x\geq \max , \\ & \min , & x\leq \min . \end{aligned} \right. \end{equation} y= x,max,min,ifminxmax,ifxmax,xmin.

通过 L2 范数裁剪

通过 L2 范数裁剪是用阈值限制梯度向量的 L2 范数,从而对梯度进行裁剪。

y = { x , i f   n o r m ( x ) ≤ c l i p _ n o r m , c l i p _ n o r m × x n o r m ( x ) , i f   n o r m ( x ) > c l i p _ n o r m . \begin{equation} y=\left\{ \begin{aligned} & x , & if \ norm(x) \leq clip\_norm , \\ & \frac{clip\_norm \times x}{norm(x)} , & if \ norm(x) > clip\_norm . \end{aligned} \right. \end{equation} y= x,norm(x)clip_norm×x,if norm(x)clip_norm,if norm(x)>clip_norm.

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI Player

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值