0%

深度学习

1.深度学习简述

为了学习一种好的表示,需要构建具有一定“深度”的模型,并通过学习算法来让模型自动学习出好的特征表示(从底层特征,到中层特征,再到高层特征),从而最终提升预测模型的准确率.所谓“深度”是指原始数据进行非线性特征转换的次数

深度学习是将原始的数据特征通过多步的特征转换得到一种特征表示,并进一步输入到预测函数得到最终结果.和“浅层学习”不同,深度学习需要解决的关键问题是贡献度分配问题(Credit Assignment Problem,CAP)[Minsky,1961],即一个系统中不同的组件(component)或其参数对最终系统输出结果的贡献或影响.从某种意义上讲,深度学习可以看作一种强化学习(Reinforcement Learning,RL),每个内部组件并不能直接得到监督信息,需要通过整个模型的最终监督信息(奖励)得到,并且有一定的延时性

深度学习采用的模型主要是神经网络模型,其主要原因是神经网络模型可以使用误差反向传播算法,从而可以比较好地解决贡献度分配问题

1.1 表示学习

为了提高机器学习系统的准确率,我们就需要将输入信息转换为有效的特 征,或者更一般性地称为表示(Representation)。如果有一种算法可以自动地学习出有效的特征,并提高最终机器学习模型的性能,那么这种学习就可以叫作表示学习

表示学习的关键是解决语义鸿沟(Semantic Gap)问题.语义鸿沟问题是指输入数据的底层特征和高层语义信息之间的不一致性和差异性.比如给定一些关于“车”的图片,由于图片中每辆车的颜色和形状等属性都不尽相同,因此不同图片在像素级别上的表示(即底层特征)差异性也会非常大.但是我们理解这些图片是建立在比较抽象的高层语义概念上的.如果一个预测模型直接建立在底层特征之上,会导致对预测模型的能力要求过高.如果可以有一个好的表示在某种程度上能够反映出数据的高层语义特征,那么我们就能相对容易地构建后续的机器学习模型

4.1.1 局部和分布式表示

在机器学习中,我们经常使用两种方式来表示特征:局部表示(Local Representation)和分布式表示(Distributed Representation).

  • 局部表示:离散表示,one-Hot向量,单一值表示一个东西。
    • 优点:
      • 这种离散的表示方式具有很好的解释性,有利于人工归纳和总结特征,并通过特征组合进行高效的特征工程
      • 通过多种特征组合得到的表示向量通常是稀疏的二值向量,当用于线性模型时计算效率非常高
    • 缺点
      • one-hot向量的维数很高,且不能扩展.如果有一种新的颜色,我们就需要增加一维来表示
      • 不同颜色之间的相似度都为0,即我们无法知道“红色”和“中国红”的相似度要高于“红色”和“黑色”的相似度
  • 分布式表示:压缩、低维的稠密向量,使用多个值表示一个东西,如表示颜色的方法是用RGB值来表示颜色,不同颜色对应到R、G、B三维空间中一个点,这种表示方式叫作分布式表示
    • 分布式表示的表示能力要强很多,分布式表示的向量维度一般都比较低.我们只需要用一个三维的稠密向量就可以表示所有颜色.并且,分布式表示也很容易表示新的颜色名.此外,不同颜色之间的相似度也很容易计算
1.2 端到端学习

端到端学习(End-to-End Learning),也称端到端训练,是指在学习过程中不进行分模块或分阶段训练,直接优化任务的总体目标.在端到端学习中,一般不需要明确地给出不同模块或阶段的功能,中间过程不需要人为干预.端到端学习的训练数据为“输入-输出”对的形式,无须提供其他额外信息.因此,端到端学习和深度学习一样,都是要解决贡献度分配问题.目前,大部分采用神经网络模型的深度学习也可以看作一种端到端的学习

2. 前馈神经网络

2.1 神经元

神经网络一般可以看作一个非线性模型,其基本组成单元为具有非线性激活函数的神经元,通过大量神经元之间的连接,使得神经网络成为一种高度非线性的模型.神经元之间的连接权重就是需要学习的参数,可以在机器学习的框架下通过梯度下降方法来进行学习

