[МУЗЫКА] [МУЗЫКА] Привет. С этой лекции мы начнем наше погружение в методы глубокого машинного обучения для решения задачи NLP. И начнем с самого начала, с вопроса «Что такое слово?». Во всех предыдущих видео мы представляли текст вектором, содержащим информацию о наличии или отсутствии некоторых слов-признаков. Таким образом, слово было представлено одним числом. При таком подходе в векторном пространстве каждому слову соответствует вектор с одной единицей и большим количеством нулей. Количество нулей зависит от размера нашего словаря. Если мы имеем дело с разговорной речью, объем такого словаря соответствует примерно 20 000 слов. Приложения для машинного перевода насчитывают до 500 000 слов в словарях. Есть примеры еще большего количества слов в словарях. Главная проблема заключается в том, что такое представление не дает понимания связи между словами. Нам бы хотелось, чтобы фразы «Прошу оформить заявку на выдачу Ipad» и «Прошу оформить запрос на предоставление планшета», определялись бы как один интент. Однако при one-hot представлении слова заявка и запрос, а также Ipad и планшет будут совершенно не связаны между собой. Решением этой проблемы могло бы быть представление слов в виде некоторых признаков, в той или иной степени им характерным. Рассмотрим, например, следующий набор слов: заявка, запрос, отказ, выдача, предоставление. И попробуем определить признаки, релевантные для этих слов. Например, является ли данное слово документом. Будем обозначать значением близким к единице, если слово обладает этим признаком и значением близким к минус единице, если термин обладает, скорее, противоположным признаком. В таком случае, термины: заявка и запрос действительно могут быть документами, а отказ, выдача и предоставление, скорее, не являются документами, а являются действиями. Следовательно, значение признака действия по ним будет близко к единице. Также можно ввести следующий признак — «Какой результат для пользователя несут эти термины?» Заявка и запрос не являются обозначением результата, а по слову «отказ» понятно, что результат, скорее, отрицательный, а у слов «выдача» и «предоставление», скорее, положительный. Можно подумать над другими параметрами. Например, является ли данный термин обозначением действия пользователя или, скорее, это ответ от сервиса, к которому пользователь обращается. Таких параметров можно придумать достаточно много. Предположим, 200. Заполнив такую таблицу из 200 строк, мы получим более компактное и одновременно гораздо более информативное, чем one-hot представление, обладающее замечательным свойством: близкие по смыслу слова, такие как, например, заявка и запрос, будут иметь близкие по значению признаки и соответствующие 200-мерные векторные представления. Следовательно, алгоритм, определяющий следующее слово во фразе, так называемая языковая модель, которую мы не будем детально рассматривать в нашем курсе, будет предсказывать примерно одинаковую вероятность того, что во фразах «Прошу оформить заявку на...» и «Прошу оформить запрос на...» следующее слово будет в выдачу. Далее мы рассмотрим алгоритм, позволяющий получить такие вектора слов. Следует оговориться, что естественно их компоненты не будут иметь такой же строгий и однозначный смысл как, например, признак — является ли слово документом или действием. Компонентам векторов, полученных с помощью такой модели, будет достаточно сложно приписать однозначный смысл. Но, в целом, полученные векторы будут обладать желаемым свойством. Близкие по смыслу слова будут иметь близкие по значениям векторы. Прежде чем перейти к тому, как получить такие векторы, полезно будет сказать, что в лингвистике значение слова определяется тем, в каком контексте оно встречается. Если, скажем, мы хотим узнать значение слова «запрос», мы можем найти в открытом доступе в Интернете тысячи случаев его употребления и изучить контексты, в которых оно встречается. Мы поймем, что такие слова, как оформить, создать, сделать, в выдачу, предоставление, чаще других встречается в контексте слова «запрос». Следовательно, мы можем использовать эту информацию о словах из контекста для определения значения слова «запрос». Прежде чем переходить к описанию непосредственно модели word2vec, рассмотрим такое понятие, как матрица векторных представлений. Допустим, мы используем словарь, состоящий из 10 000 слов. Матрица векторных представлений — это матрица E-размерностью, скажем, 200 на 10 000 каждая колонка которой соответствует векторному представлению слова. В примере на слайде слово «запрос» — это слово, стоящее в 1528 колонке матрицы E. Давайте также обозначим o с индексом 1528 как one-hot вектор, соответствующий слову «запрос». Заметим, что произведение E на o 1528 будет являться вектором размерностью 200, соответствующим 1528 колонке матрицы E. Обозначим произведение E на oj, равным ej для произвольного слова j из словаря. В задаче получения векторных представлений слов, матрица E инициализируется случайно и обучается при помощи градиентного спуска. Перейдем к описанию модели получения векторных представлений слов. Допустим, мы строим языковую модель, для того чтобы предсказывать следующее слово во фразе. Например, возьмем фразу «Необходимо получить со склада планшетный...» Давайте построим нейронную сеть для предсказания следующего слова. С помощью произведения матрицы E на one-hot вектора соответствующих слов, получим векторы Ej-тые размерностью 200. Матрицу E положим наинициализированной случайным образом. Возьмем полученные j-тые векторы и составим их вертикально в один вектор размерностью 1000 и подадим полученный вектор на вход первого слоя нейронной сети. Этот первый слой будет передавать информацию в Softmax-слой, классифицирующий между 10 000 слов словаря. В нашем примере, предположим, что в тренировочном множестве следующим словом во фразе было компьютер. Тогда задача Softmax слоя в ходе обучения — предсказать именно это слово. На практике в качестве контекста чаще используют окно фиксированной ширины. Например, четыре предшествующих слова, ширина окна в данном случае будет гиперпараметром алгоритма. Параметры модели — это сама матрица E векторных представлений слов и веса нейронов. Можно использовать стандартный метод обратного распространения ошибки для их обучения. Оказывается, что такой алгоритм уже будет давать вполне удовлетворительное векторное представление слов. Теперь немного усложним наш пример и перейдем к более общему алгоритму. Рассмотрим новую фразу. «Необходимо получить со склада планшетный компьютер для тестирования мобильного приложения». Вспомним, что значение слова определяется его контекстом, и мы можем сформулировать задачу предсказания центрального слова, например, компьютер по контексту из четырех слов слева и четырех слов справа от него. Аналогично предыдущему примеру, мы можем сконструировать нейронную сеть, на входе у которой будут векторные представления контекста, плюс-минус четыре слова слева и справа от предсказанного, а на выходе — предсказываемое центральное или целевое слово. И здесь — внимание. Удивительно, но в качестве контекста мы можем достаточно эффективно использовать всего лишь одно слово, находящееся в некоторой окрестности предсказываемого слова. Например, нам встретилось «получить», и мы пытаемся предсказать какое слово может быть поблизости. Это очень краткое описание так называемой Skip-gram модели, о которой речь пойдет ниже. Теперь давайте рассмотрим собственно алгоритм Word2vec. Начнем с одного из вариантов его постановки — модели Skip-gram. Внизу слайда приводится ссылка на оригинальную статью 2013 года авторства Томаша Миклова и его коллег из Google. Еще раз вспомним нашу фразу «Необходимо получить со склада планшетный компьютер для тестирования мобильного приложения». Давайте теперь выпишем пары слов контекст/цель по следующему принципу: случайным образом выберем слово, допустим, склад. Оно будет контекстом. Теперь в диапазоне плюс-минус пять слов выберем случайным образом другое слово, допустим, получить. Оно выступит в роли предсказуемого или целевого. Аналогично выпишем другие потенциальные пары. Например, склад, на склад, компьютер. Задача обучения с учителем, решаемая в рамках модели, — получить mapping некоторого контекста C, например, склад на целевые слова T, например, получить или компьютер. Построим нейронную сеть для решения этой задачи. Аналогично предыдущему примеру, векторное представление получается путем умножения матрицы E на вектор o. Полученный вектор ec будет подаваться на вход в Softmax слой нейронной сети, работа которого — предсказать Y с крышкой, вектор, состоящий из условных вероятностей. Давайте посмотрим более подробно, что происходит в Softmax слое. В нем производится оценка условной вероятности слова T при условии заданного контекста C, который равняется дроби, представленной на слайде. Функция потерь для Softmax будет стандартной функцией отрицательного логарифма правдоподобия. Напомню, что Y(i) — это one-hot вектор с единицей на месте, соответствующем целевому слову в словаре, а Y (i) с крышкой — это вектор такой же размерности 10 000, получаемый на выходе Softmax слоя, каждым элементом которого, является условная вероятность предсказать соответствующее слово из словаря при условии данного контекста. Таким образом модель Skip-gram состоит из матрицы E, векторных представлений и небольшой нейронной сети, состоящей из Softmax слоя. Основная проблема такой модели — это медленная скорость вычислений, поскольку на каждую итерацию обучения необходимо рассчитывать сумму по всем 10 000 слов в словаре для расчета вероятностей. Первым решением данной проблемы является использование так называемого иерархического Softmax. Вы можете прочитать об этом подробнее в оригинальной статье. Другим способом решения является использование негативного сэмплирования — negative sampling. Вспомним нашу фразу «Необходимо получить со склада планшетный компьютер для тестирования мобильного приложения». Сформулируем альтернативную задачу обучения с учителем. Сформируем пары контекст -слова таким образом, чтобы некоторые из них были действительными парами контекст-целевое слово, а другие нет. Так, например, склад и получить будут являться действительной парой. А, например, склад-яблоко — нет. Действительные пары будут формироваться аналогично предыдущей постановке задачи, а не действительные следующим образом. Слово из контекста случайным образом из имеющейся выборки, а второе слово — случайным образом из всего словаря. Для каждого слова из контекста нам необходимо будет взять одну действительную и k недействительных пар и разметить эти пары соответствующим образом, как единицы и нули. Тогда задача модели будет предсказать по паре слов, являются ли они действительной парой или нет. При этом k зависит от объема обучающей выборки. Чем больше выборка, тем меньше выбирается k. Благодаря тому, что вместо обучения Softmax на 10 000 классов мы будем решать 10 000 бинарных задач классификации, при этом на каждой итерации будем обновлять веса только в k+1 подзадачах, существенно ускоряется работа алгоритма. Итак, мы рассмотрели Skip-gram модель получения векторных представлений слов. Следует сказать, что в Python существуют специальные библиотеки для обучения векторных представлений слов, а также в открытом доступе можно скачать предобученные векторы для русского языка. Завершая рассказ о векторных представлениях слов, необходимо отметить, что существуют и другие алгоритмы их получения, такие как, например, GloVe или fasttext, обладающие своими преимуществами. Поэтому решая задачу классификации текстов, следует пробовать применять различные векторные представления или embedding и смотреть, какие дают наилучшие результаты в вашей конкретной задаче. [МУЗЫКА] [МУЗЫКА]