Фактически, это триллион параметров.

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

  • Классификация: эта задача направлена ​​на классификацию текста по одной или нескольким из нескольких предопределенных категорий.
  • Распознавание речи и преобразование речи в текст: эти задачи связаны с обнаружением речи в аудиосигналах и преобразованием ее в текстовую форму.
  • Анализ тональности: в этой задаче определяется тональность текста.
  • Генерация естественного языка: эта задача связана с генерацией естественного (то есть человеческого) языка.

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

Подумайте о более новых языковых моделях. Например, GPT-2 (и 3) может генерировать высококачественные текстовые данные, связанные сами по себе. Такие способности открывают множество возможностей; как для хороших, так и для плохих целей. В любом случае такие возможности появились давно; ранние подходы использовали горячие векторы для преобразования слов в целые числа; более недавние успехи полагаются на механизмы внимания.

Текст моделирования

Чтобы использовать любые текстовые данные в качестве входных данных для нейронных сетей, требуется числовое представление. Простой способ - использовать представление «Мешок слов» (BoW). При таком подходе учитываются только слова и их частота, но не порядок: просто набор слов.

В качестве примера возьмем предложение «Быстрая коричневая лиса перепрыгивает через забор». Соответствующий BoW равен

[«The: 2», «quick: 1», «brown: 1», «fox: 1», «jumps: 1», «over: 1», «забор: 1»].

Чтобы превратить этот мульти-набор (то, что он представляет собой математически) в векторное представление, каждое слово представляет собой целое число. Термин «the» переводится в 2, что означает количество «the» в примере. Точно так же «быстрый» переводится в 1. С этой информацией результирующий вектор

[2, 1, 1, 1, 1, 1, 1]

Первая позиция - это количество «the» в предложении, вторая позиция - это количество «быстрых» в документе, и аналогично для остальных индексов. Если предложений несколько, вектор будет расти; это всегда до тех пор, пока словарный запас велик. Например, когда у нас есть второе предложение «Собаки и кошки - животные», наш словарный запас увеличится на пять слов. Это изменение отражено во всех векторах; наш первоначальный пример становится

[2, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]

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

Подходы «Мешок слов» работают хорошо, но имеют существенный недостаток: мы используем порядок слов. Теряя порядок, мы вводим двусмысленность. Например, предложения «A, а не B» и «B, а не A» оба отображаются в векторное представление [1, 1, 1, 1]. Далее языковые особенности теряются. Из начального примера «Быстрая коричневая лиса перепрыгивает через забор» мы можем сделать вывод, что глагол «прыгает» относится к лисе и забору. Такая контекстная информация теряется. Чтобы смоделировать эти две упомянутые особенности, нам требуется как порядок слов, так и контекстная информация.

Представление слов

Традиционно слова рассматривались как отдельные символы. Если у нас есть всего 20 уникальных слов, каждое слово представлено вектором длины 20. Только один индекс устанавливается в единицу; все остальные оставлены равными нулю. Это представление называется горячим вектором. Используя эту технику, слова из нашего примера предложения становятся

[1, 0, 0, 0, 0,…] для «the»

[0, 1, 0, 0, 0,…] для «быстрого»

В качестве примечания, суммируя эти векторы, мы получаем представление BoW.

Быстро возникают две проблемы: при достаточно большом словарном запасе векторы становятся очень длинными и очень разреженными. Фактически активен только один индекс. Вторая проблема касается сходства слов. Например, пара кошка и собака более похожа, чем кошка и орел. Подобные отношения не отражаются в однообразном представлении. Обычно для вычисления сходства между двумя векторами используются метрики сходства (или метрики обратного расстояния). Общее сходство - косинусное подобие. Возвращаясь к нашему примеру с парой кошка и собака, у нас могут быть (произвольные) векторы

[0, 0, 0, 0, 0, 1, 0, 0, 0] для кота

[0, 1, 0, 0, 0, 0, 0, 0, 0] для собаки

