【元学习】reptile数学推导

文章提供两个有关 reptile 工作过程的解释:

  1. leading order expansion of the update

这部分我们会使用泰勒展开去近似 reptile 和 MAML 的更新过程。接下来我们将会看到两种算法都包括同样的两个组成部分:第一项负责最小化期望损失,第二项负责最大化任务内的泛化,具体来讲就是如果来自不同 batch 的梯度的点积为正值,那么在这个 batch 的表现提高同样也会提高另一个 batch 的表现,否则一个提高一个下降最后的结果就会为负,这样就变相的相当于是提高了针对给定任务的学习速度。这两项类似于我们在开头提到的MAML 的两次求导,第一次求导是针对各个任务分别进行参数更新,第二次求导是针对模型总的损失函数的求导,目的就是使得模型对各个任务都有较好的效果,又不会过于偏向于某个特定任务。

不同于 MAML 中的分析方法,这里不再区分训练集和测试集,仅仅假设每个任务提供 k 个损失值 L_{1,...,k} ,例如:基于不同 minibatches 的分类损失。

推导过程中使用如下定义:

首先计算 SGD 梯度:

接下来,计算 MAML 梯度。定义 U_{i} 为更新参数向量的操作:

U_{i}(\phi )=\phi-\alpha L_{i}^{'}(\phi )

将其展开:

为了方便说明,考虑 k=2 的情况:

第一项就是直接套公式(24);第二个公式 FOMAML 只考虑最后的一步梯度,即 公式(16);第三个公式就直接套 FOMAML 和 (24)公式得到。

当基于 minibatch 抽样对各个 batches 的梯度取期望的时候,也就是内部的各个 minibathces 得到各自的梯度之后,要以什么样的方式反馈给外部一个总的结果,这里是取期望也就是一种平均计算。计算之后有两部分会被剩下,称其为 AvgGrad & AvgGradInner。

下面的推导会涉及的符号:

E_{\tau ,1,2[...]}

表示基于任务\tau 的 minibatches 取期望,两个 minibatch 分别定义了  L_{1},L_{2}

AvgGrad:

AvgGradInner:

总的来说,第一个平均梯度的作用是减少总体任务的损失(取负值 -AvgGrad),第二个平均内部梯度的作用是增加给定任务的不同 minibatch 的梯度的内部点积,进而提高任务内的泛化能力(因为只有不同的梯度方向近似的时候点积结果才会更大,期望也才会更大)

最终得到下面的 meta-gradient 的表示,对于 k=2 的随机梯度下降损失:

所以实际就是,上述的三个梯度表示都是首先使得任务的期望损失最小化,之后更高阶的 AvgGradInner 通过最大化给定任务的内部点积加速学习进程。

最后,还可以将 k =2 的情形扩展:

可以看到三者AvgGradInner与AvgGrad之间的系数比的关系是:MAML > FOMAML > Retile。这里作者并没有针对这个系数对模型具体有什么影响做进一步的讨论,我们可以看到这个比例与步长α,迭代次数k 正相关。注意上述推导利用的泰勒展开只有在αk 很小时才成立。

2. finding a point near all solution manifolds

第二种解释是假设 reptile 收敛于解 \phi ,这个解在欧式空间靠近每个任务最优解的曲线,这样才能更快的让每个任务实现收敛。让 \phi  定义为网络的初始化,  W_{\tau }定义为任务\tau的最优参数集,我们的目标就是找到一个 \phi ,对于所有任务来说距离  D(\phi ,W_{\tau })都很小:

期望的梯度为:

每次 reptile 的迭代,都是抽样一个任务  \tau,执行一次随机梯度下降:

实际应用中,我们不能准确的计算 P_{W_{\tau }}(\phi ) ,其为  L_{\tau } 的最小值,即找到最短的映射就是将损失降到最小。虽然不能准确计算,但是我们可以使用梯度下降在某种程度上最小化这个损失。因此,在 reptile 中我们使用基于损失值从初始值 \phi  开始的k 步梯度下降的结果代替 W_{\tau }^{*}(\phi ) 。

注意:红色为不理解的地方,有理解的,可以私信或留言区交流

### Reptile算法简介 Reptile 是一种基于梯度下降的元学习算法[^2]。该算法旨在通过在多个任务上的训练,找到一种初始化参数配置,使模型能够在遇到新任务时迅速收敛并表现良好。 #### 核心思想 核心理念在于调整初始权重向量的方式:不是直接最小化某个特定目标函数,而是通过对一系列随机选取的任务执行标准梯度下降,并逐步将最终得到的权重拉回到起始位置附近。这种策略有助于发现那些能促进快速适应的新起点[^1]。 #### 计算流程 具体来说,在每次迭代过程中: - 随机抽取一个小批量的任务; - 对于每个任务,应用几轮常规的小批次SGD更新(即内部循环),这期间不涉及任何有关其他任务的信息交换; - 更新后的参数会朝着原始状态收缩一定比例的距离,形成新的全局共享参数作为下一轮迭代的基础。 此过程重复多次直到满足停止条件为止。值得注意的是,由于只涉及到一阶导数运算,因此相比于同样流行的MAML方法而言,Reptile具有更低的时间开销以及更少的空间需求[^4]。 ```python def reptile_step(model, tasks, step_size=0.01): initial_weights = model.get_weights() for task in tasks: # Perform several gradient descent steps on the current task (inner loop) for _ in range(inner_steps): batch_x, batch_y = get_random_batch(task) gradients = compute_gradients(model, batch_x, batch_y) apply_gradients(model, gradients) updated_weights = model.get_weights() # Move back towards original weights but not exactly there (outer update) new_weights = [(w_i + (step_size * (w_u - w_i))) for w_i, w_u in zip(initial_weights, updated_weights)] set_model_weights(model, new_weights) ``` 上述伪代码展示了单次reptile步骤的主要逻辑结构。其中`model`代表待训练的学习器;`tasks`是一组用于本次迭代的任务集合;`get_random_batch`, `compute_gradients`, 和 `apply_gradients` 函数分别负责获取数据样本、计算损失相对于参数变化率以及据此修改权值矩阵的操作;最后一步则是按照指定的比例混合旧有与最新获得的状态以完成一次完整的meta-update周期。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值