deep learning笔记:端到端学习

以前觉得深度学习就是有很多层的神经网络,或者周志华提出的深度随机森林,总之只要是有很“深”的结构就是深度学习。直到不久前一位计科大佬告诉我深度学习是end-to-end(也表示成“e2e”)的,当时听的也是一知半解,回去查了一下后终于恍然大悟。本文主要基于Andrew Ng的课程中“What is end-to-end deep learning?”和“Whether to use end-to-end learning?”两节。推荐可以去看一看,讲得可以说是很浅显易懂了。


什么是end-to-end learning

传统机器学习的流程往往由多个独立的模块组成,比如在一个典型的自然语言处理(Natural Language Processing)问题中,包括分词、词性标注、句法分析、语义分析等多个独立步骤,每个步骤是一个独立的任务,其结果的好坏会影响到下一步骤,从而影响整个训练的结果,这就是非端到端的。
而深度学习模型在训练过程中,从输入端(输入数据)到输出端得到一个预测结果,该结果与真实结果相比较会得到一个误差,这个误差将用于模型每一层的调整(比如反向传播),这种训练直到模型收敛或达到预期的效果才结束,这就是端到端(end-to-end)的。

相比传统方法每一个模块都有较为明确的输出,端到端的深度学习更像是一个神秘的整体。通俗的说,端到端的深度学习能够让“数据说话”。不过这种方法是很吃数据的,因此还不至于在每个领域都胜过甚至代替传统的机器学习方法。
由于以前被标注的数据没有那么丰富,因此经典机器学习方法始终占据主流。随着近年来一个又一个数据集的出现,这种状况发生了转变。一个重要的转折点就是AlexNet的横空出世,详见deep-learning笔记:开启深度学习热潮——AlexNet
在目标跟踪领域,继相关滤波大火之后,也出现了很多优秀的深度学习算法。其中,孪生网络充分借鉴了两者的优势,取得了不错的成绩。

上面是SiameseFC的主体架构,它借用了神经网络去提取特征,而不是利用一些较为经典的特征。实际上,也可以认为它是端到端的,在调整了相关滤波的形式之后,使相关滤波的操作过程可求导,从而实现了整个模型内部的前向传播和反向传播,实现端到端。
那么,这样做有什么意义呢?误差理论告诉,误差传播的途径本身会导致误差的累积,多个阶段大概率会导致误差累积,而端到端的训练就能减少误差传播的途径,实现联合优化。


何时该用end-to-end learning

相比之下,端到端学习省去了每一步中间的数据处理和每一步模型的设计(这往往会涉及相当多的专业知识),但是端到端学习也有两个重要的缺点。

  1. 缺点一:需要大量的数据

    Andrew Ng在视频课程中举了一个例子:百度的门禁系统可以识别靠近的人脸并放行。
    如果直接使用端到端学习,那么需要训练的数据集就是一系列照片或者视频,其中人会随机出现在任何位置、任何距离等等,而这样标注好的数据集是很匮乏的。
    但是,如果我们把这个任务拆解成两个子任务。首先,在照片或者视频中定位人脸,然后放大(使人脸居中等);其次,对放大好的人脸再进行检验。这两种任务都有非常丰富的数据集或者方法可供使用。实际上,我觉得可以应用两个端到端的模型来解决这两个问题,但合起来就不是端到端的了。但在目前现有数据量的情况下,这依然能比直接端到端的方法表现得好。
  2. 缺点二:可能排除有用的人工设计

    前面提到,人工设计的模块往往是基于知识的。而知识的注入有时候会大大简化模型(尤其是数据不足的时候)。这里Andrew Ng又举了一个例子:通过X光片来估计年龄。
    传统的方法就是照一张图片,然后分割出每一块骨头并测量长度,然后通过这些长度结合理论和统计来估计年龄。
    而若是使用端到端的模型,就是直接建立图片与年龄之间的联系,这显然是很难且很复杂的,训练结果的表现也可想而知。

端到端学习确实在很多领域都能取得state-of-the-art的表现,但何时使用还是要具体问题具体分析。


神经网络学到了什么

我在前文中写了这样一句话:“相比传统方法每一个模块都有较为明确的输出,端到端的深度学习更像是一个神秘的整体”。但实际上一些研究者通过分离观察每一层,发现e2e的神经网络的确还是学到了一点东西的。
一般而言,神经网络前几层学到的内容包含的信息比较丰富具体。越到后面越抽象,即越到后面包含的语义信息越多。下面是对每一个卷积核(神经元)做可视化处理,左图为靠前的某层的可视化结果,而右图为靠后的某层的可视化结果。可以看到,相较于后面的层,前几层的卷积核似乎呈现出更明确的任务或者说功能。它们通常会找一些简单的特征,比如说边缘或者颜色阴影。

我们可以对第一层卷积层做特征可视化来看一下。

从特征可视化结果中看,出第一层卷积提取出了不同的特征,有些突出了斑马的形状,有些突出了背景,有些突出了斑马的斑纹等。
下面是Andrew Ng在课程中举得一个可视化例子,他所采用的方法是对每层中的隐藏单元用数据集去遍历,并且寻找出9个使得隐藏单元有较大的输出或是较大的激活的图片或者图像块。注意网络层数越深其感受野会越大。详见deep-learning笔记:着眼于深度——VGG简介与pytorch实现

实际上,实现可视化的方法有多种,可以利用反卷积,也可以对一系列图像求响应值,上面的两个例子就是用了不同的方法(前者是针对一张图,而Andrew Ng用了一个数据集)。在Visualizing and Understanding Convolutional Networks一文中,作者也提出了一些更复杂的方式来可视化卷积神经网络的计算。我在computer-vision笔记:上采样和下采样中,也对反卷积进行了介绍。
在NLP领域,也有类似的发现,比如一些训练过后的神经元对特定标点的响应特别强烈,而有一些训练过后的神经元对一些特定语气词的响应特别强烈。


碰到底线咯 后面没有啦

本文标题:deep learning笔记:端到端学习

文章作者:高深远

发布时间:2020年01月22日 - 16:45

最后更新:2020年02月02日 - 14:59

原始链接:https://gsy00517.github.io/deep-learning20200122164503/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

0%