Processing math: 44%

卷积序列模型

使用长短时期记忆(LSTM)用于序列模型取得了很好的效果,在2017年由Facebook提出了使用卷积神经网络构建Seq2Seq模型 [1]。循环神经网络通过窗口移动方式输入数据进行训练,当句子有 n 个窗口时,获得对应的特征表示的时间复杂度为 O(n)。而使用卷积神经网络进行并行化计算,当卷积核宽度为 k ,其时间复杂度为 O(nk)

Encoder结构

我们采用一维卷积对序列进行处理,假设输入序列长度为 T,卷积核宽度为 f,边缘为 p,则输出宽度为 T+2pf+1

源句子的最大序列长度为 T, 目标句子的最大序列长度为 T,批次大小为 B,词向量大小为 E, 源语言词汇数量为 V,目标语言词汇数量为 V,第一层卷积的通道数为 C

  1. 整个句子的词向量为 XembRT×B×E

  2. 输入卷积层之前,要先通过一个线性层将维度规范到 $$XRT×B×C,同时对维度做一个转置 XRB×C×T

  3. 卷积块带有残差结构 (residual),所以计算下一个卷积块之前保留一份残差 RX

  4. 在卷积计算时,我们不希望边缘向量产生影响,所以构造一个遮罩矩阵,将 pad 位置值设为0,

Unexpected text node: '  '

转置和扩充维度 maskRB×C×T,把边缘值的通道设为0,XXmask

  1. 然后把 X 输入到一维卷积中 X,这里指定输出通道是输入通道的2倍,而采用Same Convolution,所以序列长度不变

  2. 我们使用门控线性单元(Gated Linear Units)对卷积块的输出进行计算 [2],输出后通道数减半,

\begin{align} & X \overset{split}{\rightarrow}A,B \in \mathbb{R}^{B \times C \times T} \\ & X = A \circ \sigma(B) \end{align}

  1. 加上残差,XX+R\large X \leftarrow X + R;更新残差 RX\large R \leftarrow X

  2. X\large X 输入到下一卷积块,即下一层

  3. 从最后一个卷积块输出后,再经过线性层得到 ORB×T×E\large O \in \mathbb{R}^{B \times T \times E}

  4. 除了 O\large O 外,还要输出一个向量用于注意力计算 UO+embT\large U \leftarrow O + emb^T

卷积块的计算过程如图所示:(图是我自己画的,如有错误请指出)

Decoder结构

Decdoer前面的结构基本与encoder一致,不同处有三个,

  1. decoder的卷积层边缘 padding 设置为 kernel_size - 1。当输出时,我们去掉序列最后的 padding 个,以保持输入输出序列相同。这么做是为了确保当前信息不会受未来信息的影响

  2. 上述 (5) 计算完GLU后,还要输入到注意力层进行计算,注意力层输出后接上 (6)

  3. 上述 (8) 后再经过一个线性层得到对所有词汇的得分矩阵 XRT×B×V\large X \in \mathbb{R}^{T' \times B \times V'}

注意力层结构

注意力层接收decoder的隐藏状态,目标序列词向量,encoder的输出。

  1. 保留一个残差 RX\large R \leftarrow X ,结合decoder的隐藏状态和目标序列词向量,XWTX+embt,  XRB×T×E\large X \leftarrow W^TX + emb_t ,\; X \in \mathbb{R}^{B \times T' \times E}

  2. 再与encoder的输出计算注意力得分矩阵 AXO,  ARB×T×T\large A \leftarrow X * O,\; A \in \mathbb{R}^{B \times T' \times T}

  3. 我们不需要 pad\large \langle pad \rangle 的产生注意,所以把 pad\large \langle pad \rangle 位置的得分都设置为负无穷

  4. 通过softmax对 A\large A 计算注意力分布,得到对齐矩阵 Asoftmax(A)\large A \leftarrow softmax(A)

  5. 论文中提到,对于注意力的输出,我们还需要计算一个conditional vector,CoAU,  CoRB×T×E\large Co \leftarrow A * U,\;Co \in \mathbb{R}^{B \times T' \times E}

  6. 最后加上残差后输出 XWTX+R,  XRB×C×T\large X \leftarrow W^TX + R,\; X \in \mathbb{R}^{B \times C \times T'}

不同于RNN中所有时间步共享一个注意力层,这里的每一个卷积层后面都是一个独立的注意力层,当你有10层卷积层,那么就有10个独立的注意力层。

位置向量(Position Embeddings )

为了让卷积网络在处理序列时有一种空间感,我们要对词向量加上一个位置向量 embemb+pos_emb\large emb \leftarrow emb + pos\_emb。其中 pos_emb\large pos\_emb 表示对于词汇在该句子的索引编号。

初始化策略

  1. 为了抑制加上残差导致数值持续变大而导致高方差,所以每次加上残差或者加上词向量后,都乘以 0.5\large \sqrt{0.5}
  2. 在获得词向量后和输入卷积块之前进行 p=0.1\large p=0.1 的dropout正则化
  3. 对于卷积块的参数初始化,我们指定其正态分布 N(0,4p/C)\large \mathcal{N}(0, \sqrt{4p/C}),其中乘以 p\large p 是为了抵消dropout时乘以的 1/p\large 1/p
  4. 线性层初始化参数符合 N(0,(1p)/N)\large \mathcal{N}(0, \sqrt{(1-p)/N})
  5. 词向量和位置向量在 [0,0.1]\large [0, 0.1] 之间均匀分布,并且 pad\large \langle pad \rangle 对应的词向量设为0

生成(Generation)

在训练时,我们可以一次性把整个目标句子输入到CNN中并行计算,不用像RNN中一步一步的输入,理论上的训练速度会有所提升,实际跑起来后会因为其中大量的注意力层会把训练速度拖慢。

在decoder生成预测序列时,我们需要以递进式的输入到CNN,需要输入 T(T1)2\large \frac{T(T-1)}{2} 次,而RNN逐个输入也就 T\large T 次,所以生成速度上,CNN明显要慢。论文中提出的解决方案是把前面序列的卷积参数保留下来,不用重复计算,但并没有详细讲要怎么做,实现起来貌似难度挺大的。

参考文献

Transformer模型与自注意力 循环神经机器翻译

Comments

No comment yet.
Powered By Valine
v1.5.2
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×