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 。
Warning
在该算法的稠密实现版本中,”mean_square”和”momemt”即使”grad”为零将仍被更新。但在该稀疏实现版本中,在”grad”为零的迭代”mean_squre”和”moment”将不被更新。
参数:
use_locking (bool) - 是否对参数更新加锁保护。默认值: False。
输入:
var (Tensor) - 待更新的网络参数。
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 - var 、 mean_square 、 moment 或 decay 不是Tensor。
TypeError - learning_rate 不是数值也不是Tensor。
TypeError - decay 、 momentum 或 epsilon 的数据类型非float。
TypeError - learning_rate 的数据类型不是float16或float32。
ValueError - decay 、 momentum 或 epsilon 不是常量。
- 支持平台:
Ascend
GPU
CPU
样例:
>>> 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]]