最近想学点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天涯若比邻
笔记就到这里结束啦,如果大家有错误或者想法欢迎提出,一起讨论!
标签:Self,attention,笔记,vector,相关性,CNN,self From: https://www.cnblogs.com/Aikoin/p/17699472.html