- 多层感知机(multilayer perceptron, MLP)
- 输入层 – 隐藏层(hidden layer) – 输出层
- 激活函数(activation function)
通过使用更深(而不是更广)的网络,可以更容易地逼近许多函数。(为什么?)
ReLU(x)=max(x,0)
pReLU(x,α)=max(0,x)+αmin(0,x)
sigmoid(x)=1+e−x1
tanh(x)=ex+e−xex−e−x=1+e−2x1−e−2x
形状类似sigmoid函数,不同的是tanh函数关于坐标系原点中心对称。
通常选择2的次幂作为层的宽度,以便内存分配与寻址。
num_inputs, num_outputs, num_hiddens = 784, 10, 256
W1 = nn.Parameter(torch.randn(
num_inputs, num_hiddens, requires_grad=True) * 0.01)
b1 = nn.Parameter(torch.zeros(num_hiddens,
requires_grad=True))
W2 = nn.Parameter(torch.randn(
num_hiddens, num_outputs, requires_grad=True) * 0.01)
b2 = nn.Parameter(torch.zeros(num_outputs, requires_grad=True))
def relu(X):
return torch.max(X, torch.zeros_like(X))
def net(X):
X = X.reshape((-1, num_inputs))
H = relu(X@W1 + b1)
return (H@W2 + b2)
或者使用高级API
net = nn.Sequential(nn.Flatten(),
nn.Linear(num_inputs, num_hiddens),
nn.ReLU(),
nn.Linear(num_hiddens, num_outputs)
)
def init_weights(m):
if type(m) == nn.Linear:
nn.init.normal_(m.weight, std=0.01)
net.apply(init_weights)
- 模式(pattern)
目标:发现反应训练集潜在总体规律的模式→泛化能力
- 欠拟合(underfitting)
- 过拟合(overfitting)
正则化(regularization):用于对抗过拟合的技术
- 训练误差(training error)
- 泛化误差(generalization error)
- 训练集(train) – 验证集(validation) – 测试集(test)
训练集用来估计模型,
验证集用来确定网络结构或者控制模型复杂程度的参数,
测试集用来检验最终选择最优的模型的性能如何。
- 可调整参数的数量
- 参数采用的值(权重取值范围较大时,模型可能更容易过拟合)
- 训练样本的数量
有时训练数据稀缺,可能无法提供足够数据来构成一个合适的验证集。此时通常会使用K折交叉验证。
将原始训练数据分成K个无交集,然后执行K次模型训练和验证。每次在K-1个子集上训练,最后一个子集用来验证。
最后,通过对K次实验的结果取平均来估计训练和验证误差。
缓解过拟合:
- 限制特征数量
- 限制模型参数选择范围
权重衰减是一种广泛使用的正则化技术。
通过函数与零的距离(范数)来衡量函数的复杂度。将函数复杂度作为惩罚项加到最小化损失的问题中,以保证权重向量比较少。新的损失函数可以写做:
L(w,b)+2λ∥w∥2w←(1−ηλ)w−∣B∣ηi∈B∑x(i)(w⊤x(i)+b−y(i))
λ为正则化常数,是一个非负超参数。
这里使用了L2范数,而非L1范数。
- 对权重向量的大分量施加了巨大的乘法
- 偏向于在大量特征上均匀分布权重的模型
- 可能使对单个变量的观测误差更稳定(为什么?)
- 权重集中于一小部分特征
- 其他权重清零(可以从图中蓝色方形与红色椭圆的交点看出)
- 具有特征选择(feature selection)的能力
图片来源及详细解释参见机器学习算法实践-岭回归和LASSO – 知乎
trainer = torch.optim.SGD([
{'params': net[0].weight, 'weight_decay': wd},
{'params': net[0].bias}], lr=lr)
避免过拟合
在前项传播过程中,计算每一内部层的同时注入噪声。从表面上看是在训练过程中丢弃(dropout)一些神经元。
在标准暂退法正则化中,每个中间活性值h以暂退概率p由随机变量h′替换,同时期望值E[h′]=h保持不变。
h′={01−ph 概率为 p 其他情况
需要说明的是,暂退法的原始论文提到了一个关于有性繁殖的类比:神经网络过拟合与每一层都依赖于前一层激活值相关,称这种情况为“共适应性”。作者认为,暂退法会破坏共适应性,就像有性生殖会破坏共适应的基因一样。(没看懂。。)
常见技巧:在靠近输入层的地方设置较低的暂退概率。(为什么?)
net = nn.Sequential(
nn.Linear(784, 256),
nn.ReLU(),
nn.Dropout(dropout1),
nn.Linear(256, 256),
nn.ReLU(),
nn.Dropout(dropout2),
nn.Linear(256, 10)
)
- 前向传播(forward propagation 或 forward pass)
- 矩阵的Frobenius范数:将矩阵展平为向量后应用的L2范数
- 反向传播(backward propagation 或 backpropagation)
反向传播重复利用前向传播中存储的中间值,以避免重复计算。我们需要保留中间值,直到反向传播完成。
这也是训练比单纯预测需要更多内存(显存)的原因之一。
使用更大批量来训练更深层次的网络更容易导致内存不足错误。
输出o关于任何一组参数W(l)的梯度为:
∂W(l)o=M(L)= def ∂h(L−1)h(L)⋅…⋅M(l+1) def =∂h(l)h(l+1)v(l)= def ∂W(l)h(l)
为避免数值下溢影响,一个常见技巧是切换到对数空间,即将数值表示的压力从尾数转移到指数。
- 参数更新过小,在每次更新时几乎不会移动,导致模型无法学习。
- 例如sigmoid函数,在输入很大或很小时,梯度都会消失。
相比之下,ReLU激活函数缓解了梯度消失问题,加速收敛。
- 网络较深时,容易在某一层切断梯度。
隐藏层参数不能初始化为相同值,因为小批量随机梯度下降不会破坏对称性(尽管暂退法正则化可以)。
在线性全连接层中,当正向传播时,若要从输入到输出方差保持不变(为什么?),则需要权重标准差σ满足ninσ2=1;当反向传播时,同理需要权重标准差σ满足noutσ2=1(为什么?)。
为了平衡二者需求,取
21(nin +nout )σ2=1 或等价于 σ=nin +nout 2
权重可以按高斯分布初始化,也可以按均匀分布初始化,但方差均如上式描述。
机器学习许多应用存在的问题:通过将基于模型的决策引入环境,我们可能会破坏模型。
在很多情况下,训练集和测试集并不来自同个分布,这就是所谓的分布偏移。假设训练数据集分布为Ptra(x,y),测试数据集分布为Ptst(x,y)
fminimizen1i=1∑nl(f(xi),yi)
Ep(x,y)[l(f(x),y)]=∬l(f(x),y)p(x,y)dxdy
由于通常无法获取真实分布p(x,y),一般通过最小化经验风险来近似最小化真实风险。
下述定义部分摘自
Understanding Dataset Shift. How to make sure your models are not… | by Matthew Stewart | Towards Data Science
Covariate shift appears only in X→Y problems, and is defined as the case where Ptra(y∣x)=Ptst(y∣x) and Ptra(x) =Ptst(x)
设训练数据集的观测值x来自于某些源分布q(x)而非目标分布p(x),则有:
∬l(f(x),y)p(y∣x)p(x)dxdy=∬l(f(x),y)q(y∣x)q(x)q(x)p(x)dxdy
若令βi= def q(xi)p(xi),则可以使用“加权经验风险最小化”来训练模型:
fminimizen1i=1∑nβil(f(xi),yi)
其中“真实”的分布p可以通过访问测试数据获取。
现假设有一个训练集{(x1,y1),…,(xn,yn)}和一个未标记的测试集{u1,…,um},我们预先学习一个分类器来区分从p(x)抽取的数据和从q(x)抽取的数据。整个算法包括以下几个步骤:
- 生成一个二元分类数据集{(x1,−1),…,(xn,−1),(u1,1),…,(um,1)}
- 用对数几率回归(logistic regression,softmax回归的二元分类特例) 训练二元分类器得到函数h
P(z=1∣x)=p(x)+q(x)p(x) and hence P(z=−1∣x)P(z=1∣x)=q(x)p(x)P(z=1∣x)=1+exp(−h(x))1
- 使用 βi=exp(h(xi)) 或更好的 βi=min(exp(h(xi)),c) (c为常量) 对训练数据进行加权
- 使用权重 βi 进行 {(x1,y1),…,(xn,yn)} 的训练
Prior probability shift appears only in Y→X problems, and is defined as the case where Ptra(x∣y)=Ptst(x∣y) and Ptra(y)=Ptst(y)
同样地可以定义βi= def q(yi)p(yi),根据加权经验风险最小化来训练模型。
下面给出估算目标标签分布p的一种方法:
-
计算验证集(为什么?)的混淆矩阵C。该矩阵中每个单元格cij的值表示验证集中真实标签为j,模型预测为i的样本占比。
-
将所有模型在测试时的预测取平均数,得到平均模型输出μ(y^)∈Rk
-
可以通过求解一个简单线性系统来估算测试集的标签分布p
Cp(y)=μ(y^)
∑j=1kcijp(yj)=μ(y^i)
Concept shift is defined as
- Ptra(y∣x)=Ptst(y∣x) and Ptra(x)=Ptst(x) in X→Y problems.
- Ptra(x∣y)=Ptst(x∣y) and Ptra(y)=Ptst(y) in Y→X problems.
概念的变化总是缓慢的。我们使用新数据更新现有网络权重,而不是从头开始训练。
因为我们不知道哪些特征是相关的,不想让惩罚分配给一个特征的系数比分配给其他特征的系数更大。
一些情况下,我们关心相对误差yy−y^,而非绝对误差y−y^,因此使用对数来衡量差异。
e−δ≤yy^≤eδ⇔∣logy−logy^∣≤δ
误差函数为
n1i=1∑n(logyi−logy^i)2