一文弄懂元学习 (Meta Learing)(附代码实战)《繁凡的深度学习笔记》第 15 章 元学习详解 (上)万字中文综述

《繁凡的深度学习笔记》第 15 章 元学习详解 (上)万字中文综述(DL笔记整理系列)

3043331995@qq.com

https://fanfansann.blog.csdn.net/

https://github.com/fanfansann/fanfan-deep-learning-note

作者:繁凡

version 1.0  2022-1-20

 

声明:

1)《繁凡的深度学习笔记》是我自学完成深度学习相关的教材、课程、论文、项目实战等内容之后,自我总结整理创作的学习笔记。写文章就图一乐,大家能看得开心,能学到些许知识,对我而言就已经足够了 ^q^ 。

2)因个人时间、能力和水平有限,本文并非由我个人完全原创,文章部分内容整理自互联网上的各种资源,引用内容标注在每章末的参考资料之中。

3)本文仅供学术交流,非商用。所以每一部分具体的参考资料并没有详细对应。如果某部分不小心侵犯了大家的利益,还望海涵,并联系博主删除,非常感谢各位为知识传播做出的贡献!

4)本人才疏学浅,整理总结的时候难免出错,还望各位前辈不吝指正,谢谢。

5)本文由我个人( CSDN 博主 「繁凡さん」(博客) , 知乎答主 「繁凡」(专栏), Github 「fanfansann」(全部源码) , 微信公众号 「繁凡的小岛来信」(文章 P D F 下载))整理创作而成,且仅发布于这四个平台,仅做交流学习使用,无任何商业用途。

6)「我希望能够创作出一本清晰易懂、可爱有趣、内容详实的深度学习笔记,而不仅仅只是知识的简单堆砌。」

7)本文《繁凡的深度学习笔记》全汇总链接:《繁凡的深度学习笔记》前言、目录大纲 https://fanfansann.blog.csdn.net/article/details/121702108

8)本文的Github 地址:https://github.com/fanfansann/fanfan-deep-learning-note/ 孩子的第一个『Github』 !给我个 ⭐     Starred \boxed{⭐ \,\,\,\text{Starred}} Starred 嘛!谢谢!!o(〃^▽^〃)o

9)此属 version 1.0 ,若有错误,还需继续修正与增删,还望大家多多指点。本文会随着我的深入学习不断地进行完善更新,Github 中的 P D F 版也会尽量每月进行一次更新,所以建议点赞收藏分享加关注,以便经常过来回看!

如果觉得还不错或者能对你有一点点帮助的话,请帮我给本篇文章点个赞,你的支持是我创作的最大动力!^0^

受篇幅所限(CSDN有字数限制),本文《元学习详解》分为上下两篇,这里是上篇。


一文弄懂元学习 (Meta Learing)(附代码实战)《繁凡的深度学习笔记》第 15 章 元学习详解 (下)万字中文综述(待更)

    15.5 基于度量的方法
      15.5.1 Convolutional Siamese Neural Network
      15.5.2 Matching Networks
         15.5.2.1 Simple Embedding
         15.5.2.2 Full Context Embeddings
      15.5.3 Relation Network
      15.5.4 Prototypical Networks
    15.6 基于模型的方法
      15.6.1 Memory-Augmented Neural Networks
         15.6.1.1 MANN for Meta-Learning
         15.6.1.2 Addressing Mechanism for Meta-Learning
      15.6.2 Meta Networks
         15.6.2.1 Fast Weights
         15.6.2.2 Model Components
         15.6.2.3 训练过程
    15.7 元学习应用
      15.7.1 计算机视觉和图形
      15.7.2 元强化学习和机器人技术
      15.7.3 环境学习与模拟现实
      15.7.4 神经架构搜索(NAS)
      15.7.5 贝叶斯元学习
      15.7.6 无监督元学习和元学习无监督学习
      15.7.7 主动学习
      15.7.8 持续、在线和适应性学习
      15.7.9 领域适应和领域概括
      15.7.10 超参数优化
      15.7.11 新颖且生物学上可信的学习者
      15.7.12 语言和言语
      15.7.13 元学习促进社会福利
      15.7.14 抽象和合成推理
      15.7.15 系统
    15.8 未来展望
    15.9 参考资料

