• Attention机制详解(深入浅出)



    我们都知道,对于人类来说注意力是非常重要的一件事。有了注意的能力我们才能在一个比较复杂的环境中, 把有限的注意力放到重要的地方

    在这一节中,我们将了解如何使得我们的网络也具有产生注意力的能力,以及这样的注意力能够给网络表现带来怎样的改变。

    1. 为什么要有Attention

    让我们从循环神经网络的老大难问题——机器翻译问题入手。

    我们知道,普通的用目标语言中的词语来代替原文中的对应词语是行不通的,因为从语言到另一种语言时词语的语序会发生变化。比如英语的“red”对应法语的“rouge”,英语的“dress”对应法语“robe”,但是英语的“red dress”对应法语的“robe rouge”。

    为了解决这个问题,我们创造了Encoder-Decoder结构的循环神经网络。

    • 它先通过一个Encoder循环神经网络读入所有的待翻译句子中的单词,得到一个包含原文所有信息的中间隐藏层,接着把中间隐藏层状态输入Decoder网络,一个词一个词的输出翻译句子。
    • 这样子,无论输入中的关键词语有着怎样的先后次序,由于都被打包到中间层一起输入后方网络,我们的Encoder-Decoder网络都可以很好地处理这些词的输出位置和形式了。

    在这里插入图片描述

    但是问题在于,中间状态由于来自于输入网络最后的隐藏层,一般来说它是一个大小固定的向量。既然是大小固定的向量,那么它能储存的信息就是有限的,当句子长度不断变长,由于后方的decoder网络的所有信息都来自中间状态,中间状态需要表达的信息就越来越多。

    如果句子的信息实在太多,我们的网络就有点把握不住了。比如现在你可以尝试把下面这句话一次性记住并且翻译成中文:

    It was the best of times, it was the worst of times, it was the age of wisdom, it was the age of foolishness, it was the epoch of belief, it was the epoch of incredulity, it was the season of Light, it was the season of Darkness, it was the spring of hope, it was the winter of despair, we had everything before us, we had nothing before us, we were all going direct to Heaven, we were all going direct the other way — in short, the period was so far like the present period, that some of its noisiest authorities insisted on its being received, for good or for evil, in the superlative degree of comparison only.
    .
    – A Tale of Two Cities, Charles Dickens.

    别说翻译了,对于人类而言,光是记住这个句子就有着不小的难度。如果不能一边翻译一边回头看,我们想要翻译出这个句子是相当不容易的。

    Encoder-Decoder网络就像我们的短时记忆一样,存在着容量的上限,在语句信息量过大时,中间状态就作为一个信息的瓶颈阻碍翻译了。

    可惜我们不能感受到Encoder-Decoder网络在翻译这个句子时的无奈。但是我们可以从人类这种翻译不同句子时集中注意力在不同的语句段的翻译方式中受到启发,得到循环神经网络中的Attention机制。

    2. Attention机制

    我们现在把Encoder网络中的隐藏层记为 h ( t ) h^{(t)} h(t) ,把Decoder网络中的隐藏层记为 H ( t ) H^{(t)} H(t),第 t t t 个输出词记为 y ( t ) y^{(t)} y(t),我们原先的Decoder网络中的式子就可以写做:
    H ( t ) = f ( H ( t − 1 ) , y ( t − 1 ) ) H^{(t)}=f(H^{(t-1)}, y^{(t-1)}) H(t)=f(H(t1),y(t1))

    我们要使得网络在翻译不同的句子时,可以注意到并利用原文中不同的词语和语句段,那我们就可以把Decoder网络式子写作:
    H ( t ) = f ( H ( t − 1 ) , y ( t − 1 ) , C t ) H^{(t)}=f(H^{(t-1)}, y^{(t-1)}, C_t) H(t)=f(H(t1),y(t1),Ct)

    其中 C t C_t Ct 指的是在时刻 t t t 的上下文向量(Context Vector)。我们把它定义为所有的原文隐藏层值 h ( t ) h^{(t)} h(t) 加权平均的结果 C t = ∑ i = 1 T x α t i h ( t ) C_t=\sum^{T_x}_{i=1}\alpha_{t_i}h^{(t)} Ct=i=1Txαtih(t),而如何分配权重就体现了输出这个 H ( t ) H^{(t)} H(t) 的时候,应该给哪些原文词语更高的注意力

    在这里插入图片描述

    我们给 h ( t ) h^{(t)} h(t) 分配的权重就叫做全局对齐权重(Global Alignment Weights)

    3. 全局对齐权重

    全局对齐权重 α k \alpha_k αk 很好的体现了在计算第 k k k 个输出词语时,应该给所有的 h ( t ) h^{(t)} h(t) 怎样的权重,其中 α k i \alpha_{ki} αki 就代表着计算第 k k k个输出词语时, h ( i ) h^{(i)} h(i)分配到的权重大小。于是我们的 C k = ∑ i = 1 T x α k i h ( i ) C_k=\sum_{i=1}^{T_x}\alpha_{ki}h^{(i)} Ck=i=1Txαkih(i)

    翻译一个句子的时候,每一步的 C k C_k Ck 都应该是不同的,下图展示的是把法语句子“L’accord sur l’Espace économique européen a été signé en août 1992.” 翻译成英语句子“The agreement on the European Economic Area was signed in August 1992.”时,每一个输出英文词汇的 α k \alpha_{k} αk 构成的对齐矩阵:
    在这里插入图片描述
    上图中,每一列就代表着输出一个英语单词时,它的 α k \alpha_k αk 权重是如何分布于原文向量 h ( t ) h^{(t)} h(t) 中的,图中越亮的像素块对于着越大的权重

    这个图告诉了我们几个重要信息:

    • 在预测每一个词语的时候,权重只会在少数几个词上表现出比较高的词,一般不会多于3-4个词语被同时赋予比较高的注意力;
    • 通常来说,在上一时间刻中被分配很大权重的 h ( t ) h^{(t)} h(t),在下一层中并不一定也会有高权重。连续输出几个词语时,注意力会快速地在不同原文词语之间切换。
    • 很多时候,输出文本中的第 k k k 个词的注意力也集中在输入文本的第 k k k 个词上,就像是图中从左上到右下的这一条对角的亮带。

    于是乎我们的带有AttentionEncoder-Decoder网络的迭代过程就是如下几步:

    1. Encoder 网络按照原来的方法计算出 h ( 1 ) , h ( 2 ) , . . . , h ( T x ) h^{(1)},h^{(2)},...,h^{(T_x)} h(1),h(2),...,h(Tx)
    2. 计算 Decoder 网络,对于第 k k k 个输出词语:
      1. 计算出得到 C k C_k Ck 所需要的 h ( 1 ) , h ( 2 ) , . . . , h ( T x ) h^{(1)},h^{(2)},...,h^{(T_x)} h(1),h(2),...,h(Tx) 的权重 α k \alpha_k αk
      2. 计算 C k C_k Ck C k = α k 1 h C_k=\alpha_{k1}h Ck=αk1h
    3. 将 代入 计算出 ,再将 代入你的网络中计算出 。如果 ,那么我们就令初始 。
    4. k : = k + 1 k:=k+1 k:=k+1后重复上述步骤,直到网络输出为止。
    5. 现在我们只剩下一个问题没有解决了:如何计算出 α k \alpha_k αk 呢?

    如何计算权重计算函数

    计算 α k \alpha_k αk 的时候,我们很自然的就会想到: α k \alpha_k αk 也可以使用一个小神经网络计算出来,而由于 α k t \alpha_{kt} αkt 表达的含义是我们在输出到第 k k k 个词,也就是面对 时,应该给 分配多少的权重,我们可以设计一个以 为输入的网络:
    参考资料:https://zhuanlan.zhihu.com/p/380892265

  • 相关阅读:
    【老生谈算法】matlab实现Kmeans聚类算法源码——Kmeans聚类算法
    (三)行为模式:9、空对象模式(Null Object Pattern)(C++示例)
    计算机网络体系结构
    【公众号开发】图像文字识别 · 模板消息推送 · 素材管理 · 带参数二维码的生成与事件的处理
    【信管2.2】项目管理知识体系与组织结构
    httprunner4学习总结7 – 运行测试用例及采坑点梳理
    如何改变讨好型人格,做回真正的自己
    Java:实现使用线性探测作为冲突的开放寻址的哈希表算法(附完整源码)
    【前端】yarn install
    【洛谷】P3835 【模板】可持久化平衡树
  • 原文地址:https://blog.csdn.net/weixin_46713695/article/details/128169690