fluid.clip

ErrorClipByValue

class paddle.fluid.clip.ErrorClipByValue(max, min=None)[源代码]

将张量值的范围压缩到 [min, max]。

给定一个张量 t ,该操作将它的值压缩到 minmax 之间

  • 任何小于min(最小值)的值都被设置为min
  • 任何大于max(最大值)的值都被设置为max
参数:
  • max (foat) - 要修剪的最大值。
  • min (float) - 要修剪的最小值。如果用户没有设置,将被框架默认设置为 -max

代码示例

import paddle.fluid as fluid
BATCH_SIZE = 128
CLIP_MAX = 2e-6
CLIP_MIN = -1e-6
prog = fluid.framework.Program()
with fluid.program_guard(main_program=prog):
   image = fluid.layers.data(name='x', shape=[784], dtype='float32')
   hidden1 = fluid.layers.fc(input=image, size=128, act='relu')
   hidden2 = fluid.layers.fc(input=hidden1, size=64, act='relu')
   predict = fluid.layers.fc(input=hidden2, size=10, act='softmax')
   label = fluid.layers.data(name='y', shape=[1], dtype='int64')
   cost = fluid.layers.cross_entropy(input=predict, label=label)
   avg_cost = fluid.layers.mean(cost)
prog_clip = prog.clone()
prog_clip.block(0).var(hidden1.name)._set_error_clip(
   fluid.clip.ErrorClipByValue(
       max=CLIP_MAX, min=CLIP_MIN))

GradientClipByGlobalNorm

class paddle.fluid.clip.GradientClipByGlobalNorm(clip_norm, group_name='default_group')[源代码]

通过多个张量的范数之和的比率来剪切(clip)多个张量。

给定一个张量列表 \(t\_list\) 和一个剪切比率 clip_norm ,返回一个被剪切的张量列表list_clipped和 \(t\_list\) 中所有张量的全局范数(global_norm)。

剪切过程如下:

\[\begin{split}\\t\_list[i]=t\_list[i]∗\frac{clip\_norm}{max(global\_norm,clip\_norm)}\\\end{split}\]

其中:

\[\begin{split}\\global\_norm=\sqrt{\sum_{i=0}^{n-1}(l2norm(t\_list[i]))^2}\\\end{split}\]

如果 \(clip\_norm>global\_norm\)\(t\_list\) 中的张量保持不变,否则它们都会按照全局比率缩减。

参数:
  • clip_norm (float) - 范数最大值
  • group_name (str, optional) - 剪切的组名

代码示例

import paddle.fluid as fluid
prog = fluid.framework.Program()
startup_program = fluid.framework.Program()
with fluid.program_guard(
        main_program=prog, startup_program=startup_program):
    image = fluid.layers.data(name='x', shape=[784], dtype='float32')
    label = fluid.layers.data(name='y', shape=[1], dtype='int64')
    hidden1 = fluid.layers.fc(input=image, size=128, act='relu')
    hidden2 = fluid.layers.fc(input=hidden1, size=64, act='relu')
    predict = fluid.layers.fc(input=hidden2, size=10, act='softmax')
    cost = fluid.layers.cross_entropy(input=predict, label=label)
    avg_cost = fluid.layers.mean(cost)
prog_clip = prog.clone()
avg_cost_clip = prog_clip.block(0).var(avg_cost.name)
p_g_clip = fluid.backward.append_backward(loss=avg_cost_clip)

with fluid.program_guard(main_program=prog_clip):
    fluid.clip.set_gradient_clip(
        fluid.clip.GradientClipByGlobalNorm(clip_norm=2.0))
    p_g_clip = fluid.clip.append_gradient_clip_ops(p_g_clip)

GradientClipByNorm

class paddle.fluid.clip.GradientClipByNorm(clip_norm)[源代码]

将张量转换为L2范数不超过 clip_norm 的张量

该operator 限制了 输入张量 \(X\) 的L2范数不会超过 \(max\_norm\) 。如果 \(X\)L2 范数小于或等于 \(max\_norm\) ,输出和 \(X\) 一样,如果 \(X\) 的L2范数大于 \(max\_norm\) , \(X\) 将被线性缩放到L2范数等于 \(max\_norm\) ,如以下公式所示:

\[\begin{split}\\Out = \frac{max\_norm∗X}{norm(X)}\\\end{split}\]

其中 \(norm(X)\) 代表 \(X\) 的 L2 范数

参数:
  • clip_norm (float) - 二范数最大值

代码示例

import paddle.fluid as fluid
w_param_attrs = fluid.ParamAttr(name=None,
                                initializer=fluid.initializer.UniformInitializer(low=-1.0, high=1.0, seed=0),
                                learning_rate=1.0,
                                regularizer=fluid.regularizer.L1Decay(1.0),
                                trainable=True,
                                gradient_clip=fluid.clip.GradientClipByNorm(clip_norm=2.0))
x = fluid.layers.data(name='x', shape=[10], dtype='float32')
y_predict = fluid.layers.fc(input=x, size=1, param_attr=w_param_attrs)

GradientClipByValue

class paddle.fluid.clip.GradientClipByValue(max, min=None)[源代码]

将梯度值(gradient values)的范围压缩到 [min, max]。

给定一个张量 t ,该操作将它的值压缩到 minmax 之间

  • 任何小于最小值的值都被设置为最小值
  • 任何大于max的值都被设置为max
参数:
  • max (foat) - 要修剪的最大值。
  • min (float,optional) - 要修剪的最小值。如果用户没有设置,将被 framework 设置为 -max

代码示例

import paddle.fluid as fluid
w_param_attrs = fluid.ParamAttr(name=None,
                                initializer=fluid.initializer.UniformInitializer(low=-1.0, high=1.0, seed=0),
                                learning_rate=1.0,
                                regularizer=fluid.regularizer.L1Decay(1.0),
                                trainable=True,
                                gradient_clip=fluid.clip.GradientClipByValue(-1.0, 1.0))
x = fluid.layers.data(name='x', shape=[10], dtype='float32')
y_predict = fluid.layers.fc(input=x, size=1, param_attr=w_param_attrs)