Научно-технический вебинар «Обучение и декодирование с авторегрессионными нейронными языковыми моделями»

4 мая 2021, 17:00 MCK

О вебинаре

  • Спикер

    Илья Куликов, Нью-Йоркский Университет, Нью-Йорк, США

  • Тема

    Научно-технический вебинар «Обучение и декодирование с авторегрессионными нейронными языковыми моделями»

  • Подробнее про вебинар

    Спикер о вебинаре:

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

    Видео: https://youtu.be/5e9tAJREl6Q

    Презентация: https://drive.google.com/file/d/19QXAAwJtbKq-yBJpE2AeVHXbe991NYNU/view?usp=share_link

    (00:00:00) (Начало записи) 

    Николай Михайловский: Добрый день. Я Николай Михайловский, генеральный директор компании «НТР», и я приветствую вас на очередном вебинаре, который «НТР» проводит вместе с Высшей IT-школой Томского государственного университета. У нас сегодня с выступлением Илья Куликов, Университет Нью-Йорка, с рассказом про то, как сделать так, чтобы языковые модели авторегрессионные не генерировали всякие вырожденные вещи, если я правильно понимаю суть доклада. Илья, пожалуйста, вам слово.

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

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

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

    Но помимо этого, если мы возьмем любую генеративную seq2seq-модель, то декодер в такой модели, особенно в генеративной авторегрессионной seq2seq-модели, то декодер этой модели – это сама по себе условная языковая модель. Инкодер представляет собой генерацию кого-то условия, condition, и декодер – это условно распределение на sequence-уровне, которое представляет собой данная языковая модель. Тот же Neural Machine Translation может быть назван conditional language model.

    Также можно сказать о conversation modelling, то есть когда мы моделируем ответ в диалоге, имея какую-то историю диалога и какой-то контекст, плюс какую-то мета-информацию о пользователе. с которым мы ведем диалог. Все это обусловливается термином Probabilistic language modeling, то есть у нас есть какой-то метод для того чтобы описать математически модель. которая будет описывать какое-то пространство натурального языка. Под натуральным языком мы понимаем язык, который используют люди для общения. Вся суть сводится к тому, что, имея какую-то последовательность из текста, наша модель может присвоить ей вероятность, и эта вероятность – простой скаляр, и сама цель обучения такой модели чаще всего основывается на том, чтобы вероятность более натуральной последовательности, то есть предложения, которое мы можем встретить в реальной жизни, должна быть выше, чем вероятность предложения, которое мы вряд ли встретим в реальной жизни.

    Здесь мы видим два примера, y и y’, и второе продолжение явно не имеет большого смысла ни грамматически, ни орфографически. Скорее всего, мы хотим, чтобы такая вероятность этого продолжения y’ была меньше, чем вероятность y.

    (00:05:03)

    Эта область, она, скорее, может быть названа как Scoring Based подход, то есть имея какую-то языковую модель, мы просто определяем вероятности последовательностей для чтобы понять, какая из них более вероятна под конкретной языковой моделью. Каждая модель тренируется на определенном домене либо на определенном датасете, и, таким образом, можно как раз таки использовать ее для различных re-ranking методов решения задач.

    С другой стороны, можно рассматривать языковую модель как генеративную модель. Здесь все зависит от того, какой дизайн у самой математической модели. Сегодня мы рассмотрим авторегрессионную модель, к которой мы перейдем далее, но сама суть в том, что мы можем обобщить различные NLP-проблемы так называемым sequence completion. Имея какой-то префикс в виде последовательности либо какой-то condition в виде репрезентации этого префикса, то есть, например, в переводе это просто source-предложение, на исходном языке, а у нас есть задача sequence completion, то есть продолжить последовательность, имея нашу языковую модель. Задача в том, чтобы эта последовательность отражала сэмпл из настоящего так называемого oracle-распределения p*. Мы представляем, что у нас есть какое-то недоступное для нас oracle-распределение, которое служило для того чтобы собрать датасет, на котором обучалась наша модель. Задача sequence completion состоит в том, чтобы получить этот continuation y с крышкой, который получается из распределения модели на уровне последовательности, таким образом, чтобы все вместе, и prefix, и continuation представляли собой какой-то высоковероятный sample или распределение p*. Я даже не знаю, есть ли эквиваленты на русском языке, так что если что, обращайтесь. К этому сводится задача sequence completion.

    А теперь мы затронем тему, что же такое авторегрессионная модель. Авторегрессионный дизайн модели обусловливает то, что, во-первых, у нас есть наша последовательность, которая представлена как случайная переменная из нескольких компонент. Во-первых, это variable length последовательность, то есть в ней может быть необязательно фиксированное количество токенов, в каждой из этих последовательностей. В данном случае y имеет Т+1 токенов, и языковая модель присваивает так называемую joint distribution на всю эту последовательность, то есть это р от всех компонентов этой последовательности. Задавая определенный порядок между этими компонентами, мы можем использовать просто chain rule, так называемый (00:08:08) цепочки вероятностей для того чтобы разложить вероятность всей строки на произведение conditional вероятностей каждого токена от какого-то условия. Конечно, в конце будет идти сам первый токен, у которого нет никакого условия. Здесь, как вы видите по нотации, которая будет использоваться и дальше в сегодняшнем докладе, y<t – это префикс от начала строки до токена на позиции ___. (00:08:40) Как вы видите, авторегрессионная декомпозиция помогает решить проблему переменной длины последовательности, то есть какая бы ни была у нас последовательность, мы всегда можем ее разложить на вот такая произведение.

    Для тех, кто работал с языковыми моделями до прихода нейронных сетей, вы также знаете N-gram Count Based модели, где используется так называемые ___. (00:09:05) Можно представить, что даже в этом распределении, а точнее, в этой декомпозиции, можно представить, что каждое conditional-распределение y, t given y<t, у нас условие формируется только для последних трех токенов из истории, а точнее, все, что дальше трех токенов, оно, в принципе, независимо, то есть саму ключевую роль играют именно последние ___. (00:09:35)

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

    (00:09:59)

    Теперь, зная об этой декомпозиции, все становится довольно просто. Вся суть моделирования языковой модели нейронной сетью, особенно такими сетями, как LSTM, рекуррентной нейронной сетью или просто RNN, рекуррентной нейронной сетью, или трансформером, сводится к тому, чтобы смоделировать конкретное conditional-распределение с помощью функции, которая на вход принимает префикс до сих пор и имеет какой-то набор параметров θ в данном случае.

    В синей рамочке вы видите, что в принципе сама функция f – это не только сама нейронная сеть, которая представляет собой нелинейное преобразование, но это также и какой-то эмбеддинг-слой, потому что, как вы понимаете, эти токены, от y0 до y большое t – это дискретные переменные, а для нашей модели необходимо какое-то распределенное континуум-значение для каждого токена. Для этого используется эмбеддинг-слой, то есть мы просто создаем огромную матрицу, в которой для каждой позиции из словаря создается какой-то вектор. Согласно так называемый distributional ___ (00:11:11) каждое слово в процессе обучения встает на определенное место в этом эмбеддинг-пространстве. Таким образом, эта модель представляет собой эмбеддинг-слой, какую-то саму функцию, которая там реализована с помощью нейронной сети, и в конце Softmax-функция, так как сама нейронная сеть считает какие-то определенные значения на каждой из компонент, и это необязательно вероятностное распределение, так называемое ___. (00:11:50) Например, функция Softmax способна превратить ___ в вероятностное распределение. Под этим превращением мы понимаем то. что результат соответствует нескольким условиям распределения, то, что каждое из значений в данном случае оно позитивное, то есть нулевых значений там не бывает, и весь вектор из всех категорий складывается ___, (00:12:13) и каждое значение – от 0 до 1.

    Теперь мы пришли к тому, что у нас есть дизайн нашей модели, где каждое conditional-распределение реализуется с помощью нейронной сети, и самое главное, что параметры θ используются одни и те же на каждом timestamp для каждого токена. Можно представить, что для того чтобы посчитать вероятность всей строки, мы считаем для каждого токена результат вычисления нейронной сети, и затем считаем произведение этих вероятностей, либо для того чтобы это было более стабильно, мы переводим все это в workspace (00:12:59) и считаем сумму ___ вероятностей. Таким образом, можно посчитать вероятность всей строки к слову для того чтобы посчитать score нашей строчки для какой-то конкретной задачи.

    Теперь, зная, как наша модель, какой у нее дизайн, мы переходим к тому, а как же у нас происходит обучение. Здесь стандартный подход, который мы сегодня будем затрагивать, это далеко не один подход, просто это один из самых общих. Это максимизация вероятности всех строчек из конкретного набора данных на наших параметрах θ. Имея набор данных D, который мы представляем, что исходит из какого-то oracle-распределения, наша задача состоит в том, чтобы максимизировать вероятность каждой строки из этого набора данных. Как вы видите, так как у нас есть такой лосс, то есть мы, получается, минимизируем негативную oracle-вероятность.

    Что мы делаем? Мы проходим по каждой… Первая сумма проходит по каждому сэмпла из датасета, затем мы идем по каждому токену в этой цепочке и максимизируем conditional-вероятность. Таким образом, по факту обучение языковой модели – это максимизация next token prediction так называемой, то есть мы максимизируем вероятность следующего токена от конкретного префикса. В данном подходе это очень похоже на так называемый ___ (00:14:34) classification, то есть можно представить, что все, что мы делаем, это мы классифицируем конкретный префикс на конкретную категорию следующего токена. Конечно, категорий очень много, в современных моделях это может 30 тысяч классов. Но по факту хочется сказать, что это не особо отличается от того же image classification. Мы берем наш префикс и классифицируем его на определенный класс, только в данном случае здесь совсем другой характер самого датасета, то есть очень много похожих префиксов, которые отличаются на один токен, но они все классифицируются в другой класс.

    (00:15:10)

    Связи, которые обучают модель, существенно отличаются от того же image classification.

    Для того чтобы более наглядно продемонстрировать, то есть вот у нас есть наша лосс-функция, и, к примеру, у нас есть наш префикс, где написано hello how are, и дальше у нас есть наш based словарь, и мы знаем что target token в данном случае это you, и все, что мы делаем, это мы максимизируем вероятность you с помощью этого критерия. После так мы посчитали эту функцию ошибки на ___, (00:15:44) мы используем ___ для того чтобы получить градиент этой функции по отношению к каждому параметру из набора θ, и затем, используя, например, stochastic ___ или любой из последующих модификаций этого алгоритма, мы проводим апдейт всех параметров θ, то есть мы изменяем каждый параметр в соответствии с градиентом, помноженным на какой-то Learning Rate. Затем, согласно какому-то критерию early_stopping, то есть сама функция ошибки вряд ли уйдет в абсолютный ноль, но мы используем какие-то критерии для того чтобы понять, что наша модель может, например, переобучиться на тренировочном набор, мы этого не хотим, мы используем разницу между ошибкой на каком-то валидационном наборе данных с тренировочным и останавливаем обучение.

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

    Николай Михайловский: Так, пишет нам в чат Николай Кривошеев: «Можно узнать контакты докладчика, например, почту? Хотел задать пару вопросов по данной теме, боюсь, не смогу присутствовать до конца».

    Илья Куликов: Да, я сейчас напишу почту.

    Николай Михайловский: Я думаю, мы потом сможем вашу почту еще раз разослать в том, что мы будем рассылать всем присутствовавшим. Можно так будет?

    Илья Куликов: Да, конечно.

    Николай Михайловский: Пожалуйста, еще вопросы. Николай Кривошеев спрашивает: «А есть модели без префикса, без использования начальных слов?»

    Илья Куликов: Да. В принципе, если мы обучаем модель просто на максимизацию каких-то цепочек, то можно использовать ее без префикса, единственное, нам необходим какой-то так называемый мета-тег, special token, как, например, начало строки, для того чтобы инициализировать саму модель. Но после этого можно генерировать всю посредственность. А без начального слова – скорее, это уже больше в non-autoregressive design, то есть у нас есть non-autoregressive design, то вся строка целиком может быть сгенерирована разом. Но для того чтобы сделать, нужно подать на вход определенную строку, в которой все токены будут заменены специальным служебным токеном, таким, как mask, и после этого такая non-autoregressive модель сможет сгенерировать всю строку. Но это совсем не входит в наш доклад сегодня.

    Николай Михайловский: Спасибо. Пожалуйста, еще вопросы.

    Илья Куликов: Я бы сказал еще так, что, скорее, модели без начального слова, без начальных строк – это частный случай этой всей парадигмы, где у нас есть какой-то префикс, то есть мы просто можем представить, что это частный случай, скорее.

    Николай Михайловский: Спасибо. Пожалуйста, еще вопросе. «А есть ли модели ближе к генеративным сетям, где на входе случайное число?», – спрашивает опять же Николай.

    Илья Куликов: Случайное число, наверное, имеется в виду какой-то случайный сэмпл, то есть больше к latent variable моделям. Это все зависит от дизайна и от того, какая задача решается.

    (00:19:56)

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

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

    Илья Куликов: Да, я понял. Вообще, ганы для текстов – это очень активная research-область, в которой не очень хорошо, особенно по сравнению с авторегрессионными моделями, которые, видимо, и тренировать проще. Но да, я, в принципе, это только что и имел в виду, что в ганах у нас есть какой-то генератор, и у него на входе есть сэмпл, который представляет собой какое-то случайное число из base-распределения. Да, это можно адаптировать к языковой модели, вопрос только в том, зачем. Для того чтобы просто сгенерировать случайную строку? Но также можно ___ (00:21:38) начальное слово, и потом просто сам сэмплить каждый токен согласно распределению следующего токена, не выявлять максимально вероятность, а просто сэмплить. Тогда у нас будет довольно-таки много различных случайных последовательностей. Но если нам хочется делать какой-то control (00:21:55) prediction, то есть когда у нас есть какой-то атрибут, к примеру, мы хотим сгенерировать текст про науку, тогда это уже идет как раз таки генерация входного случайного… вот этого… переменки, которая генерируется с условием конкретного атрибута. этого все что очень-очень много рисерчей на тему control prediction, (00:22:19) там собственно, это совсем не про ганы, но там есть как раз такие подходы, то есть когда на каждый следующий токен, который будет генерироваться, создается дополнительная переменная атрибута, которая, так скажем, изменяет распределение следующего токена в сторону тех токенов, которые соответствуют топику, который вы задаете, к примеру, кино, наука, здоровье, политика и так далее. Думаю, нам можно ехать дальше.

    Николай Михайловский: Да, поехали, пожалуйста.

    Илья Куликов: После так, мы обучили модель, мы переходим к тому, как же найти continuation. Я только что затронул этот момент, что существует так называемая decoding strategy или стратегии декодирования, которые можно разделить на две большие категории. Здесь мы проходим именно single pass, то есть на каждую позицию в строке мы принимаем решение один раз, мы не возвращаемся в прошлое. Здесь у нас есть детерминистические стратегии, которые в основном пытаются найти моду распределения на sequence level. К примеру, у нас есть continuation, наша строка, и мы пытаемся найти такую строчку, которая примерно ищет строчку с максимальной вероятностью. Почему примерно? Потому что точно найти не получится, потому что само пространство поиска растет экспоненциально с длиной строки. Поэтому нам приходится приходить к таким приблизительным подходам, к эвристическим алгоритмам, так скажем.

    А другой подход – это стохастические стратегии, где вместо того чтобы искать цепочку с приближенной максимальной вероятностью, мы просто ищем цепочку в окружении этой моды, а может быть, и не в окружении, в зависимости от какого-то гиперпараметра. Мы просто сэмплим какую последовательность согласно распределению, желательно на sequence level.

    Здесь вы можете видеть пример, то, что у нас есть наша модель pθ, у нас есть алгоритм f и какой-то префикс ICLR, 2020, is. Мы хотим засэмплить или найти такую continuation: a, great, conference. Как это можно видеть наглядно, к примеру, у нас есть наш жадный поиск. это частный случай ___, (00:24:48) где размер ___ равен 1.

    (00:24:52)

    Либо это Top-k sampling, где ___ равен 1. Здесь каждая из стратегий показана на уровне одного следующего токена. К примеру, на жадном поиске мы выбираем токен, у которого максимальная вероятность согласно данному Softmax-распределению. В данном случае вы видите, что у токена B как раз таки максимальная вероятность.

    Есть также Ancestral sampling, то есть это просто сэмплинг из всего распределения. Мы имеем распределение Softmax, и мы применяем ___ (00:25:23) sampling и возвращаем какой-то токен. Также есть Top-k sampling, потому что очень часто Softmax из Ancestral sampling имеет довольно-таки высокую энтропию, и из-за этого разброс токеновв может быть очень велик, и строка потеряет на самом деле грамматичность или какую-то связанность. Именно поэтому используются различные способы, как сузить саппорт распределения до меньшего числа токенов. В данном случае Top-k принимает в распределение только k максимально вероятных токенов, а потом сэмплит из них.

    Также есть другой подход, называется ___ (00:26:09) sampling, где вместо фиксированного k принимается специальное значение суммированной вероятности токенов таким образом, что мы возвращаем минимальное подмножество токенов, чья суммированная вероятность не превышает этого гиперараметра, то есть вместо фиксирования k мы фиксируем некую ___ (00:26:30) вероятность p.

    После того, как мы получили нашу последовательность, здесь хочется сказать, что еще вы видите, что в каждом из этих Softmax есть так называемая token ender sequence. Это очень важная вещь, которая, по сути, позволяет нам понять, когда остановиться. Во время тренировки каждая из цепочек дополняется специальным ender sequence token, и в процессе prediction time, в тот момент, когда модель выбирает ender sequence token, мы считаем, что генерация завершена.

    Получается, у нас есть несколько таких шагов по этому learning pipeline, в первую очередь, мы сегодня об этом даже не говорили, это Data Gathering, (00:27:15) когда мы собираем датасет. Это отдельная тема, и сегодня мы о ней не говорим. Мы начали с дизайна основной модели.

    Затем, у нас есть процесс обучения, где мы используем ___, (00:27:25) и затем нас есть inference, мне не очень нравится слово inference, может быть, лучше даже сказать prediction time, где мы используем нашу стратегию декодирования для того чтобы приблизительно извлекать цепочку с максимальной вероятностью либо какой-то набор цепочек ссэмплированных из нашей модели. К примеру, как вы можете догадаться, так как Ancestral sampling при бесконечном количестве сэмплов полностью реплицирует само распределение, в принципе, если у нас есть бесконечные ресурсы, то можно просто сэмплить до тех пор, пока мы не получим реальную моду. Но это нереалистично, поэтому приходится всегда чем-то жертвовать.

    Имея этот pipeline, мы сейчас посмотрим о том, какие все-таки возникают проблемы, даже учитывая то, насколько сильно вперед продвинулись сообщество в плане объемов тренировки, объемов данных и размеров моделей. Здесь вы можете видеть, что у нас такой пошел ___ (00:28:32) рост того, какие большие модели стали тренироваться за последние годы и на каких огромных объемах данных. Все это началось на самом деле не с ___, (00:28:41) а еще раньше, когда в принципе появилась идея использования таких contextualized репрезентации токенов, то есть там модели ___, но они, скорее, не относятся к авторегрессионным языковым моделям, и именно ___ просто натренировали огромную авторегрессионную модель на практически бесконечном массиве текстов, которые они собирали просто из Интернета с помощью ___ (00:29:12) движков, немножко их чистили, и затем просто максимизировали вероятность этих строк, используя огромные вычислительные мощности. Затем началось, то есть у нас появились модели GPT-2, GPT-3, Megatron LM, (00:29:25) теория natural language generation. Но что интересно, это то, что, несмотря на то, какие огромные объемы данных они используют для тренировки, если мы хотим continuation, который максимизирует вероятность для данного префикса, то при использовании BeamSearch или GreedySearch мы получаем так называемые вырожденные последовательности, это последовательности, которых явно не было в наборе данных.

    (00:29:59)

    Как вы можете видеть здесь, с определенного момента предложение начинает повторяться, самое интересное, что оно не заканчивается. Делали эксперименты о том, что в принципе модель впадает в такой цикл, и ender sequence token, по крайней мере, в практичных пределах не появляется. Конечно, он может появиться спустя пару недель после такого сэмплинга, но в том формате, когда это все еще влезает в видеокарту, такого не происходит.

    Также это происходит не только на больших моделях, как GPT-2, но и на… точнее, GPT-2 – это не только большая модель, это модель, которая была тренирована на огромном массиве данных, но это также происходит, если мы тренируем большую модель на каком-то маленьком массиве данных, то есть если мы просто тренируем это, к примеру, на Wiki Text 1.03, справа это как раз часть из нашей работы. У нас есть какой-то префикс, и мы используем deterministic decoding, то практически сразу у нас появляется цикл, который не останавливается.

    Одна из первых работ, которые были, это работа The Curious Case of Neural Text Degeneration, слева снизу, с ICLR 2020. Как же побороть этот degeneration issue? Вообще, как раз статья с предыдущего слайда агитировала за использование stochastic-стратегии, то есть они представили как раз таки ___ (00:31:34) sampling, проверили Top-k sampling. Естественно, когда мы просто сэмплим следующий токен, то модель в принципе вряд ли уйдет в такой цикл повторений, и она не будет иметь этого повторяющегося префикса на вход, и в таком случае можно получить вменяемую строку. Но как раз таки вероятность этой строки не максимизируется согласно тому, что мы хотим, к примеру, в некоторых тасках. Одно дело, когда мы просто делаем sequence completion для того, чтобы просто сгенерировать continuation, другое дело, если мы делаем, к примеру, summarization task. В summarization нам не хочется получить слишком большого разброса токенов, нам хочется именно получить цепочку, которая максимизирует вероятность в соответствии со входным документом, который у нас есть.

    Также используется Constraint BeamSearch, то есть мы делаем ___, (00:32:28) и для того, чтобы он не производил этих повторяющихся цепочек, мы просто блокируем повторяющиеся энграммы, либо мы вводим такой Lexically constrained decoding. К примеру, в саммаризации мы ищем конкретные фразы из входного документа, которые должны присутствовать в выходе.

    Вместо того, чтобы смотреть на decoding side этой проблемы, мы изучили вопрос с точки зрения критерия тренировки, а именно, можно ли заставить модель не присваивать высокую вероятность тем токенам, которые явно будут повторять то, что было на входе. Так собственно появилась эта работа по Neural text generation with unlikelihood training с ICLR 2020, ссылка здесь же. Вообще, почему мы решили посмотреть именно критерий тренировки, вместо того, чтобы, например, посмотреть дизайн самой модели? Потому что мы заметили, что эта проблема возникает не только на самой последовательности, она также возникает прямо на следующем токене. Если мы просто делаем предикшен следующего токена на данных из датасета, то есть там префикс у нас без повторов, без ___ (00:33:47) этих повторов, то мы заметили, что, в принципе, там очень много повторов даже в этом случае. В тех случаях, когда модель неправильно делает предикшен следующего токена, то в этих неправильных случаях 35% из токенов – это повторы того, чтобы было в префиксе. Модель явно предпочитает присваивать более высокую вероятность тем токенам, которые, которые были в повторе, учитывая огромный размер словаря. Это навело нас на мысль, что можно, в принципе, посмотреть, как бы это исправить.

    Самая идея довольно простая. Она заключается в том, чтобы уменьшать вероятность определенных токенов, которые мы называем ___ (00:34:30) кандидатами, в процессе тренировки. Но здесь довольно интересная тема именно с этой тренировкой. Можно было бы просто сделать плюс логарифм вероятности, а не минус логарифм один минус вероятности. Но плюс логарифм вероятности, он довольно-таки unbounded с точки зрения оптимизации, и он не так хорошо сработал на всех моделях.

    (00:34:52)

    К тому же, именно эта формулировка приводит к интересному градиенту на выход Softmax, который я скоро покажу.

    Здесь справа вы видите пример, здесь у нас есть префикс из набора данных hello how are. У нас есть таргет-токен you, который мы увеличиваем вероятность, и мы уменьшаем вероятности токенов, которые были в префиксе, потому что вряд ли они должны быть сгенерированы. Конечно, они могут быть сгенерированы, и здесь как раз таки можно просто на каждый префикс брать… мы смотрим, если наш таргет-токен является действительно повтором того, что было в префиксе, то мы его не используем в негативных кандидатах, это как раз видно в следующей строке, где мы определяем кандидата. Как я уже говорил про градиент, то, что мы используем на тренировке на token level, здесь как раз так комбинация unlikelihood и likelihood-подходов. Если мы возьмем эту функцию ошибки и посчитаем градиент к выходным значениям с модели до Softmax, то есть это вход на Softmax, так называемый ___, (00:36:00) то градиент на эти значения – это разность между тем, чему у нас равен в данном случае наш таргет-токен, и вероятность, которую присваивает модель. На обычной модели ___ (00:36:20) у нас просто идет разность х минус р, а здесь у нас добавляется этот multiplier m на каждое из входных слов, m сам по себе – это вектор на все слова в словаре, и каждое значение mi адаптируется согласно тому, насколько высокую вероятность модель присваивала этому токену, если он был негативным. Если наша модель присваивает высокую вероятность токену, которую мы не хотим, то penalty получается довольно высоким, и модель снижает вероятность этого токена. Этот multiplier m контролирует то, насколько у нас происходит penalty. Призываю вас посмотреть, у нас есть более раскрытое доказательство всех этих вещей в самой статье.

    Это был именно token level вариант, то есть у нас всегда используются префиксы из датасета. Но так как мы хотим исправлять повторы на всей строке, потому что мы видим, что она повторяется именно когда идет декодинг «в длину», то мы также можем использовать этот objective function на всей строке, потому что для unlikelihood objective нам не требуются ___ (00:37:38) токены. Обычно проблема всей тренировки на decoded-последовательностях заключается в том, что мы не знаем, какой должен был быть правильный, потому что наш префикс уже идет не из набора данных. Но в данном случае нам не особо-то и нужен правильный токен, потому что мы точно знаем те токены, которые нам не нужны. В данном случае, к примеру, если у нас сгенерировались две повторяющиеся орфограммы, то на орфограмму мы точно знаем, что эти токены должны быть вряд ли сгенерированы, потому что мы уже сказали: we are going to crash. На вторую часть мы как раз таки применяем на каждый токен unlikelihood objective для того чтобы снизить вероятность появления каждого конкретного токена на каждом конкретного ___. (00:38:24) Такой вариант тоже может применяться вместе с likelihood. Мы берем наш мини-батч, мы просто применяем нашу MLE objective, потом мы создаем префикс с нашего мини-батча, делаем декодинг, GreedySearch или BeamSearch, и потом применяем unlikelihood модель. (00:38:43) Это можно, в принципе, сравнить с ___ (00:38:46) ориентировванными подходами, например, тот же reinforced алгоритм, где мы пытаемся апроксимировать search space несколькими стэмпами, и затем использовать какой-то reword для того чтобы отучить модель генерировать плохие сэмплы, у которых низкий reword, то есть мы пытаемся максимизировать reword. Здесь это все проще, потому что аппроксимировать матожидание, как это происходит в reinforced.

    Если у вас есть какие-то вопросы по unlikelihood, то сейчас самое время их задать, то есть вообще по ключевой идее.

    Николай Михайловский: Коллеги, пожалуйста, вопросы. Можно писать в чат, можно писать в Q&A. Влад спрашивает: «А BeamSearch делается до вычисления лосса?»

    Илья Куликов: Да, то есть BeamSearch нам задает просто цепочку, которую мы используем, а затем мы делаем еще один forward propagastion по этой цепочке и вычисляем сам лосс, совершенно верно.

    (00:40:02)

    Николай Михайловский: Я, скорее, прокомментировать хочу, нежели чем задать вопрос. Та конструкция, которая сейчас описана, с unlikelihood, она структурно похожа Triplet Mining или Contrastive Learning. У нас имеются положительные примеры, у нас имеются отрицательные примеры, и мы создаем loss для обучения из некоей комбинации положительных и отрицательных примеров. Такой вопрос-предложение: а нельзя эту штуку продвинуть дальше в сторону Triplet Loss? Там же есть и стратегии майнинга отрицательных примеров. от которых сильно зависит эффективность того, что получается.

    Илья Куликов: Есть одна из работ как раз таки тоже из соседней группы в Facebook, которая называется Energy Based Text Generation, где они как раз таки пытались сформировать… они сформировали, но там суть в том, что для того чтобы получилась Energy Based модель, нам как раз таки нужно аппроксимировать partition-функцию в знаменателе, и это как раз таки очень похоже на Contrastive Loss. Это не такая простая задача, когда дело доходит до sequence level подхода, если у нас нужно просто сгенерировать токены, это да, это можно сделать. А вот когда мы хотим сгенерировать такие негативные последовательности, и чтобы их было много, и чтобы они аппроксимировали хороший такой участок search space, который нам необходим, это уже нетривиально, но, наверное, как-то можно.

    Насчет того, думали ли мы продвинуть ___ (00:41:49) лосс, думали, но так дело и не дошло до этого, потому что другие проекты начались. На самом деле, есть довольно много работ, которые продвигают для ___ для других тасков, для реранкинга, для non-autoregressive generatrion, и работают хорошо. Хотя очень многие, в принципе, считают, что эта работа – это просто такой лигалайзер, который не стоит, в общем-то, публикации, сейчас вы услышите такие комментарии. Но раз работает, то почему бы и нет?

    Николай Михайловский: Вадим Фомин спрашивает: «Напишите куда-нибудь название статьи с Facebook про Energy Based». В чат.

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

    Николай Михайловский: Познакомьте меня с ним.

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

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

    Илья Куликов: К слову, код на все это опубликован, и можете использовать его. Единственное, на каждый таск есть некоторые… Чаще всего есть трюки, а точнее, такие детали о том, как аккуратно именно сформировать этот BeamSearch-ответ и правильно посчитать лосс. Чаще всего, когда я помогал делать этот критерий, то не работал он из-за того, что где-то не те токены использовались. и градиент не помогал, только портился, есть такая вещь. Потом я как раз покажу следующую статью, где это применяется в диалогах, и там это показало себя.

    Давайте я продолжу. Дальше мы идем к экспериментному протоколу. Мы использовали датасет Wiki Text 1.03, и модель была – большой 16-слойный трансформер. Для метрик мы использовали token level метрики, такие, как perplexity, повторение токена на каждом таймстэпе, количество уникальных токенов.

    (00:45:02)

    На уровне последовательности мы считали количество повторений энграмм, а затем мы, естественно, human evaluation, который является самым важным, именно чтобы понять, насколько синтетически имеют смысл те вещи, которые генерируются нашей моделью с таким рисерчем после тренировки на ___. (00:45:19)

    Получилось так, что сверху вы видите то, как выглядит continuation на данный префикс с Baseline-моделью и с unlikelihood-моделью. И там, и там использовалось в данном случае, насколько я помню, GreedySearch, то есть это просто жадный поиск, и как видите, с unlikelihood повторяющиеся строки, в принципе, практически исчезают. Появляются некоторые токены, но они могут повторяться, как какие-то предлоги, артикли, то есть на самом human-уровне в наборе данных тоже повторы есть, но они просто в очень малом количестве. Если мы смотрим именно метрики, то мы видим, что unlikelihood на токен-уровне может даже самую малость улучшить perplexity, но мы не посчитали это за какое-то достижение здесь. На sequence-уровне unlikelihood может немного ухудшить perplexity, но при этом количество повторов драматически уменьшается, что радует, и количество уникальных токенов, которые генерируются в строке, оно сильно увеличивается, и оно, в принципе, достигает уровня того, чтобы в датасете. Здесь есть две строки, Random и Repeat, потому что вместо того, чтобы считать энграммы, можно рандомно брать токены. Если мы знаем, что там что-то повторяется, то даже если мы будем их брать случайно, то что-то там получится. Мы просто проверили это в самом конце, и, в принципе, это тоже работает, хотя и не так хорошо, как с повторяющимися энграммами. По сути, эти энграммы задают своего рода reword на то, как хорошо или как плохо повторяет наша модель. Справа в таблице мы видим Human Evaluation, где мы задавали два continuation от двух моделей, и просили людей проверить, что из этого работает лучше, мы проверяли не только с простым Baseline, но еще мы делали и ___ (00:47:15) sampling, и BeamSearch с блокингом всех повторяющихся энграмм. В тот момент, когда BeamSearch блокирует энграммы, он на самом деле начинает семантически повторять текст немного другими словами, что, в принципе, не очень хорошо сказывается на самом контенте, и эти результаты нас порадовали.

    Здесь я привел несколько ссылок на то, как это использовалось в ___, (00:47:41) это то, что частично делалось нашей группой, а также в ranking/retrieval task, где мы ___, а пытаемся просто достать самых лучших кандидатов. Там unlikelihood с дополнительным ___ (00:47:58) тоже довольно=-таки сильно помогает.

    В non-autoregressive generation это также помогает уменьшить количество повторяющихся токенов, потому что в non-autoregressive generation у нас есть conditional ___ (00:48:11) на все генерируемые токены, и там проблема повторов еще сильнее видна.

    На этом тема unlikelihood закончена. Я вижу вопрос: «Опубликован код где?» В статье есть ссылка на GitHub, и там есть Fairsick-репозиторий, в котором это реализовано. Также unlikelihood-агент реализован во фреймворке ___ (00:48:39) для диалогов, это с первой статьей связано. Если вам интересно, я могу скинуть еще код, который работает еще с ___ Transformers, который просто я написал. Напишите мне на почту, пожалуйста, я добавлю вас в репозиторий.

    Теперь, у нас остается немного времени, но это более быстрая работа для того чтобы объяснить, здесь мы попытались рассмотреть проблему degenerative-последовательностей с точки зрения дизайна самой модели и теоретически разобрать то, почему модель вообще способна, а точнее, декодинг-стратегия способна в результате показать последовательность псевдобесконечной длины, то есть она никогда не останавливается. Это все началось, когда вышел GPT-3, потому что оказалось, что даже GPT-3 с BeamSearch или с GreedySearch, она повторяется, и она неспособна вообще более или менее длинное предложение составить. Здесь возникает вопрос, то ли это все-таки опять же проблема тренировки, что у нас есть этот mode mismatch, что мода на наборе данных и мода на модели не совпадают.

    (00:49:56)

    Но также возникает интересный вопрос, почему, в принципе, модель неспособна остановить этот цикл. Справа видно, как GPT-2 модель, которая была зафайнтюнина на Wiki Text 1.03, и если мы просто делаем continuation с GreedySearch, видна гистограмма распределения длин генерированных цепочек. Синенькое – это длины в наборе данных, а оранжевое – это то, что получается, когда мы генерируем на этих же префиксах. Большое число строк, оно достигает максимальной длины в 500, и оно, по сути, не останавливается, оно состоит из повторяющихся цепочек. Почему это происходит, ___ (00:50:32) вопросом, и для начала мы сделаем такой ___, чтобы вспомнить, что такое распределение на уровнях связанностей. У нас есть наши все последовательности, и в нашем конкретном наборе, в нашем конкретном таске есть определенные условия, например, ender sequence token. Ender sequence token располагается только в конце, поэтому это уже не все возможные последовательности, есть какой-то сабсет.

    Задача определения этой модели – это обучение или определение этого распределения pθ в нашем continuation, имея какой-то контекст, контекст может быть префиксом, либо, как мы уже говорили, какой-то hidden state, другой модели.

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

    Сначала мы вводим такое понятие, как incomplete-стратегия, то есть неполная стратегия декодирования, это когда на каждом таймстэмпе у нас есть строгое подмножество, более маленькое, чем весь словарь, из которого мы можем делать выбор, и все эти вероятности этого подмножества складываются в единицу. Сюда можно отнести GreedySearch BeamSearch, если Beam не равен размеру словаря, Top-k sampling, ___ (00:52:23) sampling и так далее. Только Ancestral sampling является, по сути, полным. В данном случае мы вводим понятие inconsistency языковой модели, когда вероятность бесконечной цепочки не равна 0 согласно распределению языковой модели. В данном случае если у нас есть цепочка, которая никогда не останавливается, и ее вероятность больше 0, то мы считаем, что эта модель inconsistency.

    Далее мы вводим лемму о том, что любая рекуррентная языковая модель консистентна, если хидден-вектор на конкретном таймстэмпе Т, норма этого хидден-вектора по р-норме, она ___ (00:53:17) для какого-то р, то есть у нее есть конкретные границы. Доказательство приведено в статье, пожалуйста, приветствую, если вы посмотрите. Там все основывается на том, что индуктивный байас дизайна модели именно на тех рекуррентных моделях, которые мы рассматриваем, там чаще всего нелинейная активационная функция, и какая-то нормализация используется, то в данном случае вероятность бесконечной строки всегда будет ___ (00:53:42) именно в пределе. В таком случае, почему же у нас происходит этот цикл? Он происходит потому, что, когда мы подключаем нашу констистентную модель с каким-то инкомплит-декодингом, то у нас может возникнуть тот случай, когда вероятность бесконечной строки, согласно распределению Q стратегии декодирования будет равна 1. Опять же, мы это доказали с помощью составления специального рода модели, таким образом, что ender sequence token всегда имеет самый последний ранг во всем распределении, и никогда не выбирается конкретным инкомплит-декодером ___. (00:54:26) В принципе, это возможно, такая пара модели и алгоритма, когда в принципе вероятность цепочки бесконечной длины под распределением алгоритма равна 1. Это все касается именно теоретического подхода. На практике мы понимаем, что ранг ender sequence token всегда довольно-таки далек от того, чтобы быть выбранным или сэмплированным, то у нас появляется эта проблема декодирования псевдобесконечной длины, потому что мы не можем бесконечное число декодировать, чтобы это проверить.

    (00:55:06)

    Для того чтобы пресечь эту инконсистентность, во-первых, мы попробовали просто проверить, что будет, если на каждом таймстэмпе добавлять ender sequence token в сабсет токенов, независимо от того, входит ли он в Top-k или входит ли он в BeamSearch, то есть мы его всегда докидывали внутрь. Но здесь мы рассматривали именно стохастический пример, то есть в consistent Top-k sampling на каждом таймстэмпе мы добавляем ender sequence в наш сабсет в Top-k. Внизу на картинке видно, что обычно Top-k выбирал бы три токена, B, C, D, и он бы никогда не смог выбрать ender sequence, но мы просто добавляем ender sequence внутрь, и таким образом даем возможность модели в определенный момент закончить строку. Даже если она попадает в этот цикл, то в определенный момент ender sequence token будет сэмплирован просто согласно сэмплированию.

    Но это касается только стохастического декодирования, которое, в принципе, подходит не для всех тасков. Поэтому мы подумали о том, как бы изменить дизайн модели таким образом, чтобы ранг ender sequence token в определенный момент пришел к максимуму, то есть чтобы ender sequence token стал Top Rank на всем Softmax. Для того чтобы это сделать, мы придумали вот такой Self-terminating Softmax слой, который можно добавить в любую модель. Его особенность заключается в том, что сам Softmax-модуль имеет в себе историю вероятностей и ранга ender sequence token на всех предыдущих таймстэмпах. Функциональная особенность заключается в том, что, используя этот Softmax-модуль, вероятность ender sequence token монотонно возрастает до тех пор, пока не достигнет максимума, и до тех пор, пока ender sequence не будет выбран этой моделью. Этот Softmax-модуль используется во время тренировки, и во время тренировки модель способна, так скажем, переобучить логеты (00:57:07) для того чтобы вероятность ender sequence монотонно возрастала. В статье мы доказываем, почему она монотонно, и как именно гиперпараметр эпсилон контролирует тот slope или ту скорость, с которой она возрастает. На самом деле, эпсилон – это слабость этого алгоритма, потому что он должен быть подобран в соответствии с датасетом, то есть с тем, какая средняя длина или вообще какой набор данных используется. Но в основном именно влияет на среднюю длину.

    В экспериментах мы увидели, что… Мы проводили эксперименты с ___ (00:57:42) LSTM и трансформер-моделями, на датасетах из «Википедии», и мы измеряли, как часто строка не заканчивается до максимальной длины, и то, насколько портится perplexity в данном случае, когда мы добавляем этот Softmax, чтобы посмотреть, насколько сохраняется способность языковой модели присваивать высокую вероятность набору данных.

    Здесь мы видим то, что при использовании Self-terminating Softmax на ___ (00:58:14) и LSTM мы полностью искореняем non-termination ratio, однако perplexity из-за этого как раз таки страдает. В данном случае сами модели довольно-таки маленькие, ___ и perplexity-значения очень высокие. Разница на этих perplexity-значениях не такая сильная, как, например, с 20 до 40. Но, так или иначе, есть особый эффект на perplexity, который не особо желателен, но это, видимо, эффект самого дизайна. Self-terminating Softmax.

    Справа вы можете видеть, как распределение длин изменяется в зависимости от того, как мы добавляем Self-terminating-модуль. На Daselbne-модели мы видим этот ___ (00:58:58) гистограммы, где справа мы видим большой пик бесконечных этих цепочек. Наша Data распределения датасета, оно гораздо меньше и гораздо более острое. В тот момент, когда мы добавляем Self-terminating Softmax, эпсилон 0,001, то мы практически полностью повторяем те длины, которые были использованы в датасете, и с использованием простоGreedySearch после тренировки. (00:59:24) Self-terminating Softmax учится увеличивать ранг ender sequence token в том размере, в котором это необходимо для того чтобы повторить распределение датасета.

    Также мы взяли GPT-2 модель, и зафайнтюнили ее на Wiki Text 1.03 с использованием Self-terminating Softmax, и на Baseline 37% всех цепочек уходили за пределы максимальной длины. А с Self-terminating моделью вообще все заканчивается до максимальной длины.

    (00:59:57)

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

    На этом мы заканчиваем. Мы рассмотрели сегодня, как языковые модели с авторегрессионным дизайном используются в различных тасках, и какие у них есть сложности с декодированием с использованием детерминистических стратегий. Сложности возникают с тем, что мы видим много повторов, мы видим бесконечные строки, и эти строки явно не отражают того распределения, на котором мы обучали эти модели. Мы также увидели, что огромные модели, натренированные на огромных массивах данных, особо не помогают бороться с этим. Но есть большая область рисерча в связи с этим, которая направлена на то, чтобы каким-то образом изменить поведение этих моделей, и сегодня мы рассмотрели некоторые подходы на протяжении всего пайплайна, такие как различные другие стратегии декодирования, другие критерии обучения и другой дизайн модели. Естественно, совсем другая область, к примеру, это non-autoregressive generation, и там совсем другие подходы, но это уже другая история.

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

    Николай Михайловский: Спасибо, Илья. Коллеги, пожалуйста, вопросы. Пока коллеги собираются с вопросами, у меня опять же такой комментарий, немножко даже философский. Комментарий вот в чем состоит. На самом деле, безумно интересная область, безумно интересная по следующей причине. Есть довольно тонкая игра между информацией, порядком и беспорядком. Теоретически максимум информации в случайной последовательности, но на самом деле нет. А когда мы работаем с авторегрессионной моделью, мы накладываем не случайность, но для того чтобы получить информационно содержательный текст, мы должны на самом деле быть в области случайности отчасти. Есть прекрасная статья гуманитарная Дмитрия Манина, Running in Shackles, где он и рассматривает как раз информационно-теоретические парадоксы, связанные с содержательностью и бессодержательностью текстов, в том числе стихов и тому подобных вещей. А вообще это восходит к колмогоровским работам по теории информации, когда он разделяет информацию на остаточную, когда мы разделяем все тексты на классы эквивалентности по содержанию, и у нас разделяется информация на семантическую и языковую.

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

    (01:05:04)

    Так, пока я комментировал, к нам прилетели два прекрасных вопроса. Вопрос первый: «Как организовать свою жизнь, чтобы стать таким классным специалистом, как Илья?»

    Илья Куликов: На самом деле, я даже не знаю. У меня нет конкретных историй на тему… Вообще, вся история с аспирантурой началась с того, как я получил стипендию на магистратуру в Германии, и там я совсем не знал о машинном обучении, от слова «совсем», когда прибыл туда. Но это очень быстро меня заинтересовало. Я даже не думал об аспирантуре до совсем последнего момента, до получения диплома магистра, и затем без каких-либо подвижек или связей подал несколько заявок в разные университеты на аспирантуру. Мне просто повезло, мне кажется, в том, что заявка была принята в NYU, с моим текущим… у меня два сейчас руководителя, Кингон Чо (01:06:24) и Джейсон Вестон. По сути, как-то так.

    Но, на самом деле, сам процесс обучения и ввода в тему машинного обучения в Германии тоже был довольно-таки непростым, но очень интересным.

    Николай Михайловский: Спасибо. Семен Сорокин спрашивает: «Добрый день. Я правильно понимаю, что все модели учились с нуля? По какому критерию вы останавливали обучение, чтобы начать эксперимент на inference?»

    Илья Куликов: Да, я затронул эту тему немного. Все, что делали мы… Это на самом деле важный вопрос, потому что то, в каком стейте остается модель в процессе, когда мы ее останавливаем, это влияет на то, как много она повторяет. В наших экспериментах, к примеру, на unlikelihood мы делали early stopping просто на функции ошибки. Мы смотрели, когда у нас функция ошибки на тренировочном наборе идет ниже, чем функция ошибки на валидационном, какой threshold, в тот момент мы останавливали. Есть целый огромный research на тему того, как использовать не один только point estimate в нашей модели, а много, то есть ансамбли моделей. Мы не задаем этот вопрос, но у нас в университете есть группа Эндрю Вилсона, где Павел Измайлов очень много интересных работ делает на тему того, как использовать несколько чекпойнтов в процессе тренировки для того чтобы получить байесовский ансамбль, который работает на удивление хорошо также и на языковых моделях. Но на этом мои полномочия все, как говорится, я особо не разбирался в этом. То, что мы делаем, это простой early stopping, у нас есть learning rate ___ (01:08:10) для того чтобы еще уменьшать или регулировать learning rate, но остановка идет по валидационной ошибке.

    Еще скажу так, что языковые модели на файнтюнинге, они… также мы делали файнтюнинг, особенно GPT-2 моделей, там также остановка шла на лосс, на validation loss.

    Николай Михайловский: Алексей Боярский нас спросил: «Весь код опубликован, а где его смотреть?», я ему уже отправил ссылку на вашу статью, и, надеюсь, всем. Я не знаю, те ответы, которые в Q&A отправляются, видны они всем или нет, но в любом случае, я думаю, по результатам мы разошлем презентацию, а также видео, и там будут ссылки на эти статьи тоже.

    Пожалуйста, еще вопросы. Олег Рубан спрашивает: «В моделях GPT какие из параметров генерации текста, repetition penalty, temperature, ___ (01:09:38) KP лучше настраивать для избегания повторений в генерации? Насколько сильно увеличение repetition penalty может быть связано с вашими результатами улучшения?»

    (01:09:57)

    Илья Куликов: Как раз таки все, что касается, например, кода ___ на GPT-2, там действительно есть очень много гиперпараметров на функцию generate, которые могут делать различные ограничения на генерацию, чтобы делать меньше повторов, чтобы делать меньше каких-то несвязных цепочек, или чтобы делать более разнообразные цепочки с помощью стохастического сэмплинга. На моем опыте, мы когда делаем… для того чтобы сравнивать наши подходы с бэйзлайнами, нам подобрать такие параметры, чтобы они работали лучше всего на конкретный task. На каждом таске это свое. К примеру, на conversational modeling в основном используется BeamSearch, где минимальная длина ответа ставится довольно-таки большой, то есть минимальная длина BeamSearch ставится, скажем, 15 токенов, для того чтобы не выводить слишком короткие сообщения. Затем, это очень интересно, что в тот момент, когда BeamSearch пройдет через все эти короткие сообщения о своем search space, то следующие сообщения, они будут довольно-таки интересные и не такие повторяющиеся. Чтобы подробнее это изучить, советую статью из группы Джейсона Вестона, которая называется ___, (01:11:19) это их статья по эндер-бот. Я просто напишу сюда, по эндер-бот, можете на архиве найти, там они разбирают на примере перевода, у них тоже, по сути, огромная GPT-like модель для ___. (01:11:34) Они там попробовали все. У меня складывается ощущение, что все от таска зависит. Если вы хотите с саммаризацией, например, там совсем другой характер выходных цепочек и другие требования. ___, (01:11:49) то же самое, здесь другие требования, и в каждом случае все по-разному настраивается. Это, по крайней мере, то, как я это вижу.

    Но мне лично сам этот подход с ограничениями не так интересен, потому что сама подоплека того, насколько разное распределение модели с данными, насколько есть mismatch между распределением модели, распределением декодирования без ограничений, вот что мне очень интересно, и в чем кроется. Потому что сам критерий в теории не должен к этому приводить, но практически это происходит, и меня очень… как мой research-путь, мне очень интересно исследовать различные аспекты этого процесса обучения, о чем мы сегодня говорили.

    Николай Михайловский: Хорошо, Илья, спасибо. Пожалуйста, коллеги, еще вопросы, комментарии, предложения. Анонимный посетитель спрашивает: «То есть лучше правильно учить, чем правильно декодировать?»

    Илья Куликов: Я бы сказал, что это вопрос этики, что хорошо, что плохо. Но лично мне кажется, что если у нас есть процесс обучения, который позволяет обучить саму модель так, что ее распределение можно использовать без каких-либо костылей или фиксов наверху, то есть с помощью стратегии декодирования, то это открывает больше возможностей. К примеру, мы знаем, как хорошо работает Transfer Learning, имея какую-то базовую модель, мы можем ее дообучить на новых данных. Если бы мы умели дообучать таким образом, что нам бы не пришлось бороться с этими повторами, с какими-то domain mismatches, то это открывает очень много интересных также и бизнес-вариантов решения, потому что в данный момент, насколько я вижу, Transfer Learning – это новая такая эра в плане retrieval, в плане каких-то допмкомпонент, какие могут быть в кратчайшие строки в кратчайшие сроки доставлены покупателю. Используя огромную модель и очень маленький массив данных от вашего клиента, вы можете быстро сделать модель, которая удовлетворит все его потребности, без этого, знаете, domain экспертного подхода, то есть вам не нужно будет подсчитывать, какой k использовать, какое repetition penalty и так далее. Так что я бы сказал, здесь, конечно, с моей точки зрения, это более, скорее, на long-term prospective более полезно заниматься всем подходом, всем pipeline, не только декодированием. Это не только обучение, но мы еще и про дизайн говорили, там еще Data Gathering процесс есть. Это все является важным.

    (01:15:04)

    Николай Михайловский: Похоже, вопросов больше нет. Илья, еще раз спасибо.

    Илья Куликов: Пожалуйста.

    Николай Михайловский: Надеюсь, что в ваших новых проектах вы тоже что-то интересное сделаете, нам расскажете.

    Илья Куликов: Очень надеюсь. Спасибо.

    Николай Михайловский: До свидания.

    (01:15:22) (Конец записи)