Байєсова нейронна мережа — тому що а чому б і ні, чорт візьми (частина 1)

Те, про що я зараз спробую розповісти, виглядає як справжня магія.

Якщо ви щось знали про нейронних мережах до цього — забудьте це і не згадуйте, як страшний сон.
Якщо ви не знали нічого — вам же легше, півдорозі вже пройдено.
Якщо ви на «ти» з байєсівської статистикою, читали цю і цю статті з Deepmind — не звертайте уваги на попередні два рядки і дозвольте потім записатися до вас на консультацію по одному богословського питання.

Отже, магія:


Зліва — звичайна і всім знайома нейронна мережа, у якій кожна зв'язок між парою нейронів задана якимось числом (вагою). Праворуч — нейронна мережа, ваги якої представлені не числами, а демонічними хмарами ймовірності, що хитаються всякий раз, коли диявол грає в кості зі всесвітом. Саме її ми і хочемо отримати. І якщо ви, як і я, спантеличено трясете головою і питаєте «а нафіга все це потрібно» — ласкаво просимо під кат.



Один крок назад: лінійна регресія

Давайте для початку подорожі візьмемо найпростішу в світі нейронну мережу, що складається аж з одного нейрона. Отпилим у нього функцію активації і змусимо випльовувати просто витвір входів на ваги (w) плюс b, і отримаємо те, що називається лінійною регресією.


На вході додатково є кілька копій оригінального X, зведені в ступінь. Це іноді ще називають поліноміальної регресією, хоча теоретично, «нейрон» як і раніше робить лінійну функцію

Ну і як в класичних задачки, припустимо, у нас є якісь точки, і нам потрібно підігнати під них функцію. Напишемо якийсь такий не дуже красивий, зате найпростіший у світі код:

Заголовок спойлера
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns


def add_powers(data, n=5):
result = [data]
for i in xrange(2, n + 1):
poly = np.power data, i)
result.append(poly)
return np.vstack(result).T


def generate_data(n=20):
x = np.linspace(-10, 10, 100)
y = x * np.cos(x)
max_y = np.max(y)
y += np.random.random(y.shape)
idx = np.random.choice(len(y), n)
return x[idx], y[idx], max_y


if __name__ == '__main__':
original_data, target, max_y = generate_data(n=10)

power = 5

data = add_powers(original_data, power)
max_vals = np.array([max_y ** i for i in xrange(1, power + 1)])
data /= max_vals

w = (np.random.random(power) - 0.5) * 1.
b = -1.
learning_rate = 0.1

for e in xrange(100000):
h = data.dot(w) + b
w -= learning_rate * ((h - target)[:, None] * data).mean(axis=0)
b -= learning_rate * (h - target).mean()

plt.title('Interpolating f(x) = x * cos(x)')
x = add_powers(np.linspace(-10, 10, 100), power)
x /= max_vals
y = x.dot(w) + b
plt.plot(x[:, 0] * max_vals[0], y, lw=3, c='g')
plt.scatter(data[:, 0] * max_vals[0], target, s=50)
plt.show()



І отримаємо приблизно таке:



Функція, яку ми намагаємося пропихуть через сині точки, прямо зараз задана поліномом п'ятого ступеня, а коефіцієнти у неї такі:
[0.5423 -3.2648 -16.5311 43.3645 25.6159 -51.2418]
. Що це, на всяк випадок, означає? Це означає, що ми підозрюємо в даних якусь закономірність, і ця закономірність найкраще виражається як . Припустимо, ми подивилися на графік, переконалися, що зелена лінія не робить нічого особливо поганого і вдало підходить під дані, може бути, перевірили, як вона поводиться на окремій (попередньо спрятаной) тестовій вибірці, і нас все влаштувало. Тоді ці шість цифр — знайдена нами майже-істина, будь-то «справжні» параметри, що управляють законами природи (в даному випадку законом функції , але це деталі — давайте припустимо, що ми дивимося на якісь справжні і дуже важливі дані, що-небудь типу графіка температур для оцінки глобального потепління).