一文弄懂元学习 (Meta Learing)(附代码实战)《繁凡的深度学习笔记》第 15 章 元学习详解 (上)万字中文综述

  元学习的诞生可以追溯到八十年代,当时的深度学习还没有如今这般火热, Jürgen Schmidhuber 在 1987 年的论文《 Evolutionary principles in self-referential learning》 [1] 一文中宣告了一种全新的机器学习方法的诞生:元学习。后来, Tom Schaul、 Jürgen Schmidhuber 两人在 2010 年的论文《Meta learning》 [2] 中更是确定了元学习的复兴。时间进入 2012 年,随着 Hinton 深度学习崭露头角,元学习与强化学习更是借着深度学习的大潮,在各个领域扩展到了极致(例如人脸识别领域等,均可用元学习来加以强化 cross domain 的性能)。

15.1 元学习 (Meta Learing):Learning To Learn

  在现有的机器学习中,我们往往会使用某个场景的大量数据来训练模型,训练出的模型仅适用于这一个场景。当场景发生改变时,我们就需要重新设计模型重新训练参数。但是对于人类而言,一个小朋友成长的过程中会见过许多物体的照片,某一天,在小朋友认识小鸟以后,当小朋友第一次看到了几张狗勾的照片,就可以很好地对狗勾和小鸟进行区分。学会骑自行车的人可以很快甚至自学学会如何骑电动车…… 那么有没有可能让机器学习模型也具有相似的性质呢?如何才能让模型仅仅用少量的数据就学会新的概念和技能呢?换句话说,如何让模型能够自己学会如何学习呢?这就是元学习要解决的问题。

  元学习(Meta Learning),含义为学会学习,即 learn to learn ,带着学会人类的“学习能力”的期望而诞生的新型机器学习方法。Meta Learning 希望使得模型获取“学会学习”的能力,也可以理解为学会自己调参的能力。在接触到没见过的任务或者迁移到新环境中时,可以根据之前学习到的经验知识和少量的新样本的已有“知识”的基础上快速学习如何应对。元学习能解决的任务可以是任意一类定义好的机器学习任务,如监督学习,强化学习等。例如:

  • 让 Alphago 迅速学会下象棋;
  • 让一个猫猫图片分类器,在仅看过少量狗勾的图片以后,迅速具有分类猫狗图片的能力;

  我们期望好的元学习模型能够具备强大的适应能力泛化能力。在模型进行测试之前,模型会先经过一个自适应环节(Adaptation Process),即根据少量样本学习任务。经过自适应后,模型即可完成新的任务。自适应本质上来说就是一个短暂的学习过程,这就是为什么元学习也被称作“学会”学习。

需要注意的是,虽然元学习同样有“预训练”的思想,但是元学习的内核会有别于迁移学习(Transfer Learning),我们将在下文进行详细探讨。

元学习目前有三种常见的实现方法:

  1. 训练以快速学习为目标的模型(基于优化的方法);
  2. 学习有效的距离度量方式(基于度量的方法);
  3. 使用带有显式或隐式记忆储存的(循环)神经网络(基于模型的方法)。

为了让大家更容易理解,我们尝试通过对比已经熟知的机器学习与元学习这两个概念的要素来加深理解:

方法 目的 输入 函数 输出 训练流程
Machine Learing 通过训练数据,学习输入 x x x 与输出 y y y 之间的映射,找到函数 f f f x x x f f f y y y 1. 初始化 f f f​ 参数
2. 输入训练数据 < x , y > <x,y> <x,y>
3. 计算损失函数,优化 f f f​ 参数
4. 最终得到 y = f ( x ) y=f(x) y=f(x)
Meta Learing 通过大量训练任务 T T T​ 以及每个训练任务对应的训练数据 D D D​,找到函数 F F F​, F F F​ 可以输出一个可用于新任务的函数 f f f 大量训练任务 T T T 及其对应的训练数据 D D D F F F f f f 1. 初始化 F F F 参数
2. 输入大量训练任务 T T T 及其对应的训练数据 D D D
3. 得到 f = F ∗ f=F^* f=F
4. 在新任务中 y = f ( x ) y=f(x) y=f(x)

  我们知道在机器学习中,训练单位是一条数据,通过数据来对模型进行参数优化。数据分为训练集、测试集和验证集。而在元学习中,训练单位分层,第一层训练单位是任务,即训练元学习需要准备许多不同的任务来进行学习,第二层训练单位才是每个任务所对应的数据。 二者的目的都是找一个 Function \text{Function} Function,只是两个 Function \text{Function} Function 的功能和目的均不相同。机器学习中的 Function \text{Function} Function 直接作用于数据的特征与标签,寻找特征与标签之间的关联。而元学习中的 Function \text{Function} Function 是用于寻找适用于新任务的 Function : f \text{Function}:f Function:f f f f 才会作用于具体任务的本身,也即训练模型自己学习、自己解决问题。


