深度学习入门基础讲义

版权声明:本文为博主原创文章,转载请注明出处 https://blog.csdn.net/shuzfan/article/details/78586307

工作确定以后,闲暇时间做了如下一个PPT讲义,用于向实验室新生介绍深度学习。他们大部分在本科期间学习通信相关专业课程,基本没有接触过图像处理和机器学习。

对于一个研究生而言,自学应当是一个最基本也是最重要的能力。自学不仅是独立学习,更是主动学习。因此,该讲义的目的主要是使其对深度学习有一个初步的认识,并顺便了解一些常见的概念。 而真正走进深度学习,还需要各自的努力。

该讲义尽量用一些浅显的话语来介绍。囿于水平,一些讲解可能存在模糊甚至错误的情况,欢迎大家提出宝贵的意见。此外,希望补充某些内容,也可以留言或者私信。

PPT中有些图来自于网络,如果有侵权可以联系删除。

讲义下载:deeplearning讲义第一版 http://pan.baidu.com/s/1i4Jo3tz 密码:nxf9

讲义整体包含三部分:

  • 相关基础
  • 深度卷积神经网络
  • 深度学习应用示例

一、相关基础

这里写图片描述

关于世界是离散还是连续的目前还没有定论,但多数人倾向于 “世界是连续的,认知是离散的”。 对于通信系统或者信号处理专业的同学而言,离散和连续是一对熟悉而又重要的概念,它们可以相互转化。我们通常采用 采样量化 的方式将连续信号转化为离散信号,比如声卡设备的采集原理(稍好点的声卡都可以调节采样频率以及位深度等参数)。离散信号转化为连续信号通常采用 插值拟合 的方式来进行逼近,比如等高线地图的绘制、游戏地图的渲染。

对于机器学习而言,几乎所有的任务都可以归类为 离散的分类 任务和 连续的回归 任务。当我们面对一个机器学习问题时,可能需要以离散和连续的角度从宏观上认识该问题,并注意离散和连续的转化。

这里写图片描述

分类是一个典型的离散问题。如上面的三维空间点图,每一个蓝色点都是点热源附近的一个温度传感器。可惜的是,由于传感器部署位置以及损坏的原因,在绿色点A和B我们没有测得有效的温度数据。现在的问题是,如果我们将一块冰分别置于A和B两点,冰是否
会融化?

“是或者不是”,这是一个典型的二分类问题。解决这个问题很简单,我们甚至根本不用具体知道A和B两点的温度。我们只需要设定一个距离阈值,然后计算A、B两点距点热源的距离是否大于该阈值就可以了。

这里写图片描述

回归是一个典型的离散到连续的问题。还是上面的图,如果我们想要知道A、B两点的具体温度该怎么办?

一个常见的方法是 “插值”,比如左图所示的 “双线性插值”。最简单的双线性插值是用未知点周围4个已知点的数值加权得到,加权系数由未知点到已知点的距离决定。具体操作时常采用先水平加权再垂直加权的方式。

插值仅仅利用了未知点附近的信息,没有考虑全局的分布。事实上,传感器所测量的温度恰好符合如右图所示的高斯曲面。于是,如果我们找到了这样一个可以尽可能描述温度数据分布的曲面方程,那么A、B两点的温度直接就可以知道了。

通过上面的例子,我们除了要认识到“离散”和“连续”之间的区别,也要学会思考二者之间的联系。毕竟,如果知道了具体的温度,也就直接解决了那块冰会不会融化的问题。

这里写图片描述

线性回归可以说是最简单的也是我们接触最早的机器学习方法,因为线性回归出现在很多中学数学教材中。线性回归的问题很简单,如上右图所示,寻找一条最“贴合”的直线。所以我们假设的模型就是一条直线,有2个未知参数(斜率和截距);然后我们继续定义一个代价函数(有些地方也称损失函数 loss function),这个代价函数其实就是一个欧氏距离平方和;最后我们的目标函数就是最小化代价。

模型假设 —— 代价函数 —— 目标函数,基本是解决一个机器学习问题所必备的三个要素和步骤。

这里写图片描述

数学中所有的优化问题都可以描述为在一个解空间中找到使目标值最小的解的问题。然后,这类最优化问题又可以被分为 凸优化非凸优化问题。 凸优化是一个非常简单的问题,并且有着一个特别好的性质:任何局部最优解即为全局最优解。但是,绝大部分实际问题都是非凸的,直观上体现为解空间有着很多局部最小点。

