NLP任务

SRL: Semantic Role Labeling
Coref: Coreference resolution
SNLI/RTE: Stanford Natural Language Inference / Recognizing Textual Entailment
NER: Named-entity recognition
SQuAD: Stanford Question Answering Dataset
SST-5: Stanford Sentiment Treebank

RNN

https://www.jiqizhixin.com/articles/2018-12-14-4

模型基础结构

1-to-1, 1-to-n, n-to-n, n-to-1
递归, 浅层, 隐变量(h)
h1 = f(Ux1+Wh0+b)
y = softmax(Vh1+c)

Encoder-Decoder

a RNN as Encoder then
contact hn, like
c = hn
c = q(hn)
c = q(h1,hn)
use c as another RNN input, generate output

Attention

y = attention(cn, hn, aij) => a
每个c与输出y直接适配最合适的h
c1 = h1a11 + h2a12
c2 = h1a21 + h2a22

Word Embedding

Predict Based Word embedding
train a deep model, with mask LM task etc.
extract first layer output as the embeeding

transformer

https://zhuanlan.zhihu.com/p/338817680

模型基础结构

Encoder-Decoder
input = word embedding(Word2Vec, Glove, ELMo, etc.) + position embedding(三角函数或训练出来)
Encoder(input) -> c with shape n,d1
Decoder(c) -> y

Self-Attention

Q,K,V = x * (WQ, WK, WV) with shape n,d2, d2 < d1
Attention(Q,K,V) = softmax(QK^T/sqrd(d_k))V

softmax(QK^T) -> n,n 这个矩阵可以表示单词之间的 attention 强度

Z = softmax(QK^T) * V with shape n,d
Z 包含了token i与其他所有token的联系

Multi-Head Attention

h层self-attention
Linear(concat(Z1, Zh)) -> Z with shape n,d
化点难点: h层合一起算可能会导致GEMM算子工作在奇怪的形状上, 分开算会导致pipline变长

Encoder

Add & Norm

x + f(x) -> 残差连接,通常用于解决多层网络训练的问题,可以让网络只关注当前差异的部分
LayerNorm(X + MultiHeadAttention(X))
LayerNorm(X + FeedForward(X))
Layer Normalization 会将每一层神经元的输入都转成均值方差都一样的,这样可以加快收敛。

Feed Forward

两个全链接层, 第一层Relu激活, 第二层没有激活
max(0, XW1+b1)W2 + b2

Multi-Head Attention, Feed Forward, Add & Norm 就可以构造出一个 Encoder block, 多个block堆叠注册encoder

Decoder

包含两个 Multi-Head Attention 层
第一个 Multi-Head Attention 层采用了 Masked 操作在 Softmax 之前需要使用Mask矩阵遮挡住每一个单词之后的信息, QK^T *(elementwise) Mask
第二个 Multi-Head Attention 层的K, V矩阵使用 Encoder 的编码信息矩阵C进行计算,而Q使用上一个 Decoder block 的输出计算
根据 Encoder 的输出 C计算得到 K, V,根据上一个 Decoder block 的输出 Z 计算 Q
最后有一个 Softmax -> Z
Z 的每一行包含(0,n)个token的信息

pipline

  • 输入的词向量首先叠加上Positional Encoding,然后输入至Transformer内
  • 每个Encoder Transformer会进行一次Multi-head self attention->Add & Normalize->FFN->Add & Normalize流程,然后将输出输入至下一个Encoder中
  • 最后一个Encoder的输出将会作为c保留, 后面Decoder会用到
  • 每个Decoder Transformer会进行一次Masked Multi-head self attention->Multi-head self attention->Add & Normalize->FFN->Add & Normalize流程,其中Multi-head self attention时的K、V至来自于Encoder的c。根据任务要求输出需要的最后一层Embedding
  • Transformer的输出向量可以用来做各种下游任务

ELMo

Embeddings from Language Model

模型基础结构

bidirectoinal RNN

任务

-> w1, w1 -> w2
wn -> wn-1, wn-1 -> wn-2

contact(h1,h2) -> embedding

Fine-tuning

Multi-layer ELMo
a1 * h1 + a2 * h2, where a1, a2 are trainable

BERT

Bidirectional Encoder Representations from Transformers
https://wmathor.com/index.php/archives/1456/
https://leemeng.tw/attack_on_bert_transfer_learning_in_nlp.html

模型基础结构

Transformer Encoder

预训练任务

  • 输入数据中随机选择15%的词用于预测
  • 这15%的词中,80%的词向量输入时被替换为
  • 10%的词的词向量在输入时被替换为其他词的词向量
  • 另外10%保持不动
  • 完形填空
  • 预测下一句是否连贯
    [CLS] w1, w2, [MASK], w4, w5
    -> [CLS] -> NSP
    -> [MASK] -> MLM

所谓双向即: 学习的目标函数是P(wi|w1,w2…wn), [MASK] makes bert start with b

special token

  • [pad] 占位
  • [unk] 未知embedding
  • [mask] mask
  • [cls] classification
  • [sep] Sentence Prediction or Sentence Padding?

Fine-Tuning 任务

  • 句子分类,用第一个[CLS]标签对应的结果作为 linear层输入, 减少如选用w1时会发生权重干扰的影响
  • 句子中每个词分类, 每个词对应的结果作为linear层输入
  • 推理, [CLS] s1 [SEP] s2, 同句子分类
  • 阅读理解(QA)
    f(D,Q) -> [s,e]
    A = D[s,e]
    [CLS] q1, q2, [SEP] d1,d2
    对 dn的输出和D,Q的向量做内积再送入softmax

变体

  • MiniLM
  • macbert

优化

QA任务: 双塔结构优化, 基于浅层解码器学到的都是浅层信息这一假设, 将浅层的输入Q,D,拆开算后续组合, 这样能减少计算的矩阵体积
线性代数库: blas库更换, MKL on CPU, CuBlas on GPU, etc
安全的减少Encoder层数, 减少Head数
扔掉FFN层

GPT

Generative Pre-Training

模型基础结构

Transformer Decoder
Self-Attention 替换成了 Masked Self-Attention
即句子中的每个词都只能对包括自己在内的前面所有词进行 Attention
输出是下一个词的概率 n=2048

预训练任务

变体