{ "

Adam Optimizer

\n

This is a PyTorch implementation of popular optimizer Adam from paper Adam: A Method for Stochastic Optimization.

\n

Adam update is,

\n_^_0_^_

where _^_1_^_, _^_2_^_, _^_3_^_ and _^_4_^_ are scalar hyper parameters. _^_5_^_ and _^_6_^_ are first and second order moments. _^_7_^_ and _^_8_^_ are biased corrected moments. _^_9_^_ is used as a fix for division by zero error, but also acts as a form of a hyper-parameter that acts against variance in gradients.

\n

Effective step taken assuming _^_10_^_ is, _^_11_^_ This is bounded by, _^_12_^_ when _^_13_^_ and _^_14_^_ otherwise. And in most common scenarios, _^_15_^_

\n": "

\u0d86\u0daf\u0db8\u0dca\u0db4\u0dca\u0dbb\u0dc1\u0dc3\u0dca\u0dad\u0d9a\u0dbb\u0dab\u0dba

\n

\u0db8\u0dd9\u0dba PyTorch \u0d9a\u0dca\u0dbb\u0dd2\u0dba\u0dcf\u0dad\u0dca\u0db8\u0d9a \u0d9a\u0dd2\u0dbb\u0dd3\u0db8\u0d9a\u0dd2 \u0da2\u0db1\u0db4\u0dca\u0dbb\u0dd2\u0dba \u0db4\u0dca\u0dbb\u0dc1\u0dc3\u0dca\u0dad\u0dd2\u0d9a\u0dbb\u0dab\u0dba \u0d9a\u0da9\u0daf\u0dcf\u0dc3\u0dd2 \u0d87\u0da9\u0db8\u0dca \u0dc0\u0dd9\u0dad\u0dd2\u0db1\u0dca \u0d87\u0da9\u0db8\u0dca: \u0dc3\u0dca\u0da7\u0ddc\u0da0\u0dcf\u0dc3\u0dca\u0da7\u0dd2\u0d9a\u0dca \u0db4\u0dca\u0dbb\u0dc1\u0dc3\u0dca\u0dad\u0dd2\u0d9a\u0dbb\u0dab\u0dba \u0dc3\u0db3\u0dc4\u0dcf \u0d9a\u0dca\u0dbb\u0db8\u0dba\u0d9a\u0dca .

\n

\u0d86\u0daf\u0db8\u0dca \u0dba\u0dcf\u0dc0\u0dad\u0dca\u0d9a\u0dcf\u0dbd\u0dd3\u0db1 \u0d9a\u0dd2\u0dbb\u0dd3\u0db8,

\n_^_0_^_

\u0d9a\u0ddc\u0dc4\u0dd9\u0daf _^_1_^__^_2_^_, _^_3_^_ \u0dc3\u0dc4 _^_4_^_ \u0db4\u0dbb\u0dd2\u0db8\u0dcf\u0dab \u0d85\u0db0\u0dd2 \u0db4\u0dbb\u0dcf\u0db8\u0dd2\u0dad\u0dd3\u0db1\u0dca \u0dc0\u0dda. _^_5_^_ \u0dc3\u0dc4 \u0db4\u0dc5\u0db8\u0dd4 _^_6_^_ \u0dc4\u0dcf \u0daf\u0dd9\u0dc0\u0db1 \u0d87\u0dab\u0dc0\u0dd4\u0db8\u0dca \u0d85\u0dc0\u0dc3\u0dca\u0dae\u0dcf \u0dc0\u0dda. _^_7_^_ _^_8_^_ \u0dc3\u0dc4 \u0db4\u0d9a\u0dca\u0dc2\u0d9c\u0dca\u0dbb\u0dcf\u0dc4\u0dd3 \u0db1\u0dd2\u0dc0\u0dd0\u0dbb\u0daf\u0dd2 \u0d85\u0dc0\u0dc3\u0dca\u0dae\u0dcf\u0dc0\u0db1\u0dca \u0dc0\u0dda. _^_9_^_ \u0dc1\u0dd4\u0db1\u0dca\u0dba \u0daf\u0ddd\u0dc2\u0dba\u0d9a\u0dd2\u0db1\u0dca \u0db6\u0dd9\u0daf\u0dd3\u0db8 \u0dc3\u0db3\u0dc4\u0dcf \u0dc0\u0dd2\u0dc3\u0db3\u0dd4\u0db8\u0d9a\u0dca \u0dbd\u0dd9\u0dc3 \u0db7\u0dcf\u0dc0\u0dd2\u0dad\u0dcf \u0d9a\u0dbb\u0dba\u0dd2, \u0db1\u0db8\u0dd4\u0dad\u0dca \u0d85\u0db1\u0dd4\u0d9a\u0dca\u0dbb\u0db8\u0dd2\u0d9a \u0dc0\u0dd2\u0da0\u0dbd\u0dca\u0dba\u0dad\u0dcf\u0dc0\u0dba\u0da7 \u0d91\u0dbb\u0dd9\u0dc4\u0dd2\u0dc0 \u0d9a\u0dca\u0dbb\u0dd2\u0dba\u0dcf \u0d9a\u0dbb\u0db1 \u0d85\u0db0\u0dd2-\u0db4\u0dbb\u0dcf\u0db8\u0dd2\u0dad\u0dd2\u0dba\u0d9a \u0d86\u0d9a\u0dcf\u0dbb\u0dba\u0d9a\u0dca \u0dbd\u0dd9\u0dc3\u0daf \u0d9a\u0dca\u0dbb\u0dd2\u0dba\u0dcf \u0d9a\u0dbb\u0dba\u0dd2.

\n

\u0d8b\u0db4\u0d9a\u0dbd\u0dca\u0db4\u0db1\u0dba\u0d9a\u0dbb\u0db8\u0dd2\u0db1\u0dca \u0d9c\u0db1\u0dca\u0db1\u0dcf \u0dbd\u0daf effective \u0dbd\u0daf\u0dcf\u0dba\u0dd3 \u0db4\u0dd2\u0dba\u0dc0\u0dbb _^_10_^_ \u0dc0\u0db1\u0dca\u0db1\u0dda, _^_11_^_ \u0db8\u0dd9\u0dba \u0db8\u0dcf\u0dba\u0dd2\u0db8\u0dca \u0d9a\u0dbb\u0db1\u0dd4 \u0dbd\u0db6\u0db1\u0dca\u0db1\u0dda _^_12_^_ _^_13_^_ \u0d9a\u0dc0\u0daf\u0dcf\u0daf \u0dc3\u0dc4 _^_14_^_ \u0dc0\u0dd9\u0db1\u0dad\u0dca \u0d86\u0d9a\u0dcf\u0dbb\u0dba\u0d9a\u0dd2\u0db1\u0dca \u0dba. \u0dc3\u0dc4 \u0dc0\u0da9\u0dcf\u0dad\u0dca \u0db4\u0ddc\u0daf\u0dd4 \u0d85\u0dc0\u0dc3\u0dca\u0dae\u0dcf\u0dc0\u0db1\u0dca\u0dc4\u0dd3\u0daf\u0dd3, _^_15_^_

\n", "

Adam Optimizer

\n

We extend the class _^_0_^_ defined in _^_1_^_ to implement the Adam optimizer.

\n": "

\u0d86\u0daf\u0db8\u0dca\u0db4\u0dca\u0dbb\u0dc1\u0dc3\u0dca\u0dad\u0d9a\u0dbb\u0dab\u0dba

\n

\u0d86\u0daf\u0db8\u0dca\u0db4\u0dca\u0dbb\u0dc1\u0dc3\u0dca\u0dad\u0d9a\u0dbb\u0dab\u0dba \u0d9a\u0dca\u0dbb\u0dd2\u0dba\u0dcf\u0dad\u0dca\u0db8\u0d9a \u0d9a\u0dd2\u0dbb\u0dd3\u0db8 _^_1_^_ \u0dc3\u0db3\u0dc4\u0dcf \u0d85\u0db4\u0dd2 _^_0_^_ \u0d85\u0dbb\u0dca\u0dae \u0daf\u0d9a\u0dca\u0dc0\u0dcf \u0d87\u0dad\u0dd2 \u0db4\u0db1\u0dca\u0dad\u0dd2\u0dba \u0daf\u0dd3\u0dbb\u0dca extend \u0d9a\u0dbb\u0db8\u0dd4.

\n", "

Calculate _^_0_^_ and and _^_1_^_

\n\n": "

\u0d9c\u0dab\u0db1\u0dba\u0d9a\u0dbb\u0db1\u0dca\u0db1 _^_0_^_ \u0dc3\u0dc4 _^_1_^_

\n
  • _^_4_^_ \u0db4\u0dbb\u0dcf\u0db8\u0dd2\u0dad\u0dd2\u0dba _^_5_^_ \u0dc3\u0db3\u0dc4\u0dcf \u0dc0\u0dad\u0dca\u0db8\u0db1\u0dca \u0db5\u0dbd\u0dba \u0d85\u0db1\u0dd4\u0d9a\u0dca\u0dbb\u0db8\u0dd2\u0d9a tensor \u0dc0\u0dda _^_6_^_
  • \n", "

    Do the Adam parameter update

    \n\n

    This computes the following

    \n_^_8_^_

    Since _^_9_^_, _^_10_^_, _^_11_^_ and _^_12_^_ are scalars and others are tensors we modify this calculation to optimize the computation.

    \n_^_13_^_

    where _^_14_^_ is what we should specify as the hyper-parameter.

    \n": "

    \u0d86\u0daf\u0db8\u0dca \u0db4\u0dbb\u0dcf\u0db8\u0dd2\u0dad\u0dd2 \u0dba\u0dcf\u0dc0\u0dad\u0dca\u0d9a\u0dcf\u0dbd\u0dd3\u0db1 \u0d9a\u0dd2\u0dbb\u0dd3\u0db8 \u0d9a\u0dbb\u0db1\u0dca\u0db1

    \n\n

    \u0db8\u0dd9\u0dba\u0db4\u0dc4\u0dad \u0dc3\u0db3\u0dc4\u0db1\u0dca \u0daf\u0dda \u0d9c\u0dab\u0db1\u0dba \u0d9a\u0dbb\u0dba\u0dd2

    \n_^_8_^_

    \u0dc3\u0dd2\u0da7 _^_9_^__^_10_^_, _^_11_^_ \u0dc3\u0dc4 \u0db4\u0dbb\u0dd2\u0db8\u0dcf\u0dab\u0dba\u0db1\u0dca _^_12_^_ \u0dc0\u0db1 \u0d85\u0dad\u0dbb \u0d85\u0db1\u0dd9\u0d9a\u0dca \u0d92\u0dc0\u0dcf \u0d85\u0db4\u0dd2 \u0db8\u0dd9\u0db8 \u0d9c\u0dab\u0db1\u0dba \u0d9a\u0dd2\u0dbb\u0dd3\u0db8 \u0dc0\u0dd9\u0db1\u0dc3\u0dca \u0d9a\u0dbb\u0db1 \u0d86\u0dad\u0dad\u0dd3\u0db1\u0dca \u0dc0\u0dda \u0d9c\u0dab\u0db1\u0dba \u0d9a\u0dd2\u0dbb\u0dd3\u0db8 \u0db4\u0dca\u0dbb\u0dc1\u0dc3\u0dca\u0dad \u0d9a\u0dbb\u0db1\u0dca\u0db1.

    \n_^_13_^_

    \u0d85\u0db0\u0dd2-\u0db4\u0dbb\u0dcf\u0db8\u0dd2\u0dad\u0dd2\u0dba\u0dbd\u0dd9\u0dc3 \u0d85\u0db4 \u0dc3\u0db3\u0dc4\u0db1\u0dca \u0d9a\u0dc5 \u0dba\u0dd4\u0dad\u0dca\u0dad\u0dda _^_14_^_ \u0d9a\u0ddc\u0dc4\u0dda\u0daf?

    \n", "

    Get learning-rate

    \n

    This returns the modified learning rate based on the state. For Adam this is just the specified learning rate for the parameter group, _^_0_^_.

    \n": "

    \u0d89\u0d9c\u0dd9\u0db1\u0dd3\u0db8-\u0d85\u0db1\u0dd4\u0db4\u0dcf\u0dad\u0dba\u0dbd\u0db6\u0dcf \u0d9c\u0db1\u0dca\u0db1

    \n

    \u0db8\u0dd9\u0dba\u0dbb\u0dcf\u0da2\u0dca\u0dba\u0dba \u0db8\u0dad \u0db4\u0daf\u0db1\u0db8\u0dca\u0dc0 \u0db1\u0dc0\u0dd3\u0d9a\u0dbb\u0dab\u0dba \u0d9a\u0dbb\u0db1 \u0dbd\u0daf \u0d89\u0d9c\u0dd9\u0db1\u0dd4\u0db8\u0dca \u0d85\u0db1\u0dd4\u0db4\u0dcf\u0dad\u0dba \u0db1\u0dd0\u0dc0\u0dad \u0dbd\u0db6\u0dcf \u0daf\u0dd9\u0dba\u0dd2. \u0d86\u0daf\u0db8\u0dca \u0dc3\u0db3\u0dc4\u0dcf \u0db8\u0dd9\u0dba \u0db4\u0dbb\u0dcf\u0db8\u0dd2\u0dad\u0dd2 \u0d9a\u0dab\u0dca\u0da9\u0dcf\u0dba\u0db8 \u0dc3\u0db3\u0dc4\u0dcf \u0db1\u0dd2\u0dc1\u0dca\u0da0\u0dd2\u0dad \u0d89\u0d9c\u0dd9\u0db1\u0dd4\u0db8\u0dca \u0d85\u0db1\u0dd4\u0db4\u0dcf\u0dad\u0dba \u0db4\u0db8\u0dab\u0dd2, _^_0_^_.

    \n", "

    Initialize a parameter state

    \n\n": "

    \u0db4\u0dbb\u0dcf\u0db8\u0dd2\u0dad\u0dd2\u0dad\u0dad\u0dca\u0dc0\u0dba\u0d9a\u0dca \u0d86\u0dbb\u0db8\u0dca\u0db7 \u0d9a\u0dbb\u0db1\u0dca\u0db1

    \n
  • _^_2_^_ \u0db4\u0dbb\u0dcf\u0db8\u0dd2\u0dad\u0dd2\u0dba tensor \u0dc0\u0dda _^_3_^_
  • \n", "

    Initialize the optimizer

    \n\n": "

    \u0db4\u0dca\u0dbb\u0dc1\u0dc3\u0dca\u0dad\u0d9a\u0dbb\u0dab\u0dba\u0d86\u0dbb\u0db8\u0dca\u0db7 \u0d9a\u0dbb\u0db1\u0dca\u0db1

    \n\n", "

    Take an update step for a given parameter tensor

    \n\n": "

    \u0daf\u0dd3\u0d87\u0dad\u0dd2 \u0db4\u0dbb\u0dcf\u0db8\u0dd2\u0dad\u0dd2 \u0da7\u0dd9\u0db1\u0dca\u0dc3\u0dbb\u0dba\u0d9a\u0dca \u0dc3\u0db3\u0dc4\u0dcf \u0dba\u0dcf\u0dc0\u0dad\u0dca\u0d9a\u0dcf\u0dbd\u0dd3\u0db1 \u0db4\u0dd2\u0dba\u0dc0\u0dbb\u0d9a\u0dca \u0d9c\u0db1\u0dca\u0db1

    \n
  • _^_5_^_ \u0db4\u0dbb\u0dcf\u0db8\u0dd2\u0dad\u0dd2\u0dba tensor \u0dc0\u0dda _^_6_^_
  • \n", "

    _^_0_^_

    \n": "

    _^_0_^_

    \n", "

    Bias correction term for _^_0_^_, _^_1_^_

    \n": "

    \u0dc3\u0db3\u0dc4\u0dcf\u0db1\u0dd0\u0db9\u0dd4\u0dbb\u0dd4\u0dc0 \u0db1\u0dd2\u0dc0\u0dd0\u0dbb\u0daf\u0dd2 \u0d9a\u0dd2\u0dbb\u0dd3\u0db8\u0dda \u0db4\u0daf\u0dba _^_0_^_, _^_1_^_

    \n", "

    Calculate weight decay

    \n": "

    \u0db6\u0dbb\u0d9a\u0dca\u0dc2\u0dba \u0dc0\u0dd3\u0db8 \u0d9c\u0dab\u0db1\u0dba \u0d9a\u0dbb\u0db1\u0dca\u0db1

    \n", "

    Computation without optimization

    \n": "

    \u0db4\u0dca\u0dbb\u0dc1\u0dc3\u0dca\u0dad\u0dd2\u0d9a\u0dbb\u0dab\u0dba\u0d9a\u0dd2\u0db1\u0dca\u0dad\u0ddc\u0dbb\u0dc0 \u0d9c\u0dab\u0db1\u0dba \u0d9a\u0dd2\u0dbb\u0dd3\u0db8

    \n", "

    Exponential moving average of gradients, _^_0_^_

    \n": "

    \u0d85\u0db1\u0dd4\u0d9a\u0dca\u0dbb\u0db8\u0dd2\u0d9a\u0d9a \u0d9d\u0dcf\u0dad\u0dd3\u0dba \u0dc0\u0dd9\u0db1\u0dc3\u0dca\u0dc0\u0db1 \u0dc3\u0dcf\u0db8\u0dcf\u0db1\u0dca\u0dba\u0dba, _^_0_^_

    \n", "

    Exponential moving average of squared gradient values, _^_0_^_

    \n": "

    \u0dc0\u0dbb\u0dca\u0d9c\u0db5\u0dbd\u0dba \u0d85\u0db1\u0dd4\u0d9a\u0dca\u0dbb\u0db8\u0dd2\u0d9a \u0dc0\u0da7\u0dd2\u0db1\u0dcf\u0d9a\u0db8\u0dca \u0d9d\u0dcf\u0dad\u0dd3\u0dba \u0dc0\u0dd9\u0db1\u0dc3\u0dca\u0dc0\u0db1 \u0dc3\u0dcf\u0db8\u0dcf\u0db1\u0dca\u0dba\u0dba, _^_0_^_

    \n", "

    Get _^_0_^_ and _^_1_^_

    \n": "

    \u0dbd\u0db6\u0dcf _^_0_^_ \u0d9c\u0db1\u0dca\u0db1 _^_1_^_

    \n", "

    Get learning rate

    \n": "

    \u0d89\u0d9c\u0dd9\u0db1\u0dd4\u0db8\u0dca\u0d85\u0db1\u0dd4\u0db4\u0dcf\u0dad\u0dba \u0dbd\u0db6\u0dcf \u0d9c\u0db1\u0dca\u0db1

    \n", "

    In-place calculation of _^_0_^_ _^_1_^_

    \n": "

    \u0dc3\u0dca\u0dae\u0dcf\u0db1\u0dba\u0dd9\u0dc4\u0dd2\u0d9c\u0dab\u0db1\u0dba \u0d9a\u0dd2\u0dbb\u0dd3\u0db8 _^_0_^_ _^_1_^_

    \n", "

    Increment _^_0_^_ the number of optimizer steps

    \n": "

    \u0db4\u0dca\u0dbb\u0dc1\u0dc3\u0dca\u0dad\u0dd2\u0d9a\u0dbb\u0dab\u0db4\u0dd2\u0dba\u0dc0\u0dbb \u0d9c\u0dab\u0db1 \u0dc0\u0dd0\u0da9\u0dd2 _^_0_^_ \u0d9a\u0dbb\u0db1\u0dca\u0db1

    \n", "

    Perform Adam update

    \n": "

    \u0d86\u0daf\u0db8\u0dca \u0dba\u0dcf\u0dc0\u0dad\u0dca\u0d9a\u0dcf\u0dbd\u0dd3\u0db1 \u0d9a\u0dd2\u0dbb\u0dd3\u0db8 \u0dc3\u0dd2\u0daf\u0dd4

    \n", "

    This is the number of optimizer steps taken on the parameter, _^_0_^_

    \n": "

    \u0db4\u0dbb\u0dcf\u0db8\u0dd2\u0dad\u0dd2\u0dba\u0db8\u0dad \u0d9c\u0dd9\u0db1 \u0d87\u0dad\u0dd2 \u0db4\u0dca\u0dbb\u0dc1\u0dc3\u0dca\u0dad\u0dd2\u0d9a\u0dbb\u0dab \u0db4\u0dd2\u0dba\u0dc0\u0dbb \u0d9c\u0dab\u0db1 \u0db8\u0dd9\u0dba\u0dba\u0dd2, _^_0_^_

    \n", "

    Whether to optimize the computation

    \n": "

    \u0db8\u0dd9\u0db8\u0d9c\u0dab\u0db1\u0dba \u0d8b\u0db4\u0dbb\u0dd2\u0db8 \u0db5\u0dbd \u0dbd\u0db6\u0dcf \u0d9c\u0dd0\u0db1\u0dd3\u0db8 \u0dc3\u0db3\u0dc4\u0dcf \u0dba\u0db1\u0dca\u0db1

    \n", "A simple PyTorch implementation/tutorial of Adam optimizer": "\u0d86\u0daf\u0db8\u0dca \u0db4\u0dca\u0dbb\u0dc1\u0dc3\u0dca\u0dad\u0d9a\u0dcf\u0dbb\u0d9a\u0dba\u0dda \u0dc3\u0dbb\u0dbd \u0db4\u0dba\u0dd2\u0da7\u0ddd\u0da0\u0dca \u0d9a\u0dca\u0dbb\u0dd2\u0dba\u0dcf\u0dad\u0dca\u0db8\u0d9a \u0d9a\u0dd2\u0dbb\u0dd3\u0db8/\u0db1\u0dd2\u0db6\u0db1\u0dca\u0db0\u0db1\u0dba", "Adam Optimizer": "\u0d86\u0daf\u0db8\u0dca \u0db4\u0dca\u0dbb\u0dc1\u0dc3\u0dca\u0dad\u0d9a\u0dbb\u0dab\u0dba" }