激活函数在神经元中非常重要的.为了增强网络的表示能力和学习能力,激活函数需要具备以下几点性质:

  • (1) 连续并可导(允许少数点上不可导)的非线性函数.可导的激活函数可以直接利用数值优化的方法来学习网络参数.
  • (2) 激活函数及其导函数要尽可能的简单,有利于提高网络计算效率.
  • (3) 激活函数的导函数的值域要在一个合适的区间内,不能太大也不能太小,否则会影响训练的效率和稳定性.

下面介绍几种在神经网络中常用的激活函数.

2.1.1 sigmoid函数

Sigmoid型函数是指一类 S 型曲线函数,为两端饱和函数.常用的Sigmoid型函数Logistic函数和Tanh函数所谓饱和是指对于函数 \(f(x)\),若 \(x → −∞\) 时,其导数 \(f^′(x) → 0\),则称其为左饱和.若\(x → +∞\)时,其导数\(f′(x) → 0\),则称其为右饱和.当同时满足左、右饱和时,就称为两端饱和。

在机器学习篇章我们以及介绍果LR函数: \[ σ(x)={1\over 1+exp(-x)} \]

Logistic 函数可以看成是一个“挤压”函数,把一个实数域的输入“挤压”到(0, 1).当输入值在0附近时,Sigmoid型函数近似为线性函数;当输入值靠近两端时,对输入进行抑制.输入越小,越接近于 0;输入越大,越接近于 1.和感知器使用的阶跃激活函数相比,Logistic函数是连续可导的,其数学性质更好.

因为Logistic函数的性质,使得装备了Logistic激活函数的神经元具有以下两点性质: - 1)其输出直接可以看作概率分布,使得神经网络可以更好地和统计学习模型进行结合. - 2)其可以看作一个软性门(Soft Gate),用来控制其他神经元输出信息的数量.

Tanh函数\[ tanh(x)={exp(x)-exp(-x)\over exp(x)+exp(-x)} \]

2.1.2 Relu函数

ReLU(Rectified Linear Unit,修正线性单元)是目前深度神经网络中经常使用的激活函数.ReLU实际上是一个斜坡(ramp)函数,定义为: \[ Relu(x)=\begin{cases} x&x≥0\\ 0&x<0 \end{cases} \]

优点:

  • 采用 ReLU 的神经元只需要进行加、乘和比较的操作,计算上更加高效
  • 具有生物学合理性,比如单侧抑制、宽兴奋边界。Sigmoid 型激活函数会导致一个非稀疏的神经网络,而 ReLU 却具有很好的稀疏性,大约50%的神经元会处于激活状态
  • 在优化方面,相比于Sigmoid型函数的两端饱和,ReLU函数为左饱和函数,且在 $x > 0 $时导数为 1,在一定程度上缓解了神经网络的梯度消失问题,加速梯度下降的收敛速度.

缺点

  • ReLU 函数的输出是非零中心化的,给后一层的神经网络引入偏置偏移,会影响梯度下降的效率
  • ReLU 神经元在训练时比较容易“死亡”.在训练时,如果参数在一次不恰当的更新后,第一个隐藏层中的某个 ReLU 神经元在所有的训练数据上都不能被激活,那么这个神经元自身参数的梯度永远都会是0,在以后的训练过程中永远不能被激活.这种现象称为死亡 ReLU 问题

为克服上述缺陷,几种变种Relu被广泛使用:

  • 带泄露的Relu:带泄露的ReLU(Leaky ReLU)在输入 \(x< 0\)时,保持一个很小的梯度𝛾.这样当神经元非激活时也能有一个非零的梯度可以更新参数,避免永远不能被激活[Maas et al., 2013].带泄露的ReLU的定义如下: \[ LeakyRelu(x)=\begin{cases} x&x>0\\ γx&x≤0 \end{cases} \] 其中\(γ\)是一个很小的常数,如0.001

  • 带参数的ReLU:带参数的 ReLU(Parametric ReLU,PReLU)引入一个可学习的参数,不同神经元可以有不同的参数 [He et al., 2015].对于第\(i\)个神经元,其 PReLU的定义为 \[ PRelu(x)=\begin{cases} x&x>0\\ γ_ix&x≤0 \end{cases} \] 其中\(γ_i\)\(x≤ 0\) 时函数的斜率.因此,PReLU 是非饱和函数.如果\(γ_i=0\),那么PReLU就退化为ReLU.如果\(γ_i\)为一个很小的常数,则PReLU可以看作带泄露的ReLU.PReLU可以允许不同神经元具有不同的参数

  • ELU(Exponential Linear Unit,指数线性单元):[Clevert et al., 2015] 是一个近似的零中心化的非线性函数,其定义为: \[ Elu(x)=\begin{cases} x&x>0\\ γ(exp(x)-1)&x≤0 \end{cases} \] 其中\(γ ≥ 0\)是一个超参数,决定\(x≤ 0\)时的饱和曲线,并调整输出均值在0附近

  • Softplus函数:Softplus 函数[Dugas et al., 2001] 可以看作 Rectifier 函数的平滑版本,其定义为 \[ softplus(x)=log(1+exp(x)) \] Softplus函数其导数刚好是Logistic函数.Softplus函数虽然也具有单侧抑制、宽兴奋边界的特性,却没有稀疏激活性

