【论文理解】On Episodes, Prototypical Networks, and Few-shot Learning


前言

这是2020年NeurIPS的meta-learning workshop中的一篇oral presentatinon,论文代码被作者放在了github上:(论文作者仿佛是来自FIVE公司的)

代码链接
论文链接

这篇文章通过大量实验验证了在少样本学习中,episodic的元训练方式对于经典的少样本度量学习算法:Prototypes Network(PNs)及Matching Network是有害的作者通过引入Neighbourhood Component Analysis (NCA)方法,用实验验证了将用于元训练的base classes样本人为分成Support及Query set是不利的。

我也一直认为episodic的训练方式过于死板,有多余的超参数需要调节,比如训练时采用的FSL task的类别数、样本数等。但是本文用更加理论化的方式解释了episodic training的缺点,并辅以实验数据。因此在这里记录下来,我认为这篇论文还是很有意义的~

本篇博文只对主要思想作简单介绍,要想深入了解具体实验结果及结论,大家还须阅读原文。


一、Episodic learning缺点

先简单回顾一下什么是episodic learning。在FSL算法中,大多采用元学习的方式,分为两个阶段:元学习及元测试。在元学习阶段会采用episodic learning的方式,即利用base classes人为构造出虚假的FSL-Task用于训练。训练目的是使网络能够解决类似的FSL task。通常将一个虚假的FSL task称为一个episode,将其整体看作一个训练样本。
具体可看这篇博文中的元学习部分。

缺点1:样本采样受限

(1)我们把一个episode中全部样本看作一个训练batch, 这种学习方式,使得一个batch中的样本来自于人为构造的一个类别数固定的episode,而不是在全部训练样本中随机选择出来的。这相当于对于在batch采样时加了限制,可能不利于训练。

(2)同时episodic training有可能出现在训练过程中有样本未被采样出来的情况,如此便浪费了一部分样本。

不过,作者用实验证明这个缺点无伤大雅,对算法性能基本无影响,真正有害的是下面的缺点。

缺点2:忽略了大量“关系”

以PNs举例,在该算法中,通过度量每个query图像和class prototype的距离来分类,将其分到距离最近的一类中去。
PNs的episodic training中损失函数如下:
在这里插入图片描述
(其中 c y c_y cy表示class prototype, f θ f_\theta fθ表示特征提取网络)

因此当采用episodic training方式时,只会计算虚假task中每个query和各类prototype的距离,而忽略了query样本之间、support样本之间的关系,如此就损失了很多信息。

如下图所示,一个batch中的图像被分割成S、Q两部分,每部分中图像之间的关系被忽略。

二、Neighbourhood Component Analysis (NCA)方法

NCA方法不是一个新算法,在2005年的 Neighbourhood components analysis. 就被提出,它的训练思想也是基于距离度量的,我们来看一下具体算法。

NCA算法

NCA算法用于特征提取网络的训练,目的是使同一类的图像特征接近,使不同类的图像特征互相远离。在训练过程中,像一般分类网络训练一样,随机选择训练样本构成batch,在训练一个epoch后,要使网络见到过所有的训练样本。

对于一个batch而言,NCA的损失函数如下:

在这里插入图片描述

z i z_i zi 就是对第 i i i 个样本提取到的特征,此损失函数不以分类为目的,其思想类似于自监督学习中的对比学习,为的是拉近一个batch中同一类样本特征的距离,拉远不同类样本特征距离。

这个损失函数和episodic training 的损失很像,但是它计算了一个batch中每两张之间的距离,而PNs中的损失函数只计算了query到每个class prototype的距离,其实相当于NCA利用了更多的样本关系。

NCA替代episodic的优势

前面说到NCA的损失函数囊括了每两张图像的距离,它(右侧)和PNs(左侧)的对比可以通过下图直观地展现出来:
在这里插入图片描述
很明显NCA利用的样本间关系更多,无论是正样本对(属于同一类的两个样本构成一个正样本对)还是负样本对(不属于同一类的两个样本构成一个负样本对)的数量都比episodic要多。

