Краткий обзор перспективных разработок современной архитектуры НЛП

Сейчас 2017 год, и статья «Внимание - это все, что вам нужно» предлагает НЛП новую многообещающую архитектуру: Transformer. Четыре года спустя - вечность в области глубокого обучения - Transformer по-прежнему представляет собой ультрасовременную архитектуру и используется для различных задач НЛП. Но мир не стоял на месте - по крайней мере, не в этой области, и во многих других статьях был рассмотрен Transformer и предложены новые подходы для дальнейшего развития. Я хочу обсудить здесь несколько многообещающих.

Мы начнем с статьи, уже опубликованной в 2019 году: «Transformer XL: внимательные языковые модели вне контекста фиксированной длины». Следующая статья будет называться «Реформатор: эффективный преобразователь» перед последней статьей (июнь 2021 г.): «Упаковка: к двукратному ускорению NLP BERT».

Есть еще много многообещающих статей о Transformer, но мне пришлось сделать выбор, чтобы эта статья не выходила за рамки. Надеюсь, я не поступаю несправедливо по отношению к какому-либо автору статьи 🙃!

Transformer-XL: внимательные языковые модели за пределами контекста фиксированной длины

В этой статье рассматривается ограниченная способность Transformers обрабатывать тексты без фиксированной длины. Стандартный преобразователь использует максимальную длину, усечение и заполнение для обработки различной длины последовательности. В то же время эта фиксированная длина является препятствием для расширенного обучения зависимостей, при котором механизм внимания улавливает связи за пределами этого предела.

Хотя краткосрочная зависимость может не вызывать проблем для большинства случаев использования, ограничение фиксированной длины может снизить производительность из-за усечения и его свойства не соблюдать семантические границы. Авторы называют это фрагментацией контекста.

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

Изменения по сравнению с ванильным трансформатором можно найти в слое внимания. Ключ и значение будут расширены кешем из предыдущего сегмента. Я не буду вдаваться в подробности. Но я настоятельно рекомендую прочитать главу Повторение на уровне сегмента с повторным использованием состояния из статьи Transformer XL.

Использование кэша из предыдущих сегментов внутри слоя внимания требует некоторых дополнительных изменений. Авторы задают следующий вопрос: «[…] как мы можем сохранить последовательность позиционной информации при повторном использовании состояний?» (Дай и др., 2019). В преобразователях по умолчанию порядок следования обеспечивается позиционным кодированием. При использовании кеширования позиционное кодирование предыдущего состояния (о котором мы только что говорили) не учитывается. Это приводит к снижению производительности. Чтобы решить эту проблему, авторы предлагают только кодировать относительную позиционную информацию в скрытых состояниях и вводить ее в оценку внимания. С их точки зрения этот подход более интуитивен:

Например, когда вектор запроса qτ, i обслуживает ключевые векторы k τ, ≤i, ему не нужно знать абсолютное положение каждого ключевого вектора, чтобы определить временной порядок сегмента. (Дай и др., 2019 г.)

Относительного расстояния достаточно, чтобы вектор запроса мог различать элементы по разному расстоянию. Кроме того, абсолютное положение может быть получено по относительному расстоянию. Подробнее об этом читайте в оригинальной статье.

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

Реформатор: эффективный трансформатор

Трансформаторы - это огромные модели с множеством параметров. Реально обучить их с нуля могут только крупные игроки отрасли или равные ей. К счастью, мы можем использовать предварительно обученные модели, такие как BERT. Но даже 24-слойную версию BERT вряд ли можно обучить на одной системе GPU. Если мы не хотим, чтобы такие модели можно было обучать и запускать только при большом сотрудничестве, трансформеры должны стать более эффективными.

Китаев, Кайзер и Левшая, авторы статьи Reformer, вносят три изменения, которые должны решить указанную проблему:

  • Использование обратимых слоев для хранения только одной копии активаций для всей модели. Это уменьшит объем памяти, необходимый для хранения активаций, в N раз.
  • Разделение активаций внутри слоев с прямой связью и их обработка как фрагменты помогает уменьшить объем памяти, необходимый этим слоям. Слои прямой связи часто намного более обширны, чем, например, уровни внимания, и поэтому отвечают за высокий уровень использования памяти.
  • Использование хеширования внимания с учетом местоположения, изменение коэффициента внутри слоя внимания с O (L²) на O (L log L)

Авторы убеждены, что «[…] эти методики […] оказывают незначительное влияние на тренировочный процесс по сравнению со стандартным Transformer» (Китаев и др., 2020). Я расскажу о первой и последней идеях - на мой взгляд, они самые интересные. Чтобы не выйти из-под контроля, второй подход в дальнейшем обсуждаться не будет.

Реверсивный трансформатор

В своей статье: Обратимая остаточная сеть: обратное распространение без сохранения активаций Gomez et al. представляют обратимую остаточную сеть (RevNets). Идея состоит в том, что каждую активацию можно восстановить со следующего уровня, и ее не нужно сохранять во время обратного распространения ошибки - вы жертвуете вычислениями в обмен на больше памяти. Остаточный слой (также называемый пропущенным соединением) выполняет функцию, которая работает с одним входом и одним выходом:

Обратимый слой работает с двумя входами:

с этими уравнениями (и обратным путем подстановки):

В контексте Reversible Transformer это означает, что слой прямой связи (G) и слой внимания (F) объединены внутри реверсивного блока.

Y₁ = X₁ + Внимание (X₂) и Y₂ = X₂ + FeedForward (Y₁)

В этой реализации отпадает необходимость в хранении активаций; следовательно, память сохраняется. Даже если это означает, что потребуется немного больше вычислений.

Внимание к хешированию с учетом местоположения

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

