学习笔记|元学习(Meta-learning)——让机器学习如何学习

2023-05-16

文章目录

  • 1. 元学习概述
  • 2. MAML
    • 2.1 MAML概述
    • 2.2 MAML的训练
  • 3. 元学习在N-ways K-shot上的应用

1. 元学习概述

元学习的意思即**“学会如何学习”** 。 在机器学习中,工作量最大也是最无聊的事情就是调参。我们针对每一个任务从头开始进行这种无聊的调参,然后耗费大量的时间去训练并测试效果。因此,一个直观的想法是:我们是否能让机器自己学会调参,在遇到相似任务时能够触类旁通、举一反三,用不着我们从头开始调参,也用不着大量标签数据重新进行训练。
通常的机器学习是针对一个特定的任务找到一个能够实现这个任务的function,例如猫和狗的分类任务。而元学习的目标就是要找到一个Function能够让机器自动学习原来人为确定的一些超参(Hyper-parameter),如初始化参数 θ 0 \theta_0 θ0、学习速率 η \eta η、网络架构等,元学习的分类就是看学习的是什么超参。这个Function用 F ϕ F_{\phi} Fϕ表示, F ϕ F_{\phi} Fϕ不是针对某一个特定任务的,而是针对一群类似的任务,例如这些任务可能包括猫和狗的分类、橘子和苹果的分类、自行车和摩托车的分类等等。这个 F ϕ F_{\phi} Fϕ是要帮这一群类似任务找到一个好的超参,在下次再遇到相似任务的时候,初始化参数可以直接用上,用不着我们再调参了。
image.png

元学习是跨任务学习(multi-task learning),因此它需要收集多个类似任务的数据集。比如针对图片二分类任务,我们需要收集橙子和苹果训练数据和测试数据、自行车和汽车的训练数据和测试数据等等许多二分类任务的数据集。元学习的目标是:利用 F ϕ F_{\phi} Fϕ找到最优的超参 ϕ \phi ϕ,使各任务在超参 ϕ \phi ϕ的基础上训练出最优参数后测试得到的损失值 l n l^n ln的和最小。这句话讲起来比较难以理解,举个例子比较好明白:对于苹果和橙子的分类任务,在超参 ϕ \phi ϕ的基础上利用训练数据集进行训练,得到最优参数 θ 1 ∗ \theta^{1*} θ1,然后再利用测试数据集对训练后的模型进行测试,测试得到的损失值使 l 1 l^1 l1;同理,可以得到自行车和汽车分类任务的测试损失值 l 2 l^2 l2,以及其他二分类任务的测试损失值 l n l^n ln;元学习的目标就是要找到最优超参 ϕ \phi ϕ,使所有任务的测试损失值之和最小。所以元学习的损失函数定义为, L ( ϕ ) = ∑ n = 1 N l n L(\phi)=\sum_{n=1}^N{l^n} L(ϕ)=n=1Nln这里每一个用于训练超参 ϕ \phi ϕ的任务都称为训练任务,上面的N指所有训练任务的总数。如果在拿一个新的任务(该任务未在训练任务中出现过)来测试通过训练找到的超参 ϕ \phi ϕ的效果,那么这个任务就称为测试任务。
我们可以看到在每一个训练任务中包含了训练数据和测试数据,当然在测试任务中也包含了训练数据和测试数据,这和普通机器学习是大不同的。这样听起来很容易让人迷糊,所以有的文献不叫训练数据和测试数据,而是把训练数据叫支持集(support set),把测试数据叫查询集(query set)。
image.png
元学习的目标是要找到超参 ϕ \phi ϕ最小化损失函数 L ( ϕ ) L(\phi) L(ϕ)如果能够计算梯度,那么用梯度下降法求解即可。但是有很多情况使无法求梯度的,例如对网络架构的优化,此时有些文献会采用强化学习或进化算法等方法进行求解。
image.png

2. MAML

2.1 MAML概述

在普通机器学习中,初始化参数往往是随机生成的,MAML聚焦于学习一个最好的初始化参数 ϕ \phi ϕ。初始参数 ϕ \phi ϕ不同,对于同一个任务 n n n训练得到的最优参数 θ ^ n \hat{\theta}^n θ^n不同,在任务 n n n的测试数据集上损失值 l n ( θ ^ n ) l^n(\hat{\theta}^n) ln(θ^n)不同。MAML的目标是找到最优的初始参数 ϕ \phi ϕ,是所有任务的测试损失值最小,在遇到新任务时,只需基于少量标签对初始化参数 ϕ \phi ϕ进行微调就可以获得很好的效果。这和前面提到的预训练有些相似,但也有些不同。
image.png

