Приветствую! Частенько я публиковал статьи различного вида, в которых объяснял о сетях прямого распространения. В них я рассказывал о том, как нейронные сети обучаются, о том, как работают нейроны и о практическом применении сетей. Теперь я расскажу о сетях, которые подходят для чат-ботов, сложного прогнозирования, классификации текстов и многого другого.
Архитектура
Как нам известно, нейронные сети прямого распространения имеют входной слой, скрытые слои, выходной слой. Рекуррентные сети имеют почти такое же строение, только к ним добавляется слой временной задержки. Например, скрытый слой связан с временной задержкой. Мы посылаем сигналы от входного слоя на скрытый, скрытый слой посылает обработанную информацию на слой временной задержки и на выходной слой. В следующий раз, когда мы посылаем опять сигналы, информация идёт от входного слоя к скрытому, да и ещё от слоя задержки идут сигналы через такие же синапсы(веса). После этого скрытый слой обрабатывает информацию, так же посылает новые сигналы на слой временной задержки и на выходной слой. Рассмотрим это всё на рисунке:
Давайте опишем это математической формулой. Сначала мы посылаем информацию от входного слоя по весам к скрытому: 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. Для этого используют формулу:
Экспонента — показательная функция.
Логистическая функция преобразует суммарный результат в число от 0 до 1. Для этого используют формулу:
В конечном итоге, получается, что рекуррентные нейронные сети способны на кратковременную память.
Обучение рекуррентных сетей
Для обучения таких сетей очень часто используют метод градиентного спуска. Можно было бы и обратное распространение ошибки, но о нём и так много написано.
Я не буду рассказывать об этом методе обучения подробно. Лишь скажу такой алгоритм:
1. Отправляем сигнал на нейронную сеть.
2. Вычисляем ошибку (Берём правильный ответ и вычитаем из него ответ нейронной сети)
3. Умножаем ошибку на уклон сигмоиды.
4. Умножаем входные данные на результат из 3 шага.
5. Складываем результаты из 4 пункта(вектора или матрицы)
6. Вычитаем из весов результаты 5 пункта.
Получить ошибку можно таким образом: из правильного ответа вычесть ответ сети.
Уклон сигмоиды получается таким образом: выход * (1 — выход)
Думаю, что всё хоть немного понятно. В следующей части я расскажу о том, как на практике применить такую сеть с градиентным спуском и о том, как работают LSTM сети.
Автор: EmeraldSoft