Вероятность

Практика: правдоподобие

Логистическая регрессия как MLE и наивный Байес — два классических метода, выведенных, а не заученных

Шаг 52 из 117 · ~40 мин

Логистическая регрессия — это не «регрессия с сигмоидой»

Её выводят, а не постулируют. Модель говорит: метка распределена по Бернулли с параметром, зависящим от входа.

yx  Bernoulli(σ(wx+b)),σ(z)=11+ezy \mid x \ \sim \ \text{Bernoulli}\big(\sigma(w^\top x + b)\big), \qquad \sigma(z) = \frac{1}{1 + e^{-z}}

Дальше — MLE из урока 120, буква в букву. Правдоподобие одного наблюдения равно py(1p)1yp^y(1-p)^{1-y}, логарифм суммируется по выборке, и минус log-правдоподобие получается таким:

logL=i[log(1+ezi)yizi],zi=wxi+b\htmlData{k=ce}{-\log L} = \sum_{i} \Big[\log\big(1 + e^{\htmlData{k=z}{z_i}}\big) - y_i \htmlData{k=z}{z_i}\Big], \qquad z_i = w^\top x_i + b

Это в точности бинарная . Никто её не выбирал как «подходящую функцию потерь» — она выведена из предположения о Бернулли, ровно как MSE выводится из гауссовского шума.

Приведённая форма log(1+ez)yz\log(1 + e^z) - yz получается из ylogσ(z)(1y)log(1σ(z))-y\log\sigma(z) - (1-y)\log(1-\sigma(z)) подстановкой logσ(z)=log(1+ez)\log \sigma(z) = -\log(1+e^{-z}) и не требует ни одного логарифма от возможного нуля. Это не косметика: наивная запись через logσ\log \sigma падает с ошибкой, как только σ\sigma округлится до 00 или 11 — а это происходит уже при z37|z| \approx 37.

Градиент, который стоит запомнить

w(logL)=i(σ(zi)yi)xi\frac{\partial}{\partial w}\big(-\log L\big) = \sum_i \big(\sigma(z_i) - y_i\big)\,x_i

То есть (предсказание − правда) × вход. Никакой производной сигмоиды в ответе нет, хотя в выводе она есть — она сокращается. Тот же вид имеет градиент softmax с кросс-энтропией (блок 2, урок 080) и градиент MSE с линейной моделью. Это не совпадение: у всех обобщённых линейных моделей из урока про экспоненциальное семейство градиент выглядит одинаково, и именно это делает их одним семейством, а не тремя похожими методами.

Поверхность правдоподобия

Ландшафт logL-\log L по (w,b)(w, b) выпуклый — одна впадина, никаких локальных минимумов. Это редкое и приятное свойство; глубокие сети его не имеют, и об этом будет блок 5.

Первый набор — линейно разделимые данные. Потащите точку и следите за градиентом: он нигде не обращается в нуль. Минимума нет: чем больше ww, тем меньше потеря (0.0430.043 при w=2.5w = 2.5, 0.00340.0034 при w=5w = 5, 21052 \cdot 10^{-5} при w=10w = 10), и MLE уходит в бесконечность.

−log L
0.24
градиент
-0.27, 0.08
норма градиента
0.28

Градиент не обращается в нуль нигде. Данные разделимы, поэтому увеличивать w выгодно всегда: потеря падает к нулю, а веса растут без предела. Это переобучение в чистейшем виде — модель становится бесконечно уверенной по четырём точкам.

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

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

Наивный Байес

Другой подход к той же задаче классификации. Логистическая регрессия моделирует p(yx)p(y \mid x) напрямую — она дискриминативна. Наивный Байес моделирует p(xy)p(x \mid y) и p(y)p(y), а затем разворачивает их правилом Байеса — он генеративен.

p(yx)p(y)jp(xjy)p(y \mid x) \propto p(y)\prod_{j} p(x_j \mid y)

«Наивное» — это допущение, что признаки условно независимы при данном классе. Оно почти всегда ложно (в тексте слова коррелируют очевидно), и метод всё равно работает. Причина в том, что для классификации нужен лишь верный порядок вероятностей, а не их верные значения: наивный Байес выдаёт плохо калиброванные вероятности и при этом часто правильный argmax.

