Изменения

Перейти к: навигация, поиск

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

3981 байт добавлено, 10:37, 23 января 2021
Нет описания правки
[[File:RNN.png|450px|thumb|[http://colah.github.io/posts/2015-08-Understanding-LSTMs/ RNN и ее развернутое представление]]]
[[File:RNN_layer.png|450px|thumb|[http://colah.github.io/posts/2015-08-Understanding-LSTMs/ Схема слоя рекуррентной сети]]]
 
'''Рекуррентная нейронная сеть''' (англ. ''recurrent neural network'', ''RNN'') {{---}} вид [[:Нейронные_сети,_перцептрон|нейронных сетей]], где связи между элементами образуют направленную последовательность.
== Описание ==
[[File:RNN.png|450px|thumb|Рисунок 1. RNN и ее развернутое представление <ref>[http://colah.github.io/posts/2015-08-Understanding-LSTMs Understanding LSTM Networks]</ref>]][[File:RNN_layer.png|450px|thumb|Рисунок 2. Схема слоя рекуррентной сети <ref>[http://colah.github.io/posts/2015-08-Understanding-LSTMs Understanding LSTM Networks]</ref>]]Рекуррентные нейронные сети {{---}} сети с циклами, которые хорошо подходят для обработки последовательностей(рис. 1).[[File:RNN_BP.jpg|450px|thumb|Рисунок 3. RNN с задержкой на скрытом слое]][[File:RNN_BPTT.jpg|450px|thumb|Рисунок 4. Развертка RNN]]Обучение RNN аналогично обучению обычной нейронной сети. Мы также используем [[:Обратное_распространение_ошибки|алгоритм обратного распространения ошибки ]] (backpropagationангл. Backpropagation), но с небольшим изменением. Поскольку одни и те же параметры используются на всех временных этапах в сети, градиент на каждом выходе зависит не только от расчетов текущего шага, но и от предыдущих временных шагов(рис. 4). Например, чтобы вычислить градиент при t = 4для четвертого элемента последовательности, нам нужно было бы «распространить ошибку» на 3 шага и суммировать градиенты. Этот алгоритм называется «алгоритмом обратного распространения ошибки сквозь время» (англ. Backpropagation Through Time, BPTT).<ref name=BPTT_1>[http://andrew.gibiansky.com/blog/machine-learning/recurrent-neural-networks/ Backpropagation Through Time]</ref><ref name=BPTT_2>[http://www.wildml.com/2015/10/recurrent-neural-networks-tutorial-part-3-backpropagation-through-time-and-vanishing-gradients/ Backpropagation Through Time]</ref> Алгоритм обратного распространения ошибки сквозь время: [[File:RNN_BPTT_GRAD.png|400px|frameless]]
== Области и примеры применения ==
Используются, когда важно соблюдать последовательность, когда нужен важен порядок того, что у нас происходитпоступающих объектов.* Обработка текста на естественном языке:** Анализ текста;** Автоматический перевод;* Обработка аудио :** Автоматическое распознавание речи;* Обработка видео:** Прогнозирование следующего кадра на основе предыдущих;** Распознавание эмоций;* Обработка изображений:** Прогнозирование следующего пикселя на основе окружения;** Генерация описания изображений. == Виды RNN ===== Один к одному ==={||-|[[File:RNN_OTO.jpg|100px|left]]|Архитектура по сути является обычной нейронной сетью.|} === Один ко многим ==={||-|[[File:RNN_OTM.jpg|100px|left]]|Один вход ко многим выходам может применяться, например, для генерации аудиозаписи. На вход подаем жанр музыки, который хотим получить, на выходе получаем последовательность аудиозаписи.|} === Многие к одному ==={||-|[[File:RNN_MTO.jpg|100px|left]]|Много входов и один выход может применяться, если мы хотим оценить тональность рецензии. На вход подаем слова рецензии, на выходе получаем оценку ее тональности: позитивная рецензия или негативная.|} === Многие ко многим ==={||-|[[File:RNN_MTM1.jpg|100px|left]]|Данную архитектуру можно использовать для перевода текста с одного языка на другой.|-|[[File:RNN_MTM2.jpg|100px|left]]|Такой вариант подойдет для определения для классификации каждого слова в предложении в зависимости от контекста.|}
== Архитектуры ==
=== Рекурсивная сеть ===
[[:Рекурсивные нейронные сети|Рекурсивные нейронные сети]] (англ. Recurrent neural networks) представляют собой более общий случай рекуррентных сетей, когда сигнал в сети проходит через структуру в виде дерева (обычно бинарные деревья). Те же самые матрицы весов используются рекурсивно по всему графу в соответствии с его топологией.
=== Нейронная сеть Хопфилда ===
=== Двунаправленная ассоциативная память (BAM) ===
Вариацией сети Хопфилда является двунаправленная ассоциативная память (BAM). BAM имеет два слоя, каждый из которых может выступать в качестве входного, находить (вспоминать) ассоциацию и генерировать результат для другого слоя.
[[File:Elman_RNN.jpg|450px|thumb|Рисунок 5. Сеть Элмана]]
=== Сеть Элмана ===
Нейронная сеть Элмана состоит из трёх слоев: <math>x</math>, <math>y</math>, <math>z (см рис. Сеть Элмана)</math>. Дополнительно к сети добавлен набор «контекстных блоков»: <math>u </math> (см рис. Сеть Элмана5). Средний (скрытый) слой соединён с контекстными блоками с фиксированным весом, равным единице. С каждым шагом времени на вход поступает информация, которая проходит прямой ход к выходному слою в соответствии с правилами обучения. Фиксированные обратные связи сохраняют предыдущие значения скрытого слоя в контекстных блоках (до того как скрытый слой поменяет значение в процессе обучения). Таким способом сеть сохраняет своё состояние, что может использоваться в предсказании последовательностей, выходя за пределы мощности многослойного перцептрона.
<math>h_t = \sigma_h(W_h x_t + U_h h_{t-1} + b_h)</math>,
<math>y_t = \sigma_y(W_y h_t + b_y)</math>,
Обозначения переменных и функций:
* <math>x_t</math>: вектор входного слоя;* <math>h_t</math>: вектор скрытого слоя;* <math>y_t</math>: вектор выходного слоя;* <math>W, U, b</math>: матрица и вектор параметров;* <math>\sigma_h, \sigma_y</math>: функция активации.
=== Сеть Джордана ===
Нейронная сеть Джордана подобна сети Элмана, но контекстные блоки связаны не со скрытым слоем, а с выходным слоем. Контекстные блоки таким образом сохраняют своё состояние. Они обладают рекуррентной связью с собой.
<math>h_t = \sigma_h(W_h x_t + U_h y_{t-1} + b_h)</math>,
<math>y_t = \sigma_y(W_y h_t + b_y)</math>,
=== Эхо-сети ===
=== Нейронный компрессор истории ===
Нейронный компрессор исторических данных {{---}} это блок, позволяющий в сжатом виде хранить существенные исторические особенности процесса, который является своего рода стеком рекуррентной нейронной сети, формируемым в процессе самообучения.
[[File:LSTM.png|450px|thumb|Рисунок 6. Схема слоев рекуррентной сети долго-краткосрочной памяти <ref>[http://colah.github.io/posts/2015-08-Understanding-LSTMsUnderstanding LSTM Networks]</ Схема слоев рекуррентной сети долго-краткосрочной памяти]ref>]]
=== Сети долго-краткосрочной памяти ===
[[:Долгая_краткосрочная_память|Сеть долго-краткосрочной памяти ]] (англ. Long short-term memory, LSTM) является самой популярная архитектура популярной архитектурой рекуррентной нейронной сети на данный текущий момент, данная такая архитектура способна запоминать данные на долгое время(рис. 6).<ref name=LSTM>[https://www.bioinf.jku.at/publications/older/2604.pdf Sepp Hochreiter, Jurgen Schmidhuber. Long short-term memory (1997). Neural Computation.]</ref>
Разберем работу слоев подробнее<ref name=Understanding_LSTM>[http://colah.github== Управляемые рекуррентные блоки ===Управляемые рекуррентные блоки (англ.io/posts/2015-08-Understanding-LSTMs/ Understanding LSTM Networks]</ref>: Первый слой вычисляетGated Recurrent Units, насколько на данном шаге ему нужно забыть предыдущую информацию GRU) {{---}} по сути множители к компонентам вектора памятиобладает меньшим количеством параметров, чем у LSTM, и в ней отсутствует выходное управление.[[File:LSTM_F1При этом производительность в моделях речевого сигнала или полифонической музыки оказалась сопоставимой с LSTM.png|none|250px]]<math>f_t = \sigma(W_f * [h_{t-1}, x_t] + b_f)</math>
Второй слой вычисляет, насколько ему интересна новая информация, пришедшая с сигналом {{---}} такой же множитель, но уже для наблюдения.=== Двунаправленные рекуррентные сети ===[[File:LSTM_F2biRNN.png|none450px|250pxthumb|Рисунок 7. Двунаправленная рекуррентная сеть <ref>[https://towardsdatascience.com/understanding-bidirectional-rnn-in-pytorch-5bd25a5dd66 Understanding Bidirectional RNN in PyTorch]</ref>]]<math>i_t = \sigmaДвунаправленная рекуррентная сеть (W_f * [h_англ. Bidirectional Recurrent Neural Network, biRNN) представляет собой две однонаправленные рекуррентные сети, одна из которых обрабатывает входную последовательность в прямом порядке, а другая {{t-1--}}в обратном (рис. 7). Таким образом, для каждого элемента входной последовательности считается два вектора скрытых состояний, на основе которых вычисляется выход сети. Благодаря данной архитектуре сети доступна информация о контексте как из прошлого, так и из будущего, что решает проблему однонаправленных рекуррентных сетей. Для обучения biRNN используются те же алгоритмы, x_t] + b_i)</math>что и для RNN.
<math>H_t^f = \tilde{C}_t = tanhsigma^f(W_C * [h_W_x^f X_t + W_h^f H_{t-1}, x_t] ^f + b_Cb^f)</math>,
На третьем слое вычисляется линейная комбинация памяти и наблюдения с только вычисленными весами для каждой из компонент. Так получается новое состояние памяти, которое в таком же виде передаётся далее.[[File:LSTM_F3.png|none|250px]]<math>C_t H_t^b = f_t * C_\sigma^b(W_x^b X_t + W_h^b H_{t-+1} ^b + i_t * \tilde{C}_tb^b)</math>,
Осталось вычислить output. Но поскольку часть входного сигнала уже в памяти, не нужно считать активацию по всему сигналу. Сначала сигнал проходит через сигмоиду, которая решает, какая его часть важна для дальнейших решений, затем гиперболический тангенс «размазывает» вектор памяти на отрезок от -1 до 1, и в конце эти два вектора перемножаются.[[File:LSTM_F4.png|none|250px]]<math>o_t O_t = \sigma(W_o * [h_{t-1}, x_t] W^q H_t + b_o)b^q</math>,
где <math>h_t = o_t * tanh(C_t)W_x^f</math>, <math>W_x^b</math>, <math>W_h^f</math>, <math>W_h^b</math>, <math>W^q</math>, {{---}} матрицы весов, <math>b^f</math>, <math>b^b</math>, <math>b^q</math>, {{---}} байесы, <math>\sigma^f</math>, <math>\sigma^b</math>, {{---}} функции активаций, <math>H_t^f</math> и <math>H_t^b</math> {{---}} выходы однонаправленных рекуррентных сетей, <math>H_t</math> {{---}} их конкатенированный вектор, а <math>O_t</math> {{---}} выход сети на шаге <math>t</math>.
Полученные таким образом === Seq-2-seq сети ===[[File:Seq2seq.png|450px|thumb|Рисунок 8. Seq-2-seq сеть <mathref>h_t<[https://medium.com/guan-hong/math> и <math>C_timplement-of-seq2seq-model-117c32492e57 Implementation of seq2seq model]</mathref> передаются далее по цепочке.]] === Управляемые рекуррентные блоки ===Управляемые рекуррентные блоки Seq-2-seq (англ. Gated Recurrent UnitsSequence to sequence, GRUSeq2seq) {{сеть является базовой архитектурой many-to--}} обладает меньшим количеством параметровmany RNN и используется для трансляции одной последовательности в другую (рис. 8). Она состоит из двух рекуррентных сетей: кодировщика и декодировщика. Кодировщик вычисляет вектор, чем у LSTMкодирующий входную последовательность. Далее данный вектор передается декодировщику, и который в ней отсутствует выходное управлениесвою очередь по полученному скрытому представлению восстанавливает целевую последовательность. При этом производительность в моделях речевого сигнала или полифонической музыки оказалась сопоставимой с LSTMкаждый посчитанный выход используется для обновления скрытого представления.<br clear="both" />
== Пример кода ==
===Пример кода на Python с использованием библиотеки Keras.<ref name=KerasRNN>[https://keras.io/layers/recurrent/ Keras RNN]</ref>===
<font color="green"># Импорты</font>
scores = model.evaluate(X_test, y_test, batch_size = <font color="blue">64</font>)
print(<font color="red">'Точность на тестовых данных: %.2f%%'</font> % (scores[1] * <font color="blue">100</font>))
 
===Пример на языке Java===
[https://github.com/deeplearning4j/dl4j-examples/blob/master/dl4j-examples/src/main/java/org/deeplearning4j/examples/recurrent/basic/BasicRNNExample.java Пример] простой рекуррентной нейронной сети, способной генерировать заданную строку по первому символу, с применением библиотеки <code>deeplearning4j</code>.
==См. также==
==Примечания==
<references/>
 
[[Категория: Машинное обучение]]
[[Категория: Нейронные сети]]
[[Категория: Рекуррентные нейронные сети]]
14
правок

Навигация