作者:美丽联合集团 算法工程师 琦琦 ,公众号关注:诗品算法

阅读原文: https://zhuanlan.zhihu.com/p/234224652

楔子

你们的算法小可爱又来了!听大佬说,发个照骗可以增加曝光?害!

今天我们来聊聊有趣的表示学习。表示学习为何倍受关注?让我们来回顾一下机器学习的步骤,首先,从数据中提取特征, 特征的好坏决定了模型的上限,即,算法效果的好坏很大程度上取决于我们对特征的选择、设计和处理。

说个题外话,笔者在实践中深谙这一点,比如,前一段时间,我们组在做SDM长短期行为序建模的召回实验时,无论怎样调整模型结构,线上都无明显效果。我后来专门测试了召回所用的用户长短期行为序与精排所用序列的差异(召回与精排使用不同的方案构建行为序列),虽然序列的时间跨度不同,但也具有一定可比性。结论是,在模型结构和样本完全一致的情况下,仅仅将精排序列替换成长短期序列的任意一种或是两种的结合,离线AUC都有4%~6%的下降。结论是明确的,当时设计的长短期行为序列的质量远不如精排行为序的质量! 后续我们重新设计并构建了长短期序列,在SDM模型结构完全未变的情况下,点击率有5%的提升,停留时长有8%的提升。 后续我会抽空专门写一篇关于召回和序列构建经验的文章,大家可持续关注 !

跑题了,come back。说到特征, 如果有一类算法可以自动从数据中学习到“有用”的特征,并可以直接应用于后续的具体任务,我们就称之为“表示学习”。

这篇文章,我会对《deep learning》——花书中的第十五章——representation中的重点内容进行详述,并加入一些自己的理解和实践,希望大家读完有所收获。

希望大家记住下面这句话,我后面会另起一篇文章,专门跟大家聊聊表示学习在迁移学习中的应用。

共享表示有助于处理多模态,或是将已学到的知识迁移到样本很少或没有、但任务表示依然存在的任务上。

表示学习的意义

如何表示信息决定了信息处理任务的难易程度。更直观的,我们可以使用不同的表示,得到不同操作的量化时间。例如,向有序列表中插入一个数字,若数列表示为链表,那么需要O(n)的时间;如果该数列表示为红黑树,则只需O(logn)的时间。你还觉得表示学习不重要吗?一个好的表示可以使后续的学习任务更加容易。

我们可以将监督学习训练的前馈网络视为表示学习的一种形式。一般而言,神经网络的最后一层通常是线性分类器,如softmax多分类器或是sigmoid二分类器。网络的其余部分负责学习输入到该分类器的表示。使用监督学习训练模型,一般会使得模型的各个隐藏层(特别是top隐藏层)的表示能够帮助模型快速收敛。

表示学习的有趣之处在于,它提供了进行无监督和半监督学习的方法。当我们拥有海量的未标注数据,仅拥有少量的标注数据时(尤其在图像和NLP领域),在有限的标注数据集上进行模型训练,将导致严重的过拟合。而半监督学习恰好可以从未标注数据中学习到好的表示,从而大大缓解过拟合问题。另外,人类的大脑为何可以从非常少的标注样本中学习呢?据说,人类的大脑可以灵活运用无监督和半监督学习。

进入下面的段落之前,希望大家带着问题去阅读,我们可以问自己几个问题:

  1. 如何判断一个表示优于另一个表示?
  2. 端到端学习与表示学习的关系?
  3. 无监督学习在何时有效?为何有效?
  4. 有几种形式的表示?
  5. 如何去挖掘表示?
  6. 分布式表示的核心优势是什么?

好的表示

我们知道,在图像中,从神经网络的输入端到输出端,是一个信息愈发抽象的过程。输入到图像中的数据往往是一系列像素点,经过不断学习,可以得到一系列高层的抽象语义特征。输入层易被计算机理解,输出层易被人类理解,这即是语义鸿沟,也就是低层次特征与高层次语义特征之间的差异。

一个好的表示,应该尽可能描述一些高层次的抽象特征,以便后续模型可以高效地利用这些特征。因此,好的表示应该尽可能减小语义鸿沟,提供一些高层次的特征。

端到端学习 == 表示学习?

说到端到端,不得不提AlexNet,它并非以特征工程得到的特征作为输入,而是以原始图像作为输入,输出直接是预测的类别,这种学习方式称为端到端学习(end-to-end learning)。网络的前半部分主要完成特征的自动提取,即表示学习,而后将提取到的特征送入到分类器中进行分类。其实,端到端学习实际上就是表示学习与监督学习的组合,它们之间相辅相成、互相成就。它们是联合优化的。

