Автор: Софья Пенева

Машинное обучение (ML) и искусственный интеллект (AI) — два термина, которые из-за своего футуристического подтекста снискали себе огромную популярность. Оба они обладают привлекательным качеством, заставляя людей, которые их используют, звучать умно, и поэтому широко используются, несмотря на то, что они малопонятны. Чего я надеюсь достичь с помощью этой статьи, так это пролить свет на ML, одновременно пытаясь избежать использования греческих букв в меру своих возможностей.

Так для чего на самом деле используется ML?

Подумайте о своем разделе рекомендаций YouTube. Чем больше видео вы смотрите, тем больше предложений оно вам предложит. Другими словами, чем больше вы взаимодействуете с платформой, тем больше она УЧИТСЯ. Это сталкивает нас с ключевым компонентом, который делает возможным машинное обучение, — данными. Помимо данных нам также нужен шаблон и отсутствие математической формулы, которая бы решала нашу задачу, но без двух последних элементов мы можем обойтись, тогда как без структурированной и актуальной информации обучение, к сожалению, невозможно. Это почему?

Что ж, позвольте мне сказать так: если шаблона нет, вы можете пытаться учиться столько, сколько хотите, но единственное знание, которое вы приобретете, это то, что шаблона нет. С другой стороны, если есть волшебная математическая формула, которая дает ответ на ваш вопрос, машинное обучение сделает свое дело, но вам было бы лучше просто использовать формулу. Так что в обоих случаях машинное обучение может помочь, но в последнем случае, откровенно говоря, это будет просто пустой тратой времени. И, наконец, что произойдет, если у нас не будет данных? Ну, это тупик. Как мы учимся, не имея ничего, чему можно было бы научиться? Видеть? Это просто невозможно.

Ладно, хватит ходить вокруг да около. Предположим, у нас есть данные. Что нам с этим делать?

Вернемся к примеру с YouTube. Вы, как пользователь, можете быть представлены в виде вектора характеристик, таких как [0,4, 0,67, 0,25, …], где каждое значение в векторе представляет, насколько вам что-то нравится в процентах (например, вам нравится только 40% видео с комментариями). , 67% смешных видео, 25% видео научной тематики и так далее). Точно так же видео можно представить в виде вектора. Например, вектор [0,7, 0,9, 0,16, …] говорит нам, что это видео на 70% состоит из комментариев и так далее. Фактор соответствия между двумя векторами даст пользовательский рейтинг для конкретного видео. Звучит здорово, но это не обучение. В этом случае у нас уже есть знания как о симпатиях и антипатиях пользователя, так и о содержании видео. Но как мы дошли до этого этапа? Мы заполняем векторы совершенно случайными значениями, а затем машина попытается извлечь реальные значения, используя уже имеющиеся у нас рейтинги.

Давайте рассмотрим, как происходит этот процесс «обучения» с моделью, которая классифицирует изображения.

Чтобы проиллюстрировать основы линейной классификации изображений, мы будем использовать набор данных CIFAR-10 в качестве примера. Набор данных CIFAR-10 состоит из 60000 цветных изображений 32×32 в 10 классах, по 6000 изображений в каждом классе. Есть 50000 обучающих изображений и 10000 тестовых изображений.

Мы стремимся обучить модель, которая при получении изображения, представляющего один из этих 10 классов, сможет правильно его классифицировать. Мы можем построить изображение f: X → Y, где X — векторное представление изображения, а Y∈ (0;9) (где значение y соответствует единице из 10 классов в наборе данных).

Прежде всего, как нам получить вектор из изображения?

Изображение представляет собой просто сетку чисел от 0 до 255, например 32x32x3 для 3 каналов RGB. Затем эта матрица может быть преобразована в 3072-мерный вектор. Поскольку мы описываем линейный классификатор, как следует из названия, мы собираемся использовать некоторую линейную функцию для классификации наших изображений. Итак, образ f: X → Y будет выглядеть так: Y = g(WX + b). Значения в матрице W называются весами, буква «b» в векторе означает смещение, а g — некоторая функция.

