[Перевод] Книга «Грокаем машинное обучение»

imageПривет, Хаброжители!

Машинное обучение — это набор методов анализа данных, основанных на алгоритмах, которые дают все более точные результаты по мере поступления новых данных. Машинное обучение лежит в основе систем рекомендаций, программ распознавания лиц, «умных» колонок и даже беспилотных автомобилей. Эта уникальная книга объясняет основные понятия машинного обучения на простых и доступных примерах, увлекательных упражнениях и запоминающихся иллюстрациях.

Здесь нет зубодробительного академического жаргона, для понимания объяснений достаточно знаний основ алгебры. По мере чтения вы будете создавать модели для идентификации спама и распознавания изображений и другие интересные проекты на языке Python.

Откройте для себя мощные методы машинного обучения, для понимания и применения которых достаточно знаний математики на уровне средней школы!

Для читателей, знающих основы языка Python. Знаний в области машинного обучения не требуется.

В качестве обзора книги мы предлагаем вам ознакомится с переводом статьи автора Luis Serrano.

Что такое семантический поиск?


Семантический поиск — это очень эффективный способ поиска документов по запросу. В этой статье вы узнаете, как использовать эмбеддинги и работать с показателем сходства для построения системы семантического поиска.

Что не является семантическим поиском?


Прежде чем изучать семантический поиск, давайте посмотрим, что не является семантическим поиском. До появления семантического поиска наиболее популярен был поиск по ключевым словам. Представьте, что у вас есть список из множества предложений, которые являются ответами. Когда вы задаете вопрос (формулируете запрос), поиск по ключевым словам позволяет найти предложение (ответ) с наибольшим количеством общих слов с запросом. Например, рассмотрим следующий запрос и набор ответов:

Запрос: Where is the world cup? (Где проводится кубок мира?)

Ответы:

  1. The world cup is in Qatar (Кубок мира проходит в Катаре).
  2. The sky is blue (Небо синее).
  3. The bear lives in the woods (Медведь живёт в лесу).
  4. An apple is a fruit (Яблоко — это фрукт).

При поиске по ключевым словам заметно, что в ответах содержится следующее количество общих слов с запросом:

Ответы:

  1. The world cup is in Qatar. (4 общих слова)
  2. The sky is blue. (2 общих слова)
  3. The bear lives in the woods. (2 общих слова)
  4. An apple is a fruit. (1 общее слово)

В данном случае победил ответ под номером 1: «Кубок мира проходит в Катаре». К счастью, это правильный ответ. Однако так будет не всегда. Представьте себе, что есть и другой ответ:

Where in the world is my cup of coffee? (Где в этом мире моя чашечка кофе?)

Этот ответ имеет 5 общих слов с запросом, поэтому он выиграет, если окажется в списке ответов. К сожалению, это не совсем правильный ответ.

Что мы можем сделать? Мы можем улучшить поиск по ключевым словам, удалив стоп-слова, такие как «the», «and», «is» и т. д. Мы также можем использовать методы вида TF-IDF, чтобы отличить релевантные слова от нерелевантных. Однако, всё равно всегда найдутся случаи, когда из-за неоднозначности языка, синонимов и других препятствий поиск по ключевым словам не сможет найти оптимальный ответ. Поэтому мы переходим к следующему алгоритму, который показал очень хорошие результаты: Семантический поиск.

Вкратце, семантический поиск работает следующим образом:

  • Он использует текстовый эмбеддинг для превращения слов в векторы (списки чисел).
  • Использует сходство для поиска вектора среди ответов, подбирая ответ, который наиболее похож на вектор, соответствующий запросу.
  • Выводит ответ, соответствующий этому наиболее похожему вектору.

В этом посте мы подробно рассмотрим все эти шаги. Для начала давайте рассмотрим текстовые вставки. Если вам нужно подтянуть знания о них, ознакомьтесь с этой статьей.

Как искать по текстовым эмбеддингам?


