Видео проигрыватель загружается.Воспроизвести видеоВоспроизвестиБез звукаТекущее время 0:00/Продолжительность 4:36Загрузка: 0.00%0:00Тип потока ОНЛАЙНSeek to live, currently behind liveОНЛАЙНОставшееся время -4:36 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%Стиль края текстаНичегоПоднятыйПониженныйОдинаковыйТеньШрифтПропорциональный без засечекМоноширинный без засечекПропорциональный с засечкамиМоноширинный с засечкамиСлучайныйПисьменныйМалые прописныеСбросить сбросить все найстройки по умолчаниюГотовоЗакрыть модальное окноКонец диалогового окна.
Итак, что мы сделали до настоящего момента? Мы загрузили датасет, мы обучили токенизатор, собственно токенизировали датасет, мы реализовали несколько базовых классов и утилит для того, чтобы выполнить обучение. То есть, это класс LanguageModel, это обёртка для трансформера, которая транспонирует тензоры и инициализирует веса, это функция потерь, это расписание для изменения длины градиентного шага. Затем мы обучили модель, используя, в качестве backbone (то есть в качестве основной нейросети) реализацию трансформера из библиотеки pytorch. Затем мы взяли два алгоритма декодирования — это "полностью жадный" и "beam search", то есть умеренно жадный алгоритм, и проверили, что, в целом, модель как-то учится и что-то генерирует. И это, в принципе, выглядит как какой-то более-менее связный текст. Хорошо, давайте пойдём дальше и теперь заменим реализацию трансформера из библиотеки pytorch на нашу реализацию. Будем строить реализацию трансформера по кирпичикам. Самый базовый кирпичик — это "механизм внимания с несколькими головами" (или "multi-head attention"). Это достаточно универсальная реализация механизма внимания, хотя и несколько упрощённая относительно той реализации, которая входит в библиотеку pytorch. На вход механизму внимания подаётся три главных последовательности. Это последовательность запросов, последовательность ключей и последовательность значений. Каждая из этих последовательностей представляется четырёхмерным тензором. Физический смысл измерений этого тензора следующий: первое — это размер батча (как обычно), второе измерение — это длина последовательности, третье измерение — это количество "голов", то есть, по сути это количество независимых механизмов внимания. "Multihead attention" можно реализовать с помощью нескольких "single head attention", то есть, с помощью нескольких простых механизмов внимания, в которых все вычисления производятся независимо и последовательно. Данная реализация "multihead attention" — она более эффективная, потому что все "головы", то есть другими словами, несколько механизмов внимания, вычисляются параллельно. Эффективнее загружаются видеокарты. Так вот, третье измерение — это количество "голов", и четвёртое измерение — это размер вектора. Если мы говорим про последовательность запросов и последовательность ключей, то у них последнее измерение должно быть одинаковое, потому что эти две группы векторов мы будем сравнивать с помощью скалярного произведения. Отдельно есть ещё тензор значений, он тоже четырёхмерный, но у него допускается другое количество элементов в последнем измерении. Кроме этих трёх основных последовательностей, в механизм внимания передаётся две маски. Первая маска — это "маска паддингов". Это прямоугольный тензор, в котором количество строк соответствует количеству примеров в батче, а количество столбцов соответствует максимальной длине примера. Этот тензор состоит из ноликов и единичек, и единичками помечаются те элементы, которые выходят за границы последовательности (то есть это "паддинги") — это те элементы, которые не нужно учитывать. Вторая маска — это маска зависимости позиций. Она одинакова для всех примеров в батче. Эта маска представляется прямоугольной матрицей. В общем случае — прямоугольной, но в нашем семинаре эту функцию мы будем использовать для реализации механизма "self-attention", то есть "внутреннее внимание", а там длина последовательности запросов и последовательности ключей одинакова (потому что они вычислены из одной и той же исходной последовательности). Поэтому, в нашем случае, это будет всегда квадратная матрица. Маска зависимости выглядит примерно вот так, как вы видите на экране. Напомню, что строки соответствуют выходным позициям, столбцы — входным позициям, нолик обозначает, что для вычисления вектора признаков для данной выходной позиции можно использовать данную входную позицию. Если в ячейке стоит −∞-\infty−∞ — это значит, что нельзя использовать данную входную позицию для данной выходной.
К сожалению, у нас пока нет статистики ответов на данный вопрос,
но мы работаем над этим.