2.2 MAML的训练

MAML的训练使用梯度下降法: ϕ ← ϕ − η ∇ ϕ L ( ϕ ) \phi \leftarrow \phi-\eta \nabla_{\phi} L(\phi) ϕϕηϕL(ϕ)具体的数学推导不管它了,我们直接看上面的梯度下降是如何实施的(这里假设batch size是1):

  • ①假设刚开始的初始化参数的初始化参数是 ϕ 0 \phi_0 ϕ0
  • ②随机采样一个训练任务 m m m
  • ③通过训练任务 m m m的支持集(训练数据)求loss,然后更新一次参数得到任务 m m m的最优参数 θ ^ m \hat{\theta}^m θ^m,注意此时并没有更新 ϕ \phi ϕ
  • ④通过训练任务 m m m的查询集(测试数据)再求一次loss,计算梯度,然后用此梯度的方向更新 ϕ \phi ϕ
  • ⑤回到②,重复②③④
    上述过程有一个很值得关注的地方是,对于任务 m m m,更新一次参数就认为参数最优了,李宏毅认为作者之所以这么设置是因为MAML主要用于小样本学习,更新一次是怕发生过拟合的问题。
    之前说MAML和与训练模型很像,但是也有所不同。不同点是与训练模型用任务的训练数据求loss就直接更新 ϕ \phi ϕ了,而不是在测试数据上二次求loss后才更新的。

image.png

结合上面的讲解,来看一看MAML原文的算法,如下图所示。首先随机在这个算法里采样一个batch的训练任务,注意这里的batch是任务而不是数据。对于这一个batch的所有任务:第5行对每一个训练任务 T i T_i Ti,通过支持集求loss,计算梯度;第6行根据第5行算出来的梯度更新一次参数得到 θ i ′ \theta'_i θi,并且保存起来。假设一个batch有10个任务,那么这里就保存了10个模型参数 θ i ′ \theta'_i θi。完成了一个batch所有任务的参数更新后,进行第8行:基于更新后的参数和所有任务的查询集计算出各自的loss,将这些loss求和,计算出梯度,利用该梯度更新初始参数。假设一个batch有10个任务,基于更新后的参数和这10个batch任务的查询集计算出10个loss,将这10个loss进行求和,并基于求和结果计算梯度,利用该梯度更新初始参数。
image.png
我截了一部分MAML的代码,通过分析代码就可以更好理解上述参数的更新过程了。以下是第一次更新参数的代码

for k in range(1, self.update_step):
       # 1.在支持集上计算loss
       logits = self.net(x_spt[i], fast_weights, bn_training=True)
       loss = F.cross_entropy(logits, y_spt[i])
       # 2. 利用上面的loss,计算梯度
       grad = torch.autograd.grad(loss, fast_weights)
       # 3. 更新参数:theta_pi = theta_pi – train_lr * grad
       fast_weights = list(map(lambda p: p[1] – self.update_lr * p[0], zip(grad, fast_weights)))
       # 4.基于更新后的参数,在查询集上计算loss
       logits_q = self.net(x_qry[i], fast_weights, bn_training=True)
       loss_q = F.cross_entropy(logits_q, y_qry[i])
       # 5把所有loss加起来,并保存.
       losses_q[k + 1] += loss_q

以下是第二次更新参数的代码

# 将所有任务的查询集上的loss的和除以任务数目,求了个平均值
loss_q = losses_q[-1] / task_num
# 利用上面的loss算梯度,并更新初始化参数
self.meta_optim.zero_grad()
loss_q.backward()
self.meta_optim.step()

3. 元学习在N-ways K-shot上的应用

