В прошлом видео мы говорили о предобработке текста, о том, как из сырых данных получить признаковое описание, которое может служить входом для модели машинного обучения. В этом видео я расскажу о стандартных методах машинного обучения, которые стоит применить в задачах НЛП в первую очередь. Напомним постановку первого задания по программированию нашего курса — задачу классификации интентов. Нам дано некоторое обращение пользователя на естественном языке. Необходимо определить пользовательский интент из набора предварительно заданных классов-интентов. Оформление, командировки, выгрузка отчета, оформление отпуска и других интентов. Такая задача может быть сведена к ряду бинарных задач классификации, первая из которых будет заключаться в выделении первого интента, вторая — в выделении второго и так далее. Каждая из задач будет именно бинарной, поскольку при выделении конкретного интента у нас всего две возможных ситуации: обращение либо содержит интент, либо не содержит его. Теперь, давайте, познакомимся с моделями стандартного машинного обучения, которые позволяют решать бинарную задачу классификации. Научившись решать такие задачи мы сможем решить задачу выделения интентов. Начнем с постановки задач машинного обучения. Как мы говорили в прошлом видео, нам дана матрица объекты-признаки, строки которой соответствуют текстам, а столбцы — признакам. Все объекты нашей выборки размечены так, что у нас есть вектор правильных классов для всех объектов. В задачах НЛП большая часть признаков является индикаторами наличия определенного токина, такие признаки равняются единице, если текст содержит токин и нулю в обратном случае. Также признаки могут быть частотными. Такие признаки равны количеству вхождения токина в текст и могут принимать значение больше единицы. Возможны и более сложные признаки, примеры, которых мы приводили в прошлой лекции, но в нашем курсе мы не будем их рассматривать, даже если они присутствуют, то составляют небольшую часть признакового описания. Получается, что матрица объекты-признаки является сильно разреженной, поскольку каждый фиксированный токин будет встречаться лишь в малой части текста. Исключением являются частицы, предлоги и всевозможные часто употребляемые слова, но такие токины являются неинформативными и их необходимо удалить из признакового описания. Как именно это делать, мы рассмотрим в следующей лекции. Стоит отметить, что в задачах НЛП признаки могут формироваться с помощью в Word2Vec представлении слов, о которых мы поговорим подробно через одну лекцию. Такие признаки уже не будут равны нулю и единице, или небольшим целым числам. Они могут принимать любое значение в отрезке от минус до плюс одного. Однако, в нашем курсе мы не будем использовать такие представления для стандартных моделей, Word2Vec найдет свое применение в рекуррентных нейронных сетях. В случае бинарной задачи возможных классов всего два, которые мы будем обозначать плюс один и минус один. Задача заключается в поиске некоторой модели машинного обучения, А большое, которое по данным XY построить алгоритм А малое, который способен прогнозировать классы новых текстов, которые модель не видела при обучении. Для того, чтобы оценивать построенный алгоритм А малое используется либо отложенная выборка, либо кросс-валидация. Под точностью модели мы будем понимать долю правильно классифицированных обращений из тестовой выборки. Применение отложенной выборки предполагает разделение данных XY на обучающую и тестовую часть. На обучающей выборке происходит обучение модели, а на тестовой определяется ее точность. Использование кроссвалидации означает повтор описанной операции несколько раз. Мы делим всю выборку XY на n частей, после чего обучаемся на n-1 части и находим точность на оставшейся. Такую процедуру повторяют n раз, после чего получают n-значение точности и усредняют результат. В этом видео мы рассмотрим следующие методы машинного обучения: логические методы, такие как решающие деревья и случайно лес; линейный алгоритм, а именно логистическую регрессию и метод опорных векторов, а также один метод, использующий теорию вероятности — наивный Байес. Каждый из методов мы будем рассматривать применительно к бинарной задаче классификации с классами плюс и минус один. При обсуждении каждого метода мы будем, по возможности, подчеркивать, какие особенности имеет данный метод применительно к НЛП задачам. Такие особенности будут основываться, как правило, на специфических признаковых описаниях, о чем мы говорили на прошлом слайде. Теперь, давайте, поговорим о каждом методе более подробно. Первым методом, о котором пойдет речь, решающее дерево или Decision Tree. На этапе обучения нужно построить дерево, в узлах которого будут находиться некоторые логические правила вида значения признака А меньше или больше порогового значения Х, а в листах — метки классов плюс один или минус один. Применительно к НЛП-задачам в случае индикаторных признаков пороговые правила будут разделять текстосодержащий конкретный токин от текстов, которые его не содержат. В случае частотных признаков, тексты разделяются по заданному значению частоты. Например, если частотный признак принимает значение ноль, один и два, то пороговое правило сможет разделить тексты, в которых признак встречается два раза от текстов, в которых признак встречается менее двух раз. Построение дерева происходит следующим образом. Изначально все объекты обучающей выборки находятся в корне дерева, затем среди всех признаков и всех пороговых значений мы выбираем такую пару, которая максимально разделит объекты разных классов. В правый узел должна попасть большая часть объектов одного класса, а в левый — большая часть другого. Затем описанная процедура повторяется и в левом, и в правом узлах. Таким образом, дерево строится либо до определенной глубины, либо до определенного количества объектов в узле дерева. Если в нем находится всего пара объектов, то нет смысла проводить дальнейшее разбиение. Метки классов в узлах дерева определяются следующим образом. После того, как дерево построено, через него пропускается все тренировочное множество, после применения ряда пороговых правил каждый тренировочный объект окажется в некотором листе. Теперь, если в листе больше объектов класса плюс один, то листу присваивается класс плюс один, если больше объектов класса минус один, то минус один. Также, для каждого листа можно определить вероятность принадлежности к классу. Если, к примеру, в нем находится 10 объектов класса плюс один и 20 класса минус один, то вероятность принадлежности классу плюс один равна 1/3 классу минус один 2/3. На этапе предсказания нам достаточно пропустить классифицируемый объект через построенное дерево и присвоить ему класс того листа дерева, в которое он попадет. А также, вероятность принадлежности этому классу. По другому сформулировать решающее правило можно в терминах разделяющих поверхности. Допустим, что признаковое описания объекта состоит всего из двух признаков. В этом случае объекты можно представить точками на плоскости, а задача машинного обучения примет вид построения некоторой поверхности, которая отделит объекты одного класса от объектов другого. В случае решающих деревьев разделяющие поверхность примет вид, как показано в левом нижнем углу слайда, разделяющие линии горизонтальны и вертикальны, поскольку классификация происходит на основе пороговых правил по конкретному признаку. Если признаковое описание состоит из большего числа признаков, то поверхность станет многомерной, но качественно картина не изменится. В Python-е алгоритм решающего дерева реализован в библиотеке Sklearn Tree. Основные параметры алгоритма это min_samples_leaf, минимальное число объектов в листе, после которого прекращается дальнейшее построение дерева, а также max_depth, максимальная глубина дерева. Плюсами алгоритма является то, что в силу использования пороговых правил метод устойчив к масштабу данных. Также метод устойчив к пропускам в данных, если мы не знаем ответа на очередной вопрос в узле дерева, мы можем перейти в ту сторону, в которую переходили чаще при классификации тренировочного множества. Другие плюсы — это интерпретируемость и невысокая сложность. Минусом является то, что в некоторых случаях структура дерева может быть достаточно сложной. Дерево может быть сильно не сбалансированным, что будет способствовать переобучению. Второй метод, который мы рассмотрим, это случайный лес или random_forest. Предположим, что у нас есть n обученных деревьев, тогда можно рассмотреть новый алгоритм, который будет брать вероятности принадлежности к классу плюс один данного объекта от каждого дерева и возвращать среднее значение вероятности. Если эта вероятность больше 0.5, то объект относится к классу плюс один, если меньше, то к классу минус один. Также, мы можем использовать не обычное усреднение, а некоторое взвешенное среднее придавая одним деревьям больший вес, чем другим. Используемые деревья строятся следующим образом: по имеющемуся тренировочному множеству мы выбираем случайное подмножество объектов и случайное подмножество признаков. По полученному подмножеству и строится решающее дерево. Повторяя описанную операцию n раз мы получаем n деревьев, на основе которых происходит классификация. В Python-е алгоритм реализован в библиотеке Sklearn.ensemble. Основными параметрами являются n_estimators, количество деревьев в ансамбле, а также параметр oob_score. Последний позволяет оценить точность каждого дерева на отложенных данных, которые не принимали участие в обучении. Благодаря этому мы можем оценить значимость деревьев в ансамбле, а также значимость признаков, которые этим деревом используются. Алгоритмы случайного леса обладают всеми плюсами решающего дерева. И, кроме того, за счет усреднения ответов позволяет снизить риск переобучения. Минус алгоритма в том, что из-за использования ансамбля теряется интерпретируемость. Теперь становится сложно аргументировать, почему мы предсказали тот класс, а не иной. Перейдем к линейному алгоритму. Общая идея таких алгоритмов в следующем: объекты обучающей выборки, как мы и говорили ранее, представляют собой точки некоторого многомерного пространства и наша задача — построить поверхность, которая бы отделила точки одного класса от точек другого. Суть линейных алгоритмов заключается в поиске именно линейных разделяющих плоскостей. На плоскости это будут разделяющие прямые, а в пространстве — разделяющие плоскости, а в многомерном пространстве — гиперплоскости. Напомним, что любая линейная плоскость задается уравнением — скалярное произведение b на Х минус b равно нулю. Следовательно, чтобы понять, где находится точка многомерного пространства относительно линейной плоскости, нужно всего лишь посмотреть на знак выражения, которое находится слева от равенства. Если оно больше нуля, то точка находится в высшей гиперплоскости, если меньше, то ниже. Так и происходит классификация. Так что цель линейных методов сводится к поиску вектора коэффициентов W и константы b, определяющих гиперплоскость. Стоит отметить, что в задачах НЛП, поскольку большую часть признаков составляют индикаторные и частотные признаки, то положение точек сильно ограничены. Например, если все признаки является индикаторными, то точки могут располагаться лишь в вершинах квадрата, поскольку компоненты вектора могут принимать только значение ноль или один. Это важно учитывать анализируя работу линейного алгоритма применительно к НЛП-задачам. Общим плюсом линейных алгоритмов является понятный геометрический смысл, а также интерпретируемость вектора весов W. К примеру, если в ходе обучения получилось так, что первая компонента этого вектора очень мала или равна нулю, то это означает, что первый признак либо очень слабый, либо вообще не участвует в построении разделяющей плоскости. Если компоненты имеют большое положительное значение, то это говорит о том, что признак вносит высокий вклад в класс плюс один, отрицательное — вклад в минус один. В связи с этим на линейный алгоритм можно посмотреть как на некоторое голосование, (i) признак голосует с весом W(i), все голоса складываются и в зависимости от знака суммы принимается решение о классе объекта. При этом, в НЛП-задачах за счет разреженности признаков мы имеем небольшое количество голосующих токинов-признаков. Иногда вполне возможно отследить вручную, какой признак внес свой вклад в каждый класс. Другим плюсом линейных алгоритмов является высокая скорость обучения. Минус алгоритма в том, что, если выборка изначально не является линейно-разделимой, любой такой алгоритм покажет низкую точность. Первым из линейных алгоритмов мы рассмотрим логистическую регрессию или Logistic Regression. В логистической регрессии веса настраиваются с помощью градиентного спуска, таким образом, чтобы минимизировать число ошибок на обучающей выборке. Подробнее о градиентном спуске мы поговорим в видео про нейронные сети. При этом, возможно, число ошибок на тренировочном множестве будет небольшим, но на тестовом множестве алгоритм покажет низкую точность. Такой эффект называется переобучение. Чтобы избежать этого эффекта к минимизируемой функции добавляется слагаемое зависящее только от вектора W, что позволяет бороться с переобучением. Добавленное слагаемое называется регуляризатором, а сам процесс борьбы с переобучением таким способом — регуляризацией. Более подробно мы поговорим об этом, когда речь пойдет о нейронных сетях прямого распространения. Одним из важных преимуществ логистической регрессии является то, что на выходе алгоритма мы имеем оценку вероятности отнесения текста к определенному классу. Оценка вероятности получена по формуле, которую вы видите на экране. В Python-е алгоритм реализован в библиотеке с Sklearn.linear_model. Одним из основных параметров алгоритма является С, константа регуляризации. Константа влияет на уровне регуляризации, чем она больше, тем сильнее мы боремся с переобучением. Вторым важным параметром является Penalty, вид регуляризатора, того слагаемого, которое мы добавляем к минимизируемой функции. Другой линейный алгоритм — это метод опорных векторов или Support Vector Machine. Если выборка линейно разделима, то разделяющая линейная поверхность будет занимать центральную часть самой широкой из возможных полос проведённых между точками разных классов. В случае, если выборка линейно не разделима, то поверхность строится так, чтобы с одной стороны максимизировать расстояние до объектов выборки, с другой — минимизировать количество ошибок при классификации. В Python-е алгоритм реализован в библиотеке Sklearn.svm. Одно из основных преимуществ метода опорных векторов состоит в том, что мы можем строить нелинейные разделяющие поверхности. Для этого используется параметр Kernel, в котором задаётся тип желаемой поверхности. Другие важные параметры это константа регуляризации, вид регуляризатора и флаг, показывающий, нужно ли возвращать вероятности предсказания. В заключении рассмотрим вероятностный метод наивный Байес или Naive Bayes. На самом деле, цель каждого алгоритма машинного обучения в задачах НЛП — найти вероятность принадлежности текста к данному классу. Нам известен текст, определены его признаки токина, соответственно, мы можем поставить задачу определения условной вероятности принадлежности текста к данному классу при условии наличия данных признаков, а затем выбрать класс с наибольшей вероятностью. Такие условные вероятности сложно считать напрямую, поэтому используют формулу Байеса, которую вы видите на экране. Знаменатель формулы можно опустить, поскольку он не зависит от класса Y, по которому происходит максимизация. Формулу расчета вероятности принадлежности текста к классу можно свести к более простой форме, используя гипотезу независимости. Это означает, что в нашем предположении все токины-признаки независимы. Информация о том, что в тексте встречается один токин, никак не влияет на вероятность встретить другой. В итоге, мы получаем формулу, которую вы видите в нижней части экрана. Участвующие в ней величины легко настраиваются по обучающей выборке. Вероятность класса Y можно задать относительно частотой класса Y в обучающей выборке, а вероятность (i) токина при условии класса, в отличие от первоначальной формулы, уже поддается моделированию. В простейших случаях такую вероятность можно задать равной относительной частоте (i) токина в классе Y. В более сложном варианте можно считать, что токин имеет, к примеру, распределение Бернули. В Python-е алгоритм реализован в библиотеке Sklearn.naivebayes. Плюсом алгоритма является то, что параметры алгоритма могут быть вычислены по небольшому количеству обучающих данных. Однако, в случае, если признаковое описание объекта содержит зависимые токины, то метод может показать низкую точность, поскольку нарушено одно из условий, которое мы использовали при выводе формул. На этом обзорная лекция по алгоритмам стандартного машинного обучения закончена. Вы сможете применить каждый из описанных методов в первом практическом задании, сравнить алгоритмы, оценить, какой из них работает лучше в данной задаче. Однако, после того, как получены результаты, появляется естественный вопрос — как мы можем улучшить результат? Возможно существует более удачный набор гиперпараметров, при котором будет достигнуто более высокая точность. Может быть можно объединить ответы нескольких алгоритмов и также получить более высокую оценку. Возможно мы выбрали неудачное признаковое описание и плохой результат связан именно с этим. Обо всех этих вопросах мы поговорим в следующем видео.