LambOptimizer_cn.rst 7.3 KB
Newer Older
H
Hao Wang 已提交
1 2 3 4 5
.. _cn_api_fluid_optimizer_LambOptimizer:

LambOptimizer
-------------------------------

6
.. py:class:: paddle.fluid.optimizer.LambOptimizer(learning_rate=0.001, lamb_weight_decay=0.01, beta1=0.9, beta2=0.999, epsilon=1e-06, parameter_list=None, regularization=None, exclude_from_weight_decay_fn=None, name=None)
H
Hao Wang 已提交
7 8

LAMB(Layer-wise Adaptive Moments optimizer for Batching training)优化器
Y
Yibing Liu 已提交
9
LAMB的优化器旨在不降低精度的前提下增大训练的批量大小,其支持自适应的逐元素更新和精确的分层校正。 更多信息请参考 `Large Batch Optimization for
H
Hao Wang 已提交
10 11 12 13 14
Deep Learning: Training BERT in 76 minutes <https://arxiv.org/pdf/1904.00962.pdf>`_ 。
参数更新如下:

.. math::

Y
Yibing Liu 已提交
15 16 17 18 19 20 21 22
    \begin{align}
    \begin{aligned}
     m_t &= \beta_1 m_{t - 1}+ (1 - \beta_1)g_t \\
     v_t &= \beta_2 v_{t - 1}  + (1 - \beta_2)g_t^2 \\
     r_t &= \frac{m_t}{\sqrt{v_t}+\epsilon} \\
     w_t &= w_{t-1} -\eta_t \frac{\left \| w_{t-1}\right \|}{\left \| r_t + \lambda w_{t-1}\right \|} (r_t + \lambda w_{t-1})
    \end{aligned}
    \end{align}
H
Hao Wang 已提交
23

Y
Yibing Liu 已提交
24
其中 :math:`m` 为第一个动量,:math:`v` 为第二个动量,:math:`\eta` 为学习率,:math:`\lambda` 为 LAMB 权重衰减率。
H
Hao Wang 已提交
25 26

参数:
Y
Yibing Liu 已提交
27
    - **learning_rate** (float|Variable) – 用于更新参数的学习率。可以是浮点数,或数据类型为浮点数的 Variable。
H
Hao Wang 已提交
28
    - **lamb_weight_decay** (float) – LAMB权重衰减率。
Y
Yibing Liu 已提交
29 30
    - **beta1** (float) – 第一个动量估计的指数衰减率。
    - **beta2** (float) – 第二个动量估计的指数衰减率。
H
Hao Wang 已提交
31
    - **epsilon** (float) – 一个小的浮点值,目的是维持数值稳定性。
32
    - **parameter_list** (list, 可选) - 指定优化器需要优化的参数。在动态图模式下必须提供该参数;在静态图模式下默认值为None,这时所有的参数都将被优化。
H
Hao Wang 已提交
33
    - **regularization** (Regularizer) – 一个正则化器,如fluid.regularizer.L1DecayRegularizer。
Y
Yibing Liu 已提交
34 35
    - **exclude_from_weight_decay_fn** (function) – 当某个参数作为输入该函数返回值为 ``True`` 时,为该参数跳过权重衰减。 
    - **name** (str,可选) – 具体用法请参见 :ref:`cn_api_guide_Name` ,一般无需设置,默认值为None。
H
Hao Wang 已提交
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54

**代码示例**

.. code-block:: python

    import paddle.fluid as fluid
     
    data = fluid.layers.data(name='x', shape=[5], dtype='float32')
    hidden = fluid.layers.fc(input=data, size=10)
    cost = fluid.layers.mean(hidden)

    def exclude_fn(param):
        return param.name.endswith('.b_0')
     
    optimizer = fluid.optimizer.Lamb(learning_rate=0.002,
                                     exclude_from_weight_decay_fn=exclude_fn)
    optimizer.minimize(cost)


Y
Yibing Liu 已提交
55
.. py:method:: minimize(loss, startup_program=None, parameter_list=None, no_grad_set=None, grad_clip=None)
56

Y
Yibing Liu 已提交
57
为网络添加反向计算过程,并根据反向计算所得的梯度,更新parameter_list中的Parameters,最小化网络损失值loss。
58 59

参数:
Y
Yibing Liu 已提交
60 61
    - **loss** (Variable) – 需要最小化的损失值变量。
    - **startup_program** (Program, 可选) – 用于初始化parameter_list中参数的 :ref:`cn_api_fluid_Program` , 默认值为None,此时将使用 :ref:`cn_api_fluid_default_startup_program` 
62
    - **parameter_list** (list, 可选) – 待更新的Parameter或者Parameter.name组成的列表, 默认值为None,此时将更新所有的Parameter
