wDAE论文阅读

215 阅读8分钟

title: 《Generating Classification Weights with GNN Denoising Autoencoders for Few-Shot Learning》论文阅读

tags: 小样本学习

summary: 文章关注分类权重生成,提出使用降噪自动编码器来生成分类器的权重。并且使用图神经网络实现了这个降噪自动编码机。

摘要

文章提出使用降噪自动编码器来生成分类器的权重。并且使用图神经网络实现了这个降噪自动编码机。本质上还是一种学习参数更新策略的元学习算法,使得模型参数能够根据在基础数据集上得到的模型和少量的新样本进行更新,在适应新任务的同时,且不会忘记旧任务。

定义分类器的网络结构分为两个部分:第一部分是特征提取器F(θ)F(·|\theta),θ是特征提取器的参数;第二部分是分类器C(w)C(·|w),w是分类器的参数,这是本文要关注的重点,它包括N个类别的权重向量,w=(wi)i=1Nw={(w_i)}_{i=1}^{N}。第一部分FF用于将输入的图像xx提取成一个特征向量z=F(xθ)z=F(x|\theta)。第二部分接收这个特征向量zz,利用权重ww来计算分类得分,得分最高的类别当然就是该模型最终预测的类别,[s1,...,sN]=[zTw1,...zTwN][s_1,...,s_N]=[z^Tw_1,...z^Tw_N]

作者假设,模型已经在基类NbsN_{bs}训练集 DtrbsD^{bs}_{tr}上训练过了,即模型能够识别基类中的样本(基类是和新类相对的概念)。从而对应于基类中的类别的权重向量就有了,它们的符号表示为:wbs=(wibs)i=1Nbsw^{bs}=(w^{bs}_i)^{N_{bs}}_{i=1}。这样我们的目标是来学习一个函数g(ϕ)g(·|\phi),给该函数输入基类的分类权重向量和一些新的训练数据,函数要能够输出一个新的分类权重向量,这个新的权重向量既能够用于基类数据的分类又能够用于新数据的分类。公式如下:

w=(wi)i=1N=Nbs+Nnv=g(Dtrnv,wbsϕ)(1)w=(w_i)^{N=N_{bs}+N_{nv}}_{i=1}=g(D^{nv}_{tr},w^{bs}|\phi)\tag{1}
Dtrnv=i=Nbs+1Nbs+Nnv(xk,i)k=1K(2)D_{tr}^{nv}=\cup_{i=N_{bs}+1}^{N_{bs}+N_{nv}}(x_{k,i})_{k=1}^{K}\tag{2}
Dtrbs=i=1Nbs(xk,i)k=1K(3)D_{tr}^{bs}=\cup_{i=1}^{N_{bs}}(x_{k,i})_{k=1}^{K}\tag{3}

其中 KK 表示每个类中训练样本的个数,kk表示第k个训练样本,ii表示第i个类。ϕ\phi是生成函数的待学习的参数。该权重生成函数是由一个降噪自动编码器组成的。降噪自动编码器由图神经网络实现的。它的输入包括新类的数据集和基类的权重。新类的数据集是在进行权重初始化的时候使用的,提取每个类中样本的特征,求出特征的平均值作为权重的初始值。基类的权重直接作为权重的初始值。

理论基础

梯度公式:

logp(w)w1σ2(r(w)w)(4)\frac{\partial logp(w)}{\partial w}\approx\frac{1}{\sigma^2}(r(w)-w)\tag{4}

我认为:可以将p(w)p(w)理解成目标函数,即我们想要最大化的对象,优化过程最重要的就是要用到梯度进行梯度下降或者梯度上升。右边的部分就是用于估计梯度式子。其中σ2\sigma^2是高斯噪声的方差,r(w)r(w)是降噪自动编码器,ww是输入的权重。利用这个式子可以估计梯度。

更新权重 当我们训练好了我们的降噪自动编码器就可以利用公式5进行梯度上升来更新权重了。下面最重要的问题就是权重初始值是如何获得的?基类的权重实际上是已知的。因此对于基类,权重的初始值就是这个已知值。而对于新类,它的权重初始值是用各个各个类别的样本的特征向量的平均值来替代(公式6)。

