元学习Meta-Learning—授人以鱼不如授人以渔
目录
-
背景 -
Meta-Learning的数据划分 -
MAML算法 -
MAML的思考 -
参考
背景
我们知道现在深度学习在使用大型数据集掌握一项任务(检测,分类等)方面取得了巨大的成功,但这并不是真正我们追求的“人工智能”。具体来说,我们可能训练了一个能做物理题很高分的学生,但是他也只能做物理题而已,面对数学题他只能吞下零分的命运;其次,在面对新的任务(数学题)的时候,我们的学生仍然需要大量的数据(数学题)进行训练,而在学习物理的时候积累下的学习方法(先验知识)却基本帮不上忙。
以上的问题可以抽象为一个具体的问题:现在的深度学习往往只是在学习某一类特定的任务,而不是在学习自身“学习”的能力,这也是Meta-Learning的定义:学习如何学习的能力,而不是学习具体的某一个任务。假如我们的算法学会了怎么学习,当面对一个新的任务的时候,有了学习能力(先验知识)就可以只用少量的数据进行快速的学习,而这种学习如何学习的方式才是真正的“人工智能”。
Meta-Learning 的算法有很多,有些算法可以针对不同的训练任务,输出不同的神经网络结构和超参数,例如 现在很火的 Neural Architecture Search (NAS) 和 AutoML。本文主要介绍另外一种Meta-Learning算法:MAML,它不改变深度神经网络的结构,只改变网络的初始化参数。
Meta-Learning的数据划分
首先我先用一段不严谨的语言描述一下Meta-Learning:我们假定传统的深度学习算法是给100道化学题让他学会做化学题(再用50道化学题进行测试),MAML算法则是用5道数学题,5道语文题,5道物理题来让算法学会做5道化学题,具体来说先通过5道数学、5道语文、5道物理题来让算法掌握学习的能力(分别用2道数学、2道语文、2道物理题来验证学习效果),然后再给一点点化学题(5题)训练就可以让算法掌握化学题的做法。如果说传统深度学习是在学习一个任务,那么MAML则是在遍历多个任务后找到一组敏感的参数,在新任务到来的时候帮助模型利用这组参数快速地将先验知识转移到新任务上。自然地,Meta-Learning的数据集肯定不是像传统DL那样简单划分为训练集和测试集:如上图所示,在Meta-Learning上,我们不再直接叫train和test了,而是叫Meta-train和Meta-test。在上图中,每一行都是一个task(例如数学题、物理题),包含了task的train set和test set,图中展示就是所谓的5way 1shot 设定,也就是一个task包含5个类,每一个类一个训练样本,然后给你2个测试样本测试。我们可以把每一个task当做一个Meta-Learning的训练样本。我们要通过多种task的训练,从而在Meta-test的时候也就是在新的task上取得好效果。出于习惯,我们把meta-training中的training data叫做support set、test set叫做query set。
这部分主要是掌握Meta-Learning的数据集是如何划分的即可,具体MAML的细节下一部分会具体阐述。
MAML算法
MAML算法主要分成三步:
-
(1) 采样任务数据:首先会从meta-training里面采样一个batch size的training data,比如batch size为3的时候我们就会随机采样3个任务的数据(比如做数学题,做物理题,做语文题)。 -
(2) 计算梯度和参数:对 training data 中每一个 task 以及其对应的 label 计算属于每个 Task 的 gradient 与更新后的 model 参数。(这里是 第一次计算梯度) -
(3) 更新模型:当有了每个 task 利用 training data of meta-train(即support set)得到的新模型参数后,可以利用test data of meta-train(即query set)验证,並且加总所有任务的loss,对原本模型参数(注意不是对第一次求的梯度参数)微分并真正的更新一次参数。( 第二次计算梯度)
MAML的思考
整个算法的流程还是比较简洁的,读者可能会觉得为什么不和往常一样计算一次梯度就好了,为什么要算两次,我的理解是:对于一个有很多任务要学习的模型,我们要优化这个模型,第一个想法可能是找到一个点(参数空间上)让所有的任务在这个点是最优解,听起来很强,但想想都觉得很困难,平时我们训练单一任务SGD找最优解都要迭代那么久,怎么可能一下子就可以找到一个点是所有任务的最优解?所以MAML把问题转换为找到一个点,让这个点距离各个任务的最优解最近,让这个点只需要简单地梯度下降一次就可以找到最优解,显然这种想法更加的科学。回到我们一开始的例子:我们想在计算机视觉漫谈公众号发掘一位有考上清华潜力的全才,只计算一次梯度的想法相当于我先在这些人里面找语文满分的,然后在语文满分的中找数学满分的,再在数学满分里面找英语满分的……,这肯定很难。而计算两次梯度的想法相当于我在所有关注计算机视觉漫谈公众号中的人中找到很聪明的那个,这个人不一定语文第一名,但他很聪明,全能型选手,学啥都很快很好,显然通过第二种方法更能挖掘出一位有考上清华潜力的全才。
另外有接触过迁移学习的同学可能会觉得元学习和迁移学习很像,在我的理解上两者其实没有明显的界限,这里引用王晋东博士的话:你可以说元学习是强调从不同的若干小任务小样本来学习一个对未知样本未知类别都有好的判别和泛化能力的模型,但其实你想想,难道这不就是知识迁移吗?从迁移上来看,你可以说学习一个可迁移的特征或模型,可以从A迁移到B。但这些可以被迁移过提纯的东西,难道不能被叫做元知识吗?所以其实是殊途同归的,都应该一起联系起来看。
参考
-
(1)论文:https://arxiv.org/pdf/1703.03400.pdf -
(2)Chelsea Finn ‘s blog https://bair.berkeley.edu/blog/2017/07/18/learning-to-learn/
本文分享自微信公众号 - 计算机视觉漫谈(gh_41e38694bc19)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
撸了一个 Feign 增强包
前言 最近准备将公司的一个核心业务系统用 Java 进行重构,大半年没写 Java ,JDK 都更新到 14 了,考虑到稳定性等问题最终还是选择的 JDK11。 在整体架构选型时,由于是一个全新的系统,所以没有历史包袱,同时团队中也有多位大牛坐镇,因此我们的选项便大胆起来。 最终结果就是直接一把梭,直接上未来的大趋势:Service Mesh,直接把什么 SpringCloud、Dubbo 这类分布式框架全部干掉。 本次的重点不是讨论 Service Mesh 是什么、能解决什么问题、为什么选择它,毕竟我也在学习阶段,啥时候整明白线上也稳定了再和大家来交流。 问题 既然方向定了就开始实际撸码了,不过刚一开始就验证了”理想很丰满、现实很骨感“; 由于我们去掉了 SpringCloud 和 Dubbo 这类框架,服务的注册、发现、负载均衡等需求全部都下沉到 Service Mesh 中提供了。 但对于开发来说依然希望可以调用本地方法的方式来调用远程服务,这在 SpringCloud 这类框架中是很容易实现的,框架本身就有很好的支持。 回到我们这个场景,需求其实很简单,就是想达到 Sprin...
- 下一篇
Linux Lab v0.5 rc2 发布,迎来社区参与里程碑
Linux Lab 是一套用于 Linux 内核学习、开发和测试的即时实验室,可以极速搭建和使用,功能强大,用法简单! 可以用它来高效地学习处理器架构、Linux 内核、嵌入式 Linux 系统、C 语言编程、Linux 汇编、Shell 编程等。 Linux Lab Boot example 已经跃跃欲试了?!快来看看: Linux Lab v0.5-rc2 中文手册 Linux Lab v0.5-rc2 英文手册 Linux Lab:难以抗拒的十大理由 v1.0 Linux Lab:难以抗拒的十大理由 v2.0 如果您想学习 Linux 0.11 内核和 Linux X86 汇编语言,也可以访问另外两套 Lab,即 Linux 0.11 Lab 和 CS630 Qemu Lab。 版本更新 Linux Lab 于 6 月底发布了 v0.5 的第一个候选版本:v0.5-rc1,首次合并了龙芯全系处理器支持,本次发布的 v0.5-rc2 改动不多,但是在社区参与方面迎来重大的里程碑,本次所有改动均来自用户和开发者的反馈或贡献。 本次合计 43 笔变更: // cloud lab ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS7,CentOS8安装Elasticsearch6.8.6
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS6,CentOS7官方镜像安装Oracle11G
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- 设置Eclipse缩进为4个空格,增强代码规范
- Mario游戏-低调大师作品
- MySQL8.0.19开启GTID主从同步CentOS8