(此为课程作业,参考价值不大,有需要可以通过链接直接阅读原文《动手学深度学习》)
多层感知机
通过在网络中加入一个或多个隐藏层来克服线性模型的限制, 使其能处理更普遍的函数关系类型。 要做到这一点,最简单的方法是将许多全连接层堆叠在一起。 每一层都输出到上面的层,直到生成最后的输出。 我们可以把前层看作表示,把最后一层看作线性预测器。 这种架构通常称为多层感知机(multilayer perceptron),通常缩写为MLP。
感知机两层神经元之间需要在仿射变换之后对每个隐藏单元应用非线性的激活函数(activation function)。 激活函数的输出被称为活性值(activations)。 一般来说,有了激活函数,就不可能再将我们的多层感知机退化成线性模型。
常用函数有tanh函数,sigmoid函数,ReLU函数。
BP神经网络
算法拓展
通过正则化防止过拟合。在训练参数化机器学习模型时, 权重衰减(weight decay)是最广泛使用的正则化的技术之一, 它通常也被称为L2正则化。
一般的损失函数由下式给出:
L
(
w
,
b
)
=
1
n
∑
i
=
1
n
1
2
(
w
⊤
x
(
i
)
+
b
−
y
(
i
)
)
2
.
L(\mathbf{w}, b) = \frac{1}{n}\sum_{i=1}^n \frac{1}{2}\left(\mathbf{w}^\top \mathbf{x}^{(i)} + b - y^{(i)}\right)^2.
L(w,b)=n1i=1∑n21(w⊤x(i)+b−y(i))2.
为了惩罚权重向量的大小,
我们必须以某种方式在损失函数中添加
∥
w
∥
2
\| \mathbf{w} \|^2
∥w∥2,通过正则化常数
λ
\lambda
λ来平衡这个新的额外惩罚的损失
这是一个这是一个非负超参数,则新的损失函数可写为:
L
(
w
,
b
)
+
λ
2
∥
w
∥
2
,
L(\mathbf{w}, b) + \frac{\lambda}{2} \|\mathbf{w}\|^2,
L(w,b)+2λ∥w∥2,
L
2
L_2
L2正则化线性模型构成经典的岭回归(ridge regression)算法,
L
1
L_1
L1正则化线性回归是统计学中类似的基本模型,通常被称为套索回归(lasso regression)。
L
2
L_2
L2正则化回归的小批量随机梯度下降更新如下式:
w
←
(
1
−
η
λ
)
w
−
η
∣
B
∣
∑
i
∈
B
x
(
i
)
(
w
⊤
x
(
i
)
+
b
−
y
(
i
)
)
.
\begin{aligned} \mathbf{w} & \leftarrow \left(1- \eta\lambda \right) \mathbf{w} - \frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}} \mathbf{x}^{(i)} \left(\mathbf{w}^\top \mathbf{x}^{(i)} + b - y^{(i)}\right). \end{aligned}
w←(1−ηλ)w−∣B∣ηi∈B∑x(i)(w⊤x(i)+b−y(i)).
性能优化
动量法
添加动量因子
自适应梯度算法
AdaGrad自适应梯度
使用变量 s t \mathbf{s}_t st来累加过去的梯度方差,如下所示:
g t = ∂ w l ( y t , f ( x t , w ) ) , s t = s t − 1 + g t 2 , w t = w t − 1 − η s t + ϵ ⋅ g t . \begin{aligned} \mathbf{g}_t & = \partial_{\mathbf{w}} l(y_t, f(\mathbf{x}_t, \mathbf{w})), \\ \mathbf{s}_t & = \mathbf{s}_{t-1} + \mathbf{g}_t^2, \\ \mathbf{w}_t & = \mathbf{w}_{t-1} - \frac{\eta}{\sqrt{\mathbf{s}_t + \epsilon}} \cdot \mathbf{g}_t. \end{aligned} gtstwt=∂wl(yt,f(xt,w)),=st−1+gt2,=wt−1−st+ϵη⋅gt.
通过该方法调整学习率,使学习率随着学习次数的增加而减小。
RMSProp
按动量法中的方式使用泄漏平均值,即
s
t
←
γ
s
t
−
1
+
(
1
−
γ
)
g
t
2
\mathbf{s}_t \leftarrow \gamma \mathbf{s}_{t-1} + (1-\gamma) \mathbf{g}_t^2
st←γst−1+(1−γ)gt2,其中参数
γ
>
0
\gamma > 0
γ>0。可以解决AdaGrad方法中学习率过渡衰减的问题。通过如下公式调整学习率:
s
t
←
γ
s
t
−
1
+
(
1
−
γ
)
g
t
2
,
x
t
←
x
t
−
1
−
η
s
t
+
ϵ
⊙
g
t
.
\begin{aligned} \mathbf{s}_t & \leftarrow \gamma \mathbf{s}_{t-1} + (1 - \gamma) \mathbf{g}_t^2, \\ \mathbf{x}_t & \leftarrow \mathbf{x}_{t-1} - \frac{\eta}{\sqrt{\mathbf{s}_t + \epsilon}} \odot \mathbf{g}_t. \end{aligned}
stxt←γst−1+(1−γ)gt2,←xt−1−st+ϵη⊙gt.
常数
ϵ
>
0
\epsilon > 0
ϵ>0通常设置为
1
0
−
6
10^{-6}
10−6,以确保我们不会因除以零或步长过大而受到影响。
Adam
Adam使用指数加权移动平均值来估算梯度的动量和二次矩
v t ← β 1 v t − 1 + ( 1 − β 1 ) g t , s t ← β 2 s t − 1 + ( 1 − β 2 ) g t 2 . \begin{aligned} \mathbf{v}_t & \leftarrow \beta_1 \mathbf{v}_{t-1} + (1 - \beta_1) \mathbf{g}_t, \\ \mathbf{s}_t & \leftarrow \beta_2 \mathbf{s}_{t-1} + (1 - \beta_2) \mathbf{g}_t^2. \end{aligned} vtst←β1vt−1+(1−β1)gt,←β2st−1+(1−β2)gt2.
β 1 \beta_1 β1和 β 2 \beta_2 β2是非负加权参数。常将它们设置为 β 1 = 0.9 \beta_1 = 0.9 β1=0.9和 β 2 = 0.999 \beta_2 = 0.999 β2=0.999。即方差估计的移动远远慢于动量估计的移动。如果我们初始化 v 0 = s 0 = 0 \mathbf{v}_0 = \mathbf{s}_0 = 0 v0=s0=0,会获得一个相当大的初始偏差。可以通过使用 ∑ i = 0 t β i = 1 − β t 1 − β \sum_{i=0}^t \beta^i = \frac{1 - \beta^t}{1 - \beta} ∑i=0tβi=1−β1−βt来解决这个问题。相应地,标准化状态变量由下式获得
v ^ t = v t 1 − β 1 t and s ^ t = s t 1 − β 2 t . \hat{\mathbf{v}}_t = \frac{\mathbf{v}_t}{1 - \beta_1^t} \text{ and } \hat{\mathbf{s}}_t = \frac{\mathbf{s}_t}{1 - \beta_2^t}. v^t=1−β1tvt and s^t=1−β2tst.
之后根据之前的估计写出更新方程。首先求解此时的更新梯度
g t ′ = η v ^ t s ^ t + ϵ . \mathbf{g}_t' = \frac{\eta \hat{\mathbf{v}}_t}{\sqrt{\hat{\mathbf{s}}_t} + \epsilon}. gt′=s^t+ϵηv^t.
与RMSProp不同,更新使用动量 v ^ t \hat{\mathbf{v}}_t v^t而不是梯度本身。通常选择 ϵ = 1 0 − 6 \epsilon = 10^{-6} ϵ=10−6,这是为了在数值稳定性和逼真度之间取得良好的平衡。简单更新xt:
x t ← x t − 1 − g t ′ . \mathbf{x}_t \leftarrow \mathbf{x}_{t-1} - \mathbf{g}_t'. xt←xt−1−gt′.