seq2seq

基于attention的seq2seq

可视化过程

基于transformer的seq2seq

结构

深入分析

流程:编码器输入数据处理->编码器运行->解码器输入数据处理->解码器运行->分类head

编码器输入数据处理

  • 单词嵌入:用向量来标记单词

  • 位置编码(positional encoding)

    • transfromer内部没有rnn,没有捕捉顺序序列的能力

    • 编码词向量时引入了位置编码position encoding向量来表示两个单词i和j之间的距离

      • 即在词向量中加入了单词的位置信息
    • 方法:

      1. 网络自动学习:

        1
        self.pos_embedding = nn.Parameter(torch.randn(1, N, 512))

        定义一个超参数,形状与输入嵌入一致,进行相加

      2. 自己定义规则

        Attention is all you need 中采用了sin-cos规则,具体做法是

        • 将向量(N,512)采用如下函数进行处理

        • pos即0~N,i是0-511
        • 将一个词向量中的512维度切分为奇数行(cos函数)和偶数行(sin函数)
        • 按照原始行号进行拼接
    • 代码:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      def get_position_angle_vec(position):
      # hid_j是0-511,d_hid是512,position表示单词位置0~N-1
      return [position / np.power(10000, 2 * (hid_j // 2) / d_hid)
      for hid_j in range(d_hid)]

      # 每个单词位置0~N-1都可以编码得到512长度的向量
      sinusoid_table = np.array([get_position_angle_vec(pos_i) for pos_i in range(n_position)])
      # 偶数列进行sin
      sinusoid_table[:, 0::2] = np.sin(sinusoid_table[:, 0::2]) # dim 2i
      # 奇数列进行cos
      sinusoid_table[:, 1::2] = np.cos(sinusoid_table[:, 1::2]) # dim 2i+1
    • 可视化