Видео проигрыватель загружается.Воспроизвести видеоВоспроизвестиБез звукаТекущее время 0:00/Продолжительность 3:21Загрузка: 0.00%0:00Тип потока ОНЛАЙНSeek to live, currently behind liveОНЛАЙНОставшееся время -3:21 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%Стиль края текстаНичегоПоднятыйПониженныйОдинаковыйТеньШрифтПропорциональный без засечекМоноширинный без засечекПропорциональный с засечкамиМоноширинный с засечкамиСлучайныйПисьменныйМалые прописныеСбросить сбросить все найстройки по умолчаниюГотовоЗакрыть модальное окноКонец диалогового окна.
Теперь сформируем словарь. Задаём максимально возможный размер слоя и минимальную встречаемость слова для того, чтобы попасть в словарь. Для вопроса мы выбираем минимальную встречаемость равную "3", для сниппета с кодом — "5". Эти числа можно вариировать и постараться подобрать такие, чтобы словарь выглядел наиболее адекватно — чтобы в нём не было мусорных слов, и чтобы, при этом, не отрезались слова, которые действительно несут некоторый смысл и помогут нам обучить более адекватную модель. Кроме того, для того, чтобы использовать паддинг, "torchtext" требует, чтобы все элементы в батче были отсортированы по их длине до применения паддинга, в убывающем порядке. То есть, первая последовательность должна быть самой длинной. Отлично, после создания словарей давайте немного провалидируем наш код. Посмотрим, сколько уникальных токенов в словаре интентов и в словаре сниппетов. Оказывается, что их 754 и 551 (выглядит вполне адекватно для выборки, состоящей из чуть более чем 2000 вопросно-ответных пар). Также мы можем посмотреть на размеры наших обучающей, валидационной и тестовой выборки. Последний этап нашей простой предобработки данных — это создать итераторы. Мы хотим, чтобы итератор возвращал батчи с данными, у которых есть атрибут "src" — это тензоры, кодирующие входные предложения (вопросы на естественном языке) и атрибут "trg" (target) — это тензоры, кодирующие сниппеты с кодом. Под кодированием здесь понимается простое сопоставление токина его числовому индексу. Это соответствие, собственно, и прописано в слове. Удобно, что torchtext-итераторы умеют автоматически добавлять паддинг (делать все последовательности одной длины). Мы будем использовать "BucketIterator" (здесь), а не обычный итератор, потому что он минимизирует количество паддинга для входных и выходных предложений, что достаточно удобно в нашей задаче. Ну, и также нам нужно определить, на каком девайсе мы будем обсчитывать нашу модель. Если у вас есть GPU — замечательно, мы можем указать, на какой именно GPU мы хотим обучать (если у вас их больше чем одна). Если же её нет, модель вполне можно обучить на CPU, просто это будет чуть-чуть дольше. Но и для такой маленькой модели на таком маленьком количестве данных CPU будет вполне достаточно, чтобы получить хороший результат. Теперь давайте подробнее рассмотрим код энкодера и декодера для нашей модели. Итак, энкодер, в нашем случае — это двухслойная LSTM. В статье, которая упоминается в начале семинара, использовалась четырёхслойная сеть, но мы попробуем сэкономить время на обучении сети и обучим двухслойную сетку. Для многослойной LSTM входная последовательность идёт в первый слой сети, а скрытое состояние первого слоя используется как входная последовательность следующего слоя. Скрытое состояние первого слоя можно представить формулой, зависящей от входных токенов и от предыдущего скрытого состояния. Напомню что, в отличие от RNN, LSTM, кроме того, что берёт на вход предыдущее скрытые состояние и возвращает следующее, ещё и принимает на вход так называемое "cell state". Его обычно обозначают буквой "c". Можно воспринимать его как другой вид скрытого состояния. В итоге, конечное представление входной последовательности в виде вектора будет конкатенацией скрытого состояния и нашего cell state, которое будем обозначать буквой "с".
К сожалению, у нас пока нет статистики ответов на данный вопрос,
но мы работаем над этим.