关于MAML的那些事

多余的元学习废话也不多说,直接上干货:

算法:
在这里插入图片描述
关于学习率:
两个学习率a、b,要知道,为了一步优化探测task最优参数的位置(inner loop),我们必须使用稍微大点的学习率a,这叫一步到位。
而优化你真正模型参数的学习率应该是很小的(outer loop),因为他必须在参数空间中经过漫长的迭代,慢慢找到最合适的位置。

关于损失函数:分类交叉熵,回归MSE

关于1阶和2阶的MAML:
首先,Nway K shot ,support set 和query set的知识就不介绍了。
在这里插入图片描述
看这个图,训练的过程中,在每一个task中(上面算法中的4-6),我们在support set 上由g1得到θm,在query set 上由θm得到loss,如果一个meta_batch(内循环)里面有多个task,我们是需要将这些task的loss求和,然后在外循环中更新模型参数(就是上面算法的第8步),此时φ0变为了φ1,然后一步一步走外循环的迭代。这是正向。

那求梯度呢?L1’(φ1) =L1’(φ0) * (φ1/φ0)’ ,这个两个导数相乘的就是2-order,而近似以后的L1’(φ0)就是1-order.
作者通过理论推导,证明了两种方法理论差距不是很大,但是1-order会快很多。

关于算法理解
一、 为什么我们要在训练集上更新一次参数,然后测试集的损失值传回外循环,进行下一步的更新?

1.如果只在训练集上更新损失值,那么无法合理利用测试集,相当于pretraining预训练。如果此时你直接反传,继续优化,你的model参数就沿着这个专一的任务越走越远了。
2.训练集数量较少,用于传损失值不具有参考性。(N way K shot 只约束了训练集的数量,并没有约束测试集的数量,按理说测试集的数量增加,对模型的性能会越好。)
3.在训练集上更新参数,其实是可以更新很多次的,但是为了简化运算量,因此我们只更新了一次。我们在训练集上更新一次参数,然后将测试集上的损失值传回,是因为我们要找的并不是使当前模型最优的参数,而是在进行梯度更新以后能够收敛到最优损失值的参数。即算法要根据训练集产生一个可以很好适应测试集的agent,这样经过多个任务的训练之后也就学会了快速学习的方法。

在这里插入图片描述
MAML的优点:
可用于小样本学习,快速适应
可以用于回归、分类和增强学习多种任务上。
MAML的缺点: 1.模型结构是固定的,在算法中,模型的图像输入尺寸也是一定的,因此泛化性不好。 2.任务可以不同,但是需要有一定的相关性 3.二次梯度可能不稳定 4. Robustness一般:不是说MAML的robustness不好,因为也是由一阶online的优化方法SGD求解出来的,会相对找到一个flatten minima location。然而这和非gradient-based meta learning方法求解出来的model的robust肯定是没法比的。