Вопрос или проблема
Изменение 2: Термин регуляризации (reg_term) иногда отрицательный из-за отрицательных параметров. Поэтому S[f”dW{l}”] содержит некоторые отрицательные значения. Я понимаю, что reg_term должен быть добавлен перед взятием квадратного корня, вот так:
S[f"dW{l}"] = beta2 * S[f"dW{l}"] + (1 - beta2) * (np.square(gradients[f"dW{l}"] + reg_term))
Изменение 1: Я вижу, что S[f”dW{l}”] содержит некоторые отрицательные значения. Как это возможно, если np.square(gradients[f”dW{l}”]) всегда содержит положительные значения?
Я реализовал нейронную сеть с нуля, использующую градиентный спуск с мини-пакетами. Сеть работает хорошо. К сожалению, я не могу заставить мою реализацию RMSprop работать. Я проверил, что сеть хорошо работает с импульсом.
Я получаю предупреждение времени выполнения при обучении сети с RMSprop: “invalid value encountered in sqrt”. Это происходит на этапе обновления “RMSprop”.
Моя реализация обновления параметров:
def update_parameters(parameters, gradients, V, S, batch_size, t, learning_rate, reg_param):
L = len(parameters) // 2
beta1 = 0.9
beta2 = 0.999
epsilon = 1e-8
for l in range(1, L+1):
reg_term = (reg_param / batch_size) * parameters[f"W{l}"]
# RMSprop градиенты
S[f"dW{l}"] = beta2 * S[f"dW{l}"] + (1 - beta2) * (np.square(gradients[f"dW{l}"]) + reg_term)
S[f"db{l}"] = beta2 * S[f"db{l}"] + (1 - beta2) * np.square(gradients[f"db{l}"])
# RMSprop обновление
parameters[f"W{l}"] -= learning_rate * (gradients[f"dW{l}"] / (np.sqrt(S[f"dW{l}"])) + epsilon)
parameters[f"b{l}"] -= learning_rate * (gradients[f"db{l}"] / (np.sqrt(S[f"db{l}"])) + epsilon)
Вот как я инициализирую параметры:
def init_params_V_and_S(activation_layers):
params = {}
V = {}
S = {}
L = len(activation_layers)
for l in range(1, L):
params[f"W{l}"] = np.random.randn(activation_layers[l], activation_layers[l-1]) * np.sqrt(2 / activation_layers[l-1])
params[f"b{l}"] = np.zeros((activation_layers[l], 1))
# RMSprop параметры
S[f"dW{l}"] = np.zeros((activation_layers[l], activation_layers[l-1]))
S[f"db{l}"] = np.zeros((activation_layers[l], 1))
return params, V, S
Есть идеи, что вызывает это?
Термин регуляризации (reg_term) иногда отрицательный из-за отрицательных параметров. Поэтому S[f”dW{l}”] содержит некоторые отрицательные значения. Я понимаю, что reg_term должен быть добавлен перед взятием квадратного корня, вот так:
S[f"dW{l}"] = beta2 * S[f"dW{l}"] + (1 - beta2) * np.square(gradients[f"dW{l}"] + reg_term)
Ответ или решение
Ошибка "invalid value encountered in sqrt" в реализации алгоритма RMSprop при обучении нейронной сети является распространенной проблемой, с которой сталкиваются многие разработчики, создающие собственные оптимизаторы с нуля. Данная ошибка возникает в момент вычисления квадратного корня из значения, которое может оказаться отрицательным. Разберемся, как именно это может произойти и как устранить проблему.
Теория
Основной принцип работы RMSprop заключается в использовании экспоненциально взвешенного среднего квадратов градиентов для адаптации скорости обучения каждой параметра. Эта техника помогает стабилизировать и ускорить процесс оптимизации, автоматически регулируя шаг обучения в зависимости от поведения градиентов.
Однакo, когда в ваш алгоритм добавляется регуляризация, целью которой является уменьшение переобучения сети, вычисление может порождать неожиданные отрицательные значения. Это связано с тем, что регуляризация воздействует на рассматриваемое выражение, добавляя отрицательный компонент, если параметры сети имеют отрицательное значение.
В RMSprop обновление параметров проводится по следующей формуле:
[ S_t = \beta2 \cdot S{t-1} + (1 – \beta_2) \cdot g^2_t ]
где ( S_t ) — это экспоненциально взвешенное среднее квадратов градиентов, ( \beta_2 ) — гиперпараметр метода, а ( g_t ) — градиент на шаге ( t ).
Пример
Изначально, если рассматривать вашу реализацию, проблема возникала из-за прибавления регуляризационного терма (reg_term
) в квадрате, после взятия квадратов градиентов, а не перед ним. Это могло вызывать негативные значения компоненты ( S ).
Ошибочная строка:
S[f"dW{l}"] = beta2 * S[f"dW{l}"] + (1 - beta2) * (np.square(gradients[f"dW{l}"]) + reg_term)
Учет корректировок:
S[f"dW{l}"] = beta2 * S[f"dW{l}"] + (1 - beta2) * np.square(gradients[f"dW{l}"] + reg_term)
Применение
Чтобы избежать подобных аномалий, важно понимать, как регуляризационный терм влияет на вычисления. Скорее всего, использовать логарифмическое преобразование параметров или же изменять способ их нормализации. Рассмотрим несколько практических шагов и рекомендаций:
-
Регуляризация: Убедитесь, что регуляризационный терм добавляется корректно и не приводит к формированию отрицательных значений. Это часто требует, чтобы регуляризационный терм преобразовывался таким образом, чтобы он только добавлял положительную систематическую корректировку.
-
Стабильность вычислений: Внимательно следите за любое подведение подкоренного выражения, чтобы избежать ситуации, когда выражение становится отрицательным. Это может потребовать добавления более крупных добавок, таких как ( \epsilon ), для стабилизации вычисления.
-
Отладка шаг за шагом: Используйте отладчики или обширные логирования вашего вычислительного процесса, чтобы глубже понять, на каком именно этапе возникли неожиданные значения. Полезно проверять значение каждой переменной в процессе выполнения.
-
Численная стабильность: Привмотрите к использованию алгоритмов численной стабилизации, которые предотвращают вылеты значения за пределы допустимых операционной системы или самой библиотеки.
-
Тестирование с упрощенными моделями: Перед тем как приступить к сложным расчетам с полным набором данных и большим количеством параметров, отладьте вашу методику вычислений на небольших синтетических данных или субмножествах, чтобы быстро валидировать гипотезы и не терять контекст сложности модели.
Эти рекомендации помогут ускорить достижение стабильного и корректного поведения алгоритмов оптимизации с использованием RMSprop и минимизировать появление ошибок при обучении. Важно всегда помнить о проверке и анализе всех промежуточных значений параметров, чтобы убедиться, что алгоритм работает в запланированном направлении.