Імовірнісна інтерпретація

Окей, якщо ми знайшли ці параметри, чому зелена лінія все-таки неідеально проходить через сині точки? Середньоквадратичне відхилення для цієї лінії все ще не нульове (насправді воно приблизно 0.97). Це нормально, чи ми щось зробили не так? На це питання є дві відповіді:

1. Наша модель недостатньо крута і недостатньо повно відображає шукану закономірність. Ми можемо «збагатити» її, додавши ще параметрів — тобто, збільшити ступінь полінома. точок нам достатньо взяти поліном ступеня , щоб він ідеально пройшов через всі точки.



… не зовсім ідеально, але а чому б і ні. Виглядає навіть трохи симпатичніша, по-моєму. Залишимо як робочу гіпотезу.

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

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

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



Це все той же графік регресії, тільки з зумом. Синя точка — фактичне значення з датасета, червона — те, що пророкує регресія. Маленькі відхилення від синього червоного імовірніше (лежать недалеко від центру гауссианы), великі — менш вірогідні. Стає зрозуміло, що якщо ми предскажем «неправильний центр» (розмістимо червону крапку десь далеко), відхилення для синьої точки стане великим і отже, малоймовірним.

У перекладі на трохи більше загальноприйнятий мову цю ймовірність називають правдоподібністю (likelihood) і записують у нашому гауссівський випадку як (де — центр і стандартне відхилення гауссових кривий), а в загальному випадку як , де мають на увазі будь-які параметри. Сенс у неї скрізь однаковий — «ймовірність того, що якщо розподілом даних управляють такі параметри , результат буде саме ».

Тепер ми можемо дещо переформулювати завдання регресії. У термінах мішеней і правдоподібності буде звучати так: стріляти так, щоб стрілець не виглядав повним невдахою, тобто щоб його промахи були схожі на промахи і лежали в межах похибки. Дотримуючись загальноприйнятої статистичного мови, нам потрібно максимізувати правдоподібність.

Сама шукана ймовірність, як ми припустили, задається нормальним розподілом. Спишемо з вікіпедії формулу і перемножимо ймовірності для кожної точки між собою (звідси індекс ):


Ооокей, виглядає вже трохи моторошно. Давайте, щоб було трохи легше, зафіксуємо — тоді ми зможемо викинути половину символів звідси. Щоб у нас не псувалося вираження ймовірності, окремо зазначимо, що нас цікавить максимум:


Хээй, стало значно веселіше. Візьмемо від цієї штуки логарифм. Точка максимуму при цьому нікуди не дінеться, зате твір перетвориться в суму, а експонента — у свій показник:


Ну і зовсім нарешті, приберемо мінус в сумі, замінивши максимум на мінімум:


Хм, десь я вже бачив таке вираз…

… і виявляється, що максимум правдоподібності досягається там же, де і мінімум середньоквадратичного відхилення регресії. Такі моменти завжди чомусь страшенно розчаровують — я вже був впевнений, що щас відкрию який-небудь новий метод регресії, а ми повернулися туди, звідки починали.

З іншого боку, тепер ми знаємо відповідь на питання «а чому ми використовуємо саме середньоквадратичне відхилення?» Раніше ми на це подумки розводили руками, а тепер в курсі, що воно відповідає гауссовому шуму. Бонус-матеріал — якщо для оптимізації регресії використовувати абсолютну помилку (), то вийде шум по Лапласу (такий загострений в центрі). Від питання «а чим один краще іншого» сором'язливо уклонимся.

Think Bayes

Гаразд, все це було весело, і досить загальновідомо, насправді — ми тут просто на дозвіллі переизобрели метод максимальної правдоподібності. Настав час зробити крок трохи глибше і на інший рівень сну.

… як ви думаєте, чи є у всесвіті параметри?

