文章目录
第三章
3.1 线性回归
模型
线性回归假设输入和输出是线性关系
y
^
=
w
1
x
1
+
w
2
x
2
+
b
\hat{y} = w_1x_1 +w_2x_2+b
y^=w1x1+w2x2+b
其中
w
1
,
w
2
w_1, w_2
w1,w2是权重, b是偏差
采用平方差损失, 则第i个样本的误差表达式为
l
i
(
W
,
b
)
=
1
2
(
y
i
−
y
i
^
)
2
l^{i}(W, b) = \frac{1}{2}(y^{i}-\hat{y^{i}})^2
li(W,b)=21(yi−yi^)2
而整个训练集(n个样本)的平均误差为
L
(
W
,
b
)
=
1
n
∑
i
=
1
n
1
2
(
y
i
−
y
i
^
)
2
L(W, b) =\frac{1}{n}\sum_{i=1}^{n} \frac{1}{2}(y^{i}-\hat{y^{i}})^2
L(W,b)=n1i=1∑n21(yi−yi^)2
最后通过优化方法求出最佳参数
W
∗
,
b
∗
=
a
r
g
m
i
n
w
,
b
L
(
W
,
b
)
W^{*}, b^* = \mathop{argmin} \limits_{w, b} L(W, b)
W∗,b∗=w,bargminL(W,b)
3.2 softmax回归
softmax回归模型
softmax回归跟线性回归⼀样将输⼊特征与权重做线性叠加。与线性回归的⼀个主要不同在于, softmax回归的输出值个数等于标签⾥的类别数。假设⼀共有4种特征和3种输出动物类别,所以 权重包含12个标量(带下标的w)、偏差包含3个标量(带下标的b),且对每个输⼊计算o1,o2,o3这3个 输出:
o 1 = x 1 w 11 + x 2 w 21 + x 3 w 31 + x 4 w 41 + b 1 o 2 = x 1 w 12 + x 2 w 22 + x 3 w 32 + x 4 w 42 + b 2 o 3 = x 1 w 13 + x 2 w 23 + x 3 w 33 + x 4 w 43 + b 3 o_{1} = x_1w_{11} + x_2w_{21} + x_3w_{31} + x_4w_{41} + b_1 \\ o_2 = x_1w_{12} + x_2w_{22} + x_3w_{32} + x_4w_{42} + b_2\\ o_3 = x_1w_{13} + x_2w_{23} + x_{3}w_{33} + x_4w_{43} + b_3 o1=x1w11+x2w21+x3w31+x4w41+b1o2=x1w12+x2w22+x3w32+x4w42+b2o3=x1w13+x2w23+x3w33+x4w43+b3
- 输出问题
对于分类问题, 如果直接使用输出层的输出有两个问题:
一方面,由于输出层的输出值的范围不确定,我们难以直观上判断这些值的意义。
另一方面,由于真实标签是离散值,这些离散值与不确定范围的输出值之间的误差难以衡量。 - 解决方法
使用softmax函数
y 1 ^ , y 2 ^ , y 3 ^ = s o f t m a x ( o 1 , o 2 , o 3 ) \hat{y_1},\hat{y_2}, \hat{y_3} = softmax(o_1,o_2, o_3) y1^,y2^,y3^=softmax(o1,o2,o3)
其中,
y 1 ^ = e x p ( o 1 ) ∑ i = 1 3 e x p ( o i ) , y 2 ^ = e x p ( o 2 ) ∑ i = 1 3 e x p ( o i ) , y 3 ^ = e x p ( o 3 ) ∑ i = 1 3 e x p ( o i ) \hat{y_1} = \frac{exp(o_1)}{\sum\limits_{i=1}^3exp(o_i)}, \hat{y_2} = \frac{exp(o_2)}{\sum\limits_{i=1}^3exp(o_i)}, \hat{y_3} = \frac{exp(o_3)}{\sum\limits_{i=1}^3exp(o_i)} y1^=i=1∑3exp(oi)exp(o1),y2^=i=1∑3exp(oi)exp(o2),y3^=i=1∑3exp(oi)exp(o3)
这样
y 1 ^ + y 2 ^ + y 3 ^ = 1 , 且 0 ≤ y 1 ^ , y 2 ^ , y 3 ^ ≤ 1 \hat{y_1}+\hat{y_2}+ \hat{y_3}=1, 且0\le\hat{y_1},\hat{y_2}, \hat{y_3}\le1 y1^+y2^+y3^=1,且0≤y1^,y2^,y3^≤1, 就是一个合理的概率发布。
并且 a r g m i n i o i = a r g m i n i y i ^ \mathop{argmin} \limits_{i}o_i= \mathop{argmin} \limits_{i}\hat{y_i} iargminoi=iargminyi^
说明softmax并不会概率预测的类别输出。
交叉熵损失函数
对于单个样本的交叉熵:
H
(
y
(
i
)
,
y
(
i
)
^
)
=
−
∑
j
=
1
q
y
j
(
i
)
l
o
g
y
^
j
(
i
)
H(y^{(i)}, \hat{y_{(i)}}) = -\sum_{j=1}^{q}y_j^{(i)}log\hat{y}_j^{(i)}
H(y(i),y(i)^)=−j=1∑qyj(i)logy^j(i)
j假设训练集的样本数为n, 交叉熵损失函数的定义为
l
(
Θ
)
=
1
n
∑
i
=
1
n
H
(
y
(
i
)
,
y
^
(
i
)
)
l(\Theta) = \frac{1}{n}\sum_{i=1}^{n}H(y^{(i)}, \hat{y}^{(i)})
l(Θ)=n1i=1∑nH(y(i),y^(i))
3.3 MLP(多层感知机)
基本概念
多层感知机在单层神经⽹络的基础上引⼊了⼀到多个隐藏层(hidden layer), 隐藏层位于输⼊层 和输出层之间。
对于一个只含有单隐藏层的多层感知机,输入为X, 输出为O为:
H
=
X
W
h
+
b
h
,
O
=
H
W
o
+
b
0
H = XW_h+b_h,\\ O = HW_o+b_0
H=XWh+bh,O=HWo+b0
联立起来:
O
=
(
X
W
h
+
b
h
)
W
o
+
b
o
=
X
W
h
W
o
+
b
h
W
o
+
b
o
O=(XW_h+b_h)Wo+b_o=XW_hW_o+b_hW_o+b_o
O=(XWh+bh)Wo+bo=XWhWo+bhWo+bo
这样实际上仍是一个单层神经网络,因为全连接层只是对数据做仿射变换, 而多个仿射变换仍是一个仿射变换对此可以引入激活函数来解决这个问题
激活函数
ReLU函数
R e L U ( x ) = m a x ( 0 , x ) ReLU(x) = max(0, x) ReLU(x)=max(0,x)
Sigmoid函数
s
i
g
m
o
i
d
(
x
)
=
1
1
+
e
x
p
(
−
x
)
sigmoid(x) = \frac{1}{1+exp(-x)}
sigmoid(x)=1+exp(−x)1
sigmoid函数可以将元素的值变换到0和1之间。
s
i
g
m
o
i
d
′
(
x
)
=
s
i
g
m
o
i
d
(
x
)
(
1
−
s
i
g
m
o
i
d
(
x
)
)
sigmoid'(x)=sigmoid(x)(1-sigmoid(x))
sigmoid′(x)=sigmoid(x)(1−sigmoid(x))
当输入为0时, sigmoid函数的导数达到最大值0.25; 当输入越偏离0时, sigmoid函数的导数越接近0.
Tanh函数
t
a
n
h
(
x
)
=
1
−
e
x
p
(
−
2
x
)
1
+
e
x
p
(
−
2
x
)
tanh(x) = \frac{1-exp(-2x)}{1+exp(-2x)}
tanh(x)=1+exp(−2x)1−exp(−2x)
tanh函数将元素的值变换到-1和1之间, 当输入接近0时, tanh函数接近线性变换
$
t
a
n
h
′
(
x
)
=
1
−
t
a
n
h
2
(
x
)
tanh'(x)=1-tanh^2(x)
tanh′(x)=1−tanh2(x)
输入为0时,tanh函数的导数达到最大值1;当输入越偏离0时,tanh函数的导数越接近0。
激活函数的选择
通过选用ReLU函数作为隐藏层的激活函数, 由于梯度消失的问题, 有时要避免使用sigmoid和tanh函数。并且当神经网络层数较多时,最好使用ReLU函数,ReLU函数比较简单计算量少,而sigmoid和tanh函数计算量大很多。
MLP模型
H
=
ϕ
(
X
W
h
+
b
h
)
,
O
=
H
W
o
+
b
o
H=\phi(XW_h+b_h),\\ O=HW_o+b_o
H=ϕ(XWh+bh),O=HWo+bo
其中
ϕ
\phi
ϕ为激活函数。
3.4 过拟合、欠拟合
基本概念
训练误差和泛化误差
首先需要区分训练误差(training error)和泛化误差(generalization error)。通俗来讲,前者指模型在训练数据集上表现出的误差,后者指模型在任意一个测试数据样本上表现出的误差的期望,并常常通过测试数据集上的误差来近似。计算训练误差和泛化误差可以使用之前介绍过的损失函数,例如线性回归用到的平方损失函数和softmax回归用到的交叉熵损失函数。
机器学习模型应关注降低泛化误差。
模型选择
- 验证集
从严格意义上讲,测试集只能在所有超参数和模型参数选定后使用一次。不可以使用测试数据选择模型,如调参。由于无法从训练误差估计泛化误差,因此也不应只依赖训练数据选择模型。鉴于此,我们可以预留一部分在训练数据集和测试数据集以外的数据来进行模型选择。这部分数据被称为验证数据集,简称验证集(validation set)。例如,我们可以从给定的训练集中随机选取一小部分作为验证集,而将剩余部分作为真正的训练集。 - K折交叉验证
由于验证数据集不参与模型训练,当训练数据不够用时,预留大量的验证数据显得太奢侈。一种改善的方法是K折交叉验证(K-fold cross-validation)。在K折交叉验证中,我们把原始训练数据集分割成K个不重合的子数据集,然后我们做K次模型训练和验证。每一次,我们使用一个子数据集验证模型,并使用其他K-1个子数据集来训练模型。在这K次训练和验证中,每次用来验证模型的子数据集都不同。最后,我们对这K次训练误差和验证误差分别求平均。
过拟合和欠拟合
- 欠拟合
模型无法得到较低的训练误差的现象 - 过拟合
模型的训练误差远小于测试误差的现象
模型复杂度
给定训练数据集,模型复杂度和误差之间的关系:
解决方案
训练数据集大小
影响欠拟合和过拟合的另一个重要因素是训练数据集的大小。一般来说,如果训练数据集中样本数过少,特别是比模型参数数量(按元素计)更少时,过拟合更容易发生。此外,泛化误差不会随训练数据集里样本数量增加而增大。因此,在计算资源允许的范围之内,我们通常希望训练数据集大一些,特别是在模型复杂度较高时,例如层数较多的深度学习模型。
权重衰减
权重衰减等价于 范数正则化(regularization)。正则化通过为模型损失函数添加惩罚项使学出的模型参数值较小,是应对过拟合的常用手段。
- L2范数正则化
dropout
对神经网络层中的神经元按一定概率丢弃, 让其为0
3.5 梯度消失、梯度爆炸
深度模型有关数值稳定性的典型问题是消失(vanishing)和爆炸(explosion)。
当神经网络的层数较多时,模型的数值稳定性容易变差。
假设一个层数为L的多层感知机的第 l l l层 H ( l ) H^{(l)} H(l)的权重参数为 W ( l ) W^{(l)} W(l),输出层 H ( L ) H^{(L)} H(L)的权重参数为 W ( L ) W^{(L)} W(L)。为了便于讨论,不考虑偏差参数,且设所有隐藏层的激活函数为恒等映射(identity mapping) ϕ ( x ) = x \phi(x)=x ϕ(x)=x。给定输入X,多层感知机的第 l l l层的输出 H ( l ) = X W ( 1 ) W ( 2 ) . . . W ( l ) H^{(l)}=XW^{(1)}W^{(2)}...W^{(l)} H(l)=XW(1)W(2)...W(l)。此时,如果层数 l l l较大, H ( l ) H^{(l)} H(l)的计算可能会出现衰减或爆炸。举个例子,假设输入和所有层的权重参数都是标量,如权重参数为0.2和5,多层感知机的第30层输出为输入X分别与 0. 2 ( 30 ) ≈ 1 × 1 0 ( − 21 ) 0.2^{(30)}\approx1\times10^{(-21)} 0.2(30)≈1×10(−21)(消失)和 5 ( 30 ) ≈ 9 × 1 0 ( 20 ) 5^{(30)}\approx9\times10^{(20)} 5(30)≈9×10(20)(爆炸)的乘积。当层数较多时,梯度的计算也容易出现消失或爆炸
随机初始化模型参数
在神经网络中,通常需要随机初始化模型参数。下面我们来解释这样做的原因。
回顾多层感知机一节描述的多层感知机。为了方便解释,假设输出层只保留一个输出单元
o
1
o_1
o1(删去
o
2
o_2
o2和
o
3
o_3
o3以及指向它们的箭头),且隐藏层使用相同的激活函数。如果将每个隐藏单元的参数都初始化为相等的值,那么在正向传播时每个隐藏单元将根据相同的输入计算出相同的值,并传递至输出层。在反向传播中,每个隐藏单元的参数梯度值相等。因此,这些参数在使用基于梯度的优化算法迭代后值依然相等。之后的迭代也是如此。在这种情况下,无论隐藏单元有多少,隐藏层本质上只有1个隐藏单元在发挥作用。因此,正如在前面的实验中所做的那样,我们通常将神经网络的模型参数,特别是权重参数,进行随机初始化。
PyTorch中默认随机初始化
- Xavier随机初始化
假设某全连接层的输入个数为,输出个数为,Xavier随机初始化将使该层中权重参数的每个元素都随机采样于均匀分布
U ( − 6 a + b , 6 a + b ) U(-\sqrt{\frac{6}{a+b}},\sqrt{\frac{6}{a+b}} ) U(−a+b6,a+b6)
它的设计主要考虑到,模型参数初始化后,每层输出的方差不该受该层输入个数影响,且每层梯度的方差也不该受该层输出个数影响。
考虑环境因素
协变量偏移
这里我们假设,虽然输入的分布可能随时间而改变,但是标记函数,即条件分布P(y∣x)不会改变。虽然这个问题容易理解,但在实践中也容易忽视。
想想区分猫和狗的一个例子。我们的训练数据使用的是猫和狗的真实的照片,但是在测试时,我们被要求对猫和狗的卡通图片进行分类。
显然,这不太可能奏效。训练集由照片组成,而测试集只包含卡通。在一个看起来与测试集有着本质不同的数据集上进行训练,而不考虑如何适应新的情况,这是不是一个好主意。不幸的是,这是一个非常常见的陷阱。
统计学家称这种协变量变化是因为问题的根源在于特征分布的变化(即协变量的变化)。数学上,我们可以说P(x)改变了,但P(y∣x)保持不变。尽管它的有用性并不局限于此,当我们认为x导致y时,协变量移位通常是正确的假设。
标签偏移
当我们认为导致偏移的是标签P(y)上的边缘分布的变化,但类条件分布是不变的P(x∣y)时,就会出现相反的问题。当我们认为y导致x时,标签偏移是一个合理的假设。例如,通常我们希望根据其表现来预测诊断结果。在这种情况下,我们认为诊断引起的表现,即疾病引起的症状。有时标签偏移和协变量移位假设可以同时成立。例如,当真正的标签函数是确定的和不变的,那么协变量偏移将始终保持,包括如果标签偏移也保持。有趣的是,当我们期望标签偏移和协变量偏移保持时,使用来自标签偏移假设的方法通常是有利的。这是因为这些方法倾向于操作看起来像标签的对象,这(在深度学习中)与处理看起来像输入的对象(在深度学习中)相比相对容易一些。
病因(要预测的诊断结果)导致 症状(观察到的结果)。
训练数据集,数据很少只包含流感p(y)的样本。
而测试数据集有流感p(y)和流感q(y),其中不变的是流感症状p(x|y)。
概念偏移
另一个相关的问题出现在概念转换中,即标签本身的定义发生变化的情况。这听起来很奇怪,毕竟猫就是猫。的确,猫的定义可能不会改变,但我们能不能对软饮料也这么说呢?
参考
《动手学习深度学习》