幸好,我们的直线拟合问题是一个简单的凸优化问题,其有着唯一最优解(当数据点对称分布时可能不满足)。

这里写图片描述

为了求解直线参数,我们之前定义了最小化误差的平方和作为我们的损失函数。为什么用误差平方和而不是用误差绝对值?误差的立方?

于是,我们又要引入最小二乘法(又称最小平方法)这种数学优化技术。在所有无偏的线性估计类中,最小二乘方法是其中方差最小的。

当我们把数据点带入目标函数并整理,我们发现这只是一个简单的双变量二次函数,其解空间如上右图所示,即只有一个全局最小点。 此时,极值点即为全局最小点。因此,我们令偏导数为0,则可以求出一个解。

这里写图片描述

上面我们已经根据偏导为0求出了线性回归的统一解,但是这种方法并不是一直有效的,特别是矩阵求逆困难或者不能求逆时。为此,这里引入另外一种经典的数值优化方法 —— 梯度下降法。

梯度下降法,又称最速下降法。顾名思义,即在解空间中沿着下降速度最快的方向进行搜索。最简单的,一条直线,其梯度就是其斜率,那么我们沿着斜率的反方向移动,数值下降的最快。上左图中蓝色曲线表示 \(f(x,y)=-(cos^2x+cos^2y)^2\), 下面的红色箭头表示每一点的梯度。

于是,简单的梯度下降方法就是初始化参数后不断迭代执行 计算梯度 <——> 更新参数,直至目标函数值满足要求。

这里写图片描述

由于梯度下降算法需要随机初始化参数,因此当解空间有多个极小值点时,梯度下降算法有可能会陷入局部最优。

这里写图片描述

线性回归用于连续数值回归,逻辑回归则用做离散的二分类。比如,肿瘤可以分为良性肿瘤与恶性肿瘤,一般需要病理切片才可以确诊,但可以通过观察肿瘤尺寸来为初步判定提供指导。上图横轴表示肿瘤尺寸,纵轴非0即1表示是否为恶性肿瘤。我们可以利用前面的线性回归方法找到一条直线,然后医生诊断时可以将患者的肿瘤尺寸代入直线方程,如果回归得到的数值大于0.5则判断为恶性肿瘤。

上面的例子其实说明了:回归 + 判决 ——> 分类。

但是,如果患者问医生:“我有多大几率是恶性肿瘤?” 医生该怎么回答。

这里写图片描述

为了获得有意义的概率输出,我们需要追加一个Logistic非线性函数。由于该函数长得像“S”形,所以又叫Sigmoid函数。 该函数可以把无穷区间内的数值压缩到 [0,1] 之间。

于是,我们的模型假设,完整的逻辑回归,相当于线性回归加上一个非线性Logistic函数。而我们的代价函数也变成了交叉熵。

这里写图片描述

原始的逻辑回归只能用于处理二分类问题,但实际中更多的问题其实是多分类问题。最简单的将二分类技术应用于N分类问题的方法是:训练N个二分类器。

这里写图片描述

上面我们使用了最简单的线性假设,当我们的模型假设上升为更高阶的非线性模型时,我们便引入了非线性回归。

非线性回归其实和线性回归很多地方非常相似,但有一点需要注意,那就是 过拟合 的问题。上左图是一个典型的一次模型欠拟合的示例,欠拟合表示模型能力不足以描述数据分布;当采用二次模型时,数据拟合就比较合理了;但是当采用更高阶的四次模型时,我们会发现曲线 过度 拟合了数据,虽然曲线经过了每个样本点,但直观上这并不是我们想要的。

这里写图片描述

在上一张PPT中,我们通过画图的形式比较直观的观察了欠拟合和过拟合的样子。这里引入 Bias(偏差)Variance(方差)来定量的描述这几种模型状态。

偏差: 偏差描述的是模型的准确性,偏差比较大表明模型欠拟合。在靶标图上表示为:落点远离靶心。

方差: 方差描述的是模型的稳定性,方差比较大通常表示过拟合。在靶标图上表示为:落点非常散乱。

