前言
博客内容均是对《深度学习入门—基于Python的理论与实现》一书2-6章的总结。以前也或多或少接触过一些相关知识,但都不成体系,故于此总结,大佬轻喷。
感知机
信号特征: 感知机有多输入,而仅一输出。
以两输入一输出为例,其数学模型如下:
y
=
{
0
(
ω
1
x
1
+
ω
2
x
2
)
+
b
⩽
0
1
(
ω
1
x
1
+
ω
2
x
2
)
+
b
⩾
0
y=\left\{\begin{matrix} 0&(\omega_1 x_1+\omega_2x_2)+b\leqslant0\\ 1&(\omega_1 x_1+\omega_2x_2)+b\geqslant 0 \end{matrix}\right.
y={01(ω1x1+ω2x2)+b⩽0(ω1x1+ω2x2)+b⩾0
其中
ω
i
\omega_i
ωi为权重,b为偏置。
显然,单个感知机仅仅只是一个简单的线性模型,所以只能分割简单的线性空间,书中举例了用单层感知机来表示与门,或门和与非门,但是却无法表示异或门(将其真值表投影到二维空间可以发现只用一条直线无法对其进行线性分割)。解决方法是进行层的叠加,也就是多层感知机(MLP),即多层感知机可以进行非线性表示。
至于为何如此,Hornik在1989年证明,当中间隐含层的神经元数量趋于无穷多时,多层感知机可以拟合任何非线性函数。具体的我也不是很清楚,放个链接在这。个人觉得秘密就在于隐藏层中的非线性激活函数吧。
神经网络
激活函数
多层感知机的隐藏层使用的是阶跃函数,如果将隐藏层中的激活函数换成其他函数,就是广义上的神经网络了。除了阶跃函数
u
(
x
)
u(x)
u(x),常见的几种激活函数表达式如下:
sigmoid函数:
h
(
x
)
=
1
1
+
e
x
p
(
−
x
)
h(x)=\frac{1}{1+exp(-x)}
h(x)=1+exp(−x)1
ReLU函数:
h
(
x
)
=
x
u
(
x
)
h(x)=xu(x)
h(x)=xu(x)
输出层的激活函数则与上面所介绍的略有不同,常见的有
恒等函数:主要用于回归问题
σ
(
x
)
=
x
\sigma (x)=x
σ(x)=x
sigmoid函数:可用于二分类问题
h
(
x
)
=
1
1
+
e
x
p
(
−
x
)
h(x)=\frac{1}{1+exp(-x)}
h(x)=1+exp(−x)1
softmax函数:可用于多分类问题。假设输出层共有n个神经元,a_k为上一层神经元的输出,则第
k
k
k个神经元的输出
y
k
y_k
yk为
y
k
=
e
x
p
(
a
k
)
∑
i
=
1
n
e
x
p
(
a
i
)
y_k=\frac{exp(a_k)}{\sum_{i=1}^{n}exp(a_i)}
yk=∑i=1nexp(ai)exp(ak)
注意到softmax函数的输出总和为1,所以我们可以把其输出解释为“概率”。
一般而言,神经网络只把输出值最大的神经元所对应的类别作为识别效果。并且使用softmax函数其输出值最大的神经元的位置也不会变,所以,在分类问题上,输出层的softmax函数可以省略。
然后,书本以MNIST为例,介绍了神经网络的前向传播。这里有几个名词值得学习:
- 正规化(normalization):将MNIST输入图像的像素值从0-255转化到0-1。
- 预处理(pre-procession):对神经网络的输入数据进行某种既定的转换,譬如正规化,譬如白化。
- 批处理(batch):MNIST数据集的单张图片为2828的二维数组(或者是变成1784的一维数组),批处理意指每次输入给神经网络多张图片,图片的数量即为batch的大小。因为输入的多张图片其实就是一个矩阵,进行矩阵乘法可以同时处理多张图片,比一次只用一张图片效率高。
损失函数
几个名词:训练数据,验证数据,测试数据,泛化能力。
引入目的:衡量神经网络性能的好坏,即神经网络对训练数据的拟合程度。同时以这个值对权重的导数为指引,逐步更新权重值,使得识别精度更高。
以单个数据为例,常见的两种损失函数如下:
均方误差(MSE)
E
=
1
2
∑
k
(
y
k
−
t
k
)
2
E=\frac{1}{2}\sum_{k}^{}(y_k-t_k)^2
E=21k∑(yk−tk)2
交叉熵误差函数(cross entropy error)
E
=
−
∑
k
t
k
l
o
g
y
k
E=-\sum_{k}^{}t_klogy_k
E=−k∑tklogyk
这里,
y
k
y_k
yk表示神经网络的输出,
t
k
t_k
tk表示训练数据,k表示数据的维数。
对于大的训练集,求所有训练数据的损失函数的总和非常耗时。因此,通常从训练集中随机选出一小批数据(mini-batch),然后对每个mini-batch进行学习,用这个小批量数据算出来的损失函数作为全体训练数据的近似值。
梯度:函数值对于全部自变量的偏导数所构成的向量。其指示的方向就是该点处函数值减小最多的方向。梯度法就是要寻找梯度为0的地方,但是由于函数在极小值,最小值以及鞍点处的梯度均为0,所以梯度法所找到的点不一定是最值点。
例子:
求
f
(
x
0
,
x
1
)
=
1
10
x
0
2
+
x
1
2
的
最
小
值
求f(x_0,x_1)=\frac{1}{10}x_0^2+x_1^2的最小值
求f(x0,x1)=101x02+x12的最小值
梯度下降法迭代公式如下:(
x
0
0
,
x
1
0
x_0^0,x_1^0
x00,x10为迭代初始值,人工选定)
x
0
i
+
1
=
x
0
i
−
η
∂
f
∂
x
0
x
1
i
+
1
=
x
1
i
−
η
∂
f
∂
x
1
x_0^{i+1}=x_0^{i}-\eta\frac{\partial f}{\partial x_0}\qquad x_1^{i+1}=x_1^{i}-\eta\frac{\partial f}{\partial x_1}
x0i+1=x0i−η∂x0∂fx1i+1=x1i−η∂x1∂f
其中,
η
\eta
η称为学习率(learning rate),由人工设定,是超参数。由于输入数据是通过随机选择的mini-batch,所以常见的梯度下降法多是随机梯度下降法(stochastic gradient descent)——“对随机选择的数据进行的梯度下降法”。
了解了以上知识,就可以开始训练更新一个神经网络了。最常见的更新方法就是误差反向传播法,在CS231n的课程中用计算图的方式向我们展现了神经网络的反向传播过程。具体过程网上一找一大把,这里贴上李宏毅教授的链接。
神经网络的学习中,必须确认是否能够正确识别训练数据以外的其他数据,即确认是否会发生过拟合。过拟合是指,虽然训练数据中的数字图像能够被正确辨别,但是不在训练数据中的数字图像却无法被识别的现象。
神经网络学习的最初目标是要掌握泛化能力,因此,要评价其泛化能力,还需要使用不包含在训练数据中的数据。在学习的过程中,我们需要定期地对训练数据和测试数据记录识别精度。
这里选择的策略是每经过一个epoch,就记录下训练数据和测试数据的识别精度。epoch是一个单位,表示学习中所有训练数据均被使用过一次。
一般做法是将所有训练数据事先打乱,然后按照序号生成mini-batch。通过遍历所有的mini-batch,我们就可以遍历一次所有数据,这就称为一个epoch。
神经网络学习中的技巧
参数更新方法
W
\pmb{W}
WWW为权重矩阵,
L
L
L为损失函数的值,各种方法的迭代公式如下
SGD:
W
=
W
−
η
∂
L
∂
W
\pmb{W} =\pmb{W}-\eta\frac{\partial L}{\partial \pmb{W}}
WWW=WWW−η∂WWW∂L
Momentum:
v
=
α
v
−
η
∂
L
∂
W
W
=
W
+
v
\pmb{v}=\alpha \pmb{v}-\eta\frac{\partial L}{\partial \pmb{W}}\qquad\pmb{W}=\pmb{W}+\pmb{v}
vvv=αvvv−η∂WWW∂LWWW=WWW+vvv
AdaGrad:学习率衰减
h
=
h
+
∂
L
∂
W
⋅
∂
L
∂
W
W
=
W
−
η
1
h
∂
L
∂
W
\pmb{h}=\pmb{h}+\frac{\partial L}{\partial \pmb{W}} \cdot\frac{\partial L}{\partial \pmb{W}} \qquad\pmb{W}=\pmb{W}-\eta \frac{1}{\sqrt{\pmb{h}}}\frac{\partial L}{\partial \pmb{W}}
hhh=hhh+∂WWW∂L⋅∂WWW∂LWWW=WWW−ηhhh1∂WWW∂L
Adam:Momentum和AdaGrad的结合
权重的初始化
- 将权重初始值设为0不是一个好的策略,因为在反向传播算法中,这会使得同一层的权重的值得到相同的更新,很多不同的权重的意义消失了。
- 高斯分布初始值:根据标准差的值的不同,会存在反向传播梯度消失,隐藏层激活值有所偏向等问题。
- Xavier初始值:与前一层有n个节点连接时,初始值使用标准差为 1 n \frac{1}{\sqrt{n}} n1的分布。在很多深度学习框架中,这已经称为一种标准作为使用。
- He初始值:与前一层有n个节点连接时,初始值使用标准差为 2 n \frac{2}{\sqrt{n}} n2的分布。
总结一下:当激活函数使用ReLU时,权重初始值选用He初始值;当激活函数为sigmoid或tanh等S型曲线函数时,初始值选用Xavier初始值。
抑制过拟合的方法
过拟合指的是只能拟合训练数据,但不能很好地拟合不包含在训练数据中的其他数据的状态。发生过拟合的原因主要有以下两个:
- 模型拥有大量参数、表现力强;
- 训练数据少。
常见的降低过拟合的措施有:
1.Batch Normalization:以进行学习时的mini-batch为单位,按mini-batch进行正规化。具体而言,就是在Affine层和ReLU层之间插入对数据分布进行正规化的层,使数据分布的均值为0,方差为1,然后对其进行缩放和平移的变换。eg.假设数据集合
B
=
{
x
1
,
x
2
,
.
.
.
,
x
m
}
B = \left \{ x_1,x_2,...,x_m \right \}
B={x1,x2,...,xm},则
u
B
=
1
m
∑
i
=
1
m
x
i
σ
B
2
=
1
m
∑
i
=
1
m
(
x
i
−
μ
B
)
2
u_B = \frac{1}{m}\sum_{i=1}^{m}x_i \qquad \sigma_B^2=\frac{1}{m}\sum_{i=1}^{m}(x_i-\mu_B)^2
uB=m1i=1∑mxiσB2=m1i=1∑m(xi−μB)2
x
i
^
=
x
i
−
μ
B
σ
B
2
+
ϵ
y
i
=
γ
x
i
^
+
β
\hat{x_i}=\frac{x_i-\mu_B}{\sqrt{\sigma_B^2+\epsilon }}\qquad y_i = \gamma\hat{x_i}+\beta
xi^=σB2+ϵxi−μByi=γxi^+β
2.正则化
- 权值衰减:在学习过程中对大的权重进行惩罚来抑制过拟合,例如为损失函数加上权重的L2范数。将权重记为 W \bf{W} W,则L2范数的权值衰减就是 1 2 λ W 2 \frac{1}{2} \lambda \bf{W}^2 21λW2
- Dropout:在训练时,随机删除隐藏层的神经元,不让其进行信号传递。
超参数的选择
这里的超参数指的是各层的神经元数量、batch大小、参数更新时的学习率或权值衰减等,通常通过观察模型在验证集的效果上来进行超参数的选择。