Skip to main content

元学习(Meta-Learning)简介

图像分类元学习入门
Created on February 11|Last edited on December 9
本报告是作者Stacey Svetlichnaya所写的Intro to 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类可以更狭义地针对特定物种) 。




Example MIN data
2


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)可以有相似的表现并且训练更快、 同时提高训练速度



Example tasks
8


初步观察

在这里,我将不同的元学习运行(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个过滤器的浅蓝色和深蓝色运行进行比较




N-way, 1-shot
7


使用三个repo和一个gist

  • 我写这个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生成的,但是我不确定这可以可靠地保留按类分类的复杂的训练数据...

Iterate on AI agents and models faster. Try Weights & Biases today.