1. 功能
居中RMSProp算法使用居中第二矩(即方差)的估计值进行归一化,而普通RMSProp则使用(非居中)第二矩。这通常有助于训练,但在计算和内存方面略显昂贵。 需要注意的是,在这个算法的密集实现中,即使grad为零,mg、ms和mom也会更新,但在这个稀疏实现中,mg、ms和mom在grad为零的迭代中不会更新。 mean_square = decay * mean_square + (1-decay) * gradient ** 2 mean_grad = decay * mean_grad + (1-decay) * gradient Delta = learning_rate * gradient / sqrt(mean_square + epsilon - mean_grad ** 2) mg <- rho * mg_{t-1} + (1-rho) * grad ms <- rho * ms_{t-1} + (1-rho) * grad * grad mom <- momentum * mom_{t-1} + lr * grad / sqrt(ms - mg * mg + epsilon) var <- var - mom
2. 参数
var:可变的 Tensor 。必须为以下类型之一: float32 , float64 , int32 , uint8 , int16 , int8 , complex64 , int64 , qint8 , quint8 , qint32 , bfloat16 , uint16 , complex128 , half , uint32 , uint64 。应该来自Variable()。 mg:可变的 Tensor 。必须具有与 var 相同的类型。应该来自Variable()。 ms:可变的 Tensor 。必须具有与 var 相同的类型。应该来自Variable()。 mom:可变的 Tensor 。必须具有与 var 相同的类型。应该来自Variable()。 lr:学习率,一个 Tensor 。必须具有与 var 相同的类型。必须是Tensor。 rho:衰减率一个 Tensor 。必须具有与 var 相同的类型。衰减率。必须是Tensor。 momentum:动量,一个 Tensor 。必须与 var 具有相同的类型。动量标度。必须是Tensor。 epsilon:一个 Tensor 。必须具有与 var 相同的类型。岭学期。必须是Tensor。 grad:一个 Tensor 。必须具有与 var 相同的类型。渐变。 use_locking:可选的 bool 。默认为 False 。如果为 True ,则通过锁保护var,mg,ms和mom张量的更新;否则,行为是不确定的,但可能会减少争用。 name:操作的名称(可选)。
3. 代码样例
data_type = np.float16
idxs_np = np.random.randint(0, 3, size=3).astype(np.int32)
var = np.random.random(size=(3, 3)).astype(data_type)
mg = np.random.random(size=(3, 3)).astype(data_type)
ms = np.random.random(size=(3, 3)).astype(data_type)
mom = np.random.random(size=(3, 3)).astype(data_type)
grad_np = np.random.rand(*(3, 3)).astype(data_type)
lr = 0.0
decay = 1e-10
momentum = 0.001
epsilon = 0.1
uni_idx, idx = tf.unique(idxs_np)
var_tf = tf.Variable(tf.gather(var, uni_idx, axis=0), validate_shape=False)
ms_tf = tf.Variable(tf.gather(ms, uni_idx, axis=0), validate_shape=False)
mg_tf = tf.Variable(tf.gather(mg, uni_idx, axis=0), validate_shape=False)
mom_tf = tf.Variable(tf.gather(mom, uni_idx, axis=0), validate_shape=False)
grad_tf = tf.Variable(tf.gather(grad_np, uni_idx, axis=0), validate_shape=False)
out = tf.raw_ops.ApplyCenteredRMSProp(var=var_tf, mg=mg_tf, ms=ms_tf, mom=mom_tf, lr=lr, rho=decay, momentum=momentum,
epsilon=epsilon, grad=grad_tf, use_locking=False, name='out')
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
out_ = sess.run(out)
print(out_)