上一篇文章介绍了迁移学习的基本概念,这篇文章其实是迁移学习初探的一个小尾巴。通常我们使用迁移学习,会首先寻找是否有类似的训练好的模型可用,但如果实在找不到可用的模型,又无足够的已标记数据可用,那么还有两种替代方法:无监督预训练和用辅助任务预训练。
无监督预训练
假设你需要完成一个复杂的任务,但是手头又没有足够的已标记好的数据,更不幸的是你又找不到训练好的类似功能的模型。这种情况下,首先应该试着收集更多的标记好的数据。但如果实在找不到更多数据了,就可以尝试使用无监督学习技术(见图2.5)。实际上,一般收集未标记的数据还是很容易的,但是要标记它们需要花大量的时间或者金钱。如果手头能够有大量未标记的数据,那么就可以尝试用这些数据来训练一个无监督的模型,比如自动编码器(autoencoder)或者生成对抗网络(GAN)。然后重用无监督模型的低层网络,在顶层加上针对你的任务的输出层,然后使用标记好的数据进行监督学习,以精调最终的模型。
Geoffrey Hinton和他的团队在2006年使用了这个技术,引领了神经网络的复兴和深度学习的成功。在2010年以前,无监督预训练(特别是使用RBMs的无监督学习)都甚至是训练深度网络的标配,直到梯度问题被很好地解决了之后(见我之前的文章),大家才普遍直接使用监督学习来训练深度神经网络。但是无监督预训练(现在基本上都是自动编码器或者GAN)在特定情况下仍然是个不错的选择,比如没有类似的模型可以用,标记好的训练数据很少,但是未标记的数据又特别多的时候。
在很久以前,人们很难用深度学习来训练一些很深的模型,所以大家会使用一种叫做贪婪逐层预训练的技术(见图2.5)。首先训练一个只有一层的无监督模型,一般是受限玻尔兹曼机(RBM)。然后将该层冻结,再在该层之上加另外一层,之后继续训练模型(实际上就是训练新的一层)。随后再加新层,再训练,如此往复。但是现在事情变得简单很多了,大家一般一次就训练好整个无监督模型(即图2.5中,直接从步骤3开始训练),并且将RBM替换为自动编码器或者GANs。
用辅助任务预训练
除上述无监督学习方法之外,还有一个选择就是用一个辅助任务来训练一个初始的神经网络。这辅助任务的特点,就是你可以很轻松地获取到,或者自己生成大量标记好的数据。然后再重用初始模型的低层,为你实际的任务服务。初始的神经网络的低层需要能够学习到一些对实际任务有用的特征探测能力。
比如说,如果你想搭建一个人脸识别的系统,但是只有想要识别的每个人的寥寥几张照片,根本无法训练出一个好的分类器。但是对于你想要识别的每个人,想要他们每个人都提供成百上千的照片又不现实。那么,你就可以尝试从网上收集任意路人的照片,然后训练出一个初始的模型。这里的辅助任务就是,检测两张照片里的人是不是同一个人。这样一个神经网络会学习到脸部的特征探测,那么重用这个模型的低层,就有助于训练出性能足够优秀的分类器。
在自然语言处理(NLP)中,你可以下载大量文字信息,并自动生成已标记的数据。比如说,你可以随机遮住文中的一些字词,然后训练一个模型用来预测被遮住的字词是什么(即,模型可以用来预测一句话中的字词应该是什么,比如“你刚__说什么?”下划线里的字很可能是“刚”或者“才”)。如果你的模型可以很好地预测被遮住的字词,那么这个模型就已经能够很好地处理语言问题了,那么就可以重用这个模型,然后针对已标记的数据和实际的任务进行精调。
上面提到的方法,也可以被称为自监督学习。自监督学习也就是从数据本身自动生成标记,然后使用生成的标记,通过监督学习的方法来训练模型。但是不管怎么说,这个方法都没有进行人工标记数据,所以还是将其归类为无监督学习的一种。