>>1.00<<>>1.00<<Видео проигрыватель загружается.Воспроизвести видеоВоспроизвестиБез звукаТекущее время 0:00/Продолжительность 6:24Загрузка: 0.00%0:00Тип потока ОНЛАЙНSeek to live, currently behind liveОНЛАЙНОставшееся время -6:24 1xСкорость воспроизведения2x1.75x1.5x1.25x1x, выбрано0.75x0.5xГлавыГлавыОписанияОтключить описания, выбраноСубтитрынастройки субтитров, откроется диалог настройки субтитровСубтитры выкл., выбраноЗвуковая дорожкаPicture-in-PictureПолноэкранный режимThis is a modal window.Начало диалоговго окна. Кнопка Escape закроет или отменит окноТекстColorБелыйЧерныйКрасныйЗеленыйСинийЖелтыйПурпурныйГолубойTransparencyПрозрачностьПолупрозрачныйФонColorЧерныйБелыйКрасныйЗеленыйСинийЖелтыйПурпурныйГолубойTransparencyПрозрачностьПолупрозрачныйПрозрачныйОкноColorЧерныйБелыйКрасныйЗеленыйСинийЖелтыйПурпурныйГолубойTransparencyПрозрачныйПолупрозрачныйПрозрачностьРазмер шрифта50%75%100%125%150%175%200%300%400%Стиль края текстаНичегоПоднятыйПониженныйОдинаковыйТеньШрифтПропорциональный без засечекМоноширинный без засечекПропорциональный с засечкамиМоноширинный с засечкамиСлучайныйПисьменныйМалые прописныеСбросить сбросить все найстройки по умолчаниюГотовоЗакрыть модальное окноКонец диалогового окна.
Трансформер, для задач преобразования последовательностей, обладает всеми преимуществами предыдущих архитектур, при этом отлично распараллеливается, учитывается весь контекст каждого слова, зависимости любой длины учитываются за одинаковую цену. Остаётся одна проблема, о которой мы в этой лекции ещё не говорили. Она касается того, как именно мы обучаем всю эту архитектуру и как именно мы декодируем результирующую последовательность. Кстати, несмотря на то, что, в настоящей лекции, я попытался подать материал так, как будто мы постоянно что-то улучшаем, переходим к более совершенной архитектуре, в жизни всё может оказаться не так просто, и разные архитектуры в разных случаях (в разных ролях) могут оказаться лучше или хуже[1] — например, табличка на слайде показывает сравнение моделей для машинного перевода между английским и французским языком, причём в моделях использовался энкодер и декодер разной архитектуры. Transformer — это трансформер, модель с внутренним вниманием, а RNMT — это LSTM многослойная. И, как мы видим, самое лучшее качество, пусть и с относительно небольшим отрывом, достигается тогда, когда кодируем исходную последовательность мы с помощью трансформера, а декодируем с помощью рекурренток. Таким образом, в жизни не надо прилипать к какой-то одной архитектуре, всегда имеет смысл попробовать разные варианты. Как же мы декодируем выходную последовательность? Надо вспомнить, что наша модель предсказывает на каждом шаге вероятности для очередного токена. Сначала это условная вероятность первого токена на основе входной последовательности, потом — условная вероятность каждого следующего токена при условии наблюдения входной последовательности и префикса выходной последовательности. Когда мы заканчиваем генерировать выходную последовательность, набор условных распределений складывается в совместное распределение результирующих токенов при условии всей входной цепочки. Но надо помнить, что это — распределение. То есть мы, пока что, ещё не получили никакую одну конкретную результирующую цепочку. Мы можем из этого распределения получить множество разных цепочек — хороших и не очень. Таким, образом задачу генерации текста (декодирования) можно трактовать по-разному. Например, можно просто брать сэмплы, то есть брать реализации вот этой многомерной случайной величины. А можно искать одно наиболее вероятное сочетание токенов. То есть у нас есть противоречие между правдоподобием (когда мы выбираем маленькое число очень хороших вариантов декодирования), и разнообразием (когда мы можем придумать много разных ответов на какой-то вопрос). Например, если наша модель работает как часть чат-бота. Но некоторые из этих декодированных вариантов могут оказаться очень неправдоподобными. Давайте остановимся на втором варианте задачи генерации, когда мы ищем один наиболее правдоподобный набор результирующих токенов. Точное решение этой задачи требует перебора. Эта задача — NP-полная, поэтому её не представляется возможным решить за разумное время. Иногда можно применять полностью жадное решение[2], то есть на каждом шаге всегда выбирать наиболее правдоподобный токен, идя последовательно слева направо. То есть, сначала, когда мы генерируем первый токен результирующей последовательности, предсказываем такое распределение и выбираем токен — моду этого распределения. Потом мы подставляем этот найденный (наиболее правдоподобный) токен в наш декодер, предсказываем следующее распределение вероятности и снова выбираем его моду, и так далее. Если модель обучилась хорошо, то этого может быть и достаточно. То есть, такой алгоритм может приводить к хорошим вариантам декодированных последовательностей. Однако, полностью жадное решение не позволяет "вернуться и исправить ошибку", то есть, если мы первым токеном сделали неудачный выбор (то есть, например, выбрали конец последовательности сразу), то — всё, мы дальше не идём. На практике же имеет смысл, опять же, найти некий компромисс, то есть баланс между качеством декодируемой последовательности и возможностью, вообще, такую последовательность декодировать. Один алгоритм, который может быть для этого использован — так называемый "лучевой поиск" (англоязычный термин — "beam search"). Это эвристический поиск (он, как бы, "умеренно жадный"), он относится к категории "best first алгоритмов" поиска в графах. Давайте попробуем рассмотреть этот алгоритм более подробно. Для его работы необходима следующая входная информация. Во-первых, нам нужна некоторая функция, которая будет оценивать качество наших последовательностей. Мы можем использовать (как раз) наш декодер для того, чтобы оценивать правдоподобие очередного токена, при условии наблюдения какой-то части последовательности. В результате работы этого алгоритма генерируется последовательность номеров токенов. При этом мы ожидаем, что это сочетание токенов может и не иметь наибольшую из возможных вероятностей генерации (то есть, может не иметь наилучшую оценку в смысле построенной модели), но, на практике, эти последовательности часто получаются достаточно неплохими. Во всяком случае — лучше, чем при декодировании жадным алгоритмом.
[1] Chen, Mia Xu, et al. The best of both worlds: Combining recent advances in neural machine translation. arXiv preprint arXiv:1804.09849 (2018).
[2] Жадное декодирование и декодирование через лучевой поиск (beam-search) рассматривалось в семинаре про трансформер.

К сожалению, у нас пока нет статистики ответов на данный вопрос, но мы работаем над этим.