梯度惩罚(Pytorch)

起因:希望深度学习输入时小的扰动不会影响结果,我们会在输入端加一些噪声,让模型自己去适应这种扰动,从而提升整体的鲁棒性,CV领域可以直接在图像输入添加噪声,NLP领域因为输入都是one-hot形式,无法直接添加噪声,我们可以考虑在embedding之后的词向量上添加扰动,或者直接在embedding矩阵中添加扰动(FGM方法)。

 细微的噪声加入图层,对结果影响巨大

 f(x+\Delta x,y) 这里取\Delta x为loss的梯度,正向梯度loss下降,反向梯度loss上升。

 \Delta x=\frac{\partial f(x,\theta))}{\partial x}              其中\theta为模型参数

 f(x+\Delta x,\theta)\approx f(x,\theta)+\frac{\partial f(x,\theta)}{\partial x}\cdot \Delta x

模型参数更新(\Delta x 为已经计算出来的常数): 

\begin{align*} \frac{\partial f(x+\Delta x,\theta)}{\partial \theta}&=\frac{\partial f(x,\theta)}{\partial \theta}+\frac{\partial^{2}f(x,\theta)}{\partial x \partial \theta}\cdot\Delta x\\&=\frac{\partial}{\partial \theta}[f(x,\theta)+\frac{1}{2}\cdot(\frac{\partial f(x,\theta)}{\partial x})^{2}]\end{}

-->\triangledown_{\theta} f(x=\Delta x,\theta)=\triangledown_{\theta}[f(x,\theta)+\frac{1}{2}(\triangledown_{x}f(x,\theta))^{2}]

 可以看出在输入中添加的扰动,近似等价于在loss函数中添加梯度惩罚项:

\frac{1}{2}\left ( \triangledown _{x}f(x,\theta )) \right )^{2}

Pytorch简易实现:

self.optim.zero_grad()
loss.backward(retain_graph=True)      # loss梯度回溯两次,要保留计算图
#  ******************************
name_list = ['hidden_layer.0.weight'] # 需要提取梯度的层名
for name, para in model.named_parameters():
    if name in name_list:
        gp = (para.grad ** 2).sum()
        loss += 0.5 * gp * epsilon
        self.optim.zero_grad()        # 梯度清零,在新得到的loss上进行梯度更新
        loss.backward()
        break
# ******************************** 围起来的是在原先基础上需要添加的代码
self.optim.step()

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值