Py学习  »  机器学习算法

从Few-shot Learning再次认识机器学习

AINLP • 3 年前 • 453 次点击  

一定要看完,一定要看完,一定要看完,重要的事情说三遍!!!首先申明本人并不是在研究这个领域有着深入研究的“专家”,如果文中有讲解不对的地方,还请各位大佬留言批评指正。
当我看完 《Generalizing from a few examples: A survey on few-shot learning》 这篇文章的时候,我对于机器学习又有了一种新的认知,与其说它让我理解了什么是Few-shot learning,不如说它让我明白了如何更好地处理机器学习问题,不论是科研还是在实际应用当中(可以说是所有其它模型算法),都可以从文章指出的三个角度去考虑:数据、模型、算法。有人也许会说,是个人都知道从这三个角度去入手,问题是怎么样从这三个角度入手,依据是什么,做什么改进,文章对于少样本场景下解释的非常清晰,我认为思考问题的思维方式和角度很重要!!!


什么是Few-shot learning 
1)符号定义
给定一个任务  ,以及由训练集  (  的数量很少)和测试集  组成的数据集,  是数据的真实分布,而FSL就是要通过训练数据  去训练拟合出这个真实分布,也就是最优假设  。为了得到最优的假设  ,FSL定义了一个关于参数  的假设空间  ,即  ,这里使用参数化模型  ,因为非参数模型通常需要大量数据集,因此不适合FSL。FSL算法是一个最优化搜索策略算法,目的是在假设空间  中找到一个最接近  的假设  ,FSL的模型性能可以由损失函数来表示,在这里  是由你选择的模型和参数的初始化分布决定的,而  的寻找过程其实就是一个优化过程,而通常的优化方法就是梯度下降。
2)问题描述
前面描述的FSL过程本质上就是一个机器学习过程,那自然FSL符合机器学习的一些性质,我们先来看下关于机器学习任务的定义:
Machine Learning: 在经典的机器学习中,给定一个任务  ,任务的性能  ,给定一些额外的条件  ,可以提升任务  的性能  。举例:图像分类任务  ,Machine Learning通过对大量带有标注的图像进行训练得到  ,从而提高分类准确率  。Table 1 给出了一个图像分类和Alpha Go强化学习的例子:

Few-Shot LearningFSL是机器学习的一个特例,定义和Machine Learning一样,只不过它的目标是在  训练集只提供的少量监督样本信息(  )的情况下获得良好的学习性能。现有的FSL问题主要是监督学习问题,具体来说,few-shot分类法学习的是在只给出每个类仅有少量标签数据的情况下的分类器。Table 2 列举了三个不同的任务,具体任务可以查看相关文献,值得注意的是,Few-Shot Learning相比于一般的Machine Learning在条件  上除了是few data之外,还需要引入一些先验知识,自然而然,如何将先验知识嵌入进模型之中成了优化的关键。

注:当  中只有一个带有监督信息的例子时,FSL称为one-shot learning,当E不包含任何对目标 任务   有监督信息的例子时,FSL就成为zero-shot learning (ZSL),由于目标类不包含有监督信息的示例,所以ZSL要求  包含来自其他形式的信息(如属性、WordNet等),从而传递一些监督信息,使学习成为可能。


核 心 问 题 
我认为这篇综述最出彩的地方就在这里,文章从机器学习期望风险最小化的角度去思考问题,并尝试在少样本的情况下,如何降低这种风险,我们先来大致回顾一下期望风险。(以下分析适用于包括分类和回归在内的FSL监督学习,也可以为理解FSL强化学习提供见解。)
在机器学习中寻找最适合的假设时通常都是通过找到一组最优的参数来确定这个假设,并通过给定的训练集下期望风险最小化这一目标来指示最优参数的搜索,期望风险如下所示: 
其中  数据的真实分布,  为损失函数,但由于真实分布往往不太容易知道,因此我们常常用经验风险来代替期望风险,经验风险就是在训练集上预测的结果和真实结果的差异,也是我们常说的损失函数的期望,表达式如下:  因此,我们可以得到这样几个假设:
  •   是期望风险最小化的最优解,可以理解为百分百没有误差的解,不需要知道假设空间,同时已知所有的数据样本,显然,这个是办不到的。
  •   是在假设空间  下期望风险最小化的最优解。显然,这个解相对于  存在一定的误差。
  •   是在假设空间  下经验风险最小化的最优解。显然,这个解相对于  还存在一定的误差。