2.1.3 Swish函数

Swish 函数[Ramachandran et al., 2017] 是一种自门控(Self-Gated)激活函数,定义为: \[ swish(x)=xσ(βx) \] 其中\(δ(⋅)\)为 Logistic 函数\(β\)为可学习的参数或一个固定超参数.\(δ(⋅) ∈ (0, 1)\)可以看作一种软性的门控机制.当\(δ(βx)\)接近于1时,门处于“开”状态,激活函数的输出近似于\(x\)本身;当\(δ(βx)\))接近于0时,门的状态为“关”,激活函数的输出近似于0.

Swish函数可以看作线性函数和ReLU函数之间的非线性插值函数,其程度由参数\(β\)控制.

2.1.4 GELU函数

GELU(Gaussian Error Linear Unit,高斯误差线性单元)[Hendrycks et al.,2016] 也是一种通过门控机制来调整其输出值的激活函数,和 Swish 函数比较类似 \[ GELU(x)=xp(X≤x) \] 其中\(p(X ≤ x)\)是高斯分布\(N(μ, σ^2)\)的累积分布函数,其中\(μ, σ\)为超参数,一般设\(μ= 0, σ= 1\)即可.由于高斯分布的累积分布函数为S型函数,因此GELU函数可以用Tanh函数或Logistic函数来近似, \[ GELU(x)=xσ(1.702x) \]

2.1.5 Maxout单元

Maxout 单元[Goodfellow et al., 2013] 也是一种分段线性函数函数。不同的是Sigmoid 、ReLU 等激活函数的输入是神经元的净输入\(z\),是一个标量而 Maxout 单元的输入是上一层神经元的全部原始输出,是一个向量\(x = [x_1; x_2; ⋯ ; x_D]\)

每个Maxout单元有\(K\)个权重向量$w_k ∈ ℝ^D \(和偏置\)b_k(1 ≤ k ≤ K)\(.对于输入\)x\(,可以得到\)K\(个净输入\)z_k, 1 ≤ k ≤ K$ \[ z_k=w^T_k+b_k \] 其中\(w_k= [w_{k,1}, ⋯ , w_{k,D}]^T\) 为第\(k\)个权重向量

2.2 网络结构

样通过一定的连接方式或信息传递方式进行协作的神经元可以看作一个网络,就是神经网络..目前常用的神经网络结构有以下三种:

  • 前馈网络:前馈网络中各个神经元按接收信息的先后分为不同的组.每一组可以看作一个神经层.每一层中的神经元接收前一层神经元的输出,并输出到下一层神经元.整个网络中的信息是朝一个方向传播,没有反向的信息传播,可以用一个有向无环路图表示。前馈网络包括全连接前馈网络和卷积神经网络等

  • 记忆网络:记忆网络,也称为反馈网络,网络中的神经元不但可以接收其他神经元的信息,也可以接收自己的历史信息.和前馈网络相比,记忆网络中的神经元具有记忆功能,在不同的时刻具有不同的状态.记忆神经网络中的信息传播可以是单向或双向传递。记忆网络包括循环神经网络、Hopfield 网络、玻尔兹曼机、受限玻尔兹曼机等

  • 图网络图网络是定义在图结构数据上的神经网络.图中每个节点都由一个或一组神经元构成.节点之间的连接可以是有向的,也可以是无向的.每个节点可以收到来自相邻节点或自身的信息。图网络是前馈网络和记忆网络的泛化,包含很多不同的实现方式,比如图卷积网络(Graph Convolutional Network,GCN)[Kipf et al., 2016]、图注意力网络(Graph Attention Network,GAT)[Veličković et al., 2017]、消息传递神经网络(Message Passing Neural Network,MPNN)[Gilmer et al., 2017]等

