【学习笔记】Self-attention

发布时间 2023-09-13 13:50:49作者: Aikoin

最近想学点NLP的东西,开始看BERT,看了发现transformer知识丢光了,又来看self-attention;看完self-attention发现还得再去学学word embedding...

推荐学习顺序是:word embedding、self-attention / transformer、BERT(后面可能还会补充新的)

我是看的李宏毅老师的课程+pdf,真的很爱他的课...!讲的非常清楚又很风趣馁!

下面是学习笔记,是我简化提取的对自己有用的信息,适合有一定基础的人阅读,大家如果看了哪里不懂的可以评论区留言,或者去看原视频~

input

  • a vector
  • a set of vectors

vector set as input

  • text: one-hot encoding(不包含语义信息) ; word embedding (包含语义信息)
  • speech: choose a frame as a vector
  • graph: consider each node as a vector

output

  • each vector has a label (POS tagging词性标注
  • whole sequence has a label (sentiment analysis情感分析
  • model decides the number of lables (seq2seq - translation机器翻译

self-attention

FC(全连接层)可以用window来考虑上下文信息;但如何考虑整个sequence?

sequence长度不确定的情况下用window并不好!(window只能设置成最大的sequence长度,占据内存空间)

于是,铛铛!出现了self-attention:

那么对于当前输入的某个vector,如何在序列中找到和它相关的vectors?

计算相关性!(这里用的是算点积)

这里的q可以理解成query,k理解成key,打个比方就是拿着一把钥匙(这里是query)去试不同房间的锁(这里是key),看看和哪个更匹配!

相关性分数α'和对应的v (value)相乘后取和,得到加权和b,也就是self-attention的输出

这里的value我的理解是,拿着一把钥匙去开不同的锁,如果匹配度高就能打开房间门,房间里的东西就可以看作是这个value

最后我们能拿到的就是所有打开了的房间门里面的东西,也就是相关性分数作为权重,所有value的加权和!

 这边每个b的计算都是并行的

 怎么做到并行呢?很自然想到矩阵运算:

Muti-head Self-attention

如果vector之间不止一种想被学习到的相关性呢?

引入多头机制 - 不同的head学习不同的相关性!

positional encoding

self-attention里没有位置信息!

给每个位置一个独特的编码向量

  • hand-crafted
  • learned from data

Applications

  • Transformer
  • BERT

Self-attention v.s. CNN

  • CNN的感受野是人为设计的(卷积窗口);self-attention是可学习的(投影矩阵学习相关性
  • CNN是存在限制的self-attention;self-attention是更复杂更灵活的CNN

更flexible的模型需要更多的数据,否则容易overfitting!

数据量小的时候,用CNN更合适;数据量足够大的时候,self-attention表现更好

self-attention v.s. RNN

  • RNN需要上一时刻的输出作为当前时刻的输入,因此是nonparallel的;而self-attention是parallel
  • RNN里如果想要考虑两个很远的vector很难 (一层层传递会丢失信息);self-attention天涯若比邻

笔记就到这里结束啦,如果大家有错误或者想法欢迎提出,一起讨论!