Transformer细节解读

NLP专栏

共 2902字,需浏览 6分钟

 ·

2021-04-02 23:48

本系列将对Transformer的关键细节进行解读,尽可能用数学语言阐述,要读懂本系列的读者,只需具备基础的线性代数知识即可。

self-attention

attention定义如公式(1)所示:

44a925a315d50b4f01c6f0464bad7b67.webp

当 b43a3acdd78894e69330416fe0514605.webp 时,就是所谓的“self-attention”。在主流深度学习框架中,只要求 619f05ebda42d526cb68d083412485e3.webp 。

不妨设 02676bfdc6f4e1892a3ef15f2d391822.webp ,这里 5d156832c6e78555f24433824e6429b8.webp 表示词序列 04cab03d376b815ba6d9d4cc222007c4.webp 的长度, e26af73c9a3fed080a61f28b80a1bc45.webp 表示词序列 bb1a4782c556a182d85296be926bde4a.webp 的长度,840295dc97478038c271d442a20ebe06.webp 表示每个词向量的维度,那么公式(1)中的 d1355083409502f5bbe35f6fdb65892e.webp 。首先将 6a0b5b85e7f7ecc52e1e92b01a1d4e21.webp 展开来写:

c0233a35f4fe38a518a759490c89c39f.webp

其中, fe053e166c7d269dff84d0c4ecdbd6b4.webp ,表示单个词向量。接下来对 b0f7a62fa8e353b538decf671d9fa599.webp 进行展开:

b4b430793d44473fdb6de08fc1660f24.webp

其中, be0fe761c3f44bae4a28f49f85740437.webp 表示向量的内积,用来衡量向量adeef56fe8a2e53a48551979b834be4f.webp 和 向量f70480b3d0d2f84461102fbe908f6134.webp的相似度,3cf92168e971d8a6a4fa68dd53ec6727.webp 越大则表示 向量adeef56fe8a2e53a48551979b834be4f.webp 和 向量f70480b3d0d2f84461102fbe908f6134.webp 越相似。 6d4684ad7fe3242958a89f0400a3f440.webp 表示 按行 aed6c20084ee263eaefa8ce697eb3817.webp 依次对 d883db5f44e7d0e632e6ff10909d0043.webp 中每行所在位置的元素进行 dd97849d88f5f0d9b091fdf56c6b18d9.webp 操作,即:

3d492f52d08593b6b8813a8dfca62dab.webp

dd97849d88f5f0d9b091fdf56c6b18d9.webp 是单增函数,即 3cf92168e971d8a6a4fa68dd53ec6727.webp 越大, 06651326ecc76f1ab68ba4e6afdbed64.webp 越大。

最后对 d66a6aaf503dbdb9f2e7fbdf3893379e.webp 展开:

d3634ad82b5a3418e40caa8d06349609.webp

公式(5)中任一行向量 229c3c7721f14f372344fb5ae7cc688b.webp 表明, f70480b3d0d2f84461102fbe908f6134.webp 和 adeef56fe8a2e53a48551979b834be4f.webp 越相似, af41e8e924a96a93a13bfc3c823e2a0a.webp 的系数越大,即 af41e8e924a96a93a13bfc3c823e2a0a.webp 在结果行向量 abac7d70ca3f2ba3dc32758e912bf8d9.webp 贡献的比例越大。换另一种角度理解, 229c3c7721f14f372344fb5ae7cc688b.webp 建模了词序列 bb1a4782c556a182d85296be926bde4a.webp 中各个词向量 097eb99d8b73c4c6a683634e74b5015f.webp 和词向量 adeef56fe8a2e53a48551979b834be4f.webp 的相关关系。

softmax padding mask

由于词序列是不定长的,所以需要在后面进行零填充固定到统一长度,因此才会出现所谓的"padding mask"。

对 9d87749ba43035b4b11a6cb6a25b6b31.webp 分析(这里还没有进行softmax操作)。假定 30d30ecef3416e4d411972abc823047b.webp ,即零填充向量,那么 612685ef0b8cf9bdc0e972dab8ef2174.webp 。由于 3fbd2de77e66862db991293381f757f5.webp 表示向量adeef56fe8a2e53a48551979b834be4f.webp 和 向量f70480b3d0d2f84461102fbe908f6134.webp的相似度。往往假定,零填充向量和向量 adeef56fe8a2e53a48551979b834be4f.webp 是最不相关的。因此,在进行softmax操作前,我们需要将 7ef21b2dc9cb740e43f879b834d80d1c.webp ,那么 80ba6c0fd9d679281eedd122bd786d8a.webp 。