В стандартном Transformer используется масштабируемое скалярное произведение внимания:

Входные данные содержат запросы и ключи, а также значения. Скалярное произведение всех запросов и ключей вычисляется перед масштабированием. После этого применяется функция softmax. И, наконец, матричное умножение промежуточной матрицы и матрицы ценностей дает оценку внимания.

Авторы искали более эффективный для памяти механизм внимания и пришли к идее локального хэширования внимания (LSH). Намерение состоит в том, чтобы снизить сложность с O (L²) до O (L log L). Грубо говоря, этот алгоритм предназначен для группировки точек данных в так называемые корзины, чтобы близкие друг к другу точки данных с большой вероятностью получали один и тот же хэш. По сравнению с другими методами хеширования, хеш-коллизии максимизированы, а не минимизированы. С помощью ближайших соседей мы можем сосредоточиться на ключах, близких к запросу.

Следом вы видите внимание LSH, сформулированное в статье:

‘P’ относится к набору, частью которого является ‘i’, а ‘z’ обозначает функцию разделения. Идея LSH заключается в том, что элементы set P ограничены для работы с элементами одного хеш-сегмента:

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

Упаковка: к двукратному ускорению NLP BERT

Как уже говорилось, предварительное обучение BERT связано с его существенной потребностью в вычислительной мощности, доступной только для крупной промышленности или исследовательских центров. Косек, Фу и Крелл - авторы этой статьи хотят уменьшить этот барьер, повысив эффективность за счет удаления отступов. Они представляют алгоритм для ускорения предварительного обучения в 2 раза с использованием набора данных Википедии.

Обработка маркеров заполнения может рассматриваться как трата вычислений. Чем шире распределение длины текста, тем больше вычислительных ресурсов теряется в этом процессе. Подход упаковки предполагает полное заполнение каждой длины последовательности, поэтому необходимость в заполнении отпадает. Эта идея основана на предположении, что последовательности взаимозаменяемы, поэтому порядок не имеет значения. Метод упаковки - это классическая задача программирования (bin-упаковка или задача раскроя). Поскольку проблема специфична для НЛП, предлагается два алгоритма:

  • Упаковка первой гистограммы наикратчайшей упаковки (SPFHP)
  • Упаковка гистограмм методом неотрицательных наименьших квадратов (NNLSHP)

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

Как следует из названия, BERT (двунаправленные представления кодировщика от трансформаторов) использует двунаправленное самовнимание. Однако упаковка - чтобы заполнить сегмент и не оставить места для заполнения - создает сегменты без соответствующих последовательностей. Языковые модели с поверхностным вниманием, такие как GPT3, не сталкиваются с этой проблемой, поскольку они обращаются только к предыдущим токенам. В документе вводится маска для слоя внимания, чтобы предотвратить совпадение между различными последовательностями. Давайте посмотрим на код из статьи:

mask = np.array([[1, 1, 1, 2, 2]]) # input
zero_one_mask = tf.equal(mask, mask.T) # 0, 1 mask 
#for use with softmax:
softmax_mask = tf.where(zero_one_mask , 0, -1000)

Эта реализация создала блочно-диагональную маску, которая уменьшает заполнение и может быть просто реализована с помощью таких платформ, как numpy.

Другая проблема, с которой сталкивается упаковка, касается расчета потерь и точности. В BERT потеря кросс-энтропии рассчитывается для каждой последовательности. Когда используется упаковка, потери для последовательности больше не вычисляются. Модель сходится к другому оптимуму. Чтобы исправить это, авторы предлагают следующее:

«Чтобы реализовать потерю каждой последовательности, мы эффективно« распаковываем »входящие логиты и метки, работая с потерей каждого токена. Мы вычисляем потерю всех токенов, принадлежащих первой последовательности, затем всех токенов, принадлежащих второй последовательности, и так далее «(Kosec, et al. 2021).

В документе есть хороший пример кода, который объясняет их реализацию - проверьте его.

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

Теперь, когда мы рассмотрели различные подходы к улучшению Transformer, следует сказать, что все они являются эксклюзивными идеями для оптимизации производительности, а не для повышения качества продукции. Вероятно, это связано с моим выбором и тем фактом, что Transformer как многообещающая архитектура все чаще доступна только крупным игрокам или, по крайней мере, создается ими. GTP3 является примером парадигмы для этого.

Надеюсь, эти описания были понятными и доступными. Некоторые объясненные концепции не очень легко понять, поэтому само объяснение - не самая простая задача. Спасибо, что дочитали до конца. Увидимся в следующий раз - до свидания.

использованная литература

Эйдан Н. Гомес, Менге Рен, Ракель Уртасун и Роджер Б. Гросс: обратимая остаточная сеть: обратное распространение без сохранения активаций. arXiv: 1707.04585, 2017 г.

Ашиш Васвани, Ноам Шазир, Ники Пармар, Якоб Ушкорейт, Ллион Джонс, Эйдан Н. Гомес, Лукаш Кайзер и Илья Полосухин: все, что вам нужно, - это внимание. arXiv: 1706.03762, 2018 г.

Матей Косец, Шенг Фу и Марио Майкл Крелл: Упаковка: к двукратному ускорению NLP BERT. arXiv: 2107.02027, 2021 г.

Никита Китаев, Лукаш Кайзер и Ансельм Левская: Реформатор: эффективный преобразователь. arXiv: 2001.04451, 2020 г.

Цзихан Дай, Чжилинь Ян, Иминь Ян, Хайме Карбонелл, Куок В. Ле и Руслан Салахутдинов: Transformer-XL: модели внимательного языка вне контекста фиксированной длины. arXiv: 1901.02860, 2019

Спасибо всем авторам, написавшим такие замечательные статьи! 🤗