Kaiser, Lukasz, et al. “One Model To Learn Them All.” arXiv preprint arXiv:1706.05137 (2017).
概述
Google于2017年6月16日在arxiv上提交了这篇论文,甫一问世立刻引发各方关注。除了标题劲爆之外,本文的野心和气魄令人惊叹,实验也确实给出了一些相当有信息量的结果。
项目的github页面给出了基于tensorflow的源码,完成度一般。本文结合此源码讲解系统结构。
系统
问题
本文尝试用一个通用模型解决跨领域的各类人工智能问题,例如:
- 图像分类(图像 -> 类标)
- 看图说话(图像 -> 自然语言)
- 翻译(自然语言 -> 自然语言)
- 语义分割(自然语言 -> 分割+类标)
各领域输入输出的信息类别不同,在本文中称为不同形态(modality)。
这种向着大一统模型的努力并非本文首创,创新点如下:
工作 | 领域 | 任务 |
---|---|---|
以往文章 | 单一 | 多个 |
e.g. | 翻译 | 英翻法+英翻德 |
本文 | 多个 | 多个 |
e.g. | 翻译+图像分类 | 英翻法+英翻德+1000类分类 |
结构
为了适应不同形态的输入和输出,本文的网络被抽象成如下结构:
input
、output
:相同/不同形态的数据(例如图像和类标)。
source
、target
:系统内部的表达。
系统通过三个部分:modality_in
, modality_out
以及body
来完成数据流。
三大理念
- 绝大部分计算量都集中在
body
网络中,两个modality
网络设计尽量精简。 - 系统内部的表达(
target
,source
)尺寸不固定。 - 对于相同形态的不同问题(例如“看图说话”和“英翻德”的输出),使用相同的
modality
网络
以下分别介绍body
网络和modality
网络的具体结构。
body网络-模块
body
网络各部分都由三种基本模块(block)构成,以下一一介绍。
卷积模块Conv
子模块-ConvStep
SepConv
:分层卷积,类似这篇博客介绍过的Factorized卷积。有三个超参数:扩展d
,步长s
,核尺寸f
。
LayerNorm
: 分层归一化。
实现参见/models/common_layers.py中
conv_block_internal
函数/subseparable_conv_block
函数。
Conv
构成
使用上述子模块组成卷积模块Conv
:
主体结构是两个residual结构。最后虚线的dropout只在训练时使用。
实现参见/models/slicenet.py中
multi_conv_res
函数。
注意力模块Attention
在处理时间序列信号时,以往工作多采用RNN, LSTM类型系统。此类系统每一个时刻输出取决于前时刻记忆,天然地不利于并行计算,在训练时尤其耗时。
本文则利用Attention
模块,能够同时处理输入序列的各个元素。细节参考自同一团队的论文Attention is All You Need
1。
该文对应模型为/models/transformer.py
子模块-AddTiming
由于本文不再将时间序列顺序输入系统,所以需要额外告知系统每一元素在序列中的相对位置。
首先考虑1维信号 x x x,输入尺寸为 L × D L\times D L×D。
对于 D D D个通道,按照指数坐标均匀设置从 2 π 2\pi 2π到 10000 ⋅ 2 π 10000\cdot 2\pi 10000⋅2π的周期,共有 D / 2 D/2 D/2个采样: T 0 , T 1 . . . T D / 2 − 1 T_0, T_1...T_{D/2-1} T0,T1...TD/2−1。
每通道的时间信号为上述波长的正弦/余弦,其自变量范围为 [ 0 , L − 1 ] [0,L-1] [0,L−1](e.g. D=12, L=128):
得到的时间信号和输入信号尺寸相同,直接相加。