2.3 反向传播算法

假设采用随机梯度下降进行神经网络参数学习,给定一个样本\((x, y)\),将其输入到神经网络模型中,得到网络输出为\(\tilde{𝒚}\).假设损失函数为$ ℒ(𝒚,)$,要进行参数学习就需要计算损失函数关于每个参数的导数

不失一般性,对第\(l\)层中的参数\(W^{(l)}\)\(b{(l)}\)计算偏导数.因为\(𝜕ℒ(𝒚,\tilde{y})\over𝜕𝑾^{(𝑙)}\)的计算涉及向量对矩阵的微分,十分繁琐,因此我们先计算\(ℒ(𝒚,\tilde{𝒚})\) 关于参数矩阵中每个元素的偏导数$ ℒ(y,)w^{(l)}_{ij}$.根据链式法则: \[ {δℒ(𝒚,\tilde{y}) \over δw^{(l)}_{ij}}={δz^{(l)}\over δw^{(l)}_{ij} }{δℒ(𝒚,\tilde{y})\over δz^{(l)}} \\ {δℒ(𝒚,\tilde{y}) \over δb^{(l)}}={δz^{(l)}\over δb^{(l)}}{δℒ(𝒚,\tilde{y})\over δz^{(l)}} \] 上式的第二项都是目标函数关于第\(l\)层的神经元\(z^{(l)}\)的偏导数,称为误差项,可以一次计算得到.这样我们只需要计算三个偏导数,分别为\({δz^{(l)}\over δw^{(l)}_{ij}}、{δz^{(l)}\over δb^{(l)}}、{δℒ(𝒚,\tilde{y})\over δz^{(l)}}\)

下面分别计算它们:

  • \({δz^{(l)}\over δw^{(l)}_{ij}}\):因为\(z=Wx+b\),则其导数为可以很方便计算得到
  • \({δℒ(𝒚,\tilde{y})\over δz^{(l)}}\)该偏导数表示第\(l\)层神经元对最终损失的影响,也反映了最终损失对第\(l\)层神经元的敏感度,因此一般称为误差项\(δ^{(l)}\)它也间接反映了神经元对网络的共享程度,是解决贡献的分配问题的一个指标。详细公式见书p94
2.4 梯度消失

