Рекуррентные нейронные сети — различия между версиями
м (rollbackEdits.php mass rollback) |
|||
(не показано 6 промежуточных версий 2 участников) | |||
Строка 2: | Строка 2: | ||
== Описание == | == Описание == | ||
− | [[File:RNN.png|450px|thumb|Рисунок 1. 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. Схема слоя рекуррентной сети]] | + | [[File:RNN_layer.png|450px|thumb|Рисунок 2. Схема слоя рекуррентной сети <ref>[http://colah.github.io/posts/2015-08-Understanding-LSTMs Understanding LSTM Networks]</ref>]] |
Рекуррентные нейронные сети {{---}} сети с циклами, которые хорошо подходят для обработки последовательностей (рис. 1). | Рекуррентные нейронные сети {{---}} сети с циклами, которые хорошо подходят для обработки последовательностей (рис. 1). | ||
[[File:RNN_BP.jpg|450px|thumb|Рисунок 3. RNN с задержкой на скрытом слое]] | [[File:RNN_BP.jpg|450px|thumb|Рисунок 3. RNN с задержкой на скрытом слое]] | ||
[[File:RNN_BPTT.jpg|450px|thumb|Рисунок 4. Развертка RNN]] | [[File:RNN_BPTT.jpg|450px|thumb|Рисунок 4. Развертка RNN]] | ||
− | Обучение RNN аналогично обучению обычной нейронной сети. Мы также используем [[:Обратное_распространение_ошибки|алгоритм обратного распространения ошибки | + | Обучение 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> |
Алгоритм обратного распространения ошибки сквозь время: | Алгоритм обратного распространения ошибки сквозь время: | ||
Строка 64: | Строка 64: | ||
=== Рекурсивная сеть === | === Рекурсивная сеть === | ||
− | [[:Рекурсивные нейронные сети|Рекурсивные нейронные сети]] | + | [[:Рекурсивные нейронные сети|Рекурсивные нейронные сети]] (англ. Recurrent neural networks) представляют собой более общий случай рекуррентных сетей, когда сигнал в сети проходит через структуру в виде дерева (обычно бинарные деревья). Те же самые матрицы весов используются рекурсивно по всему графу в соответствии с его топологией. |
=== Нейронная сеть Хопфилда === | === Нейронная сеть Хопфилда === | ||
Строка 74: | Строка 74: | ||
=== Сеть Элмана === | === Сеть Элмана === | ||
− | Нейронная сеть Элмана состоит из трёх слоев: x, y, z. Дополнительно к сети добавлен набор «контекстных блоков»: u (рис. 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>h_t = \sigma_h(W_h x_t + U_h h_{t-1} + b_h)</math>, | ||
Строка 99: | Строка 99: | ||
=== Нейронный компрессор истории === | === Нейронный компрессор истории === | ||
Нейронный компрессор исторических данных {{---}} это блок, позволяющий в сжатом виде хранить существенные исторические особенности процесса, который является своего рода стеком рекуррентной нейронной сети, формируемым в процессе самообучения. | Нейронный компрессор исторических данных {{---}} это блок, позволяющий в сжатом виде хранить существенные исторические особенности процесса, который является своего рода стеком рекуррентной нейронной сети, формируемым в процессе самообучения. | ||
− | [[File:LSTM.png|450px|thumb|Рисунок 6. Схема слоев рекуррентной сети долго-краткосрочной памяти]] | + | [[File:LSTM.png|450px|thumb|Рисунок 6. Схема слоев рекуррентной сети долго-краткосрочной памяти <ref>[http://colah.github.io/posts/2015-08-Understanding-LSTMs Understanding LSTM Networks]</ref>]] |
=== Сети долго-краткосрочной памяти === | === Сети долго-краткосрочной памяти === | ||
Строка 108: | Строка 108: | ||
=== Двунаправленные рекуррентные сети === | === Двунаправленные рекуррентные сети === | ||
− | [[File:biRNN.png|450px|thumb|Рисунок 7. Двунаправленная рекуррентная сеть]] | + | [[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. | Двунаправленная рекуррентная сеть (англ. Bidirectional Recurrent Neural Network, biRNN) представляет собой две однонаправленные рекуррентные сети, одна из которых обрабатывает входную последовательность в прямом порядке, а другая {{---}} в обратном (рис. 7). Таким образом, для каждого элемента входной последовательности считается два вектора скрытых состояний, на основе которых вычисляется выход сети. Благодаря данной архитектуре сети доступна информация о контексте как из прошлого, так и из будущего, что решает проблему однонаправленных рекуррентных сетей. Для обучения biRNN используются те же алгоритмы, что и для RNN. | ||
Строка 117: | Строка 117: | ||
<math>O_t = W^q H_t + b^q</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>H_t^f</math> и <math>H_t^b</math> {{---}} выходы однонаправленных рекуррентных сетей, <math>H_t</math> {{---}} их конкатенированный вектор, а <math>O_t</math> {{---}} выход сети на шаге <math>t</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 сети === | === Seq-2-seq сети === | ||
− | [[File:Seq2seq.png|450px|thumb|Рисунок 8. 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). Она состоит из двух рекуррентных сетей: кодировщика и декодировщика. Кодировщик вычисляет вектор, кодирующий входную последовательность. Далее данный вектор передается декодировщику, который в свою очередь по полученному скрытому представлению восстанавливает целевую последовательность. При этом каждый посчитанный выход используется для обновления скрытого представления. | Seq-2-seq (Sequence to sequence, Seq2seq) сеть является базовой архитектурой many-to-many RNN и используется для трансляции одной последовательности в другую (рис. 8). Она состоит из двух рекуррентных сетей: кодировщика и декодировщика. Кодировщик вычисляет вектор, кодирующий входную последовательность. Далее данный вектор передается декодировщику, который в свою очередь по полученному скрытому представлению восстанавливает целевую последовательность. При этом каждый посчитанный выход используется для обновления скрытого представления. | ||
<br clear="both" /> | <br clear="both" /> | ||
Строка 182: | Строка 182: | ||
*[[:Сверточные_нейронные_сети|Сверточные нейронные сети]] | *[[:Сверточные_нейронные_сети|Сверточные нейронные сети]] | ||
*[[:Нейронные_сети,_перцептрон|Нейронные сети, перцептрон]] | *[[:Нейронные_сети,_перцептрон|Нейронные сети, перцептрон]] | ||
− | *[[:Рекурсивные нейронные сети|Рекурсивные нейронные сети]] | + | *[[:Рекурсивные нейронные сети|Рекурсивные нейронные сети]] |
==Примечания== | ==Примечания== |
Текущая версия на 19:13, 4 сентября 2022
Рекуррентная нейронная сеть (англ. recurrent neural network, RNN) — вид нейронных сетей, где связи между элементами образуют направленную последовательность.
Описание
![](/wiki/images/thumb/0/05/RNN.png/450px-RNN.png)
![](/wiki/images/thumb/d/dc/RNN_layer.png/450px-RNN_layer.png)
Рекуррентные нейронные сети — сети с циклами, которые хорошо подходят для обработки последовательностей (рис. 1).
Обучение RNN аналогично обучению обычной нейронной сети. Мы также используем алгоритм обратного распространения ошибки (англ. Backpropagation), но с небольшим изменением. Поскольку одни и те же параметры используются на всех временных этапах в сети, градиент на каждом выходе зависит не только от расчетов текущего шага, но и от предыдущих временных шагов (рис. 4). Например, чтобы вычислить градиент для четвертого элемента последовательности, нам нужно было бы «распространить ошибку» на 3 шага и суммировать градиенты. Этот алгоритм называется «алгоритмом обратного распространения ошибки сквозь время» (англ. Backpropagation Through Time, BPTT).[3][4]
Алгоритм обратного распространения ошибки сквозь время:
Области и примеры применения
Используются, когда важно соблюдать последовательность, когда важен порядок поступающих объектов.
- Обработка текста на естественном языке:
- Анализ текста;
- Автоматический перевод;
- Обработка аудио:
- Автоматическое распознавание речи;
- Обработка видео:
- Прогнозирование следующего кадра на основе предыдущих;
- Распознавание эмоций;
- Обработка изображений:
- Прогнозирование следующего пикселя на основе окружения;
- Генерация описания изображений.
Виды RNN
Один к одному
Архитектура по сути является обычной нейронной сетью. |
Один ко многим
Один вход ко многим выходам может применяться, например, для генерации аудиозаписи. На вход подаем жанр музыки, который хотим получить, на выходе получаем последовательность аудиозаписи. |
Многие к одному
Много входов и один выход может применяться, если мы хотим оценить тональность рецензии. На вход подаем слова рецензии, на выходе получаем оценку ее тональности: позитивная рецензия или негативная. |
Многие ко многим
Данную архитектуру можно использовать для перевода текста с одного языка на другой. | |
Такой вариант подойдет для определения для классификации каждого слова в предложении в зависимости от контекста. |
Архитектуры
Полностью рекуррентная сеть
Это базовая архитектура, разработанная в 1980-х. Сеть строится из узлов, каждый из которых соединён со всеми другими узлами. У каждого нейрона порог активации меняется со временем и является вещественным числом. Каждое соединение имеет переменный вещественный вес. Узлы разделяются на входные, выходные и скрытые.
Рекурсивная сеть
Рекурсивные нейронные сети (англ. Recurrent neural networks) представляют собой более общий случай рекуррентных сетей, когда сигнал в сети проходит через структуру в виде дерева (обычно бинарные деревья). Те же самые матрицы весов используются рекурсивно по всему графу в соответствии с его топологией.
Нейронная сеть Хопфилда
Тип рекуррентной сети, когда все соединения симметричны. Изобретена Джоном Хопфилдом в 1982 году и гарантируется, что динамика такой сети сходится к одному из положений равновесия.
Двунаправленная ассоциативная память (BAM)
Вариацией сети Хопфилда является двунаправленная ассоциативная память (BAM). BAM имеет два слоя, каждый из которых может выступать в качестве входного, находить (вспоминать) ассоциацию и генерировать результат для другого слоя.
Сеть Элмана
Нейронная сеть Элмана состоит из трёх слоев:
, , . Дополнительно к сети добавлен набор «контекстных блоков»: (рис. 5). Средний (скрытый) слой соединён с контекстными блоками с фиксированным весом, равным единице. С каждым шагом времени на вход поступает информация, которая проходит прямой ход к выходному слою в соответствии с правилами обучения. Фиксированные обратные связи сохраняют предыдущие значения скрытого слоя в контекстных блоках (до того как скрытый слой поменяет значение в процессе обучения). Таким способом сеть сохраняет своё состояние, что может использоваться в предсказании последовательностей, выходя за пределы мощности многослойного перцептрона.,
,
Обозначения переменных и функций:
- : вектор входного слоя;
- : вектор скрытого слоя;
- : вектор выходного слоя;
- : матрица и вектор параметров;
- : функция активации.
Сеть Джордана
Нейронная сеть Джордана подобна сети Элмана, но контекстные блоки связаны не со скрытым слоем, а с выходным слоем. Контекстные блоки таким образом сохраняют своё состояние. Они обладают рекуррентной связью с собой.
,
,
Эхо-сети
Эхо-сеть (англ. Echo State Network, ESN) характеризуется одним скрытым слоем (который называется резервуаром) со случайными редкими связями между нейронами. При этом связи внутри резервуара фиксированы, но связи с выходным слоем подлежат обучению. Состояние резервуара (state) вычисляется через предыдущие состояния резервуара, а также предыдущие состояния входного и выходного сигналов. Так как эхо-сети обладают только одним скрытым слоем, они обладают достаточно низкой вычислительной сложностью.
Нейронный компрессор истории
Нейронный компрессор исторических данных — это блок, позволяющий в сжатом виде хранить существенные исторические особенности процесса, который является своего рода стеком рекуррентной нейронной сети, формируемым в процессе самообучения.
![](/wiki/images/thumb/9/98/LSTM.png/450px-LSTM.png)
Сети долго-краткосрочной памяти
Сеть долго-краткосрочной памяти (англ. Long short-term memory, LSTM) является самой популярной архитектурой рекуррентной нейронной сети на текущий момент, такая архитектура способна запоминать данные на долгое время (рис. 6).[6]
Управляемые рекуррентные блоки
Управляемые рекуррентные блоки (англ. Gated Recurrent Units, GRU) — обладает меньшим количеством параметров, чем у LSTM, и в ней отсутствует выходное управление. При этом производительность в моделях речевого сигнала или полифонической музыки оказалась сопоставимой с LSTM.
Двунаправленные рекуррентные сети
![](/wiki/images/thumb/d/dd/BiRNN.png/450px-BiRNN.png)
Двунаправленная рекуррентная сеть (англ. Bidirectional Recurrent Neural Network, biRNN) представляет собой две однонаправленные рекуррентные сети, одна из которых обрабатывает входную последовательность в прямом порядке, а другая — в обратном (рис. 7). Таким образом, для каждого элемента входной последовательности считается два вектора скрытых состояний, на основе которых вычисляется выход сети. Благодаря данной архитектуре сети доступна информация о контексте как из прошлого, так и из будущего, что решает проблему однонаправленных рекуррентных сетей. Для обучения biRNN используются те же алгоритмы, что и для RNN.
,
,
,
где
, , , , , — матрицы весов, , , , — байесы, , , — функции активаций, и — выходы однонаправленных рекуррентных сетей, — их конкатенированный вектор, а — выход сети на шаге .Seq-2-seq сети
![](/wiki/images/thumb/6/6c/Seq2seq.png/450px-Seq2seq.png)
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
.
См. также
Примечания
- ↑ Understanding LSTM Networks
- ↑ Understanding LSTM Networks
- ↑ Backpropagation Through Time
- ↑ Backpropagation Through Time
- ↑ Understanding LSTM Networks
- ↑ Sepp Hochreiter, Jurgen Schmidhuber. Long short-term memory (1997). Neural Computation.
- ↑ Understanding Bidirectional RNN in PyTorch
- ↑ Implementation of seq2seq model
- ↑ Keras RNN