深度学习习习_基础知识

卷积神经网络

发展卷积神经网络的额初衷是进行图像分类。图像主要有如下3个特性:

  • 多层次结构: 如边缘组成眼睛,眼睛和鼻子等组成脸,脸和身体等组成人。
  • 特征局部性: 如眼睛就局限在一个小区域,提取眼睛特征时,只需根据这个小区域的像素提取即可。
  • 平移不变性: 如不管眼睛在图像哪个位置,特征提取器都需提取眼睛特征。根据图像的这3个特性,卷积神经网络引入特有的先验知识知识——深度网络、局部连接和参数共享。

1. 局部连接

在常规神经网络中,每个神经元都与前一层中的所有神经元连接(全连接),但是神经元连接方式在图像分类中既不现实也没有必要。因为,在全连接方式下,权重的数量可能达千万量级甚至亿级,大量的参数不仅会延长训练过程,还会导致网络产生过拟合,除此之外,存储大量权重还需要消耗大量内存。 根据特征局部性,如果某个神经元需要提取眼睛特征,则只需要针对眼睛所在的局部区域内的像素进行特征提取,不需要提取眼睛区域外的信息,所以该神经元只需与眼睛区域进行局部连接。

2. 参数共享

在图像分类中,同一个物体可能会在图像的不同位置出现,例如人脸会出现在图像的任意位置,神经元必须对人脸的位置不敏感。而识别不同位置人脸的不同神经元,采用的权重应该是相对的。因为神经元学习是先通过权重和像素进行内积,再进行非线性激活实现的。这些神经元共享相同的参数,这就是参数共享。

3. 卷积神经元的组织方式

要提取图像的特征,必须有大量的神经元,它们从观察输入的同一局部区域提取不同特征。这些神经元的组织方式必然是三维:高度、宽度和深度。高度和宽度决定神经元的空间尺寸,深度决定了对输入区域提取特征的维度(每个神经元)提取一个特征。

基于梯度下降法的最优化方法

梯度下降法的基本思想

如果要找到某函数的最小值,最好的方法是沿着负梯度方向探寻。假设有一个参数向量x及其梯度dx,更新公式是:x+=-lr*dx 其中lr称为学习率,是超参数,是正的常量,其值一般较小。在整个数据集上计算梯度进行参数更新时,只要学习率足够小,每次更新参数时总能使损失函数的值减小。

1. 随机梯度下降法SGD

参数更新中的梯度是通过对训练集中所有样本的平均损失求梯度得到的。当训练集规模较小时,计算梯度不成问题。然而对于大规模数据集,当训练样本达到百万量级时,需要计算整个训练集的梯度,才能更新一次参数。这样更新效率太低,浪费计算资源。一个常用的代替方法是从训练集中随机抽取小批量样本,计算它们平均损失的梯度,来实现一次参数更新。用小批量样本的平均损失代替全体样本的平均损失进行参数更新,可以加快参数更新频率,加速收敛。小批量样本的平均损失是全体样本平均损失的无偏估计。这是因为训练集中的同类样本是相关的,同类样本中不同个体的损失是相似的,所以随机抽取的一个样本损失可以作为该类所有样本损失的估计。 如果小批量样本中只有一个样本,那么称为随机梯度下降法(Stochastic Gradient Descent,SGD)。SGD指每次使用一个样本来更新参数,但我们经常使用SGD来指代小批量梯度下降法。小批量样本的数量是一个超参数,它受存储器的存储容量限制,一般设置为32、64、128等2的指数,运算效率会更高。SGD算法中,每次都要随机抽取batch个样本,实现时可以采用先整体打乱训练集,然后每次按顺序取batch个样本的方式。 深度学习中最常用的优化算法之一就是利用SGD及其改进算法进行训练,下面将介绍这些算法。

2. 基本动量法

把梯度下降想象成小球从山坡滚向山谷的过程,损失值是小球当前的高度,最小化损失值就是希望小球滚动到高度最小的山谷。设小球的空间位置是x,每次移动的路径矢量是dx,位置x处的山的高度就是损失值。那么基本梯度下降法的小球是“这样”滚动的:在出发点A处,计算点A在各个方向的梯度,沿着坡度最陡的方向,沿着这个方向走一段路,再停下。注意每到一个新位置,小球都必须停下来。准确地说,小球并没有滚动下山,而是盲人下山的方式,走一步停一步,用拐杖探明坡度最陡的方向,沿此方向上的坡度都为0,盲人无法移动了。然而一个真正的小球要比盲人高效得多,从起始点A静止滚动到B的时候,小球获得一定速度,继续滚动,小球会越滚越快,快速滚向谷底。 动量法就是通过模拟小球的滚动过程来加速神经网络的收敛。这时就需要一个速度变量,根据速度变量来更新参数。速度变量积累了历史梯度信息,使之具有惯性,当梯度方向一致时,加速收敛;当梯度方向不一致时,减小路径曲折程度。

mu = 0.9
v = mu *v     #[1]
v += -lr *dx   #[2]
x += v

变量v就是速度,初始化为0(相当于小球从静止开始滚动),语句[1]表明v积累了历史梯度,mu是小于1的正超参数,物理意义类似于摩擦系数,该变量有效地抑制了速度,降低了小球的动能,不然小球在山谷永远不会停下来(如果没有摩擦,滚动的小球会一直运动下去,不会停在山谷)。通过交叉验证,这个参数通常设为0.5、0.9或0.99.但需注意的是:mu越大,摩擦越小;mu=1,没有摩擦;mu=0,摩擦无穷大,变为基本的梯度下降法。语句[2]表明速度v受当前速度dx调节。 假设每个时刻的梯度dx相等,由语句[1]和[2]可得:v = -lr/(1-mu)xdx,此时相当于学习率为lr/(1-mu),mu=0.9表示10倍于SGD算法的收敛速度。把1/(1-mu)看作放大率更容易理解,mu越大,放大率越大,收敛可能越快。

假设每个时刻的梯度dx总是0(相当于小球滚动到平地),由语句[1]可得:v = mun* v0,其中n是参数更新次数。可见,v是指衰减,小球只要滚动到平地时的初速度v0足够大,就有机会冲出当前平地,到达一个更低的山谷。速度v被称为动量,所以该方法被称为动量法。