N-way K-shot是典型的小样本学习问题。所谓N-way K-shot是指在每一个任务里面,有N个类别,每个类别有K个样本。Omniglot是一个典型例子它包含1632个不同的字符,每个字符只有20个样本。从上面1632字符中可以构建N-way K-shot任务。例如通过下面的方式构建一个小样本分类任务:抽出20个字符出来,里面每个字符只有1个样本,我们把这个数据集作为训练集(支持集),那就是20-ways 1-shot的问题。然后再在这20个字符中取1个样本出来,作为测试集(查询集),利用训练出来的模型来判断这个样本属于哪个字符。通过这种方式,可以构建出许多任务来,如果是20 ways的就可以构建出81个任务。这些任务又可以分为训练任务和测试任务,例如将81个任务中的60个任务作为训练任务,21个任务作为测试任务。
image.png
拥有了这些数据集后,就可以来测试MAML了。以下是MAML原文的测试结果。从测试结果来看,MAML处理N-way K-shot任务是非常棒的。
image.png

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

学习笔记|元学习(Meta-learning)——让机器学习如何学习 的相关文章

  • el-select 结合字典使用

    平时用select 发现重复的字典太多了 所以存在了通用方法里这样一劳永逸 字典类dict util js const dict 61 yesNoOptions name 39 是 39 code 1 name 39 否 39 code 0
  • el-table修改某行样式

    cell class name 61 34 cellClass 34 cell style 61 34 cellStyle 34 其中的cellClass和cellStyle是方法 xff0c 返回格式为字符串即可 xff0c 它会自动填充
  • oracle数据库导入sql中文乱码

    从开发环境导数据到正式环境发现中文乱码 xff0c 导的方式是sql文件形式的 两边用的都是plsql工具 xff0c 听网上说是字符集格式问题 xff0c 但是oracle这个属于运维管理 xff0c 开发没有权限 xff0c 最后尝试了
  • poi+hutool导出excel addMergedRegion 合并行速度慢的问题

    private static void defaultExport List lt gt list Class lt gt pojoClass String fileName HttpServletResponse response Exp
  • 使用bat文件实现部署以及备份

    因为每次都要把文件传上去 停止服务器 xff0c 然后备份 xff0c 再把文件移入再启动 xff0c 太麻烦 所以写了个bat文件执行 停止服务 备份 移动文件从桌面到文件夹 在启动 xff0c 启动的net stop 是我把启动文件注册
  • payload是什么?

    payload是一种以JSON格式进行数据传输的一种方式 http可能会传输payload xff0c 如果不限制其请求的方式 那么请求的方法就是OPTIONS 或者响应的状态码 xff0c 其包含元数据 xff0c 头部区域和数据 如果数
  • datetimepicker限制最大时间

    39 datetimepicker3 39 datetimepicker format 39 yyyy mm 39 weekStart 1 autoclose true startView 3 minView 3 forceParse fa
  • echart横坐标字体样式问题 xAxis属性问题

    xAxis type 34 category 34 data this problemCity citys axisTick alignWithLabel true axisLabel show true textStyle fontSiz
  • STM32F103程序设计-2-使用STLINK下载程序的两种方法

    市场上常用的仿真器有三种 xff1a STLINK ULINK 及 JLINK 其中官方出品的是 STLINK xff0c 价格在 120 元左右 STLINK 包含三部分 xff1a 数据线 USB 线及仿真器本身 驱动程序的安装方法 x
  • Ubuntu 更换源不成功 sudo apt-get update 失败问题总结

    安装NVIDIA px2 ros总是失败 xff0c NVIDIA DRIVE px2是arm64架构 xff0c 跟平常的笔记本 xff0c 台式机不一样 xff0c 不过也有一定的借鉴意义 问题都是类似的 比如这次我遇到如下问题 xff
  • OpenFOAM-工具Tools学习笔记

    记录OpenFOAM中工具的学习和使用 xff0c 持续更新和整理 surfaceAdd 该工具可以将两个stl合并到一个文件中 使用命令行开关 mergerregions将具有相同名称的区域连接到一个区域 否则 xff0c 这两个区域将保
  • 【OpenFOAM】学习网址汇集

    收藏了好多关于OpenFOAM学习网址的帖子文章等 xff0c 时间久了自己都忘了 xff0c 建立一个自己的吧 xff0c 这下应该舒服了 https www openfoam com https openfoam org https o
  • C语言初学1--基础

    C语言基础学习记录 学习视频如下 https www bilibili com video BV1q54y1q79w spm id from 61 333 999 0 0 amp vd source 61 7442270a1c7e13b4d
  • C语言初学2--分支和循环

    C语言基础学习记录 学习视频如下 https www bilibili com video BV1q54y1q79w spm id from 61 333 999 0 0 amp vd source 61 7442270a1c7e13b4d
  • 【OpenFOAM】topoSet学习笔记

    非常好的文章 xff1a OpenFOAM初学心得 xff08 五 xff09 内部边界的设定 xff08 topoSet与createBaffles工具 xff09 区域划定工具topoSet 详细的topoSetDict 见 etc c
  • 【OpenFOAM】-olaFlow-算例1- baseWaveFlume

    算例路径 olaFlow tutorials baseWaveFlume 算例描述 一个基础的二维波浪水槽 学习目标 olaFlow 求解器的造波 消波方法和算例设置 算例快照 图1 波浪模拟结果 图2 算例网格 文件结构 span cla
  • WPI交通信号灯数据集格式转换成VOC2007

    WPI交通信号灯数据集格式转换成VOC2007 1 简述 初学交通信号灯目标检测时 xff0c 总是苦于找不到合适的交通灯数据集 即使找到了数据集 xff0c 也往往因为格式不同而无法直接使用 因为大部分目标检测代码都只支持VOC或COCO
  • 【OpenFOAM】-olaFlow-算例2- breakwater

    算例路径 olaFlow tutorials breakwater 算例描述 波浪对防波堤的作用 堤身为孔隙可渗透结构 堤顶沉箱为不可渗透结构 学习目标 渗透模型 可渗结构设置 孔隙材料各项参数设置 算例快照 图1 防波堤越浪模拟结果 图2
  • 【OpenFOAM】-olaFlow-算例3- currentWaveFlume

    算例路径 olaFlow tutorials currentWaveFlume 算例描述 波流耦合模拟 该算例提供了四种工况 1 Waves and forward current 2 Waves and backward current
  • 【OpenFOAM】-olaFlow-算例4- irreg45degTank

    算例路径 olaFlow tutorials irreg45degTank 算例描述 不规则波浪模拟 学习目标 不规则波浪模拟 olaFlow中单向不规则波采用线性波浪叠加法生成 基本原理如图2所受 需要提供对应波谱的周期 波高和相位的离散

