注意力机制和记忆机制

注意力机制和记忆机制

神经网络中可以存储的信息量称为网络容量(Network Capacity).一般来讲,利用一组神经元来存储信息时,其存储容量和神经元的数量以及网络的复杂度成正比.要存储的信息越多,神经元数量就要越多或者网络要越复杂,进而导致神经网络的参数成倍地增加.

人脑也存在网络容量这样的问题,人脑的工作记忆大概就几秒钟,而且感觉器官传递进来的信息非常多,人脑在有限的资源下,并不能同时处理这么多信息,但大脑有两个机制去应对这个问题,即注意力和记忆机制

所以神经网络模型也随之发展出了类似机制


显著性注意力和聚焦式注意力

聚焦式注意力

自上而下的有意识的注意力(focus),称为聚焦式注意力。聚焦式注意力是指有预定目的、依赖任务的,主动有意识地聚焦于某一对象的注意力。

显著性注意力

自下而上的无意识的注意力(pool),称为基于显著性的注意力。基于显著性的注意力是由外界刺激驱动的注意,不需要主动干预,也和任务无关.如果一个对象的刺激信息不同于其周围信息,一种无意识 的“赢者通吃”(Winner-Take-All)或者门控(Gating)机制就可以把注意力转向这个对象.不管这些注意力是有意还是无意,大部分的人脑活动都需要依赖注意力,比如记忆信息、阅读或思考等

可以鸡尾酒会的例子讲解这两个效应。在嘈杂的环境中,你仍然可以听到你的朋友的谈话声,这就是显著式注意力;如果有人叫了你的名字,你能从嘈杂的环境中注意到,这就是聚焦式注意力。


我们可以将最大汇聚(Max Pooling)、门控(Gating)机制近似地看作自下而上的基于显著性的注意力机制

软注意力机制

X=[𝒙1,,x𝑁]R𝐷×𝑁X = [𝒙_1 , ⋯ , x_𝑁 ] \in ℝ^{𝐷×𝑁}表示 𝑁 组输入信息,其中 𝐷 维向量x𝑛R𝐷,n[1,N]x_𝑛 \in ℝ^𝐷, n \in [1, N]表示一组输入信息.为了节省计算资源,不需要将所有信息都输入神经网络,只需要从XX中选择一些和任务相关的信息.注意力机制的计算可以分为两步:一是在所有输入信息上计算注意力分布,二是根据注意力分布来计算输入信息的加权平均

注意力分布

打分函数

为了从 𝑁 个输入向量[𝒙1,,𝒙𝑁][𝒙_1 , ⋯ , 𝒙_𝑁 ]中选择出和某个特定任务相关的信息,我们需要引入一个和任务相关的表示,称为查询向量(Query Vector),并通过一个打分函数来计算每个输入向量和查询向量之间的相关性.(查询向量qq可以是动态生成的,也可以是可学习的参数)

给定一个和任务相关的查询向量qq,我们用注意力变量z[1,N]z\in[1,N]来表示被选择信息的索引位置,即z=nz=n表示选择了第nn个输入变量。为了方便计算,我们采用一种“软性”的信息选择机制。首先计算在给定qqXX下,选择第ii个输入向量的概率αn\alpha_n

αn=p(z=nX,q)=softmax(s(xn,q))=exp(s(xn,q))j=1Nexp(s(xj,q))\alpha_n = p(z=n|X,q)\\ =softmax(s(x_n,q))\\ =\frac{exp(s(x_n,q))}{\sum_{j=1}^{N}exp(s(x_j,q))}

其中ana_n称为注意力分布(Attention Distribution),𝑠(x,q)𝑠(x, q)为注意力打分函数,可以使用以下几种方式来计算

加性模型,加性打分函数通过对查询和键进行非线性变换,并将它们相加来计算注意力分数。通常涉及一个小的前馈神经网络(带有非线性激活函数),该网络的输入是查询和键的连接或组合。可以捕捉更复杂的关系,计算相对较慢,因为它需要对每一对查询和键进行独立的计算。

𝑠(x,q)=vTtanh(Wx+Uq)𝑠(x, q)=v^Ttanh(Wx+Uq)

点积模型,通过计算查询和键的点积来确定它们之间的关联度,计算速度快,尤其是在查询和键的维度相同时,因为可以通过矩阵乘法高效计算。在处理长序列时可能不如加性打分有效。

𝑠(x,q)=xTq𝑠(x, q)=x^Tq

缩放点积模型,与点积注意力类似,但在取点积之后对结果进行缩放,通常是除以键向量维度的平方根。避免了在高维空间中点积可能变得非常大的问题,有助于稳定梯度。仍然保持了点积注意力的计算效率。

𝑠(x,q)=xTqD𝑠(x, q)=\frac{x^Tq}{\sqrt{D}}

