target data量很少而source data很多,这种叫做one-shot learning单样本学习,这样的task最典型的例子的是speaker adaption。这种方法遇到的挑战是target data可能很少很少,会导致模型过拟合overfitting。
conservative training:对上述情况还有一个技巧是保守训练,即如果有大量source data要拿来做神经网络,如果目的数据集过少直接训练则会使模型坏掉,我们可以在训练的时候加一些constraint(regularization),让新模型跟旧模型不会差太多,希望两者的L2-Norm差距越小越好。(正则化防止过拟合)
layer transfer:还有一种方法使层迁移。先用source data训练好一个模型,然后把该模型的几层拿出来拷贝到新模型里面,然后再用target data去训练剩下的没有拷贝的层,这样的好处使目的数据集只需要考虑很少的参数,这可以避免过拟合的情况(数据集少模型复杂,降低模型复杂度)。(如果目的集足够多了还是需要用Model Fine模型微调)
哪些层应该被迁移 - 不同的任务需要被迁移的层往往是不一样的,在语音识别上通常是迁移最后几层训练前面层,在图片识别上通常是迁移前面层训练最后几层,根据模型对应层做的工作决定。
多任务学习:多任务学习跟fine tuning不同,fine tuning只关注目的数据集的表现,而多任务学习是需要同时关注两者的共同表现。深度学习特别适合来做多任务学习,因为这样的好处是taskA和taskB在前面几层是可以公用的,这样会有比较多的数据都得到比较好的性能(前提是有没有共通性)、
还有一种是当input没办法确定时,不同task的输出都用不同的神经网络迁移到同一个维度上,然后在中间如果可以有共享的层就共同经过,再应用不同的网络分开。
eg. 多语言的语音识别,输入不同的语言,前面层共享参数,后面层各不同参数;中翻英,中翻日也同样是可以贡献前面层不同后面层。
迁移学习的负面效果是有可能的,数据任务间能不能迁移取决于task与data的相似程度。
progressive neural networks:对于迁移学习的判断很浪费时间,这就是出现了渐近神经网络。意思是先训练好taskA,之后固定住其参数训练taskB,对B而言每层都会接受taskA某层的参数,对taskC同理。这样的好处是后者不会影响前者,后者借用前者参数的同时可以改变参数(相当于副本),这样也不会影响自身性能。
假设目的数据集是unlabel,而source data是label的:
一般来说如果两者数据集相近相同task通常来说是把source data视作training data,target data视作testing data。这样产生的问题是训练集和测试集是非常不匹配的。
因为神经网络前面层一般当作是特征提取,后面层当作分类;当训练集结束后输入测试集,由于不同domain data领域数据特征完全不同,所以不能够直接这样做(也相当于是说两边的数据集不属于同一分布,这样的话测试结果肯定是不合理的)。
Domain-adversarial training:我们希望模型能够把domain领域特性去除,因此我们使用领域对抗训练,也就要让特征提取把不同领域的混在一起而不单独列出。意思是它相当于把模型分为了三部分,特征提取 + 领域分类 + 预测器。着重是前两部分。前两部分类似于GAN中的编码器与解码器,而label predictor预测器与领域分类器并列接受特征提取的输出。
相当于就是说特征提取的输出要骗过领域分类器,并且要让label predictor结果很好。特征提取器想要骗过领域分类器只需要加一个gradient reversal layer梯度反转层即可,也就在做反向传播的时候特征提取器把反向接受领域分类器的值乘上负号(也就是领域分类器告诉你要怎么做你就偏偏反着做)
如今对于该方法的问题就在于领域分类器使用什么方法来鉴别得到的特征是属于哪个领域(一些比较新的paper在做这样的事)
zero-shot-learning:对比领域对抗训练,零样本学习定义更加苛刻,它可适用于目的数据集与其他数据集的task是不一样的。(刚才任务都是分类0-9)。(零样本意思是没有目标训练集)
零样本学习需要的是一个背后数据库,里面会有所有训练集测试集可能出现的class和它对应模型的输出(键值对,相当于说输出后去数据库查),训练集学习模型后输出的不直接是class而是属性(比如音标,比如动物属性,植物属性),这样即使测试集里面有未知的也可以通过输出的属性去数据库中查找(最接近)。