偏差的概念比较好理解,方差的概念可能还需要再次解释一下。 大家可能听说过Bagging方法:采用同一种模型假设,有放回地从训练数据中抽取一部分数据,然后重复得到N个模型。如果这N个模型实际测试时表现差异很大,就可以认为是高方差。

这里写图片描述

过拟合在模型训练中是经常遇到的问题。防止过拟合的一个有效方法就是控制模型的训练程度。

我们通常会将数据划分为两部分(训练集和测试集)或者三部分(训练集、验证集和测试集)。训练集用来学习模型参数,比如逻辑回归中的直线斜率和截距;验证集用来调整一些模型超参数,比如逻辑回归分类恶性肿瘤中,我们将概率阈值设为0.5;测试集用来测试模型的性能。

我们可以在训练过程中不断绘制训练误差和测试误差相对训练时间的变化曲线,通过观察曲线我们来判断是否过拟合。显然,测试误差逐渐增大,训练误差持续减小,二者差距逐步扩大,表明模型正在经受过拟合的风险。

这里写图片描述

降低过拟合最有效最直接的方法还是增加更多高质量的训练样本。有些时候,冥思苦想怎么解决过拟合,还不如多搞点数据立竿见影。因为,数据多了通常更利于我们发现和学习统计规律。

这里写图片描述

另外一种普遍使用的防止过拟合的方法就是控制模型的复杂度。显然从前面的例子我们知道,复杂的模型更容易过拟合,但过于简单的模型又容易欠拟合。 那我们该如何选择一个合适复杂度的模型?一种比较呆的方式是准备一系列复杂度由低到高的模型进行训练,然后观察其测试集表现。

通过观察不同的模型表达式,我们可以发现如果对高阶项的系数加以约束,那么高阶模型便可以退化为低阶模型,从而降低模型复杂度。于是,我们修改之前的代价函数,在原来的基础上增加对参数的约束,主要包括L1正则化(绝对值)和L2正则化(平方)。

这里写图片描述

L1和L2正则化都有缩小参数的作用。

但L1会倾向于使得参数稀疏化(一些值为0);L2倾向于使得参数稠密地接近于零。关于这一点的解释,可以从梯度上认识:L2的梯度在接近0点附近时会变得很小,这会明显放缓参数的更新;但L1的梯度是保持恒定的,即会一直以大学习率更新参数。另一种解释是从解空间来看,平方误差项和L2正则项的交点更容易出现在凸点处。

这里写图片描述

我们之前提到的线性模型加上一个阶跃函数就可以构成一个 单层感知机。 同样地,也有多变量单层感知机。单层感知机可以轻松解决 “与” 问题。

这里写图片描述

但是单层感知机的线性分类能力并不足以解决 “异或”问题。

这里写图片描述

理论证明,多层感知机,只要节点足够多,就可以逼近任意非线性函数。证明很简单,无限阶跃信号求和可以任意逼近。

这里写图片描述

既然了解到了多层感知机,那么使用MLP对图像进行分类也是理所当然的了。比如我们要对手写数字进行识别,图像大小为 28x28=784。 那么这个问题就可以如上图所示解决:输入784个变量,中间有一个隐藏层,然后输出10个数值用于对应数字0-9的概率。上面的三层感知机,包含一个输入层、一个隐藏层、一个输出层,但实际只拥有两级参数。另外,之所以称中间的层为隐藏层,大体是因为中间东西太多看不清楚,而我们只能看清输入和输出。

这里写图片描述

但是当我们的待分类图片特别大时,比如做汽车分类。假设彩色图像宽和高分别为400和300,则像素个数为360000,如果我们第一个隐层有N个节点,那么单单是第一层的参数就有360000*N这么多。所以MLP的一大缺点就是参数太多,参数过多带来的是硬件设备的压力、训练的难度以及过拟合的风险。

这里写图片描述

MLP的缺点几乎注定了其在机器学习的早期阶段难有大的作为。早期的机器学习方法大多属于两段式方法。第一段:根据先验知识提取一些高级的特征,比如SIFT、LBP、颜色直方图等。这些特征基本都是人为设计的,然后用于描述图像颜色、纹理、结构之类的关键信息。原始的像素信息可以认为是低级的特征,维度很高;而特征提取可以看作一个变相的降维。第二阶段:利用之前提取的高级特征,然后结合一些具体的分类和回归方法。

这里写图片描述