双线性模型,双线性打分函数通过一个双线性变换(即矩阵乘法)来计算查询和键之间的关系。具体来说,它计算查询向量和一个权重矩阵的乘积,然后将结果与键向量进行点积。双线性打分在计算上相比加性模型可能更高效,但不如加性模型灵活。

s(x,q)=xTWqs(x,q)=x^TWq

其中W,U,vW, U, v为可学习的参数,DD为输入向量的维度

理论上,加性模型和点积模型的复杂度差不多,但是点积模型在实现上可以更好地利用矩阵乘积,从而计算效率更高。当输入向量的维度𝐷比较高时,点积模型的值通常有比较大的方差,从而导致Softmax函数的梯度会比较小.因此,缩放点积模型可以较好地解决这个问题。双线性模型是一种泛化的点积模型,相比点积模型,双线性模型在计算相似度时引入了非对称性

加权平均

注意力分布ana_n可以解释为在给定任务相关的查询qq时,第nn个输入向量受关注的程度.我们采用一种“软性”的信息选择机制对输入信息进行汇总, 即

att(X,q)=n=1Nanxn=𝔼zp(zX,q)[xz]att(X,q)=\sum_{n=1}^{N}a_nx_n\\ = 𝔼_{z∼p(z|X,q)}[x_z]

image-20231229235548878


硬注意力机制

软注意力机制选择的信息是所有输入向量在注意力分布下的期望。此外,还有一种注意力是只关注某一个输入向量,叫作硬性注意力

实现方式

第一种为选取最高概率的一个输入向量,即

att(X,q)=x_\hat{n}

其中n^\hat{n}为概率最大的输入向量下标,即

image-20231230002627606

第二中为通过在注意力分布式上随机采样的方式实现

硬性注意力的一个缺点是基于最大采样或随机采样的方式来选择信息,使得最终的损失函数与注意力分布之间的函数关系不可导,无法使用反向传播算法进行训练.因此,硬性注意力通常需要使用强化学习来进行训练.为了使用反向传播算法,一般使用软性注意力来代替硬性注意力

值得注意的是,因为随机采样和最大采样的缘故,会让注意力的分配是离散的、随机的,这也导致了它的非线性和非平滑,对应上方说的不可导

为什么软注意机制叫做“软注意”呢?

在理解硬注意之后就知道软注意为什么叫软了

att(X,q)=n=1Nanxn=𝔼zp(zX,q)[xz]att(X,q)=\sum_{n=1}^{N}a_nx_n\\ = 𝔼_{z∼p(z|X,q)}[x_z]

对这个软注意机制的公式描述里面,软注意得到的是所有输入向量在注意力分布下的期望,所以软注意是连续的。所以软硬表示的意思为:是否离散,离散就是硬注意力、连续就是软注意力


键值对机制

我们可以用键值对(key-value pair)格式来表示输入信息,其中“键”用来计算注意力分布ana_n,“值”用来计算聚合信息
(K,V)=[(k1,v1),,(kN,vN)](K,V) = [(k_1 , v_1 ), ⋯ , (k_N , v_N )]表示NN组输入信息,给定任务相关的查询向量qq时,注意力函数为

