在这篇文章中,我将讨论两个关于迁移学习的应用:NLP(自然语言处理)和CV(计算机视觉)。并且我会分别在这两个领域提供一个范例。
NLP 现在很多NLP管道都在使用词嵌入(word embedding)。与独热编码相比,这些单词的嵌入是一种更丰富的表示单词的方式。它们被广泛使用,并且存在着不同的变体。通常,这些变体在其起源的语料库中有所不同,例如维基百科、新闻文章等,以及嵌入的模型也有所不同。了解这些模型和语料库的背景知识是很重要的,从而可以了解是否使用词嵌入学习是明智的。人们通常不会使用“嵌入式”迁移学习,但我不同意,因为这与计算机视觉上的转移学习有相似之处。从本质上说,使用词嵌入意味着你在使用一个特征或者嵌入网络来将文字转换成信息载体。
在NLP中,有不同的方法来表示单词(在左边是一个词嵌入的表示,在右边是一个弓形的表示)。使用词嵌入机器学习模型可以利用存在于不同词汇之间的关系。
尽管word2vec已经4岁了,但它仍然是一个非常有影响力的词嵌入方法。最近的另一种方法,如FastText,已经使许多语言中可以使用词嵌入了。与词袋(bag-of-words:是个在自然语言处理和信息检索(IR)下被简化的表达模型。此模型下,像是句子或是文件这样的文字可以用一个袋子装着这些词的方式表现,这种表现方式不考虑文法以及词的顺序。)方法相比,从word2vec或FastText中获得的嵌入是一个重要的进步。然而,它们的有效性通常由问题的领域来决定。
想象一下,你正在为销售人员建立一个新闻推荐服务。销售人员想要接收那些可能对他们正在销售的产品感兴趣的公司的新闻。在新闻文章中使用的词汇一般是相当通用的,这意味着使用了大多数词嵌入所支持的词汇表(取决于它们所接受的语料库)。此外,如果你有销售人员收集的他们阅读了几周的新闻文章,那么你马上就会有一个很大的标记语料库。通过重用词嵌入,推荐引擎可能比简单的弓形模型表现要好得多。
另一方面,假设你必须在法律合同上执行主题分类。不只是任何形式的法律合同,而是在竞争法环境下的一种法国的法律合同。这些类型的数据集通常不被标记,或者只有一组有限的标记文档可用。下一节将描述为什么开箱即用(out of the box)的迁移学习会让你在这种情况下获得如此大的帮助:
- 词汇表外的(OOV)单词是在训练中没有出现的单词。虽然word2vec和FastText都是在维基百科或其他语料库上经过训练的,但能使用的词汇量是有限的。在训练中,没有经常过出现的单词总是会被遗漏。这意味着,不支持在竞争法里的法律合同中特定领域的单词。当使用预先训练过的词嵌入时,通常会检查OOV单词并将它们替换为“未知单词令牌”(UNK token),并且所有这些单词都被赋予相同的向量。如果语料库是特定领域的,那么前面所说的内容就会变得无效的,因为领域特定的词通常具有很多意义。如果大部分的(带有含义的)单词被未知单词令牌所取代,那么这个模型将无法学到很多东西。
- 一种替代标准的预先训练的词嵌入的方法是对一组无监督的文档的嵌入进行调整。注意,如果有大量的文档可用,那么这只是一个选项。这意味着如果你有一个关于竞争法的大型语料库,你就可以为特定领域的词汇训练词嵌入,从预先训练的词嵌入到另一个更普通的词。通常,开始接受预先训练的词嵌入将加速整个过程,并使训练你自己的词嵌入变得更容易。要注意的是,使用开箱即用的词嵌入的方法仍然更加困难,并且需要一些关于如何准备语料库的知识。
本文中提到的问题和解决方案是在处理有限数量的数据时创建鲁棒性的NLP系统和词嵌入的关键。
Gensim、Spacy和FastText是三个很棒的框架,可以让你快速地在机器学习应用中使用词嵌入。此外,它们还支持对自定义词嵌入的训练。
- Gensim教程:https://radimrehurek.com/gensim/tut1.html
- Spacy教程:https://spacy.io/usage/vectors-similarity#section-custom
- FastText教程:https://github.com/facebookresearch/fastText#obtaining-word-vectors-for-out-of-vocabulary-words
在CV中的迁移学习 深度学习方法在计算机视觉方面取得了巨大的成功。你不需要手动定义问题特定的特征,例如,方向梯度直方图(HoG)特征、颜色特征等等,深度学习可以让从业者训练那些将原始图像作为输入的模型。
根据问题的类型,需要定义不同类型的HoG特征。这是一种可以用于计算机视觉的视觉特征。请注意与下面提到的卷积网络所提取的特征的相似性。
特征定义的最初复杂性现在已经转向定义网络的复杂性。虽然体系结构经常被重用,但是在构成网络体系结构中没有单一的策略。通常,深度学习技术已经被发明并应用于大型数据集(如ImageNet或MS Coco)的研究设置。为了提高这些大型数据集的性能,研究人员发现了网络架构的深度和复杂性。这些架构导致了数百万个参数(通常)不能扩展到小的图像数据集的模型。在不超过5000张图片的数据集上训练诸如ResNet或VGG net这样的架构,只会导致明显的过度拟合。最近的深度学习趋势已经取得了显著的进步,但似乎只有使用少量数据集的数据科学家被冷落了。
- ImageNet数据集:http://www.image-net.org/
- MS Coco数据集:http://cocodataset.org/#home
事实证明,深度学习网络可以学习分层的特征表示(请参阅下面链接中的文章)。这意味着较低层次的层可以学习较低层次的特征,例如边缘(edges),而较高层次的层则学习更高的层次,但是无法解释概念,例如形状(shapes)。当网络在不同的数据集上进行训练时,也会出现分层特征表示的思想,这表明它们可以在不同的问题领域中重用。
- 文章:https://distill.pub/2017/feature-visualization/
能够区分图像中的边缘线条和形状(左)可以更容易地判断出什么是“汽车”。迁移学习允许你利用其他计算机视觉模型中的学习模式。
在计算机视觉问题上使用迁移学习时,使用两种方法。
- 首先,如果有相当数量的图片(每个类有大于1000张图像)可用,你可以初始化一个新的模型,该模型的权重是在一个不同的数据集上训练的。在训练期间,你将保持许多固定层(通常是第一个卷积层),并优化高级层的参数。目标是减少需要优化的参数的数量,同时重用较低层次的层。无论问题的领域是什么,较低层次的层都很可能是相似的,并且针对问题模型必须自由地将更高层次的层组合在一起。
- 其次,如果只有少量的图片可用(小于1000张),那么对现有模型进行再训练很可能在大多数情况下仍然会导致过度使用。需要优化的参数数量对于图像的数量来说太大了。无论如何,只要数据与大型数据集中的图像相似,就可以使用一个大型的预先训练过的网络(在大型数据集上进行训练)。更具体地说,你删除了大型网络的最后N个层(通常是N=1或N=2),并使用大型预先训练网络的输出作为图像的特征表示。这是基于预先训练的网络中的第一个层学习问题独立特征的假设。这些特征可以用于支持SVM(支持向量机)或逻辑回归,类似于传统的计算机视觉方法。然而,并不是必须手动定义这些特征,而是将预先训练的网络作为一个特征。
Keras的API允许你加载预先训练的网络,并在训练期间保持几个层的固定。在下一节中,我将再次讨论两个用例,分别是迁移学习是有用的,而另一个则是没有用的。
- Keras的API:https://keras.io/visualization/
想象一下你在野生动物保护场所工作,你想要对出现在摄像机中的不同动物进行分类。特别是那些濒临灭绝的物种,你可能无法收集到大量的标记数据。考虑到预先训练的网络通常都是在广泛的概念领域进行训练(从食物,到动物和物体),使用预先训练的网络作为一个特征者,或者作为初始化者绝对是一种选择。
另一方面,想象一下你需要分析肿瘤专家的放射图像。这些图像不是典型的猫或狗这样的图像,因为它们是对病人进行扫描的输出。这些图像虽然被转换为RGB图像,但通常是在灰度图中显示扫描结果。尽管预先训练过的网络能够探测到RGB图像的形状和边缘,但它们很可能难以在X光图像上发现这些图像,因为这些图像不在预先训练的训练数据中。此外,在医学场景中,标记数据的数量通常很低。有几种技术可以利用(潜在的)未标记的数据,但是它们通常需要更多的工作。通常,这些技术试图通过迭代训练每一层来重构图像(使用卷积和解卷层)来预先训练分类网络的权重。这些技术和预先训练的网络的组合常常被用来提高收敛性。
上面提到的计算机视觉的两种方法都依赖于一个重要的假设:原始数据集中提取的模式在新数据集中是有用的。这种有效性很难量化,但它是一个重要的假设。地震、高光谱、甚至医学图像都与ImageNet中的图像相似。然而,理解计算机视觉问题领域是成功应用计算机视觉的关键。通过了解在迁移学习中使用的模型(数据集、技术等)的背景,你可以避免在实验期间浪费时间,并集中调整那些可能造成差异的模型。