Эмбеддинг — это способ присвоить каждому предложению (или, в более общем случае, каждому фрагменту текста, который может быть коротким, как слово, или длинным, как целая статья) вектор, который представляет собой список чисел. Модель эмбеддинга Cohere, использованная в codelab для этого поста, возвращает вектор длиной 4096. Это список из 4096 чисел (другие вкрапления Cohere, например, многоязычное, возвращают меньшие векторы, например, длиной 768). Очень важным свойством вкраплений является то, что похожие фрагменты текста присваиваются похожим спискам чисел. Например, предложению «Hello, how are you?» и предложению «Hi, what«s up?» будут присвоены списки одинаковых чисел, в то время как предложению «Tomorrow is Friday» будет присвоен список чисел, сильно отличающийся от двух предыдущих.

На следующем изображении приведен пример эмбеддинга. Для наглядности: здесь каждому предложению присваивается вектор длины 2 (список из двух чисел). Эти числа отображаются на графике справа в виде координат. Например, предложению «The world cup is in Qatar» присваивается вектор (4, 2), поэтому оно откладывается в точке с координатами 4 (по горизонтали) и 2 (по вертикали).

image

На этом изображении все предложения расположены как точки на плоскости. Визуально можно определить, что запрос (представленный кубком) находится ближе всего к ответу «The world cup is in Qatar», представленному футбольным мячом. Остальные запросы (в виде облака, медведя и яблока) находятся гораздо дальше. Таким образом, семантический поиск вернет ответ «КThe world cup is in Qatar», и это правильный ответ.

Но прежде чем мы продолжим, давайте воспользуемся реальным текстовым эмбеддингом для поиска в небольшом наборе данных. Следующий набор данных содержит четыре запроса и четыре соответствующих им ответа.

Набор данных:

Запросы:

  • Where does the bear live?
  • Where is the world cup?
  • What color is the sky?
  • What is an apple?

Ответы

  • The bear lives in the woods
  • The world cup is in Qatar
  • The sky is blue
  • An apple is a fruit

Чтобы закодировать 8 этих предложений мы можем использовать эмбеддинг текста Cohere. Это даст нам 8 векторов длины 4096, но мы можем использовать некоторые алгоритмы снижения размерности, чтобы свести их к длине 2. Как и раньше, это означает, что мы можем построить график предложений на плоскости с 2 координатами. График приведен ниже.

image


Обратите внимание, что каждый запрос наиболее близок к соответствующему ответу. Это означает, что если бы мы использовали семантический поиск для поиска ответа на каждый из этих 4 запросов, то получили бы правильный ответ.

Однако здесь следует сделать оговорку. В вышеприведенном примере мы использовали евклидово расстояние, то есть, просто расстояние на плоскости. Такой пример можно обобщить и на векторы из 4096 записей (используя теорему Пифагора). Однако это не идеальный способ сравнения фрагментов текста. Наиболее часто используемый способ, дающий наилучшие результаты, — это поиск сходства, который мы изучим в следующем разделе.

Использование сходства для поиска лучшего документа


Поиск сходства — это метод, позволяющий определить, похожи или отличаются два фрагмента текста. Для этого используются текстовые эмбеддинги. Если вы хотите подробнее изучить, что такое сходство, ознакомьтесь с этой статьей. В этой статье описаны два типа сходства, используемые в семантическом поиске:

  • Скалярное произведение сходства
  • Косинусное сходство

Пока обобщим их и остановимся на том, что сходство — это число, присваиваемое каждой паре документов, со следующими свойствами:

  • Сходство между фрагментом текста и им самим — очень большое число.
  • Сходство между двумя очень похожими фрагментами текста — большое число.
  • Сходство между двумя разными частями текста — небольшое число.

В этой статье мы будем использовать косинусное сходство, для которого также верно следующее: возвращаемые значения находятся в диапазоне от 0 до 1. Сходство фрагмента с самим собой всегда равно 1, а наименьшее значение, которое может принимать подобие, — 0 (когда два фрагмента текста не имеют ничего общего).

Теперь, чтобы выполнить семантический поиск, достаточно вычислить подобие между запросом и каждой парой предложений и вернуть предложение с наибольшим подобием. Давайте рассмотрим пример. Ниже приведен график косинусного сходства между 8 предложениями из приведенного выше набора данных.

image


На этом графике масштаб указан справа. Обратите внимание на следующие свойства:

  • Диагональ заполнена единицами (поскольку подобие между каждым предложением и самим собой равно 1).
  • Сходство между каждым предложением и соответствующим ему ответом составляет около 0,7.
  • Сходство между любой другой парой предложений меньше.

