python - layers - ¿Cómo funciona Adagrad en Keras? ¿Qué significa self.weights en Keras Optimizer?
layers dense keras (1)
Por ejemplo, la implementación de Keras Adagrad ha sido:
class Adagrad(Optimizer):
"""Adagrad optimizer.
It is recommended to leave the parameters of this optimizer
at their default values.
# Arguments
lr: float >= 0. Learning rate.
epsilon: float >= 0.
decay: float >= 0. Learning rate decay over each update.
# References
- [Adaptive Subgradient Methods for Online Learning and Stochastic Optimization](http://www.jmlr.org/papers/volume12/duchi11a/duchi11a.pdf)
"""
def __init__(self, lr=0.01, epsilon=1e-8, decay=0., **kwargs):
super(Adagrad, self).__init__(**kwargs)
self.lr = K.variable(lr)
self.epsilon = epsilon
self.decay = K.variable(decay)
self.initial_decay = decay
self.iterations = K.variable(0.)
def get_updates(self, params, constraints, loss):
grads = self.get_gradients(loss, params)
shapes = [K.get_variable_shape(p) for p in params]
accumulators = [K.zeros(shape) for shape in shapes]
self.weights = accumulators
self.updates = []
lr = self.lr
if self.initial_decay > 0:
lr *= (1. / (1. + self.decay * self.iterations))
self.updates.append(K.update_add(self.iterations, 1))
for p, g, a in zip(params, grads, accumulators):
new_a = a + K.square(g) # update accumulator
self.updates.append(K.update(a, new_a))
new_p = p - lr * g / (K.sqrt(new_a) + self.epsilon)
# apply constraints
if p in constraints:
c = constraints[p]
new_p = c(new_p)
self.updates.append(K.update(p, new_p))
return self.updates
Y la función ''get_update ()'' parece una actualización de un paso. Sin embargo, si los acumuladores se almacenan la información del historial? ¿Por qué se ha inicializado en ceros en cada paso? ¿Cómo puede ser un acumulador durante todo el proceso de capacitación?
¿Qué hace esta línea?
self.weights = accumulators
Parece que los pesos propios nunca más han sido llamados.
Estás en lo correcto ... para todos los optimizadores en Keras, get_updates()
implementa la lógica de tensor para un paso de las actualizaciones. Esta función se llama una vez para cada model.fit()
de _make_train_function()
aquí , que se usa para crear la función de tensor pasando la regla de update=
como update=
here . Esta regla de actualización se usa de iteración a iteración para actualizar los parámetros del modelo y otros parámetros.
self.weights
de una clase de optimizador son sus parámetros internos. Esto no se usa para entrenamiento. Simplemente funciona para mantener el estado del optimizador (lista de punteros al param / tensor de acumuladores) y cuando se llama a model.save
también se guardan llamando a get_weights()
aquí y se carga de nuevo cuando model.load
llama a set_weights()
aquí