Це серйозне питання. Ми ще з шкільної фізики знаємо, що у деяких речей начебто точно є — прискорення вільного падіння, скажімо, одно 9.8 метра на секунду в квадраті, і якщо ми хочемо дізнатися, як падають речі, або скажімо, замоделировать комп'ютерну гру з фізикою, нам доведеться це число туди вкрутити (або як роблять комп'ютерні ігри, хм? може, там тяжіння Землі робиться за законом Ньютона? або, чорт візьми, з урахуванням ефектів теорії відносності?). Або скажімо, у простору є три виміри (макроскопічних вимірювання, поправляє мене Мартін Різ); не 3.1 і не 2.8, а точно 3. Якби ми раптом вирішили побудувати алгоритм машинного навчання, який би вирішив виміряти розмірність простору, ми б тим вище оцінювали його роботу, ніж ближче він здавався до числа три.

З іншого боку, є точний, фіксований параметр у того, скільки молока дитина повинен випити за місяць? Скільки пісень повинна заспівати птах, щоб знайти собі пару? В якій пропорції зменшиться пухлина після ін'єкції речовини X в тіло пацієнта? Скільки води протікає крізь струмок за три хвилини часу? Всі ці речі, безсумнівно, мають під собою певну закономірність — пухлина буде зменшуватися, дитина — пити молоко, вода — текти, але якщо ми будемо заміряти точні значення, вони постійно будуть коливатися, залишаючись при цьому в якомусь інтервалі. Там, де у випадку з фізикою використання більш точних інструментів дає нам все більш точне значення величини («секунда є час, що дорівнює 9 192 631 770 періодам випромінювання, відповідного переходу між двома надтонким рівнями основного стану атома цезію-133»), для вимірювання ракової пухлини нам швидше знадобиться більше піддослідних хворих, щоб окреслити верхню і нижню межу і бути готовим до різних варіантів розвитку подій.

