摘要
- 学习Attention
- 学习Transformer
- 学习BERT
- 查找模型demo
- 配置Neo4j
Attention
此部分参考:
https://zhuanlan.zhihu.com/p/43493999
-
核心思想
在预测结果时把注意力放在不同的特征上。
输入一般分为三种:Q-query、K-key、V-value- 先用Q和K计算权重 α {\alpha} α,会用softmax对权重归一化: α = s o f t m a x ( f ( Q K ) ) {\alpha = softmax(f(QK))} α=softmax(f(QK))
- 再用权重对结果加权: o u t = ∑ α i ∗ v i {out = {\sum}{{\alpha}_{i}*{v}_{i}}} out=∑αi∗vi
-
原理
h i {h^i} hi是encoder每个step的输出, z i {z^i} zi是decoder每个step的输出:- 对输入进行编码,得到 h i {h^i} hi
- 解码,先用固定的start token也就是
z
0
{z^{0}}
z0作为Q,去和每个
h
i
{h^i}
hi(同时作为K和V)去计算attention,得到加权的
c
0
{c^{0}}
c0
c 0 = ∑ α ^ 0 i h i {c^0 = {\sum}{\hat{\alpha}_{0}^{i}{h}^{i}}} c0=∑α^0ihi - 用 c 0 {c^{0}} c0作为解码的RNN输入(同时还有上一步的 z 0 {z^{0}} z0),得到 z 1 {z^{1}} z1并预测出第一个词
- 继续预测,就是用 z 1 {z^{1}} z1作为Q去求attention:
Transformer
此部分参考:
https://zhuanlan.zhihu.com/p/44121378
- 模型结构
-
流程
输入 → Embedding → Positional Encoding → N × Encoder → 输出
输出 → Embedding → Positional Encoding → N × Encoder → Linear → Softmax → 输出
-
Positional Encoding
P E p o s , 2 i = sin ( p o s / 10000 2 i / d m o d e l ) {PE_{pos, 2i} = \sin{\big( pos/{10000}^{2i/d_{}model} \big)}} PEpos,2i=sin(pos/100002i/dmodel)
P E p o s , 2 i + 1 = cos ( p o s / 10000 2 i / d m o d e l ) {PE_{pos, 2i + 1} = \cos{\big( pos/{10000}^{2i/d_{}model} \big)}} PEpos,2i+1=cos(pos/100002i/dmodel)其中, p o s pos pos表示token在sequence中的位置,例如第一个token就是0。 i i i,或者准确意义上是 2 i 2i 2i和 2 i + 1 2i+1 2i+1表示了Positional Encoding的维度。
PE满足以下特性:
- 每个位置有一个唯一的Positional Encoding.
- 两个位置之间的关系可以通过他们位置编码间的仿射变换来获得。
-
Encoder
Encoder由N个相同的layer组成,每个layer由2个sub-layer组成,分别是Multi-head Self-attention Mechanism 和 Fully Connected Feed-forward Network。
其中每个sub-layer都加了Residual connection 和 Normalization。
attention的计算采用了Scaled Dot-product- Multi-head Attention
通过h个不同的线性变换对Q,K,V进行投影,最后将不同的attention结果拼接起来。 - Self-attention
取Q,K,V相同 - Position-wise feed-forward networks
提供非线性变换,过线性层时每个位置i的变换参数是一样的。
- Multi-head Attention
-
Decoder
Decoder和Encoder的结构类似,但是多了一个attention的sub-layer:- 输出:对应i位置的输出词的概率分布
- 输入:encoder的输出 & 对应i-1位置decoder的输出。中间的attention不是self-attention,它的K,V来自encoder,Q来自上一位置decoder的输出。
- 解码:在训练时,解码是一次全部decode出来,用上一步的ground truth来预测(mask矩阵也会改动,让解码时看不到未来的token);预测时,因为没有ground truth了,需要一个个预测。
-
BERT
此部分参考:
https://blog.csdn.net/jiaowoshouzi/article/details/89073944
https://zhuanlan.zhihu.com/p/46652512
-
Embedding
由三种Embedding求和得到:- Token Embeddings:词向量,第一个单词是CLS标志,可以用于之后的分类任务。
- Segment Embeddings:用来区别两种句子,因为预训练不光做LM还要做以两个句子为输入的分类任务。
- Position Embeddings:与Transformer不同,不是三角函数而是学习出来的。
-
Masked LM
随机mask 15%的token,而不是把每个词都预测一遍。最终的损失函数只计算被mask掉那个token。
随机mask的时候10%的单词会被替代成其他单词,10%的单词不替换,剩下80%才被替换为[MASK]。
-
Next Sentence Prediction
训练的输入是句子A和B,B有一半的几率是A的下一句,输入这两个句子,模型预测B是不是A的下一句。
-
Fine-tunning
根据任务需要调整输出。
Neo4j
根据官网给出的流程,安装了Desktop版,并测试能够正常使用。