Эпоха 2 · Фундамент · 2006

14 Deep Belief Nets

A Fast Learning Algorithm for Deep Belief Nets · Hinton, Osindero & Teh · Neural Computation
🟦 хватит конспекта~1 чоригинал ↗
Суть за 20 секунд. Глубокую сеть можно обучить жадно, слой за слоем, без учителя (стэк RBM), затем дообучить. Метод дал глубоким сетям хорошую инициализацию и вернул им респектабельность — работа, которой приписывают старт «deep learning». Сам приём позже вытеснен, но историческая роль огромна.

Контекст

2006: глубокие сети формально обучаемы backprop, но на практике плохо — затухающий градиент, плохие минимумы, мало данных; их считают непрактичными. Хинтон с соавторами даёт обходной путь и возрождает интерес.

Идея и механизм

Глубокая генеративная сеть как стэк RBM (ограниченных машин Больцмана). Учим жадно, послойно и без учителя: первый RBM моделирует данные; его скрытые активации становятся «данными» для второго RBM; и так далее. Затем всю сеть аккуратно дообучаем (например supervised backprop). Послойное предобучение даёт хорошую инициализацию весов, из которой дообучение уже сходится.

теория вероятностей RBM и трюк contrastive divergence

RBM задаёт совместное распределение видимых v и скрытых h через энергию:

P(v, h) ∝ e−E(v,h),   E = −v⊤Wh − a⊤v − b⊤h

Хотим максимизировать правдоподобие данных. Градиент логарифма имеет красивый, но неподатливый вид — разность двух средних:

∂ log P(v)∂W = ⟨v h⊤⟩data − ⟨v h⊤⟩model

Второе среднее требует сэмплирования из всей модели (дорогой MCMC). Contrastive Divergence приближает его одним шагом Гиббса от данных («реконструкцией») — это и сделало обучение быстрым. Затем RBM-ы стэкаются жадно: каждый слой учит распределение активаций предыдущего.

NumPy Один шаг contrastive divergence (CD-1)
import numpy as np
sig = lambda z: 1 / (1 + np.exp(-z))

def cd1(v, W, eta=0.1):                # обучение одного RBM
    h  = (sig(v @ W) > np.random.rand(W.shape[1])).astype(float)  # данные
    v2 = sig(h @ W.T)                  # реконструкция видимого слоя
    h2 = sig(v2 @ W)
    W += eta * (np.outer(v, h) - np.outer(v2, h2))   # data − reconstruction
    return W
данные (видимый слой) RBM 1 → h₁ RBM 2 → h₂ жадно, слой за слоем: 1) обучить RBM 1 на данных 2) обучить RBM 2 на активациях h₁ 3) …затем дообучить всё backprop
Глубокая сеть собирается снизу вверх: каждый RBM учит распределение активаций предыдущего, давая хорошую инициализацию для финального дообучения.
Аналогия. Строить небоскрёб не сразу целиком, а этаж за этажом, давая каждому застыть, прежде чем класть следующий. Послойное предобучение — это «дать фундаменту схватиться»: к моменту финального дообучения веса уже стоят в разумном месте, и backprop не проваливается в плохой минимум.

Почему это важно

Работа, которой приписывают старт современной «deep learning»-эпохи: показала, что глубокие сети можно обучить и они дают SOTA (на MNIST), вернув им респектабельность. Вокруг неё (грант CIFAR) держалась группа Хинтона–Бенжио–Лекуна сквозь «голодные годы». Нюанс: сам метод (RBM + послойное предобучение) вскоре вытеснен — ReLU, лучшая инициализация, BatchNorm и обилие данных позволили учить глубокие сети напрямую backprop.

Связи

← опирается на6. Сеть Хопфилда

RBM — родственник сети Хопфилда и машины Больцмана: те же энергетические модели из статфизики, но стохастические и обучаемые. Линия «энергия → вероятность → обучение» тянется прямо отсюда.

→ ведёт к16. AlexNet

DBN зажгли веру, что глубокое обучаемо, и собрали сообщество. Через 6 лет AlexNet докажет это уже без RBM — напрямую backprop на GPU. Предобучение оказалось «костылём», который перестал быть нужен, но именно он провёл поле через тёмный период.

↔ контраст26. Batch Normalization

DBN решал «как вообще запустить обучение глубокой сети» предобучением. BatchNorm (и хорошая инициализация, ReLU) решили ту же проблему иначе — стабилизацией самого процесса обучения, сделав послойное предобучение ненужным.

Вопросы пытливого ума

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

Потому что устранили причину, по которой оно было нужно — плохую обучаемость глубоких сетей. ReLU (нет насыщения), грамотная инициализация (Xavier/He), BatchNorm и большие датасеты позволили градиенту течь сквозь глубину напрямую. Когда backprop заработал «в лоб», обходной манёвр стал лишним.

Чем RBM-предобучение отличается от автоэнкодерного?

Оба — unsupervised-инициализация через реконструкцию, и идея «слой учит представление входа» общая. RBM — вероятностная энергетическая модель, обучаемая contrastive divergence; автоэнкодер — детерминированная сеть, минимизирующая ошибку реконструкции напрямую backprop. Автоэнкодеры проще и быстро вытеснили RBM как способ предобучения, пока и они не стали не нужны.

Эта статья «придумала» термин deep learning?

Нет — термин старше. Она популяризовала современную рамку и стала символическим стартом эпохи, но «deep learning» употреблялось и раньше. Частая ошибка — приписывать ей чеканку термина; корректнее говорить «работа, вернувшая глубину в мейнстрим».

Что читать в оригинале

Достаточно конспекта — историческая роль важнее механики RBM, которая сегодня нишева. Если копать, смотрите идею жадного послойного обучения и contrastive divergence (мат-блок).