from: https://blog.csdn.net/weixin_40633696/article/details/121810403
文章目录
1. Self-Attention 的核心是什么?
2. 不考虑多头的原因,self-attention中词向量不乘QKV参数矩阵(W Q , W K , W V W_Q,W_K,W_VW
Q
,W
K
,W
V
),会有什么问题?
3. 在常规attention中,一般有k=v,那self-attention 可以嘛?
4. self-attention 在计算的过程中,如何对padding位做mask?
5. self-attention 的时间复杂度是怎么计算的?
6. transformer中multi-head attention中每个head为什么要进行降维?
7. 为什么BERT选择mask掉15%这个比例的词,可以是其他的比例吗?
8. 为什么BERT在第一句前会加一个 [CLS] 标志?
9. 使用BERT预训练模型为什么最多只能输入512个词,最多只能两个句子合成一句?
10. Transformer在哪里做了权重共享,为什么可以做权重共享?
11. BERT非线性的来源在哪里?
12. Transformer的点积模型做缩放的原因是什么?
13. BERT的三个Embedding直接相加会对语义有影响吗?
14. BERT训练时使用的学习率 warm-up 策略是怎样的?为什么要这么做?
15. 深度学习中Attention与全连接层的区别何在?
16. 在BERT应用中,如何解决长文本问题?
本文主要参考知乎作者:海晨威 的文章
1. Self-Attention 的核心是什么?
Self-Attention的核心是用文本中的其它词来增强目标词的语义表示,从而更好的利用上下文的信息。
2. 不考虑多头的原因,self-attention中词向量不乘QKV参数矩阵(W Q , W K , W V W_Q,W_K,W_VW
Q
,W
K
,W
V
),会有什么问题?
self-attention的核心是用文本中的其它词来增强目标词的语义表示,从而更好的利用上下文的信息。
self-attention中,sequence中的每个词都会和sequence中的每个词做点积计算相似度,也包括这个词本身。
对于self-attention,一般会说它的q = k = v q=k=vq=k=v,这里的相等实际上是指它们来自同一个基础向量。但是在实际计算时,它们是不一样的。因为这三者都是乘了W Q , W K , W V W_Q,W_K,W_VW
Q
,W
K
,W
V
矩阵的。如果不乘,每个词对应的q , k , v q,k,vq,k,v就是完全一样的。
在相同量级的情况下,q i q_iq
i
与k i k_ik
i
点积的值会是最大的(可以从“两数和相同的情况下,两数相等对应的积最大”类比过来)。
那在softmax后的加权平均中,该词本身所占的比重将会是最大的,使得其他词的比重很少,无法有效利用上下文信息来增强当前词的语义表示。
而乘以W Q , W K , W V W_Q,W_K,W_VW
Q
,W
K
,W
V
矩阵,会使得每个词的q , k , v q,k,vq,k,v都不一样,能很大程度上减轻上述的影响。
当然,W Q , W K , W V W_Q,W_K,W_VW
Q
,W
K
,W
V
矩阵也使得多头(类似于CNN中的多核)去捕捉更丰富的特征/信息成为可能。
输入:
Q = np.array([[2,4,4],
[2,3,5],
[3,3,4],
[4,4,2]])
K = Q.T
print('Q:\n{}'.format(Q))
print('K:\n{}'.format(K))
print('Q*K:\n{}'.format(np.dot(Q,K))
1
2
3
4
5
6
7
8
输出:
Q:
[[2 4 4]
[2 3 5]
[3 3 4]
[4 4 2]]
K:
[[2 2 3 4]
[4 3 3 4]
[4 5 4 2]]
Q*K:
[[36 36 34 32]
[36 38 35 30]
[34 35 34 32]
[32 30 32 36]]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
可以发现相同向量相乘,积往往最大
输入:
q1 = np.array([2,4,4])
k1 = np.array([3,4,3])
k2 = np.array([2,4,4])
print('q1和k1点积:{}\nq1和k2点积:{}'.format(np.dot(q1,k1.T),np.dot(q1,k2.T)))
1
2
3
4
输出:
q1和k1点积:34
q1和k2点积:36
1
2
3. 在常规attention中,一般有k=v,那self-attention 可以嘛?
self-attention实际只是attention中的一种特殊情况,因此k=v是没有问题的,也即K,V参数矩阵相同。
扩展到Multi-Head Attention中,乘以QK参数矩阵之后,其实就已经保证了多头之间的差异性了,在q和k点积+softmax得到相似度之后,从常规attention的角度,觉得再去乘以和k相等的v会更合理一些。
在Transformer/BERT中,完全独立的QKV参数矩阵,可以扩大模型的容量和表达能力。
但采用Q,K=V这样的参数模式,我认为也是没有问题的,也能减少模型的参数,又不影响多头的实现。
当然,上述想法并没有做过实验,为个人观点,仅供参考。
self-attention源码解读: 目前主流的attention方法都有哪些?
4. self-attention 在计算的过程中,如何对padding位做mask?
在 Attention 机制中,同样需要忽略 padding 部分的影响,这里以transformer encoder中的self-attention为例:
self-attention中,Q和K在点积之后,需要先经过mask再进行softmax,因此,对于要屏蔽的部分,mask之后的输出需要为负无穷,这样softmax之后输出才为0。
5. self-attention 的时间复杂度是怎么计算的?
Self-Attention时间复杂度:O ( n 2 ⋅ d ) O(n^2·d)O(n
2
⋅d),这里n是序列的长度,d是embedding的维度。
Self-Attention包括三个步骤:(1)相似度计算(2)softmax(3)加权平均,它们分别的时间复杂度是:
(1)相似度计算可以看作大小为(n,d)和(d,n)的两个矩阵相乘:( n , d ) × ( d , n ) = O ( n 2 ⋅ d ) (n,d)\times(d,n)=O(n^2·d)(n,d)×(d,n)=O(n
2
⋅d) ,得到一个(n,n)的矩阵
(2)softmax就是直接计算了,时间复杂度为O (
标签:BERT,Transformer,attention,Attention,矩阵,768,Embedding From: https://www.cnblogs.com/Arborday/p/16889692.html