GradientClipByGlobalNorm

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

通过多个 Tensor 的范数之和的比率,来剪切(clip)多个 Tensor ( Tensor 不是从该类传入, 通过 fluid.program_guardmain_program 参数传入,即公式中的

GradientClipByGlobalNorm - 图1 见代码实例)。

给定一个 Tensor 列表

GradientClipByGlobalNorm - 图2 和一个剪切比率 clip_norm ,返回该类的实例作为 set_gradient_clip 方法的第一个参数, set_gradient_clip 第二个参数是用来计算被剪切的 Tensor 列表(该值默认为 None 会基于所有 Tensor 列表来计算全局范数 global_norm

剪切过程如下:

GradientClipByGlobalNorm - 图3

其中:

GradientClipByGlobalNorm - 图4

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

代码示例

  1. import paddle.fluid as fluid
  2. import paddle.fluid.core as core
  3. import paddle
  4.  
  5. place = core.CPUPlace()
  6. prog = fluid.framework.Program()
  7. startup_program = fluid.framework.Program()
  8. with fluid.program_guard(
  9. main_program=prog, startup_program=startup_program):
  10. image = fluid.layers.data(name='x', shape=[784], dtype='float32')
  11. label = fluid.layers.data(name='y', shape=[1], dtype='int64')
  12. hidden1 = fluid.layers.fc(input=image, size=128, act='relu')
  13. hidden2 = fluid.layers.fc(input=hidden1, size=64, act='relu')
  14. predict = fluid.layers.fc(input=hidden2, size=10, act='softmax')
  15. cost = fluid.layers.cross_entropy(input=predict, label=label)
  16. avg_cost = fluid.layers.mean(cost)
  17.  
  18. prog_clip = prog.clone()
  19. avg_cost_clip = prog_clip.block(0).var(avg_cost.name)
  20.  
  21. p_g = fluid.backward.append_backward(loss=avg_cost)
  22. p_g_clip = fluid.backward.append_backward(loss=avg_cost_clip)
  23.  
  24. with fluid.program_guard(main_program=prog_clip, startup_program=startup_program):
  25. fluid.clip.set_gradient_clip(
  26. fluid.clip.GradientClipByGlobalNorm(clip_norm=2.0))
  27. p_g_clip = fluid.clip.append_gradient_clip_ops(p_g_clip)
  28.  
  29. grad_list = [elem[1] for elem in p_g]
  30. grad_clip_list = [elem[1] for elem in p_g_clip]
  31.  
  32. train_reader = paddle.batch(
  33. paddle.reader.shuffle(
  34. paddle.dataset.mnist.train(), buf_size=8192),
  35. batch_size=128)
  36.  
  37. exe = fluid.Executor(place)
  38. feeder = fluid.DataFeeder(feed_list=[image, label], place=place)
  39. exe.run(startup_program)
  40.  
  41. count = 0
  42. for data in train_reader():
  43. count += 1
  44. print("count:%s" % count)
  45. if count > 5:
  46. break
  47. out = exe.run(prog, feed=feeder.feed(data), fetch_list=grad_list)
  48. out_clip = exe.run(prog_clip,
  49. feed=feeder.feed(data),
  50. fetch_list=grad_clip_list)