人常说脑子越用越活,这是因为大脑积累了很多的底层经验。比如你学会了C++,你学Java就会简单很多。这时因为很多底层的东西是相同的。你的大脑对C++已经训练过了。当你学习Java时,只需要改变其中一些不同的地方就可以了。大量的底层知识是相同的。这就是迁移学习(Transfer Learning)

Transfer Learning

我们发现在深度神经网络里,神经网络不同的层的激活函数对不同的feature所激活,越靠前的网络层越被一些低级别的feature所激活(线,边缘,形状),越靠后的层越是被一些复杂的feature所激活(形状的组合)。

网络的前边一些层学习了大量的关于低级特征,它们和具体的应用无关,你识别人脸需要这些被线和边缘,形状可以激活的层,你识别汽车照样需要。它们的区别只是在最后的高级别特征上。那么我们有没有可能重用前面的这些层呢?答案是可以!而且效果很好。
如果你已经有一个用1000万张图片训练的很好的对狗做出识别的深度神经网络,你现在想要对猫做出识别,并且你只有1万张关于猫的图片。你可以固定你的网络的除了最后一层的所有层的权重W和截距B的值,只去训练最后一层的w,b的值。这样你的网络得到的结果肯定比你只用这1万张猫的图片去构建一个深度神经网络好的多。如果你关于猫的图片更多一些,你可以训练倒数第1,2层。如果你需要训练人的识别,你可能要训练倒数5层。毕竟猫和狗更相近一些。
但是如果你有1000万张人的照片,你需要用识别狗的模型来进行迁移学习吗?答案是不需要,因为同等数量级的情况下,最好还是用实际业务数据去进行训练,毕竟实际业务数据更有价值。
那么什么时候我们需要考虑使用迁移学习呢:
1. 已经训练好的模型是通过大量数据训练得来,效果很好。
2. 新训练的模型数据量不足。
3. 他们的输入是相同的(比如都是图片)
4. 以训练好的模型的低层特征对新模型有帮助。

多任务学习

在计算机视觉物体检测里,经常用到多任务学习,也就是说一次学习可以检测多个目标,可以学习一副图片里是否包含桌子,人,电脑等,如果目标图片里有桌子和人,但是没有电脑,那么它的label是[1,1,0]。可以看到它有多个目标同时为1。这就是多目标学习。

多任务学习的loss function

多目标学习可以将每一个输出,比如桌子的输出,人的输出,电脑的输出看成一个独立的逻辑回归输出。独立应用逻辑回归的loss function。在之前我们写的手写数字识别里我们已经实现了这个loss function以及它的梯度下降。不过我们当时认为保证label只有一个是1,其余是0。

多任务学习还是多个单任务学习

如果你的输入数据是同一组,建议使用多任务学习,比如你又3000张图片,其中2000张包含电脑,2000张包含桌子…如果你用多个网络来进行单一任务学习,对于每个单独网络来说,对于数据的信息使用是不完全的,并且彼此要独立训练底层特征。一般情况下,当你的网络规模够大,进行多任务学习,比多个单一任务学习的精度要高。

端到端学习

端到端的含义是从输入到输出的意思。指的是我们这个网络直接可以从业务问题的输入,到业务问题的输出来进行学习。比如我们要进行语音识别,对我们的神经网络来说如果输入是音频,输出是文本。这就是一个业务问题的端到端的学习。但是还有一种学习方式,我们先把音频学习成一个个音素,然后由音素再学习到文字。这就不是一个端到端的学习,中间有一个人为的音素这个特征的干预。

如果数据量够大,网络足够深,理论上是可以达到端到端的学习的,而且表现比人为干预的效果更好,超过人类。但是现阶段还有很多业务问题是需要人为做一些干预,把人类一些认知告诉神经网络帮助他来学习的。相信随着深度学习的发展,会出现越来越多的端到端的学习的。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

%d 博主赞过: