上一篇:transformer网络内attention使用的mask第一篇 https://blog.csdn.net/m0_50617544/article/details/132182127

future mask

通过上面给出的website,也就是RNN和LSTM的内容,可知RNN和LSTM的输入都是按照次序依次输入网络的,像上面给出的example,“输入 的 数据 ”,第一步输入“输入”这个单词的向量,然后输入“的”字的向量,最后输入“数据”的词向量,下面来看看future的意思具体是什么样子的。这的话使用RNN来示范。

1、“输入”只有自身而且隐藏层输入是0没有其他多的信息, h 1 = t a n h ( W i x 0 + W h h h 0 + b h ) h_1 = tanh(W_{i}x_0+W_{hh}h_0+b_h) h1=tanh(Wix0+Whhh0+bh) ,隐藏层输出就是h1, h 0 = { 0 } h_0=\{0\} h0={0} ,不包括“的”和“数据”的信息,这的话future信息其实就是“的”和“数据”;

2、“的”除了自身的输入,还包括上面的隐藏层输出 h 1 h_1 h1 ,所以“的”字运算的时候包括了之前的信息“输入”,也就是 h 2 = t a n h ( W i x 1 + W h h h 1 + b h ) h_2 = tanh(W_{i}x_1+W_{hh}h_1+b_h) h2=tanh(Wix1+Whhh1+bh) ,隐藏层输出是h2,不包括“数据”信息,这的话future信息是“数据”

3、“数据”除了自身的输入,还包括上面的隐藏层输出 h 2 h_2 h2 ,所以“数据”运算的时候包括了之前的信息“输入”“的”, h 3 = t a n h ( W i x 2 + W h h h 2 + b h ) h_3 = tanh(W_{i}x_2+W_{hh}h_2+b_h) h3=tanh(Wix2+Whhh2+bh) ,隐藏层输出是h3

可以知道上面的输入和输出之间的关系,每个输入按照次序输入,不包括后面的信息,也就是不包括future的信息,transformer内有时候某些item,也不能包括future的信息,此时就需要使用mask来遮挡future information才可以。

通常RNN和LSTM以及transformer,会需要predict后面的单词,也就是输入“输入 的”要来predict “的 数据”,也就是predict是后面一个单词或者字,要防止transformer提前知道后面的单词,需要用mask来遮挡。

输入 的 数据 

实现的方式就是,可知拿到的Mask是一个上三角的方阵

def create_masks_future(inputs):
    # future
    n, sequence_length = inputs.shape
    input_mask = np.tril(np.ones((sequence_length, sequence_length)))
    input_mask[input_mask==0] = -np.inf
    input_mask[input_mask==1] = 0
    return input_mask

下面还是用上面的example,假设现在输入的是

输入 的 <PAD> ====== [0, 1, 666]

根据上面的推导可以知道,inputs = [0, 1, 666]

[ 输入 的 <PAD> ] = [ 0 1 666 ] = [ a 1 a 2 d 1 d 2 c 1 c 2 ] \left[\begin{matrix}输入\\ 的\\\text{<PAD>}\end{matrix}\right]=\left[\begin{matrix}0\\ 1\\666\end{matrix}\right]=\left[\begin{matrix}a_1&a_2\\ d_1&d_2\\c_1&c_2\end{matrix}\right] 输入<PAD> = 01666 = a1d1c1a2d2c2

带入到给出的codes create_masks_future,可以得到相应的future mask

mask = [ 0 - i n f - i n f 0 0 - i n f 0 0 0 ] \text{mask}=\left[\begin{matrix}0&\text{-}inf&\text{-}inf\\ 0&0&\text{-}inf\\ 0&0&0\end{matrix}\right] mask= 000-inf00-inf-inf0 ,输入是: [ 输入 的 <PAD> ] = [ 0 1 666 ] = [ a 1 a 2 d 1 d 2 c 1 c 2 ] \left[\begin{matrix}输入\\ 的\\\text{<PAD>}\end{matrix}\right]=\left[\begin{matrix}0\\ 1\\666\end{matrix}\right]=\left[\begin{matrix}a_1&a_2\\ d_1&d_2\\c_1&c_2\end{matrix}\right] 输入<PAD> = 01666 = a1d1c1a2d2c2

仍然是三个token,但是最后一个变到了pad,根据上面的运算输出可知:输出是[1, 3, 3]

Q ⋅ K T = Q\cdot K^T= QKT= [ a Q 1 a Q 2 d Q 1 d Q 2 c Q 1 c Q 2 ] ⋅ [ a K 1 d K 1 c K 1 a K 2 d K 2 c K 2 ] \left[\begin{matrix}aQ^1&aQ^2\\ dQ^1&dQ^2\\cQ^1&cQ^2\end{matrix}\right]\cdot \left[\begin{matrix}aK^1&dK^1&cK^1\\ aK^2&dK^2&cK^2\end{matrix}\right] aQ1dQ1cQ1aQ2dQ2cQ2 [aK1aK2dK1dK2cK1cK2]