Це взагалі питання звідки-то скоріше з філософії — і десь тут проходить вододіл між байєсівської і ортодоксальної (або частотної) статистикою. Якщо грубо (я трохи далі виправлюся), то ортодоксальний підхід скаже, що на якомусь рівні справжні параметри все-таки є (просто ми ще до нього не добралися, а коли-небудь з'ясується, що зростання пухлини, скажімо, залежить від комбінації декількох чітко обумовлених чинників). Байесовец ж скаже, що точного параметра не існує — якщо навіть не на рівні фізичного дизайну всесвіту, то на рівні спостережуваних нами ефектів — і що з параметрами треба звертатися як з випадковими величинами, які можуть коливатися в різні боки.

...Обидві сторони можуть зараз сказати, що я неправий, тому що інтерпретацій цього питання — ціла купа. Зацікавлених відсилаю на StackExchange, звідки я запозичив декілька прикладів на зразок молока і пухлини, і більш правильну відповідь для байєсівської статистики швидше буде «ми не знаємо, як там влаштований світ насправді, і можливо, фіксовані параметри і є, але у своїх взаємодіях з ними ми незмінно оперуємо з деяким градусом невпевненості, і цю невпевненість ми моделюємо з допомогою ймовірності». Фух. Терміново потрібен вихід на більш дрібний рівень сну.


2560000 регресій

Давайте застосуємо байєсівську філософію «параметри — це випадкові величини» до коефіцієнтів нашої регресії. Для цього спишемо теорему Байєса:


Тут означає «параметри в загальному вигляді»; в нашому випадку це вже знайомі коефіцієнти полінома . І ми вже знаємо як мінімум одну фігню з цієї формули — , те саме правдоподібність, що ми максимизировали секцією вище (ще раз згадаємо, що воно рахується як значення відхилень точок датасета від регресійної кривої або як «середній розмір промаху по мішені»). називається апріорної (prior) ймовірністю і відображає наше початкове припущення про те, як виглядає розподіл параметрів. у вітчизняній літературі, по-моєму, ніяк спеціально не називається (повна ймовірність?), в інших версія її можна зустріти під словом evidence — це загальна ймовірність отримати такі дані, як у нас є, при всіх можливих значеннях параметрів (поки не дуже зрозуміло, звідки її брати). І нарешті, апостеріорна ймовірність (posterior), що означає буквально «що ми думаємо про розподіл параметрів після того, як побачили дані».

насправді… є навіть-не-дуже-складні способи виразити posterior для регресії аналітично — тобто, отримати формулу, куди тільки підставити значення з датасета, і вийде правильну відповідь. Але ми будемо робити все раздолбайским програмістських способом — чисельно, ітеративне, і абсолютно неефективно. Зате не доведеться читати про всякі інвертовані розподілу Уишарта та інші жахливі речі, які не проходять у школі (хоча потім все одно доведеться, так що якщо ви за хардкорний шлях пізнання, то велкам). Логіка тут така:

— ми починаємо з стану повного незнання, коли у нас є тільки prior. Тобто ми вважаємо, що коефіцієнти в регресії можуть бути які завгодно. Щоб обмежити безодню пізнання трохи, скажімо, «які завгодно від -10 до 10».
— ми бачимо якийсь шматок даних (одну точку з датасета, скажімо). Для кожної можливої комбінації параметрів ми вважаємо правдоподібність — наскільки ймовірно, що постріл по мішені робився саме з такими налаштуваннями. Як можна заздалегідь здогадатися, більшість налаштувань будуть швидше невалидными, і постріл віднесе кудись зовсім повз, але явно залишиться кілька (більше одного) варіантів, при яких дірка в мішені виглядає розумно. Правдоподібність ми вважаємо, як вже бачили, по Гаусу — просто підставляємо у формулу щільності нормального розподілу передбачення регресії замість мю, а значення з датасеты — замість ікс.
— підсумовуємо всі розраховані на попередньому кроці значення правдоподібності і отримуємо (у чому легко переконатися, написавши ). Тепер у нас є все необхідне, щоб проапдейтить posterior.
— обробивши одну мішень, ми отримали якісь уявлення про те, як можуть виглядати параметри; тепер це стає нашим новим prior. Дістаємо таку точку з датасета і починаємо з другого кроку.

Виглядає це все досить нескладно:

Заголовок спойлера
from itertools import product

def likelihood(x, mu, sigma=1.):
return np.exp(-np.power(x - mu, 2.) / (2 * np.power(sigma, 2.)))

frequency = 40
posterior = np.ones(frequency ** (power + 1)) / float(frequency)
param_values = [np.linspace(-10, 10, frequency) for _ in xrange(power + 1)]

for i, pt in enumerate(data):
for j, params in enumerate(product(*param_values)):
b = params[0]
w = np.array(params[1:])
h = pt.dot(w) + b
like = likelihood(pt[0], h)
posterior[j] *= like
posterior /= posterior.sum()



(перебрати всі можливі комбінації коефіцієнтів нам допоможе
itertools.product
)

В результаті ми отримаємо спільне розподіл для наших коефіцієнтів регресії — усі їх можливі значення будуть додаватися до одиниці. Виходить, що у кожного набору коефіцієнтів буде якась вірогідність, причому чим вище вона, тим задається ними крива правильніше і трушней.

Виникає питання на мільйон — як цю фігню намалювати?

Я спробував приблизно так: розбив спектр ймовірностей на десять рівних відрізків, і з кожного відрізка намалював на графіку скільки-то кривих відповідним кольором (від чорного до білого — чим вище ймовірність кривої). «Низковероятных» кривих, очевидно, більше, ніж високій ймовірності, тому довелося обмежити їх кількість рандомно сотнею або близько того, щоб pyplot остаточно не помер в муках, намагаючись намалювати… скільки, до речі, кривих? Я тимчасово знизив ступінь полінома до третьої, кожен коефіцієнт може приймати значення від -10 до 10 з кроком 0.5 — так що скромних регресій там, де раніше була одна.

Отже, виглядає це приблизно так:



А якщо відзначити на графіку дані, то так (прошу вибачення за вырвиглазно-зелений колір):



Зауважте, що більш «гарячі» криві, звичайно, мають більш високу ймовірність, але в Байєсівської інтерпретації це не означає, що ці криві «правильні» (що ми повинні взяти їх і викинути всі чорні). Трохи більш інтуїтивний спосіб думати про цих кривих, по-моєму — це представити, що ви дивіться як би зверху на нормальний розподіл, і бачите, що в центрі, звичайно, є якийсь пік ймовірності, але сама по собі ймовірність опинитися в точці піку все одно дуже маленька. Тільки зібравши разом якусь частину розподілу, можна «набрати» досить ймовірності.

Перенавчання не існує, Нео

Якщо ви все ще дивується, навіщо нам ця штука, то ось вам маленький бонус: байєсова регресія невразлива до перенавчання (overfitting). Причому я не маю на увазі просто «стійка» або «надійна» регресія з регуляризацией — певною мірою вона до нього взагалі невразлива.

Що таке перенавчання, ще раз? Це коли ми «надто підганяємо» модель до наявних даних (наприклад, підбираємо таку криву, яка ідеально пройде через всі точки датасета, але покаже погані прогнози на нових даних). У перекладі на філософський мова минулого секції це означає, що коли ми шукали «правильний» набір параметрів, ми знайшли якийсь помилковий, хибний. Це неможливо зробити з роботою байєсовського підходу, тому що там просто немає поняття «правильного» набору параметрів! Дивний чорно-жовтий конус на картинках вище говорить нам: «так, швидше за все, з точки будуть десь в середині вздовж білих кривих, але можуть виявитися і з краю, і вище, і нижче, ніяких проблем». Ступінь полінома можна збільшувати скільки завгодно: разом з нею буде рости число можливих кривих, а у кожної з них окремо буде падати ймовірність. «Виживуть» все одно тільки ті, які будуть лежати близько до даними, у нашому оранжево-«гарячому» пучку. Зробимо п'яту ступінь? Та ніяких проблем, Х'юстон:


Виглядає трохи більш бляклим, але це просто тому, що я зменшив загальна кількість кривих — інакше мій лаптоп б не прокинувся.

Насправді в такому контексті поняття перенавчання взагалі не існує. Неможливо неправильно знайти параметр, тому що «параметр» — це не річ, яку можна «знайти», це здоровенне хмара ймовірності, яке стає «щільним» тільки там, де поруч лежать дані. Перенавчання не існує, пані та панове, розходимося. Не забудемо повідомити всім цим важливим хлопцям з машинного навчання, що можна закривати лавочку.

На всяк випадокЦе не означає що байєсова регресія завжди дає правильні прогнози і не може помилятися — може, звичайно. Припустимо, наступна точка в датасете матиме x=3 y=-20 і впаде набагато нижче помаранчевого пучка — тоді наша модель передбачає неправильне значення. Фокус в тому, що звичайну регресію вам у цьому місці знадобилося б навчати з нуля і підправляти параметри, в той час як байєсівську потрібно всього лише «проапдейтить», поклавши нову точку в алгоритм — і пучок соответстветствующим чином зігнеться.


Приблизно ось так.

Крім того, байєсівської регресія, як би це сказати, «інертна». Маючи в наявності десяток точок вздовж білої кривій і один outlier, вона, швидше за все, прогнеться в його бік трохи, але не до кінця. І це, взагалі кажучи, добре і правильно, тому що а раптом це черговий результат шуму?


Чому ансамблі працюють?

У машинному навчанні є така дуже проста техніка — коли у вас є кілька моделей і вони всі працюють погано, можна взяти і усереднити (або ще як-небудь об'єднати) їх передбачення, і тоді вони чарівним чином починають працювати добре. По-правильному це називається ансамблі, і їх можна зустріти майже де завгодно, особливо на змаганнях.

І взагалі кажучи, це не інтуїтивний питання: чому ансамблі взагалі працюють? В реальному житті речі рідко ведуть себе таким чином: якщо у вас є десять поганих молотків, цвях не стане забиватися краще від того, що ви будете використовувати їх по черзі. Ілюстрація до цього питання частково служить непоганим інтуїцією (по-моєму) на тему того, чому працює байєсова регресія. Виглядає це якось так:



Зелена лінія — «складна» модель (поліном дев'ятій ступеня), а синя — «проста» (другого ступеня). Синией точки належать до навчальної вибірки, а червоні — до тестової. Жовта лінія — просте середнє арифметичне між двома моделями, і навіть на око помітно, що вона не така широка, як зелена, і дійсно лежить ближче до червоних точок. Простота синього злегка компенсує стрибучість зеленого; середній варіант ближче до істини, ніж обидва відхилення, за умови, що відхилення направлені в різні боки (це якраз одне з важливих умов ансамблів — вам потрібні різні моделі для того, щоб усереднення спрацювало).

Так от, коли ми намагаємося передбачити що-то з байєсівської регресією, ми усредняем не дві і не три моделі, а в нашому випадку — два з половиною мільйони. Але стривайте, насправді, все ще крутіше. Це ми у своєму кривому питонском коді обмежили коефіцієнти значеннями -10 і 10 з кроком 0.5, а якщо робити все правильно, вони можуть приймати будь-яке значення на нескінченної числової прямої. Секунду, включимо калькулятор… , так точно. Байєсова регресія — це ансамбль з нескінченного регресій (сума при цьому перетворюється в інтеграл). Десь у цей момент скромну назву «байєсова регресія» починає не передавати всій її неможливою крутості, треба б що-небудь эпичнее.

«Не-зовсім-випадковий бесконечнолес?»

Від нейрона до безлічі нейронів

Настав час трохи розчаруватися: спосіб, який ми придумали для розрахунку posterior, поганий і працює тільки для якихось дуже маленьких завдань. Справа в тому, що кількість усіх можливих комбінацій параметрів, які потрібно перебрати, зростає експоненціально. Ми оцінювали його як кількість значень параметра в ступені числа параметрів, і вже для полінома дев'ятій ступеня (десять коефіцієнтів/параметрів) нам в поточному сеттінге доведеться пробігтися по циклу 10485760000000000 разів.

А тепер настав час по-справжньому розчаруватися: для більш складних моделей, тобто нейронних мереж (які являють собою просто кілька регресійних юнітів, з'єднаних один з одним), чистий байєсовський метод стає ще більш незастосовним. «Параметри нейронної мережі — це її ваги; а їх у сучасних мережах може бути дуже і дуже багато (мільйони штук з легкістю). Існують різні способи спростити цей процес: наприклад, випадковим чином діставати значення posterior замість того, щоб розраховувати його в кожної точки (це називається семплінг), але ми не дарма їх все проігнорували — вони недостатньо крути, щоб допомогти отримати байєсівську нейронну мережу по-справжньому серйозних розмірів.

Насправді для якихось окремих моделей все ще гірше. Наші коефіцієнти регресії, грубо кажучи, «ні від чого не залежали»; якщо ми хочемо подивитися, як веде себе модель з таким набором параметрів, ми можемо просто взяти його і підставити у формулу Байєса. У мережах розподіл ваг окремого нейрона може залежати від того, як веде себе попередній нейрон, а той, у свою чергу, залежить від попереднього (а справжнє веселощі починається, коли залежно замикаються в цикл).

Власне, це і є головна причина, по якій лавочка не закрита, люди продовжують боротися з перенавчанням і штучний інтелект так і не побудували. Загалом, якщо ми хочемо дістатися до мети, зазначеної у заголовку, нам потрібно що-небудь ще. Тому у наступній частині ми поговоримо про аппроксимациях до апостерорной ймовірності, варіаційних методах в машинному навчанні, і про зворотне байесораспространении помилки.

Що зробити, щоб хоч що-небудь працювало

Ми можемо трохи відступити назад і задовольнятися частковим вирішенням проблеми: знайти максимум байєсівського пучка, найбільш близьку до центру і саму «гарячу» криву. Це буде не так круто, як знання пучка цілком, але все краще, ніж те, з чого ми починали.

Тобто ми шукаємо . Беремо звичний логарифм, щоб перетворити твір на суму:


Тепер дивіться: з ми вже разобразись в частині про максимальне правдоподібність (під спойлером), і можемо його поки проігнорувати. Що робити з другим доданком (яке наш prior)? Для початку, згадаємо, що у нашому випадку — це набір коефіцієнтів регресії, і в якості апріорної оцінки ми цілком можемо сказати, що кожен коефіцієнт має якесь своє, незалежне розподіл (тобто, записати вираз ). Яке саме розподіл взяти? Ми раніше вважали, що воно рівномірне: , але це нудно і зводиться до максимального правдоподібності (бо тоді константою — ймовірність весь час однакова, які б коефіцієнти ми не взяли). Давайте припустимо, що кожен коефіцієнт регресії розподілений по Гауссу з центром у точці 0 і якимось стандартним відхиленням . Тоді:


Підставляємо замість формулу нормального розподілу. Ми вже таке робили, тільки якщо пам'ятаєте, раніше у нас було фіксовано стандартне відхилення, а середина варіювалася. Зараз ми фіксуємо відразу все:


Коефіцієнт перед експонентою знову-таки не важливий для пошуку максимуму (він не залежить від ). Викидаємо його і застосовуємо логарифм:


Виходить, що максимум досягається там, де сума квадратів коефіцієнтів регресії мінімальна. Нічого не нагадує? Ми переизобрели регуляризацию, на хвилиночку, отримали відмінне обґрунтування того, навіщо вона взагалі потрібна (раніше це була якась технарско-інженерна штука, в дусі «нуу, давайте просто примусимо коефіцієнти регресії бути маленькими, щоб вона не стрибала туди-сюди», але з Байесом у ваш дім приходить просвітлення і все набуває сенсу).

На статистичному жаргоні це називається maximum a posteriori або MAP-learning. На відміну від «чистого» Байєса, MAP відмінно застосовується і до нейронних мереж, і до чого завгодно — під скромною назвою «регуляризация». На жаль, це не тру-байесовское рішення, тому що в кінці кінців ми закінчуємо гру з якимось штучним «набором параметрів» — і тому такий підхід теж може страждати від перенавчання, хоча і більш стійкий до нього, ніж метод максимальної правдоподібності.

Маленький постскриптум

За мотивами дискусії, розпочатої haqreu на тему того, православно намагатися пояснювати математичні речі на пальцях, мені трохи цікаво громадську думку на цю тему. Тикніть куди-небудь в опитування за результатами прочитання, якщо не утруднить?

Як воно?

/>
/>


<input type=«radio» id=«vv71623»
class=«radio js-field-data»
name=«variant[]»
value=«71623» />
Я вже знав усе це, але мені швидше сподобалося
<input type=«radio» id=«vv71625»
class=«radio js-field-data»
name=«variant[]»
value=«71625» />
Я вже знав усе це, і мені не сподобалося
<input type=«radio» id=«vv71627»
class=«radio js-field-data»
name=«variant[]»
value=«71627» />
Я не знав про байєсовський підхід, і цей текст зробив те, що відбувається трохи зрозуміліше
<input type=«radio» id=«vv71629»
class=«radio js-field-data»
name=«variant[]»
value=«71629» />
Я не знав про байєсовський підхід, і так нічого і не зрозумів звідси
<input type=«radio» id=«vv71631»
class=«radio js-field-data»
name=«variant[]»
value=«71631» />
Подивитися результати

Проголосувало 39 осіб. Утрималося 11 осіб.


Тільки зареєстровані користувачі можуть брати участь в опитуванні. Увійдіть, будь ласка.


Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.