Итак, мне трудно заставить RMSprop и Adam работать.
Я правильно реализовал Momentum в качестве алгоритма оптимизации, что означает, что при сравнении Gradient Descent с Momentum стоимость снижается намного быстрее при использовании Импульс. Точность модели для того же количества эпох также выше для тестового набора при использовании Momentum.
Вот код:
# only momentum
elif name == 'momentum':
# calculate momentum for every layer
for i in range(self.number_of_layers - 1):
self.v[f'dW{i}'] = beta1 * self.v[f'dW{i}'] + (1 - beta1) * self.gradients[f'dW{i}']
self.v[f'db{i}'] = beta1 * self.v[f'db{i}'] + (1 - beta1) * self.gradients[f'db{i}']
# update parameters
for i in range(self.number_of_layers - 1):
self.weights[i] = self.weights[i] - self.learning_rate * self.v[f'dW{i}']
self.biases[i] = self.biases[i] - self.learning_rate * self.v[f'db{i}']
Я перепробовал все, что мог вверх, чтобы попытаться реализовать и RMSprop, и Adam, но безуспешно. Ниже кода. Любая помощь о том, почему он не работает, будет очень принята!
# only rms
elif name == 'rms':
# calculate rmsprop for every layer
for i in range(self.number_of_layers - 1):
self.s[f'dW{i}'] = beta2 * self.s[f'dW{i}'] + (1 - beta2) * self.gradients[f'dW{i}']**2
self.s[f'db{i}'] = beta2 * self.s[f'db{i}'] + (1 - beta2) * self.gradients[f'db{i}']**2
# update parameters
for i in range(self.number_of_layers - 1):
self.weights[i] = self.weights[i] - self.learning_rate * self.gradients[f'dW{i}'] / (np.sqrt(self.s[f'dW{i}']) + epsilon)
self.biases[i] = self.biases[i] - self.learning_rate * self.gradients[f'db{i}'] / (np.sqrt(self.s[f'db{i}']) + epsilon)
# adam optimizer
elif name == 'adam':
# counter
# this resets every time an epoch finishes
self.t += 1
# loop through layers
for i in range(self.number_of_layers - 1):
# calculate v and s
self.v[f'dW{i}'] = beta1 * self.v[f'dW{i}'] + (1 - beta1) * self.gradients[f'dW{i}']
self.v[f'db{i}'] = beta1 * self.v[f'db{i}'] + (1 - beta1) * self.gradients[f'db{i}']
self.s[f'dW{i}'] = beta2 * self.s[f'dW{i}'] + (1 - beta2) * np.square(self.gradients[f'dW{i}'])
self.s[f'db{i}'] = beta2 * self.s[f'db{i}'] + (1 - beta2) * np.square(self.gradients[f'db{i}'])
# bias correction
self.v1[f'dW{i}'] = self.v[f'dW{i}'] / (1 - beta1**self.t)
self.v1[f'db{i}'] = self.v[f'db{i}'] / (1 - beta1**self.t)
self.s1[f'dW{i}'] = self.s[f'dW{i}'] / (1 - beta2**self.t)
self.s1[f'db{i}'] = self.s[f'db{i}'] / (1 - beta2**self.t)
# update parameters
for i in range(self.number_of_layers - 1):
self.weights[i] = self.weights[i] - self.learning_rate * np.divide(self.v1[f'dW{i}'], (np.sqrt(self.s1[f'dW{i}']) + epsilon))
self.biases[i] = self.biases[i] - self.learning_rate * np.divide(self.v1[f'db{i}'], (np.sqrt(self.s1[f'db{i}']) + epsilon))
# additional information
# epsilon = 1e-8
# beta1 = 0.9
# beta2 = 0.999