= [ a Q 1 a K 1 + a Q 2 a K 2 a Q 1 d K 1 + a Q 2 d K 2 a Q 1 c K 1 + a Q 2 c K 2 d Q 1 a K 1 + d Q 2 a K 2 d Q 1 d K 1 + d Q 2 d K 2 d Q 1 c K 1 + d Q 2 c K 2 c Q 1 a K 1 + c Q 2 a K 2 c Q 1 d K 1 + c Q 2 d K 2 c Q 1 c K 1 + c Q 2 c K 2 ] =\left[\begin{matrix}aQ^1aK^1+aQ^2aK^2&aQ^1dK^1+aQ^2dK^2&aQ^1cK^1+aQ^2cK^2 \\ dQ^1aK^1+dQ^2aK^2&dQ^1dK^1+dQ^2dK^2&dQ^1cK^1+ dQ^2cK^2\\ cQ^1aK^1+cQ^2aK^2&cQ^1dK^1+cQ^2dK^2&cQ^1cK^1+cQ^2cK^2\end{matrix}\right] = aQ1aK1+aQ2aK2dQ1aK1+dQ2aK2cQ1aK1+cQ2aK2aQ1dK1+aQ2dK2dQ1dK1+dQ2dK2cQ1dK1+cQ2dK2aQ1cK1+aQ2cK2dQ1cK1+dQ2cK2cQ1cK1+cQ2cK2

Q ⋅ K T = [ a Q a K a Q d K a Q c K d Q a K d Q d K d Q c K c Q a K c Q d K c Q c K ] Q\cdot K^T=\left[\begin{matrix}aQaK&aQdK&aQcK \\ dQaK&dQdK&dQcK \\ cQaK&cQdK&cQcK\end{matrix}\right] QKT= aQaKdQaKcQaKaQdKdQdKcQdKaQcKdQcKcQcK

然后加上得到的mask就是 Q ⋅ K T + mask Q\cdot K^T+\text{mask} QKT+mask ,相加得到了-inf, $aQcK-inf=-inf$

[ a Q a K a Q d K a Q c K d Q a K d Q d K d Q c K c Q a K c Q d K c Q c K ] + [ 0 - i n f - i n f 0 0 - i n f 0 0 0 ] \left[\begin{matrix}aQaK&aQdK&aQcK \\ dQaK&dQdK&dQcK \\ cQaK&cQdK&cQcK\end{matrix}\right]+\left[\begin{matrix}0&\text{-}inf&\text{-}inf\\ 0&0&\text{-}inf\\ 0&0&0\end{matrix}\right] aQaKdQaKcQaKaQdKdQdKcQdKaQcKdQcKcQcK + 000-inf00-inf-inf0 = [ a Q a K - i n f - i n f d Q a K d Q d K - i n f c Q a K c Q d K c Q c K ] =\left[\begin{matrix}aQaK&\text{-}inf&\text{-}inf \\ dQaK&dQdK&\text{-}inf\\ cQaK&cQdK&cQcK\end{matrix}\right] = aQaKdQaKcQaK-infdQdKcQdK-inf-infcQcK

然后对每个token做softmax操作归一化,也就是对每行做softmax,axis = -1,softmax以后-1e6会被归一化到0

softmax ( Q ⋅ K T + mask ,   − 1 ) = [ Softmax( a Q a K - i n f - i n f ) Softmax( d Q a K d Q d K - i n f ) Softmax( c Q a K c Q d K c Q c K ) ] \text{softmax}\left(Q\cdot K^T+\text{mask},~ -1\right) =\left[\begin{matrix}\text{Softmax(}aQaK&\text{-}inf&\text{-}inf) \\ \text{Softmax(}dQaK&dQdK&\text{-}inf)\\ \text{Softmax(}cQaK&cQdK&cQcK)\end{matrix}\right] softmax(QKT+mask, 1)= Softmax(aQaKSoftmax(dQaKSoftmax(cQaK-infdQdKcQdK-inf)-inf)cQcK)

= [ ( a Q a K ) s 0 0 ( d Q a K ) s ( d Q d K ) s 0 ( c Q a K ) s ( c Q d K ) s ( c Q c K ) s ] =\left[\begin{matrix}(aQaK)_s& 0 &0 \\ (dQaK)_s&(dQdK)_s&0\\ (cQaK)_s&(cQdK)_s&(cQcK)_s\end{matrix}\right] = (aQaK)s(dQaK)s(cQaK)s0(dQdK)s(cQdK)s00(cQcK)s

最后就是算 attention ( Q , K , V ) = Softmax ( Q ⋅ K T + mask ) ⋅ V \text{attention}(Q,K,V)=\text{Softmax}\left({Q\cdot K^T}+\text{mask}\right)\cdot V attention(Q,K,V)=Softmax(QKT+mask)V ,上面已算过了代入得