Обучение — это MLE с сопряжёнными priors из урока 080, и оно сводится к подсчёту частот:

p(xj=vy=c)=#{xj=v, y=c}+α#{y=c}+αVp(x_j = v \mid y = c) = \frac{\#\{x_j = v,\ y = c\} + \alpha}{\#\{y = c\} + \alpha V}

α\alpha здесь — тот самый Дирихле-prior, и без него одно ненаблюдённое слово обнуляет всё произведение. Это сглаживание Лапласа, встреченное в блоке 3 трижды с разных сторон.

Практически всё считают в log-пространстве:

logp(yx)=logp(y)+jlogp(xjy)+const\log p(y \mid x) = \log p(y) + \sum_j \log p(x_j \mid y) + \text{const}

Произведение сотни маленьких вероятностей underflow’ится — та же причина, что и в уроке 120, и то же решение.

Что делать руками

  1. Логистическая регрессия с нуля. Реализуйте устойчивую NLL и градиент (σ(z)y)x(\sigma(z) - y)x; проверьте градиент центральными разностями (относительная ошибка должна быть порядка 101110^{-11}, как в проверке ниже). Обучите на любом двумерном облаке и нарисуйте разделяющую прямую.
  2. Убедитесь, что веса расходятся. Возьмите линейно разделимую выборку и обучайте без регуляризации, логируя w\|w\|. Он будет расти неограниченно. Добавьте L2 и посмотрите, где он остановится.
  3. Наивный Байес на текстах. Двадцать документов, два класса, мешок слов. Сначала без сглаживания — получите нулевые вероятности; затем с α=1\alpha = 1.
  4. Сравните калибровку. На одном датасете постройте гистограммы предсказанных вероятностей у обоих методов. Наивный Байес будет прижимать их к 00 и 11 — это и есть плата за ложное допущение независимости.
  5. Проверьте общий вид градиента. Реализуйте линейную регрессию, логистическую и softmax-регрессию через одну и ту же функцию grad = X.T @ (predict(X, w) - Y) / n, меняя только predict. Работать должны все три — это и есть обобщённая линейная модель.

Источники

Проверки

0 из 2
  1. Два классификатора

    Отметьте все верные утверждения о логистической регрессии и наивном Байесе.

  2. Логистическая регрессия: потеря и градиент

    Реализуйте logistic_nll_grad(xs, ys, w, b) для одномерного входа — верните [nll, dw, db], всё усреднённое по выборке (nn = длина xs):

    nll=1ni[log(1+ezi)yizi],zi=wxi+b\text{nll} = \frac{1}{n}\sum_i \Big[\log\big(1 + e^{z_i}\big) - y_i z_i\Big], \qquad z_i = w x_i + b

    nllw=1ni(σ(zi)yi)xi,nllb=1ni(σ(zi)yi)\frac{\partial\,\text{nll}}{\partial w} = \frac{1}{n}\sum_i \big(\sigma(z_i) - y_i\big)x_i, \qquad \frac{\partial\,\text{nll}}{\partial b} = \frac{1}{n}\sum_i \big(\sigma(z_i) - y_i\big)

    Считайте устойчиво. Запись через ylogσ(z)(1y)log(1σ(z))-y\log\sigma(z) - (1-y)\log(1-\sigma(z)) на последнем случае даёт ошибку домена: σ(40)\sigma(40) округляется до единицы, и log(11)\log(1 - 1) — это log0\log 0. Используйте

    log(1+ez)=log(1+ez)+max(z,0)\log\big(1 + e^{z}\big) = \log\big(1 + e^{-|z|}\big) + \max(z, 0)

    Сигмоиду тоже стоит считать по знаку zz: 11+ez\frac{1}{1+e^{-z}} при z0z \ge 0 и ez1+ez\frac{e^{z}}{1+e^{z}} при z<0z < 0 — иначе exp переполнится.

    функция logistic_nll_grad

    Загрузка редактора…

    Ctrl/⌘ + Enter