Механизм внимания — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
м (rollbackEdits.php mass rollback)
 
(не показано 67 промежуточных версий 5 участников)
Строка 1: Строка 1:
'''Механизм внимания в рекуррентных нейронных сетях''' (англ. ''attention mechanism'', ''attention model'') {{---}} дополнительный слой используемый в [[:Рекуррентные_нейронные_сети|рекуррентных нейронных сетях (сокращенно ''RNN'')]] для "обращения внимания" последующих слоев сети на скрытое состояние нейронной сети <math>h_t</math> в момент времени <math>t</math>.
+
'''Механизм внимания''' (англ. ''attention mechanism'', ''attention model'') {{---}} техника используемая в [[:Рекуррентные_нейронные_сети|рекуррентных нейронных сетях]] (сокр. ''RNN'') и [[:Сверточные_нейронные_сети|сверточных нейронных сетях]] (сокр. ''CNN'') для поиска взаимосвязей между различными частями входных и выходных данных.
  
Изначально механизм внимания был представлен в [https://arxiv.org/abs/1409.0473| статье описывыющей данную технику] и ее [[:Механизм_внимания#Пример использования для архитектуры Seq2Seq|применение именно в ''Seq2Seq'' сетях]], и лишь позже был использован в [https://arxiv.org/abs/1502.03044| статье применительно к генерации описания изображений].
+
Изначально механизм внимания был представлен в контексте [[:Рекуррентные_нейронные_сети|рекуррентных]] ''Seq2seq''<ref>[https://en.wikipedia.org/wiki/Seq2seq Wiki -- Seq2seq]</ref> сетей <ref>https://arxiv.org/abs/1409.0473</ref> для "обращения внимания" блоков декодеров на скрытые состояния [[:Рекуррентные_нейронные_сети|RNN]] для любой итерации энкодера, а не только последней.
 +
 +
После успеха этой методики в машинном переводе последовали ее внедрения в других задачах [[:Обработка_естественного_языка|обработки естественного языка]] и применения к [[:Сверточные_нейронные_сети|CNN]] для генерации описания изображения<ref>https://arxiv.org/abs/1502.03044</ref> и [[:Generative_Adversarial_Nets_(GAN)|порождающих состязательных сетях]]<ref>https://arxiv.org/abs/1805.08318</ref> (сокр. ''GAN'').
  
== Обобщенное описание ==
+
==Обобщенный механизм внимания==
[[File:AttentionGeneral.png|350px|thumb|Обобщенное описание механизма внимания]]
+
'''Обобщенный механизм внимания''' (англ. general attention) {{---}} разновидность механизма внимания, задачей которой является выявление закономерности между входными и выходными данными. Изначально механизм внимания представленный в оригинальной статье<ref>https://arxiv.org/abs/1409.0473</ref> подразумевал именно этот тип внимания.  
[[:Рекуррентные_нейронные_сети|Рекуррентные нейронные сети]] используются при обработке данных, для которых важна их последовательность. В классическом случае применения [[:Рекуррентные_нейронные_сети|RNN]] результатом является только последнее скрытое состояние <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'' арихитектуру).  
+
===Пример использования обобщенного механизма внимания для задачи машинного перевода===
 +
Для лучшего понимания работы обобщенного механизма внимания будет рассмотрен пример его применения в задаче машинного перевода при помощи Seq2seq сетей для решения которой он изначально был представлен.
  
Выходом данного слоя будет являтся вектор <math>s</math> (англ. ''score'') {{---}} оценки на основании которых на скрытое состояние <math>h_i</math> будет "обращено внимание".
+
====Базовая архитектура ''Seq2seq''====
 +
[[File:Seq2SeqBasic.png|350px|thumb|Пример работы базовой ''Seq2seq'' сети]]
 +
Для понимания механизма внимания в ''Seq2seq'' сетях необходимо базовое понимание ''Seq2seq'' архитектуры до введения механизма внимания.
  
Далее для нормализации значений <math>s</math> используется <math>softmax</math><ref>[https://ru.wikipedia.org/wiki/Softmax Функция softmax]</ref>. Тогда <math>e = softmax(s)</math>
+
''Seq2seq'' состоит из двух [[:Рекуррентные_нейронные_сети|RNN]] {{---}} ''Энкодера'' и ''Декодера''.
  
<math>softmax</math> здесь используется благодоря своим свойствам:
+
''Энкодер'' {{---}} принимает предложение на языке ''A'' и сжимает его в вектор скрытого состояния.
 +
 
 +
''Декодер'' {{---}} выдает слово на языке ''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''====
 +
Несмотря на то, что нейронные сети рассматриваются как "черный ящик" и интерпретировать их внутренности в понятных человеку терминах часто невозможно, все же механизм внимания интуитивно понятный людям смог улучшить качество машинного перевода базового ''Seq2seq'' алгоритма.
  
*<math>\forall s:\  \sum_{i=1}^n softmax(s)_i = 1, </math>
+
Успех использования этого подхода в задаче машинного перевода обусловлен лучшим выводом закономерностей между словами находящимися на большом расстоянии друг от друга. Несмотря на то, что [[:Долгая_краткосрочная_память|LSTM и GRU]] блоки используются именно для улучшения передачи информации с предыдущих итераций [[:Рекуррентные_нейронные_сети|RNN]] их основная проблема заключается в том, что влияние предыдущих состояний на текущее уменьшается экспоненциально от расстояния между словами, в то же время механизм внимания улучшает этот показатель до линейного<ref>https://towardsdatascience.com/transformers-141e32e69591</ref>.
*<math>\forall s,\ i: \ softmax(s)_i >= 0 </math>
+
 +
[[:Рекуррентные_нейронные_сети|RNN]] используются при обработке данных, для которых важна их последовательность. В классическом случае применения [[:Рекуррентные_нейронные_сети|RNN]] результатом является только последнее скрытое состояние <math>h_m</math>, где <math>m</math> {{---}} длина последовательности входных данных. Использование механизма внимания позволяет использовать информацию полученную не только из последнего скрытого состояния, но и любого скрытого состояния <math>h_t</math> для любого <math>t</math>.
 +
=====Устройство слоя механизма внимания=====
 +
[[File:AttentionGeneral.png|350px|thumb|Обобщенный механизм внимания в [[:Рекуррентные_нейронные_сети|RNN]]]]
 +
Слой механизма внимания представляет собой обычную, чаще всего однослойную, нейронную сеть на вход которой подаются <math>h_t, t = 1 \  \ldots m</math>, а также вектор <math>d</math> в котором содержится некий контекст зависящий от конкретной задачи.
 +
 
 +
В случае ''Seq2seq'' сетей вектором <math>d</math> будет являться скрытое состояние <math>d_{i-1}</math> предыдущей итерации декодера.
 +
 
 +
Выходом данного слоя будет является вектор <math>s</math> (англ. ''score'') {{---}} оценки на основании которых на скрытое состояние <math>h_i</math> будет "обращено внимание".
 +
 
 +
Далее для нормализации значений <math>s</math> используется <math>softmax</math><ref>[https://ru.wikipedia.org/wiki/Softmax Wiki -- Функция softmax]</ref>. Тогда <math>e = softmax(s)</math>
 +
 
 +
<math>softmax</math> здесь используется благодаря своим свойствам:
 +
 
 +
*<math>\forall s\colon\  \sum_{i=1}^n softmax(s)_i = 1, </math>
 +
*<math>\forall s,\ i\colon \ softmax(s)_i >= 0 </math>
  
 
Далее считается <math>c</math> (англ. ''context vector'')  
 
Далее считается <math>c</math> (англ. ''context vector'')  
Строка 22: Строка 62:
 
<math>с = \sum_{i=1}^m e_i h_i</math>
 
<math>с = \sum_{i=1}^m e_i h_i</math>
  
Результатом работы слоя внимания является <math>c</math> который, содержит в себе информацию обо всех скрытых состоянях <math>h_i</math> пропорционально оценке <math>e_i</math>.
+
Результатом работы слоя внимания является <math>c</math> который, содержит в себе информацию обо всех скрытых состояниях <math>h_i</math> пропорционально оценке <math>e_i</math>.
  
== Пример использования для архитектуры ''Seq2Seq'' ==
+
=====Применение механизма внимания к базовой ''Seq2seq'' архитектуре=====
Пример добавления механизма внимания в ''Seq2Seq'' сеть поможет лучше понять его предназначение.
+
[[File:Seq2SeqAttention.png|350px|thumb|Пример работы ''Seq2seq'' сети с механизмом внимания]]
Изначально в оригинальной статье<ref>[https://arxiv.org/abs/1409.0473 Neural Machine Translation by Jointly Learning to Align and Translate]</ref> применяется механизм внимания в контексте именно Seq2Seq сети.
+
При добавлении механизма в данную архитектуру между [[:Рекуррентные_нейронные_сети|RNN]] ''Энкодером'' и ''Декодером'' слоя механизма внимания получится следующая схема:
  
Несмотря на то, что нейронные сети рассматриваются как "черный ящик" и интерпретировать их внутренности в понятных человеку терминах часто невозможно, все же механизм внимания интуитивно понятный людям смог улучшить результаты машинного перевода для алгоритма используемого в статье.
+
Здесь <math>x_i, h_i, d_i, y_i</math> имеют те же назначения, что и в варианте без механизма внимания.
  
=== Базовая архитектура ''Seq2Seq'' ===
+
''Агрегатор скрытых состояний энкодера (желтый)'' {{---}} агрегирует в себе все вектора <math>h_i</math> и возвращает всю последовательность векторов <math>h = [h_1, h_2, h_3, h_4]</math>.
[[File:Seq2SeqBasic.png|450px|thumb|Пример работы базовой ''Seq2Seq'' сети]]
 
Данный пример рассматривает применение механизма внимания в задаче машинного перевода в применении к архитектуре ''Seq2Seq''.
 
  
''Seq2Seq'' состоит из двух [[:Рекуррентные_нейронные_сети|RNN]] {{---}} ''Энкодера'' и ''Декодера''.
+
<math>c_i</math> {{---}} вектор контекста на итерации <math>i</math>.
  
''Энкодер'' {{---}} принимает предложение на языке ''A'' и сжимает его в вектор скрытого состояния.
+
''Блоки механизма внимания (красный)'' {{---}} принимает <math>h</math> и <math>d_{i - 1}</math>, возвращает <math>c_i</math>.
  
''Декодер'' {{---}} выдает слово на языке ''B'', принимает последнее скрытое состояние энкодера и предыдущее предыдущее предсказаное слово.
+
''Блоки декодера (фиолетовый)'' {{---}} по сравнению с обычной ''Seq2seq'' сетью меняются входные данные. Теперь на итерации <math>i</math> на вход подается не <math>y_{i-1}</math>, а конкатенация <math>y_{i-1}</math> и <math>c_i</math>.
  
 +
Таким образом при помощи механизма внимания достигается "фокусирование" декодера на определенных скрытых состояниях. В случаях машинного перевода эта возможность помогает декодеру предсказывать на какие скрытые состояния при исходных определенных словах на языке ''A'' необходимо обратить больше внимания при переводе данного слова на язык ''B''. То есть на какие слова из исходного текста обратить внимание при переводе конкретного слова на язык назначения.
  
Рассмотрим пример работы ''Seq2Seq'' сети:
 
  
<math>x_i</math> {{---}} слова в предложении на языке ''A''.
+
==Модули внимания==
 +
===Сверточный модуль внимания===
 +
[[Файл:ConvolutionalBlockAttentionModule.png|601px|thumb|right|Сверточный модуль внимания]]
 +
'''Сверточный модуль внимания''' (англ. ''сonvolutional block attention module'') {{---}} простой, но эффективный модуль внимания для [[:Сверточные_нейронные_сети|сверточных нейросетей]]. Применяется для задач детектирования обьектов на изображениях и классификации с входными данными больших размерностей. Данный модуль внимания состоит из двух последовательно применяемых подмодулей {{---}} канального (применяется ко всем каналам одного пикселя с изображения) и пространственного (применяется ко всему изображению с фиксированным каналом), оба эти подмодуля описаны в следующих разделах.
  
<math>h_i</math> {{---}} скрытое состояние энкодера.
+
Более формально говоря: на вход подается множество признаков <math>F \in \mathbb{R}^{C \times H \times W}</math>, где <math>C</math> {{---}} число каналов, <math>H</math> {{---}} высота, а <math>W</math> {{---}} длина изображения. Канальный подмодуль <math>A_1(F)</math> принадлежит множеству <math>\mathbb{R}^{C \times 1 \times 1}</math>, а пространственный <math>A_2(F)</math> принадлежит множеству <math>\mathbb{R}^{1 \times H \times W}</math>. Таким образом применение модуля можно описать так:
  
''Блоки энкодера (зеленый)'' {{---}} блоки энкодера получающие на вход <math>x_i</math> и передающие скрытое состояние <math>h_i</math> на следующую итерацию.
+
*<math>F_1 = A_1(F) \otimes F</math>
  
<math>d_i</math> {{---}} скрытое состояние декодера.
+
*<math>F_2 = A_2(F_1) \otimes F_1</math>
  
<math>y_i</math> {{---}} слова в предложении на языке ''B''.
+
Здесь за <math> \otimes </math> обозначено поэлементное произведение, а тензоры <math>A_1(F)</math> и <math>A_2(F_1)</math> копируются вдоль недостающих измерений. <math>F_1 \in \mathbb{R}^{C \times H \times W}</math> {{---}} тензор после применения канального модуля внимания, <math>F_2 \in \mathbb{R}^{C \times H \times W}</math> {{---}} выходное множество признаков.
  
''Блоки декодера (фиолетовый)'' {{---}} блоки декодера получающие на вход <math>y_{i-1}</math> или специальный токен '''start''' в случае первой итерации и возвращаюшие <math>y_i</math> {{---}} слова в предложении на языке ''B''.  
+
=== Канальный модуль внимания ===
Передают <math>d_i</math> {{---}} скрытое состояние декодера на следующую итерацию.
+
[[Файл:ChannelAttentionModule.png|600px|thumb|right|Канальный модуль внимания]]
Перевод считается завершенным при <math>y_i</math>, равном специальному токену '''end'''.
+
'''Канальный модуль внимания''' (англ. ''channel attention module'') реализуется за счет исследования внутриканальных взаимосвязей во входных данных, то есть пытается извлечь информацию из яркости каналов одного пикселя. Фокусируется на том, "какая" информация находится в данных. Для более эффективной реализации используется сжатие входных данных по измерениям <math>H</math> и <math>W</math> с помощью [[:Сверточные_нейронные_сети#Пулинговый слой|пулингов]] <math>MaxPool</math> и <math>AvgPool</math>, которые применяются независимо к входному тензору. В результате которого получаются два вектора <math>F^c_{max}</math> и <math>F^c_{avg}</math> из <math>\mathbb{R}^{C}</math>. После чего к этим двум векторам независимо применяется одна и та же [[:Нейронные_сети,_перцептрон#Многослойные нейронные сети|полносвязная нейронная сеть]] с одним скрытым слоем малой размерности (при этом ее входные и выходные вектора принадлежат <math>\mathbb{R}^{C}</math>). После этого полученные из нейросети вектора поэлементно складываются, к результату поэлементно применяется сигмоидная функция активации и добавляются недостающие единичные размерности. Полученный тензор из <math>\mathbb{R}^{C \times 1 \times 1}</math> как раз и является результатом применения <math>A_1(F)</math>, поэлементное произведение которого со входом <math>F</math> дает тензор <math>F_1</math>.
  
=== Применение механизма внимания для ''Seq2Seq'' ===
+
=== Пространственный модуль внимания ===
При добавлении механизма в данную архитектуру между [[:Рекуррентные_нейронные_сети|RNN]] ''Энкодер'' и ''Декодер'' слоя механизма внимания получится следуюшая схема:
+
[[Файл:Screenshot (203).png|600px|thumb|right|Пространственный модуль внимания]]
 +
'''Пространственный модуль внимания''' (англ. ''spatial attention module'') реализуется за счет исследования пространственных взаимосвязей, то есть пытается извлечь информацию из взаимного расположения пикселей. В отличие от канального фокусируется на том, "где" находится информация во входных данных. В данном случае для сжатия размерности используются те же [[:Сверточные_нейронные_сети#Пулинговый слой|пулинги]], но относительно измерения <math>C</math>. Таким образом на выходе мы получаем две матрицы <math>F^s_{max}</math> и <math>F^s_{avg}</math> из <math>\mathbb{R}^{H \times W}</math>. После чего они конкатенируются и к полученному тензору размерности <math>\mathbb{R}^{2 \times H \times W}</math> применяется [[:Сверточные_нейронные_сети#Свертка|свертка]], уменьшающая число каналов до одного и не меняющая остальные размерности, а к результату поэлементно применяется сигмоидная функция активации. Полученный тензор из <math>\mathbb{R}^{1 \times H \times W}</math> как раз является результатом применения <math>A_2(F_1)</math>, поэлементное произведение которого с <math>F_1</math> дает выходной тензор <math>F_2</math>, который называется выходным множеством признаков c размерностью <math>\mathbb{R}^{C \times H \times W}</math>.
  
[[File:Seq2SeqAttention.png|450px|thumb|Пример работы ''Seq2Seq'' сети с механизмом внимания]]
+
==Self-Attention==
 +
[[File:TransformerSelfAttentionVisualization.png|250px|thumb|Пример работы ''Self-Attention'']]
 +
'''Self-Attention''' {{---}} разновидность механизма внимания, задачей которой является выявление закономерности только между входными данными.
  
Здесь <math>x_i, h_i, d_i, y_i</math> имееют те же назначения, что и в варианте без механизма внимания.
+
Данная методика показала себя настолько эффективной в задаче машинного перевода, что позволила отказаться от использования [[:Рекуррентные_нейронные_сети|RNN]] и заменить их на обычные нейронные сети в комбинации с механизмом ''Self-attention'' в архитектуре трансформер<ref>https://papers.nips.cc/paper/7181-attention-is-all-you-need.pdf</ref>.  
  
''Аггрегатор скрытых состояний энкодера (желтый)'' {{---}} аггрегирует в себе все вектора <math>h_i</math> и возвращает всю последовательность векторов <math>h = [h_1, h_2, h_3, h_4]</math>.
+
Это позволило ускорить работу алгоритма, поскольку ранее предложение обрабатывалось последовательно при помощи [[:Рекуррентные_нейронные_сети|RNN]]. При использовании трансформера каждое слово в предложении может обрабатываться параллельно.
  
<math>c_i</math> {{---}} вектор контекста на итерации <math>i</math>.
+
Основным отличием ''Self-Attention'' от [[:Механизм_внимания#Обобщенный механизм внимания|обобщенного механизма внимания]] является, что он делает заключения о зависимостях исключительно между входными данными.
  
''Блоки механизма внимания (красный)'' {{---}} механизм внимания. Принимает <math>h</math> и <math>d_{i - 1}</math>, возвращает <math>c_i</math>.
+
Рассмотрим предложение '''The animal didn't cross the street because it was too tired''' и результат работы алгоритма ''Self-attention'' для слова '''it'''. Полученный вектор соответствует взаимосвязи слова '''it''' со всеми остальными словам в предложении.  
  
''Блоки декодера (фиолетовый)'' {{---}} по сравнению с обычной ''Seq2Seq'' сетью меняются входные данные. Теперь на итерации <math>i</math> на вход подается не <math>y_{i-1}</math>, а конкатенация <math>y_{i-1}</math> и <math>c_i</math>.
+
Из визуализации вектора можно заметить, что механизм ''Self-attention'' обнаружил взаимосвязь между словами '''it''' и '''animal'''. Этот результат можно интуитивно объяснить с человеческой точки зрения, что позволяет алгоритмам машинного обучения, использующим данный подход, лучше решать задачу принимая во внимание контекстные взаимосвязи.
  
Таким образом при помощи механизма внимания достигается "фокусирование" декодера на определенных скрытых состояниях. В случаях машинного перевода эта возможность помогает декодеру предсказывать на какие скрытые сосояния при исходных определенных словах на языке ''A'' необходимо обратить больше внимания при переводе данного слова на язык ''B''.
+
Также ''Self-Attention'' успешно применяется применяется в [[:Generative_Adversarial_Nets_(GAN)|GAN]] сетях, в частности в алгоритме SAGAN<ref>https://arxiv.org/abs/1805.08318</ref>.
  
 
==См. также==
 
==См. также==
Строка 80: Строка 124:
  
 
==Источники информации==
 
==Источники информации==
 +
*[https://blog.floydhub.com/attention-mechanism/amp/ Статья о механизме внимания, его типах и разновидностях]
 
*[https://www.coursera.org/lecture/nlp-sequence-models/attention-model-lSwVa Лекция Andrew Ng о механизме внимания в NLP]
 
*[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'']
 
*[https://towardsdatascience.com/intuitive-understanding-of-attention-mechanism-in-deep-learning-6c9482aecf4f Статья с подробно разборанными примерами и кодом на ''Python'' и ''TensorFlow'']
 +
*[http://jalammar.github.io/illustrated-transformer/ Статья c примерами работы Self-attention]
 +
*[https://arxiv.org/pdf/1807.06521.pdf Статья о сверточном модуле внимания (CBAM)]
  
 
==Примечания==
 
==Примечания==

Текущая версия на 19:16, 4 сентября 2022

Механизм внимания (англ. attention mechanism, attention model) — техника используемая в рекуррентных нейронных сетях (сокр. RNN) и сверточных нейронных сетях (сокр. CNN) для поиска взаимосвязей между различными частями входных и выходных данных.

Изначально механизм внимания был представлен в контексте рекуррентных Seq2seq[1] сетей [2] для "обращения внимания" блоков декодеров на скрытые состояния RNN для любой итерации энкодера, а не только последней.

После успеха этой методики в машинном переводе последовали ее внедрения в других задачах обработки естественного языка и применения к CNN для генерации описания изображения[3] и порождающих состязательных сетях[4] (сокр. GAN).

Обобщенный механизм внимания

Обобщенный механизм внимания (англ. general attention) — разновидность механизма внимания, задачей которой является выявление закономерности между входными и выходными данными. Изначально механизм внимания представленный в оригинальной статье[5] подразумевал именно этот тип внимания.

Пример использования обобщенного механизма внимания для задачи машинного перевода

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

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

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

Для понимания механизма внимания в Seq2seq сетях необходимо базовое понимание Seq2seq архитектуры до введения механизма внимания.

Seq2seq состоит из двух RNNЭнкодера и Декодера.

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

Декодер — выдает слово на языке 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

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

Успех использования этого подхода в задаче машинного перевода обусловлен лучшим выводом закономерностей между словами находящимися на большом расстоянии друг от друга. Несмотря на то, что LSTM и GRU блоки используются именно для улучшения передачи информации с предыдущих итераций RNN их основная проблема заключается в том, что влияние предыдущих состояний на текущее уменьшается экспоненциально от расстояния между словами, в то же время механизм внимания улучшает этот показатель до линейного[6].

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

Устройство слоя механизма внимания
Обобщенный механизм внимания в RNN

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

В случае Seq2seq сетей вектором [math]d[/math] будет являться скрытое состояние [math]d_{i-1}[/math] предыдущей итерации декодера.

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

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

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

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

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

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

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

Применение механизма внимания к базовой Seq2seq архитектуре
Пример работы Seq2seq сети с механизмом внимания

При добавлении механизма в данную архитектуру между RNN Энкодером и Декодером слоя механизма внимания получится следующая схема:

Здесь [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]c_i[/math] — вектор контекста на итерации [math]i[/math].

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

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

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


Модули внимания

Сверточный модуль внимания

Сверточный модуль внимания

Сверточный модуль внимания (англ. сonvolutional block attention module) — простой, но эффективный модуль внимания для сверточных нейросетей. Применяется для задач детектирования обьектов на изображениях и классификации с входными данными больших размерностей. Данный модуль внимания состоит из двух последовательно применяемых подмодулей — канального (применяется ко всем каналам одного пикселя с изображения) и пространственного (применяется ко всему изображению с фиксированным каналом), оба эти подмодуля описаны в следующих разделах.

Более формально говоря: на вход подается множество признаков [math]F \in \mathbb{R}^{C \times H \times W}[/math], где [math]C[/math] — число каналов, [math]H[/math] — высота, а [math]W[/math] — длина изображения. Канальный подмодуль [math]A_1(F)[/math] принадлежит множеству [math]\mathbb{R}^{C \times 1 \times 1}[/math], а пространственный [math]A_2(F)[/math] принадлежит множеству [math]\mathbb{R}^{1 \times H \times W}[/math]. Таким образом применение модуля можно описать так:

  • [math]F_1 = A_1(F) \otimes F[/math]
  • [math]F_2 = A_2(F_1) \otimes F_1[/math]

Здесь за [math] \otimes [/math] обозначено поэлементное произведение, а тензоры [math]A_1(F)[/math] и [math]A_2(F_1)[/math] копируются вдоль недостающих измерений. [math]F_1 \in \mathbb{R}^{C \times H \times W}[/math] — тензор после применения канального модуля внимания, [math]F_2 \in \mathbb{R}^{C \times H \times W}[/math] — выходное множество признаков.

Канальный модуль внимания

Канальный модуль внимания

Канальный модуль внимания (англ. channel attention module) реализуется за счет исследования внутриканальных взаимосвязей во входных данных, то есть пытается извлечь информацию из яркости каналов одного пикселя. Фокусируется на том, "какая" информация находится в данных. Для более эффективной реализации используется сжатие входных данных по измерениям [math]H[/math] и [math]W[/math] с помощью пулингов [math]MaxPool[/math] и [math]AvgPool[/math], которые применяются независимо к входному тензору. В результате которого получаются два вектора [math]F^c_{max}[/math] и [math]F^c_{avg}[/math] из [math]\mathbb{R}^{C}[/math]. После чего к этим двум векторам независимо применяется одна и та же полносвязная нейронная сеть с одним скрытым слоем малой размерности (при этом ее входные и выходные вектора принадлежат [math]\mathbb{R}^{C}[/math]). После этого полученные из нейросети вектора поэлементно складываются, к результату поэлементно применяется сигмоидная функция активации и добавляются недостающие единичные размерности. Полученный тензор из [math]\mathbb{R}^{C \times 1 \times 1}[/math] как раз и является результатом применения [math]A_1(F)[/math], поэлементное произведение которого со входом [math]F[/math] дает тензор [math]F_1[/math].

Пространственный модуль внимания

Пространственный модуль внимания

Пространственный модуль внимания (англ. spatial attention module) реализуется за счет исследования пространственных взаимосвязей, то есть пытается извлечь информацию из взаимного расположения пикселей. В отличие от канального фокусируется на том, "где" находится информация во входных данных. В данном случае для сжатия размерности используются те же пулинги, но относительно измерения [math]C[/math]. Таким образом на выходе мы получаем две матрицы [math]F^s_{max}[/math] и [math]F^s_{avg}[/math] из [math]\mathbb{R}^{H \times W}[/math]. После чего они конкатенируются и к полученному тензору размерности [math]\mathbb{R}^{2 \times H \times W}[/math] применяется свертка, уменьшающая число каналов до одного и не меняющая остальные размерности, а к результату поэлементно применяется сигмоидная функция активации. Полученный тензор из [math]\mathbb{R}^{1 \times H \times W}[/math] как раз является результатом применения [math]A_2(F_1)[/math], поэлементное произведение которого с [math]F_1[/math] дает выходной тензор [math]F_2[/math], который называется выходным множеством признаков c размерностью [math]\mathbb{R}^{C \times H \times W}[/math].

Self-Attention

Пример работы Self-Attention

Self-Attention — разновидность механизма внимания, задачей которой является выявление закономерности только между входными данными.

Данная методика показала себя настолько эффективной в задаче машинного перевода, что позволила отказаться от использования RNN и заменить их на обычные нейронные сети в комбинации с механизмом Self-attention в архитектуре трансформер[8].

Это позволило ускорить работу алгоритма, поскольку ранее предложение обрабатывалось последовательно при помощи RNN. При использовании трансформера каждое слово в предложении может обрабатываться параллельно.

Основным отличием Self-Attention от обобщенного механизма внимания является, что он делает заключения о зависимостях исключительно между входными данными.

Рассмотрим предложение The animal didn't cross the street because it was too tired и результат работы алгоритма Self-attention для слова it. Полученный вектор соответствует взаимосвязи слова it со всеми остальными словам в предложении.

Из визуализации вектора можно заметить, что механизм Self-attention обнаружил взаимосвязь между словами it и animal. Этот результат можно интуитивно объяснить с человеческой точки зрения, что позволяет алгоритмам машинного обучения, использующим данный подход, лучше решать задачу принимая во внимание контекстные взаимосвязи.

Также Self-Attention успешно применяется применяется в GAN сетях, в частности в алгоритме SAGAN[9].

См. также

Источники информации

Примечания