Видео проигрыватель загружается.Воспроизвести видеоВоспроизвестиБез звукаТекущее время 0:00/Продолжительность 5:26Загрузка: 0.00%0:00Тип потока ОНЛАЙНSeek to live, currently behind liveОНЛАЙНОставшееся время -5:26 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%Стиль края текстаНичегоПоднятыйПониженныйОдинаковыйТеньШрифтПропорциональный без засечекМоноширинный без засечекПропорциональный с засечкамиМоноширинный с засечкамиСлучайныйПисьменныйМалые прописныеСбросить сбросить все найстройки по умолчаниюГотовоЗакрыть модальное окноКонец диалогового окна.
Отлично! Наконец, мы можем начать тренировать нашу модель. На каждой итерации будем печатать перплексию (увидеть разницу в перплексии гораздо проще, чем в кросс-энтропии, поскольку она по порядку больше). На каждой итерации мы будем печатать перплексию, а в конце каждой эпохи будем проверять, получила ли наша модель score лучше, чем во всех предыдущих эпохах. Если это произошло, мы обновим переменную best_valid_loss и сохраним параметры лучшей модели с помощью вызова функции state dict. Потом, когда мы будем оценивать качество моделей на тестовой выборке, загрузим параметры той модели, которая давала наилучший валидационный score (сделать мы это сможем с помощью вот этого кода). Давайте более внимательно посмотрим на процесс обучения модели. На GPU модель обучалась очень быстро. Вы можете увидеть, что время на обучение одной эпохи составило меньше одной секунды (это просто замечательно). Если обучать на CPU, то времени это займёт достаточно много — на одну эпоху будет уходить примерно 10-20 секунд, в зависимости от конфигурации компьютера, на котором это обсчитывается. Давайте посмотрим, что происходило с лоссом на обучении и валидации. На обучении наш лосс падает, на валидации — тоже. При этом, если мы посмотрим, что происходит в процессе обучения — под конец обучения лосс на валидации практически перестаёт падать и, в принципе, выходит на некоторое плато — начинает флуктуировать. Лосс на трейне всё ещё продолжает падать, но, при этом, тоже начинает немного флуктуировать. Отлично, мы обучили модель, теперь мы можем посмотреть, какой лосс она даёт на тестовой выборке — он примерно равен лоссу на валидации и перплексия на тесте — выше, чем перплексия на обучении. В принципе, это достаточно ожидаемый результат. Теперь мы можем написать функцию, которая будет генерировать кодовый сниппет по нашему вопросу. И наконец — посмотреть, какое же качество получилось у нашей модели. Напишем функцию "translate sentence", которая будет по токенизированному вопросу выдавать ответ на этот вопрос на языке программирования. То есть, выдавать кодовый сниппет, который отвечает на наш вопрос. И, также, напишем функцию, которая будет визуализировать веса attention, то есть, мы сможем посмотреть, какие слова имеют больший вес относительно каких слов. Давайте возьмём 3 произвольных примера из обучающей, валидационной и тестовой выборки, и посмотрим, что у нас получилось. Мы берём пример из обучающей выборки. Вопрос звучит как "how to convert today daytime string back to datetime object". ОК... Ответ должен быть примерно вот таким — то есть мы должны использовать модуль "datetime", вызвать оттуда функцию "strptime". Наша сеть смогла предсказать, что нам нужно использовать функцию daytime.strptime, что достаточно хорошо, но, при этом, у неё в словаре нету вот этих чисел, которые, скорее всего, встретились в нашей выборке один или два раза, и поэтому не попали в наш словарь, и из-за этого наша сеть не может ничего написать в скобках функции — она не имеет в словаре вот этих символов. Достаточно ожидаемый результат. Если мы посмотрим на матрицу attention — мы видим, что слова datetime являются ключевыми в этом вопросе, остальные слова практически никакого веса не вносят. ОК, теперь давайте посмотрим на какой-нибудь вопрос из валидационной и тестовой выборки. Из за валидационной мы берём вопрос "python convert a tuple to string" (ОК, ответ должен быть примерно таким), Выглядит достаточно странно, но, в валидационной выборке он был именно таким. При этом, эта выборка собиралась руками, так что, наверное, какая-то логика в этом есть. Наша сеть предсказывает вот такой ответ. Он не очень логичный, и он даже синтаксически никак не согласовывается, то есть здесь закрывается круглая скобка, хотя должна бы закрыться квадратная. Так что можно считать, что это не очень хороший пример. Здесь я постаралась показать не только хорошие примеры, которые обучились плюс-минус адекватно, но и любые остальные, чтобы было видно, что, всё-таки, сеть на таком маленьком количестве данных и проучившись небольшое количество эпох обучилась неидеально. Ну и давайте посмотрим на какой-нибудь пример из тестовой выборки, например — вопрос про то, как работать с кодировками UTF-8 (кодировкой, которая помогает нам работать с русскими символами). Ответ должен быть вот таким: сначала сделать "decode", потом "encode". Наша сеть смогла предсказать decode (декодирование), но, при этом, почему-то она здесь поставила слова "soup". Возможно, как-то это коррелирует с библиотекой beautifulsoup и, как-то, нашей сети показалось, что это здесь будет уместно. Если мы посмотрим на матрицу attention, то и здесь важно было только слово "UTF" — кажется, что если говорить про декодирование то слово "UTF" очень хорошо связано со словом "soup" (видимо, это отсылка к "beautifulsoup") и со словом "decode", с остальными скобками и "unknown token" немного — тоже. В предыдущем примере матрица attention выглядела примерно так же, то есть — слово "string", которое здесь было, видимо, ключевым, по мнению нашей сети было связано достаточно плотно, практически, со всеми остальными символами в нашем примере. Но учитывая, что это не слишком удачный пример, эта матрица не несёт достаточно информации.
К сожалению, у нас пока нет статистики ответов на данный вопрос,
но мы работаем над этим.