Это означает, что если бы вы искали ответ, например, на вопрос «What is an apple?» (Что такое яблоко?), семантический поиск вычленил бы предпоследнюю строку таблицы и зафиксировал, что сильнее всего схожи предложения «What is an apple?» (сходство равно 1) и «An apple is a fruit» (сходство равно около 0,7). Система исключит одинаковые запросы из списка, так как не захочет отвечать на тот же вопрос, что и заданный. Таким образом, победителем будет ответ «An apple is a fruit» (Яблоко — это фрукт), что является правильным ответом.

Здесь есть скрытый алгоритм, о котором мы не упомянули, но который очень важен: алгоритм поиска ближайших соседей. Вкратце, этот алгоритм работает так: находит ближайшего соседа для точки в наборе данных. В данном случае алгоритм нашел ближайшего соседа для предложения «What is an apple?», а ответом стало предложение «An apple is a fruit». В следующем разделе будет подробнее рассказано об алгоритме поиска ближайших соседей.

Ближайшие соседи — плюсы и минусы, способы устранения недостатков


Алгоритм поиска ближайших соседей очень простой и полезный, обычно используется для классификации. В более общем случае он называется k-nearest neighbors (knn), где k — любое число. Если задача состоит в классификации, то алгоритм k-ближайших соседей просто просматривает k ближайших соседей конкретной точки данных и присваивает ей наиболее распространенную среди соседей метку. Например, если задача состоит в том, чтобы классифицировать тональность предложения как радостную или печальную (анализ тональности), то 3 ближайших соседа будут смотреть на 3 ближайших соседа предложения (в некотором эмбеддинге). Так можно определить, относится ли большинство включений (2) к категории радостных или печальных. Это и есть метка, которую он присваивает предложению.

Как видите, как раз алгоритм k-ближайших соседей — это применялся для семантического поиска в этой статье. Задав запрос, вы ищете ближайшего соседа в эмбеддинге, и это и есть ответ на запрос. В текущих примерах этот метод работает хорошо. Однако k-nearest-neighbors — не самый быстрый алгоритм. Причина в том, что для поиска соседей одной точки необходимо вычислить расстояния между ней и всеми остальными точками в наборе данных, а затем найти наименьшее из них. Как видно на следующем изображении, чтобы найти ближайшего соседа предложения «Where is the world cup», нам пришлось вычислить 8 расстояний, по одному для каждой другой точки данных.

image


Однако при работе с крупными архивами мы можем оптимизировать производительность, слегка подкорректировав алгоритм, чтобы он стал приближенным к ближайшим соседям. В частности, поиск допускает несколько улучшений, которые могут значительно ускорить этот процесс. Вот два из них:

  • Инвертированный файловый индекс (IVD): Состоит из кластеризации похожих документов, а затем поиска в кластерах, которые наиболее близки к запросу.
  • Иерархический допускающий навигацию маленький мирок (HNSW): Начинается с нескольких точек, и поиск ведется среди них. Затем на каждой итерации добавляются новые точки, и поиск ведется в каждом новом пространстве.

Многоязычный поиск


Как вы могли заметить, производительность семантического поиска зависит от силы эмбеддинга. Поэтому любые сверхмощные эмбеддинги могут привести к сверхмощному семантическому поиску. Новый многоязычный эмбеддинг от Cohere поддерживает более 100 языков. Вкратце, эмбеддинг отправит любой фрагмент текста на любом из этих языков в вектор (на этот раз длиной 768). Схожие фрагменты текста будут отправлены в аналогичные векторы. Таким образом, можно искать запрос на любом языке, а модель будет искать ответы на всех остальных языках.

На изображении ниже вы можете увидеть пример многоязычного эмбеддинга. При эмбеддинге каждое предложение отправляется в вектор длины 4096, но, как и в предыдущем примере, используется проекция, чтобы записать этот вектор в вектор длины 2. Эти 2 записи в векторе используются в качестве координат на плоскости для построения графика.

image

В этом графике мы имеем 4 предложения на английском языке, а также их буквальные переводы на испанский и французский.

