寿县有做网站开发的吗,网站建设主,教育类网页设计代码,学软件开发的学校自注意力机制#xff08;self-attention#xff09;
之前听过吴恩达老师的课#xff0c;吴恩达老师CNN那一块讲的特别好#xff0c;但是后面RNN这一部分我听的不是很明白#xff0c;今天有看了李宏毅老师attention这部分的课#xff0c;总结一下笔记。
self-attention …自注意力机制self-attention
之前听过吴恩达老师的课吴恩达老师CNN那一块讲的特别好但是后面RNN这一部分我听的不是很明白今天有看了李宏毅老师attention这部分的课总结一下笔记。
self-attention 红色框中的这四个向量是考虑了整个sequence后的输出而且self-attention不仅可以使用一次 transformer中最重要的就是self-attention 根据 a 1 a^1 a1找到和 a 1 a^1 a1相关的向量比如如何计算 a 1 a^1 a1和 a 4 a^4 a4有多相关 计算有很多不同的方法计算相关度 α \alpha α但主要是左边这种方法 α \alpha α也叫attention score实际上通常还要计算和自己的关联性 然后加上一个softmax 你也可以不用softmax 如果关联性比较强比如 α 1 , 2 ′ {\alpha}_{1,2} α1,2′得分高那么 b 1 b^1 b1就更接近 v 2 v^2 v2
需要说明的一点是 b 1 b 2 b 3 b 4 b^1b^2b^3b^4 b1b2b3b4不需要依序产生不需要先算 b 1 b^1 b1然后再算 b 2 b^2 b2。 b 1 b 2 b 3 b 4 b^1b^2b^3b^4 b1b2b3b4是同时得到的
现在计算 b 2 b^2 b2 a 2 a^2 a2×权重参数w得到 q 2 q^2 q2 然后 接下来从矩阵乘法的角度再从新过一遍self-attention 得到qkv后计算 α {\alpha} α 然后一样的操作 得到 α {\alpha} α矩阵后进行softmax使和为1 得到 A ′ A A′后 再回顾一下I是输入是一排的 α {\alpha} α拼接起来 输入是I输出是O。虽然self-attention看起来做了很复杂的操作但实际需要学习的参数只有三个矩阵 self-attention还有一个进阶版本multi-head Self-attention。
我们之前找相关是通过q找相关的k但是相关有很多不同的形式 把 q i q^i qi乘以两个不同的矩阵得到 q i , 1 , q i , 2 q^{i,1},q^{i,2} qi,1,qi,2,q有两个那么对应的k和v也有两个 具体是怎么计算的呢 q 1 q^1 q1算attention分数的时候只需要管 k 1 k^1 k1不需要管 k 2 k^2 k2。 同样的得到attention分数后只需要乘以 v 1 v^1 v1,得到 b i , 1 b^{i,1} bi,1,这只用到了一个head另一个head也做一样的事情 接下来把 b i , 1 b^{i,1} bi,1和 b i , 2 b^{i,2} bi,2拼在一起乘以一个矩阵得到 b i b^i bi传到下一层 这就是multi-head Self-attention。但是现在有个很重要的问题就是没有位置信息输入 a 1 , a 2 , a 3 , a 4 a^1,a^2,a^3,a^4 a1,a2,a3,a4是在seq的最前面还是最后面
虽然我们给它们标了1234但只是为了方便理解对于神经网络来说它并不知道 a 1 , a 2 , a 3 , a 4 a^1,a^2,a^3,a^4 a1,a2,a3,a4哪个在前哪个在后。所以你做Self-attention的时候如果觉得位置信息是个重要的信息可以把位置信息加上 每个位置给一个独特的vector 也就是 e i e^i ei但是这种方法是人为的人设的vector就有很多的问题比如vector设到128但是sequence有129。论文中vector是通过一个sin cos的函数产生的当然你可以采用其他的方法位置vector的设置还是一个有待研究的问题你可以创造新的方法。有篇文章详细的比较了不同的position vector 每一行代表一个vectora是最原始的b是学习出来的c是使用一个神奇的网络d是通过rnn学习的
self-Attention在NLP的应用大家耳熟能详 但是self-Attention不只能用在NLP相关领域也可以用在其他方面比如做语音的时候但是在做语音的时候你可能会对self-Attention有一个小小的改动因为用vector表示语音信号向量的长度会非常大因为用一个向量表示10ms的语音信息那么1s的语音就有100个vector5s就是500个vector随便一句话可能就成千个vector了 如果长度很大Attention Matrix就很大要计算 L 2 L^2 L2,计算量大而且消耗的内存也大.所以做语音识别的时候有一个叫Truncated Self-attention。 不需要看整个句子只需要看一部分即可人为设定的但是我们是怎么知道需要一部分就好那就取决于你对这个问题的理解。
Self-attention还可以被应用在图像上我们目前讲的Self-attention都是适合在输入是一排向量的时候但我们也可以把图像看成是vector set 我们可以把图像的每个位置看成一个三维的向量那么就是一个50个向量的vector set从这个角度看图像就是一个vector set那么就能用Self-attention。已经有人这么做了 比如1这个像素点产生query0这个像素点产生key那么我们考虑就是整张图像 这么看的话CNN更像是简化版的Self-attention因为CNN只考虑了卷积核范围内的数据 下面这篇文章会用数学严谨的方式告诉你 只要设置合适的参数Self-attention可以做到和CNN一样的事可以发现Self-attention比CNN更加灵活但是更灵活的model需要更多的data否则容易过拟合而有限制的模型可能在数据小的时候也不会过拟合。
16×16的patch图像的一个块每个patch就看成一个word 最小的数据量是10M一千万张图 RNN和Self-attention的区别 Self-attention每一个都考虑了整个sequence而RNN只考虑了左边的vector不过RNN也可以用双向的。不过把RNN的output和Self-attention的output对比的话即使使用了bidirectional的RNN还是有一定差别。
对于RNN的输出想要考虑最左边的输入需要存在memory里一直不能忘记一直带到最右边才能在最后一个时间点被考虑但对Self-attention来说没有这个问题 还有就是RNN没办法平行处理必须先产生前面的向量 而Self-attention可以同一时间一次性生成这些向量所以运算效率上Self-attention比RNN更有效率。想进一步了解RNN和Self-attention可以看下面这篇文章 Transformers are RNNs: Fast Autoregressive Transformers with Linear Attention 最后Self-attention也可以用在Graph上面 每一个node可以表示为一个vector因为graph有edge的信息所以不需要attention去找关联性所以在计算 Attention Matrix的时候只需要计算有edge相连的node, 根据domain knowledge没有相连的我们直接设置为0 Self-attention也有非常多的变形 Self-attention的最大问题就是运算量非常大