«Недопустимое значение» в реализации RMSprop с нуля на Python

Вопрос или проблема

Изменение 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)

Применение

Чтобы избежать подобных аномалий, важно понимать, как регуляризационный терм влияет на вычисления. Скорее всего, использовать логарифмическое преобразование параметров или же изменять способ их нормализации. Рассмотрим несколько практических шагов и рекомендаций:

  1. Регуляризация: Убедитесь, что регуляризационный терм добавляется корректно и не приводит к формированию отрицательных значений. Это часто требует, чтобы регуляризационный терм преобразовывался таким образом, чтобы он только добавлял положительную систематическую корректировку.

  2. Стабильность вычислений: Внимательно следите за любое подведение подкоренного выражения, чтобы избежать ситуации, когда выражение становится отрицательным. Это может потребовать добавления более крупных добавок, таких как ( \epsilon ), для стабилизации вычисления.

  3. Отладка шаг за шагом: Используйте отладчики или обширные логирования вашего вычислительного процесса, чтобы глубже понять, на каком именно этапе возникли неожиданные значения. Полезно проверять значение каждой переменной в процессе выполнения.

  4. Численная стабильность: Привмотрите к использованию алгоритмов численной стабилизации, которые предотвращают вылеты значения за пределы допустимых операционной системы или самой библиотеки.

  5. Тестирование с упрощенными моделями: Перед тем как приступить к сложным расчетам с полным набором данных и большим количеством параметров, отладьте вашу методику вычислений на небольших синтетических данных или субмножествах, чтобы быстро валидировать гипотезы и не терять контекст сложности модели.

Эти рекомендации помогут ускорить достижение стабильного и корректного поведения алгоритмов оптимизации с использованием RMSprop и минимизировать появление ошибок при обучении. Важно всегда помнить о проверке и анализе всех промежуточных значений параметров, чтобы убедиться, что алгоритм работает в запланированном направлении.

Оцените материал
Добавить комментарий

Капча загружается...