常规的做法

假设词序列 04cab03d376b815ba6d9d4cc222007c4.webp 的padding mask矩阵为 20d8c78e0c63b850592c0454fe0fe424.webp 词序列 455b828e901463446dc25dfc80bd0782.webp 的padding mask矩阵为 4a11b81fc4d25d888694e0b1f84678fe.webp 记 8e3405c54b4e94eb09c4aeb8a2dd83fd.webp ,先将 dc8e201cf6e42af027b41dce74005032.webp 取反,然后乘以 68bc8ff8a66e0bd1c78afc485d93e835.webp ,其次加上 b0f7a62fa8e353b538decf671d9fa599.webp ,最后进行 dd97849d88f5f0d9b091fdf56c6b18d9.webp 操作。

快速的做法

由于后面还要做query padding mask,所以词序列 04cab03d376b815ba6d9d4cc222007c4.webp 的padding mask矩阵是怎么样的,在这里没有任何关系,不妨假定为全 0c62b2b0a69dcb1da5f6a35056c453f9.webp 矩阵。换句话说,只需要知道词序列455b828e901463446dc25dfc80bd0782.webp 的padding mask矩阵 28d8a99089d3cdf951905335fdda1254.webp ,直接对28d8a99089d3cdf951905335fdda1254.webp 取反,然后乘以 68bc8ff8a66e0bd1c78afc485d93e835.webp ,其次加上 b0f7a62fa8e353b538decf671d9fa599.webp ,最后进行 dd97849d88f5f0d9b091fdf56c6b18d9.webp 操作即可。

query padding mask

query padding mask只需:113dd84bab704d79feb7beff6be22e54.webp 。但实际上,Transformer是不需要每次都做query padding mask,因为Transformer中的各个词向量是独立操作的,互不干扰了,即论文中的“并行”,所以只需在输出之前的最后一步做query padding mask即可。

关于 缩放因子10b19983ad97950b64711b07e1671db3.webp

缩放因子10b19983ad97950b64711b07e1671db3.webp是为了防止 3fbd2de77e66862db991293381f757f5.webp 不至于过大或过小(即正值更小,负值更大),那么 4bd6204fc6ecbccd42eb2857add60df3.webp 做 dd97849d88f5f0d9b091fdf56c6b18d9.webp 就比较平均。




multi-head self-attention (MHSA)

MHSA

不妨设 4f99e7d5477fc9288008bc4fd7ae752e.webp ,SA如公式(1)所示:

1a08b0f4d48a25d3b6a16216d1d6977b.webp

MHSA则分别先对 6a0b5b85e7f7ecc52e1e92b01a1d4e21.webp 进行线性升维操作(即全连接操作,参数不共享),输出 d9720988d69a51da4119a3f95c45acd6.webp ,然后按“头”做 7a79df41fad5eba76d2e53dce30f49ed.webp 次,最后把结果拼接起来。如公式(2)所示:

46d540daa093c28d888d14c2dbe445a8.webp

其中, 500f3d78dab98edaa946dedbd064abc6.webp

说白了,MHSA就是分别先把 6a0b5b85e7f7ecc52e1e92b01a1d4e21.webp 进行线性升维,然后对每个“头”并行做 f68156bfa8e70679e9b2a59c7e02f7d2.webp ,总共 7a79df41fad5eba76d2e53dce30f49ed.webp 个“头”,最后把结果拼接起来。

时间复杂度分析

假定单个矩阵的运算使用常规做法,那么纯 f68156bfa8e70679e9b2a59c7e02f7d2.webp 的时间复杂度如公式(4)所示:

c9b68efecc385caafdcedb4e34cbc3ef.webp

MHSA的时间复杂度如公式(5)所示:

4be98468171d8cb24b228c10312cd14d.webp

公式(5)中的 cdc0da9f1d922adebc0e1169222aa20c.webp 表示MHSA做线性升维并行的开销时间, 4a076c77645e185ac62c4fbfb1630ec8.webp 表示做多“头”并行的开销时间。

假定忽略并行开销的时间,且 f3522ee11f4efbcf111aa2b8017545e5.webp ,那么有公式(6):

1ceb58b1acd685b682cd0eeb01fd1d08.webp

