mindspore.ops.ApplyRMSProp

查看源文件
class mindspore.ops.ApplyRMSProp(use_locking=False)[源代码]

实现均方根传播Root Mean Square prop(RMSProp)算法的优化器。请参考源码中的用法 mindspore.nn.RMSProp

ApplyRMSProp算法的更新公式如下所示:

\[\begin{split}\begin{array}{ll} \\ s_{t+1} = \rho s_{t} + (1 - \rho)(\nabla Q_{i}(w))^2 \\ m_{t+1} = \beta m_{t} + \frac{\eta} {\sqrt{s_{t+1} + \epsilon}} \nabla Q_{i}(w) \\ w = w - m_{t+1} \end{array}\end{split}\]

其中 \(w\) 代表待更新的网络参数 var\(s_{t+1}\) 为均方梯度 mean_square\(s_{t}\) 为上一步的 \(s_{t+1}\)\(m_{t+1}\)moment\(m_{t}\) 为上一步的 \(m_{t+1}\)\(\rho\)decay\(\beta\) 为动量项 momentum\(\epsilon\) 是避免零为除数的平滑项 epsilon\(\eta\)learning_rate\(\nabla Q_{i}(w)\) 代表 grad

警告

在该算法的稠密实现版本中,"mean_square"和"momemt"即使"grad"为零将仍被更新。但在该稀疏实现版本中,在"grad"为零的迭代"mean_squre"和"moment"将不被更新。

参数:
  • use_locking (bool) - 是否对参数更新加锁保护。默认值: False

输入:
  • var (Parameter) - 待更新的网络参数。

  • mean_square (Tensor) - 均方梯度,数据类型需与 var 相同。

  • moment (Tensor) - 一阶矩,数据类型需与 var 相同。

  • learning_rate (Union[Number, Tensor]) - 学习率。需为浮点数或者数据类型为float16或float32的标量矩阵。

  • grad (Tensor) - 梯度,数据类型需与 var 相同。

  • decay (float) - 衰减率。需为常量。

  • momentum (float) - 移动平均的动量项momentum。需为常量。

  • epsilon (float) - 避免除数为零的平滑项。需为常量。

输出:

Tensor,待更新的网络参数。

异常:
  • TypeError - use_locking 不是bool类型。

  • TypeError - varmean_squaremomentdecay 不是Tensor。

  • TypeError - learning_rate 不是数值也不是Tensor。

  • TypeError - decaymomentumepsilon 的数据类型非float。

  • TypeError - learning_rate 的数据类型不是float16或float32。

  • ValueError - decaymomentumepsilon 不是常量。

支持平台:

Ascend GPU CPU

样例:

>>> import numpy as np
>>> from mindspore import Tensor, nn, ops, Parameter
>>> class Net(nn.Cell):
...     def __init__(self):
...         super(Net, self).__init__()
...         self.apply_rms_prop = ops.ApplyRMSProp()
...         self.var = Parameter(Tensor(np.ones([2, 2]).astype(np.float32)), name="var")
...
...     def construct(self, mean_square, moment, grad, decay, momentum, epsilon, lr):
...         out = self.apply_rms_prop(self.var, mean_square, moment, lr, grad, decay, momentum, epsilon)
...         return out
...
>>> net = Net()
>>> mean_square = Tensor(np.ones([2, 2]).astype(np.float32))
>>> moment = Tensor(np.ones([2, 2]).astype(np.float32))
>>> grad = Tensor(np.ones([2, 2]).astype(np.float32))
>>> output = net(mean_square, moment, grad, 0.0, 1e-10, 0.001, 0.01)
>>> print(net.var.asnumpy())
[[0.990005  0.990005]
 [0.990005  0.990005]]