图 15.1 火热的元学习

15.2 元学习名词解释

典型的元学习技术包括以下几个概念:

  • Task: 元学习通常将训练数据切分成一个个小的数据子集来训练 meta-learner。“task”的意思与多任务学习的“task”不同,是指元学习训练所使用的数据子集。
  • Support set & query set: 每个 task 分成 support set 和 query set 两个子集。Support set 对应于算法中的内部更新,query set 对应于算法中的外部更新。
  • Way: 是 class(类别)的别称。
  • Shot: 指的是每个类别的样本数量。例如:1-shot 指的并不是一共只有一个数据样本,而是每个类有 1 个样本。

图15.2 中展示了一个典型的 K-shot 的元学习方法的一般套路,其训练阶段的数据和测试阶段的数据包含不同的类别,而训练的每个 task 又被切分成 support set 和 query set 。并且在测试的时候,元学习同样是在 task 上面测,每个 task 测出的准确率,汇总求和后求整体的均值。


图 15.2 一个典型的元学习将数据切分成 task 训练,而每个 task 包含的 5 个分类不同,1-shot 是指每个分类只有一个样本。

15.3 元学习问题定义

15.3.1 元学习形式化

           \,\,\,\,\,\,\,\,\,\, 元学习本身很难定义,它已经以各种不一致的方式被广泛使用,甚至在当前的神经网络文献中也是如此。因此这里引用最新元学习综述 Meta-Learning in Neural Networks: A Survey [19] 的定义,介绍一种特定的定义和关键术语,旨在帮助理解大量文献。

❑ ❑ 传统的机器学习

           \,\,\,\,\,\,\,\,\,\, 我们知道在传统的监督机器学习中,有训练数据集 D = { ( x 1 , y 1 ) , … , ( x N , y N ) } \mathcal D = \{(x_1, y_1),…,(x_N, y_N)\} D={ (x1,y1)(xN,yN)},如 (输入图像,输出标签) 对。我们可以训练一个预测模型 y ^ = f θ ( x ) \hat{y}=f_{\theta }\left ( x \right ) y^=fθ(x) 参数化 θ θ θ ,通过求解:
θ ∗ = arg ⁡ min ⁡ θ L ( D ; θ , ω ) \theta^{*}=\arg \min _{\theta} \mathcal{L}(\mathcal{D} ; \theta, \omega) θ=argθminL(D;θ,ω)
其中 L \mathcal L L 是用于测量真实标签与 f θ ( ⋅ ) f_{\theta}(\cdot) fθ() 预测的标签之间的误差的损失函数。 通过评估具有已知标签的多个测试点来测量泛化能力。传统的机器学习假设是这种优化是针对每个问题 D \mathcal D D 从头开始执行的; 并且 ω \omega ω 是预先指定的。 然而, ω \omega ω 的规范会极大地影响性能指标,如准确性或数据效率。元学习试图通过学习学习算法本身来改进这些指标,而不是假设它是预先指定和固定的。 这通常是通过重新审视上述第一个假设并从任务分布中学习而不是从头开始来实现的。

