论文阅读 MAML (Model-Agnostic Meta-Learning for Fast Adaptation of Deep Networks)

2023-05-16

Model-Agnostic Meta-Learning for Fast Adaptation of Deep Networks MAML 论文阅读

  • 摘要
  • 介绍
  • 模型不可知元学习
    • 元学习问题定义
    • 模型不可知元学习算法
  • MAML种类
    • 监督回归和分类
    • 强化学习
  • 总结

Model-Agnostic Meta-Learning for Fast Adaptation of Deep Networks
用于深度网络快速自适应的模型不可知元学习

摘要

元学习的目标是在各种学习任务上训练一个模型,学习一个模型初始化,这样它可以只使用少量的训练样本来解决新的学习任务。也就是说训练一个具体对各种任务都有极强泛化性的模型,在新任务中只需要小样本训练对参数进行微调即可。文章中,该方法可以用到分类、回归和强化学习的方法中。

介绍

快速学习要求对大量任务训练学习先验知识,再将其与新任务的数据相结合,并防止在新任务中过拟合。

在元学习中,目标是从少量新数据中快速学习新任务,元学习器训练模型以学习大量不同的任务。其关键思想是训练模型的初始参数,以便在通过一个或多个梯度步长更新参数后,模型在新任务上具有最大性能,该梯度步长是用来自该新任务的少量数据计算的。

元学习的新任务快速学习可以视为构建广泛适用于许多任务的内部表示。如果内部表示适用于许多任务,那么简单地稍微微调参数可以产生良好的结果。

并且元学习与模型的类型无关。

模型不可知元学习

元学习的目标是训练能够实现快速适应的模型,这一问题设置通常被正式化为少量学习。

元学习问题定义

元学习的目标是训练一个模型,该模型仅使用几个数据点和训练迭代就能快速适应新任务。方法是在元学习阶段对模型或学习者进行一组任务的训练。

一个任务的定义形式如下:
L为损失函数, q ( x 1 ) q(x1) q(x1)为初始观测的概率, q ( x t + 1 ∣ x t , a t ) q(x_{t+1}|x_{t}, a_{t}) q(xt+1xt,at)为状态转移概率,H为一个episode的长度。(任务定义更针对强化学习)对分类和回归任务H一般为1。
在这里插入图片描述

模型不可知元学习算法

先前的工作试图训练摄取整个数据集的递归神经网络或可在测试时与非参数方法结合的特征嵌入。

元学习思想是,一些内部表征比其他表征更容易传递。例如,神经网络可能学习广泛适用于p(T)中所有任务的内部特征,而不是单个任务。我们如何鼓励这种通用表示的出现?我们的目标是找到对任务变化敏感的模型参数,这样,当沿着损失梯度的方向改变时,参数的微小变化将对从p(T)得出的任何任务的损失函数产生很大的改善。

在这里插入图片描述