所以纵观MLP的历史发展,大致有三个重要的阶段。早期的单层感知机不能解决异或问题,后来的多层感知机尽管有着万能逼近定理结合梯度反传算法的支持,但因为时代的局限性还是被SVM打压。一直到后来的卷积神经网络。

这里写图片描述

卷积神经网络的成功除了算法上的进步,时代背景环境的发展也是重要因素。

  • 卷积神经网络通常有大量参数需要学习,因此计算机硬件计算能力的提升,特别是GPU的发展,为神经网络的发展提供了重要的支撑。当然,卖显卡的NVIDIA也起飞了。
  • 另外就是互联网的发展使得图像视频资源大大丰富起来,神经网络已经有机会获得其所需的百万级别规模的训练数据。
  • 当然,众多研究人员在神经网络训练方法、机理探究等方面做出的突破也是CNN成功的重要因素。

这里写图片描述

最后,在第一部分“相关基础”环节,再提一下 “监督学习”“非监督学习”概念。

所谓的学习,就是 举一反三。 用已有的知识来解决类似的已知的或未知的问题。

我们前面提到的 分类回归都属于监督学习,因为我们的训练数据是有 标签的。我们训练的对不对、准不准,是可以通过和真实结果(ground truth)直接进行对比而知晓的。就比如说,大家为了考试去刷题,题目都是有答案的,这样我们才能不断纠错反馈进步。

但是还有另外一种学习,叫做 无监督学习,无监督学习最难的地方在于我们没有 标签。目前的无监督学习更多的是解决 聚类 的问题。 一个经典的无监督学习的例子叫做 “鸡尾酒会问题”,是计算机语音识别领域的一个问题。当前语音识别技术已经可以以较高精度识别一个人所讲的话,但是当说话的人数为两人或者多人时,语音识别率就会极大的降低,这一难题被称为鸡尾酒会问题。(通信信号处理专业,有些人会称之为盲信号分离或者信号的盲原分离。)

这里写图片描述

深度卷积神经网络可以认为就是高级点的 多层感知机。 深度卷积神经网络的深入学习需要阅读大量的论文,可以百度Github开源项目 —— “深度学习论文阅读路线图”。

这里写图片描述

深度卷积神经网络(DCNN)中 “Neural” 一词来源于神经元模型。一个典型的生物神经元,是一个多输入单输出的信息处理单元。而我们的感知机模型基本就是因此而来的。

这里写图片描述

“Network” 的概念也很清晰。生物学家发现人类大脑处理任务是分层的,同时众多神经元协同工作共同成了功能强大的神经网络。

这里写图片描述

“Deep” 形容的就是网络的层数。早期的感知机可能只有3层(一个输入层、一个输出层、一个隐藏层),但是最新的DCNN已经超过了1000层。

这里写图片描述

“Convolution” 是一种特殊的 “采样” 方式。 前面我们看到的感知机的输入都是一个一个的数值,尽管我们可以将一幅图像拉成一个矢量并送入感知机,但这样却会极大削弱图像固有的 局部相关性。为了更好的保留局部相关性信息,最直接的方式就是整块整块的输入,具体实现起来很像滑动窗口。 学过数字信号处理或者进一步选修过数字图像处理的,应该对卷积这一概念比较熟悉。

这里写图片描述

我们注意到,深度卷积神经网络的构成是 分层的 这一概念带给我们最直观的感受是我们可以像组装乐高积木一样,用不同功能的模块来构成千奇百怪的网络模型。下面我们就介绍一些常用的模块 —— 层。

这里写图片描述

首先当然是全连接层。这层很简单,而且我们前面提到的多层感知机默认就使用了这种结构。该层会默认将任意维度的输入首先 “平铺”成一维矢量,然后执行y=wx+b的操作。 需要学习的参数主要有w和b。尽管全连接层参数通常比较多,但由于我们可以利用很多高度优化的基础线性运算库(比如MKL、OpenBLAS等),因此执行效率还是蛮高的。

这里写图片描述

由于DCNN更多的被用来处理图像,因此卷积层的使用频率是最高的。 当把卷积看作滑窗的时候,其实我们可以很容易想到有哪些有关卷积的超参数需要我们提前设置好:窗口大小,我们一般称之为卷积核大小;卷积核的个数;窗口的滑动步长;还有就是图像边缘是否需要填补。我们除了要能够计算清楚卷积后的输出维度之外,还必须清楚的是:每一个卷积核通常都是3D的,以彩色图像为例,一个卷积核除了有宽和高两个维度外,还有第3个维度用于处理RGB通道。

