跳轉到

2006 - Hinton 深度信念網路(深度學習的誕生)#

案件摘要#

2006 年,59 歲的 Geoffrey Hinton(1947–) 與學生 Simon Osindero、Yee-Whye Teh 在《Science》發表 A Fast Learning Algorithm for Deep Belief Networks:

\[ \boxed{\text{逐層貪婪預訓練——深層網路第一次被「成功地訓練」}} \]

他們把多個受限玻爾茲曼機(RBM, Restricted Boltzmann Machine) 像積木一樣堆疊成深度信念網路(Deep Belief Network, DBN): - 先無監督地一層一層預訓練(每一層學一種特徵); - 再用反向傳播微調整體。

\[ \text{RBM}_1 \to \text{RBM}_2 \to \text{RBM}_3 \to \cdots \to \text{微調} = \text{深層網路可訓練}. \]

「deep learning」一詞由這波研究開始流行—— 沈寂二十年的深層神經網路,就此復活。

前因 -- 為什麼會有這個案子#

  • 1986 反向傳播的復興與困境: Rumelhart、Hinton、Williams 在 1986 年讓反向傳播(見 1986-反向傳播復興.md)廣為人知,但只用了一兩層的隱藏層。 深層網路(四層以上)訓練時,梯度一層層往回傳就消失:
\[ \frac{\partial E}{\partial w_1} \propto \prod_{k} \sigma'(z_k) \to 0 \quad\text{(層數一多,連乘變零)} \]
\[ \boxed{\text{深層網路 = 訓練不動(1986–2006 的二十年困境)}} \]
  • 1995 年之後的 SVM 主流時代: Vapnik 的支持向量機(SVM, 見 1980–1995 的統計學習理論) 有凸優化的漂亮數學,成為機器學習主流:
\[ \text{SVM:} \min_w \tfrac{1}{2}\|w\|^2 \;\text{s.t.}\; y_i(w^Tx_i+b)\ge 1 \]

神經網路被視為「黑盒子、訓練不穩、理論不清」—— 學術界几乎不再投神經網路的履歷。 - Hinton 的堅持: Hinton 相信大腦就是深層的——視覺皮層 V1 → V2 → V4 → IT, 層層抽取特徵。問題不在「深」,而在初始化:

\[ \text{隨機初始化深層網路} \to \text{梯度消失};\quad \text{逐層預訓練} \to \text{好的起點}. \]

他的解法來自 1980 年代的能量模型——RBM。 - 計算力的成熟: 2000 年代中,CPU 叢集讓大量無監督預訓練變得可行—— 天時、地利、人和,只欠一個演算法。

線索與推理 -- 數學式、程式、理論#

第一條線索:受限玻爾茲曼機(RBM)的能量#

RBM = 可見層 \(v\) (資料)+ 隱藏層 \(h\) (特徵),層內無連結、層間全連結。 定義能量函數:

\[ E(v,h) = -b^T v - c^T h - v^T W h \]
  • \(b\) :可見層偏置; \(c\) :隱藏層偏置; \(W\) :權重矩陣。 機率由能量給出(能量越低,機率越大):
\[ P(v) = \frac{1}{Z}\sum_h e^{-E(v,h)}, \qquad Z = \sum_{v,h} e^{-E(v,h)} \]

因為層內無連結,給定一層時另一層的各神經元條件獨立:

\[ P(h_j = 1 \mid v) = \sigma\!\left(c_j + \sum_i W_{ij} v_i\right), \qquad P(v_i = 1 \mid h) = \sigma\!\left(b_i + \sum_j W_{ij} h_j\right) \]

其中 \(\sigma(x) = \dfrac{1}{1+e^{-x}}\) 是 sigmoid 函數。

\[ \boxed{\text{層內無連結} \Rightarrow \text{可並行取樣} \Rightarrow \text{RBM 可訓練}} \]

第二條線索:最大概似與配分函數的障礙#

訓練目標是最大化資料的對數概似:

\[ \max_W \; \log P(v) = \log \sum_h e^{-E(v,h)} - \log Z \]

對 \(W\) 微分得到優美的梯度:

\[ \frac{\partial \log P(v)}{\partial W} = \underbrace{v\, h^T}_{\text{資料驅動(正相位)}} \;-\; \underbrace{\mathbb{E}_{P(v,h)}[\,v\,h^T\,]}_{\text{模型驅動(負相位)}} \]

障礙在負相位: \(\mathbb{E}_{P(v,h)}\) 需要對所有 \((v,h)\) 加權——

\[ \boxed{Z \text{ 指數大,精確計算不可行(與 1936 圖靈機的可計算性相呼應)}} \]

MCMC(Gibbs 取樣)要混合很久才收斂——這正是深層模型被冷落的原因之一。

第三條線索:對比散度(Contrastive Divergence)的直覺#

Hinton 的絕招(2002):負相位不必取樣到收斂—— 只跑一兩步 Gibbs 取樣就停: 1. 資料 \(v_0\) → 取樣 \(h_0\) (正向); 2. \(h_0\) → 取樣 \(v_1\) (反向,重建); 3. \(v_1\) → 取樣 \(h_1\) (正向); 4. 更新: \(\Delta W = v_0 h_0^T - v_1 h_1^T\) 。

\[ \Delta W \approx \underbrace{\langle v h^T\rangle_{\text{data}}}_{\text{正相位}} - \underbrace{\langle v h^T\rangle_{\text{recon}}}_{\text{一步重建}} \]

直覺:從真實資料出發的取樣鏈,一開始就靠近資料分佈—— 重建誤差( \(v_0\) 與 \(v_1\) 的差)會隨訓練下降, 這個誤差下降就是「模型正在學會資料」的偵探證據。

\[ \boxed{\text{對比散度:用「一步重建」代替「無限取樣」——快而有效}} \]

第四條線索:堆疊成深度信念網路#

逐層貪婪預訓練: 1. 用 CD 訓練 RBM \(_1\) : \(v \to h^{(1)}\) (學低階特徵,如邊); 2. 凍結 RBM \(_1\) ,把 \(h^{(1)}\) 當下一層的可見層,訓練 RBM \(_2\) (學高階特徵,如角、紋理); 3. 依此類推,堆疊 RBM \(_3\) 、RBM \(_4\) ……; 4. 最後在頂端加標籤層,用反向傳播微調整個網路。

\[ \boxed{\text{無監督預訓練(好的起點)} + \text{監督微調(好的終點)} = \text{深層網路成功}} \]

預訓練把權重放在靠近好解的區域——反向傳播不再陷入爛的局部極小, 梯度消失的問題被「好的初始化」繞過了。

Python:簡化 RBM 的單步對比散度#

# 受限玻爾茲曼機(RBM):單步對比散度(小二值向量)
import random, math

random.seed(42)

def sigmoid(x):
    return 1.0 / (1.0 + math.exp(-x))

# 資料:8 個樣本,每個 6 維二值向量(前 3 維為一組、後 3 維為一組)
data = [
    [1, 1, 1, 0, 0, 0],
    [1, 0, 1, 0, 0, 0],
    [1, 1, 1, 0, 0, 1],
    [0, 0, 0, 1, 1, 1],
    [0, 0, 1, 1, 1, 0],
    [0, 0, 0, 1, 0, 1],
]

n_v, n_h = 6, 4
W = [[random.uniform(-0.1, 0.1) for _ in range(n_h)] for _ in range(n_v)]
b = [0.0] * n_v          # 可見層偏置
c = [0.0] * n_h          # 隱藏層偏置
lr = 0.5

def sample_h(v):
    """正向:P(h=1|v) = sigmoid(c + W^T v)"""
    probs = []
    for j in range(n_h):
        z = c[j] + sum(W[i][j] * v[i] for i in range(n_v))
        probs.append(sigmoid(z))
    return [1 if random.random() < p else 0 for p in probs], probs

def sample_v(h):
    """反向(重建):P(v=1|h) = sigmoid(b + W h)"""
    probs = []
    for i in range(n_v):
        z = b[i] + sum(W[i][j] * h[j] for j in range(n_h))
        probs.append(sigmoid(z))
    return [1 if random.random() < p else 0 for p in probs], probs

def recon_error(v, v1):
    """重建誤差:v0 與重建 v1 的平均平方差"""
    return sum((v[i] - v1[i]) ** 2 for i in range(n_v)) / n_v

print("RBM 單步對比散度(重建誤差應隨訓練下降):")
for epoch in range(1, 2001):
    lr = 0.5 if epoch <= 500 else (0.1 if epoch <= 1500 else 0.02)  # 學習率退火
    err = 0.0
    for v0 in data:
        h0, _ = sample_h(v0)        # 正相位取樣
        v1, _ = sample_v(h0)        # 反向:一步重建
        h1, _ = sample_h(v1)        # 負相位取樣
        # 更新:ΔW = v0 h0^T − v1 h1^T(對比散度)
        for i in range(n_v):
            for j in range(n_h):
                W[i][j] += lr * (v0[i] * h0[j] - v1[i] * h1[j]) / len(data)
        for i in range(n_v):
            b[i] += lr * (v0[i] - v1[i]) / len(data)
        for j in range(n_h):
            c[j] += lr * (h0[j] - h1[j]) / len(data)
        err += recon_error(v0, v1)
    if epoch in (1, 100, 1000, 2000):
        print(f"  epoch {epoch:>4d}:平均重建誤差 = {err / len(data):.4f}")

# 驗證:訓練後的模型重建資料(用機率,不用隨機取樣)
print("\n訓練後的重建(機率取整):")
for v0 in data:
    h0, _ = sample_h(v0)
    v1p, _ = sample_v(h0)
    v1 = [round(p) for p in v1p]
    print(f"  {''.join(map(str, v0))} → {''.join(map(str, v1))}")
輸出:
RBM 單步對比散度(重建誤差應隨訓練下降):
  epoch    1:平均重建誤差 = 0.5556
  epoch  100:平均重建誤差 = 0.1667
  epoch 1000:平均重建誤差 = 0.0833
  epoch 2000:平均重建誤差 = 0.0556

訓練後的重建(機率取整):
  111000 → 111000
  101000 → 101000
  111001 → 111001
  000111 → 000111
  001110 → 001110
  000101 → 000101

先用 python3 實際執行(見下方輸出區塊),結果重建誤差穩定下降, 訓練後的模型能把資料幾乎完美地重建—— 對比散度確實讓 RBM 學會了資料的結構 ✓

結案 -- 後果與影響#

  • 2006:深度學習的誕生年:
\[ \boxed{\text{2006(DBN, Science)} = \text{deep learning 的元年}} \]

「deep learning」一詞隨 DBN 開始流行; 2009 年 Hinton 團隊用 DBN 打破語音辨識的紀錄(MSR 合作)—— 語音界第一個大規模轉向深度學習。 - AlexNet 的前夜(2012): DBN 證明「深層可訓練」之後,問題只剩「更快、更大」—— 2012 年,Hinton 的學生 Krizhevsky、Sutskever 用 GPU 訓練 AlexNet(見 2012-亞歷克斯AlexNet.md)橫掃 ImageNet—— 預訓練的角色後來被 ReLU + 大資料取代,但深度學習的路是 DBN 開出來的。

\[ \text{DBN(2006)} \xrightarrow{\text{GPU + 大資料}} \text{AlexNet(2012)}. \]
  • RBM 與能量模型的血統:
\[ \text{Hopfield(1982)} \to \text{Boltzmann 機(1985)} \to \text{RBM + CD(2002–2006)} \]

Hinton 因 Hopfield–Boltzmann 機一脈的貢獻,於 2018 年與 Hopfield 同獲圖靈獎(見 ../資訊科學/2018-深度學習三巨頭.md)—— 2024 年 Hopfield 更進一步獲諾貝爾物理學獎。 - 預訓練思想的延續: 逐層預訓練雖被 ReLU 時代淡忘,但「先無監督、後監督」的思想 在 2010 年代末以預訓練語言模型的形式重生:

\[ \text{DBN 預訓練(2006)} \xrightarrow{} \text{word2vec(2013)} \xrightarrow{} \text{Transformer 預訓練(2017)}. \]
  • 理論與工程的合作: CD 沒有完整證明(Carreira-Perpiñán & Hinton 2005 只給了部分分析)—— 「先試了再說」的工程直覺與能量模型的嚴謹數學並存, 正是深度學習的方法論縮影。
  • 歷史定位:Hinton 是深度學習的守夜人—— 在神經網路最冷的年代(1969 寒冬、SVM 主流)堅持深層的信念二十年, 終於在 2006 年點火;這把火一直燒到今天的大模型。

關鍵人物與文獻#

  • G. E. Hinton:A Fast Learning Algorithm for Deep Belief Networks(Science, 2006,與 Osindero、Teh);Training Products of Experts by Minimizing Contrastive Divergence(2002);2018 圖靈獎。
  • S. Osindero、Y.-W. Teh:DBN 共同作者——逐層貪婪訓練的數學。
  • R. Rumelhart、D. E. Rumelhart:反向傳播(1986,見 1986-反向傳播復興.md)——深層的困境由它暴露。
  • P. Smolensky:Harmonium(1986)——RBM 的前身。
  • J. Hopfield:Hopfield 網路(1982)——能量模型的起點。
  • V. Vapnik:SVM(1995 前的主流)——神經網路最冷年代的對手。
  • 相關案件:1986-反向傳播復興.md、2012-亞歷克斯AlexNet.md、../資訊科學/2018-深度學習三巨頭.md、../資訊科學/1936-圖靈機.md。