Умножение этой матрицы 1 × 3072 на матрицу 3072 × 10 и добавление 1 × 10 приведет к 10-мерному вектору «оценок». Цель состоит в том, чтобы сгенерировать эту матрицу 3072×10 таким образом, чтобы наибольшее значение в векторе 1×10 располагалось по индексу, соответствующему классу изображения. Таким образом, функция «g» получит индекс максимального значения из вектора результатов.

Но как нам создать матрицу и смещение, которые, по-видимому, содержат ключ к нашему линейному классификатору?

Как упоминалось выше, изначально наши матрицы создаются путем генерации случайных значений, которые затем необходимо оптимизировать. Это, однако, поднимает другой вопрос.

Как мы оцениваем, насколько хорошо работает наша модель, чтобы провести какую-либо оптимизацию? Здесь мы ищем функцию потерь. Функция потерь сопоставляет решения с связанными с ними затратами, и ее также можно рассматривать как функцию ошибок.

Определим функцию как:

где i — индекс текущего изображения, j — текущий класс, s — вектор оценок, а yi — индекс правильного класса для текущего изображения.

Давайте рассмотрим пример, в котором вектор, представляющий корабль, умноженный на вес, дал вектор оценок [3.2, 5.1, -1.7]. Это неправильно классифицировало наш образ как лошадь. Теперь давайте посчитаем потери для этого изображения.

Потери = макс (0, 5,1–3,2 + 1) + макс (0, -1,7–3,2 + 1) = 2,9

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

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

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

В настоящее время классификаторы изображений широко используются с точностью около 95%. Конечно, гораздо больше уходит на обучение модели, чтобы добиться таких результатов. В нашем примере мы основывали наши выходные данные только на одном наборе весов, но на самом деле сверточные нейронные сети (CNN) имеют много слоев, каждый из которых ищет какую-то определенную функцию на изображении. Например, один слой может проверять, есть ли на изображении уши, другой — искать голову с ушами и так далее.

Отличный пример использования классификации изображений можно найти в распознавании эмоций UserTribe. UserTribe — это платформа, которая помогает компаниям собирать информацию о своих проектах от клиентов. Lab08 работает на платформе UserTribe уже почти 2 года, разрабатывая новые функции и следя за тем, чтобы этот продукт опережал своих конкурентов. Благодаря тестированию видеомагнитофонов компании могут понять, что их пользователи думают о них и о том, что они создают. Чтобы создать автоматический отчет о чьем-либо мнении на основе видео, UserTribe использует машинное обучение для извлечения настроений из сказанного, но также делает еще один шаг вперед и анализирует выражение лица клиента, когда он взаимодействует с продуктом, добавляя экспертов по социальной антропологии. смесь.

Аналогично нашему примеру с десятью классами из набора данных CIFER-10 UserTribe распознает 7 различных эмоций. Их модель была обучена на 30 000 изображений и достигла точности SOTA 95% при тестировании на наборе данных CK+. Каждое видео преобразуется в 1 кадр/с (кадры в секунду), поскольку определение эмоций на лице в каждом кадре было бы избыточным и очень неэффективным. После этого каждый кадр классифицируется по модели, состоящей из 19 сверточных сетей с функцией активации softmax. Функции активации в CNN — это то, что превращает нашу модель в нелинейный классификатор и, по сути, позволяет ей выполнять более сложные задачи. Но это слишком глубокий шаг для целей данной статьи. На самом деле настолько глубоко, что он входит в сферу не машинного обучения, а глубокого обучения, что является совершенно новым разговором.

София Пенева — разработчик программного обеспечения в Lab08, работающая над платформой UserTribe. Ранее она работала в SAP, а этим летом стала одним из стажеров Google, работая над проектом алгоритма Youtube. Имеет опыт работы с C++, PHP, Python, Java, MySQL, MongoDB и другими. Что касается глубокого обучения, у Софи теперь есть опыт работы с Tensorflow. Следите за новостями о машинном обучении!

Не забудьте подписаться на нас в социальных сетях, чтобы получать обновления о другом подобном контенте!

Обязательно загляните в блог Lab08, где вы найдете технические и деловые статьи.