深度学习基础入门(一):基本概念和术语解读

    本文旨在解释一些深度学习中的基本概念,并通过一些实践中的例子帮助理解,可能个人解读有误,还望指正。本文提纲参照参考文献【2】进行,对其简练的内容加以了丰富和扩展,确保零基础的新手也可以有比较清晰的认识。

表示学习(representation learning)

        表示学习是机器学习中的一项重要任务,又称学习表示。即用何种机器能够理解的表示方法来标表示数据。例如在NLP领域中,用word2vec方法,将自然语言用向量形式表示。

        书面化一点地说,机器学习旨在自动地学到从数据的表示(representation)到数据的标记(label)的映射。

        表示学习有很多种形式,比如CNN参数的有监督训练是一种有监督的表示学习形式,对自动编码器和限制玻尔兹曼机参数的无监督预训练是一种无监督的表示学习形式,对DBN参数-先进性无监督预训练,再进行有监督fine-tuning-是一种半监督的共享表示学习形式。

        表示学习中最关键的问题是:如何评价一个表示比另一个表示更好?表示的选择通常通常取决于随后的学习任务,即你的目的是什么,要达到什么效果。一个数据样本集可能有多个特征可以表示它,例如鸡蛋,可以说形状是圆的作为一个表示,也可以说外白内黄作为一个表示,当然也可以联合起来使用……所谓条条大路通罗马,路又分为水路、旱路,你要去小岛上就要选水路,去地面上某个地方就要选旱路。一个好的表示应该使随后的任务的学习变得更容易、更加准确高效。再以专业化一点的基于CNN的图像分类任务为例:模型可以分为基于CNN的特征抽取基于softmax回归的线性分类两个部分。通过模型参数有监督的训练,通过CNN,从线性不可分的图片里抽取出线性可分表示(特征),softmax线性分类器可以基于抽取的线性可分的表示进行分类。

        随着机器学习算法的日趋成熟,人们发现,在某些领域(如图像、语音、文本等),如何从数据中提取合适的表示成为整个任务的瓶颈所在,而数据表示的好坏直接影响后续学习任务(所谓garbage in,garbage out)。与其依赖人类专家设计手工特征(难设计还不见得好用),表示学习希望能从数据中自动地学到从数据的原始形式到数据的表示之间的映射。

        表示学习中最有趣的一种形式是涉及多个任务的共享表示学习。为什么?

        以无监督和有监督结合的共享表示学习为例。在深度学习任务中,我们通常有大量的无标签的训练样本和少量的有标签的训练样本。只在有限的有标签的训练样本上学习,会导致模型存在严重过拟合问题。共享表示具体来说,可以从大量无标签的观测样本中通过无监督的方法,学习出很好的表示,然后基于这些表示,采用少量有标签的观测样本来得到好的模型参数,缓解监督学习中的过拟合问题。

        共享表示学习涉及多个任务,多个任务之间共享一定相同的因素,比如相同的分布(distribution)、观测样本X来自相同的领域(domain)等。共享表示学习有多种表示形式。假设共享表示学习中采用训练样本A进行无监督学习,训练样本B进行有监督学习。样本A和样本B可能来自相同的领域,也可能来自不同的领域;可能任务服从相同的分布,也可能服从不同的分布。

        共享表示学习相关的机器学习技术有很多:迁移学习(Transfer Lear)、多任务学习(Multitask Learning)、领域适应性(Domain Adaptation)(One Shot Learning、Zero Shot learning)等。深度学习技术具有很强的特征抽取、知识表达的能力,是共享表示学习的利器,它可以有效抽取多个人任务之间共享的因素、知识或特征。因此,现在出现了很多将深度学习技术用于迁移学习、多任务学习技术中的研究。

深度学习(deep learning,DL)

        表示学习的理想很丰满,但实际中人们发现从数据的原始形式直接学得数据表示这件事很难。深度学习是目前最成功的表示学习方法,因此,目前国际表示学习大会(ICLR)的绝大部分论文都是关于深度学习的。深度学习是把表示学习的任务划分成几个小目标,先从数据的原始形式中先学习比较低级的表示,再从低级表示学得比较高级的表示。这样,每个小目标比较容易达到,综合起来我们就完成表示学习的任务。这类似于算法设计思想中的分治法(divide-and-conquer)。

深度神经网络(deep neural networks,DNN)

        深度学习目前几乎唯一行之有效的实现形式。简单的说,深度神经网络就是很深的神经网络。我们利用网络中逐层对特征进行加工的特性,逐渐从低级特征提取高级特征。除了深度神经网络之外,有学者在探索其他深度学习的实现形式,比如深度森林。

        深度神经网络目前的成功取决于三大推动因素。1. 大数据。当数据量小时,很难从数据中学得合适的表示,而传统算法+特征工程往往能取得很好的效果;2. 计算能力。大的数据和大的网络需要有足够的快的计算能力才能使得模型的应用成为可能。3. 算法创新。现在很多算法设计关注在如何使网络更好地训练、更快地运行、取得更好的性能。