无监督预训练

首先简要介绍贪心逐层无监督预训练。它依赖于单层表示学习算法,比如RBM、单层自编码器、稀疏编码模型或是学习其他表示的模型。每一层使用无监督预训练,接受上一层的输出,产生对数据的新表示。这种表示可以为深层网络找到一个好的初始值。

为何被称为预训练?因为它是在联合训练算法fine-tune所有层参数之前的第一步。而在监督学习任务中,它被认为是一种正则化以及参数初始化的方式。在一些实验中,预训练无法降低训练误差,但却可以降低预测误差。

一般而言,广义上的“预训练”不仅指代预训练本身,而是涵盖了预训练以及监督学习两阶段的学习过程。在监督训练过程中,我们很难判断预训练向量的哪些参数应该被保留,而且,为了使施加于输出端的约束从一开始就加入训练,在通常情况下,监督与无监督训练一般是同时进行的。

无监督学习何时有效?为何?

Ma et al.(2015)研究了预训练对机器学习模型在化学活性预测上的影响。结果表明,平均而言预训练是有轻微负面影响的,但对于某些问题却有显著帮助。**正是源于无监督学习偶尔正向经常负向的特点,了解其何时以及为何有效就至关重要了,这有助于我们判断无监督学习是否适用于某个特定任务。**deep learning这本书中,对无监督预训练的总结性概括如下(强烈建议大家阅读原文):

Unsupervised pretraining combines two different ideas. First, it makes use of the idea that the choice of initial parameters for a deep neural network can have a signficant regularizing effect on the model (and, to a lesser extent, that it can improve optimization). Second, it makes use of the more general idea that learning about the input distribution can help with learning about the mapping from inputs to outputs.

我们来对其进行解释。

  1. 第一个想法。在深度神经网络中,初始参数的选择会对模型结构产生正则化影响。曾经,在预训练比较流行时,对模型进行初始化,会令其逼近某个局部极小点而非另一个局部极小点。而现如今,局部极小的优化问题不再被认为是神经网络中的严重问题。
  2. 第二个想法。一个好的算法,可以充分利用无监督学习阶段学到的信息,并将其更好地应用于监督学习阶段中。

下面总结出无监督学习有效的场景:

  1. 若我们把无监督预训练看作是正则项,当标注样本非常少时,无监督学习会很有效果。
  2. 当我们要学习的函数极其复杂时,无监督预训练也能派上用场。 不同于weight decay这样的正则项,无监督学习并不是仅仅去寻找一个简单函数,而是去探索一个对于无监督学习有帮助的特征函数,也可以理解为:拟合输入分布。
  3. 预训练的网络越深,test error的均值和方差下降越多。但是,这些结论所依据的实验是在训练非常深层网络的现代方法流行(整流线性单元、Dropout、BN)之前进行的,而对于无监督预训练与当前方法的结合,我们知之甚少。

无监督学习为何有效:

无监督预训练可以将参数带到一个其他方法无法探索到的区域。神经网络训练过程有强烈不确定性,而且每次训练都会收敛到不同的函数。训练可能停止在梯度很小的点,也可能为防止过拟合而被提前终止训练,也有可能会停止在梯度很大、但由于诸如随机性或Hession矩阵病态条件等问题而难以找到合适下降方向的点。经过无监督预训练的神经网络将会一致性地停在一片相同的函数区域,而未经过无监督预训练的神经网络则会一致性地停在另一片相同的函数区域。如下图所示(摘自deep learning第15章15.1):

经过预训练网络到达的区域较小,表明预训练减少了估计过程中的方差,从而可以降低严重过拟合的风险。换言之,无监督预训练将神经网络参数初始化到一个它们不易逃逸的区域,和没有这种初始化相比,结果很差的可能性很低。

无监督学习的未来

现如今,大部分算法已经废弃了无监督预训练(sad,你是不是以为这篇文章白写了?nonono,且往下看)。但在自然语言处理领域中,单词使用one-hot向量的自然表示无法贡献相似度信息,并且有非常多的未标注数据集可用。在这种情况下,预训练可以发挥其优势,首先对一个巨大的未标注集合(eg,包含数十亿单词的语料库)进行预训练,学习良好的表示(通常是单词,但也可以是句子),然后使用该表示或对其fine-tune,使其适合于后续训练集样本大幅减少的监督任务。