att((K,V),q)=n=1Nanvn=n=1Nexp(s(kn,q))jexp(s(kj,q)vnatt((K,V),q)=\sum_{n=1}^{N}a_nv_n\\ =\sum_{n=1}^{N}\frac{exp(s(k_n,q))}{\sum_jexp(s(k_j,q)}v_n

s(kn,q)s(k_n,q)为打分函数

image-20231230144402979

K=VK=V时,键值对模式就是普通注意力机制

K\V\Q

K、V和Q分别代表键(Key)、值(Value)和查询(Query)

K——键(与打分函数相关)

K用于与查询向量进行匹配,以确定值的相关性。键的作用是为每个输入元素(例如,序列中的每个单词或图像中的每个区域)提供一个可用于与查询比较的标准。

V——值(与加权平均相关)

一旦确定了键和查询之间的匹配程度,值就是实际用于计算加权输出的数据。值可以是与键相同的输入数据的表示,也可以是输入数据的另一种表示形式。值的作用是在注意力机制中被加权,从而构成输出的一部分。

Q——查询(与打分函数相关)

查询通常来自模型的另一部分,例如在序列到序列模型中,查询可能来自于解码器,而键和值来自于编码器。查询的作用是指导注意力机制的焦点,即模型需要关注哪些输入数据。查询与键的匹配程度决定了值的权重分配。

键值对注意力机制中,首先计算查询与每个键之间的相似度,这个相似度被用作注意力权重。然后,这些权重被用来加权对应的值。通过这种方式,模型能够根据查询的内容关注输入数据的最相关部分

结构化注意力

在之前介绍中,我们假设所有的输入信息是同等重要的,是一种扁平(Flat)结构,注意力分布实际上是在所有输入信息上的多项分布.但如果输入信息本身具有层次(Hierarchical)结构,比如文本可以分为词、句子、段落、篇章等不同粒度的层次,我们可以使用层次化的注意力来进行更好的信息选择 .此外,还可以假设注意力为上下文相关的二项分布,用一种图模型来构建更复杂的结构化注意力分布.


指针网络

注意力机制主要是用来做信息筛选,从输入信息中选取相关的信息.注意力机制可以分为两步:一是计算注意力分布 𝛼,二是根据 𝛼 来计算输入信息的加权平均.我们可以只利用注意力机制中的第一步,将注意力分布作为一个软性的指针(pointer)来指出相关信息的位置。

指针网络(Pointer Network)是一种序列到序列模型,输入是长度为 𝑁 的向量序列X=x1,,xNX = x_1 , ⋯ , x_N,输出是长度为 𝑀 的下标序列𝒄1𝑀=𝑐1,𝑐2,,𝑐𝑀𝑐𝑚[1,𝑁],𝑚𝒄_{1∶𝑀} = 𝑐_1 , 𝑐_2 , ⋯ , 𝑐_𝑀,𝑐_𝑚 \in [1, 𝑁], ∀𝑚

和一般的序列到序列任务不同,这里的输出序列是输入序列的下标(索引).比如输入一组乱序的数字,输出为按大小排序的输入数字序列的下标.比如 输入为20, 5, 10,输出为1, 3, 2,如果是寻找访问所有城市的最短路径问题,输入的是城市坐标序列,输出的也是索引。

image-20231230150417330

指针网络的序列到序列(未要求)

刚才提到指针网络的输出是从一个序列到另一个序列,这不免和循环神经网络里的三种循环神经网络的类型联系起来。那指针网络到底是同步序列到序列呢?还是异步序列到序列呢?同步和异步的区别在于输入和输出的规模是否对等。所以可以确定的是,指针网络是个同步序列到序列的模型。

那指针网络和之前讲的同步序列到序列的模型区别在哪呢?(虽然没有提到和解释过)指针网络和同步序列到序列的模型都是由编码器和解码器构成的。指针网络和同步序列到序列的区别也就是在解码器上

区别如下:

  1. 指针网络的解码器不是从固定的词汇表中选择词汇,而是生成指向输入序列中元素的指针(即索引)
  2. 解码器使用注意力机制来决定应该“指向”输入序列中的哪个位置。在每个时间步,它计算当前解码器状态与编码器输出的每个元素之间的相似度或关联度。
  3. 基于这些相似度分数,解码器选择输入序列中一个特定位置的索引。这通常通过选择具有最高相似度分数的位置来实现。
  4. 由于输出是输入序列的索引,指针网络直接引用了输入数据,这对于那些输出序列是输入序列排列或子集的任务非常有效。

自注意力机制

当使用神经网络来处理一个变长的向量序列(指输入长度不固定)时,我们通常可以使用卷积网络或循环网络进行编码来得到一个相同长度的输出向量序列(同步序列到序列)

image-20231230152901548

但因为梯度消失或者爆炸导致的长程依赖问题,只能建立起短程依赖关系,想要建立起长距离依赖关系,一种方法是增加网络的层数,通过一个深层网络来获取远距离的信息交互;另一种方法是使用全连接网络.全连接网络是一种非常直接的建模远距离依赖的模型,但是无法处理变长的输入序列.不同的输入长度,其连接权重的大小也是不同的。这时我们就可以利用注意力机制来“动态”地生成不同连接的权重,这就是自注意力模型(Self-Attention Model).

通俗的讲,自注意机制里面的的查询向量是使用输入信息进行生成,而不是选择一个上述任务相关查询向量。相当于模型读到输入信息后,根据输入信息本身决定当前最重要的信息。

QKV模式

自注意模型经常采用的就是查询-键-值(QKV)模式,下方图中红色字母表示的是维度

自注意力模型的计算过程

计算过程

这个应该是老师参考的文章:一文读懂注意力机制 - 知乎 (zhihu.com)

假设输入序列为X=[x1,,x𝑁]R𝐷x×𝑁X = [x_1 , ⋯ , x_𝑁 ] ∈ ℝ^{𝐷_x×𝑁},输出序列为H=[h1,,h𝑁]R𝐷v×𝑁H = [h_1 , ⋯ , h_𝑁 ] \in ℝ^{𝐷_v×𝑁},自注意力模型的具体计算过程如下

  1. 对于每个输入𝒙𝑖𝒙_𝑖,我们首先将其线性映射到三个不同的空间,得到查询向量𝒒𝑖R𝐷𝑘𝒒_𝑖 ∈ ℝ^{𝐷_𝑘}、键向量𝒌𝑖R𝐷𝑘𝒌_𝑖 \in ℝ^{𝐷_𝑘}和值向量𝒗𝑖R𝐷𝑣𝒗_𝑖 \in ℝ^{𝐷_𝑣}

    对于整个输入序列𝑿,线性映射过程可以简写为:

    Q=WqXRDk×𝑁K=WkXRDk×𝑁V=WvXRDv×𝑁Q=W_qX\inℝ^{D_k×𝑁}\\ K=W_kX\inℝ^{D_k×𝑁}\\ V=W_vX\inℝ^{D_v×𝑁}

    其中𝑾𝑞R𝐷𝑘×𝐷𝑥𝑾_𝑞 \in ℝ^{𝐷_𝑘×𝐷_𝑥},𝑾𝑘R𝐷𝑘×𝐷𝑥𝑾_𝑘 \in ℝ^{𝐷_𝑘×𝐷_𝑥},𝑾𝑣R𝐷v×𝐷x𝑾_𝑣 \in ℝ^{𝐷_v×𝐷_x}分别为线性映射的参数矩阵,Q=[𝒒1,,𝒒𝑁]Q = [𝒒_1 , ⋯ , 𝒒_𝑁 ]𝑲=[𝒌1,,𝒌𝑁]𝑲 = [𝒌_1 , ⋯ , 𝒌_𝑁 ],𝑽=[𝒗1,,𝒗𝑁]𝑽 = [𝒗_1 , ⋯ , 𝒗_𝑁 ]分别是由查询向量、键向量和值向量构成的矩阵

  2. 对于每一个查询向量𝒒𝑛𝑸𝒒_𝑛 \in 𝑸,利用键值对注意力机制的公式,可以得到输出向量hnh_n

    hn=att((K,V),qn)=j=1Nanjvj=j=1Nsoftmax(s(kj,qn))vjh_n=att((K,V),q_n)\\ =\sum_{j=1}^{N}a_{nj}v_j\\ =\sum_{j=1}^{N}softmax(s(k_j,q_n))v_j

    其中𝑛,𝑗[1,𝑁]𝑛, 𝑗 ∈ [1, 𝑁]为输出和输入向量序列的位置,𝛼_{𝑛𝑗}表示第𝑛个输出关注到第𝑗个输入的权重.

    如果使用缩放点积来作为注意力打分函数,输出的向量序列可以简写为

    H=Vsoftmax(KTQDk)H=Vsoftmax(\frac{K^TQ}{\sqrt{D_k}})

    img

下图是全连接模型和自注意力模型的对比,其中实线表示可学习的权重,虚线表示动态生成的权重.由于自注意力模型的权重是动态生成的,因此可以处理变长的信息序列.

image-20231230154942542

自注意力模型可以作为神经网络中的一层来使用,既可以用来替换卷积层和循环层 ,也可以和它们一起交替使用(比如 𝑿 可以是卷积层或循环层的输出).自注意力模型计算的权重𝛼 . 𝑖𝑗 只依赖于𝒒𝑖𝒒_𝑖𝒌𝑗𝒌_𝑗的相关性, 而忽略了输入信息的位置信息.因此在单独使用时,自注意力模型一般需要加入位置编码信息来进行修正.自注意力模型可以扩展为多头自注意力(Multi-Head Self-Attention)模型,在多个不同的投影空间中捕捉不同的交互信息.

最后梳理一下注意力机制的计算过程

首先,需要将原始输入映射到查询空间 Q、键空间 K 和值空间 V ,相关计算公式如下:

Q=HWq=[q1,q2,...,qn]K=HWk=[k1,k2,...,kn]V=HWv=[v1,v2,...,vn]Q=HW_q=[q_1,q_2,...,q_n]K=HW_k=[k_1,k_2,...,k_n]V=HW_v=[v_1,v_2,...,v_n]

接下来,我们将去计算每个位置的注意力分布,并且将相应结果进行加权求和:

contexti=j=1nsoftmax(s(qi,kj))vjcontext_i=\sum_{j=1}^{n}softmax(s(q_i,k_j))·v_j

其中s(qi,kj)s(q_i,k_j)是经过上述点积、缩放后分数值。

最后,为了加快计算效率,这里其实可以使用矩阵计算的方式,一次性计算出所有位置的的Attention输出向量:

context=softmax(QKTDk)Vcontext=softmax(\frac{QK^T}{\sqrt{D_k}})V


上方的内容是注意力机制,下方就是记忆机制了。同样于注意力机制的来源,记忆机制也是起源于模仿人脑结构。人脑中的记忆具有周期性和联想性。

周期性:记忆一般分为长期记忆和短期记忆.长期记忆,也称为结构记忆或知识,体现为神经元之间的连接形态,其更新速度比较慢.短期记忆体现为神经元的活动,更新较快,维持时间为几秒至几分 钟.短期记忆是神经连接的暂时性强化,通过不断巩固、强化可形成长期记忆.短期记忆、长期记忆的动态更新过程称为演化(Evolution)过程。此外还有工作记忆,相当于一个记忆的临时存储和处理系统,维持时间通常为几秒钟.从时间上看,工作记忆也是一种短期记忆,但和短期记忆的内涵不同。

联想性:联想记忆是指一种可以通过内容匹配的方法进行寻址的信息存储方式,也称为基于内容寻址的存储.作为对比, 现代计算机的存储方式是根据地址来进行存储的,称为随机访问存储。

借鉴人脑中工作记忆,可以在神经网络中引入一个外部记忆单元来提高网络容量.外部记忆的实现途径有两种:一种是结构化的记忆,这种记忆和计算机中的信息存储方法比较类似,可以分为多个记忆片段,并按照一定的结构来存储;另一种是基于神经动力学的联想记忆,这种记忆方式具有更好的生物学解释性.

不同领域中记忆模型的不严格类比

记忆增强神经网络

外部记忆单元

为了增强网络容量,我们可以引入辅助记忆单元,将一些和任务相关的信息保存在辅助记忆中,在需要时再进行读取,这样可以有效地增加网络容量.这个引入的辅助记忆单元一般称为外部记忆(External Memory),以区别于循环神经网络的内部记忆(即隐状态)。这种神经网络就被叫做记忆增强神经网络(MANN),或记忆网络(MN)

记忆网络的典型结构

  1. 主网络𝐶:也称为控制器(Controller),负责信息处理,以及与外界的交互(接受外界的输入信息并产生输出到外界).主网络还同时通过读写模块和外部记忆进行交互
  2. 外部记忆单元𝑴:外部记忆单元用来存储信息,一般可以分为很多记忆片段(Memory Segment),这些记忆片段按照一定的结构来进行组织.记忆片段一般用向量来表示,外部记忆单元可以用一组向量𝑴=[𝒎1,,𝒎𝑁]𝑴 = [𝒎_1 , ⋯ , 𝒎_𝑁]来表示.这些向量的组织方式可以是集合、树、栈或队列等.大部分信息存储于外部记忆中,不需要全时参与主网络的运算
  3. 读取模块 𝑅:根据主网络生成的查询向量𝒒𝑟𝒒_𝑟,从外部记忆单元中读取 相应的信息𝒓=𝑅(𝑴,𝒒𝑟)𝒓 = 𝑅(𝑴, 𝒒_𝑟 )
  4. 写入模块 𝑊:根据主网络生成的查询向量qwq_w和要写入的信息 𝒂 来更新外部记忆𝑴=𝑊(𝑴,𝒒𝑤,𝒂)𝑴 = 𝑊(𝑴, 𝒒_𝑤, 𝒂)

这种结构化的外部记忆是带有地址的,即每个记忆片段都可以按地址读取和写入.要实现类似于人脑神经网络的联想记忆能力,就需要按内容寻址的方式进行定位,然后进行读取或写入操作.按内容寻址通常使用注意力机制来进行.通过注意力机制可以实现一种“软性”的寻址方式,即计算一个在所有记忆片段上的分布,而不是一个单一的绝对地址.比如读取模型𝑅 的实现方式可以为

r=n=1Nanmnan=softmax(s(mn,qr))r=\sum_{n=1}^{N}a_nm_n\\ a_n=softmax(s(m_n,q_r))

其中𝒒𝑟𝒒_𝑟是主网络生成的查询向量,𝑠(,)𝑠(⋅, ⋅)为打分函数.类比于计算机的存储器读取,计算注意力分布的过程相当于是计算机的“寻址”过程,信息加权平均的过程相当于计算机的“内容读取”过程.因此,结构化的外部记忆也是一种联想记忆, 只是其结构以及读写的操作方式更像是受计算机架构的启发.

通过引入外部记忆,可以将神经网络的参数和记忆容量“分离”,即在少量增加网络参数的条件下可以大幅增加网络容量.因此,我们可以将注意力机制看作 一个接口,将信息的存储与计算分离.

端到端记忆网络

端到端记忆网络采用一种可微的网络结构,可以多次从外部记忆中读取信息.在端到端记忆网络中,外部记忆单元是只读的.(这个其实说明了端到端记忆网络是可变的)

给定一组需要存储的信息m1:N=m1,...,mNm_{1:N}={m_1,...,m_N},首先将其转换成两组记忆片段𝐴=[𝒂1,,𝒂𝑁]𝐴 = [𝒂_1 , ⋯ , 𝒂_𝑁 ]𝐶=[𝒄1,,𝒄𝑁]𝐶 = [𝒄_1 , ⋯ , 𝒄_𝑁 ],分别存放在两个外部记忆单元中,其 中𝐴用来进行寻址,𝐶 用来进行输出(也就对应了键值对注意力机制)

主网络根据输入𝒙生成𝒒,并使用键值对注意力机制来从外部记忆中读取相关信息𝒓,

r=n=1Nsoftmax(anTq)cnr=\sum_{n=1}^{N}softmax(a_n^Tq)c_n

并输出

y=f(q+r)y=f(q+r)

其中𝑓(⋅)为预测函数.当应用到分类任务时,𝑓(⋅)可以设为Softmax函数.

多跳操作

端到端记忆网络(End-to-End Memory Networks)采用多跳(Multi-hop)操作主要是为了增强模型的推理能力,特别是在处理复杂的问题时。多跳操作允许模型在生成最终输出之前,多次访问和处理其记忆。

多跳操作是要让主网络和外部记忆进行多轮交互,在第𝑘轮交互中,主网络根据上次从外部记忆中读取的信息𝒓(𝑘1)𝒓^{(𝑘−1)}

q(k)=r(k)+q(k)q^{(k)}=r^{(k)}+q^{(k)}

假设第𝑘轮交互的外部记忆为𝐴(𝑘)𝐴^{(𝑘)}𝐶(𝑘)𝐶^{(𝑘)},主网络从外部记忆读取信息为

r(k)=n=1Nsoftmax((an(k))Tq(k))cn(k)r^{(k)}=\sum_{n=1}^{N}softmax((a^{(k)}_n)^Tq^{(k)})c_n^{(k)}

在 𝐾 轮交互后,用𝒚=𝑓(𝒒(𝐾)+𝒓(𝐾))𝒚 = 𝑓(𝒒^{(𝐾)} + 𝒓^{(𝐾)})进行预测.多跳操作的多轮交互方式就是这么实现的.多跳操作中的参数一般是共享的.为了简化起见,每轮交互的外部记忆也可以共享使用,比如𝐴(1)==𝐴(𝐾)𝐴^{(1)} = ⋯ = 𝐴^{(𝐾)}𝐶(1)==𝐶(𝐾)𝐶^{(1)} = ⋯ = 𝐶^{(𝐾)}

端到端记忆网络

神经图灵机

图灵机

图灵机我们在循环神经网络部分就介绍过了,图灵机主要结构是

  1. 无限长纸带:纸带被划分为离散的单元格,每个单元格可以写入一个符号(如0和1)。纸带是无限长的,理论上可以无限扩展。
  2. 一个符号表:纸带上可能出现的所有符号的集合,包含一个特殊的空白符。
  3. 读写头:一个可以沿着纸带移动的头,能够读取当前单元格的符号,并且可以写入新的符号或擦除原有符号。
  4. 状态寄存器:存储图灵机当前的状态。图灵机有一组有限的状态,包括一个特殊的开始状态和一个或多个结束状态。
  5. 转移函数(控制规则):这是一个定义图灵机如何根据当前状态和读写头读取的符号来改变状态、写入新符号,并移动读写头的规则。

神经图灵机主要由两个部件构成:控制器和外部记忆.外部记忆定义为矩阵𝑀R𝐷×𝑁𝑀 \in ℝ^{𝐷×𝑁},这里𝑁 是记忆片段的数量,𝐷 是每个记忆片段的大小.控制器为一个前馈或循环神经网络.神经图灵机中的外部记忆是可读写的.

神经图灵机示例

在每个时刻𝑡,控制器接受当前时刻的输入𝒙𝑡𝒙_𝑡、上一时刻的输出𝒉𝑡1𝒉_{𝑡−1}和上一时刻从外部记忆中读取的信息𝒓𝑡1𝒓_{𝑡−1},并产生输出𝒉𝑡𝒉_𝑡,同时生成和读写外部记忆相关的三个向量:查询向量𝒒𝑡𝒒_𝑡、删除向量𝒆𝑡𝒆_𝑡和增加向量𝒂𝑡𝒂_𝑡.然后对外部记忆M𝑡M_𝑡进行读写操作,生成读向量𝒓𝑡𝒓_𝑡和新的外部记忆𝑀𝑡+1𝑀_{𝑡+1}

接下来我们关注神经图灵机是怎么对外部记忆进行读写的

读操作

在时刻𝑡, 外部记忆的内容记为𝑴𝑡=[𝒎𝑡,1,,𝒎𝑡,𝑁]𝑴_𝑡 = [𝒎_{𝑡,1}, ⋯ , 𝒎_{𝑡,𝑁 }],读操作为从外部 记忆𝑴𝑡𝑴_𝑡中读取信息𝒓𝑡RD𝒓_𝑡 \in ℝ^D

首先通过注意力机制进行基于内容的寻址,即

at,n=softmax(s(mt,n,qt))a_{t,n}=softmax(s(m_{t,n},q_t))

其中𝒒𝑡𝒒_𝑡为控制器产生的查询向量,用来进行基于内容的寻址.函数𝑠(,)𝑠(⋅, ⋅)为加性或乘性的打分函数.注意力分布𝛼_𝑡,𝑛 是记忆片段𝒎𝑡,𝑛𝒎_{𝑡,𝑛}对应的权重,并满足n=1Nat,n=1\sum_{n=1}^{N}a_{t,n}=1

根据注意力分布𝛼_𝑡,可以计算读向量(read vector)𝒓𝑡𝒓_𝑡作为下一个时刻控制器的输入.

rt=n=1Nanmt,nr_t=\sum_{n=1}^{N}a_nm_{t,n}

写操作

外部记忆的写操作可以分解为两个子操作:删除和增加

首先,控制器产生删除向量(erase vector)𝒆𝑡𝒆_𝑡和增加向量(add vector)𝒂𝑡𝒂_𝑡,分别为要从外部记忆中删除的信息和要增加的信息.删除操作是根据注意力分布来按比例地在每个记忆片段中删除𝒆𝑡𝒆_𝑡,增加操作是根据注意力分布来按比例地给每个记忆片段加入𝒂𝑡𝒂_𝑡.具体过程如下:

mt+1.n=mt,n(1at,net)+at,natn[1,N]m_{t+1.n}=m_{t,n}(1-a_{t,n}e_t)+a_{t,n}a_t \quad \forall n\in[1,N]

通过写操作得到下一时刻的外部记忆𝑴𝑡+1𝑴_{𝑡+1}


记忆增强网络其实是模仿现代计算机架构设计出来的,下面的联想记忆是一种基于神经动力学的设计

image-20231230232650223

联想记忆

联想记忆模型(Associative Memory Model)主要是通过神经网络的动态演化来进行联想,有两种应用场景:

  1. 输入的模式和输出的模式在同一空间,这种模型叫作自联想模型。自联想模型可以通过前馈神经网络或者循环神经网络来实现,也常称为自编码器。
  2. 输入的模式和输出的模式不在同一空间,这种模型叫作异联想模型。从广义上讲,大部分机器学习问题都可以被看作异联想,因此异联想模型可以作为分类器使用.

Hopfield网络

本书中之前介绍的神经网络都是作为一种机器学习模型的输入-输出映射函数,其参数学习方法是通过梯度下降方法来最小化损失函数.除了作为机器学习模型外,神经网络还可以作为一种记忆的存储和检索模型。

Hopfield网络(Hopfield Network)是一种循环神经网络模型,由一组互相连接的神经元组成.Hopfield 网络也可以认为是所有神经元都互相连接的不分层的神经网络.每个神经元既是输入单元,又是输出单元,没有隐藏神经元.一个神经元和自身没有反馈相连,不同神经元之间连接权重是对称的。

四个节点的Hopfield网络

Hopfield网络有离散型(即神经元状态为 {+1, −1} 两种)、连续型(即神经元状态为连续值),下面就介绍一下离散型.

假设一个Hopfield网络有𝑀 个神经元,第𝑖 个神经元的更新规则为

si={+1if j=1Mwijsj+bi>=0,1otherwise.s_i=\begin{cases} +1 & \text{if } \sum_{j=1}^{M}w_{ij}s_j+b_i >= 0, \\ -1 & \text{otherwise.} \end{cases}

其中𝑤𝑖𝑗𝑤_{𝑖𝑗}为神经元𝑖 和𝑗 之间的连接权重,bib_i为偏置
连接权重𝑤𝑖𝑗𝑤_{𝑖𝑗}有以下性质:

wii=0i[1,M]wij=wjii,j[1,M]w_{ii}=0 \quad \forall i\in[1,M]\\ w_{ij}=w_{ji} \quad \forall i,j\in[1,M]\\

Hopfield 网络的更新可以分为异步和同步两种方式.异步更新是指每次更新一个神经元,神经元的更新顺序可以是随机或事先固定的.同步更新是指一次更新所有的神经元,需要有一个时钟来进行同步.第 𝑡 时刻的神经元状态为𝒔𝑡=[𝑠𝑡,1,𝑠𝑡,2,,𝑠𝑡,𝑀]T𝒔_𝑡 = [𝑠_{𝑡,1}, 𝑠_{𝑡,2}, ⋯ , 𝑠_{𝑡,𝑀}]^T,其更新规则为

st=f(Wst1+b)s_t=f(Ws_{t-1}+b)

其中𝒔0=𝒙𝒔_0 = 𝒙𝑾=[𝑤𝑖𝑗]𝑀×𝑀𝑾 = [𝑤_{𝑖𝑗}]_{𝑀×𝑀}为连接权重,𝒃=[𝑏𝑖]𝑀×1𝒃 = [𝑏_𝑖]_{𝑀×1} 为偏置向量,𝑓(⋅) 为非线性阶跃函数

能量函数

在Hopfield网络中,我们给每个不同的网络状态定义一个标量属性,称为“能量”.Hopfield网络的能量函数(Energy Function)𝐸 定义为

E=12i,jwijsisjibisi=12sTWsbTsE=-\frac{1}{2}\sum_{i,j}w_{ij}s_is_j-\sum_{i}b_is_i\\ =-\frac{1}{2}s^TWs-b^Ts

Hopfield网络是稳定的,即能量函数经过多次迭代后会达到收敛状态.权重对称是一个重要特征,因为它保证了能量函数在神经元激活时单调递减,而不对称的权重可能导致周期性振荡或者混乱.
给定一个外部输入,网络经过演化,会达到某个稳定状态.这些稳定状态称为吸引点(Attractor).在一个Hopfield网络中,通常有多个吸引点,每个吸引点为一个能量的局部最优点.
Hopfield网络的能量函数

那能量函数是拿来做什么的呢?

能量函数用于衡量网络的整体状态,有它就可以定义出网络的稳定状态,找到吸引子。而且由于能量函数的设计,网络不会陷入无限循环,而是最终会收敛到一个或一组稳定的状态。此外,当网络给定一个初始状态(可能是有噪声的或不完整的模式)时,它会通过动态更新过程自然地演化到能量最低的状态,从而实现记忆的检索。

联想记忆

Hopfield网络存在有限的吸引点(Attractor),即能量函数的局部最小点.每个吸引点𝒖都对应一个“管辖”区域RuR_u.若输入向量𝒙落入这个区域,网络最终会收敛到𝒖.因此,我们可以把吸引点看作网络中存储的模式(Pattern).
将网络输入 𝒙 作为起始状态,随时间收敛到吸引点 𝒖 上的过程作为检索过程.即使输入向量 𝒙 只包含部分信息或包含噪声,只要其位于对应存储模式的 “吸引”区域内,那么随着时间演化,网络最终会收敛到其对应的存储模式.因此, Hopfield的检索是基于内容寻址的检索,具有联想记忆能力。

信息存储

信息存储是指将一组向量𝒙1,,𝒙𝑁𝒙_1 , ⋯ , 𝒙_𝑁存储在网络中的过程.存储过程主要是调整神经元之间的连接权重,因此可以看作一种学习过程.Hopfield网络的学习规则有很多种.一种最简单的学习方式为:神经元 𝑖 和 𝑗 之间的连接权重通过下面公式得到

wij=1Nn=1Nxi(n)xj(n)w_{ij}=\frac{1}{N}\sum_{n=1}^{N}x_i^{(n)}x_j^{(n)}

其中𝑥𝑖(𝑛)𝑥^{(𝑛)}_𝑖是第𝑛个输入向量的第𝑖维特征.如果xix_ixjx_j在输入向量中相同的概率越多,则wijw_{ij}越大.这种学习规则和人脑神经网络的学习方式十分类似.在人脑神经网络中,如果两个神经元经常同时激活,则它们之间的连接加强;如果两个神经元经常不同时激活,则连接消失.这种学习方式称为赫布规则.

存储容量

对于联想记忆模型来说,存储容量为其能够可靠地存储和检索模式的最大数量.对于数量为𝑀 的互相连接的二值神经元网络,其总状态数为2 𝑀, 其中可以作为有效稳定点的状态数量就是其存储容量.模型容量一般与网络结构和学习方式有关.Hopfield 网络的最大容量为 0.14𝑀,玻尔兹曼机的容量为 0.6𝑀,但是其学习效率比较低,需要非常长时间的演化才能到达均衡状态。通过改进学习算法,Hopfield 网络的最大容量可以达到 𝑂(𝑀).如果允许高阶(阶 数为 𝐾)连接,比如三个神经元连接关系,其稳定存储的最大容量为 𝑂(𝑀𝐾1𝑀_{𝐾−1}).引入复数运算,有效地提高了网络容量.总体上讲,通过改进网络结构、学习方式以及引入更复杂的运算(比如复数、量子操作),可以有效改善联想记忆网络的容量

使用联想记忆增加网络容量

既然联想记忆具有存储和检索功能,我们可以利用联想记忆来增加网络容量.和结构化的外部记忆相比,联想记忆具有更好的生物学解释性.比如,我们可以将一个联想记忆模型作为部件引入 LSTM 网络中,从而在不引入额外参数的情况下增加网络容量 ;或者将循环神经网络中的部分连接权重作为短期记忆,并通过一个联想记忆模型进行更新,从而提高网络性能.在上述的网络中,联想记忆都是作为一个更大网络的组件,用来增加短期记忆的容量.联想记忆组件的参数可以使用Hebbian方式来学习,也可以作为整个网络参数的一部分来学习.


结束