>>1.00<<>>1.00<<Видео проигрыватель загружается.Воспроизвести видеоВоспроизвестиБез звукаТекущее время 0:00/Продолжительность 7:46Загрузка: 0.00%0:00Тип потока ОНЛАЙНSeek to live, currently behind liveОНЛАЙНОставшееся время -7:46 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%Стиль края текстаНичегоПоднятыйПониженныйОдинаковыйТеньШрифтПропорциональный без засечекМоноширинный без засечекПропорциональный с засечкамиМоноширинный с засечкамиСлучайныйПисьменныйМалые прописныеСбросить сбросить все найстройки по умолчаниюГотовоЗакрыть модальное окноКонец диалогового окна.
Всем привет! Сегодня мы реализуем своими собственными руками и обучим одну из самых простых и популярных моделей дистрибутивной семантики word2vec! Реализовывать модель будем с помощью pytorch. Итак, сначала нам нужно импортировать библиотеки, которые мы будем использовать, к ним относится numpy, matplotlib для визуализации, pytorch, а также наша небольшая библиотечка, которую мы написали специально для этого курса. Самый первый шаг — это загрузить датасет. В этом семинаре мы будем работать с англоязычным датасетом, составленным из рецептов. Нам нужны и из него только сами тексты — разметка нам не нужна. В этой ячейке мы также выполняем разбиение всего датасета на обучающую часть и на валидационную часть. Для этого мы сначала перемешиваем все предложения, а затем просто берём первые семьдесят процентов как обучение, и остальные тридцать как валидацию. Итого: у нас получается чуть больше 120 тысяч предложений для обучения — достаточно неплохо. Здесь вы можете видеть примеры предложений: первые 10 предложений. Следующий шаг после загрузки датасета — это токенизация, то есть разбиение на базовые лексические элементы. Токенизацию мы выполняем с помощью регулярных выражений. Мы уже использовали этот же алгоритм токенизации в первом семинаре про логистическую регрессию и классификацию новостных текстов. На экране вы видите те же самые 10 предложений, только после токенизации. В результате токенизации мы отбрасываем все очень короткие токены — предположительно, они не несут основного смысла. Далее, используя только обучающую подвыборку, мы строим словарь. При построении словаря мы хотим учитывать только значимые слова. Для этого мы отбрасываем слишком редкие слова, для которых мы просто не можем накопить статистику и не можем выучить их смысл — если слово встречается только один-два раза в корпусе, мы всё равно не сможем для него выучить какой-то "вектор смысла". А также мы отбрасываем самые часто встречающиеся токены — предположительно, это союзы, знаки препинания, цифры... Важный момент, про который нужно упомянуть — это добавление фиктивного токена в словарь: "токена выравнивания", так называемого. Он получает номер "ноль" и он будет использоваться для того, чтобы у нас появилась возможность объединить предложения разной длины в прямоугольный тензор. Это — часто применяемый трюк при обработке текстов с помощью нейросетей. Как мы видим, всего в нашем датасете примерно две тысячи уникальных токенов. Нейросети и компьютеры не умеют работать с текстами, как это делает человек — они работают только с числами. Нам нужно применить наш построенный словарь для того, чтобы отобразить токены (как фрагменты текста) в числа (в номера этих токенов в словаре). На экране вы видите те же самые 10 предложений, но вместо токенов здесь — их номера. Давайте посмотрим, какой длины предложения в нашем датасете встречаются. Видим, что большая часть предложений укладывается в 20 токенов. И, наконец, мы создаём специальные объекты — "датасеты" (Dataset). Они будут использоваться для того, чтобы, непосредственно, подавать данные — подавать фрагменты обучающей выборки в модель в процессе обучения. Мы хотим использовать pytorch и обучать модель, возможно, на видеокарте (особенно, если наша модель большая), а значит, нам нужно предусмотреть всё для эффективной пакетной обработки. Модель должна уметь обрабатывать сразу много предложений разной длины — "за раз". Но, с другой стороны, модели могут работать только с тензорами, а тензор — это такая "прямоугольная" конструкция, она не может иметь "неровный край". Нам нужно сделать, так чтобы все предложения имели одинаковую длину. Самое простое — это выровнять длину этих предложений с помощью фиктивных слов. Именно для этого мы вводили в словарь слово "" с нулевым идентификатором. Для того, чтобы подготавливать данные в нужном нам видео, мы используем объект PaddedSequenceDataset. Этот объект описан в нашей маленькой библиотеке, которую мы сделали специально для этого курса. Он умеет делать только две простые вещи: во-первых он может говорить свою длину (то есть, сколько предложений в нём есть, сколько текстов), а также он умеет возвращать предложение по номеру. При этом, если предложение короче некоторой заданной длины, то он добавляет нули в конец этого предложения. Или же, наоборот, если предложение длиннее установленного порога, то он его обрезает, то есть берёт только префикс предложения. Эта функция возвращает пары — а именно "текст" и "какая-то метка", которую по этому тексту нужно предсказывать. В данном семинаре мы не будем использовать метки — чуть позже я объясню, почему. Тем не менее, для того, чтобы этот объект можно было использовать в разных задачах (например, в задачах классификации), мы возвращаем и метки тоже. На экране вы видите один обучающий пример — так, как его подготовил наш Dataset. Мы видим, что это предложение состоит только из двух значимых токенов. Все остальные позиции заполняются нулями. С помощью гистограммы, которую мы построили чуть раньше, мы имели возможность выбрать оптимальную длину предложения так, чтобы и лишних вычислений не делать слишком много, и, при этом, уметь обрабатывать практически все предложения из нашего датасета. Для нашего датасета, как мне кажется, неплохо подходит порог "20". Я скажу ещё пару слов о том, зачем нам нужны эти паддинги (добавлять нули, и так далее). Видеокарты (это основные вычислители, которые сейчас используются для обучения нейросетей) умеют делать хорошо достаточно простые операции, и, при этом, они умеют делать эти простые операции параллельно. Допустим, если нам нужно перемножить две матрицы, то в видеокарте запускается четыре тысячи потоков, каждый поток из этих четырёх тысяч, по сути, делает только 1-2 перемножения, и всё — и возвращает результат. При этом мы получаем очень большое ускорение. Но проблема в том, что данные исходные у нас не лежат на видеокарте, они лежат у нас во внешней памяти на жёстком диске. Сначала мы их загружаем с жёсткого диска в оперативную память, как-то предобрабатываем (например — так, как мы это сейчас обсудили), и только потом копируем в память видеокарты. Эта процедура копирования занимает значительное время. Это гораздо дороже, чем скопировать память внутри видеокарты или внутри оперативной памяти. И поэтому мы хотим минимизировать количество переносов данных из оперативной памяти в память видеокарты, и наоборот. Для этого нам нужно объединять наши обучающие примеры в батчи (в группы), и мы описываем нашу модель, наш процесс обучения, таким образом, чтобы он поддерживал обработку нескольких обучающих примеров за раз. Естественно, чем больше данных за раз мы загрузили в видеокарту, тем более эффективно мы можем использовать возможности параллельных вычислений. Все потоки будут хорошо загружены.

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