基本概念
表示学习(representation learning)
机器学习旨在自动地学到从数据的表示(representation)到数据的标记(label)的映射。随着机器学习算法的日益发展,人们发现,在某些领域,如何从事数据中提取适合的表示成为整个任务的瓶颈所在,而数据表示的好坏直接影响到后续学习任务。与其依赖人类专家设计手工特征,表示学习希望能从数据中自动的学习到从数据的原始形式到数据的表示之间的映射。
在深度学习领域内,表示是指通过模型的参数,采用何种形式、何种方式来表示模型的输入观测样本X。表示学习指学习对观测样本X有效的表示。
深度学习(deep learning / DL)
表示学习的理想很丰满,但是实际上人们发现从数据的原始形式直接学得数据表示这件事很难。深度学习是目前最成功的表示学习方法。深度学习是把表示学习的任务划分成几个小目标,先从数据的原始形式中先学得比较低级的表示,再从低级表示中学得比较高级的表示。这样,每个小目标相对容易达到,综合起来我们就完成了表示学习的任务。这类似于算法设计思想中的分治法(divide-and-conquer)
深度神经网络(deep neural networks / DNN)
深度学习目前几乎唯一行之有效的实现形式。简单地说,深度神经网络就是很深的网络。我们利用网络中逐层对特征进行加工的特性,逐渐从低级特征中提取高级特征。深度森林是目前其他学者正在探索的方向
多层感知机(multi-layer perceptrons / MLP)
多层由全连接层组成的深度神经网络。多层感知机的最后一层全连接层实质上是一个线性分类器,而其他部分则是为这个线性分类器学习一个适合的数据表示,是倒数第二层的特征线性可分
激活函数(activation function)
神经网络的必要组成部分。如果没有激活函数,多次线性运算的堆叠仍然是一个线性运算,即不管用再多层,实质上只起到了一层神经网络的作用。一个好的激活函数应满足以下性质。
- 不会饱和
sigmoid和tanh激活函数在两侧尾端会有饱和现象,这会使导函数在这些区域接近零
- 零均值
ReLU激活函数的输出均值不为零,这会影响网络的训练
- 容易计算
迁移学习(transfer function)
深度学习下的迁移学习旨在利用源任务数据,辅助目标任务数据下的学习。迁移学习适用于源任务数据比目标任务数据多,并且源任务中学习得到的低层特征可以帮助目标任务学习的情形。
在计算机视觉领域,最常用的源任务数据是ImageNet。
对ImageNet预训练模型的利用通常有两种方式:
-
固定特征提取器
。用ImageNett预训练模型提取目标任务数据的高层特征。 -
微调(fine-tuning)
。以ImageNet预训练模型作为目标任务模型的初始化,初始化权值,之后在目标任务数据上进行微调。
多任务学习(multi-task learning)
与其针对每个任务训练一个小网络,深度学习下的多任务学习旨在训练一个大网络以同时完成全部任务。这些任务中用于提取低层特征的层是共享的,之后产生分支,各任务拥有各自的若干层用于完成其任务。
多任务学习适用于多个任务共享低层特征,并且各个任务的数据很相似的情况。
端到端学习(end-to-end learning)
深度学习下的端到端学习旨在通过一个深度神经网络直接学习从数据的原始形式到数据的标记的映射。
端到端学习并不应该作为我们的一个追求目标,是否采用端到端学习的一个重要考虑因素是:有没有足够的数据对应端到端的过程,以及我们有没有一些领域知识能够用于真个系统中的一些模块
优化算法
在网络结构确定之后,我们需要对网络的权值(weights)进行优化。本节,我们介绍优化深度神经网络的基本思想。
梯度下降
想象你去野足但却迷了路,在漆黑的深夜你一个人被困住山谷中,你知道谷底是出口但是天太黑了根本看不清楚路。于是你确定采取一个贪心(greedy)算法:先试探在当前位置往哪个方向走下降最快(即梯度方向),再朝着这个方向走一小步,重复这个过程直到你到达谷底。这就是梯度下降的基本思想。
梯度下降算法的性能大致取决于三个因素。1. 初始位置。如果你初始位置就离谷底很近,自然很容易走到谷底。2. 山谷地形。如果山谷是“九曲十八弯”,很有可能你在里面绕半天都绕不出来。3. 步长。你每步迈多大,当你步子迈太小,很可能你走半天也没走多远,而当你步子迈太大,一不小心就容易撞到旁边的悬崖峭壁,或者错过了谷底。
误差反向传播
结合微积分中链式法则和算法设计中动态规划思想用于计算梯度。直接用纸笔推导出中间某一层的梯度的数学表达式是很困难的,但链式法则告诉我们,一旦我们知道后一层的梯度,再结合后一层对当前层的导数,我们就可以得到当前层的梯度。动态规划是一个高效计算所有梯度的实现技巧,通过高层往低层逐层计算梯度,避免了对高层梯度的重复计算
滑动平均
要前进的方向不再由当前梯度方向完全决定,而是最近几次梯度方向的滑动平均。
利用滑动平均的思想的优化算法有带动量(momentum)的SGD、Nesterov动量、Adam(ADAptive Momentum estimation)等。
自适应步长
这里的步长就是梯度下降中的步长,所谓自适应就是让他能在不同情况下做出更优化的选择
自适应地确定权值每一维的步长。当某一维持续震荡时,我们希望这一维的步长小一些;当某一维一直沿着相同的方向前进时,我们希望这一维的步长大一些。
利用自适应步长思想的优化算法有AdaGrad、RMSProp、Adam等。
学习衰减率
当开始训练时,较大的学习率可以使你在参数空间有更大范围的探索。当优化接近收敛时,我们需要小一些的学习率使权重更接近局部最优点
深度神经网络优化的困难
有学者指出,在很高维的空间中,局部最优是比较少的,而大部分梯度为零的点是鞍点。平原区域的鞍点会使梯度在很长一段时间内都接近零,这会使得拖慢优化过程。
初始化
权值初始化对于网络优化至关重要。早年深度神经网络无法有效训练的一个重要原因就是早期人们对初始化不太重视。
初始化的基本思想
方差不变,即设法对权值初始化,使得各层神经元的方差保持不变
Xavier初始化
从高斯分布或均匀分布中对权值进行采样,使得权值的方差是1/n,其中n是输入神经元的格式。该推导假设激活函数是线性的
He初始化 / MSRA初始化
从高斯分布或均匀分布中,对权值进行采样,使得权值的方差是2/n。该推导假设激活函数是ReLU。因为ReLU会将小于0的神经元置零,大致上会使一半的神经元置零,所以为了弥补丢失的这部分信息,方差要乘以2
批量规范化
每层显示地对神经元的激活值做出规范化,使其具有零均值和单位方差。批量规范化是激活值的分布固定下来,这样可以使各层更加独立的进行学习。批量规范化可以使得网络对初始化和学习率不太敏感。此外批量规范化有些许正则化的作用,但不能视其为正则化的手段
偏差 / 方差
优化完成后,你发现网络并不尽如人意,这时诊断网络处于高偏差/高方差状态,是对你下一步调参的重要指导。与经典机器学习算法有所不同,因为深度神经网络通常要处理非常高维的特征,所以网络可能同时处于高偏差/高方差的状态,即在特征空间的一些区域网络处于高偏差,而在另一些区域处于高方差。
偏差
偏差度量了网络的训练及误差和贝叶斯误差(即能到达的最有误差)的差距。高偏差的网络有很高的训练集误差,说明网络读出数据中隐含的一般规律还没学号。当网络处于高偏差时,通常有一下几种解决方案
- 训练更大的网络。网络越大,对潜在规格的拟合能力越强
- 更多训练轮数。通常训练的时间越久,对训练集的拟合能力越强。
- 改变网络结构。不同的网络结构对训练集的拟合能力有多不同
方差
方差度量了网络的验证集误差和训练差距。高方差的网络学习能力太强,把训练集中度哟的一些特点也当做一般规律学得,使得网络不能很好地泛化到验证集。当网络处
高方差时,通常有一下几种解决方案
- 更多数据。
- 正则化
- 改变网络结构
正则化
正则化是解决高方差问题的重要解决方案之一
正则化的基本思想
正则化的基本思想是网络的有效大小变小。这样不容易过拟合到训练集
L2正则化
L2正则化倾向于使网络的权值接近0。
这会使前一层神经元对后一层神经元的影响降低,使网络变得简单,降低网络的有效大小,降低网络的拟合能力。
L2正则化实质上是对权值做线性衰减,所以L2正则化也被称为权值衰减(weight decay)。
随机失活
在训练时,随机失活随机选择一部分神经元,使其置零,不参与本次优化迭代。随机失活减少了每次参与优化迭代的神经元数目,使网络的有效大小变小
随机失活的作用有两点。
- 降低神经元之间耦合。因为神经元会被随机置零,所以每个神经元不能依赖于其他神经元,这会迫使每个神经元自身要能提取到合适的特征。
- 网络集成。随机失活可以看作在训练时每次迭代定义出一个新的网络,这些网络共享权值。在测试时的网络是这些网络的集成。
数据扩充
这实质是获得更多数据的方法。当收集数据很昂贵,或者我们拿到的是第二手数据,数据就这么多时,我们从现有数据中扩充生成更多数据,用生成的“伪造”数据当作更多的真实数据进行训练。以图像数据做分类任务为例,把图像水平翻转、移动一定位置、旋转一定角度、或做一点色彩变化等,这些操作通常都不会影响这幅图像对应的标记。并且你可以尝试这些操作的组合,理论上讲,你可以通过这些组合得到无穷多的训练样本。
早停(early stopping)
随着训练的进行,当你发现验证集误差不再变化或者开始上升时,提前停止训练。
调参技巧
深度神经网络涉及到很多超参数,如学习率大小、L2正则化系数、动量大小、批量大小、隐层神经元数目、层数、学习率衰减率等。
随机搜索
由于你事先并不知道哪些超参数对你的问题更重要,因此随机搜索通常是比网格搜索(grid search)更有效的调参策略。
对数空间搜索
对于隐层神经元数目和层数,可以直接从均匀分布采样进行搜索。而对于学习率、L2正则化系数、和动量,在对数空间搜索更加有效。
实现技巧
图形处理单元(graphics processing units, GPU)
深度神经网络的高效实现工具。简单来说,CPU擅长串行、复杂的运算,而GPU擅长并行、简单的运算。深度神经网络中的矩阵运算都十分简单,但计算量巨大。因此,GPU无疑具有非常强大的优势。
向量化(vectorization)
代码提速的基本技巧。能少写一个for循环就少写一个,能少做一次矩阵运算就少做一次。实质是尽量将多次标量运算转化为一次向量运算;将多次向量运算转化为一次矩阵运算。因为矩阵运算可以并行,这将会比多次单独运算快很多。
声明
本篇是为了加强记忆和便于查找回顾做的摘抄,无任何创新之处,望周知