ClipGradByNorm

class paddle.nn. ClipGradByNorm ( clip_norm ) [源代码]

将输入的多维Tensor

ClipGradByNorm - 图1

的L2范数限制在 clip_norm 范围之内。

  • 如果L2范数大于 clip_norm ,则该 Tensor 会乘以一个系数进行压缩

  • 如果L2范数小于或等于 clip_norm ,则不会进行任何操作。

输入的 Tensor 不是从该类里传入, 而是默认选择优化器中输入的所有参数的梯度。如果某个参数 ParamAttr 中的 need_clip 值被设置为 False ,则该参数的梯度不会被裁剪。

该类需要在初始化 optimizer 时进行设置后才能生效,可参看 optimizer 文档(例如: cn_api_fluid_optimizer_SGD )。

裁剪公式如下:

ClipGradByNorm - 图2

其中

ClipGradByNorm - 图3

代表 XX 的L2范数

norm(X)=(∑i=1n|xi|2)12norm(X)=(∑i=1n|xi|2)12

参数:

  • clip_norm (float) - 所允许的二范数最大值。

代码示例

  1. import paddle
  2. x = paddle.uniform([10, 10], min=-1.0, max=1.0, dtype='float32')
  3. linear = paddle.nn.Linear(in_features=10, out_features=10,
  4. weight_attr=paddle.ParamAttr(need_clip=True),
  5. bias_attr=paddle.ParamAttr(need_clip=False))
  6. out = linear(x)
  7. loss = paddle.mean(out)
  8. loss.backward()
  9. clip = paddle.nn.ClipGradByNorm(clip_norm=1.0)
  10. sdg = paddle.optimizer.SGD(learning_rate=0.1, parameters=linear.parameters(), grad_clip=clip)
  11. sdg.step()