三、少样本分类

经过前面的训练过程后,我们要用获得的特征提取网络进行FSL图像分类,论文作者提出三种度量分类方式,并用实验验证了方式2最优。由于我们在特征维度进行度量,因此要先将task中所有图像经过特征提取网络获得特征,再进行下述度量。

  1. k-NN分类:这是最基本的一种距离度量分类方式,找到离query最近的k个support样本,取其中占比最大的类别作为query的预测结果。
  2. 1-NN分类:这就是PNs原始的分类方式,首先计算各类的prototypes(对support set的特征取均值),再计算query到各prototypes的距离,将其分到距离最小的一类中。
  3. Soft-assignments:这是和原NCA方法配套的分类方式,计算有些麻烦。对于每个query,计算它与每个support的 p p p值:
    在这里插入图片描述
    将属于同一类的support对应得 p p p值相加,结果作为query属于该类的 likelihood。最后选择 likelihood 最大的类作为分类结果。

四、实验结果

以下实验结果都是在5way-1shot / 5shots任务下获得的。

度量分类方式对比

在这里插入图片描述

训练样本采样方式对结果的影响

在这里插入图片描述
结果图中的前三行是在NCA方法下,对训练样本采样进行了各种限制(这些限制是模仿episodic training中的固有限制构造的)后的实验结果,可以看出这些限制对于实验结果基本无影响。

episode超参数对结果的影响

在这里插入图片描述
可以看出,在episodic training中,episode的超参数选择对于实验结果影响较大;并且在各种情况下,batchsize=512时结果都是最好的。

和其他FSL算法对比

在这里插入图片描述
可以看出NCA的训练方式确实能将PNs的性能提高很多,而且还省去了调节episode中超参数的麻烦。


总结

这篇论文显示了同样使用度量学习的方式解决FSL问题,在元训练时无需采用episodic的训练方式,使用NCA的方法可以取得更好的效果,可与当前最优算法比肩。在度量学习方法中,元训练的目的是获得优秀的特征提取器,陷于episodic方式是不利的,应该多寻找其他更好的方法。

其实,之前还出现过使用最简单的监督学习直接训练一个分类网络的做法,或者使用无监督学习的方法,这都是为了获取特征提取器用于FSL这个下游任务。episodic training并不是最优的方法~

当然,在教师-学生网络这种模式下的FSL算法中,episodic learning或许还是较优解。

  • 15
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Q-learning is a popular reinforcement learning algorithm used to solve Markov Decision Processes (MDPs). In Python, you can implement Q-learning using various libraries such as NumPy and TensorFlow. Here's a basic implementation of Q-learning in Python: ```python import numpy as np # Define the Q-learning function def q_learning(env, num_episodes, learning_rate, discount_factor, epsilon): # Initialize the Q-table num_states = env.observation_space.n num_actions = env.action_space.n Q = np.zeros((num_states, num_actions)) # Q-learning loop for episode in range(num_episodes): state = env.reset() done = False while not done: # Choose an action using epsilon-greedy policy if np.random.uniform() < epsilon: action = env.action_space.sample() else: action = np.argmax(Q[state]) # Perform the action and observe the next state and reward next_state, reward, done, _ = env.step(action) # Update the Q-table Q[state, action] += learning_rate * (reward + discount_factor * np.max(Q[next_state]) - Q[state, action]) state = next_state return Q # Example usage env = gym.make('your_environment') # Replace 'your_environment' with the name of your environment num_episodes = 1000 learning_rate = 0.1 discount_factor = 0.9 epsilon = 0.1 Q_table = q_learning(env, num_episodes, learning_rate, discount_factor, epsilon) ``` In this example, `env` represents the environment you want to train your agent on (e.g., a grid world). `num_episodes` is the number of episodes the agent will play to learn the optimal policy. `learning_rate` controls the weight given to the new information compared to the old information, while `discount_factor` determines the importance of future rewards. `epsilon` is the exploration rate that balances exploration and exploitation. Note that you need to install the required libraries (e.g., NumPy and gym) before running the code.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值