公式(6)表明MHSA总可以通过调节 06c80c8a30a0ab0cfd6545e531eaa4df.webp 来获得比 f68156bfa8e70679e9b2a59c7e02f7d2.webp 更少的时间复杂度。通常, 03f991928c1d97a1fa1108ab6b7dfe5e.webp ,因此总有: 011b6b0c08fbcb83e2b24584df0a9ccd.webp 。

优势在哪里?

假定 08765176ad293bc5217bfb7ca0b1f048.webp ,那么MHSA既能用更少的时间复杂度,又能获得更好的性能。因为高维信息总是不劣于低维信息,比如:低维空间不可分的问题,高维空间可分;低维空间很难优化的,高维空间更容易优化,所以神经网络的向量维度都要逐步上升的。如果 c5a15979dccfa9ce46d1c8a1f862a11b.webp ,MHSA的性能会低于SA,因为“先分后聚”的做法,还是会有损性能的。

但是仔细一想,不管是线性升维还是并行,都需要更多的内存开销,因此MHSA也属于用空间复杂度换时间复杂度的例子吧。

总结来说,MHSA的优势:

“分治的思想,充分利用显卡的并行性,通过空间复杂度换取时间复杂度。如果 739612df47aa34d65a2bcd88be7ea58a.webp ,那么还能有更好的性能”

值得注意的是,并行在移动终端和嵌入设备,表现得不好~


通常来说,基于Transformer的神经网络模型只在两处做padding mask,一处是在多头注意力中做softmax padding mask(当然,有多个Transformer就有多个softmax padding mask),另一处是loss前的最后一步做padding mask。

为什么Transformer只在多头注意力中做softmax padding mask?其他层呢?不是说padding mask很重要吗?

不急,一步一步来回答。列举一下Transformer的组件:多头注意力层、全连接层、Dropout层、激活函数层、LN层和add层。

首先,Dropout层、激活函数层和add层对词序列中的各个词向量是独立操作的,显然成立,那么本应被零填充的词向量是什么,无关紧要,因为不会影响其他非零填充向量,所以只需在loss前的最后一步做padding mask。

其次,全连接层对词序列中的各个词向量也是独立操作的,因为全连接层会给每个词向量都独立分配一个向量权重和偏置参数,也是易得(有兴趣的读者,自己可以推导一下),那么本应被零填充的词向量是什么,无关紧要,因为不会影响其他非零填充向量的参数训练,所以也只需在loss前的最后一步做padding mask。

最后,就只剩下LN层了。大部分深度学习框架都是沿着词向量维度做标准化,然后参数也是沿着词向量维度。换句话说,所有词向量共享一个 b890eb104d49954f2bd0f6f5888e418c.webp 向量参数和一个 b00083dd63cc6d3002c09884b1078dbf.webp 向量参数。那么本应零填充却没有零填充,会不会影响共享向量参数的更新呢?

LN层的独立

答案是不一定会。要看场景,比如:A、B、C共用一台电脑,C每次使用电脑,都恢复电脑原样,那么在A和B看来,电脑只被A和B共用,因为C不会改变电脑。

对应到神经网络中,“C每次使用电脑,都恢复电脑原样”对应只在loss前的最后一步做padding mask,“C不会改变电脑”对应零填充向量不改变共享参数的更新。

那么,只在loss前的最后一步做padding mask,零填充向量是否会改变共享参数的更新,即是否参与共享参数的梯度计算呢?答案是不会。这里笔者就直接把最后的结果写出来,推导还是比较繁琐的,具体可以参考BN的反向传播推导:

bbb1f95eafbf8857ef3274d88ae565bc.webp

其中, 59e3511592907bd36eca3a1c6ee0b9ab.webp表示词序列,994978aa30de026bb8dbbd6652a111b2.webp 表示 c75619a57d61d574d647f35106defc2c.webp mask向量,所在位置为0,那么 59e3511592907bd36eca3a1c6ee0b9ab.webp 该位置为零填充。由公式(1)表示,只需在loss前的最后一步做padding mask,那么零填充不会参与共享参数梯度的计算。当然,公式(1)不是严谨的推导,只是大概表达了零填充向量不参与共享参数的梯度计算。

结论

共享,不等价于一定不能相互独立。要看场景。就好比,对所有进程,CPU是共享的,但当某进程使用时,就是独占CPU的,所以感觉就是,每个进程独立使用一个CPU。


浏览 50
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报