Косинусное сходство между этими векторами равно нулю. Для пары «кот» и «орел» он тоже равен нулю. Следовательно, два результата не отражают большего сходства первой пары. Для решения этой проблемы мы используем вложения.

Вложения

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

«Быстрая коричневая лисица перепрыгивает через забор».

Для контекстного окна первого размера «лиса» имеет контекстные слова (соседние слова) «коричневый» и «прыгает». Для окон второго размера будут добавлены «быстрые» и «сверх». В нашем коротком предложении мы быстро выйдем из контекста, и у нас будет только одно появление слова «лиса». Становится очевидным, что для создания значимого представления сущностей требуется большой объем текста. Обычно нам нужно как можно больше контекстной информации, что, естественно, имеет место для более крупных корпусов.

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

Общая идея всех алгоритмов внедрения-вычисления состоит в создании ценных векторов внедрения для токена. Алгоритм word2vec использует слова в качестве основных единиц и фокусируется на локальных отношениях. Чтобы создать вектор встраивания, мы можем - с этой структурой - сконцентрироваться на предсказании центрального слова из контекста или контекста из центрального слова. Первый подход известен как непрерывный пакет слов (CBOW), второй - как skip-gram. В следующем разделе я кратко рассмотрю метод пропуска грамм:

Чтобы получить вектор вложения для любого слова, мы используем нейронную сеть. На следующем рисунке, взятом из [1], схематически показан процесс:

Чтобы получить вложение для произвольного слова, мы используем его одноразовое представление. Этот вектор является входом в сеть, изображенную слева. На следующем шаге вектор проецируется в его представление вложения, показанное в середине. Как обычно, это происходит путем умножения его на матрицу, отмеченную на рисунке как E. Другими словами, это прямой проход в сети. Результирующее (скрытое) представление оптимизируется для предсказания контекстных слов, показанных справа.

Таким образом, выход сети - это не встраивание, а контекстные слова. Чтобы их предсказать, мы используем другой вес, C. Когда мы умножаем наше скрытое внутреннее представление на C, мы получаем вектор длины d, где d - размер нашего словаря. Этот результирующий вектор можно интерпретировать как ненормализованную вероятность появления каждого слова в контексте. Таким образом, при обучении нашей сети мы максимизируем вероятность фактических контекстных слов и минимизируем вероятность неконтекстных слов. Напомним, что векторный поток:

Wᵢₙₚᵤₜ × E = e | для умножения горячего на E

out = e × C | для умножения внутреннего представления на C

Чтобы окончательно получить вложение, извлекаем внутреннее представление. Здесь будет еще кое-что, например целевая функция (отрицательное логарифмическое правдоподобие). Обратитесь к статье, чтобы узнать больше.

Чтобы оценить полезность встраивания, зайдите в Инструмент проектора TensorFlow. Это позволяет вам исследовать различные вложения; в нашем случае подходит набор данных Word2Vec 10k. Щелкните A, чтобы включить ярлыки. Теперь вы можете визуально увидеть сходство между родственными словами. В следующем примере я искал слово машина. Выделены ближайшие соседи:

Алгоритм Word2Vec делает два варианта, как вкратце упоминалось выше:

Во-первых, он фиксирует местные отношения. Во-вторых, он рассматривает слова как базовые единицы. Другие алгоритмы принимают другой выбор. Например, алгоритм GloVe, сокращение от Glo bal Ve ctors, создает вложения на основе глобальных отношений и использует слова в качестве базовых единиц. Третий алгоритм - FastText (см. Ссылки на документы здесь), который использует информацию подслова в качестве основных единиц (например, это - › th и is ).

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

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

(Современные) н-граммы

Чтобы начать учитывать порядок слов, мы можем использовать так называемый подход n-граммы. Ранее при создании представления BoW мы разбивали предложение на отдельные слова. Вместо этого мы могли бы также разделить его на сегменты из двух последовательных слов, трех последовательных слов и так далее. Количество слов в строке равно n в n -грамме. Если n равно единице, модель анализа называется uni gram; если n равно двум, это называется би грамм.

