Автор: Спаркл Рассел-Пулери и Дориан Пулери

В части первой этой серии руководств мы продемонстрировали матричные операции, используемые для оценки скрытых состояний и выходных данных для прямого прохода ГРУ. Исходя из наших плохих результатов, нам, очевидно, необходимо оптимизировать наш алгоритм и протестировать его на тестовом наборе, чтобы обеспечить возможность обобщения. Обычно это делается с использованием нескольких шагов / методов. В этом руководстве мы рассмотрим, что происходит под капотом во время оптимизации, в частности, вычисляем функцию потерь и выполняем обратное распространение во времени для обновления весов за несколько эпох.

Что тут происходит?

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

Помните, наши рассчитанные скрытые состояния и прогнозируемые результаты для первого пакета? Это изображение кажется немного загруженным, однако цель здесь - визуализировать то, что вы выводите, и как на самом деле выглядят скрытые состояния под капотом. Прогнозы представляют собой вероятности, которые были рассчитаны с использованием функции активации Softmax.

Давайте повторно запустим цикл обучения, сохраняя выходные данные (y_hat) и скрытые состояния (h_ (t-1), h_t и, h_ (t + 1)) для каждой последовательности в пакете 1.

Иллюстрация в коде:

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

Потери перекрестной энтропии сначала рассчитываются для каждой последовательности в партии, а затем усредняются по всем последовательностям. Итак, в этом примере мы рассчитаем потерю кросс-энтропии для каждой последовательности с нуля. Но сначала давайте возьмем прогнозы, сделанные для первой партии. Для этого мы возьмем элемент for (индекс 0) из нашего ht_2 и выведем переменные.

Насколько хорошо мы выступили?

Глядя на вероятности выхода, мы можем сказать, что у нас все получилось не так хорошо. Однако давайте определим его количественно, используя уравнение кросс-энтропии! Здесь мы проработаем наш путь от внутреннего термина к первой последовательности в пакете. Обратите внимание, что код будет включать все 3 последовательности из пакета 1.

Первый член: поэлементное умножение истинных меток на журнал предсказанных меток.

Реализация в коде:

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

Реализация в коде:

Третий член: среднее значение сокращенных выборок для первой последовательности в пакете по буквам. В этом примере вычисление было выполнено для первой последовательности в пакете 1. Однако реализация кода охватывает все 3 последовательности в пакете 1.

Реализация в коде:

Усреднение кросс-энтропийных потерь каждой последовательности в партии 1

Обратите внимание, что на практике этот шаг будет выполняться для каждой мини-партии, сохраняя среднее значение потерь для каждой партии. По сути, он суммирует то, что мы вычислили для перекрестной энтропии (потери для каждой последовательности в пакете 1), и делит это на количество последовательностей в пакете.

Как у нас дела?

Потери партии в размере 1,2602 являются высокими и означает, что у нас есть много возможностей для улучшения.

Объяснение

Итак, мы оптимизировали, снизили наши потери, и мы плохо прогнозируем… почему? Что ж, как упоминалось в первом руководстве, это чрезвычайно маленький набор данных при обучении в нейронной сети, созданной с нуля. Рекомендуется делать это с большим объемом данных. Однако цель этого руководства не в создании высокопроизводительной нейронной сети, а в демонстрации того, что происходит под капотом.

Обратное распространение

Последний шаг включает обратное прохождение алгоритма. Этот шаг называется обратным распространением и включает в себя понимание влияния корректировки весов на функцию стоимости. Это выполняется путем вычисления дельты векторов ошибок, начиная с последнего уровня в обратном направлении, путем многократного применения правила цепочки на каждом уровне. Для более подробного подтверждения обратного пропуска через время: https://github.com/tianyic/LSTM-GRU/blob/master/MTwrtieup.pdf

Использованная литература:

1. Неоправданная эффективность рекуррентных нейронных сетей
2. Глубокое обучение Udacity с Pytorch
3. Глубокое обучение Fastai для программистов
4. Глубокое обучение - прямой путь (RNN)
5. Книга по глубокому обучению