= [ ( a Q a K ) s 0 0 ( d Q a K ) s ( d Q d K ) s 0 ( c Q a K ) s ( c Q d K ) s ( c Q c K ) s ] ⋅ [ a V 1 a V 2 d V 1 d V 2 c V 1 c V 2 ] =\left[\begin{matrix}(aQaK)_s& 0 & 0 \\ (dQaK)_s&(dQdK)_s& 0 \\ (cQaK)_s&(cQdK)_s&(cQcK)_s\end{matrix}\right] \cdot \left[\begin{matrix}aV^1&aV^2\\ dV^1&dV^2\\cV^1&cV^2\end{matrix}\right] = (aQaK)s(dQaK)s(cQaK)s0(dQdK)s(cQdK)s00(cQcK)s aV1dV1cV1aV2dV2cV2

= [ ( a Q a K ) s a V 1 + 0 + 0 ( a Q a K ) s a V 2 + 0 + 0 ( d Q a K ) s a V 1 + ( d Q d K ) s d V 1 + 0 ( d Q a K ) s a V 2 + ( d Q d K ) s d V 2 + 0 ( c Q a K ) s a V 1 + ( c Q d K ) s d V 1 + ( c Q c K ) s c V 1 ( c Q a K ) s a V 2 + ( c Q d K ) s d V 2 + ( c Q c K ) s c V 2 ] =\left[\begin{matrix}(aQaK)_saV^1+0+0 & (aQaK)_saV^2+0+0 \\ (dQaK)_saV^1+(dQdK)_sdV^1+0 & (dQaK)_saV^2+(dQdK)_sdV^2+0 \\(cQaK)_saV^1+(cQdK)_sdV^1+(cQcK)_scV^1 & (cQaK)_saV^2+(cQdK)_sdV^2+(cQcK)_scV^2 \\\end{matrix}\right] = (aQaK)saV1+0+0(dQaK)saV1+(dQdK)sdV1+0(cQaK)saV1+(cQdK)sdV1+(cQcK)scV1(aQaK)saV2+0+0(dQaK)saV2+(dQdK)sdV2+0(cQaK)saV2+(cQdK)sdV2+(cQcK)scV2

和之前得到的结果相比较,可以发现每个token只能和之前的token做运算,不能和后面的token做运算,也就是future信息被遮挡住了,具体来看的话,第一个token也就是 a Q a K ) s a V 1 + 0 + 0 , ( a Q a K ) s a V 2 + 0 + 0 aQaK)_saV^1+0+0 , (aQaK)_saV^2+0+0 aQaK)saV1+0+0(aQaK)saV2+0+0 ,不包括任何 c , d c,d c,d 的信息,第二个token不包括 c c c 的信息,第三个token是最后一个所以包括了前面所有的信息也就是 a , d a,d a,d

= [ ( a Q a K ) s a V 1 + ( a Q d K ) s d V 1 + ( a Q c K ) s c V 1 ( a Q a K ) s a V 2 + ( a Q d K ) s d V 2 + ( a Q c K ) s c V 2 ( d Q a K ) s a V 1 + ( d Q d K ) s d V 1 + ( d Q c K ) s c V 1 ( d Q a K ) s a V 2 + ( d Q d K ) s d V 2 + ( d Q c K ) s c V 2 ( c Q a K ) s a V 1 + ( c Q d K ) s d V 1 + ( c Q c K ) s c V 1 ( c Q a K ) s a V 2 + ( c Q d K ) s d V 2 + ( c Q c K ) s c V 2 ] =\left[\begin{matrix}(aQaK)_saV^1+(aQdK)_sdV^1+(aQcK)_scV^1 & (aQaK)_saV^2+(aQdK)_sdV^2+(aQcK)_scV^2 \\ (dQaK)_saV^1+(dQdK)_sdV^1+(dQcK)_scV^1 & (dQaK)_saV^2+(dQdK)_sdV^2+(dQcK)_scV^2 \\(cQaK)_saV^1+(cQdK)_sdV^1+(cQcK)_scV^1 & (cQaK)_saV^2+(cQdK)_sdV^2+(cQcK)_scV^2 \\\end{matrix}\right] = (aQaK)saV1+(aQdK)sdV1+(aQcK)scV1(dQaK)saV1+(dQdK)sdV1+(dQcK)scV1(cQaK)saV1+(cQdK)sdV1+(cQcK)scV1(aQaK)saV2+(aQdK)sdV2+(aQcK)scV2(dQaK)saV2+(dQdK)sdV2+(dQcK)scV2(cQaK)saV2+(cQdK)sdV2+(cQcK)scV2

future mask主要使用在需要predict后面字词的情况,此时若要防止模型作弊,就需要使用future mask来遮挡住后面的信息才可以。

bert/modeling.py at master · google-research/bert (github.com)

Masking in Transformers’ self-attention mechanism | by Samuel Kierszbaum, PhD | Analytics Vidhya | Medium

BrianPulfer/PapersReimplementations: Personal short implementations of Machine Learning papers (github.com)

How Do Self-Attention Masks Work? | by Gabriel Mongaras | MLearning.ai | Medium

Your Repositories (github.com)

https://zhuanlan.zhihu.com/p/645442074

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