如果这些是基本问题,请事先道歉-我做了一些挖掘,找不到简单的答案。如果有任何可以帮助的资源的链接,那就太好了!
我目前正在看下面的代码,以了解实现optimizer.optimizer的类。我在理解以下内容时遇到了麻烦:
def _create_slots(self, var_list):
# Create slots for the first and second moments.
for v in var_list:
self._zeros_slot(v, "m", self._name)
def _apply_dense(self, grad, var):
lr_t = math_ops.cast(self._lr_t, var.dtype.base_dtype)
beta_t = math_ops.cast(self._beta_t, var.dtype.base_dtype)
alpha_t = math_ops.cast(self._alpha_t, var.dtype.base_dtype)
eps = 1e-7 #cap for moving average
m = self.get_slot(var, "m")
m_t = m.assign(tf.maximum(beta_t * m + eps, tf.abs(grad)))
var_update = state_ops.assign_sub(var, lr_t*grad*(1.0+alpha_t*tf.sign(grad)*tf.sign(m_t) ) )
#Create an op that groups multiple operations
#When this op finishes, all ops in input have finished
return control_flow_ops.group(*[var_update, m_t])
在创建广告位中,是否为每个权重分配变量“ m”?如果我需要更多的变量,那么for循环中是否还会有另一行像self._zero_slots(v,“另一个变量”,self._name)等?
_apply_dense中的输入grad和var是单位重量的梯度和单位重量的变量吗?如果我需要其他渐变,例如如果我想基于整个梯度矩阵进行全局更新?
如何用新的权重更新m?似乎在每次迭代中,它只会乘以beta。
在var_update中,似乎var正在使用权重更新进行更新,但我也可以从var中获取变量?