上面可以知道在神经网络中误差反向传播的迭代公式为 \[ δ^{(l)}=f^{'}_l(z^{(l)})⊙(W^{(l+1)})^Tδ^{(l+1)} \] 误差从输出层反向传播时,在每一层都要乘以该层的激活函数的导数,当采取Sigmoid型激活函数时,由于其导数<1,经过深度学习,一层一层下去,其误差项不断趋近于0,梯度就会不断衰减,甚至消失,导致网络难以训练.这就是梯度消失

在深度神经网络中,减轻梯度消失问题的方法有很多种.一种简单有效的方式是使用导数比较大的激活函数,比如ReLU等.

3 卷积神经网络

卷积神经网络(Convolutional Neural Network,CNN或ConvNet)是一种具有局部连接、权重共享等特性的深层前馈神经网络.卷积神经网络有个重要的专有词叫感受野,,即神经元只接受其所支配的刺激区域内的信号。卷积神经网络的出现解决了全连接前馈网络的两个问题参数太多局部不变性特征

目前的卷积神经网络一般是由卷积层、汇聚层和全连接层交叉堆叠而成的前馈神经网络.卷积神经网络有三个结构上的特性:局部连接、权重共享以及汇聚.这些特性使得卷积神经网络具有一定程度上的平移、缩放和旋转不变性.和前馈神经网络相比,卷积神经网络的参数更少

3.1 卷积和卷积核

卷积(Convolution),也叫褶积,是分析数学中一种重要的运算.在信号处理或图像处理中,经常使用一维或二维卷积.

如二维卷积\(Y=W*X\)为卷积操作,其中\(W\)称为卷积核,\(X\)为特征矩阵。

3.2 互相关

在机器学习和图像处理领域,卷积的主要功能是在一个图像(或某种特征)上滑动一个卷积核(即滤波器),通过卷积操作得到一组新的特征.在计算卷积的过程中,需要进行卷积核翻转。而在计算自相关时,则不需要翻转,所谓的翻转是对卷积核进行从上到下,从左到右的的颠倒。因此互相关和卷积的区别仅仅在于卷积核是否进行翻转

在深度学习中我们一般使用自相关,它也称为不翻转卷积

注:卷积核是否进行翻转和其特征抽取的能力无关.特别是当卷积核是可学习的参数时,卷积和互相关在能力上是等价的.因此,为了实现上(或描述上)的方便起见,我们用互相关来代替卷积

3.3 卷积神经网络

卷积神经网络一般由卷积层、汇聚层和全连接层构成.

3.3.1 卷积层

卷积层的作用是提取一个局部区域的特征,不同的卷积核相当于不同的特征提取器。而图像为二维结构,因此为了更充分地利用图像的局部信息,通常将神经元组织为三维结构的神经层,其大小为高度M×宽度N×深度D,由\(D\)\(M × N\)大小的特征映射构成。特征映射(Feature Map)为一幅图像(或其他特征映射)在经过卷积提取到的特征,每个特征映射可以作为一类抽取的图像特征.为了提高卷积网络的表示能力,可以在每一层使用多个不同的特征映射,以更好地表示图像的特征. 在输入层,特征映射就是图像本身.如果是灰度图像,就是有一个特征映射,输入层的深度 \(D = 1\);如果是彩色图像,分别有 RGB 三个颜色通道的特征映射,输入层的深度\(D = 3\)

假设现在有一个卷积层的结构如下:

  • 输入特征映射组:\(X∈ ℝ^{M×N×D}\)为三维张量(Tensor),其中每个切片(Slice)矩阵\(X^d ∈ ℝ^{M×N }\)为一个输入特征映射,\(1 ≤ d ≤D\)

  • 输出特征映射组:\(y∈ ℝ^{M×N×P}\)为三维张量,其中每个切片矩阵\(Y^p ∈ ℝ^{M×N}\)为一个输出特征映射,\(1 ≤ p ≤ P\)

  • 卷积核:\(W∈ ℝ^{M×N×P×D}\)为四维张量,其中每个切片矩阵\(W^{pd}∈ ℝ^{U×V}\) 为一个二维卷积核,\(1 ≤ p ≤P , 1 ≤ d ≤ D\)

因此参数个数为:每一个输出特征映射都需要\(D\)个卷积核以及一个偏置.假设每个卷积核的大小为\(U × V\),那么输出\(P\)个特征映射共需要\(P × D × (U × V ) + P\) 个参数

3.3.2 池化层(汇聚层)

卷积层虽然可以显著减少网络中连接的数量,但特征映射组中的神经元个数并没有显著减少.如果后面接一个分类器,分类器的输入维数依然很高,很容易出现过拟合.为了解决这个问题,可以在卷积层之后加上一个汇聚层,从而降低特征维数,避免过拟合.汇聚层(Pooling Layer)也叫子采样层(Subsampling Layer),其作用是进行特征选择,降低特征数量,从而减少参数数量,也叫池化

假设汇聚层的输入特征映射组为\(X∈ ℝ^{M×N×D}\),对于其中每一个特征映射\(X^d ∈ ℝ^{M×N },1 ≤ d ≤D\),将其划分为很多区域,这些区域可以重叠,也可以不重叠.汇聚(Pooling)是指对每个区域进行下采样(Down Sampling)得到一个值,作为这个区域的概括.

常用的池化(汇聚)函数有:

  • 最大池化(最大汇聚):对于一个区域,选择这个区域内所有神经元的最大活性值作为这个区域的表示,即\(x^d=max x_i\)
  • 平均池化(平均汇聚):一般是取区域内所有神经元活性值的平均值,即\(y^d=avg(\sum x_i)\)

下图给出了采样最大汇聚进行子采样操作的示例.可以看出,汇聚层不但可以有效地减少神经元的数量,还可以使得网络对一些小的局部形态改变保持不变性,并拥有更大的感受野.

4. 网络优化和正则化