Вам, вероятно, следует заменить свои повторяющиеся сети свёртками и быть счастливым

Некоторые говорят, что перевод с одного языка на другой - это больше искусство, чем наука. Не так давно Дуглас Хофштадтер в статье, опубликованной в The Atlantic, указал на поверхностность машинных переводов. Несмотря на ограничения, трудно отрицать, что программное обеспечение автоматического перевода не только работает достаточно хорошо во многих случаях, но и что лежащая в его основе технология имеет широкое применение в любом контексте, когда информация перетекает из одной области в другую, например, преобразование РНК в белок. кодирование в геномике. До 2015 года в области преобразования (или трансляции) последовательности в последовательность доминировали рекуррентные нейронные сети, в частности, сети долгосрочной краткосрочной памяти (LSTM). Я рассмотрел основы этих архитектур в предыдущем посте, где LSTM применяются для кинематической реконструкции распада пар топ-кварков на LHC. Затем произошло нечто новое: были предложены архитектура ResNet и Механизм внимания, проложившие путь к более общей структуре для такого рода задач. В частности, эти новые архитектуры также решили еще одну проблему на этом пути: фактически, из-за внутренней последовательной природы RNN, такие сети трудно обучить в параллельной системе, такой как GPU. И здесь очень пригодятся сверточные нейронные сети.

Сверточные нейронные сети

В математике свертка - это операция, которая выражает формирование определенной функции f, когда она применяется к другой функции g:

Эту операцию не следует путать с модуляцией (например EM-сигнала в AM-передачах), которая представляет собой простое умножение двух функций. Для любознательных умов преобразование Фурье свертки в пространстве времени - это модуляция в пространстве частот, т.е.:

Таким образом, эти две операции тесно связаны, но их не следует путать друг с другом.

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

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

Одна приятная и важная особенность этой операции заключается в том, что после того, как «образ» загружен в память, различные ядра могут воздействовать на него, уменьшая количество операций ввода-вывода и, следовательно, лучше используя полосу пропускания. Обычно операция свертки осуществляется двумя способами:

  • Чтобы уменьшить размерность: это случай, представленный выше, где, например, изображение 4x4 уменьшается ядром 2x2 до изображения 3x3. Это называется допустимым заполнением.
  • Чтобы сохранить размерность постоянной: в этом случае исходное изображение «дополняется» нулями перед применением ядра. Например, изображение 4x4 дополняется до матрицы 5x5, а затем сокращается ядром 2x2 до изображения 4x4. Это называется одинаковым заполнением.

После свертки обычно выполняется операция объединения: в каждом блоке на следующий уровень распространяется только наибольшее значение. Эта операция используется для уменьшения размерности и фильтрации шума. Весь смысл уменьшения размерности состоит в том, чтобы найти высокоуровневые функции путем уплотнения информации.

Как правило, сверточная нейронная сеть строится путем объединения нескольких этих двухэтапных блоков вместе. Примеры успешных архитектур:

  • AlexNet (2012): содержит 8 слоев; первые 5 являются сверточными слоями, за некоторыми из них следуют слои максимального объединения, а последние 3 являются полностью связанными слоями. Он использует функции активации ReLU вместо tanh или sigmoid.
  • VGGNet (2014): как следует из названия, это очень глубокая сверточная сеть, состоящая из 16 уровней. Как и AlexNet, в нем всего 3x3 ядра, но много фильтров. В настоящее время это самый популярный способ извлечения функций из изображений.
  • GoogLeNet (2014): эта сеть вдохновлена ​​более старой LeNet, но использует начальный модуль. До своего появления CNN просто укладывали слои свертки все глубже и глубже. Чтобы учесть тот факт, что информация может распространяться в разных диапазонах в похожих изображениях, эта сеть применяет ядро ​​разного размера (например 1x1, 3x3, 5x5…) на одном уровне, а затем объединяет выходные данные . Сложены девять таких модулей. Поскольку глубокие сети страдают от проблемы исчезающего градиента, в более новых реализациях используется остаточная сетевая архитектура.
  • ResNet (2015): остаточная нейронная сеть заметно отличается пакетной нормализацией и пропуском соединений. Последние являются сокращениями, которые пропускают определенные слои. Уловка получается благодаря остаточному блоку. Подобный подход к ResNets известен как магистральные сети.

Механизм внимания

Теперь, когда мы знаем основы сверточных нейронных сетей, мы можем вернуться к исходной точке: как мы можем использовать такие сети для анализа последовательностей вместо рекуррентных сетей? Идея, стоящая за вниманием, заключается в том, что сеть должна выяснить, какие части (элементы) входной последовательности более релевантны для генерации данного элемента выходной последовательности. Это достигается путем создания вектора весов внимания (от 0 до 1, из softmax) для каждого входного элемента и использования их для модуляции потока информации. То, как это делается, будет легче понять, если мы сначала сосредоточимся на сетях, основанных на RNN. Для каждого элемента ввода (временной шаг) слой RNN сохраняет скрытое состояние. Таким образом, для N входов будет N скрытых состояний. На этом этапе мы можем сгенерировать вектор контекста, просто умножив поэлементно (произведение Адамара) веса внимания и скрытые состояния:

Например, при переводе предложения имя собственное будет одинаковым на обоих языках, следовательно, соответствующий вес будет очень высоким (например, 0,95). Вероятно, что соседние слова также будут иметь высокий вес (например 0,55), а слова, которые находятся дальше друг от друга, будут иметь меньший вес (например 0,05).

Наконец, информация конденсируется в вектор внимания, который передается на следующий уровень:

На этапе декодирования векторы контекста вычисляются для каждого выходного слова.

Трансформер

Теперь у нас есть практически все ингредиенты, чтобы понять, как избавиться от RNN для машинного перевода. Трансформаторная сеть требует внимания, но на этот раз использует сети с прямой связью. Прежде всего, входная последовательность встроена (т.е. закодирована в число в N -мерном пространстве) и дополнена вектором который отслеживает исходное положение каждого слова относительно друг друга. Теперь у нас есть векторное представление данного слова (запрос Q) и всех слов в последовательности (ключи K). Из этих ингредиентов мы можем рассчитать веса внимания, как мы делали раньше (d _ k представляет размерность и является коэффициентом нормализации):

Эти веса внимания определяют, насколько каждое из других слов должно способствовать переводу данного слова. Применение этих весов к заданной последовательности (значения V) , которая должна быть преобразована, называется Внимание к масштабируемому скалярному продукту. Многоголовое внимание - это объединение механизма внимания, применяемого к линейным проекциям Q, K и V. в пространства с разными размерами. Идея состоит в том, что разные прогнозы могут выделить разные аспекты того, как кодируется информация. Прогнозирование выполняется путем умножения Q, K и V на некоторые матрицы W, полученные во время обучения. Наконец, в статье Сверточные сети с расширенным расширением внимания авторы предложили CNN, оборудованную механизмом многоголового внимания а-ля трансформатор.

И поэтому нам больше не нужны повторяющиеся нейронные сети!