尽管卷积的操作稍显复杂,但还是属于线性操作,因为其本质还是加权求和。

这里写图片描述

Pooling,中文通常翻译为 池化。 Pooling层的操作方式和卷积很像,都是滑动窗口,但没有需要学习的参数。Pooling有Max Pooling 和 Average Pooling两种。前者返回窗口范围内的最大值,后者返回窗口内数值的均值。

这里写图片描述

Dropout层用来减轻网络过拟合的风险。Dropout没有需要学习的参数,只是需要提前设定一个概率p。训练时,按照一定概率p将输出置0;测试时,启用所有节点,但为了数值均衡需要将输出乘以(1-p)。

我们可以简单思考下Dropout防止过拟合背后的原理。

  • 让输出更稀疏,而稀疏一直都是重要的正则化手段;
  • 随机输出置0,相当于给训练引入更多干扰。虽然增加训练难度,但也会让模型更鲁棒;
  • 由于是随机操作,相当于每次都在训练不同的模型。有点类似于Bagging方法。

这里写图片描述

卷积通常会使得输出的宽和高变小,反卷积则致力于将输出尺寸变大。反卷积最早应用在图像的语义分割上,因为语义分割要求输出和输入一样大小。 反卷积的操作方式类似于卷积,只不过会实现对输入进行插值或者说填空。

这里写图片描述

我们在前面已经接触到了Sigmoid激活函数。 激活函数通常都是非线性变换,其主要目的也是为了让网络拥有更强大的非线性表示能力。Sigmoid和TanH因为可以对数据范围进行压缩,有些特殊的场合还是有需求的;但更多的网络所采用的其实还是ReLU激活函数(包含一些变种,但还是ReLU更常用)。

这里写图片描述

之所以ReLU会取代Sigmoid而占据主流地位,主要原因有:

  • ReLU计算复杂度低,包括求导也简单;
  • ReLU可以解决Sigmoid带来的梯度消失问题,因为ReLU对有效值的梯度始终为1,而Sigmoid的梯度值总小于1/4;
  • ReLU可以让输出稀疏,稀疏是个正则化的好东西;

这里写图片描述

接下来开始介绍几个常用的损失函数,首先是Sigmoid交叉熵。 其一般用于二分类问题,也可以用于相互不独立的1对多问题。比如一个实际上包含3个二分类的问题:是否喜欢吃西瓜?是否喜欢吃草莓?是否喜欢吃苹果?可以存在同时喜欢3种水果的人。此外还需要注意的是,在进行Sigmoid概率归一化时要注意数值溢出的问题,比如 \(x\) 远小于0,那么我们计算时就不应当使用 \(1/(1+e^{-x})\) 而应当使用 \(e^x/(1+e^{x})\)

这里写图片描述

实际当中我们遇到更多的其实是独立N分类问题,比如之前提到的手写数字识别分10类,这个时候我们通常使用Softmax Loss。其实该loss也是一种交叉熵,但由于往往使用one shot label,即每个样本的标签是一个 1xN 维矢量,且矢量只有对应具体类别的位置处数值才为1,其余全部为0,因此该loss函数会退化为 \(-log(p_i)\)的简单形式。

为了使得输出数据范围在 [0,1]之间且之和为1,我们通产会采用softmax归一化。

这里写图片描述

L1和L2 loss通常用于数值回归,其定义比较简单,后面会给出具体的例子。此外,还有以下几点补充:

  • L2 Loss中,之所以除以2N,只是为了在求导时比较方便而已;
  • L1 和 L2哪个更好用一点,更多的时候真的要看经验;
  • 通常在L1 和 L2 Loss之前都会对输入做归一化(常用单位方差归一化),以防止数值溢出和Loss动荡;


—————————————————————————————————————————————

接下来介绍一些神经网络求解优化相关的一些东西:

这里写图片描述

神经网络的优化求解,主体上是基于 反向传播这一框架,然后使用 梯度下降 这一核心算法。
我们需要梯度下降来更新参数,那么就需要计算每一个参数的偏导数。反向传播其实就是我们熟悉的链式求导,这主要是因为我们的网络是分层的,可以看作函数嵌套。

