过年的气息越来越浓厚了,那我们接着从self-attention is all you need (一)写下去
在self-attention is all you need (一)呢,我们已经操作过怎样跟据Input sequence得到output sequence。self-attention要做的事情,就是给定一排的input vector得到另外一排output vactor。之前我们已经操作过如何根据一排input sequence(a1~a4)得到b1,同理可以得到b2~b4。这里需要强调的一点呢,是b1~b4并不需要依序产生,而是一次同时被计算出来的。
接下来呢,我们从矩阵乘法的角度,再重新整理一遍self-attention的运作过程。
那self-attention是怎么运作的呢?现在我们已经知道说a1~a4中的每一个a啊,都要分别产生q、k、v。如果矩阵运算表示这样一个操作是什么样子呢?我们每一个a都左乘矩阵,得到
,即
。这些不同的a啊,你可以把它们合起来,当作一个矩阵来看待。什么意思呢?a1乘上
得到
,a2乘上
得到
,a3乘上
得到
,a4乘上
得到
。即:
那我们可以把vector a1~a4呢拼起来,形成一个大的矩阵,我们给它命名:I;同理,我们再把vector ~
拼起来,形成一个大的矩阵,我们给它命名Q。所以我们从a1~a4得到
~
这一件事情,其实就是把一个叫做I的矩阵,左乘矩阵
,
呢其实是nerve的参数,得到大Q,大Q的四个Colum就是
~
。
那么接下来怎么产生k跟v呢?它们的操作跟q是一摸一样的。 我们每一个a都左乘矩阵,得到
,即
。同理啊,这些不同的a啊,你仍可以把它们合起来,当作一个矩阵来看待。即 a1乘上
得到
,a2乘上
得到
,a3乘上
得到
,a4乘上
得到
。
~
拼起来,形成一个大的矩阵,我们把它叫做大K,大K的四个Colum就是
~
那v的产生就不赘述了,是相同的道理,从下图我们可以很清楚的查看到
所以每一个a怎么得到Q,K,V呢,其实就是把输入的vector sequence乘上三个不同的矩阵、
、
,你就的到了Q,得到了K,得到了V。
那么接下来我们要做一个什么事情呢?在self-attention is all you need(一)里有提到,我们根据a1找出这个sequence(a1~a4)里面,跟a1相关的其它向量来产生b1(其他同理啦),所以我们会做这样的一个操作得到attention score:
这边呢,为了方便,我们用横向的矩形框代表转置 ,希望不会让你产生误解。上面这四个步骤的操作啊,你其实可以把它们拼起来,看作是矩阵跟向量相乘。你可以把
~
拼起来,当作是一个矩阵的四个row。
那我们刚才有提到呢,不止q1要跟k1~k4计算attention score,q2也要对k1~k4计算attention score,这个操作啊和上面是一摸一样。那么同理q3、q4也分别要和k1~k4计算attention score,道理呢也就是上面的道理。所以我们可以再把attention score拼起来,形成一个大的矩阵。
所以这些attention score是怎么来的,可以看作 是两个矩阵的相乘,一个矩阵它的row啊就是k1~k4,另外一个矩阵它的Colum啊就是q1~q4,这样一相乘,就得到了attention的分数。我们把k的transpose叫做,得到的attention score矩阵呢我们把它叫做A。那我们之前有提到会对attention score呢做一下softmax,得到
我们计算完 以后,接下来呢,
里的Colum乘上对应的v,就的得到了b1~b4(我们以b1为例先)
那么你可能猜到了,我们再把b1~b4拼起来,就有如下的结果:
所以整个self-attention啊,其实就是一连串的矩阵乘法而已。怎么说呢,下面图示一目了然,不需要我多赘述了
可以看到,在self-attention里面呢,唯一需要学习的参数就只有 、
、
而已。
未完待续~