输入相关
1、三个Embedding直接相加会对语义有影响吗?
虽然在深度神经网络里变得非常复杂,本质上神经网络中每个神经元收到的信号也是“权重”相加得来。
在实际场景中,叠加是一个更为常态的操作。比如声音、图像等信号。一个时序的波可以用多个不同频率的正弦波叠加来表示。只要叠加的波的频率不同,我们就可以通过傅里叶变换进行逆向转换。一串文本也可以看作是一些时序信号,也可以有很多信号进行叠加,在BERT这个设定中,token,segment,position明显可以对应三种非常不同的频率。(为什么Bert的三个Embedding可以进行相加?)
2、为什么BERT在第一句前会加一个[CLS]标志?
BERT在第一句前会加一个[CLS]标志,最后一层该位对应向量可以作为整句话的语义表示,便于后续用于句子级别的任务。为什么选它呢,因为与文本中已有的其它词相比,这个无明显语义信息的符号会更“公平”地融合文本中各个词的语义信息,从而更好的表示整句话的语义。
这里补充一下bert的输出,有两种:一种是get_pooled_out(),就是上述[CLS]的表示,输出shape是[batch size,hidden size]。一种是get_sequence_out(),获取的是整个句子每一个token的向量表示,输出shape是[batch_size, seq_length, hidden_size],这里也包括[CLS],因此在做token级别的任务时要注意它。
模型结构相关
1、不考虑多头的原因,self-attention中词向量不乘参数矩阵(Wq, Wk ,Wv),会有什么问题?
Self-Attention的核心是用文本中的其它词来增强目标词的语义表示,从而更好的利用上下文的信息。在self-attention中的做法是,一个sequence中的每个词都会和该sequence中的每个词做点积去计算相似度,也包括这个词本身。这种计算规则就说明每个词不仅考虑了其它词对自身的影响,也考虑了词自身的意义。
如果词向量不乘参数矩阵,那么后面的Q,K,V就完全是一样的。那么在计算Q*K时,在相同量级的情况下,qi与ki点积的值会是最 大的(两个数的和相同时,数相等时乘积最大)。那在softmax后的加权平均中,该词本身所占的比重将会是最大的,使得其他词的比重很少,无法有效利用上下文信息来增强当前词的语义表示。
而乘以参数矩阵,会使得每个词的q,k,v都不一样,能很大程度上减轻上述的影响。当然,参数矩阵也使得多头,类似于CNN中的多核,去捕捉更丰富的特征/信息成为可能。
2、Self-Attention 的时间复杂度是怎么计算的?
Self-Attention时间复杂度: O(n**2 x d) ,这里,n是序列的长度,d是embedding的维度。
Self-Attention包括三个步骤:相似度计算,softmax和加权平均,它们分别的时间复杂度是:相似度计算可以看作大小为(n,d)和(d,n)的两个矩阵相乘: (n,d)*(d,n) =O(n**2 x d),得到一个(n,n)的矩阵;softmax就是直接计算了,时间复杂度为 O(n**2);加权平均可以看作大小为(n,n)和(n,d)的两个矩阵相乘:(n,n)*(d,n) =O(n**2 x d),得到一个(n,d)的矩阵。因此,Self-Attention的时间复杂度是 O(n**2 x d) 。
这里再分析一下Multi-Head Attention,它的作用类似于CNN中的多核。多头的实现不是循环的计算每个头,而是通过 transposes and reshapes,用矩阵乘法来完成的。Transformer/BERT中把d,也就是hidden_size/embedding_size这个维度做了reshape拆分,可以去看Google的TF源码或者上面的pytorch源码:hidden_size (d) = num_attention_heads (m) * attention_head_size (a),也即将d维的词向量拆分为m分,每一份对应的向量长度为a。这里可以认为,每个head-attention的输入是一个(n,a)大小的矩阵,这里不考虑batch维度。这样点积可以看作大小为(m,n,a)和(m,a,n)的两个张量相乘,得到一个(m,n,n)的矩阵,其实就相当于m个头,时间复杂度是O(n2 x m2 x a) = O(n**2 x d x m)。因此Multi-Head Attention时间复杂度就是 O(n**2 x d x m) ,而实际上,张量乘法可以加速,因此实际复杂度会更低一些。
3、BERT非线性的来源在哪里?
前馈层的gelu激活函数和self-attention,self-attention是非线性的。
4、Transformer的点积模型做缩放的原因是什么?
transformer中的attention为什么scaled?
5、在BERT应用中,如何解决长文本问题?
(1)分段,将长文本分段,将各段文本输入bert预训练模型得到各段的特征向量,然后将各段的特征向量相加求平均,就得到了整段长文本的特征向量表达,再用这个特征向量作为其他下游任务的输入。
(2)截取:截取前510个或后510个或前128+后382;参考:How to Fine-Tune BERT for Text Classification?
(3)slide window,主要见于诸阅读理解任务(如Stanford的SQuAD)。Sliding Window即把文档分成有重叠的若干段,然后每一段都当作独立的文档送入BERT进行处理。最后再对于这些独立文档得到的结果进行整合。
答案参考:Bert 如何解决长文本问题?
Reference