因为链式求导是一个连续乘积的形式,如果每个中间梯度的幅值都比较小,这将导致最后计算出的梯度异常小,这就是所谓的 梯度消失现象,反之也有所谓的 梯度爆炸。 这其实我们放弃 Sigmoid 而改用 ReLU激活函数的原因所在,ReLU求导梯度幅值保持为1。

这里写图片描述

在前面我们就已经介绍过 梯度下降 这一优化方法。事实上,我们之前介绍的方法确切来说应当称为 批量梯度下降,因为我们将全部训练样本(点)带入了我们的代价函数中来计算梯度。 这样做的好处是梯度估计准确,但是缺点也很多:当考虑所有样本时,计算压力会很大(内存不够用),同时也很难在线添加新的样本。

这里写图片描述

我们采用一种简化的方式:计算某个样本的梯度,用一个样本的梯度去代替整体样本的梯度。

因为我们是用一个样本的梯度来估计整个数据集的梯度,具有一定的的随机性(误差),因此称为随机梯度下降。

这里写图片描述

为了提高效率,我们采用一个折衷的版本。我们使用小批量的(mini-batch)训练数据来估计梯度。事实上,绝大部分场景下我们使用的都是该处理方式。

这里写图片描述

动量的引入是为了加速SGD的优化过程。简单分析下公式就会发现,带动量的SGD在计算当前梯度时会加上一部分上次的梯度。由于梯度是带方向的矢量,当前梯度与上次梯度进行加权,如果方向一致,则累加导致更新步长变大;如果方向不同,则相互抵消中和导致更新趋向平衡。

这里写图片描述

另外就是参数初始化的问题。我们一般采用随机参数初始化,主要是为了破坏网络的对称性。试想,如果所有参数都初始化一样,那网络的很多连接就会因为重复而浪费。随机通常采用均匀分布和高斯分布,因为二者都只需要均值和方差两个参数便可以控制。通常都是采用零均值,置于方差早期大多根据经验设置,后来也有人进行具体研究,比较有代表性的就是 XavierMSRA方法,二者的出发点基本一致。

神经网络可以说在学习一个非常复杂的非线性表达式来描述输入数据的分布。学习到最后收敛了应当是一个稳定的分布,而每一层的分布也应当是稳定的。但可惜的是,每一层的参数每次都在更新导致其分布也在变化,这不利于 “信息的流动”。因此,我们应当尽量保证每一层同分布。于是Xavier经过推导认为某一层参数的方差应当同时等于输入和输出神经元个数的倒数,折衷后就有了上面的表达式。 MSRA的推导也类似,只不过采用了高斯分布。

这里写图片描述

为了保证分布稳定统一,前面设计了特殊的网络参数初始化策略。事实上,我们还可以通过更加强硬的手段在每一个卷积层或者全连接层后追加一个Batch Normalization层来对输出进行0均值单位方差归一化。 归一化的方法很简单:减去均值除以方差。由于均值和方差是通过一个batch的样本计算得到的,因此叫Batch Normalization。


—————————————————————————————————————————————

接下来介绍一些经典的神经网络模型:

这里写图片描述

LeNet被美国银行和邮政系统用来识别支票、邮政编码中的的手写或机打数字。LeNet共有7层,主要使用了卷积层和全连接层,参数也不算多,但准确性很高,其可被商用便可证明。

早期的神经网络研究领域一片灰暗,LeNet就像那一点星火。

这里写图片描述

以深度卷积神经网络为代表的这场AI大火真正热烈起来应该始于2012年的AlexNet。 在ImageNet这一大规模图像识别比赛上,基于DCNN的ImageNet以压倒性的优势夺冠。尽管当时很多人表示对ImageNet的通用性特别是可解释性很怀疑。因为它的参数太多了,超过60M的参数使得ImageNet变成了一个黑箱,我们根本无法了解这个箱子里面所包含的隐层到底学到了什么。

效果好才是王道,DCNN很快流行起来。

ImageNet使用了很多优化技术来提高模型效果,比如我们已经介绍过的ReLU激活层和Dropout层。还有LRN层,虽然现在已经不是很常用了,大家现在基本都在使用BatchNorm层。另外两种值得一提的就是Data Augmentation(数据扩增)和 Group 卷积。

这里写图片描述

