点击下面卡片,关注我呀,每天给你送来AI技术干货!
来自:朴素人工智能
前两篇关于meta learning的文章介绍了机器如何利用少量的现有类别的样本作为支持数据,并将一个新样本匹配为其中最接近的类别。
类比下,在你手头有很多不同动物的图片(比如猫狗牛羊兔等等),在当你拿到一张新的动物照片时,只需要去现有的图片库里比对,将其归类为长相最接近的动物,而无需靠记忆(参数)通过大量的各种动物的图片来学习动物特征,再来判断它的类别。
Meta Learning 1中提到了在实践中有2种不同的解决方案:metric-based和optimization-based。前面2篇推送已经详细介绍了metric-based的做法,本文继续介绍它。
Metric-based method,即基于度量的方法,分3步走:编码-归纳-求相似度。
编码,即将图片/文本等等原始状态的数据样本support samples转为浮点数值的向量表示sample vectors,即 support samples -> sample vectors。
归纳,则是将一种类别的所有支持样本的向量表示进行归纳总结,如求平均、求和等等方式,得到该类别的向量class vector表示,即 sample vectors -> class vector。
求相似度就是将输入的新样本编码后的向量query vector和前面归纳的类别向量class vectors进行比对,得到对应类别的相似度得分,即 class vector × query vector -> relation score。
文本分类领域,文章Few-Shot Text Classification with Induction Network提出了一种「归纳」的全新方法,不再是简单地将所有样本向量求和或者求平均,而是利用动态路由dynamic routing的方法得到类别向量。
1. 模型结构
InductionNet是由阿里团队提出的模型结构,用于少样本文本分类。模型结构有着清晰的三段式结构,包括:
Encoder | 支持样本的编码
Induction | 支持样本向量表示的归纳
Relation | query vector与class vectors求相似度
![](https://img-blog.csdnimg.cn/img_convert/223656d21acb9d9276b3c9bdd2056ffa.png)
1.1 Encoder模块
Encoder模块是比较常规的模块,即将文本内容转为浮点数编码。文章利用双向LSTM模型得到的特征拼接成 ,再经过线性变换和激活,得到权重 ,再乘上 向量求和得到加权的样本向量 。
1.2 Induction模块
Induction归纳模块,应用了动态路由(dynamic routing)来计算带权重的类别向量(class vector),其中利用了Capsule Network胶囊网络来对样本向量进行「归纳」。
胶囊网络是Sabour等人于2017年正式在文章Dynamic Routing Between Capsules中正式提出的。相比于普通的神经网络的标量神经元,胶囊使用的是向量神经元,可以用于记录局部的信息在整体中的方位信息。
在人脸识别的应用中,如果调换人脸图像中五官的相对位置,比如把眼睛和嘴巴的位置互换一下,传统的卷积神经网络CNN仍旧会将其识别为人脸,虽然面部的特征是齐全的,但相对位置是错乱的。这样的结果显然是不可以接受的。Hinton提到CNN中常用的pooling池化就是一个「错误」,因为它可能会导致重要的信息丢失。比如两只眼睛一只鼻子还有一张嘴巴并不代表一张脸,因为它没有保留原始的方位信息。
而胶囊网络,最小计算单元不再是每个神经元的输出标量,而是一组神经元输出的向量,即用于表征局部特征,比如「眼睛胶囊」、「鼻子胶囊」、「嘴巴胶囊」等等这些局部特征。多层的胶囊网络会利用动态路由逐层将低级特征映射至高级的特征,比如前面的眼睛/鼻子/嘴巴特征映射至高层的「脸胶囊」这种高级特征,且保留不同特征之间的相对位置、方向等信息,即可以得到局部在整体中的方位,从而判断一张图片是否是正常的人脸。
动态路由,就是将低层胶囊按照特定权重加权映射到上层的胶囊的一种方法,而其核心,其实是一种带权重加权的mean pooling。在InductionNet中具体的步骤如下:
上面的流程中,输入为支持样本(support sample)的向量表示 ,其中 代表类别, 代表样本编号。具体可以分为以下5步:
矩阵转化
对向量 进行矩阵变换。如果在图像的层面考察,相当于进行了图像的平移、缩放、旋转等变换操作。
输入加权
对类别 的对于各个样本的耦合参数(coupling coefficients) 进行softmax操作,得到权重 ,即为类别 中每一个样本 的权重系数。 的初始化值为0。
加权求和
用前面计算的权重系数 对类别 中的所有样本加权求和得到未激活的类别向量(class vector) 。
非线性激活
对上面的中间类别向量进行非线性激活操作,这个操作被称为squash,意为「压缩」,保持原有的向量的方向,但将向量的长度控制到0-1之间。胶囊网络中用向量的长度来表征其是否包含某个特征的概率。
参数更新
这一步是在更新耦合系数 ,可以看到如果第 个样本如果本身占权重很大,权重的更新会强化其主导地位。
到这里,经过多轮的迭代上述的流程,最终得到的 就是代表类别 的向量。
InductionNet中的胶囊网络中capsule的数目为1,是其在这篇文章中的特例应用,用于归纳类别中多个样本的类别向量(class vector)。即利用动态路由的方法对各个样本向量 加权求平均。
1.3 Relation模块
在得到类别向量 之后,将输入的query经过encoder模块得到 向量,再和各个 计算相关系数。
得到上面的相关性的向量之后,再计算得到相关性系数。
在得到query与各个类别向量 的相关性系数之后,再选择系数最大的 作为query的类别。
2. 总结
InductionNet介绍了一种根据知识库中的支持样本作为参考,将新的样本进行分类的做法。其中最重要的部分,就是利用动态路由的方法「归纳」各个支持样本的表征,得到类别的数值表征。
文本是基于度量的元学习方法的最后一篇。本系列的下一篇将会带来基于优化的元学习方法,敬请期待。
说个正事哈
由于微信平台算法改版,公号内容将不再以时间排序展示,如果大家想第一时间看到我们的推送,强烈建议星标我们和给我们多点点【在看】。星标具体步骤为:
(1)点击页面最上方“深度学习自然语言处理”,进入公众号主页。
(2)点击右上角的小点点,在弹出页面点击“设为星标”,就可以啦。
感谢支持,比心。
投稿或交流学习,备注:昵称-学校(公司)-方向,进入DL&NLP交流群。
方向有很多:机器学习、深度学习,python,情感分析、意见挖掘、句法分析、机器翻译、人机对话、知识图谱、语音识别等。
记得备注呦
点击上面卡片,关注我呀,每天推送AI技术干货~
整理不易,还望给个在看!