В качестве примера давайте проанализируем «Быстрая коричневая лиса перепрыгивает через забор» с помощью биграммной модели:

[«Быстрый», «Быстрый коричневый», «Коричневая лиса», «Лисица прыгает»,…]

Как мы видим в этом примере, мы перемещаем окно по тексту с размером n и шагом, равным единице. Шаг в единицу приводит к тому, что последнее слово предыдущего отрывка становится первым словом следующего отрывка. Используя этот подход, мы частично сохраняем связь между словами.

Представление статично. Если параметр n изменяется, набор данных необходимо снова предварительно обработать. В зависимости от размера это может занять некоторое время. Однако мы можем включить алгоритм n -граммы в нейронные сети и позволить им выполнять «предварительную обработку». Этот подход можно рассматривать как современные н-граммы.

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

l x e

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

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

Недостатком n -грамм является то, что они фиксируют отношения только в ограниченном диапазоне. Например, N-граммы не могут выразить связь между первым и последним словом предложения. Установка параметра n на длину предложения будет работать, но потребует отдельного n для каждого предложения разного размера. Есть лучший подход для управления отношениями на протяжении большого промежутка времени - механизм внимания. Этот метод был введен для задач машинного перевода.

Машинный перевод

Задача машинного перевода (MT) занимается переводом текста с исходного на целевой язык. Например, «Est-ce que les poissons boivent de l’eau?» (Французский) можно было бы перевести как «Рыбы любят воду?»

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

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

Математически это выражается как y * = argmax_y P (y | x). Символ y * обозначает перевод с наибольшей вероятностью.

Согласно правилам Байеса, это описание можно разбить на две отдельные части: y * = argmax_y P (x | y) P (y). Первый компонент, P (x | y), моделирует вероятность того, что x является переводом y. Эта часть называется трансляционной моделью. Вторая часть, языковая модель, дает вероятность y на целевом языке.

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

Развитие глубоких нейронных сетей также повлияло на задачу машинного перевода. Рекуррентные нейронные сети, RNN, являются хорошим выбором, поскольку и вход, и выход представляют собой последовательности. Ввод - это предложение, которое нужно перевести; вывод - это перевод. С одной RNN возникают две проблемы: во-первых, длина исходного и целевого предложений может быть разной. Этот факт очевиден в первоначальном переводе примера. Входные данные содержат восемь токенов, а выходные - только пять (в зависимости от того, как вы подсчитываете знаки препинания, но проблема остается той же). Во-вторых, порядок слов может измениться, в результате чего RNN по принципу «один-за-один-выходит» становится непригодным для использования.

Решение обеих проблем заключается в использовании двух рекуррентных сетей в так называемой схеме «последовательность-последовательность» (Seq2Seq) [2,3]. Первая сеть, названная кодировщиком, принимает входные данные и выдает внутреннее представление. Вторая сеть, называемая декодером, использует это внутреннее представление для генерации целевой последовательности, например перевода.

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

Одиночная RNN считывает анализ входных токенов и немедленно возвращает перевод. В макете Seq2Seq кодировщик сначала считывает полную входную последовательность, чтобы создать внутреннее представление. Только после этого это представление, которое обычно является вектором, передается в сеть декодера.

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

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

Внимание

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

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

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

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

[a, b, c, d, e],

где символы представляют результат скалярного произведения с соответствующим скрытым состоянием (например, a - результат скалярного произведения с первым скрытым состоянием). Затем к этому вектору применяется операция softmax, в результате чего получаются веса внимания. Эти веса выражают важность каждого скрытого состояния, представленного вероятностью. На последнем этапе мы умножаем скрытые состояния на их оценку внимания и суммируем векторы. Это дает нам вектор контекста для текущего состояния, который передается кодировщику (не совсем правильно, но подходит для этой цели). Этот процесс повторяется после каждого шага кодировщика.

