深度学习革命
3. 深度学习革命(2006年至今)
2006年:深度学习奠基——深度信念网络(DBN)
数学原理
DBN由多层受限玻尔兹曼机(RBM)堆叠而成,通过无监督预训练初始化权重,再通过反向传播微调。
- RBM的能量函数:
E ( v , h ) = − ∑ i a i v i − ∑ j b j h j − ∑ i , j v i w i j h j E(v, h) = -\sum_{i} a_i v_i - \sum_{j} b_j h_j - \sum_{i,j} v_i w_{ij} h_j E(v,h)=−i∑aivi−j∑bjhj−i,j∑viwijhj
其中 ( v ) 是可见层,( h ) 是隐藏层,( a )、( b ) 是偏置,( w_{ij} ) 是权重。 - 联合概率分布:
P ( v , h ) = 1 Z e − E ( v , h ) ( Z 为 归 一 化 因 子 ) P(v, h) = \frac{1}{Z} e^{-E(v, h)} \quad (Z为归一化因子) P(v,h)=Z1e−E(v,h)(Z为归一化因子) - 对比散度(CD-k)训练:
通过采样更新权重:
Δ w i j = η ( ⟨ v i h j ⟩ data − ⟨ v i h j ⟩ recon ) \Delta w_{ij} = \eta (\langle v_i h_j \rangle_{\text{data}} - \langle v_i h_j \rangle_{\text{recon}}) Δwij=η(⟨vihj⟩data−⟨vihj⟩recon)
代码实现(RBM训练)
import numpy as np
class RBM:
def __init__(self, n_visible, n_hidden):
self.W = np.random.randn(n_visible, n_hidden) * 0.1
self.a = np.zeros(n_visible)
self.b = np.zeros(n_hidden)
def sigmoid(self, x):
return 1 / (1 + np.exp(-x))
def sample_h(self, v):
h_prob = self.sigmoid(np.dot(v, self.W) + self.b)
return h_prob, np.random.binomial(1, h_prob)
def sample_v(self, h):
v_prob = self.sigmoid(np.dot(h, self.W.T) + self.a)
return v_prob, np.random.binomial(1, v_prob)
def train(self, data, lr=0.01, k=1, epochs=100):
for _ in range(epochs):
for v0 in data:
# Positive phase
h0_prob, h0 = self.sample_h(v0)
# Negative phase (CD-k)
vk = v0
for _ in range(k):
_, hk = self.sample_h(vk)
vk_prob, vk = self.sample_v(hk)
# Update weights
self.W += lr * (np.outer(v0, h0_prob) - np.outer(vk, hk))
self.a += lr * (v0 - vk_prob)
self.b += lr * (h0_prob - hk)
# 示例:训练RBM学习MNIST数据
from sklearn.datasets import fetch_openml
mnist = fetch_openml('mnist_784', version=1)
data = mnist.data / 255.0
data = np.round(data) # 二值化
rbm = RBM(n_visible=784, n_hidden=256)
rbm.train(data.sample