BiribiriBird's Gallery.

李宏毅机器学习L4 · Sequence as input

字数统计: 1.3k阅读时长: 5 min
2024/08/11
loading

L4. Sequence as input

ML 2022 Spring (ntu.edu.tw)

https://www.bilibili.com/video/BV1VN4y1P7Zj

Sequence

对于Sequence Labeling任务,我们需要对一段文本中的所有单词标注词性。

  • 显然不能单独考虑一个单词,需要结合上下文
    • 同一个单词在不同的上下文中会有不同的词性

image-20240810194910423

  • 我们考虑定义一个window:
    • 每个Fully-Connected需要连接前后若干个单词作为输入

image-20240810195115978

  • 但是我们有时需要考虑整个Sequence去获得信息,我们很难通过扩大Window进行操作,复杂度会非常高

Self-Attention

概述

  • 整个Sequence作为输入
  • 输出向量数量等于输入向量

image-20240810195453418

  • 每次完成Self-Attention后,喂入FC进行操作
  • 可以多次叠加

Dot-Product

我们会对多个输入向量之间的相关性感兴趣

Self-Attention常使用Dot-Product求出两个向量之间的相关性

image-20240810200023586

  • 两个输入query,key\text{query},\text{key}向量分别乘上Wq,WkW_q,W_k,得到向量q,kq,k
  • 对向量q,kq,k进行点积,得到α\alpha,同时也被称为attention-score

Forward

  • 对于其中一个向量ii,计算出自己作为查询向量的qiq_i

  • 所有向量都需要计算自己作为被查询向量的kjk_j

  • 通过Dot-Product,得到αi,j\alpha_{i,j},即向量ii对所有向量jj的相关性

  • 做一下Softmax,得到αi,j\alpha'_{i,j}

image-20240810201234380

  • 每个向量都需要通过WvW_v矩阵计算出向量vv

  • vjv_j乘上标量αi,j\alpha_{i,j},求和

  • bi=jαi,jvjb_i = \sum_{j} \alpha'_{i,j}v_j

image-20240810201306802

  • 关联性越高的向量,它会bb占有很大的成分

每个向量aia_i得到bib_i的计算过程是并行进行的

Forward(矩阵形式)

  • Wq,Wk,WvW_q,W_k,W_v都是通用的,每个向量aia_i都需要使用,因此很容易就能表示成矩阵形式

image-20240810202311607

  • 对于q1q_1,我需要让它与所有kjk_j进行点积运算
  • 实质上就是与kjTk_j^T进行相乘

image-20240810203013199

  • 对于其他qiq_i也是同理,计算得到矩阵AA
  • 通过矩阵AA,每一列过一遍激活函数(softmax)得到AA'

image-20240810203127438

  • 计算输出矩阵

image-20240810203438473

  • 整理一下:

O=VA=(WvI)softmax(A)O=(WvI)softmax(KTQ)=(WvI)softmax(ITWkTWqI)O = VA' = (W_vI)\text{softmax}(A) \\ O =(W_vI)\text{softmax}( K^TQ ) = (W_vI)\text{softmax}( I^TW_k^TW_qI ) \\

  • Wq,Wk,WvW_q,W_k,W_v则是我们需要学习的参数矩阵

Multi-head Self-Attention

一般的Self-Attention只会有一种WqW_q得到的一组qq向量,作为相关性的度量

但是有时候需要丰富多个相关性指标

image-20240810204713494

  • 得到的多类bib_i输出,拼起来乘一个矩阵,得到最后的输出

image-20240810204910126

Position Encoding

  • 对于a1,a2,a3,a4a_1, a_2, a_3, a_4,其对于上文算法来说,并没有距离的概念(交换位置后没什么差别)

  • 但对于实际文本来说,a1,a4a_1,a_4是距离较远的向量,a2,a3a_2,a_3是距离较近的向量

  • (需要分析一下位置对实际要的输出是有影响,才会考虑引入Position Encoding)

  • 在求解前,每个aia_i需要加入一个位置向量eie_i即可

image-20240810205438276

  • hand-crafted(人为设置):会使用一些三角函数进行组合
    • 方式非常多,暂时没有最好的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 好像自己写过这个东西
__global__ void cu_matrixPositionalEmbedding(float* d_C, float* d_A, int M, int N, int level) {
int idx = blockIdx.x * blockDim.x + threadIdx.x;
if (idx < M * N) {
int row = idx / N;
int col = idx % N;

int pos = row * N + col;
d_C[pos] = d_A[idx]; pos += M * N;

float powf2 = 1.0;
for (int l = 0; l < level; ++l, powf2 *= 2) {
float val = d_A[idx] * powf2;
d_C[pos] = sinf(val); d_C[pos + M * N] = cosf(val);
pos += 2 * M * N;
}
}
}
  • learn from data:直接作为参数进行学习

非文本应用

省流:只要是一个vector set,就可以进行self-attention

  • Self-attention for Speech
    • 声音讯号转换成向量会更加复杂
    • 导致整体的矩阵会变得非常大
    • 所以需要引入window,考虑一小段话进行识别
  • Self-attention for Image
    • 每个像素的所有通道值看作一个向量
    • 则我们可以得到分辨率数个向量,构成了一个vector set
    • 相比CNN来说,可以考虑整个图像的所有像素,而不是一个感受野
      • 自动学习出附近哪些像素是相关的,本质上自动学习了感受野
      • 不需要人为设定感受野大小
      • 认为:Self-Attention经过调整可以做到CNN一样的事情,因此对于function set层面上,CNN被Self-Attention所包含,是有所限制的特例

image-20240810210416541

  • Self-attention for Graph
    • 对于有边的结点对,需要计算attention-score
    • 没有边可以直接认为无关,设为0
    • 改改就是GNN

image-20240810211514167

RNN

似乎被Self-Attention替代了

  • RNN没法并行
  • 普通的RNN只会考虑左边序列的输出,而Self-Attention考虑整个序列
  • 双向RNN需要大量memory去存储结果,才能做到考虑整个序列
CATALOG
  1. 1. L4. Sequence as input
    1. 1.1. Sequence
    2. 1.2. Self-Attention
      1. 1.2.1. 概述
      2. 1.2.2. Dot-Product
      3. 1.2.3. Forward
      4. 1.2.4. Forward(矩阵形式)
      5. 1.2.5. Multi-head Self-Attention
      6. 1.2.6. Position Encoding
      7. 1.2.7. 非文本应用
      8. 1.2.8. RNN