Этот процесс можно увидеть на этой анимации, взятой из репозитория Google seq2seq:

Анимация механизма внимания. Из Google seq2seq.

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

Общим недостатком рекуррентных сетей в целом и подхода от последовательности к последовательности в частности является низкая возможность распараллеливания. Напомним, что результат шага k + 1 зависит от шага k; Таким образом, мы должны сначала проанализировать все предыдущие шаги. Следовательно, здесь мы не можем работать параллельно, за исключением случаев, когда мы изменяем базовую сетевую архитектуру. Эта идея приводит нас к Трансформерам.

Трансформеры

Трансформер [5] - это архитектура нейронной сети, использующая механизм внимания. Под капотом он по-прежнему использует структуру кодировщика-декодера, но заменяет повторяющиеся сети. Вместо этого кодировщик моделируется n идентичными слоями с самовниманием и обычными сетями с прямой связью. Блок кодировщика использует ту же структуру и добавляет еще один уровень внимания, который принимает выходные данные кодировщика. На следующем рисунке, взятом из [5], показана описанная установка:

Второе улучшение - это модификация процедуры внимания. В подходе «от последовательности к последовательности» скрытое состояние декодера вычисляет скалярное произведение со всеми скрытыми состояниями кодировщика. В улучшенном механизме, получившем название Multi-Head Self-Attention, эти операции моделируются как умножение матриц.

Самовнимание преобразует входные данные во внутреннее представление, взвешенную сумму его собственных временных шагов. Этот подход может фиксировать долгосрочные зависимости внутри последовательности. Входные данные преобразуются в три различных представления: Key, Query и Value для моделирования этих отношений. Эти представления получаются путем умножения входных данных на три веса: Wₖ (для ключа), Wᵥ (значение) и Wq (запрос). . Последовательность вычислений показана на следующем рисунке [5]:

Q и K умножаются на матрицу, масштабируются, необязательно маскируются, а затем мягко максимизируются. Наконец, результат умножается на матрицу V. Математически это можно выразить в следующем уравнении:

Наконец, существует множество таких «потоков», получивших название «головы внимания». Каждая голова использует свой набор весов внимания Wₖ, Wᵥ и Wq. Эти веса дают несколько внутренних представлений для одного и того же входа. Затем объединяются результаты отдельных групп внимания, как показано на следующем рисунке [5]:

Эти вычисления выполняются в блоках кодера и декодера и могут выполняться параллельно. Это распараллеливание - одна из причин, почему подход Transformer быстрее, чем ванильные модели RNN. Кроме того, преобразователь использует кодирование пар байтов, что позволяет ему обобщать невидимые слова. Распространенной проблемой являются редкие слова, а также языки с составными словосочетаниями. Подумайте о таких безумных немецких существительных, как «Baumhausprüfgesellschaft» («Общество, которое проверяет дома на деревьях»). Я очень сомневаюсь, что такие комбинации присутствуют в типичных обучающих данных. Таким образом, идея состоит в том, чтобы использовать токены подслова, вышеупомянутую кодировку пар байтов: мы извлекаем наиболее частые подслова из обучающих данных, такие как «th» и «ng». С таким словарем мы можем затем смоделировать (неизвестное) слово как комбинацию пар байтов.

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

Более подробную информацию можно найти здесь, но это уведет нас от темы статьи. Если вам интересно, я рекомендую Описание Джея Аламмара« Иллюстрированный трансформер ».

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

Word2Vec или аналогичные платформы создают только один вектор для каждого токена. Однако, как мы заметили, значение слова определяется его контекстом. И частый контекст может варьироваться между обучающими данными (используемыми для получения вложений) и тестовыми данными. Итак, как мы можем это решить? Используя трансферное обучение.

Трансферное обучение, языковые модели и ELMo