基于监督学习的深度学习技术,通过Dropout或BN进行正则,能够在很多任务上达到人类级别的性能,但这些仅仅是在极大的标注数据集上。在中等大小的数据集(例如CIFAR-10和MNIST,每个类大约有5000个标注样本)上,这些监督技术的效果也领先无监督预训练。在极小的数据集,例如选择性剪接数据集,贝叶斯方法优于基于无监督预训练方法。由于这些原因,无监督预训练已经不如以前流行。然而,无监督预训练仍是深度学习研究历史上的一个重要里程碑,并将继续影响现代方法。预训练的想法已经推广到监督预训练(supervised pretraining),在迁移学习中继续发挥其优势。由于篇幅原因,在此不再赘述,后面会抽空写一篇关于迁移学习的。

离散表示与分布式表示(表示学习的灵魂)

one-hot

我们知道,对一个对象的表示有两种方式,最简单且无需学习的表示就是独热向量(one-hot)表示,这种向量只在某个维度上的值为1,其他维度上的值全为0。可以理解为,N个状态就要使用N个寄存器,并且在任意时候,只有一个状态有效。比如我们想用这种方式将每篇文章的词向量化,假设文档去重后的词有N个,每个词都需要一个N维的向量,那么我们需要N x N大小的矩阵才可以覆盖这些词。如果N很大的话,数据稀疏性和维度灾难就可想而知了。且one-hot表示未考虑句子中word的顺序性,也未考虑word的词频和在句中的重要性。虽然后续出现了TF-IDF以及n-gram等优秀算法,可以获取更加丰富的特征,提取了word之间的信息,考虑了word之间的先后顺序,但是数据稀疏、词表维度过高等问题仍未得到解决。

one-hot表示非常简单,只需要列出所有可能的值就可以得到,不需要学习过程。但是它的缺点也是非常明显的,在向量空间中,所有对象的向量都是相互正交的,因此任意两个one-hot向量之间的相似度都是相同的,使用one-hot表示的向量不涵盖很多信息。学成的word embeddings自然会用它们之间的距离来表示相似度。因此,无监督预训练在处理单词时尤其有用。但在处理图像时就显得力不从心了,可能是因为图像本身就处于一个丰富的向量空间内,距离仅能提供低质量的相似性度量。

如果有一个维度为N的字典,那么必然存在N个特征监测器,每个特征监测器负责一个类别。这种情况下,只有表示空间中有N个配置,才能在输入空间中刻画N个不同的区域。这就是one-hot表示的本质——相互排斥的N维二元向量,每个向量中只有一维是激活的。如下图所示(摘自deep learning第15章15.8):

非分布式表示的学习算法有:决策树、聚类算法、K-最近邻算法、基于n-gram的语言和翻译模型

分布式表示

分布式表示的强大之处在于,它可以使用n个特征的k个值,来描述k^n个不同的概念。比如,n维二元变量,有2^n种配置,每一种都对应于输入空间中的一个不同区域。一般来说,分布式表示可以比非分布式表示多分配指数级的区域。以下是基于分布式学习将输入空间分割成多个区域的直观图示(摘自deep learning第15章15.7):

太有趣了!划重点!—— 强大的表示层与弱分类器组合的方式,可以组成一个强大的正则器! 这全都源于, 强大的表示层可以对输入进行指数级的分割,这会给模型带来强大的泛化能力! 比如,试图学习“人”和“非人”的分类器,对于表示为“可爱的我”和“帅气的胡歌”的两个不同输入,不需要分为不同的类别,我们在同一类别里吼吼吼!

总结分布式表示的优势:

  1. 分布式表示具有丰富的相似性空间,语义上相近的概念(或输入)在距离上接近,这是符号表示所缺少的优势。
  2. O(nd)个参数(空间Rd中的n个线性阈值特征)完全可以表示输入空间中O(nd)个不同区域。
  3. 使用更少的参数表示模型,意味着我们需要拟合的参数量更少,因此只需要更少的训练样本就可以得到良好的泛化。

最后,表示学习将许多深度学习理念联系在了一起。前馈网络和循环网络,自编码器和深度概率模型都在学习和使用表示。

实践

最近,我们组在蘑菇街首页推荐召回的尝试中,使用deep模型进行训练。具体的,我们使用类似于DISAN结构的网络,训练出一组表达视频的embedding向量,计算视频embedding向量两两之间的相似度分数,按照分数进行截断和排序,得到每一个视频id对应的相似视频集合,依照这个集合去线上进行召回。

在一天内,多次训练同一份样本(非增量学习模式),且每次都加载上一次训练好的embedding向量进行训练,并非加载checkpoint,因此每次训练时,无需初始化embedding向量,只需初始化MLP中的参数。这是一种全新的尝试,一般来说,deep结构中,embedding参数最多且难收敛。我们发现,每次加载上一次训练好的embedding进行再次训练后,在同样的相似度阈值下,保留下来的视