❑ ❑ 元学习:任务分配观 我们前面说过元学习旨在通过学习“如何学习”来提高效果。具体来说,元学习的普遍思想是学习一种通用的学习算法,它可以跨任务进行泛化,理想情况下可以使每个新任务都比上一个任务学习得更好。我们在这里先简单地将任务 T \mathcal T T​ 定义为数据集 D \mathcal D D​ 和损失函数 L \mathcal L L​: T = { D , L } \mathcal T = \{\mathcal D,\mathcal L\} T={ D,L}​,数据集中包括特征向量 x x x​ 和标签 y y y​ ,任务分布表示为 p ( T ) p(\mathcal{T}) p(T)​ 。则学习如何学习的学习目标可以表示为:
min ⁡ ω E T ∼ p ( T ) L ( D ; ω ) \min _{\omega} \underset{\mathcal{T} \sim p(\mathcal{T})}{\mathbb{E}} \mathcal{L}(\mathcal{D} ; \omega) ωminTp(T)EL(D;ω)
其中 L ( D ; ω ) \mathcal L(\mathcal D;\omega) L(D;ω) 为用于测量在数据集 D \mathcal D D 上使用 ω \omega ω 训练的模型的性能的损失函数。“如何学习”的知识(参数) ω ω ω 通常被称作跨任务知识 (across-task knowledge) 或元知识 (meta-knowledge)。 简而言之,我们希望能够学到一个通用的参数 meta-knowledge: ω \omega ω,使得不同的 task 的 L \mathcal L L 损失函数都越小越好。

           \,\,\,\,\,\,\,\,\,\, 为了在实际中解决这个问题,我们通常假设访问一组从 p ( T ) p(\mathcal{T}) p(T) 中抽取的源任务,并用这些源任务学习 ω ω ω

           \,\,\,\,\,\,\,\,\,\, 类似于传统的机器学习,meta learning 同样分为 Meta-train 和 Meta-test 两个阶段。形式上,我们将 Meta-train 阶段使用的使用的 M M M 个源任务 (source tasks) 集表示为 D source = { ( D source  train  , D source  val  ) ( i ) } i = 1 M D^{\text{source}}=\left\{\left(\mathcal{D}_{\text {source }}^{\text {train }}, \mathcal{D}_{\text {source }}^{\text {val }}\right)^{(i)}\right\}_{i=1}^{M} Dsource={ (Dsource train ,Dsource val )(i)}i=1M,其中每个任务都有训练和验证数据。通常,源序列和验证数据集分别称为支持集 (support set) 和查询集 (query set) (或者预测集 (prediction set))。我们通过采样大量的源任务来学习 meta knowledge (也即最大化它的最大似然估计):
ω ∗ = arg ⁡ max ⁡ ω log ⁡ p ( ω ∣ D source  ) \omega^{*}=\arg \max _{\omega} \log p\left(\omega \mid \mathscr{D}_{\text {source }}\right) ω=argωmaxlogp(ωDsource )
           \,\,\,\,\,\,\,\,\,\, 然后我们将元测试阶段使用的 Q Q Q 目标任务 (target tasks) 集合表示为 D target = { ( D target  train  , D target  test  ) ( i ) } i = 1 Q \mathcal D^{\text{target}}=\left\{\left(\mathcal{D}_{\text {target }}^{\text {train }}, \mathcal{D}_{\text {target }}^{\text {test }}\right)^{(i)}\right\}_{i=1}^{Q} Dtarget={ (Dtarget train ,Dtarget test )(i)}i=1Q,其中每个任务都有训练和测试数据。在 Meta-Testing 阶段,我们使用学习到的元知识对每个之前未见过的目标任务 task i \text{task}_i taski 的基础模型进行训练:
θ ∗ ( i ) = arg ⁡ max ⁡ θ log ⁡ p ( θ ∣ ω ∗ , D target  train  ( i ) ) \theta^{*(i)}=\arg \max _{\theta} \log p\left(\theta \mid \omega^{*}, \mathcal{D}_{\text {target }}^{\text {train }^{(i)}}\right) θ(i)=argθmaxlogp(θω,Dtarget train (i))
           \,\,\,\,\,\,\,\,\,\, 即 Meta-Testing 的目标就是基于已经学到的 Meta-Knowledge ( ω \omega ω) 来寻找当前任务 task i \text{task}_i taski 的最优参数 θ ∗ ( i ) \theta^*(i) θ(i) 。此时可以通过 θ ∗ ( i ) \theta^*{(i)} θ(i) 在每个目标任务 D target  test  ( i ) \mathcal{D}_{\text {target }}^{\text {test }(i)} Dtarget test (i) 的测试拆分上的表现来评估我们的元学习器 (meta-learner) 的准确性。

           \,\,\,\,\,\,\,\,\,\, 为了训练 Meta-Knowledge ,meta learning 提出了两种常用的做法:双层优化观 (Bilevel Optimization View) 和 前馈模型观 (Feed-Forward Model View)。

❑ ❑ 元学习:双层优化观(Bilevel Optimization View)