Data Augmentation(数据扩增)是在深度学习中普遍使用的一种技术或者说策略,其目的就是为了增强训练数据的多样性。一方面,神经网络模型通常有巨量参数,即模型很容易过拟合,因此增加数据多样性可以有效降低过拟合的风险。另一方面,深度学习内部的学习机理我们其实并不清楚,我们其实不能高估其能力,比如简单的手写数字像素取反就会导致错误的识别,因此增加更多各种各样的训练样本,有助于提高模型的泛化能力。(所谓的泛化能力是指模型在未曾见过的数据上的表现)

这里写图片描述

AlexNet中使用了Group卷积这一特殊操作,在了解该卷积之前我们先说一下普通卷积是怎样实现的。由于卷积的普遍使用,因此弄清楚卷积的原理和实现方式是很重要的。

卷积最常用的实现方式是 im2col + GEMM(图像块展开 + 矩阵乘法)。我们知道卷积的原理就是滑动窗口,然后窗口内做点积运算。滑窗意味着循环,如果我们每滑动一次就做一次点积运算,这样效率就太低了。于是我们把整个过程分为两步:第一步对图像滑窗遍历,每滑动一次就把图像块展开作为临时矩阵的一行;第二步直接进行一个大的矩阵乘法。

上述这种卷积实现方法速度较快的原理其实就是用空间换时间。因为要把每次滑动的块展开并存储,因此内存占用较大。 因为可以把很多小的点积运算变成一个大的矩阵乘法,因此效率更高。

这里写图片描述

普通的卷积其卷积核是3D的,且第3个维度等于输入feature map的channel数,如上图顶部所示。在AlexNet中使用了一种与众不同的Group卷积,以Group=4为例,此时每个卷积核的第3个维度仅仅等于输入feature map的channel数的1/4。

从上图我们可以看出,如果使用了Group,那么输出的维度不会有变化,但参数的数量却会平方倍减少。当初AlexNet使用Group=2的原因仅仅是GPU显存不够,但却没有料到这一操作在目前很多神经网络加速方法中被用的风生水起(大佬就是大佬)。

这里写图片描述

VGGNet可以看作是AlexNet的加强版。提升神经网络表达能力最直接的方法就是把网络变宽变深,VGGNet在宽度上作了进一步增强,但模型的参数量也多的让人窒息。

这里写图片描述

通常把网络变深所带来的收益要高于把网络变宽。 Network in Network 简称NIN,采用了标准的模块化设计。NIN的一大亮点是大量使用了1x1卷积,以少量的参数就可以增加层的深度。此外,1x1卷积可以省略im2col步骤,直接通过矩阵乘法完成,因此效率更高。

这里写图片描述

如果说VGGNet以简单粗犷取胜,那么GoogLeNet可以说把设计玩到了极致。GoogLeNet为了向LeNet致敬,特意将名字中的字母 “L”大写。

GoogLeNet共有22个卷积层,模型大小约50MB,远小于VGGNet的(约)500M,但性能很接近。GoogLeNet大体上也是模块化设计,其模块叫做 “Inception module”。“Inception”一词来源于电影盗梦空间,因为里面小李子说 “We need to go deeper”。该标准模块中对输入施加不同的卷积核,然后将多个分支的特征进行拼接,这样便可以综合利用不同的特征。此外,由于网络太深可能导致梯度消失,因此整个网络共使用了3个Loss来帮助梯度反传。

这里写图片描述

GoogLeNet有好几个进化版本。对于V3版本,主要的改进是用小卷积核级联来代替大卷积核,比如两个3x3卷积层相当于一个5x5卷积层,但参数量只有18/25。然后也用1xn卷积后跟nx1卷积来代替nxn卷积,这样参数量就只有2/n。

这里写图片描述

GoogLeNet网络比较深性能也不错,但训练难度比较高,明显比VGGNet要高,所以VGGNet流传好像更多一点。

ResNet,又叫“残差网络”,其最大的贡献是为深层网络的训练提供了一个突破口。ResNet34,ResNet152以至于后面1001层的也出现了。ResNet和普通的直线型结构相比,主要是多了一些 “跳接”。

这里写图片描述

DenseNet相比ResNet最大的改进就是引入了更多的 “跳接”,同时将ResNet中的 “+” 操作改为了特征拼接。

未完待续

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页