多层感知机学习笔记
隐藏层
通过在网络中加入一个或多个隐藏层来克服线性模型的限制, 使其能处理更普遍的函数关系类型。 要做到这一点,最简单的方法是将许多全连接层堆叠在一起。 每一层都输出到上面的层,直到生成最后的输出。 我们可以把前层看作表示,把最后一层看作线性预测器。 这种架构通常称为多层感知机(multilayer perceptron),通常缩写为MLP。
从线性到非线性
H = σ ( X W ( 1 ) + b ( 1 ) ) , O = H W ( 2 ) + b ( 2 ) . \begin{split}\begin{aligned} \mathbf{H} & = \sigma(\mathbf{X} \mathbf{W}^{(1)} + \mathbf{b}^{(1)}), \\ \mathbf{O} & = \mathbf{H}\mathbf{W}^{(2)} + \mathbf{b}^{(2)}.\\ \end{aligned}\end{split} HO=σ(XW(1)+b(1)),=HW(2)+b(2).
激活函数
激活函数(activation function)通过计算加权和并加上偏置来确定神经元是否应该被激活, 它们将输入信号转换为输出的可微运算。 大多数激活函数都是非线性的。
ReLU 函数
ReLU
(
x
)
=
max
(
x
,
0
)
.
\operatorname{ReLU}(x) = \max(x, 0).
ReLU(x)=max(x,0).
ReLU函数有许多变体,包括参数化ReLU(Parameterized ReLU,pReLU)。该变体为ReLU添加了一个线性项,因此即使参数是负的,某些信息仍然可以通过:
pReLU
(
x
)
=
max
(
0
,
x
)
+
α
min
(
0
,
x
)
.
\operatorname{pReLU}(x) = \max(0, x) + \alpha \min(0, x).
pReLU(x)=max(0,x)+αmin(0,x).
sigmoid函数
sigmoid函数将输入变换为区间(0, 1)上的输出。 因此,sigmoid通常称为挤压函数(squashing function): 它将范围(-inf, inf)中的任意输入压缩到区间(0, 1)中的某个值:
sigmoid
(
x
)
=
1
1
+
exp
(
−
x
)
.
\operatorname{sigmoid}(x) = \frac{1}{1 + \exp(-x)}.
sigmoid(x)=1+exp(−x)1.
tanh函数
与sigmoid函数类似, tanh(双曲正切)函数也能将其输入压缩转换到区间(-1, 1)上。 tanh函数的公式如下:
tanh
(
x
)
=
1
−
exp
(
−
2
x
)
1
+
exp
(
−
2
x
)
.
\operatorname{tanh}(x) = \frac{1 - \exp(-2x)}{1 + \exp(-2x)}.
tanh(x)=1+exp(−2x)1−exp(−2x).
模型选择、欠拟合和过拟合
模型复杂+数据集小=过拟合
模型简单+数据集大=浅拟合
k折交叉验证
原始训练数据被分成个不重叠的子集。 然后执行k次模型训练和验证,每次在k-1个子集上进行训练, 并在剩余的一个子集(在该轮中没有用于训练的子集)上进行验证。 最后,通过对k次实验的结果取平均来估计训练和验证误差。
模型复杂+数据集小=过拟合
模型简单+数据集大=浅拟合
权重衰减
对于,我们恢复了原来的损失函数。 对于
λ
>
0
\lambda > 0
λ>0,我们限制
∥
w
∥
\| \mathbf{w} \|
∥w∥的大小。 这里我们仍然除以2:当我们取一个二次函数的导数时, 2和1/2会抵消,以确保更新表达式看起来既漂亮又简单。 你可能会想知道为什么我们使用平方范数而不是标准范数(即欧几里得距离)? 我们这样做是为了便于计算。 通过平方范数
L
2
L_2
L2,我们去掉平方根,留下权重向量每个分量的平方和。 这使得惩罚的导数很容易计算:导数的和等于和的导数。
L
(
w
,
b
)
+
λ
2
∥
w
∥
2
L(\mathbf{w}, b) + \frac{\lambda}{2} \|\mathbf{w}\|^2
L(w,b)+2λ∥w∥2
暂退法Dropout
删除了
h
2
h_2
h2和
h
5
h_5
h5, 因此输出的计算不再依赖于
h
2
h_2
h2或
h
5
h_5
h5,并且它们各自的梯度在执行反向传播时也会消失。
输出层的计算不能过度依赖于
h
1
,
…
,
h
5
h_1, \ldots, h_5
h1,…,h5的任何一个元素。
通常,我们在测试时不用暂退法。 给定一个训练好的模型和一个新的样本,我们不会丢弃任何节点,因此不需要标准化。 然而也有一些例外:一些研究人员在测试时使用暂退法, 用于估计神经网络预测的“不确定性”: 如果通过许多不同的暂退法遮盖后得到的预测结果都是一致的,那么我们可以说网络发挥更稳定。
前向传播和反向传播
前向传播(forward propagation或forward pass) 指的是:按顺序(从输入层到输出层)计算和存储神经网络中每层的结果。
绘制计算图有助于我们可视化计算中操作符和变量的依赖关系。 图4.7.1 是与上述简单网络相对应的计算图, 其中正方形表示变量,圆圈表示操作符。 左下角表示输入,右上角表示输出。 注意显示数据流的箭头方向主要是向右和向上的。
反向传播(backward propagation或backpropagation)指的是计算神经网络参数梯度的方法。
梯度消失和梯度爆炸
不稳定梯度带来的风险不止在于数值表示; 不稳定梯度也威胁到我们优化算法的稳定性。 我们可能面临一些问题。 要么是梯度爆炸(gradient exploding)问题: 参数更新过大,破坏了模型的稳定收敛; 要么是梯度消失(gradient vanishing)问题: 参数更新过小,在每次更新时几乎不会移动,导致模型无法学习。
随机初始化是保证在进行优化前打破对称性的关键
Xavier初始化
对于每一层,输出的方差不受输入数量的影响,任何梯度的方差不受输出数量的影响。
关键点
参数
w:权重
b:偏置
x:样本
o:未规范化输出
y^:规范化输出