根据机器学习中的error分解可得: 等式右边第一项表示的是假设空间  中最优的假设和真实假设的误差,这一项其实由你所选择的模型和参数的初始化分布决定的(模型),这也就是为什么有的时候,模型选择的简单了,你给再多的数据也训练不好,欠拟合。第二项就是我们训练得到的假设和  中最优假设的误差,这项强调经验风险的重要性(数据、算法),但有时候会陷入局部最优,或者提供的训练数据分布有偏差,导致无法得到全局最优。也就是说,这里的error,是由我们定义的假设空间  和训练样本共同决定的,换一句话说,可以尝试从以下三个角度去减少误差:数据(一定量训练数据)模型(限定假设空间)算法(优化搜索,避免陷入局部最优)


  解 决 方 法 
一、Data
  1. 使用弱监督或者无监督的数据集

    使用一些无监督或者弱监督的数据集,并在few data上training过的模型(比如SVM等简单的分类模型)进行预测,形成“有监督”的数据集,以此来扩充数据集。

  2. 对原始数据集进行数据增强

    使用一些数据增强的手段,对数据进行扩增,比如图像的几何变换或者其它一些数据转换的方式用于数据增强等等。

  3. 增加一些相似的数据集(比如数据聚合生成

    该策略通过从相似但数量较大的数据集中聚合和调整输入-输出对来扩充数据集。聚合权值通常基于样本之间的某种相似性度量。


二、Model
        在FSL问题上,如果假设空间太大,很难找到最优的  ,因此需要通过一些先验知识将这个空间中无效的hypothesis去掉,缩小假设空间,比如一开始给一个小的模型,这个模型空间离真实假设太远了,而你给一个大的模型空间,它离真实假设近的概率比较大,然后通过先验知识去掉那些离真实假设远的假设,那如何将先验知识嵌入到模型当中去成了问题的关键,Table 4 展示了四种嵌入先验知识的方法。

     1. 多任务学习(Multitask learning)
多任务学习方法的主要作用是通过多任务模型参数共享的方式,压缩在few-shot task任务上模型的假设空间,主要的做法有Parameter SharingParameter Tying两种方式。
  •  Parameter Sharing(可以是数据相同任务不同,也可以是数据和任务都不同,但是数据具有领域性等等)

    例如利用同领 内的其它数据做task(通常这些数据会比较多),在做Multitask learning的时候,不同task之间共享相关层的参数,而在task-specific层和classification层对于特定的任务不做共享,这样做就能利用先验知识缩小假设空间。

  • Parameter Tying

       参数绑定是指不同任务之间的参数具有相似性,而不是共享,这种相似性可以通过两两间参数正则的方式加以保证,如下图所示,通过保证  、  、  之间相似,从而将task2和task3的先验知识嵌入到task1中,缩小task 1模型的假设空间。

    2. Embedding Learning
      Embedding Learning主要是将原始数据压缩至一个更小的低维空间,以此换来一个更小的解空间。所以Embedding Learning方法的关键在于如何构建一个数据集的Embedding低维空间,主要有以下三种方法。
  • Task-Specific Embedding Model

       Task-Specific Embedding Model是只在few shot任务数据上进行训练,训练时通过组合的方式构造不同的成对样本,输入网络训练,在上层网络通过计算样本对的距离判断是否属于同一类,并生成对应的概率分布,测试时,网络处理Query set和Support set集之间的每一个样本对,最终预测结果为Support set上预测概率最高的类别。代表网络是siamese network(说明:如果我们将一个测试集看做是一个task,而这个task中有训练集和测试集,这个时候的练集和测试集分别是Support set和Query set)。
  • Task-Invariant Embedding Model

Task-Invariant Embedding Model则是先在大规模相似数据集中学习一个通用的embeddingfunction,然后在测试的时候直接用于当前任务的训练集(few shot training set)和测试集(test example set)嵌入,并做相似性判别。代表网络有Match network。

  • Hybrid Embedding Model

       尽管Task-Invariant Embedding Model可以应用于新任务,且计算成本较低,但它们不利用当前任务的特定知识,并且当特定任务的样本非常少的时候,只利用Task-Invariant Embedding不太合适。为了缓解这个问题,混合嵌入模型(Hybrid Embedding Model)通过  中的特定于任务的信息来适应从先验知识中学到的通用Task-Invariant Embedding Model,并通过学习将  中提取的信息作为输入并返回一个embedding来作为embedding function f函数的参数。

    3. Learning with External Memory
        Learning with External Memory是从训练样本  中提取知识,并存储在外记忆中(在这里就是在一个用大量类似的数据训练的具有外部存储机制的网络上,用具体task的样本来更新外部记忆库)。每个新的样本  ,用从内存中提取的内容进行加权平均表示,然后将其用作简单分类器(例如softmax函数)的输入进行预测。这就限制了  只能用内存中的内容来表示,因此从本质上减少了假设空间的大小。由于每个  都被定义为从内存中提取的值的加权平均值,因此内存中key-value对的质量很重要。

    4. Generative Modeling
       生成式建模方法利用先验知识估计观测样本的概率分布  ,可以生成新的数据。这个类中的方法可以处理许多任务,例如生成、识别、重构和图像翻转。

三、算法
在机器学习中我们通常使用SGD以及它的变体,如ADAM,RMSProp等来更新参数,寻找最优的参数,对应到假设空间中最优的假设。这种方式在有大量的数据集的情况下可以用来慢慢迭代更新寻找最优参数,但是在FSL任务中,样本数量很少,这种方法就失效了。
假如模型能根据先验知识初始化模型参数,这样在算法优化或许只需要在少量数据集的情况下就能找到最优解,下面提供三种初始化模型参数的方法。
    1. 提供预训练初始化参数
该方法大家都比较熟悉,最常见的就是引入pretrain model,然后在新的task上进行fine-tune。
     2. 基于meta learning的方式更新参数
关于meta-learning,和我们比较熟悉的machine learning相比,通常machine learning是根据训练数据,让机器学习到一个功能函数  的能力(比如分类器),而meta-learning则是根据训练数据,让机器训练出一个能找一个功能函数  的函数  的能力,即learn to learn,这里借用李宏毅老师授课内容。
通常情况,machine learning我们只需要准备好某个任务的训练集和测试集就可以,meta-learning我们也需要准备一个训练集和测试集,但是这里的训练集和测试集都是由一个个的task组成,且每个task都有各自的训练集(Support set)和测试集(Query set),因为machine learning的目的是让机器学习学习的能力,因此我们的测试集应该是一个新的task,而这个task需要机器能自动的去学习出一个功能函数function,以适应具体任务的需要。
那在这里,怎么将meta learning和few shot learning联系起来呢?
few shot learning需要将先验知识嵌入进模型中去,使得最优化算法在搜索的时候,能缩小搜索空间,或者是达到快速搜索的目的,这就需要模型能有一个较好的初始化参数,而这个较好的初始化参数就是需要通过meta learning的方式训练得到。这里简单介绍一下machine learning领域内的经典模型:MAML。该模型利用meta learning学习一个好的初始化参数,之后在新的任务上,只要对这个初始化参数少量迭代更新就能很好的适应新的任务。
      假设模型的初始化参数为  ,  表示模型基于task n(  )已完成一轮梯度更新的参数,  取决于  ,  是模型在task n测试集上的损失,于是有了总的损失函数: 基于该损失函数,我们对模型进行梯度更新:  

      为了更清晰的表示训练流程,这里我展示一下李宏毅老师关于meta learning的讲解示意图。需要说明的是,这一步通常是先遍历每个task,求出每个task下的梯度并缓存起来,最后更新整个初始化参数  ,这里的  和  是同一个模型下的参数,表示不一样是为了区分前者是初始化参数(也是我们真正最后想要的)和不同任务下的模型的更新参数,这里的  是模型在task n上已经训练过并更新之后的参数,区别于  ,所以用了不同的符号,再讲的明白一些就是,MAML模型并不在意更新后的模型参数  在各个训练任务上的表现,更多的是在意由更新后的模型参数  在各个task n上训练出来的  的表现,如果它们都能比较好的收敛到最优值,那这个  就是我们想要训练得到的模型参数,也就是说MAML更关注模型的训练“潜力”,而 Model pretraining则更关注模型参数在现有task上的表现。
      我们回头再来看few shot learning,few shot learning是在小样本训练集上训练一个最优的模型,如果我们先用meta learning的方式在不同的相似task任务上对模型进行training,以此获得一个较优的初始化参数  ,这样就能在new task少量样本的情况下,只需进行少许的迭代更新就能收敛到局部最优解。
    3. 学习出好的搜索优化器
前一节使用meta learning来获得一个较好的初始化参数,而本节旨在用meta learning来学习一个参数更新的策略。通常情况下,梯度更新方式为 也就是说学习率是人为设定的,参数优化的方式基本是固定的,基于meta learning的优化器则是用一个可学习的梯度更新规则,替代手工设计的梯度更新规则 这里的  代表其梯度更新规则函数,通过参数  来确定,其输出为目标函数   当前迭代的更新梯度值,  函数在这里使用RNN来实现,因为RNN具有时序记忆功能,而梯度迭代的过程中正好是一个时序操作。当我们学习好了这样一个RNN的策略模型之后(这里亦是通过先验知识优化了参数搜索空间),后期在更新参数时就可以直接使用这个策略在few-shot任务上进行参数更新了。如下图所示,图中的Optimizee是模型参数  的更新过程,Optimizer是优化器参数的更新过程,m则代表meta-learner,m的学习方式和meta learning一样,每一个t时刻在更新是都会先遍历所训练集中的task,求出每个任务下损失和,然后再更新t时刻的梯度,这里的t是迭代的次数。(此处本人尚未看过源码,如有理解不对,欢迎大佬们指正)


 总 结 
       文章在少样本情况下,对于如何利用先验知识,找到假设空间中的最优解,训练出一个好的模型的方法描述的很清楚、很清晰,是值得反复品味的综述性好文。文章根据机器学习误差理论,先后从数据、模型、算法三个角度进行不同层次的先验知识嵌入,总体上来说就是如何利用相似且较大的数据集,如何初始化一个好的模型参数,以及如何找到一个好的优化策略不光是在few shot learning 领域内可以这样思考,其实我们在实际科研和工作中遇到类似的问题,也可以从这三个方面去考虑,就拿我们非常熟悉的BERT预训练语言模型,难道不就是这个道理吗?

参考文献
[1] Wang, Yaqing, et al. "Generalizing from a few examples: A survey on few-shot learning." ACM Computing Surveys (CSUR) 53.3 (2020): 1-34.
[2] https://www.cnblogs.com/jiangxinyang/p/12163215.html FSL(小样本学习)综述
[3] Finn C, Abbeel P, Levine S. Model-agnostic meta-learning for fast adaptation of deep networks[C]//International Conference on Machine Learning. PMLR, 2017: 1126-1135.
[4] Andrychowicz, Marcin, et al. "Learning to learn by gradient descent by gradient descent." arXiv preprint arXiv:1606.04474 (2016).

[5] https://blog.csdn.net/senius/article/details/84483329 Learning to learn by gradient descent by gradient descent - PyTorch实践



由于微信平台算法改版,公号内容将不再以时间排序展示,如果大家想第一时间看到我们的推送,强烈建议星标我们和给我们多点点【在看】。星标具体步骤为:

(1)点击页面最上方"AINLP",进入公众号主页。

(2)点击右上角的小点点,在弹出页面点击“设为星标”,就可以啦。

感谢支持,比心

欢迎加入AINLP技术交流群
进群请添加AINLP小助手微信 AINLPer(id: ainlper),备注NLP技术交流

推荐阅读

这个NLP工具,玩得根本停不下来

完结撒花!李宏毅老师深度学习与人类语言处理课程视频及课件(附下载)

从数据到模型,你可能需要1篇详实的pytorch踩坑指南

如何让Bert在finetune小数据集时更“稳”一点

模型压缩实践系列之——bert-of-theseus,一个非常亲民的bert压缩方法

文本自动摘要任务的“不完全”心得总结番外篇——submodular函数优化

Node2Vec 论文+代码笔记

模型压缩实践收尾篇——模型蒸馏以及其他一些技巧实践小结

中文命名实体识别工具(NER)哪家强?

学自然语言处理,其实更应该学好英语

斯坦福大学NLP组Python深度学习自然语言处理工具Stanza试用

关于AINLP

AINLP 是一个有趣有AI的自然语言处理社区,专注于 AI、NLP、机器学习、深度学习、推荐算法等相关技术的分享,主题包括文本摘要、智能问答、聊天机器人、机器翻译、自动生成、知识图谱、预训练模型、推荐系统、计算广告、招聘信息、求职经验分享等,欢迎关注!加技术交流群请添加AINLPer(id:ainlper),备注工作/研究方向+加群目的。


阅读至此了,分享、点赞、在看三选一吧🙏

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/110211
 
453 次点击