Рекуррентные нейронные сети — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(См. также)
 
(не показано 14 промежуточных версий 4 участников)
Строка 2: Строка 2:
  
 
== Описание ==
 
== Описание ==
[[File:RNN.png|450px|thumb|[http://colah.github.io/posts/2015-08-Understanding-LSTMs/ 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|[http://colah.github.io/posts/2015-08-Understanding-LSTMs/ Схема слоя рекуррентной сети]]]
+
[[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|RNN с задержкой на скрытом слое]]
+
[[File:RNN_BP.jpg|450px|thumb|Рисунок 3. RNN с задержкой на скрытом слое]]
[[File:RNN_BPTT.jpg|450px|thumb|Развертка RNN]]
+
[[File:RNN_BPTT.jpg|450px|thumb|Рисунок 4. Развертка RNN]]
Обучение RNN аналогично обучению обычной нейронной сети. Мы также используем [[:Обратное_распространение_ошибки|алгоритм обратного распространения ошибки (backpropagation)]]<sup>[на 28.01.19 не создан]</sup>, но с небольшим изменением. Поскольку одни и те же параметры используются на всех временных этапах в сети, градиент на каждом выходе зависит не только от расчетов текущего шага, но и от предыдущих временных шагов. Например, чтобы вычислить градиент для четвертого элемента последовательности, нам нужно было бы «распространить ошибку» на 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>
+
Обучение RNN аналогично обучению обычной нейронной сети. Мы также используем [[:Обратное_распространение_ошибки|алгоритм обратного распространения ошибки]] (англ. Backpropagation), но с небольшим изменением. Поскольку одни и те же параметры используются на всех временных этапах в сети, градиент на каждом выходе зависит не только от расчетов текущего шага, но и от предыдущих временных шагов (рис. 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>
  
 
Алгоритм обратного распространения ошибки сквозь время:
 
Алгоритм обратного распространения ошибки сквозь время:
Строка 15: Строка 15:
 
== Области и примеры применения ==
 
== Области и примеры применения ==
 
Используются, когда важно соблюдать последовательность, когда важен порядок поступающих объектов.
 
Используются, когда важно соблюдать последовательность, когда важен порядок поступающих объектов.
* Обработка текста на естественном языке
+
* Обработка текста на естественном языке:
** Анализ текста
+
** Анализ текста;
** Автоматический перевод
+
** Автоматический перевод;
* Обработка аудио  
+
* Обработка аудио:
** Автоматическое распознавание речи
+
** Автоматическое распознавание речи;
* Обработка видео
+
* Обработка видео:
** Прогнозирование следующего кадра на основе предыдущих
+
** Прогнозирование следующего кадра на основе предыдущих;
** Распознавание эмоций
+
** Распознавание эмоций;
* Обработка изображений
+
* Обработка изображений:
** Прогнозирование следующего пикселя на основе окружения
+
** Прогнозирование следующего пикселя на основе окружения;
** Генерация описания изображений
+
** Генерация описания изображений.
  
 
== Виды RNN ==
 
== Виды RNN ==
Строка 64: Строка 64:
  
 
=== Рекурсивная сеть ===
 
=== Рекурсивная сеть ===
[[:Рекурсивные нейронные сети|Рекурсивные нейронные сети]]<sup>[на 28.01.19 не создан]</sup> представляют собой более общий случай рекуррентных сетей, когда сигнал в сети проходит через структуру в виде дерева (обычно бинарные деревья). Те же самые матрицы весов используются рекурсивно по всему графу в соответствии с его топологией.
+
[[:Рекурсивные нейронные сети|Рекурсивные нейронные сети]] (англ. Recurrent neural networks) представляют собой более общий случай рекуррентных сетей, когда сигнал в сети проходит через структуру в виде дерева (обычно бинарные деревья). Те же самые матрицы весов используются рекурсивно по всему графу в соответствии с его топологией.
  
 
=== Нейронная сеть Хопфилда ===
 
=== Нейронная сеть Хопфилда ===
Строка 71: Строка 71:
 
=== Двунаправленная ассоциативная память (BAM) ===
 
=== Двунаправленная ассоциативная память (BAM) ===
 
Вариацией сети Хопфилда является двунаправленная ассоциативная память (BAM). BAM имеет два слоя, каждый из которых может выступать в качестве входного, находить (вспоминать) ассоциацию и генерировать результат для другого слоя.
 
Вариацией сети Хопфилда является двунаправленная ассоциативная память (BAM). BAM имеет два слоя, каждый из которых может выступать в качестве входного, находить (вспоминать) ассоциацию и генерировать результат для другого слоя.
[[File:Elman_RNN.jpg|450px|thumb|Сеть Элмана]]
+
[[File:Elman_RNN.jpg|450px|thumb|Рисунок 5. Сеть Элмана]]
  
 
=== Сеть Элмана ===
 
=== Сеть Элмана ===
Нейронная сеть Элмана состоит из трёх слоев: x, y, z (см рис. Сеть Элмана). Дополнительно к сети добавлен набор «контекстных блоков»: u (см рис. Сеть Элмана). Средний (скрытый) слой соединён с контекстными блоками с фиксированным весом, равным единице. С каждым шагом времени на вход поступает информация, которая проходит прямой ход к выходному слою в соответствии с правилами обучения. Фиксированные обратные связи сохраняют предыдущие значения скрытого слоя в контекстных блоках (до того как скрытый слой поменяет значение в процессе обучения). Таким способом сеть сохраняет своё состояние, что может использоваться в предсказании последовательностей, выходя за пределы мощности многослойного перцептрона.
+
Нейронная сеть Элмана состоит из трёх слоев: <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>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>y_t = \sigma_y(W_y h_t + b_y)</math>,
  
 
Обозначения переменных и функций:
 
Обозначения переменных и функций:
* <math>x_t</math>: вектор входного слоя
+
* <math>x_t</math>: вектор входного слоя;
* <math>h_t</math>: вектор скрытого слоя
+
* <math>h_t</math>: вектор скрытого слоя;
* <math>y_t</math>: вектор выходного слоя
+
* <math>y_t</math>: вектор выходного слоя;
* <math>W, U, b</math>: матрица и вектор параметров
+
* <math>W, U, b</math>: матрица и вектор параметров;
* <math>\sigma_h, \sigma_y</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>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>
+
<math>y_t = \sigma_y(W_y h_t + b_y)</math>,
  
 
=== Эхо-сети ===
 
=== Эхо-сети ===
Строка 99: Строка 99:
 
=== Нейронный компрессор истории ===
 
=== Нейронный компрессор истории ===
 
Нейронный компрессор исторических данных {{---}} это блок, позволяющий в сжатом виде хранить существенные исторические особенности процесса, который является своего рода стеком рекуррентной нейронной сети, формируемым в процессе самообучения.
 
Нейронный компрессор исторических данных {{---}} это блок, позволяющий в сжатом виде хранить существенные исторические особенности процесса, который является своего рода стеком рекуррентной нейронной сети, формируемым в процессе самообучения.
[[File:LSTM.png|450px|thumb|[http://colah.github.io/posts/2015-08-Understanding-LSTMs/ Схема слоев рекуррентной сети долго-краткосрочной памяти]]]
+
[[File:LSTM.png|450px|thumb|Рисунок 6. Схема слоев рекуррентной сети долго-краткосрочной памяти <ref>[http://colah.github.io/posts/2015-08-Understanding-LSTMs Understanding LSTM Networks]</ref>]]
  
 
=== Сети долго-краткосрочной памяти ===
 
=== Сети долго-краткосрочной памяти ===
[[:Долгая_краткосрочная_память|Сеть долго-краткосрочной памяти]] (англ. Long short-term memory, LSTM) является самой популярной архитектурой рекуррентной нейронной сети на текущий момент, такая архитектура способна запоминать данные на долгое время.<ref name=LSTM>[https://www.bioinf.jku.at/publications/older/2604.pdf Sepp Hochreiter, Jurgen Schmidhuber. Long short-term memory (1997). Neural Computation.]</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>
  
 
=== Управляемые рекуррентные блоки ===
 
=== Управляемые рекуррентные блоки ===
 
Управляемые рекуррентные блоки (англ. Gated Recurrent Units, GRU) {{---}} обладает меньшим количеством параметров, чем у LSTM, и в ней отсутствует выходное управление. При этом производительность в моделях речевого сигнала или полифонической музыки оказалась сопоставимой с LSTM.
 
Управляемые рекуррентные блоки (англ. Gated Recurrent Units, GRU) {{---}} обладает меньшим количеством параметров, чем у LSTM, и в ней отсутствует выходное управление. При этом производительность в моделях речевого сигнала или полифонической музыки оказалась сопоставимой с LSTM.
 +
 +
=== Двунаправленные рекуррентные сети ===
 +
[[File:biRNN.png|450px|thumb|Рисунок 7. Двунаправленная рекуррентная сеть <ref>[https://towardsdatascience.com/understanding-bidirectional-rnn-in-pytorch-5bd25a5dd66 Understanding Bidirectional RNN in PyTorch]</ref>]]
 +
Двунаправленная рекуррентная сеть (англ. Bidirectional Recurrent Neural Network, biRNN) представляет собой две однонаправленные рекуррентные сети, одна из которых обрабатывает входную последовательность в прямом порядке, а другая {{---}} в обратном (рис. 7). Таким образом, для каждого элемента входной последовательности считается два вектора скрытых состояний, на основе которых вычисляется выход сети. Благодаря данной архитектуре сети доступна информация о контексте как из прошлого, так и из будущего, что решает проблему однонаправленных рекуррентных сетей. Для обучения biRNN используются те же алгоритмы, что и для RNN.
 +
 +
<math>H_t^f = \sigma^f(W_x^f X_t + W_h^f H_{t-1}^f + b^f)</math>,
 +
 +
<math>H_t^b = \sigma^b(W_x^b X_t + W_h^b H_{t+1}^b + b^b)</math>,
 +
 +
<math>O_t = W^q H_t + b^q</math>,
 +
 +
где <math>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 сеть <ref>[https://medium.com/guan-hong/implement-of-seq2seq-model-117c32492e57 Implementation of seq2seq model]</ref>]]
 +
Seq-2-seq (Sequence to sequence, Seq2seq) сеть является базовой архитектурой many-to-many RNN и используется для трансляции одной последовательности в другую (рис. 8). Она состоит из двух рекуррентных сетей: кодировщика и декодировщика. Кодировщик вычисляет вектор, кодирующий входную последовательность. Далее данный вектор передается декодировщику, который в свою очередь по полученному скрытому представлению восстанавливает целевую последовательность. При этом каждый посчитанный выход используется для обновления скрытого представления.
 +
<br clear="both" />
  
 
== Пример кода ==
 
== Пример кода ==
Пример кода на Python с использованием библиотеки Keras.<ref name=KerasRNN>[https://keras.io/layers/recurrent/ Keras RNN]</ref>
+
===Пример кода на Python с использованием библиотеки Keras.<ref name=KerasRNN>[https://keras.io/layers/recurrent/ Keras RNN]</ref>===
  
 
   <font color="green"># Импорты</font>
 
   <font color="green"># Импорты</font>
Строка 158: Строка 175:
 
   scores = model.evaluate(X_test, y_test, batch_size = <font color="blue">64</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>))
 
   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>.
  
 
==См. также==
 
==См. также==
 
*[[:Сверточные_нейронные_сети|Сверточные нейронные сети]]
 
*[[:Сверточные_нейронные_сети|Сверточные нейронные сети]]
 
*[[:Нейронные_сети,_перцептрон|Нейронные сети, перцептрон]]
 
*[[:Нейронные_сети,_перцептрон|Нейронные сети, перцептрон]]
*[[:Рекурсивные нейронные сети|Рекурсивные нейронные сети]]<sup>[на 28.01.19 не создан]</sup>
+
*[[:Рекурсивные нейронные сети|Рекурсивные нейронные сети]]
  
 
==Примечания==
 
==Примечания==

Текущая версия на 10:37, 23 января 2021

Рекуррентная нейронная сеть (англ. recurrent neural network, RNN) — вид нейронных сетей, где связи между элементами образуют направленную последовательность.

Описание[править]

Рисунок 1. RNN и ее развернутое представление [1]
Рисунок 2. Схема слоя рекуррентной сети [2]

Рекуррентные нейронные сети — сети с циклами, которые хорошо подходят для обработки последовательностей (рис. 1).

Рисунок 3. RNN с задержкой на скрытом слое
Рисунок 4. Развертка RNN

Обучение RNN аналогично обучению обычной нейронной сети. Мы также используем алгоритм обратного распространения ошибки (англ. Backpropagation), но с небольшим изменением. Поскольку одни и те же параметры используются на всех временных этапах в сети, градиент на каждом выходе зависит не только от расчетов текущего шага, но и от предыдущих временных шагов (рис. 4). Например, чтобы вычислить градиент для четвертого элемента последовательности, нам нужно было бы «распространить ошибку» на 3 шага и суммировать градиенты. Этот алгоритм называется «алгоритмом обратного распространения ошибки сквозь время» (англ. Backpropagation Through Time, BPTT).[3][4]

Алгоритм обратного распространения ошибки сквозь время:

RNN BPTT GRAD.png

Области и примеры применения[править]

Используются, когда важно соблюдать последовательность, когда важен порядок поступающих объектов.

  • Обработка текста на естественном языке:
    • Анализ текста;
    • Автоматический перевод;
  • Обработка аудио:
    • Автоматическое распознавание речи;
  • Обработка видео:
    • Прогнозирование следующего кадра на основе предыдущих;
    • Распознавание эмоций;
  • Обработка изображений:
    • Прогнозирование следующего пикселя на основе окружения;
    • Генерация описания изображений.

Виды RNN[править]

Один к одному[править]

RNN OTO.jpg
Архитектура по сути является обычной нейронной сетью.

Один ко многим[править]

RNN OTM.jpg
Один вход ко многим выходам может применяться, например, для генерации аудиозаписи. На вход подаем жанр музыки, который хотим получить, на выходе получаем последовательность аудиозаписи.

Многие к одному[править]

RNN MTO.jpg
Много входов и один выход может применяться, если мы хотим оценить тональность рецензии. На вход подаем слова рецензии, на выходе получаем оценку ее тональности: позитивная рецензия или негативная.

Многие ко многим[править]

RNN MTM1.jpg
Данную архитектуру можно использовать для перевода текста с одного языка на другой.
RNN MTM2.jpg
Такой вариант подойдет для определения для классификации каждого слова в предложении в зависимости от контекста.

Архитектуры[править]

Полностью рекуррентная сеть[править]

Это базовая архитектура, разработанная в 1980-х. Сеть строится из узлов, каждый из которых соединён со всеми другими узлами. У каждого нейрона порог активации меняется со временем и является вещественным числом. Каждое соединение имеет переменный вещественный вес. Узлы разделяются на входные, выходные и скрытые.

Рекурсивная сеть[править]

Рекурсивные нейронные сети (англ. Recurrent neural networks) представляют собой более общий случай рекуррентных сетей, когда сигнал в сети проходит через структуру в виде дерева (обычно бинарные деревья). Те же самые матрицы весов используются рекурсивно по всему графу в соответствии с его топологией.

Нейронная сеть Хопфилда[править]

Тип рекуррентной сети, когда все соединения симметричны. Изобретена Джоном Хопфилдом в 1982 году и гарантируется, что динамика такой сети сходится к одному из положений равновесия.

Двунаправленная ассоциативная память (BAM)[править]

Вариацией сети Хопфилда является двунаправленная ассоциативная память (BAM). BAM имеет два слоя, каждый из которых может выступать в качестве входного, находить (вспоминать) ассоциацию и генерировать результат для другого слоя.

Рисунок 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],

Эхо-сети[править]

Эхо-сеть (англ. Echo State Network, ESN) характеризуется одним скрытым слоем (который называется резервуаром) со случайными редкими связями между нейронами. При этом связи внутри резервуара фиксированы, но связи с выходным слоем подлежат обучению. Состояние резервуара (state) вычисляется через предыдущие состояния резервуара, а также предыдущие состояния входного и выходного сигналов. Так как эхо-сети обладают только одним скрытым слоем, они обладают достаточно низкой вычислительной сложностью.

Нейронный компрессор истории[править]

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

Рисунок 6. Схема слоев рекуррентной сети долго-краткосрочной памяти [5]

Сети долго-краткосрочной памяти[править]

Сеть долго-краткосрочной памяти (англ. Long short-term memory, LSTM) является самой популярной архитектурой рекуррентной нейронной сети на текущий момент, такая архитектура способна запоминать данные на долгое время (рис. 6).[6]

Управляемые рекуррентные блоки[править]

Управляемые рекуррентные блоки (англ. Gated Recurrent Units, GRU) — обладает меньшим количеством параметров, чем у LSTM, и в ней отсутствует выходное управление. При этом производительность в моделях речевого сигнала или полифонической музыки оказалась сопоставимой с LSTM.

Двунаправленные рекуррентные сети[править]

Рисунок 7. Двунаправленная рекуррентная сеть [7]

Двунаправленная рекуррентная сеть (англ. Bidirectional Recurrent Neural Network, biRNN) представляет собой две однонаправленные рекуррентные сети, одна из которых обрабатывает входную последовательность в прямом порядке, а другая — в обратном (рис. 7). Таким образом, для каждого элемента входной последовательности считается два вектора скрытых состояний, на основе которых вычисляется выход сети. Благодаря данной архитектуре сети доступна информация о контексте как из прошлого, так и из будущего, что решает проблему однонаправленных рекуррентных сетей. Для обучения biRNN используются те же алгоритмы, что и для RNN.

[math]H_t^f = \sigma^f(W_x^f X_t + W_h^f H_{t-1}^f + b^f)[/math],

[math]H_t^b = \sigma^b(W_x^b X_t + W_h^b H_{t+1}^b + b^b)[/math],

[math]O_t = W^q H_t + b^q[/math],

где [math]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 сети[править]

Рисунок 8. Seq-2-seq сеть [8]

Seq-2-seq (Sequence to sequence, Seq2seq) сеть является базовой архитектурой many-to-many RNN и используется для трансляции одной последовательности в другую (рис. 8). Она состоит из двух рекуррентных сетей: кодировщика и декодировщика. Кодировщик вычисляет вектор, кодирующий входную последовательность. Далее данный вектор передается декодировщику, который в свою очередь по полученному скрытому представлению восстанавливает целевую последовательность. При этом каждый посчитанный выход используется для обновления скрытого представления.

Пример кода[править]

Пример кода на Python с использованием библиотеки Keras.[9][править]

 # Импорты
 import numpy as np
 from keras.preprocessing import sequence
 from keras.models import Sequential
 from keras.layers import Dense, Activation, Embedding
 from keras.layers import LSTM
 from keras.datasets import imdb
 
 # Устанавливаем seed для обеспечения повторяемости результатов
 np.random.seed(42)
 
 # Указываем количество слов из частотного словаря, которое будет использоваться (отсортированы по частоте использования)
 max_features = 5000
 
 # Загружаем данные (датасет IMDB содержит 25000 рецензий на фильмы с правильным ответом для обучения и 25000 рецензий на фильмы с правильным ответом для тестирования)
 (X_train, y_train), (X_test, y_test) = imdb.load_data(nb_words = max_features)
 
 # Устанавливаем максимальную длину рецензий в словах, чтобы они все были одной длины
 maxlen = 80
 
 # Заполняем короткие рецензии пробелами, а длинные обрезаем
 X_train = sequence.pad_sequences(X_train, maxlen = maxlen)
 X_test = sequence.pad_sequences(X_test, maxlen = maxlen)
 
 # Создаем модель последовательной сети
 model = Sequential()
 # Добавляем слой для векторного представления слов (5000 слов, каждое представлено вектором из 32 чисел, отключаем входной сигнал с вероятностью 20% для предотвращения переобучения)
 model.add(Embedding(max_features, 32, dropout = 0.2))
 # Добавляем слой долго-краткосрочной памяти (100 элементов для долговременного хранения информации, отключаем входной сигнал с вероятностью 20%, отключаем рекуррентный сигнал с вероятностью 20%)
 model.add(LSTM(100, dropout_W = 0.2, dropout_U = 0.2))
 # Добавляем полносвязный слой из 1 элемента для классификации, в качестве функции активации будем использовать сигмоидальную функцию
 model.add(Dense(1, activation = 'sigmoid'))
 
 # Компилируем модель нейронной сети
 model.compile(loss = 'binary_crossentropy',
               optimizer = 'adam',
               metrics = ['accuracy'])
 
 # Обучаем нейронную сеть (данные для обучения, ответы к данным для обучения, количество рецензий после анализа которого будут изменены веса, число эпох обучения, тестовые данные, показывать progress bar или нет)
 model.fit(X_train, y_train, 
           batch_size = 64,
           nb_epoch = 7,
           validation_data = (X_test, y_test),
           verbose = 1)
 
 # Проверяем качество обучения на тестовых данных (если есть данные, которые не участвовали в обучении, лучше использовать их, но в нашем случае таковых нет)
 scores = model.evaluate(X_test, y_test, batch_size = 64)
 print('Точность на тестовых данных: %.2f%%' % (scores[1] * 100))

Пример на языке Java[править]

Пример простой рекуррентной нейронной сети, способной генерировать заданную строку по первому символу, с применением библиотеки deeplearning4j.

См. также[править]

Примечания[править]