Участник:Gpevnev — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
 
(не показано 6 промежуточных версий этого же участника)
Строка 1: Строка 1:
 
'''Механизм внимания в рекуррентных нейронных сетях''' (англ. ''attention mechanism'', ''attention model'') {{---}} дополнительный слой используемый в [[:Рекуррентные_нейронные_сети|рекуррентных нейронных сетях]] для "обращения внимания" последующих слоев сети на скрытое состояние нейронной сети <math>h_t</math> в момент времени <math>t</math>.
 
'''Механизм внимания в рекуррентных нейронных сетях''' (англ. ''attention mechanism'', ''attention model'') {{---}} дополнительный слой используемый в [[:Рекуррентные_нейронные_сети|рекуррентных нейронных сетях]] для "обращения внимания" последующих слоев сети на скрытое состояние нейронной сети <math>h_t</math> в момент времени <math>t</math>.
  
Изначально механизм внимания был представлен в статье [https://arxiv.org/abs/1409.0473|Neural Machine Translation by Jointly Learning to Align and Translate] и предполагал применение именно в Seq2Seq сетях, и лишь позже был использован применительно к изображениям [https://arxiv.org/abs/1502.03044|Show, Attend and Tell: Neural Image Caption Generation with Visual Attention].
+
Изначально механизм внимания был представлен в статье [https://arxiv.org/abs/1409.0473|Neural Machine Translation by Jointly Learning to Align and Translate] и предполагал применение именно в ''Seq2Seq'' сетях, и лишь позже был использован применительно к изображениям [https://arxiv.org/abs/1502.03044|Show, Attend and Tell: Neural Image Caption Generation with Visual Attention].
  
 
== Обобщенное описание ==
 
== Обобщенное описание ==
 
[[File:AttentionGeneral.png|350px|thumb|Обобщенное описание механизма внимания]]
 
[[File:AttentionGeneral.png|350px|thumb|Обобщенное описание механизма внимания]]
[[:Рекуррентные_нейронные_сети|Рекуррентные нейронные сети]] используются при обработке данных, для которых важна их последовательность. В классическом случае применения [[:Рекуррентные_нейронные_сети|РНН]] как результат используется только последнее скрытое состояние <math>h_m</math>, где <math>m</math> - длинна последовательности входных данных. Использование механизма внимания позволяет использовать информацию полученную не только из последнего скрытого состояниния, но и из скрытого расстояния <math>h_t</math> для любого <math>t</math>.
+
[[:Рекуррентные_нейронные_сети|Рекуррентные нейронные сети]] используются при обработке данных, для которых важна их последовательность. В классическом случае применения [[:Рекуррентные_нейронные_сети|РНН]] результатом является только последнее скрытое состояние <math>h_m</math>, где <math>m</math> - длина последовательности входных данных. Использование механизма внимания позволяет использовать информацию полученную не только из последнего скрытого состояниния, но и любого скрытого состояния <math>h_t</math> для любого <math>t</math>.
  
Обычно слой использующийся для механизма внимания представляет собой обычную, чаще всего однослойную нейронную сеть на вход которой подаются <math>h_t, t = 1 \ldots m</math>, а также вектор <math>d</math> в котором содержится некий контекст зависящий от конкретно задачи (пример <math>d</math> для задачи машинного перевода использующего ''Seq2Seq'' арихитектуру есть ниже).  
+
Обычно слой использующийся для механизма внимания представляет собой обычную, чаще всего однослойную, нейронную сеть на вход которой подаются <math>h_t, t = 1 \ldots m</math>, а также вектор <math>d</math> в котором содержится некий контекст зависящий от конкретно задачи (пример <math>d</math> для задачи машинного перевода использующего ''Seq2Seq'' арихитектуру).  
  
Выходом данного слоя будет являтся вектор <math>s</math> - оценки на основании которых на скрытое состояние <math>h_i</math> будет "обращено внимание".
+
Выходом данного слоя будет являтся вектор <math>s</math> (англ. ''score'') - оценки на основании которых на скрытое состояние <math>h_i</math> будет "обращено внимание".
  
 
Далее для нормализации значений <math>s</math> используется <math>softmax</math>. Тогда <math>e = softmax(s)</math>
 
Далее для нормализации значений <math>s</math> используется <math>softmax</math>. Тогда <math>e = softmax(s)</math>
  
Далее считается <math>СV</math> (англ. ''context vector'') <math>СV = \sum_1^m e_i h_i</math>
+
<math>softmax</math> здесь используется благодоря своим свойствам:
  
Резултатом работы слоя внимания является <math>CV</math> который содержит в себе информацию обо всех скрытых состоянях <math>h_i</math> пропорционально оценке <math>e_i</math>.
+
*<math>\forall s:\  \sum_{i=1}^n softmax(s)_i = 1, </math>
 +
*<math>\forall s,\ i: \ softmax(s)_i >= 0 </math>
  
== Пример использования для архитектуры Seq2Seq ==
+
Далее считается <math>СV</math> (англ. ''context vector'')
Из-за интуитивной понятности механизма внимания для проблемы машинного перевода, а также поскольку в оригинальной статье рассматривается механизм внимания применительно именно к Seq2Seq сетям. Пример добавления механизма внимания в Seq2Seq сеть поможет лучше понять его предназначение.
 
  
=== Базовая архитектура Seq2Seq ===
+
<math>СV = \sum_{i=1}^m e_i h_i</math>
[[File:Seq2SeqBasic.png|350px|thumb|Пример работы базовой Seq2Seq сети]]
+
 
 +
Результатом работы слоя внимания является <math>CV</math> который, содержит в себе информацию обо всех скрытых состоянях <math>h_i</math> пропорционально оценке <math>e_i</math>.
 +
 
 +
== Пример использования для архитектуры ''Seq2Seq'' ==
 +
Из-за интуитивной понятности механизма внимания для проблемы машинного перевода, а также поскольку в оригинальной статье рассматривается механизм внимания применительно именно к ''Seq2Seq'' сетям. Пример добавления механизма внимания в ''Seq2Seq'' сеть поможет лучше понять его предназначение.
 +
 
 +
Несмотря на то, что нейронные сети рассматриваются как "черный ящик" и интерпретировать их внутренности в понятных человеку терминах часто невозможно, все же механизм внимания интуитивно понятный людям смог улучшить результаты машинного перевода для алгоритма используемого в статье.
 +
 
 +
=== Базовая архитектура ''Seq2Seq'' ===
 +
[[File:Seq2SeqBasic.png|450px|thumb|Пример работы базовой ''Seq2Seq'' сети]]
 
Данный пример рассматривает применение механизма внимания в задаче машинного перевода в применении к архитектуре ''Seq2Seq''.
 
Данный пример рассматривает применение механизма внимания в задаче машинного перевода в применении к архитектуре ''Seq2Seq''.
  
Строка 28: Строка 37:
 
''Encoder'' {{---}} принимает предложение на языке ''A'' и сжимает его в вектор скрытого состояния.
 
''Encoder'' {{---}} принимает предложение на языке ''A'' и сжимает его в вектор скрытого состояния.
  
''Decoder'' {{---}} выдает слово на языке ''B'', принимает последнее скрытое состояние из энкодера и предыдущее предыдущее предсказаное слово.
+
''Decoder'' {{---}} выдает слово на языке ''B'', принимает последнее скрытое состояние энкодера и предыдущее предыдущее предсказаное слово.
  
  
Рассмотрим пример работы Seq2Seq сети:
+
Рассмотрим пример работы ''Seq2Seq'' сети:
  
 +
<math>x_i</math> {{---}} слова в предложении на языке ''A''.
  
<math>x_i</math> {{---}} слова в предложении на языке ''A''
+
<math>h_i</math> {{---}} скрытое состояние энкодера.
  
<math>h_i</math> {{---}} скрытое состояние энкодера
+
''Блоки энкодера (зеленый)'' {{---}} блоки энкодера получающие на вход <math>x_i</math> и передающие скрытое состояние <math>h_i</math> на следующую итерацию.
  
<math>d_i</math> {{---}} скрытое состояние декодера
+
<math>d_i</math> {{---}} скрытое состояние декодера.
  
<math>y_i</math> {{---}} слова в предложении на языке ''B''
+
<math>y_i</math> {{---}} слова в предложении на языке ''B''.
  
 +
''Блоки декодера (фиолетовый)'' {{---}} блоки декодера получающие на вход <math>y_{i-1}</math> или специальный токен '''start''' в случае первой итерации и возвращаюшие <math>y_i</math> {{---}} слова в предложении на языке ''B''.
 +
Передают <math>d_i</math> {{---}} скрытое состояние декодера на следующую итерацию.
 +
Перевод считается завершенным при <math>y_i</math>, равном специальному токену '''end'''.
  
 +
=== Применение механизма внимания для ''Seq2Seq'' ===
 +
При добавлении механизма в данную архитектуру между [[:Рекуррентные_нейронные_сети|РНН]] ''Encoder'' и ''Decoder'' слоя механизма внимания получится следуюшая схема:
  
=== Применение механизма внимания для Seq2Seq ===
+
[[File:Seq2SeqAttention.png|450px|thumb|Пример работы ''Seq2Seq'' сети с механизмом внимания]]
При добавлении механизма в данную архитектуру между [[:Рекуррентные_нейронные_сети|РНН]] ''Encoder'' и ''Decoder'' слоя механизма внимания получтится следуюшая схема:
+
 
 +
Здесь <math>x_i, h_i, d_i, y_i</math> имееют те же назначения, что и в варианте без механизма внимания.
 +
 
 +
''Аггрегатор скрытых состояний энкодера (желтый)'' {{---}} аггрегирует в себе все вектора <math>h_i</math> и возвращает всю последовательность векторов <math>h = [h_1, h_2, h_3, h_4]</math>.
 +
 
 +
<math>СV_i</math> {{---}} вектор контекста на итерации <math>i</math>.
 +
 
 +
''Блоки механизма внимания (красный)'' {{---}} механизм внимания. Принимает <math>h</math> и <math>d_{i - 1}</math>, возвращает <math>СV_i</math>.
 +
 
 +
''Блоки декодера (фиолетовый)'' {{---}} по сравнению с обычной ''Seq2Seq'' сетью меняются входные данные. Теперь на итерации <math>i</math> на вход подается не <math>y_{i-1}</math>, а конкатенация <math>y_{i-1}</math> и <math>CV_i</math>.
 +
 
 +
Таким образом при помощи механизма внимания достигается "фокусирование" декодера на определенных скрытых состояниях. В случаях машинного перевода эта возможность помогает декодеру предсказывать на какие скрытые сосояния при исходных определенных словах на языке ''A'' необходимо обратить больше внимания при переводе данного слова на язык ''B''.
  
 
==См. также==
 
==См. также==
Строка 51: Строка 77:
 
*[[:Нейронные_сети,_перцептрон|Нейронные сети, перцептрон]]
 
*[[:Нейронные_сети,_перцептрон|Нейронные сети, перцептрон]]
 
*[[:Рекуррентные_нейронные_сети|Рекуррентные нейронные сети]]
 
*[[:Рекуррентные_нейронные_сети|Рекуррентные нейронные сети]]
 +
 +
==Источники==
 +
*[https://arxiv.org/abs/1409.0473 Neural Machine Translation by Jointly Learning to Align and Translate. Dzmitry Bahdanau, Kyunghyun Cho, Yoshua Bengio]
 +
*[https://arxiv.org/abs/1502.03044 Show, Attend and Tell: Neural Image Caption Generation with Visual Attention. Kelvin Xu, Jimmy Ba, Ryan Kiros, Kyunghyun Cho, Aaron Courville, Ruslan Salakhutdinov, Richard Zemel, Yoshua Bengio]
 +
*[https://www.coursera.org/lecture/nlp-sequence-models/attention-model-lSwVa Лекция Andrew Ng о механизме внимания в NLP]
 +
*[https://towardsdatascience.com/intuitive-understanding-of-attention-mechanism-in-deep-learning-6c9482aecf4f Статья с подробно разборанными примерами и кодом на ''Python'' и ''TensorFlow'']
  
 
==Примечания==
 
==Примечания==

Текущая версия на 18:21, 21 марта 2020

Механизм внимания в рекуррентных нейронных сетях (англ. attention mechanism, attention model) — дополнительный слой используемый в рекуррентных нейронных сетях для "обращения внимания" последующих слоев сети на скрытое состояние нейронной сети [math]h_t[/math] в момент времени [math]t[/math].

Изначально механизм внимания был представлен в статье Machine Translation by Jointly Learning to Align and Translate и предполагал применение именно в Seq2Seq сетях, и лишь позже был использован применительно к изображениям Attend and Tell: Neural Image Caption Generation with Visual Attention.

Обобщенное описание

Обобщенное описание механизма внимания

Рекуррентные нейронные сети используются при обработке данных, для которых важна их последовательность. В классическом случае применения РНН результатом является только последнее скрытое состояние [math]h_m[/math], где [math]m[/math] - длина последовательности входных данных. Использование механизма внимания позволяет использовать информацию полученную не только из последнего скрытого состояниния, но и любого скрытого состояния [math]h_t[/math] для любого [math]t[/math].

Обычно слой использующийся для механизма внимания представляет собой обычную, чаще всего однослойную, нейронную сеть на вход которой подаются [math]h_t, t = 1 \ \ldots m[/math], а также вектор [math]d[/math] в котором содержится некий контекст зависящий от конкретно задачи (пример [math]d[/math] для задачи машинного перевода использующего Seq2Seq арихитектуру).

Выходом данного слоя будет являтся вектор [math]s[/math] (англ. score) - оценки на основании которых на скрытое состояние [math]h_i[/math] будет "обращено внимание".

Далее для нормализации значений [math]s[/math] используется [math]softmax[/math]. Тогда [math]e = softmax(s)[/math]

[math]softmax[/math] здесь используется благодоря своим свойствам:

  • [math]\forall s:\ \sum_{i=1}^n softmax(s)_i = 1, [/math]
  • [math]\forall s,\ i: \ softmax(s)_i \gt = 0 [/math]

Далее считается [math]СV[/math] (англ. context vector)

[math]СV = \sum_{i=1}^m e_i h_i[/math]

Результатом работы слоя внимания является [math]CV[/math] который, содержит в себе информацию обо всех скрытых состоянях [math]h_i[/math] пропорционально оценке [math]e_i[/math].

Пример использования для архитектуры Seq2Seq

Из-за интуитивной понятности механизма внимания для проблемы машинного перевода, а также поскольку в оригинальной статье рассматривается механизм внимания применительно именно к Seq2Seq сетям. Пример добавления механизма внимания в Seq2Seq сеть поможет лучше понять его предназначение.

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

Базовая архитектура Seq2Seq

Пример работы базовой Seq2Seq сети

Данный пример рассматривает применение механизма внимания в задаче машинного перевода в применении к архитектуре Seq2Seq.

Seq2Seq состоит из двух РНН - Encoder и Decoder.

Encoder — принимает предложение на языке A и сжимает его в вектор скрытого состояния.

Decoder — выдает слово на языке B, принимает последнее скрытое состояние энкодера и предыдущее предыдущее предсказаное слово.


Рассмотрим пример работы Seq2Seq сети:

[math]x_i[/math] — слова в предложении на языке A.

[math]h_i[/math] — скрытое состояние энкодера.

Блоки энкодера (зеленый) — блоки энкодера получающие на вход [math]x_i[/math] и передающие скрытое состояние [math]h_i[/math] на следующую итерацию.

[math]d_i[/math] — скрытое состояние декодера.

[math]y_i[/math] — слова в предложении на языке B.

Блоки декодера (фиолетовый) — блоки декодера получающие на вход [math]y_{i-1}[/math] или специальный токен start в случае первой итерации и возвращаюшие [math]y_i[/math] — слова в предложении на языке B. Передают [math]d_i[/math] — скрытое состояние декодера на следующую итерацию. Перевод считается завершенным при [math]y_i[/math], равном специальному токену end.

Применение механизма внимания для Seq2Seq

При добавлении механизма в данную архитектуру между РНН Encoder и Decoder слоя механизма внимания получится следуюшая схема:

Пример работы Seq2Seq сети с механизмом внимания

Здесь [math]x_i, h_i, d_i, y_i[/math] имееют те же назначения, что и в варианте без механизма внимания.

Аггрегатор скрытых состояний энкодера (желтый) — аггрегирует в себе все вектора [math]h_i[/math] и возвращает всю последовательность векторов [math]h = [h_1, h_2, h_3, h_4][/math].

[math]СV_i[/math] — вектор контекста на итерации [math]i[/math].

Блоки механизма внимания (красный) — механизм внимания. Принимает [math]h[/math] и [math]d_{i - 1}[/math], возвращает [math]СV_i[/math].

Блоки декодера (фиолетовый) — по сравнению с обычной Seq2Seq сетью меняются входные данные. Теперь на итерации [math]i[/math] на вход подается не [math]y_{i-1}[/math], а конкатенация [math]y_{i-1}[/math] и [math]CV_i[/math].

Таким образом при помощи механизма внимания достигается "фокусирование" декодера на определенных скрытых состояниях. В случаях машинного перевода эта возможность помогает декодеру предсказывать на какие скрытые сосояния при исходных определенных словах на языке A необходимо обратить больше внимания при переводе данного слова на язык B.

См. также

Источники

Примечания