ww+ϵlogp(wDtr)w=w+ϵ(r(w)w)(5)w\leftarrow w+\epsilon*\frac{\partial logp(w|D_{tr})}{\partial w}=w+\epsilon*(r(w)-w)\tag{5}
wi={wibsif i is a base class1Kk=1KF(xk,iθ)otherwise(6)w_i=\begin{cases}w_{i}^{bs} & if\ i\ is\ a\ base\ class\\\frac{1}{K}\sum^{K}_{k=1}F(x_{k,i}|\theta) & otherwise\end{cases}\tag{6}

至此,权重生成函数首先利用公式6来生成初始权重,然后利用公式5来进行权重更新。在公式5中有一个重要的部分r(w)r(w),即降噪自动编码器,下面就介绍降噪自动编码器是如何实现的。

降噪自动编码机

给降噪自动编码器输入加入噪声的数据,它能够清理这些噪声,然后输出干净版本的数据。通过训练,降噪自动编码器能够学习数据的结构。

输入: 加噪的权重向量

输出: 干净的权重向量

本文使用的是基于episode[1]^{[1]}的训练方法。利用伪新类构建的数据集来训练DAE。所谓伪新类是指,这些类是从基类中抽取的一部分类,我们把它当做是新类,实际上,它并不是。伪新类中类的数量为N~nv\tilde{N}_{nv}。抽取完伪新类后,剩余的部分(N~bs=NbsN~nv\tilde{N}_{bs}=N_{bs}-\tilde{N}_{nv})继续作为基类。对伪新类中每个类抽取KK个样本作为训练数据集,每个类抽取MM个样本作为验证数据集。

对DAE输入加入高斯噪声的初始化的权重w~\tilde{w},DAE输出它重构出的权重w^\hat{w}。加噪过程见公式7.

w~={wi~+ϵ}i=1N~=N~bs+N~nvϵN(0,σ)(7)\tilde{w}=\{\tilde{w_i}+\epsilon\}^{\tilde{N}=\tilde{N}_{bs}+\tilde{N}_{nv}}_{i=1} \\ \epsilon\sim N(0,\sigma)\tag{7}

这里要注意的是,输入的w包含所有的基类(伪新类和剩余基类)的权重向量。因为他要对所有基类上的类别都进行计算分类得分。

损失函数

损失函数由两部分组成,一部分是DAE重构出的权重和已知的权重的差的均方值。另一部分是在验证集上计算出来的分类损失。该分类损失的核心部分仍然是交叉熵。见公式8

1Ni=1N~w^iwi2+1Mm=1Mloss(xm,ymw~)(8)\frac{1}{N}\sum_{i=1}^{\tilde{N}}||\hat{w}_i-{w}_i^{*}||^2+\frac{1}{M}\sum_{m=1}^{M}loss(x_m,y_m|\tilde{w})\tag{8}

是不是利用这个损失函数来计算梯度,然后更新降噪自动编码器的参数,也就是训练DAE。

图神经网络

构建图

GNN能够考虑到类之间的关系,因此作者选择使用GNN来实现DAE。图G=(V,E)G=(V,E)中的一个结点表示一个类。如果两个结点之间存在边,则表示这两个类具有很大的相似度。本文中,对每个结点都选择与它最相似的10个结点相连。通过两个类的权重向量的余弦相似度值来衡量两个类的相似程度。边的权值在余弦相似度值的基础上又加了一个softmax操作。这样就能够保证,与某个结点相连的10个边上的权值之和为1。第i个类(结点)的所有的邻居用N(i)={j,(i,j)E}\mathcal{N}(i)=\{j, \forall(i,j)\in E\}来表示。用h(l)=(hi(l))i=1Nh^{(l)}=(h_{i}^{(l)})_{i=1}^{N}来表示图中N个类在图神经网络第ll层计算出的特征向量。

图神经网络一般由两个函数组成:一个是聚集函数,用于从邻居结点上聚集信息;另一个是更新函数,综合考虑结点当前的状态,以及从邻居结点上聚集的信息来更新结点的状态。在本文中的聚集函数定义如公式9,更新函数定义如公式10

hN(i)(l)=AGGREGATE(hj(l),jN(i))(9)h_{\mathcal{N(i)}}^{(l)}=AGGREGATE(h_{j}^{(l)}, \forall j\in \mathcal{N(i)})\tag{9}
hi(l+1)=UPDATE(hi(l),hN(i)(l))(10)h_{i}^{(l+1)}=UPDATE(h_{i}^{(l)},h_{\mathcal{N(i)}}^{(l)})\tag{10}

聚集函数

输入: 与每个结点相邻的所有邻居结点的特征向量。 输出: 来自邻居结点信息向量的线性组合。

一般来说,聚集函数直接将来自邻居结点的信息向量进行线性组合,如公式11所示。

hN(i)(l)=jN(i)aijq(i)(hi(l),hj(l))(11)h_{\mathcal{N(i)}}^{(l)}=\sum_{j\in \mathcal{N(i)}}a_{ij}*q^{(i)}(h^{(l)}_{i}, h^{(l)}_{j})\tag{11}

在公式11中,q(i)(hi(l),hj(l))q^{(i)}(h^{(l)}_{i}, h^{(l)}_{j})就是用于计算来自邻居结点的信息向量。本文在实现qq函数的时候受到了关系网络的启发。首先将输入的两个向量分别在相同的全连接线性层(是不是就是说没用加激活函数的层)上进行计算,然后将计算之后的输出加在一块。之后再经过BatchNorm + Dropout + LeakyReLU来得到最终的消息向量。

更新函数

输入: 每个结点的第l层的特征向量以及聚集到的信息向量

输出: 第l+1层的特征向量

更新函数的具体工作原理如公式12

hi(l+1)=[hi(l);u(l)([hi(l);hN(i)(l)])](12)h_{i}^{(l+1)}=[h_{i}^{(l)};u^{(l)}([h_{i}^{(l)};h_{\mathcal{N(i)}}^{(l)}])]\tag{12}

更新函数的输入有两个向量,一个是从邻居结点上聚集到的信息hN(i)(l)h_{\mathcal{N(i)}}^{(l)},另一个是结点在前一层计算出的特征向量hi(l)h_{i}^{(l)}。它首先将这两个向量合并,然后在非线性的一个函数中进行传播,途经a fully connected linear layer + BatchNorm + Dropout + LeakyReLU + L2-normalization units。这个过程就是u(l)()u^{(l)}(·)的作用。计算出结果后再同hi(l)h_{i}^{(l)}合并作为新的特征向量。但是GNN的最后一层也就是预测层不同于之前的部分,它的计算公式如公式13

δwi,oi=[u(L1)([hi(L1);hN(i)(L1)])](13)\delta w_i, o_i=[u^{(L-1)}([h_{i}^{(L-1)};h_{\mathcal{N(i)}}^{(L-1)}])]\tag{13}

其中u(L1)u^{(L-1)}的结构是:a fully connected linear layer + L2 normalization units,这部分用于计算δwi\delta w_i;a fully connected linear layer + sigmoid unit,这部分用于计算oio_i。使用公式14来计算重构的权重,其中oio_i像一个控制门,来控制δwi\delta w_i的贡献。

w^i=wi+oiδwi(14)\hat{w}_i=w_i+o_i\odot \delta w_i\tag{14}

总览

  1. 首先构建基类和伪新类数据集。伪新类模拟了模型未见过的类别。
  2. 初始化权重向量,然后加入高斯噪声。对基类和伪新类都加噪。
  3. 将加噪的权重向量输入到降噪自动编码机中(图神经网络),让降噪自动编码器输出重构的权重向量。
  4. 计算损失。一部分是重构的权重和已知权重的差别,一部分是利用重构的权重预测伪新类得到的损失。
  5. 利用这个损失来计算梯度,完成自动编码器的训练。
  6. 利用训练好的自动编码器来进行梯度上升,生成权重。