В задачах компьютерного зрения трансферное обучение является стандартной процедурой. Сначала изучите модель для задачи A, затем используйте веса для B. Обычно задачи A и B обучались на одних и тех же типах данных. Далее решаемые задачи (обнаружение, классификация, перевод) достаточно схожи. Эта концепция может быть расширена до области НЛП.

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

Стандартное предварительное задание - языковое моделирование. Когда мы обучаем языковую модель, мы предсказываем предстоящее слово на основе предыдущих. Для этой задачи становится актуальным ELMo [6]. ELMo, сокращение от Embeddings from Language Models, состоит из слоев LSTM. Некоторые из этих слоев сложены и обучены предсказывать предстоящее слово. Кроме того, модель идет еще дальше: это двунаправленная языковая модель. Последовательности анализируются в обоих направлениях. Чтобы получить вектор внедрения, мы объединяем скрытые слои и суммируем их (упрощенно), как показано на этом рисунке, взятом из Введение Джея Аламмара в BERT and co.:

Когда у нас есть полностью обученная модель, мы можем получить наши вложения, запросив модель с нашими предложениями. Как это помогает нам понять контекст? ELMo был обучен на множестве данных, где он должен был предсказывать следующее слово. И эта задача требовала от него изучения контекста. Например, фразы «Он сидел на [берегу]» и «Он пошел в [банк]» оканчиваются на «банк», и модель должна выучить разные значения одного и того же слова.

Векторы, получаемые из такой модели, включают эту контекстную информацию - они являются контекстуализированными вложениями. Таким образом, мы получаем два разных вектора для предыдущего примера «банк», в зависимости от контекста «банка». Затем вложения используются в нашей основной задаче; Модель ELMo служит экстрактором функций. Но это медленно; мы не можем выполнять поиск в таблице, но должны загрузить (потенциально огромную) модель. И он полагается на повторяющиеся сети. Это приводит к BERT.

БЕРТ

То, что сработало при переходе от ванильного подхода к последовательностям, основанному на RNN, также работает для модели ELMo. Мы можем заменить слои LSTM стеком блоков кодировщика, который мы знаем из трансформатора. Эти модификации дают нам модель BERT [7], сокращенно от двунаправленного представления кодирования от трансформаторов. Части входной последовательности замаскированы, что делает эту языковую модель замаскированной. Мы достигаем двунаправленности путем случайного маскирования токенов (по умолчанию: 15%); нам не нужно разбирать последовательность в обоих направлениях.

Результатом BERT является слой измерения hidden_size, установленный на 768 в базовой модели (12 блоков кодировщика сложены). Эти выходные векторы - наши вложения, и они снова контекстуализированы. Как и в случае встраивания ELMo, мы можем взять их и использовать для нашей конкретной задачи. Или мы можем просто использовать BERT; он очень эффективен при решении широкого круга задач. Мы можем использовать его для анализа настроений, ответов на вопросы, распознавания именованных сущностей (пометки токенов как, например, существительные). Имея 110 миллионов параметров в базе и 340 миллионов в большом варианте, вы можете сделать несколько вещей. Но мы еще не достигли миллиарда. Введите GPT-2.

GPT-2

Идея GPT-2 [8] близка к идее BERT: обучить одну большую языковую модель на массивном корпусе текста. GPT - это сокращение от Generative Pre-Training, а цифра 2 указывает на то, что это вторая итерация. Первая итерация называлась OpenAI Transformer [9] и представляла собой сложный слой Transformer Decoder. Позже BERT унаследовал эту архитектуру. Возвращаясь к GPT-2, модель имеет от 117 миллионов до 1542 миллионов параметров - 1,5 триллиона параметров. Поскольку это языковая модель, каждая задача, которую она может выполнить, моделируется как задача завершения. Допустим, вы хотите перевести с английского на латынь. Сначала модель обучается как трансляционная система, и во время вывода вы даете ей подсказку вроде

«Правительство выдало новый раунд стипендий. =»