元学习的算法流程如下:
在这里插入图片描述
其中2-8为外部循环,4-7为内部循环。
2:开始循环
3:首先这里会采样多个任务
4:对于各个任务进行内部循环
5:对于各个任务中采样得到的K个样本(训练集)根据损失计算参数 θ \theta θ梯度
6:使用梯度下降计算当前的自适应参数 θ ′ \theta^{'} θ,计算公式为:
在这里插入图片描述
注意我们这里并没有直接使用 θ ′ \theta^{'} θ来替换 θ \theta θ,而仅仅是计算了 θ ′ \theta^{'} θ的值,这是为了进一步计算下一步更新的梯度。
7: 结束内循环
8:外循环最重要的一步,更新任务的参数目标 θ \theta θ,更新公式为
在这里插入图片描述
注意这里是使用每个任务的测试集来更新。同时注意求导过程中,这里是使用的各个任务中基于 θ ′ \theta^{'} θ的模型对于初始参数 θ \theta θ的梯度的和。
在这里插入图片描述
补充:注意这个求导公式涉及到了 θ \theta θ的二阶导。如下图,由于首先需要对 θ ′ \theta^{'} θ进行求导,进一步对 θ ′ \theta^{'} θ θ \theta θ的倒数,推导如下:
在这里插入图片描述
但是在实现过程中MAML对这个二阶导的计算做了近似,因为不近似的话二阶导要保存计算图,存储空降和计算速度都会受到影响,会花费大量的计算时间。这里近似把二阶导数置为0。
在这里插入图片描述
因此在实际代码中 f ( θ ′ ) f(\theta^{'}) f(θ) θ \theta θ求导等价于 f ( θ ′ ) f(\theta^{'}) f(θ) θ ′ \theta^{'} θ求导。如下是计算时的关键代码。

for i in range(task_num):

    # 1. run the i-th task and compute loss for k=0
    logits = self.net(x_spt[i], vars=None, bn_training=True)
    loss = F.cross_entropy(logits, y_spt[i])
    #可以看到下面的这个grad的计算图没有保存
 	grad = torch.autograd.grad(loss, self.net.parameters())
 	fast_weights = list(map(lambda p: p[1] - self.update_lr * p[0], zip(grad, self.net.parameters())))
 	for k in range(1, self.update_step): #第二步更新了
 		logits = self.net(x_spt[i], fast_weights, bn_training=True)
 		loss = F.cross_entropy(logits, y_spt[i])
 		grad = torch.autograd.grad(loss, fast_weights) 
 		#这里就不用对net的参数求导,近似为对fastw求导
 		fast_weights = list(map(lambda p: p[1] - self.update_lr * p[0], zip(grad, fast_weights)))
 		logits_q = self.net(x_qry[i], fast_weights, bn_training=True)
        # loss_q will be overwritten and just keep the loss_q on last update step.
        loss_q = F.cross_entropy(logits_q, y_qry[i])
        losses_q[k + 1] += loss_q
    self.meta_optim.zero_grad()
    loss_q.backward()
    self.meta_optim.step()
    #这里的loss是对net的参数求导,虽然里面有fastw,但由于没有保存计算图,所以其对net的导数为1

代码来自:https://blog.csdn.net/Cecilia6277/article/details/109091482

MAML种类

监督回归和分类

监督学习算法流程图
在这里插入图片描述

强化学习

强化学习算法流程图
在这里插入图片描述

总结

因此,个人认为元学习这篇文章主要的几点如下:

  1. 首先,元学习是用来解决小样本快速学习的。他的方法是在多种任务上进行训练的基础上,学习到泛化的共同信息,生成初始化网络的参数。在新任务上使用这种初始化网络参数可以快速收敛。
  2. 其次,元学习的具体实现如下:
    (1) 首先对迭代次数进行循环,进入外循环,外循环中会采集任务样本。
    (2) 之后进入内循环,内循环会对所有的任务进行循环,第一步使用训练任务的训练进行训练,预估损失对于参数的梯度,并使用梯度更新一次参数,得到初始化模型参数 θ ′ \theta^{'} θ,内循环结束。
    (3) 然后退出到外循环,使用各个任务的测试集和初始化模型参数 θ ′ \theta^{'} θ对于 θ \theta θ的梯度的和来更新 θ \theta θ,获得初始化参数。
    在这里插入图片描述
  3. 实现补充
    在进行上面外循环的最后一步更新时,对于初始化模型 f ( θ ′ ) f(\theta^{'}) f(θ)对于 θ \theta θ的梯度涉及到对于 θ \theta θ的二阶导数,计算时会花费大量的时间,因此为更好地计算,将二阶导数近似为0,因此近似为初始化模型 f ( θ ′ ) f(\theta^{'}) f(θ)对于 θ ′ \theta^{'} θ的梯度。
  4. 更新示意图
    因此最终的更新方式如下图,理论上使用第二次在 θ m \theta^{m} θm基础上对原始 ϕ 0 \phi^{0} ϕ0的梯度来更新 ϕ 0 \phi^{0} ϕ0。近似后变为第二次在 θ m \theta^{m} θm基础上对 θ m \theta^{m} θm的梯度来更新 ϕ 0 \phi^{0} ϕ0
    在这里插入图片描述
  5. 强化学习目标
    希望初始化一组参数 θ \theta θ,使得训练过一次后的模型能够得到最大奖励。因此可能这也是元学习中如此设计更新步骤的原因。
    在这里插入图片描述
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

论文阅读 MAML (Model-Agnostic Meta-Learning for Fast Adaptation of Deep Networks) 的相关文章

  • 一个模型可以“属于”任一/或多个模型吗?

    抱歉 如果这是一个有点菜鸟的问题 但希望澄清我对此的想法 我有一个模型 它可以属于一个模型 也可以属于另一个模型 例如 假设我有一个团队模型和一个成员模型 这两个模型都可以有一个 BankAccount class Team has man
  • 有没有一种方法可以透明地对 SQLAlchemy 对象执行验证?

    有没有办法在设置属性之后 或设置属性时 但在提交会话之前对对象执行验证 例如 我有一个领域模型Device有一个mac财产 我想确保mac属性在添加到数据库或在数据库中更新之前包含有效且经过清理的 mac 值 看起来 Pythonic 方法
  • 如何在 Ruby on Rails 中实现 Active Record 继承?

    如何实现活动记录的继承 例如 我想要一个动物类 狗类和猫类 模型和数据库表映射如何 Rails 支持单表继承 来自AR docs http api rubyonrails org classes ActiveRecord Base html
  • 覆盖 Django 模型 __init__ 方法

    我的 Django 项目的 Ingredient 模型有一个IntegerField它声明该原料库存是否按重量 单位或窝数进行管理 虽然数据库有它的integervalue 我必须显示它的名称 我认为最好覆盖每个成分并设置其值 而不是覆盖
  • Zend_Forms、控制器放在哪里?模型?别的地方?

    构建 Zend Forms 的代码最好放在哪里 我曾经把这个逻辑放在我的控制器中 但在我需要在不同的地方使用相同的表单后 我就放弃了这个逻辑 这意味着我必须在不同的控制器中重复创建表单 因此 我将表单创建代码移至我的模型中 这看起来正确吗
  • 使用 function.php 的单一产品的 Woocommerce 元数据

    我正在努力通过我的functions php 正确过滤元数据 I can get this to work if I edit the meta php in my child theme with no problem short sto
  • 模型中的 Ruby on Rails 增量计数器

    我正在尝试从另一个模型增加我的用户表中的计数器 class Count lt ActiveRecord Base belongs to user after create update count def update count user
  • zend 模型架构

    假设我的数据库中有两个表 项目和用户 我创建了两个扩展 Zend Db Table Abstract 的模型 Model DbTable Users and Model DbTable Projects 现在 创建一个实例是一个好的模式吗
  • 关闭 Rails 中的“updated_at”列

    我有一个简单的 日志 模型 它记录调用控制器操作的事实 该 日志 记录的条目应该创建一次并且永远不会更改 另外 我的数据库中会有很多这样的记录 因此 不需要 updated at 列 不需要浪费硬盘上的内存 我如何告诉 Rails 仅保留
  • 如何将 Request->all() 与 Eloquent 模型一起使用

    我有一个 lumen 应用程序 需要在其中存储传入的 JSON 请求 如果我写这样的代码 public function store Request request if request gt isJson data request gt
  • 如何使用SqlAlchemy通过id查询数据库?

    我需要通过其查询 SQLAlchemy 数据库id类似的东西 User query filter by username peter 但对于身份证 我该怎么做呢 通过 Google 和 SO 搜索没有帮助 查询有一个获取函数 https d
  • 使用ActiveRecord,有没有办法在after_update期间获取记录的旧值

    使用一个简单的示例进行设置 我有 1 张桌子 Totals 保存了总和amount第二个表中每条记录的列 Things When a thing amount更新后 我想简单地将旧值和新值之间的差异添加到total sum 现在我正在减去s
  • 如何在 Laravel 中基于迁移文件制作模型

    我已经创建了一个迁移 我想根据迁移文件制作一个模型 这可能吗 如果是这样 该怎么办 这是不可能的 到目前为止 您最多可以通过运行以下命令同时创建迁移和模型 php artisan make model ModelName m
  • SPA 模式下的 AngularJS 和元标记

    你们中有人已经找到了一种在 SPA 模式下使用 AngularJS 处理元标签的优雅方法吗 在基本模板中 我有一些默认的元标记 对于每条路线 每个控制器都会加载具有不同内容的不同视图 很正常 但是我如何更改每个页面的元标记呢 此外 有些页面
  • Keras 中的 model.fit() 和 model.evaluate() 有什么区别?

    我使用 Keras 和 TensorFlow 后端来训练 CNN 模型 之间是什么model fit and model evaluate 我应该最好使用哪一种 我在用model fit 截至目前 我知道的用处model fit and m
  • 使用 sunspot/solr 搜索多个模型

    我已经能够成功地实现基本的全文搜索 但是当我尝试使用范围 with statements 时 任何涉及多对多关系模型的查询似乎都不适合我 我知道相关行位于数据库中 因为我的 sql 语句确实返回了数据 然而 太阳黑子查询不会返回任何结果 我
  • 如何创建用于 QML 的通用对象模型?

    我想知道是否有任何宏或方法如何将 Qt 模型注册为 QObject 的属性 例如 我有AnimalModel http doc qt io qt 5 qtquick modelviewsdata cppmodels html qabstra
  • Magento:如何覆盖本地模块中的模型

    我试图在本地文件夹中覆盖本地文件夹中的模块 但我不知道是否可能 这就是我所做的 我创建了 local Mycompany Modulename Model Model php 我想覆盖 local Othercompany Modulena
  • 来自控制器的 Rails 验证

    有一个联系页面 可以输入姓名 电话 电子邮件和消息 然后发送到管理员的电子邮件 没有理由将消息存储在数据库中 问题 如何 在控制器中使用 Rails 验证 根本不使用模型 或者 在模型中使用验证 但没有任何数据库关系 UPD Model c
  • 如何在 Yii2 中指定大于或小于特定数字或值的验证规则?

    我有一个模型 其验证规则如下 x integer x unique 现在我如何添加如下规则 x 或者类似的东西x gt 100 它应该是 x compare compareValue gt 100 operator gt lt and x

随机推荐

  • MSP430F5529 入门心得

    2021年全国大学生电子设计竞赛因为疫情而推迟了 xff0c 因为电赛里必有一道题目是要使用TI的处理器而之前用习惯了STM32系列处理器没有使用过TI的板子 xff0c 就拿实验室现有的TI的板子MSP4305529LP学习 xff0c
  • 07-输入输出系统

    IO系统基本概念 大纲已删 I O控制方式简介 I O控制器多种多样 xff0c 也会制定相应的标准 xff0c 如 用于控制uSB设备的I O接口 用于控制SATA 3 0硬盘的I O接口等 I O控制器就是一块芯片 xff09 常被集成
  • 哈希算法原理和实现

    哈希算法原理和实现 前言 当我们在编程过程中 xff0c 往往需要对线性表进行查找操作 在顺序表中查找时 xff0c 需要从表头开始 xff0c 依次遍历比较a i 与key的值是否相等 xff0c 直到相等才返回索引i xff1b 在有序
  • Jenkins 安装

    Jenkins 安装 WAR 文件安装 JenkinsWindows 安装 Jenkins 安装 Jenkins启动 jenkins Debian Ubuntu 安装 Jenkins 安装 Jenkins启动 jenkins Redhat
  • MySql错误1251 - Client does not support authentication protocol requested by server 解决方案

    这是一个简单的权限与安全问题 只需要在 MySQL Shell 中输入两行简单的命令就可以解决问题 从安装目录进入mysql xff0c 找到安装目录 xff0c 点击上面的安装目录 xff0c 输入cmd xff0c 回车 xff0c 进
  • 初学Linux Vim时遇到的坑,为什么操作:wq 无法保存和退出

    Vim是Linux常用的文本编辑器 vim的操作 1 输入命令 vi 文件名 xff0c 进入文本编辑页面 2 输入 a 或者 i 可以编辑内容 3 点击Esc 退出命令模式 4 输入 xff1a wq 保存并退出 xff0c 记得别漏了冒
  • 将tensor转换为numpy

    将tensor转换为numpy span class token keyword import span tensor span class token keyword import span numpy span class token
  • OpenStack配置网络并安装且配置控制器节点

    OpenStack配置网络 右击以管理员模式启动 点击编辑 xff0c 选择启动启动虚拟网络编辑器 如上图所示 xff0c 如果出现桥接模式则是操作正确 下面进入虚拟机中 用户名为 xff1a root 密码 xff1a 123456 进入
  • 疑难杂症:Intellig IDEA启动Tomcat,控制台输出中文乱码(2018.3版本亲测可用)

    找到 IntelliJ IDEA 安装目录下bin目录下 xff0c 修改idea exe vmoptions和idea64 exe vmoptions两个文件 xff0c 在最后一行添加 Dfile encoding 61 UTF 8 修
  • 21.通用型1602液晶显示屏操作方法

    第7章通用型1602液晶显示屏操作方法 7 1液晶概述 液晶显示屏的主要原理是以电流刺激液晶分子产生点 线 面并配合背部灯管构成画面 液晶通常是按照显示字符的行数或液晶点阵的行 列数来命名的 xff0c 比如1602的意思是每行显示16个字
  • 外文文献检索网站

    1 Google scholar 网址 xff1a https scholar google com hk hl 61 zh CN 如今搜索论文的首选 xff0c 可以在这里查看论文统计和引用参考文献 xff0c 还能通过关注作者或者论文获
  • shell-awk的BEGIN和END

    文章目录 一 Awk 的两个特殊模式实例 xff1a 二 Awk高级应用1 if单分支语句2 if双分支语句3 for循环4 while循环 SHELL awk两个特殊模式 xff08 BEGIN 和 END xff09 及awk高级应用
  • HTML5基础知识

    目录 一 初识HTML 二 网页基本标签 2 1标题标签 2 3换行标签 2 4水平线标签 2 5字体样式标签 2 6注释和特殊符号 三 图像 xff0c 超链接 xff0c 网页布局 3 1图像标签 3 2链接标签 3 3块元素和行内元素
  • SQL Server 调用程序集(dll文件)

    1 生成对应的dll项目文件 如下图所示 xff08 示例 xff09 xff1a 2 打开SQL SERVER数据库 xff0c 创建程序集 xff0c 如下操作 找到 程序集 61 右击选中 新建程序集 点击 常规 xff0c 操作如下
  • 树莓派3b+镜像的安装以及常用的登录方式及树莓派换源

    安装镜像 1 xff0c 格式化内存卡用第一个工具 2 xff0c 把镜像写道内存卡中用第二个工具 登录 串口登录 因为树莓派默认的是蓝牙连接 xff0c 我们要断开蓝牙连接 xff0c 打开串口连接 将安装好的sd卡文件夹下的 cmdli
  • 通过kettle工具实现数据清洗与转换(实例)

    一 对文件merge csv进行完全去重 1 使用Kettle工具创建转换repeat transform xff0c 并添加 CSV文件输入 控件 唯一行 xff08 哈希值 xff09 控件以及Hop跳连接线 2 配置 CSV文件输入
  • JavaWed开发环境与搭建

    一 jdk下载与安装 1 下载 xff1a 进入官网 xff08 http www oracle com xff09 下载对应版本即可 2 设置环境变量 需要设置环境变量如下 xff08 JDK安装的位置 xff09 二 TomCat下载与
  • 【树莓派问题】树莓派python虚拟环境无法安装scipy库

    目录 问题描述 问题解决方法 报错关键字 xff1a Building wheel for numpy PEP 517 started Building wheel for numpy PEP 517 still running pip s
  • Codeblocks修改字体

    右上角settings editor general settings choose 选择好之后一路确定OK就可以了 但是大家谨慎改 xff0c 因为20 03版本的会报错 xff0c 就像我这样 xff0c 不知道其他版本修改后会不会有问
  • 论文阅读 MAML (Model-Agnostic Meta-Learning for Fast Adaptation of Deep Networks)

    Model Agnostic Meta Learning for Fast Adaptation of Deep Networks MAML 论文阅读 摘要介绍模型不可知元学习元学习问题定义模型不可知元学习算法 MAML种类监督回归和分类强