元学习(Meta-Learning)简介
元学习是机器学习的通用方法
元学习不是为了完美地解决问题,而是寻求方法提高学习能力的过程。从认知科学的角度来看,这很有吸引力:人类不需要学习深度网络中的那么多示例就能理解一种模型。如果我们有强烈的自我意识和意愿达到某个目标,我们通常可以更快地掌握新的技能和习惯。
精度更高,示例更少
在常规深度学习中,为学习特定任务的最佳参数,我们在训练示例时应用了梯度下降法(例如将动物的照片分到5种可能的物种中的其中一种)。在元学习中,任务本身成为一个训练示例:为学习特定问题类型的最佳参数,我们在许多任务中应用了学习算法(例如,将照片分为N类)。在ICML 2017的用于深度网络快速适应的模型无关元学习算法》(Model-Agnostic Meta-Learning for Fast Adaptation of Deep Networks ) 中,元学习算法优雅地进行梯度下降,它适用于本身经过梯度下降训练的任何内部模型类型(从而实现“模型无关(Model-Agnostic) ”)。Finn、Abbeel和Levine将其应用于分类、回归和强化学习问题,并调整了元模型(外部模型),该模型只需几个示例即可快速学习(1-10个梯度更新)新任务(每类1-5个,共2-20个类)。这在实践中的效果如何,我们如何才能最好地将元模型应用于新数据集?
Mini-ImageNet(MIN)上的小样本分类
在本报告中,我将重点放在针对少数照片图像分类的MAML上,并利用了论文的原始代码。以下是mini-ImageNet(MIN)数据集中的一些示例,包括我对标签的猜测(实际上标签类别可能更具体或更一般化普遍)。这很好地代表了ImageNet:目标对象的图像和视图的多样性、目标大多处在图像中心、严格的但并不总是直观的定义(例如、wolf和bird类可以更狭义地针对特定物种) 。
N-way、 K-shot图像分类
MAML论文中提到:“根据传统术语,K-shot分类任务使用每个类的K个输入/输出对,总共NK个数据点以进行N-way向分类。”
以下是给定的代码中的相关设置(参数标志):
num_classes
: N,与N-way分类一样,是我们在每个任务中学习的不同图像类别的数量update_batch_size
: K,如在K-shot学习中一样,是每个类在特定任务模型上更新内部梯度的示例数
因此,5-way、 1-shot MIN会从5个类别的每一个类别中考虑1个标记的图像(总共5张图像)。 5-way、 5-shot MIN会考虑5类中每类的5个标记图像(总共25张图像)。下面显示了一些示例场景。请注意,在给定的N-way任务中类别的多样性会变化:不同品种但长相相似的狗或用来表示“口红”的视图的学习难度可能会更高。
训练动态的其他重要标志
meta_batch_size
是在更新外部模型/元训练循环的元参数之前采样的任务数num_updates
是我们在训练期间更新内部梯度/内部模型的次数metatrain_iterations
是模型看到的示例任务的总数。该代码建议MIN至少为60,000;出于效率考虑我最终改为默认的15,000- 将有效批次大小设置为8(而不是16)可以有相似的表现并且训练更快、 同时提高训练速度
初步观察
在这里,我将不同的元学习运行(K = 1,即每个类别1个示例)进行了比较——不同类别数(num_classes
)、内部梯度更新数(num_updates
)、有效批量大小和学习的过滤器数。所有图表均以平滑度0.8表示。
-
超过5的内部梯度更新次数几乎没有影响::直观地讲,可以区分的类别越少,模型的性能越好。您可以看到,在所有图表中,红色(2-way)的准确性高于橙色(3-way)的准确性,而后者高于蓝色(5-way)。
-
有效批次大小越小,训练速度越快,且表现只稍差一些:在第10个step的更新后精度与step为5时相比变化不大(请参阅右图第一行,其中step 5和step 10的标记曲线几乎完全重叠)
-
较低的有效批次大小会训练得更快,且表现只稍差一些:原始代码神秘地将批次大小增加了15。取消此设置并将有效批大小设置为4只会稍微降低性能,并且似乎与K更加一致。按照元学习的传统定义,有效批大小应该为N K,而不是N(K + 15)。
-
过滤器数量加倍会稍微提高性能:这与预期的一样,具有更高的学习能力;比较具有64个过滤器(后缀“ fs64”)的中蓝色运行与具有32个过滤器的浅蓝色和深蓝色运行进行比较
使用三个repo和一个gist
-
原始repo 笔记指出、mini-ImageNet数据集可从Ravi&Larochelle '17获得,该数据集对应于ICLR 2017上的论文小样本学习模型的优化( Optimization as a Model for Few-Shot Learning)、以及train/val/test图像的典型csv拆分。
-
此repo将小样本分类扩展到无标签示例学习,以及含干扰(事先未知)类别的更具挑战性的任务半监督小样本分类元学习(Meta-Learning for Semi-Supervised Few-Shot Classification), Ren et al, ICLR 2018)。
- 我写这个gist是为了提取图像并进行处理,以在MAML中进行训练。它极大地加快了我的数据提取过程、因为它将每个图像文件直接保存到正确的位置、而不是使用Python os.system(“ mv ...”)命令移动文件。
训练数据设置
对于mini-ImageNet(MIN)、数据分为训练(64个类)、验证(16个类)和测试(20个类)。每个类别包含600张图像、每张图像84 x 84像素。Main repo中的data_generator.py
会随机选择类,并根据模式(训练、评估或测试)从正确的划分中随机选择每个类的正确数量的样本(在K-shot学习中为K)。一个令人困惑的细节是、在生成训练数据时,源代码将内部批处理大小K增加了15、这可能会影响图像混合的正确性。我训练了一些包含或不含此修改的模型,以试图孤立其影响和必要性。
接下来的实验
- 固定N,改变K:这如何影响准确性?
- 在omniglot上进行训练:在字符分类和自然图像方面、动态有何相同/不同?
- 混合回归和分类以及潜在的RL:我们可以在Omniglot上进行训练,在MIN上进行微调,或者反过来吗?是否有一个可以学习所有三种问题类型的通用模型?
- 元训练超参数:我还没有探索过元训练循环的许多超参数
- 基于元训练更新数量的测试和元测试准确性::探索这些受过训练的模型的测试准确性和元测试准确性——它与元精度之间有何关系?元训练更新的数量会有什么影响?为了在全新的图像数据集上获得最佳结果,请选择具有最高Metatest准确性的模型。
- 更新前和更新后的动态:我们如何直观地了解更新前的指标?元训练更新步骤的数量有多重要(改变meta_batch_size)?比较更新之间的损失变化是否有意义?
- 内部梯度动态:为什么内部验证在许多情况下会接近随机?为什么损后均值要高于损前均值?
注意要点
- 一些训练配置达到内存限制:例如、10-way、 10 shot分类错误如下:
File "/home/stacey/.pyenv/versions/mm/lib/python3.7/site-packages/tensorflow/python/framework/ops.py", line 1950, in __init__
"Cannot create a tensor proto whose content is larger than 2GB.")
- K的默认值为5,它似乎控制着内部循环中每个类的update_batch_size /示例数。但是,原始代码在这基础上增加了15,用于生成MIN数据,根据注释/ TODO的说法,该代码可能“为imagenet使用15个val示例”。在代码的后面,训练数据是使用tf.slice() 和未修改的正确update_batch_size生成的,但是我不确定这可以可靠地保留按类分类的复杂的训练数据...