Знак «=» указывает на то, что модель должна завершить (то есть перевести) предложение. Во время обучения он видел пары «‹English› = ‹Latin›» и, таким образом, узнал свойства подсказки «=». Переводческая задача - не единственная; GPT -2 также отлично справляется с подведением итогов и ответами на вопросы.

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

Поэтому OpenAI, организация, стоящая за сетями GPT, изначально решила не выпускать всю модель. Вместо этого были опубликованы только обученные веса для моделей со 117 и 345 миллионами параметров. Однако в конце 2019 года исследователи также сделали доступными большие модели, предоставив любому, кто достаточно сведущ, доступ к модели с 1,5 миллиардами параметров.

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

Переключатель трансформатора

Есть несколько архитектур с миллиардом параметров. Следующий рисунок, взятый из блога Nvidia, показывает рост языковых моделей:

Поскольку мы уже достигли порога в миллиард параметров, я представлю модель с триллионом параметров, Switch Transformer [10]. Ключевым изменением, используемым в этой архитектуре, является подход «Смесь экспертов» (MoE). Обычно модели используют одни и те же параметры для всех входных данных. Независимо от того, является ли ввод изображением кошки или собаки, используемые веса одинаковы. В настройке MoE модель выбирает разные параметры (продуманные маршруты) для каждого входа. Этот подход соответствует разреженным нейронным сетям, где одновременно используется только подмножество весов. Следующий рисунок поясняет это (взято из [10]):

На рисунке показан модифицированный блок датчика положения трансформатора, представленный ранее. В этом исходном блоке поток информации предопределен макетом блока. Напротив, блок Switch Transformer поддерживает несколько нейронных сетей с прямой связью (в отличие от одной). Затем уровень маршрутизатора выбирает, в какую из этих сетей, называемых экспертами, перенаправляется текущий ввод. Такой подход эффективно увеличивает количество параметров трансформатора. И поскольку консультируется только один эксперт, это все еще выполнимо с вычислительной точки зрения.

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

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

Резюме

Обработка естественного языка претерпела огромное развитие. Начиная с горячих векторов для представления токенов, он перешел к встраиванию, чтобы более точно уловить смысл. Постепенно эти векторы больше не были получены из Word2Vec или аналогичных фреймворков, а были извлечены из языковых моделей (ELMo, BERT). Эти модели начинались с от 100 до 300 миллионов параметров. Вскоре стало очевидно, что большее количество параметров дает лучшие результаты, поэтому исследования постоянно масштабировали количество весов. Затем модель GPT-2 превысила порог миллиарда параметров и была заменена еще более крупными моделями. Обучение такого количества параметров является сложной задачей и было бы невозможно без значительного увеличения объема вычислений. Коммутационный трансформатор, работающий на TPU, достиг более триллиона параметров. И это только начало.

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

[1] Миколов и др., Использование сходства языков для машинного перевода, 2013, arXiv

[2] Суцкевер и др., Последовательность обучения с помощью нейронных сетей, 2014 г., Достижения в системах обработки нейронной информации (NIPS).

[3] Чо и др., Изучение представлений фраз с использованием кодировщика-декодера RNN для статистического машинного перевода, 2014 г., arXiv

[4] Bahdanau et al., Нейронный машинный перевод путем совместного обучения выравниванию и переводу, 2015, ICLR.

[5] Васвани и др., Внимание - все, что вам нужно, 2017, NIPS.

[6] Петерс и др., Глубокие контекстуализированные представления слов, 2018, arXiv (слайды)

[7] Девлин и др., BERT: предварительное обучение глубоких двунаправленных преобразователей для понимания языка, 2018, arXiv (слайды)

[8] Рэдфорд и др., Языковые модели - это неуправляемые многозадачные ученики, 2019, блог OpenAI.

[9] Рэдфорд и др., Улучшение понимания языка с помощью генеративного предварительного обучения, 2018, блог OpenAI.

[10] Федус и др., Коммутационные трансформаторы: масштабирование до триллионов моделей параметров с простой и эффективной разреженностью, 2021 г., arXiv