Английский:

  • The bear lives in the woods.
  • The world cup is in Qatar.
  • An apple is a fruit.
  • The sky is blue.

Испанский:

  • El oso vive en el bosque.
  • El mundial es en Qatar.
  • Una manzana es una fruta.
  • El cielo es azul.

Французский:

  • L«ours vit dans la forêt.
  • La coupe du monde est au Qatar.
  • Une pomme est un fruit.
  • Le ciel est bleu.

Как видно на графике, многоязычная модель расположила каждое предложение и два его перевода очень близко друг к другу. Вот видео, если вы хотите узнать больше о многоязычных эмбеддинге и поиске.

Всегда ли описанные задачи решаются при помощи эмбеддингов и сходства? (Нет)


В этой статье вы увидели, насколько эффективной может быть система поиска, состоящая из надежного эмбеддинга и поиска по подобию. Но является ли это концом истории? К сожалению (или к счастью?), нет. Оказывается, использование только этих двух инструментов может привести к некоторым казусам. К счастью, эти казусы можно исправить. Вот пример. Давайте немного расширим наш исходный набор данных, добавив еще несколько ответов на вопрос о чемпионате мира по футболу. Рассмотрим следующие предложения.

Запрос: «Where is the world cup?»

Ответ:

  1. The world cup is in Qatar
  2. The world cup is in the moon
  3. The previous world cup was in Russia


image


Когда мы находим их в вышеприведенном эмбеддинге, все они схожи, как и ожидалось. Однако самым близким предложением к запросу является не ответ 1 (правильный), а ответ 3. Этот ответ («The previous world cup is in Russia») является правильным утверждением и семантически близок к вопросу, но не является ответом на него. Ответ 2 («The world cup is in the moon») — совершенно неправильный, но также семантически близкий к запросу. Как видно на примере данного эмбеддинга, он опасно близок к запросу, поэтому высока вероятность того, что подобные глупые ответы выберутся на первые места в результатах семантического поиска.

Как это исправить? Существует множество способов улучшить производительность поиска, чтобы реальный ответ, который выдает модель, был идеальным или, по крайней мере, близким к идеальному. Один из них — множественные отрицательные потери ранжирования: Наличие положительных пар (запрос, ответ) и нескольких других отрицательных пар (запрос, неправильный ответ). Обучите модель вознаграждать положительные пары и штрафовать отрицательные.

В данном примере мы возьмем положительную пару (вопрос, ответ), такую как эта:
(Where is the world cup?, The world cup is in Qatar.)
Мы также возьмем несколько отрицательных пар (вопрос, ответ), например:

  • (Where is the world cup?, The world cup is in the moon)
  • (Where is the world cup?, The previous world cup was in Russia)
  • (Where is the world cup?, The world cup is in 2022.)

Если обучить модель негативно реагировать на плохие пары (вопрос, ответ), модель с высокой вероятностью правильно ответит на вопрос.

Выводы


Семантический поиск — это очень мощный механизм подбора ответа на конкретный вопрос. Он выигрывает у поиска по ключевым словам, поскольку фактически сравнивает семантическое наполнение вопроса и ответов. Для этого используются текстовые эмбеддинги, и ответы ранжируются на основе сходства найденного ответа с запросом.

Об авторе

Луис Дж. Серрано — ученый-исследователь, работающий в области квантового искусственного интеллекта в Zapata Computing. Ранее он был инженером по машинному обучению в Google, ведущим преподавателем искусственного интеллекта в Apple и руководителем отдела контента в области искусственного интеллекта и науки о данных в Udacity. Луис получил докторскую степень по математике в Мичиганском университете, степень бакалавра и магистра математики в университете Ватерлоо и после этого работал исследователем в лаборатории комбинаторной и информационной математики Квебекского университета в Монреале. Луис ведет популярный YouTube-канал о машинном обучении с более чем 85 000 подписчиков и более чем 4 млн просмотров, часто выступает с докладами на конференциях по искусственному интеллекту и науке о данных.


Более подробно с книгой можно ознакомиться на сайте издательства:

» Оглавление
» Отрывок

По факту оплаты бумажной версии книги на e-mail высылается электронная книга.
Для Хаброжителей скидка 25% по купону — Машинное обучение

© Habrahabr.ru