Рекуррентные нейронные сети | Теория


Приветствую! Частенько я публиковал статьи различного вида, в которых объяснял о сетях прямого распространения. В них я рассказывал о том, как нейронные сети обучаются, о том, как работают нейроны и о практическом применении сетей. Теперь я расскажу о сетях, которые подходят для чат-ботов, сложного прогнозирования, классификации текстов и многого другого.

Архитектура


Как нам известно, нейронные сети прямого распространения имеют входной слой, скрытые слои, выходной слой. Рекуррентные сети имеют почти такое же строение, только к ним добавляется слой временной задержки. Например, скрытый слой связан с временной задержкой. Мы посылаем сигналы от входного слоя на скрытый, скрытый слой посылает обработанную информацию на слой временной задержки и на выходной слой. В следующий раз, когда мы посылаем опять сигналы, информация идёт от входного слоя к скрытому, да и ещё от слоя задержки идут сигналы через такие же синапсы (веса). После этого скрытый слой обрабатывает информацию, так же посылает новые сигналы на слой временной задержки и на выходной слой. Рассмотрим это всё на рисунке:
619689db6aaa48d5b253fbd77b66a550.png

Давайте опишем это математической формулой. Сначала мы посылаем информацию от входного слоя по весам к скрытому: h1 = (x1 * w1) + (x2 * w4); h2 = (x1 * w2) + (x2 * w3)
Теперь посылаем информацию от скрытых нейронов на слой временной задержки и на выход сети: c1 = h1, c2 = h2; выход1 = (h1 * w5) + (h2 * w6)

Всё, мы получили первый ответ. Теперь мы записали данные слой временной задержки и снова начинаем прогонять сигнал, только добавляем сигналы от временной задержки: h1 = (x1 * w1) + (x2 * w4) + (c1 * c_w1) + (c2 * c_w3); и на второй скрытый нейрон h2 = (x1 * w2) + (x2 * w3) + (c1 * c_w2) + (c2 * c_w4). Теперь мы снова отправляем полученные данные на слой задержки и на выход: c1 = h1, c2 = h2; выход1 = (h1 * w5) + (h2 * w6).

С первого взгляда не понятно, если не знать строение искусственных нейронов. Напомню, что нейрон имеет весовые коэффициенты, которые умножаются на получаемые данные, в результате мы получаем модифицированный ответ. Затем модифицированные ответы в нейроне складываются и идут в функцию активации. Функция активации делает из суммирования понятный для нас ответ. Мы можем использовать пороговую функцию или сигмоидальные (гиперболический тангенс и логистическая функция)

Пороговая функция. Когда мы имеем результат суммирования и какой-то порог, мы сравниваем их. Если суммарный результат больше порогового, то нейрон выдаст 1, а если нет, то 0.

Гиперболический тангенс преобразует суммарный результат в число от -1 до 1. Для этого используют формулу:

$exp(out) - exp(-out) / exp(out) + exp(-out)$


Экспонента — показательная функция.

Логистическая функция преобразует суммарный результат в число от 0 до 1. Для этого используют формулу: $1 / (1 + exp(-out))$

В конечном итоге, получается, что рекуррентные нейронные сети способны на кратковременную память.

Обучение рекуррентных сетей


Для обучения таких сетей очень часто используют метод градиентного спуска. Можно было бы и обратное распространение ошибки, но о нём и так много написано.

Я не буду рассказывать об этом методе обучения подробно. Лишь скажу такой алгоритм:

1. Отправляем сигнал на нейронную сеть.
2. Вычисляем ошибку (Берём правильный ответ и вычитаем из него ответ нейронной сети)
3. Умножаем ошибку на уклон сигмоиды.
4. Умножаем входные данные на результат из 3 шага.
5. Складываем результаты из 4 пункта (вектора или матрицы)
6. Вычитаем из весов результаты 5 пункта.

Получить ошибку можно таким образом: из правильного ответа вычесть ответ сети.
Уклон сигмоиды получается таким образом: выход * (1 — выход)

Думаю, что всё хоть немного понятно. В следующей части я расскажу о том, как на практике применить такую сеть с градиентным спуском и о том, как работают LSTM сети.

Комментарии (1)

  • 18 марта 2017 в 13:18

    +3

    … теперь нарисуйте остальную сову — и готово!

© Habrahabr.ru