Видео проигрыватель загружается.Воспроизвести видеоВоспроизвестиБез звукаТекущее время 0:00/Продолжительность 7:41Загрузка: 0.00%0:00Тип потока ОНЛАЙНSeek to live, currently behind liveОНЛАЙНОставшееся время -7:41 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%Стиль края текстаНичегоПоднятыйПониженныйОдинаковыйТеньШрифтПропорциональный без засечекМоноширинный без засечекПропорциональный с засечкамиМоноширинный с засечкамиСлучайныйПисьменныйМалые прописныеСбросить сбросить все найстройки по умолчаниюГотовоЗакрыть модальное окноКонец диалогового окна.
Мы видим, что, несмотря на то, что модель была очень простая и она никак не учитывала контексты, на обучающей выборке она показывает достаточно высокую f-меру (0.9). Что же на валидационной выборке? Мы видим, что на валидационной выборке macro-средняя f-мера не сильно меньше, всего лишь на 1% (0.89 — достаточно неплохо). Ранее, во вводных лекциях в этом курсе, мы говорили о так называемой частиречной омонимии. Частиречная омонимия — это когда слова "с разной частью речи" пишутся абсолютно одинаково. Например, "мама мыла раму": здесь "мыла" — это глагол. Или "в ванной не было мыла": здесь "мыла" — это уже существительное. Такие случаи принципиально невозможно отлавливать, используя только информацию изнутри слова — нам нужно учитывать контекст в предложении. Давайте опишем вторую модельку, которая учитывает такой контекст. Опять же, давайте посмотрим на метод forward. Первая часть этого метода — ровно такая же, как и в предыдущей модели. Берём номера символов, делаем выборку из таблицы эмбеддингов, получаем векторы символов. Потом, с помощью свёрточной нейросети, которая в данном случае называется "single token backbone", получаем векторы символов с учётом их контекста. Затем используем глобальный пулинг для того, чтобы получить вектор токена. Далее мы проделываем примерно то же самое, но уже на уровне токенов в предложении. Сначала мы немного изменяем форму и транспонируем тензор признаков таким образом, чтобы получить трёхмерный тензор с размерностями "количество предложений в батче", "количество признаков для каждого токена" и "количество токенов в предложении". Этот тензор содержит признаки токенов без учёта их контекста. Далее мы эти признаки подаём в другой свёрточный модуль для того, чтобы учесть это самый контекст. Для учёта контекста символов и для учёта контекста слов мы используем две разных нейросети, но архитектура их одинакова — это ровно та самая свёрточная сеть со "skip connections", которую мы описали в начале нашего семинара. Несмотря на то, что архитектура у этих модулей одинаковая, веса у них отличаются. На старте обучения они инициализируются случайно, а затем — настраиваются. В результате мы получаем также трёхмерный тензор, той же размерности, но теперь — вектор для каждого токена уже содержит информацию о его контексте. И, наконец, нам нужно принять решение о части речи каждого токена. Для этого мы проецируем признаки каждого токена в пространство классов. Для этого мы используем одномерный свёрточный блок с ядром свёртки 1, то есть он за раз видит только один токен. Физический смысл того, что мы описали сейчас, заключается в том, чтобы сначала проанализировать структуру каждого слова, найти там какие-то суффиксы и окончания (за это отвечает первая часть) а затем — смешать информацию о структуре каждого слова с контекстом, в котором это слово употребляется. Давайте посмотрим, насколько сильно это вообще влияет. Может быть, явление частиречной омонимии и не такое уж, серьёзное — может, я тут вам всё преувеличиваю. Сначала мы создаём экземпляр класса, который только что описали, и передаём туда, на самом деле, все те же самые параметры — это количество символов, количество выходных меток, количество признаков для каждого символа, но теперь это ещё и количество признаков для каждого токена (оно у нас одинаково), а также два набора параметров для свёрточных модулей. Первый набор параметров — для анализа символов на уровне каждого токена, а второй набор параметров — для анализа контекста токенов. Мы решили задать одни и те же параметры, потому что это неплохо работает. В результате мы получили нейросеть, в которой в два раза больше параметров, но по-прежнему это очень маленькое число для современных нейросетей. Далее мы используем всё тот же цикл обучения — здесь никаких существенных отличий нет. Если вы потом внимательно посмотрите на вывод обучения, вы увидите, что для второй модели, которая учитывает контекст токенов, значение функции потерь во время обучения падает гораздо быстрее и, в итоге, достигает существенно меньшего значения. Давайте сразу перейдём к метрикам качества на валидационной выборке. Здесь у нас macro f-мера, равна 0.93, а для первой модели, как мы помним, она была равна 0.89. То есть, мы получили прирост в 4%, добавив всего лишь ещё один свёрточный модуль для учёта контекста токенов. 4%, на фоне 90% — казалось бы, не очень впечатляюще. Давайте теперь посмотрим собственными глазами, в каких же случаях эти 4% действительно играют роль. Для того, чтобы вручную поэкспериментировать с обученными моделями мы сделали специальный класс "POS tagger", который принимает на вход а обученную модель, а также те же самые параметры — это отображение символов в их идентификаторы, это количество уникальных тэгов. Кроме этого, он на вход принимает отображение символов в их номера, отображение из номеров тэгов обратно в их строковое представление, а также статистики корпуса — максимальную длину предложения и максимальную длину токена. И мы создаём два экземпляра этого класса для модели, обученной на отдельных токенах, и для модели, которая учитывает контекст. Класс "POS tagger" достаточно простой. В конструктор он принимает все эти параметры, которые мы сейчас описали, и у него есть ещё метод — этот метод применяет нашу обученную модель к переданным предложениям для того, чтобы получить части речи токенов. Для того, чтобы определить части речи токенов, сначала мы токенизируем переданное нам предложение, затем делаем то, что мы делали при обучении — а именно, перекладываем информацию о символах в тензор, затем, в цикле, применяем нашу модель для каждого предложения. В результате применения нашей модели к каждому предложению мы получаем трёхмерный тензор, первая размерность этого тензора соответствует количеству предложений, вторая — это количество меток, а третья — это максимальная длина предложения. Таким образом, для каждого предложения и для каждого токена у нас есть распределение вероятностей по меткам. И здесь мы просто выбираем для каждого токена наиболее вероятную метку. Ну, и напоследок — мы преобразовываем полученную информацию в формат, удобный для человека, то есть мы преобразовываем номера тэгов в их строковое название.

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