Из
https://ivanov-petrov.livejournal.com/2618194.html?thread=287054674#t287054674 (английская версия в
https://babkin-cep.blogspot.com/2017/06/neuron-in-bayesian-terms-part-2.html и там есть еще части):
Линейная регрессия — функция вида
y = w[0]*x[0] + ... + w[n]*x[n] + b
в которой x[i] — входные данные, и натренировываются веса w[i] и b, чтобы для каждой комбинации иксов в тренировочном наборе получился игрек близкий к игреку из тренировочного набора для этих иксов.
У Байеса если мы прилагаем последовательность независимых событий E[i], то вероятность гипотезы после обнаружения, что событие произошло, вычисляется как:
P(H) = P0(H) * P(E[i]|H) / P(E[i])
а если не произошло, то
P(H) = P0(H) * P(~E[i]|H) / P(~E[i])
где P0(H) - предыдущая вычисленная вероятность гипотезы, начиная последовательность вычислений с некоей действиельно априорной.
Заметем пока отрицательный случай под ковер, поскольку он симметричный. Для всей последовательности произошедших событий формула будет:
P(H) = P0(H) * product( P(E[i]|H) / P(E[i]) )
Теперь возьмем вместо вероятностей шансы, т.е. в форме типа "даю один к трем":
Шанс(H) = P(H) / P(~H) = P(H) / (1 - P(H))
Байесова формула преобразовывается:
Шанс(H) = P(H) / P(~H)
= ( P0(H) * product( P(E[i]|H) / P(E[i]) ) ) / (P0(~H) * product( P(E[i]|~H) / P(E[i]) ) )
= (P0(H)/P0(~H)) * product( P(E[i]|H) / P(E[i]|~H) )
Для простоты пока что заметем (P0(H)/P0(~H)) под ковер (если обе равновероятны, результат деления будет 1). Зато вынем из-под ковра отрицательный случай:
Шанс(H) = product(
if (E is true) {
P(E[i]|H) / P(E[i]|~H)
} else {
P(~E[i]|H) / P(~E[i]|~H)
}
)
События тут симметричные "этот аргумент совпадает с результатом в тренировке":
P(E[i]|H) = P(y == x[i])
P(E[i]|~H) = P(y != x[i])
P(~E[i]|H) = P(y != x[i])
P(~E[i]|~H) = P(y == x[i])
то есть, P(y==x[i]) будет буквально количество тренировочных примеров, где i-й аргумент совпадает с результатом, поделенное на количество всех тренировочных примеров. Отсюда
P(E|H) = P(~E|~H)
P(E|~H) = P(~E|H)
И используя общие свойства
P(E|H) = 1 - P(~E|H)
P(E|H~) = 1 - P(~E|~H)
получаем
P(E|~H) = P(~E|H) = 1 - P(E|H)
Шанс(H) = product(
if (E is true) {
P(E[i]|H) / (1 - P(E[i]|H))
} else {
(1 - P(E[i]|H)) / P(E[i]|H)
}
)
Ветки if у нас делят вероятности в противоположную друг другу сторону. Теперь возьмем представление, где x[i] у нас представляет истину как 1, а ложь как -1. Тогда можно if заменить на возведение в степень x[i]:
Шанс(H) = product( ( P(E[i]|H) / (1 - P(E[i]|H)) )^x[i] )
а штука, которую мы возводим в степень — это Шанс(E[i]|H) = P(E[i]|H) / (1 - P(E[i]|H)), то есть
Шанс(H) = product( Шанс(E[i]|H)^x[i] )
Теперь возьмем отсюда логарифм (логарифмы положительных значений шансов, заметим, могут быть положительными и отрицательными - положительными если шансы в пользу события, симетрично отрицательными если шансы против события), умножение заменится сложением, возведение в степень заменится умножением:
ln(Шанс(H)) = sum( ln(Шанс(E[i]|H)) * x[i] )
Получили формулу линейной регрессии, где w[i] = ln(Шанс(E[i]|H)). Теперь вынем из-под ковра множитель (P0(H)/P0(~H)). Он представляет собой априорный Шанс0(H), вставим его назад в формулу:
ln(Шанс(H)) = sum( ln(Шанс(E[i]|H)) * x[i] ) + ln(Шанс0(H))
То есть дополнительное слагаемое b = ln(Шанс0(H)) представляет собой коррекцию на априорный шанс.
Формула Байеса, подсчитываемая последовательно для многих событий, предполагает, что эти события независимые. Но может оказаться, например, что у нас всегда для некоторых i и j будет x[i] = x[j], то есть одно и то же значение всегда дублируется, два события полностью зависимые. Если тупо идти по Байесу, игнорируя зависимость, то независимый учет этих двух иксов приведет к тому, что вероятность сдвинется в неправильную сторону. Но если мы посмотрим на формулу линейной регресии, то там делается легко видно, что чтобы получить правильный учет, нам надо иметь (w[i] + w[j]) = ln(Шанс(x[i])), и любая комбинация этих двух весов, удовлетворяющая этой сумме, эквивалентна. К счастью, градиентный спуск умеет это более-менее прочухивать автоматически, как и частичные зависимости.