mindspore.ops.ApplyProximalAdagrad
- class mindspore.ops.ApplyProximalAdagrad(use_locking=False)[源代码]
根据Proximal Adagrad算法更新网络参数或者Tensor。 请参阅论文 Efficient Learning using Forward-Backward Splitting 。
\[\begin{split}\begin{array}{ll} \\ accum += grad * grad \\ \text{prox_v} = var - lr * grad * \frac{1}{\sqrt{accum}} \\ var = \frac{sign(\text{prox_v})}{1 + lr * l2} * \max(\left| \text{prox_v} \right| - lr * l1, 0) \end{array}\end{split}\]输入 var 、 accum 和 grad 之间必须遵守隐式类型转换规则以保证数据类型的统一。如果数据类型不同,低精度的数据类型将被自动转换到高精度的数据类型。
- 参数:
use_locking (bool) - 是否对参数更新加锁保护。默认值:
False
。
- 输入:
var (Union[Parameter, Tensor]) - 公式中的"var"。数据类型需为float16或float32。shape为 \((N, *)\) ,其中 \(*\) 表示任何数量的附加维度。
accum (Union[Parameter, Tensor]) - 公式中的"accum"。与 var 的shape和数据类型相同。
lr (Union[Number, Tensor]) - 学习率,必须为标量,数据类型为float16或float32。
l1 (Union[Number, Tensor]) - l1正则化强度,必须为标量,数据类型为float16或float32。
l2 (Union[Number, Tensor]) - l2正则化强度,必须为标量,数据类型为float16或float32。
grad (Tensor) - 梯度,与 var 的shape与数据类型相同。
- 输出:
包含两个Tensor的Tuple,已被更新的参数或者Tensor。
var (Tensor) - 与输入 var 的shape与数据类型相同。
accum (Tensor) - 与输入 accum 的shape与数据类型相同。
- 异常:
TypeError - use_blocking 不是bool类型。
TypeError - var 、 lr 、 l1 或 l2 的数据类型不是float16或float32。
TypeError - lr 、 l1 或 l2 的数据类型不是Number或Tensor。
TypeError - grad 不是Tensor。
TypeError - var 、 accum 和 grad 网络参数的数据类型转换错误。
- 支持平台:
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_proximal_adagrad = ops.ApplyProximalAdagrad() ... self.var = Parameter(Tensor(np.array([[0.6, 0.4], ... [0.1, 0.5]]).astype(np.float32)), name="var") ... self.accum = Parameter(Tensor(np.array([[0.6, 0.5], ... [0.2, 0.6]]).astype(np.float32)), name="accum") ... self.lr = 0.01 ... self.l1 = 0.0 ... self.l2 = 0.0 ... def construct(self, grad): ... out = self.apply_proximal_adagrad(self.var, self.accum, self.lr, self.l1, self.l2, grad) ... return out ... >>> net = Net() >>> grad = Tensor(np.array([[0.3, 0.7], [0.1, 0.8]]).astype(np.float32)) >>> output = net(grad) >>> print(output) (Tensor(shape=[2, 2], dtype=Float32, value= [[ 5.96388459e-01, 3.92964751e-01], [ 9.78178233e-02, 4.92815793e-01]]), Tensor(shape=[2, 2], dtype=Float32, value= [[ 6.90000057e-01, 9.90000010e-01], [ 2.10000008e-01, 1.24000001e+00]]))