СоХабр закрыт.

С 13.05.2019 изменения постов больше не отслеживаются, и новые посты не сохраняются.

| сохранено

H Рекуррентные нейронные сети | Теория в черновиках

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

Архитектура


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


Давайте опишем это математической формулой. Сначала мы посылаем информацию от входного слоя по весам к скрытому: 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 сети.

комментарии (5)

+11
lair ,  

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

+1
capjdcoder ,  
присоединяюсь про сову
+1
fireSparrow ,   * (был изменён)
Особенно умиляет вот этот пассаж:

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

Я не буду рассказывать об этом методе обучения подробно.


То есть, про один метод мы не будем говорить, потому что о нём и так много написано. Но и про второй особо говорить не будем.
Может, тогда и статью писать не стоило? Написать заголовок, а под ним — «В принципе, вся инфа по теме есть в гугле, ищите сами.»
0
Dark_Daiver ,  
Самое смешное, что обратное распространение ошибки это скорее способ получения градиента, а не сам метод обучения
+1
leocat33 ,  
А про то, как дебажить работу нейронной сети в продолжениях будет?