双层优化观(Bilevel Optimization View)是指一个层次优化问题,其中一个优化包含另一个优化作为约束[25],[43]。我们知道正常训练模型的流程是先使用 train set 训练,然后再使用 test/val set 测试。因此,在 Meta-training 的过程中,我们可以构造两层优化过程,在 inner-loop 即内层中使用 train set 更新任务模型参数,然后在 outer-loop 基于更新后的模型对 meta-knowledge 进行优化。双层优化的元训练可以表示为:
ω ∗ = arg ⁡ min ⁡ ω ∑ i = 1 M L meta  ( θ ∗ ( i ) ( ω ) , ω , D source  val  ( i ) )  s.t.  θ ∗ ( i ) ( ω ) = arg ⁡ min ⁡ θ L task  ( θ , ω , D source  train  ( i ) ) \begin{aligned}\omega^{*} &=\underset{\omega}{\arg \min } \sum_{i=1}^{M} \mathcal{L}^{\text {meta }}\left(\theta^{*(i)}(\omega), \omega, \mathcal{D}_{\text {source }}^{\text {val }(i)}\right) \\\text { s.t. } \theta^{*(i)}(\omega) &=\underset{\theta}{\arg \min } \mathcal{L}^{\text {task }}\left(\theta, \omega, \mathcal{D}_{\text {source }}^{\text {train }(i)}\right)\end{aligned} ω s.t. θ(i)(ω)=ωargmini=1MLmeta (θ(i)(ω),ω,Dsource val (i))=θargminLtask (θ,ω,Dsource train (i))
其中 L meta \mathcal L^{\text{meta}} Lmeta​ 和 L task \mathcal L^{\text{task}} Ltask​ 分别指外部的目标损失函数和内部的目标损失函数,如交叉熵在少样本分类的情况下。双层范式的一个关键特征是内外层的主从不对称:内层优化 E q . 5 Eq.5 Eq.5​ 是以外层定义的学习策略 ω ω ω​ 为条件的,但在训练过程中不能改变 ω ω ω​。

训练过程如下图所示:


图 15.3 双层优化(图片来源 [26])

  

假设我们已经找到了最优的 meta knowledge,那么意味着我们使用 train set 优化模型得到的参数也是最优的。

注意在上述元训练的形式化中我们使用了在任务上分布的概念,并使用了来自该分布的 M M M​ 个任务样本。虽然这一步骤的效果显著,且广泛应用于元学习文献之中,但它不是元学习的必要条件。更正式地说,如果给我们一个单独的训练和测试数据集,我们可以分割训练集以获得验证数据,以便 D source  = ( D source  train  , D source  val  ) \mathscr{D}_{\text {source }}=\left(\mathcal{D}_{\text {source }}^{\text {train }}, \mathcal{D}_{\text {source }}^{\text {val }}\right) Dsource =(Dsource train ,Dsource val )​ 用于元训练,对于元测试,我们可以使用 D target  = ( D source  train  ∪ D source  val  , D target  est  ) \mathscr{D}_{\text {target }}=\left(\mathcal{D}_{\text {source }}^{\text {train }} \cup \mathcal{D}_{\text {source }}^{\text {val }}, \mathcal{D}_{\text {target }}^{\text {est }}\right) Dtarget =(Dsource train Dsource val ,Dtarget est )​ 。虽然元训练中通常使用不同的训练值分割,但我们仍然可以多次学习 ω ω ω​,此时认为 M = Q = 1 M=Q=1 M=Q=1​​。

BiLevel Optimization 的思想非常重要,几乎所有的 meta learning 问题都可以套用。

❑ ❑ 元学习:前馈模型观 (Feed-Forward Model View)

在元学习几十年来的发展过程中,有许多元学习方法以 前馈 的方式来合成模型,而不是像上面的 E q . 4   &   E q . 5 Eq.4\ \&\ Eq.5 Eq.4 & Eq.5​​ 那样通过显式的迭代优化。 因为 BiLevel Optimization 的 inner-loop 中并不一定要用优化的方法,可以是任意的方式。即优化后的模型是可以通过 meta-knowledge 隐式的来表示:
min ⁡ ω E T ∼ p ( T ) ( D tr , D val ) ∈ T     ∑ ( x , y ) ∈ D val [ ( x T g ω ( D tr ) − y ) 2 ] \min _{\omega} \underset{\underset{\left(\mathcal{D}^{\text{tr}}, \mathcal{D}^{\text{val}}\right) \in \mathcal{T}}{\mathcal{T} \sim p(\mathcal{T})}}{\mathbb{E}}\ \ \ {\sum_{(\mathbf{x}, y) \in \mathcal{D}^{\text{val}}}\left[\left(\mathbf{x}^{T} \mathbf{g}_{\omega}\left(\mathcal{D}^{\text{tr}}\right)-y\right)^{2}\right]} ωmin(Dtr,Dval)TTp(T)E   (x,y)Dval[(xTgω(Dtr)y)2]
其中 g ω ( D tr ) \mathbf{g}_{\omega}(\mathcal D^{\text{tr}}) gω(Dtr)​ 为基于 meta knowledge 和 train set 得到的隐式模型。