激活函数(activation function)

        激活函数是神经网络的必要组成部分,数据经过经过函数运算后由激活函数映射输出。如果没有激活函数,多次线性运算的堆叠仍然是一个线性运算,即不管用再多层实质只起到了一层神经网络的作用。如下图,Y的表达式f,就是一个激活函数。(如果对神经元结构还不清楚的同学,可翻看本博客先前的一篇关于CNN浅析的更基础的博文。)也就是说,每一个输入都有自己的权重,权重和输入的值相乘,然后加上一个偏置b之后在经过一个函数f得到输出y,这个f就是激活函数。

        一个好的激活函数应满足以下性质。1. 不会饱和。sigmoid和tanh激活函数在两侧尾端会有饱和现象,这会使导数在这些区域接近零,从而阻碍网络的训练。2. 零均值。ReLU激活函数的输出均值不为零,这会影响网络的训练。3. 容易计算


        常用的激活函数:1)sigmoid:输入一个实值,输出一个 0 至 1 间的值。

        2)tanh(双曲正切函数):输入一个实值,输出一个 [-1,1] 间的值:

        3)ReLU:ReLU 代表修正线性单元。输出一个实值,并设定 0 的阈值(函数会将负值变为零)f(x) = max(0, x)。


多层感知机(multi-layer perceptrons,MLP)

        多层由全连接层组成的深度神经网络。即至少包括一个隐藏层,如下图。MLP也是最早的前馈神经网络的一个例子。单层感知器只能学习线性函数,而多层感知器也可以学习非线性函数。多层感知机的最后一层全连接层实质上是一个线性分类器,而其他部分则是为这个线性分类器学习一个合适的数据表示,使倒数第二层的特征线性可分。

迁移学习(transfer learning)

      迁移学习(Transfer learning) 顾名思义就是就是把已训练好的模型参数迁移到新的模型来帮助新模型训练。考虑到大部分数据或任务是存在相关性的,所以通过迁移学习我们可以将已经学到的模型参数(也可理解为模型学到的知识)通过某种方式来分享给新模型从而加快并优化模型的学习效率不用像大多数网络那样从零学习(starting from scratch,tabula rasa)。
        在事实上,很多迁移学习的效果往往是负面的,这引起了一些学者对迁移学习是否真的/一定有用产生了怀疑。

多任务学习(multi-task learning)

        在多任务学习中,任一任务的训练目标都是同等重要的,这不同于上面讲的迁移学习(一个学完了传递给另一个)。最简单直接的多任务学习网络就是直接应用一个普通的网络结构在最后输出层前分叉到不同的任务预测层。

        与其针对每个任务训练一个小网络,深度学习下的多任务学习旨在训练一个大网络以同时完成全部任务。这些任务中用于提取低层特征的层是共享的,之后产生分支,各任务拥有各自的若干层用于完成其任务。多任务学习适用于多个任务共享低层特征,并且各个任务的数据很相似的情况。

        但是多任务学习可能会遇到一个很棘手的问题,那就是如何在不同难度的任务的目标下,找好训练的权重。由于任务难度和数据集不同的缘故,在进行多任务学习中,有一种情况是网络中学到的特征被某一任务 dominate。一个简单的例子:我们同时训练 MNIST 和 ImageNet。由于我们知道MNIST是一个极其简单的数据集,而ImageNet是一个数据量大且复杂的多的数据集。那么模型训练将飞快的收敛 MNIST 的识别任务,且慢慢变成是基于 MNIST 特征网络的初始值的 ImageNet 训练。

        多任务学习的神经网络的内部运行情况无从得知。即使有相当多的实验结果表明,多任务学习比单任务学习的准确率较高,或者说泛化能力更强。但是多任务学习是否真正在学通用的特征我们无从得知。也有可能多任务学习仅仅是部分神经元负责负责特定网络,由于这多任务的分配导致网络结构比单任务小了而提高准确度我们也可说不是不可能。如何理解多任务网络结构,如何观察并确认特征的泛化能力也是一个重要的问题。

端到端学习(end-to-end learning)

        个人认为工业界中,并没有严格的端到端的概念。结合具体的例子比较好理解,可参见文献【4】。可以简单理解为:所设计的神经网络一端输入原始数据,一端输出想得到的最终结果,有点像一个黑箱的过程。而人们只需要只关心输入和输出,中间的步骤全部都不管。但是我个人觉得端到端不是强调这个过程,而是强调结果。即结果的形式是否是我们想要的最终形式。例如最近在做的目标检测领域,很多人利用CNN做了分类识别,CNN起到一个分类的作用。若CNN能够自行判断所识别物体的坐标位置,给出region proposal,或者直接拉响集成了CNN的系统警报,这种简单粗暴、一条龙服务到底的实现我觉得就是端到端。但实际上研究端到端的工业意义并不是很大,能达到应用效果不一定只依赖神经网络,可以自行集成其他系统模块辅助完成,可能效率还更高呢。

        关于深度学习的端到端,参考文章【2】中略晦涩难懂的说法:深度学习下的端到端学习旨在通过一个深度神经网络直接学习从数据的原始形式到数据的标记的映射。端到端学习并不应该作为我们的一个追求目标,是否要采用端到端学习的一个重要考虑因素是:有没有足够的数据对应端到端的过程,以及我们有没有一些领域知识能够用于整个系统中的一些模块。




参考文献:


【1】

http://blog.csdn.net/lqfarmer/article/details/73045120?utm_source=debugrun&utm_medium=referral

【2】https://zhuanlan.zhihu.com/p/31561570 (深度学习基础,整理得完整、简练)

【3】https://www.zhihu.com/question/41979241 刘诗昆

【4】https://zhuanlan.zhihu.com/p/31561570




猜你喜欢

转载自blog.csdn.net/lyxleft/article/details/79636722