随机推荐

  • 【OpenFOAM】-olaFlow-算例5- oppositeSolitariesFlume

    算例路径 olaFlow tutorials oppositeSolitariesFlume 算例描述 两列反向的孤立波相互作用 学习目标 熟练掌握olaFlow的造波设置 波浪方向与消波方向设置 算例快照 图1 两列反向孤立波相互作用 文
  • 【OpenFOAM】-olaFlow-算例6- waveFloatingObject

    算例路径 olaFlow tutorials waveFloatingObject 算例描述 波浪作用下的浮体的刚体运动 属于流固耦合 FSI 问题 学习目标 动网格设置和使用 网格变形控制 浮体的物理参数设置 浮体做刚体运动的约束设置 算
  • 【OpenFOAM】-olaFlow-算例7-波面自适应网格

    算例路径 none 算例描述 波面附近采用自适应网格划分 学习目标 动网格设置和使用 dynamicFvMesh dynamicRefineFvMesh 的各参数含义 学习体会 1 在结构附近的加密网格 自适应网格依然会对细网格进一步细化
  • 【OpenFOAM】-olaFlow-算例8-setOlaFlume

    算例路径 olaFlow tutorials setOlaFlume 算例描述 不规则底部的二维波浪水槽 且波场被 setOla 工具设置为初始条件 学习目标 使用 setOla 工具设置初始条件为波浪场 不规则底部数值波浪水槽的设置 学习
  • 【OpenFOAM】-olaFlow-算例9-pistonFlumeABS

    算例路径 olaFlow tutorials pistonFlumeABS 算例描述 采用 piston 形式的动边界进行消波 学习目标 了解 olaDyMFlow 的使用 理解动网格使用和参数设置 理解 dynamicMotionSolv
  • 【OpenFOAM】-olaFlow-算例10-wavemakerTank

    算例路径 olaFlow tutorials wavemakerTank 算例描述 采用 Flap和Piston两种方式的动网格进行造波 学习目标 了解 olaDyMFlow 的使用 理解动网格使用和参数设置 理解 dynamicMotio
  • 【OpenFOAM】-算例解析合集(备份目录)

    OpenFOAM 算例解析合集 OlaFlowinterFoampimpleFoam OlaFlow OpenFOAM olaFlow 算例1 baseWaveFlume OpenFOAM olaFlow 算例2 breakwater Op
  • 关于MATLAB中使用Link函数和SerialLink建模

    关于MATLAB中使用Link函数和SerialLink建模 Link函数默认使用的是标准D H法建立模型 xff0c 如果想用改进D H法建立模型 xff0c 则应在参数后添加 modified 如下所示 xff1a 建立机器人模型 th
  • 【OpenFOAM】-interFoam-laminar-算例11-wave

    算例路径 OpenFOAM 8 tutorials multiphase interFoam laminar wave 算例描述 使用 interFoam 求解器的造波功能 学习目标 extrudeMesh 网格操作 了解 setWaves
  • 解决Ubunt20.04安装Sogou输入法失败进不去桌面 及 中文输入法安装

    目录 解决Ubunt20 04安装Sogou输入法失败进不去桌面中文输入法安装解决wps无法输入中文 解决Ubunt20 04安装Sogou输入法失败进不去桌面 问题 xff1a Ubuntu20 04 安装了 fcitx 和 sogou
  • 【OpenFOAM】-pimpleFoam-RAS-算例12-wingMotion

    算例路径 OpenFOAM 8 tutorials incompressible pimpleFoam RAS wingMotion 算例描述 该路径下包含三个目录 分别为 1 wingMotion snappyHexMesh 使用 sna
  • 【OpenFOAM】-算例解析合集

    OpenFOAM 算例解析合集 OlaFlow interFoam pimpleFoam OlaFlow OpenFOAM olaFlow 算例1 baseWaveFlume OpenFOAM olaFlow 算例2 breakwater
  • 我的第一篇博客

    我的第一篇博客 很高兴来到这里 xff0c 加油 xff01 我会写更多有用的文章的 xff01
  • 为Termux安装图形化界面

    在学校闲着没事就逛逛论坛 博客 以及贴吧 突然发现一个好玩的东西 xff0c 它就是 Termux 也是咕哝了好久 xff0c 在贴吧看到Termux可以装xfce桌面 于是便有此篇文章留作纪念 xff0c 也同时感谢大佬们的默默努力 xf
  • 在华为平板的Termux上安装Debian Linux图形化界面的详细教程,向生产力更近一步。

    Termux 安装 Debian Linux 图形化界面 文章目录 前言一 准备材料二 安装Debian Linux步骤1 进入Termux安装Debian Linux2 开启远程桌面 xff08 两种方式选一种即可 xff09 总结 前言
  • 在Termux的Debian Linux中设置中文界面

    在Termux的Debian Linux容器中设置中文界面 文章目录 前言Debian汉化 前言 上次在平板中安装了Debian Linux 并可以连接远程xfce桌面 xff0c 有兴趣的可以去看这里 xff0c 但是系统界面确是英文实在
  • 在Termux的Debian Linux中安装VScode

    文章目录 前言安装VScode 前言 有兴趣的伙伴可以看上次安装Debian这里和汉化Debian的文章这里 安装VScode 1 下载火狐浏览器 span class token function sudo span span class
  • 一步一步教你使用uCOS-II

    第一篇 UCOS介绍 第一篇 UCOS介绍 这个大家都知道 呵呵 考虑到咱们学习的完整性还是在这里唠叨一下 让大家再熟悉一下 高手们忍耐一下吧 xff01 uC OS II Micro Control Operation System Tw
  • MATLAB绘制空间曲线和曲面图像

    MATLAB绘制空间曲线和曲面图像 之前考研的时候做到2010年数一试卷第19题时 xff0c 一直无法想象 Sigma 的图像到底是什么样的 当时由于时间紧迫且不知道如何用MATLAB画图 xff0c 因此就这么草草了事 现在正好学到了这
  • 学习笔记|元学习(Meta-learning)——让机器学习如何学习

    文章目录 1 元学习概述2 MAML2 1 MAML概述2 2 MAML的训练 3 元学习在N ways K shot上的应用 1 元学习概述 元学习的意思即 学会如何学习 在机器学习中 xff0c 工作量最大也是最无聊的事情就是调参 我们