"Начиная"

Мультиклассовая классификация с регрессией softmax и градиентным спуском

Руководство по мультиклассовой классификации для новичков

В своей предыдущей статье я говорил о бинарной классификации с логистической регрессией.



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

На основе этих данных мы хотели предсказать, поступят ли Сары. Мы использовали логистическую регрессию, чтобы найти вероятность того, что Сара будет допущена, которая оказалась 0,665. Таким образом, мы классифицировали ее как «допущенную».

А что, если мы введем третью категорию: лист ожидания.

Вот наш новый набор данных:

Учитывая средний балл Сары 4,3 и балл на экзамене 79, можем ли мы предсказать, будет ли она зачислена, отклонена или внесена в список ожидания?

Это мультиклассовая классификация, потому что мы пытаемся отнести точку данных к одной из трех категорий (а не к одной из двух).

Одним из алгоритмов решения мультиклассовой классификации является регрессия softmax.

Эта статья предполагает знакомство с логистической регрессией и градиентным спуском. Нужна переподготовка? Прочтите сначала это.

Логика регрессии Softmax

В конечном итоге алгоритм найдет границу для каждого класса. Что-то вроде изображения ниже (но не на самом деле изображение ниже):

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

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

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

Если этикетка такая, что:

admitted = [1, 0, 0]
waitlisted = [0, 1, 0]
rejected = [0, 0, 1]

тогда выходной вектор будет означать:

[probability of being admitted,
probability of being waitlisted,
probability of being rejected]

Таким образом, в регрессии softmax мы хотим найти распределение вероятностей по всем классам для каждой точки данных.

Мы используем функцию softmax, чтобы найти это распределение вероятностей:

Почему функция softmax? Я думаю, что эти функции лучше всего пояснить на примере. Давайте посмотрим на пример:

Средний балл = 4,5, балл на экзамене = 90 и статус = допущен.

Когда мы обучаем модель, мы инициализируем модель с предполагаемым набором параметров - theta. Мы оптимизируем эти параметры с помощью градиентного спуска. Поскольку у нас есть 3 класса (принятый, отклоненный и внесенный в список ожидания), нам потребуется три набора параметров. У каждого класса будет свой набор параметров.

Пусть тета будет иметь форму:

[bias, weight of GPA, weight of exam score]

Давайте инициализируем тэты:

theta_admitted = [-250, 40, 1]
theta_waitlisted = [-220, 40, 1]
theta_rejected = [-220, 40, 1]

Почему эти ценности?

Помните, что линия y = mx + b? Строка, заданная начальными тетами, будет следующей:

admitted:
-250 + 40x + y = 0
y = -40x + 250
waitlisted:
-220 + 40x + y = 0
y = -40x + 220
rejected:
-220 + 40x + y = 0
y = -40x + 220

Если я просто посмотрю на данные, я могу увидеть, что линия, отделяющая «допущенные» от остальных, имеет точку пересечения по оси Y около 250 и наклон около -40.

Примечание. Это только начало, но на самом деле эти параметры никогда не сработают. Во-первых, параметры для списка ожидания и отклонения одинаковы, поэтому параметры всегда будут возвращать одинаковую вероятность для списка ожидания и отклонения, независимо от того, что вводится. Во-вторых, отличается только предвзятость, а отклоненные и внесенные в список ожидания имеют большую предвзятость, чем допущенные (-220–250). Следовательно, независимо от того, что это за вход, эти параметры вернут 0 для допущенных и 0,5 для двух других.

Но с плохими параметрами можно начинать, градиентный спуск исправит!

Давайте визуализируем, что делает функция softmax.

Что происходит, когда мы пропускаем точку данных через уравнение softmax? Опять же, наша точка данных: средний балл = 4,5, балл за экзамен = 90.

Сначала мы находим скалярное произведение параметров и точки данных:

Затем мы возводим это значение в степень, чтобы избавиться от любых потенциальных отрицательных скалярных произведений:

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

Поскольку наш первоначальный набор параметров не подходит, модель выводит 0,5 для отклоненных и 0,5 для внесенных в список ожидания, даже если метка допущена.

По сути, функция softmax нормализует входной вектор в распределение вероятностей. В примере, который мы только что рассмотрели, входной вектор состоит из скалярного произведения параметров каждого класса и данных обучения (то есть [20, 50, 50]). На выходе получается распределение вероятностей [0, 0,5, 0,5].

Алгоритм машинного обучения скорректирует смещение, вес GPA и вес экзаменационной оценки, чтобы вектор входных данных создавал выходное распределение, которое точно соответствует метке входа.

На самом деле нам нужно, чтобы наша модель выводила что-то вроде:

Итак, давайте изменим параметры для всех трех классов, чтобы повысить точность.

Один из способов сделать это - градиентный спуск.

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

Эта потеря называется кросс-энтропией. Формула перекрестной энтропии одной точки данных:

Внутренний 1{y=k} оценивается как 1, если точка данных x ^ i принадлежит классу k. 1{y=k} оценивается как 0, если точка данных x ^ i не принадлежит классу k.

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

Полная перекрестная энтропия или потери будут суммой всех перекрестных энтропий.

Мы берем производную по тета от этой потери, чтобы выполнить градиентный спуск.

Новые параметры для класса k после каждой итерации:

Опять же, 1{y=k} будет 1, если x ^ i принадлежит классу k, и 0, если x ^ i не принадлежит классу k.

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

Теперь давайте реализуем алгоритм, чтобы прийти к оптимальным параметрам theta.

Реализация Softmax

Я реализовал регрессию softmax для своего примера здесь:

Вот как вы тестируете в терминале:

>>> dataset = [...] # copy it from the gist
>>> from softmax_regression import SoftmaxRegression
>>> s = SoftmaxRegression(dataset)
>>> s.iterate()

Каждая итерация вычисляет общую перекрестную энтропию и получает новые параметры для каждого класса.

После многих и МНОГИХ итераций и настройки начальных параметров я смог прийти к параметрам:

theta_admitted = [-392.56407961,   56.75483745,    2.01880429]
theta_waitlisted = [-200.59246564,   33.92260307,    0.89946962]
theta_rejected = [-157.84345476,   26.32255948,    0.70172608]

Давайте проверим эти параметры с помощью вышеупомянутой точки данных: средний балл = 4,5, оценка за экзамен = 90 и статус = допущен. Модель должна вывести значение, близкое к 1 для допущенных и 0 для двух других статусов.

Ах! Намного лучше.

Теперь предскажи, допустят ли Сару!

Вот распределение вероятностей для среднего балла = 4,3 и балла за экзамен = 79:

Сара в списке ожидания. Грустный. Но мы уже знали, что это так.

Вот график с граничными линиями, определенными параметрами.

Подождите ... это не похоже на чистые границы. Кроме того, Сара (серым цветом) выглядит со всеми зелеными точками (допущенные студенты). И все же математика действительно дала Саре вероятность попасть в список ожидания на уровне 99,15%. 🤔

Честно говоря, это застало меня врасплох. Я пытался найти хорошее объяснение того, как интерпретировать параметры геометрически, но пока без особого успеха.

Если у вас есть хорошее объяснение, почему регрессия softmax не дает четких границ, прокомментируйте ниже.

Регрессия Softmax, наряду с логистической регрессией, не единственный способ решения проблем классификации. Эти модели хороши, когда данные более или менее линейно разделимы. Однако, когда данные нельзя разделить линейно, мы обращаемся к другим методам, таким как опорные векторные машины, деревья решений и k-ближайшие соседи.

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