这里通过优化任务分布来进行元训练。对于每项任务,都会拆分为一个训练集和一个验证集。 训练集 D tr \mathcal D^{\text{tr}} Dtr 被嵌入到一个向量 g ω \mathbf g_{\omega} gω 中,该向量定义了线性回归权重以从验证集中预测示例 x \mathbf x x。通过训练函数 g ω \mathbf g_{\omega} gω 优化 E q . 6 Eq.6 Eq.6 的 ‘learns to learn’。 将训练集映射到权重向量。我们期望从 p ( T ) p(\mathcal T) p(T) 中提取的新的元测试任务 T te \mathcal T^{\text{te}} Tte 也可以在 g ω \mathbf g_{\omega} gω 得到一个较好的预测。该系列中的方法因所使用的预测模型 g \mathbf g g 的复杂性以及支持集的嵌入方式而异(例如,通过池化层、CNN 层 或 RNN 层等)。这些模型也被称为 amortized,因为学习新任务的成本通过 g ω ( ⋅ ) \mathbf g_{\omega}(\cdot) gω() 减少到前馈操作,在 ω \omega ω 的元训练期间已经进行了迭代优化。

15.3.2 简单示例

           \,\,\,\,\,\,\,\,\,\, 我们现在假设有一个任务的分布,我们从这个分布中采样了许多任务作为训练集。一个好的元学习模型在这个训练集上训练后,应当对这个空间里所有的任务都具有良好的表现,即使是从来没见过的任务。每个任务可以表示为一个数据集 D \mathcal{D} D ,数据集中包括特征向量 x x x 和标签 y y y ,分布表示为 p ( D ) p(\mathcal{D}) p(D) 。那么最佳的元学习模型参数可以表示为:

θ ∗ = arg ⁡ min ⁡ θ E D ∼ p ( D ) [ L θ ( D ) ] \theta^* = \arg\min_\theta \mathbb{E}_{\mathcal{D}\sim p(\mathcal{D})} [\mathcal{L}_\theta(\mathcal{D})] θ=argθminEDp(D)[Lθ(D)]

           \,\,\,\,\,\,\,\,\,\, 少样本学习(Few-shot classification) 是元学习的在监督学习中的一个实例。数据集 D \mathcal{D} D 经常被划分为两部分,一个用于学习的支持集(support set) S S S ,和一个用于训练和测试的预测集(prediction set) B B B ,即 D = ⟨ S , B ⟩ \mathcal{D}=\langle S, B\rangle D=S,BK-shot N-class 分类任务,即支持集中有 N N N 类数据,每类数据有 K K K 个带有标注的样本。


