Deep Learning Note: 3-7 端到端学习

1. 端到端深度学习

  一些复杂的学习系统通常会具有多个处理阶段,端到端深度学习(End-to-End Deep Learning)将这些不同的处理阶段替换为一个神经网络。

  例如对于语音识别,输入为语音数据,输出为语音对应的文本。传统的语音识别系统对语音数据的处理分为多个阶段,首先从语音中提取一些人工设计的特征(如 MFCC),然后通过机器学习算法提取音素(Phoneme),接着将音素串连成单词,最后将单词串联成文本。

  对于端到端学习,解决上面的语音识别问题的方法是,使用大量的数据,训练一个非常大的神经网络,输入语音数据,直接输出文本,省去了传统语音识别系统中众多的中间步骤。

  端到端学习需要大量的数据才能发挥作用。例如有 3000 小时的语音数据用作训练,这些数据足够用于训练传统的语音识别系统,并获得很好地性能。而要让端到端学习发挥同样的性能,可能需要上万甚至上十万小时的语音数据用于训练。如果数据量适中,则可以混合使用端到端学习和传统的系统,例如使用端到端学习代替传统语音识别系统中的特征提取,然后接着使用传统系统提取音素、单词和文本。

  另一例子如人脸识别任务,输入为一张有人的图像,输出为图像中人的身份。此时直接使用端到端学习将输入图像映射到个人身份并不是很好地做法,因为取决于照片拍摄时人与摄像头的相对位置,人在图像中的位置和大小是很随机的。

  目前更好的实现方式是使用多个步骤,首先通过一套软件检测人脸的位置,提取出人脸的图像,使人脸位于图像中央,然后使用这张图像作为神经网络的输入,预测其身份。研究表明,此种实现方式具有更好的性能,其原因是,通过将人脸识别问题分解为两个步骤,不仅每个步骤要解决的问题更加简单,而且每个步骤都有更多的数据可供训练。我们可以收集到很多数据用于第一个步骤的人脸检测,也可以收集到很多数据用于第二个步骤的身份识别;但如果我们想要一步到位,直接识别图像中任意位置的人的身份,在这一个问题上可用的数据较少,不足以让端到端学习获得理想的性能。

  端到端学习可以简化学习系统的结构,不需要人工设计各个组件。但端到端学习也不是万能药,有时并不能带来理想的性能。

2. 端到端深度学习的使用场景

  端到端学习的优点有:

  • 让数据说话:使用大量数据训练的算法能够更好地发现数据中的统计特征,从而更好地习得从特征到标签的映射,避免引入人类的偏见。例如早期的语音识别系统中使用了“音素”作为语音的基本单位,音素可以看做是语言学家人工设计的一个特征,这在人看来是合理的,但对学习算法来说,我们并不一定要强迫算法学习音素的概念,只要让算法自己去从数据中学习它所需要的知识,最后得到的性能可能会更好。

  • 更少的人工设计的组件:端到端学习直接完成了从初始输入到预测的整个过程,不再需要人工设计系统中的各个组件和处理步骤。

  端到端学习的缺点有:

  • 可能需要非常大量的数据:端到端学习需要大量的数据,收集这些数据也有一定难度。如前面人脸识别的例子,很难收集到大量标记了身份的任意角度的人类照片用于完整的端到端学习,而到通过将人脸识别分解为人脸检测和身份识别两个步骤,每个步骤都属于相对成熟的领域,可以分别收集到大量的数据。

  • 排除了人工设计的潜在效用:端到端学习直接从数据中完成全部学习,不使用人工设计的组件,也就排除了人工设计所能带来的潜在收益。学习算法的知识主要有两个来源,其一是数据,其二是人工的设计(如人工选择的特征、处理步骤等)。如果数据不足,算法无法从数据中获得足够的知识,此时通过使用人工设计的组件,可以将人类的经验手工地注入到算法中。人工设计试一把双刃剑,合理的人工设计有助于算法的学习,但使用人工设计也会在一定程度上限制算法的更能。在数据量较少时,人工设计通常利大于弊。

  是否要使用端到端学习决定性因素是:是否有足够的数据,来习得从 x 到 y 的足够复杂的映射函数。这里的“足够复杂”并没有精准的定义,但从直觉上来看,例如对于前面人脸识别的例子,进行人脸检测,即从一张照片中找到人脸的位置并不是特别困难的问题,可能并不需要特别多的数据;而识别图片中任意位置的人脸的身份,比人脸检测要困难得多,需要更多的数据才有可能实现。

  举例来说,对于一个自动驾驶的应用,输入为汽车周围的图像,首先要通过图像检测周围的状况,如汽车、行人的位置等,然后据此决定形式路线,最后根据路线生成操作指令,控制汽车行驶。在这个系统中,可以使用深度学习实现对汽车和行人的检车,使用运动规划(Motion Planing)来决定路线,通过特定的控制算法生成汽车的操作指令。虽然使用端到端学习,直接输入图像并输出操作指令看上去很方便,但收集使用操作指令作为标签的图像数据并不容易,且目前神经网络的能力也难以解决如此复杂的问题,这里使用端到端学习并不合适。这个例子说明:

  • 使用深度学习实现独立的组件。
  • 监督学习输入和输出的映射关系的设计,取决于能够获取到的数据。