63
    - **no_grad_set** (set, 可选) – 不需要更新的Parameter或者Parameter.name组成的的集合,默认值为None
Y
Yibing Liu 已提交
64
    - **grad_clip** (GradClipBase, 可选) – 梯度裁剪的策略,静态图模式不需要使用本参数,当前本参数只支持在dygraph模式下的梯度裁剪,未来本参数可能会调整,默认值为None
65

Y
Yibing Liu 已提交
66
返回: (optimize_ops, params_grads),数据类型为(list, list),其中optimize_ops是 ``minimize()`` 接口为网络添加的OP列表,params_grads是一个由(param, grad)变量对组成的列表,param是Parameter,grad是该Parameter对应的梯度值
67

Y
Yibing Liu 已提交
68
返回类型: tuple
69

Y
Yibing Liu 已提交
70
**代码示例**:
71 72 73

.. code-block:: python

Y
Yibing Liu 已提交
74
    import numpy
75
    import paddle.fluid as fluid
Y
Yibing Liu 已提交
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
     
    x = fluid.layers.data(name='X', shape=[13], dtype='float32')
    y = fluid.layers.data(name='Y', shape=[1], dtype='float32')
    y_predict = fluid.layers.fc(input=x, size=1, act=None)
    cost = fluid.layers.square_error_cost(input=y_predict, label=y)
    loss = fluid.layers.mean(cost)
    adam = fluid.optimizer.LambOptimizer(learning_rate=0.2)
    adam.minimize(loss)

    place = fluid.CPUPlace()
    exe = fluid.Executor(place)
     
    x = numpy.random.random(size=(10, 13)).astype('float32')
    y = numpy.random.random(size=(10, 1)).astype('float32')
    exe.run(fluid.default_startup_program())
    outs = exe.run(program=fluid.default_main_program(),
                   feed={'X': x, 'Y': y},
                   fetch_list=[loss.name])
94 95 96



97
.. py:method:: clear_gradients()
98

99
**注意:**
100

101
  **1. 该API只在** `Dygraph <../../user_guides/howto/dygraph/DyGraph.html>`_ **模式下生效**
102 103


104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176
清除需要优化的参数的梯度。

**代码示例**

.. code-block:: python

    import paddle.fluid as fluid
    import numpy as np

    def exclude_fn(param):
        return param.name.endswith('.b_0')

    with fluid.dygraph.guard():
        value = np.arange(26).reshape(2, 13).astype("float32")
        a = fluid.dygraph.to_variable(value)
        linear = fluid.Linear(13, 5, dtype="float32")
        optimizer = fluid.optimizer.LambOptimizer(learning_rate=0.02,
                                      exclude_from_weight_decay_fn=exclude_fn,
                                      parameter_list=linear.parameters())
        out = linear(a)
        out.backward()
        optimizer.minimize(out)
        optimizer.clear_gradients()


.. py:method:: current_step_lr()

**注意:**

  **1. 该API只在** `Dygraph <../../user_guides/howto/dygraph/DyGraph.html>`_ **模式下生效**

获取当前步骤的学习率。当不使用LearningRateDecay时,每次调用的返回值都相同,否则返回当前步骤的学习率。

返回:当前步骤的学习率。

返回类型:float

**代码示例**

.. code-block:: python

    import paddle.fluid as fluid
    import numpy as np

    # example1: LearningRateDecay is not used, return value is all the same
    with fluid.dygraph.guard():
        emb = fluid.dygraph.Embedding([10, 10])
        adam = fluid.optimizer.Adam(0.001, parameter_list = emb.parameters())
        lr = adam.current_step_lr()
        print(lr) # 0.001

    # example2: PiecewiseDecay is used, return the step learning rate
    with fluid.dygraph.guard():
        inp = np.random.uniform(-0.1, 0.1, [10, 10]).astype("float32")
        linear = fluid.dygraph.nn.Linear(10, 10)
        inp = fluid.dygraph.to_variable(inp)
        out = linear(inp)
        loss = fluid.layers.reduce_mean(out)

        bd = [2, 4, 6, 8]
        value = [0.2, 0.4, 0.6, 0.8, 1.0]
        adam = fluid.optimizer.Adam(fluid.dygraph.PiecewiseDecay(bd, value, 0),
                           parameter_list=linear.parameters())

        # first step: learning rate is 0.2
        np.allclose(adam.current_step_lr(), 0.2, rtol=1e-06, atol=0.0) # True

        # learning rate for different steps
        ret = [0.2, 0.2, 0.4, 0.4, 0.6, 0.6, 0.8, 0.8, 1.0, 1.0, 1.0, 1.0]
        for i in range(12):
            adam.minimize(loss)
            lr = adam.current_step_lr()
            np.allclose(lr, ret[i], rtol=1e-06, atol=0.0) # True
177