论文地址:Convolutional Sequence to SequenceLearning
代码地址:facebookresearch/fairseq
1. 为什么要选择 CNN 做机器翻译?
相比 RNN:
- CNN 能够并行处理数据,计算更高效;
- CNN 是层级结构,底层的CNN捕捉相聚较近的词之间的依赖关系,高层CNN捕捉较远词之间的依赖关系。
2. 模型
1. Position Embedding
输入为: x = ( x 1 , . . . , x m x_1, ..., x_m x1,...,xm)
词向量表示输入: w = ( w 1 , . . . , w m w_1, ..., w_m w1,...,wm) 其中 w j ∈ R f w_j \in R^f wj∈Rf, 词汇表为 D ∈ R V × f D \in R^{V \times f} D∈RV×f
位置信息: p = ( p 1 , . . . , p m p_1, ..., p_m p1,...,pm) 其中 p j ∈ R f p_j \in R^f pj∈Rf
输入最终表示向量: e = ( w 1 + p 1 , . . . , w m + p m w_1 + p_1, ..., w_m + p_m w1+p1,...,wm+pm) 其中 e j ∈ R f e_j \in R^f ej∈Rf
2. Convolutional Block Structure
encoder:
假设词向量的维数为 d 维
先把 e 做线性映射:
h i 0 = W e i + b ∈ R h h_i^0 = We_i + b \in R^h hi0=Wei+b∈Rh
把一次"卷积计算 + 非线性计算" 看做一个单元 Convolutional Block.
卷积计算: 对原输入进行卷积窗口大小为 k 的 2h个卷积核做卷积运算, 则每次卷积生成两列 h维的向量,以 k = 3 k=3 k=3为例 f i 1 = C o n v ( h i − 1 0 , h i 0 , h i − 1 0 ) ∈ R 2 h f_i^1 = C