图 15.4 4-shot 2-class 图像分类的例子。 (图像来源 https://www.pinterest.com/)

  

           \,\,\,\,\,\,\,\,\,\, 一个数据集 D \mathcal{D} D 包含许多对特征向量和标签,即 D = { ( x i , y i ) } \mathcal{D} = \{(\mathbf{x}_i, y_i)\} D={ (xi,yi)} 。每个标签属于一个标签类 L \mathcal{L} L 。假设我们的分类器 f θ f_\theta fθ 的输入是特征向量 x \mathbf{x} x ,输出是属于第 y y y 类的概率 P θ ( y ∣ x ) P_\theta(y\vert\mathbf{x}) Pθ(yx) θ \theta θ 是分类器的参数。

           \,\,\,\,\,\,\,\,\,\, 如果我们每次选一个 B ⊂ D B \subset \mathcal{D} BD 作为训练的 batch ,则最佳的模型参数,应当能够最大化,多组 batch 的正确标签概率之和。

θ ∗ = arg ⁡ max ⁡ θ E ( x , y ) ∈ D [ P θ ( y ∣ x ) ] θ ∗ = arg ⁡ max ⁡ θ E B ⊂ D [ ∑ ( x , y ) ∈ B P θ ( y ∣ x ) ] ; trained with mini-batches. \begin{aligned} \theta^* &= {\arg\max}_{\theta} \mathbb{E}_{(\mathbf{x}, y)\in \mathcal{D}}[P_\theta(y \vert \mathbf{x})] &\\ \theta^* &= {\arg\max}_{\theta} \mathbb{E}_{B\subset \mathcal{D}}[\sum_{(\mathbf{x}, y)\in B}P_\theta(y \vert \mathbf{x})] & \scriptstyle{\text{; trained with mini-batches.}} \end{aligned} θθ=argmaxθE(x,y)D[Pθ(yx)]=argmaxθEBD[(x,y)BPθ(yx)]; trained with mini-batches.

           \,\,\,\,\,\,\,\,\,\, 少样本学习的目标是,在小规模的 support set 上 “快速学习”(类似fine-tuning (微调技巧) )后,能够减少在 prediction set 上的预测误差。为了训练模型快速学习的能力,我们在训练的时候按照以下步骤:

  1. 采样一个标签的子集, L ⊂ L L\subset\mathcal{L} LL .
  2. 根据采样的标签子集,采样一个 support set S L ⊂ D S^L \subset \mathcal{D} SLD 和一个 training batch B L ⊂ D B^L \subset \mathcal{D} BLD S L S^L SL B L B^L BL 中的数据的标签都属于 L L L ,即 y ∈ L , ∀ ( x , y ) ∈ S L , B L y \in L, \forall (x, y) \in S^L, B^L yL,(x,y)SL,BL .
  3. 把 support set 作为模型的输入,进行“快速学习”。注意,不同的算法具有不同的学习策略,但总的来说,这一步不会永久性更新模型参数。
  4. 把 prediction set 作为模型的输入,计算模型在 B L B^L BL 上的 loss,根据这个 loss 进行反向传播更新模型参数。这一步与监督学习一致。

你可以把每一对 ( S L , B L ) (S^L, B^L) (SL,BL) 看做是一个数据点。模型被训练出了在其他数据集上扩展的能力。下式中的红色部分是元学习的目标相比于监督学习的目标多出来的部分。

θ = arg ⁡ max ⁡ θ E L ⊂ L [ E S L ⊂ D , B L ⊂ D [ ∑ ( x , y ) ∈ B L P θ ( x

强化学习中的Q-learning算法是一种基于计算打分的学习方法,可以优化决策和行动。将Q-learning算法与深度学习相结合可以提高模型的性能和准确度。 一种常见的结合方式是使用深度神经网络(DNN)作为Q-table的替代品来保存Q-values,这种方法被称为Deep Q-Networks(DQN)。DQN将状态空间映射到一个高维空间中,并且使用神经网络的高容量、非线性及端到端学习来获得更准确的Q-values。 下面是一个简单的DQN的实现: 1. 首先是定义神经网络模型 ``` class DeepQNetwork: def __init__(self, observation_space, action_space, learning_rate=0.01, gamma=0.9, epsilon=0.9, epsilon_min=0.01, epsilon_decay=0.995): self.observation_space = observation_space self.action_space = action_space self.learning_rate = learning_rate self.gamma = gamma self.epsilon = epsilon self.epsilon_min = epsilon_min self.epsilon_decay = epsilon_decay self.memory = deque(maxlen=2000) self.model = self.build_model() def build_model(self): model = Sequential() model.add(Dense(24, input_dim=self.observation_space, activation='relu')) model.add(Dense(24, activation='relu')) model.add(Dense(self.action_space, activation='linear')) model.compile(loss='mse', optimizer=Adam(lr=self.learning_rate)) return model ``` 2.定义算法过程 ``` def run_dqn(agent, env, episodes=1000, batch_size=32): scores = [] for ep in range(episodes): state = env.reset() score = 0 for time_step in range(500): action = agent.act(state) next_state, reward, done, info = env.step(action) agent.remember(state, action, reward, next_state, done) if len(agent.memory) > batch_size: agent.replay(batch_size) score += reward state = next_state if done: break agent.update_epsilon_decay() scores.append(score) print('Episode: {} Score: {} Epsilon: {:.4f}'.format(ep,score, agent.epsilon)) return scores ``` 3. 定义训练过程 ``` dqn_agent = DeepQNetwork(env.observation_space.shape[0], env.action_space.n,) scores = run_dqn(dqn_agent, env) ``` 通过以上代码实现了深度学习和Q-learning的结合,将两种算法相辅相成,取长补短,创造出更高效准确的算法模型。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

繁凡さん

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值