美文网首页
《神经网络与机器学习》笔记(六)

《神经网络与机器学习》笔记(六)

作者: 糖醋排骨盐酥鸡 | 来源:发表于2019-12-19 16:22 被阅读0次

    第八章 注意力机制与外部记忆

    借用人脑的注意力和记忆机制,处理信息过载问题,从而提高神经网络处理信息的能力。

    注意力

    解决信息超载问题的主要手段。也是解决远距离依赖问题的主要手段。

    本节及以后章节中,注意力机制是通常指自上而下的聚焦式注意力

    认知神经学中的注意力

    注意力一般分为两种:

    • 聚焦式注意力:是自上而下的有意识的注意力。
    • 基于显著性的注意力:是自下而上的无意识的注意力

    鸡尾酒会效应:当一个人在吵闹的鸡尾酒会上和朋友聊天时,尽管周围噪音干扰很多,他还是可以听到朋友的谈话内容,而忽略其他人的声音(聚焦式注意力)。同时,如果未注意到的背景声中有重要的词(比如他的名字),他会马上注意到(显著性注意力)。

    人工神经网络中的注意力机制

    在目前的神经网络模型中,我们可以将最大汇聚(Max Pooling)、门控(Gating)机制近似地看作是自下而上的基于显著性的注意力机制

    注意力机制的计算可以分为两步:一是在所有输入信息上计算注意力分布,二是根据注意力分布来计算输入信息的加权平均。

    注意力分布

    为了从N 个输入向量[x_1,\cdots, x_N]中选择出和某个特定任务相关的信息,我们需要引入一个和任务相关的表示,称为查询向量(Query Vector),并通过一个打分函数来计算每个输入向量和查询向量之间的相关性。

    给定一个和任务相关的查询向量q(查询向量q 可以是动态生成的,也可以是可学习的参数),我们用注意力变量z \in [1,N]来表示被选择信息的索引位置,即z = i 表示选择了第i 个输入向量。为了方便计算,我们采用一种“软性”的信息选择机制。首先计算在给定q 和X 下,选择第i 个输入向量的概率\alpha_i
    \begin{align*} \alpha_i&=p(z=i|X,\boldsymbol{q})=softmax(s(x_i,\boldsymbol{q}))\\ &=\frac{exp(s(x_i,\boldsymbol{q}))}{\sum^N_{j=1}s(x_j,\boldsymbol{q})}\\ 其中\alpha_i,称为注意力分布&(Attention Distribution),s(x_i,\boldsymbol{q})为注意力打分函数。\\ 打分函数的不同,注意力&模型就不同,常见的打分函数有以下几种:\\ 加性模型\qquad\qquad&\qquad s(x_i,\boldsymbol{q})=v^Ttanh(Wx_i+U\boldsymbol{q}),\\ 点积模型\qquad\qquad&\qquad s(x_i,\boldsymbol{q})=x^T_i\boldsymbol{q},\\ 缩放点积模型\qquad\qquad&\qquad s(x_i,\boldsymbol{q})=\frac{x^T_i\boldsymbol{q}}{\sqrt{d}},\\ 双线性模型\qquad\qquad&\qquad s(x_i,\boldsymbol{q})=x^T_iW\boldsymbol{q}\\ \end{align*}
    加性模型和点积模型的复杂度差不多,但是点积模型在实现上可以更好地利用矩阵乘积,从而计算效率更高。但当输入向量的维度d 比较高时,点积模型的值通常有比较大的方差,从而导致softmax函数的梯度会比较小。因此,缩放点积模型可以较好地解决这个问题。双线性模型可以看做是一种泛化的点积模型。相比点积模型,双线性模型在计算相似度时引入了非对称性。

    加权平均

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

    att(X,\boldsymbol{q})=\sum^N_{i=1}\alpha_ix_i=\mathbb{E}_{z~p(z|X,\boldsymbol{q})}[x_z]

    注意力机制的变体
    硬性注意力

    软性注意力,其选择的信息是所有输入向量在注意力分布下的期望。

    硬性注意力,只关注某一个输入向量。硬性注意力需要通过强化学习来进行训练。

    硬性注意力有两种实现方式:

    • 一种是选取最高概率的一个输入向量,即att(X,\boldsymbol{q})=x_j,其中 j 为概率最大的输入向量的下标,即\begin{equation} j=\overset{N}{\arg\underset{i=1} \max } \alpha_{i} \end{equation}
    • 另一种硬性注意力可以通过在注意力分布式上随机采样的方式实现。

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

    键值对注意力

    更一般地,我们可以用键值对(key-value pair)格式来表示输入信息,其中“键”用来计算注意力分布αi,“值”用来计算聚合信息。

    (K, V ) = [(k_1, v_1), \cdots, (k_N, v_N)]表示N 组输入信息,给定任务相关的查询向量q 时,注意力函数为:att\Big((K,V),\boldsymbol{q}\Big)=\sum_{i=1}^N \alpha_iv_i=\sum_{i=1}^N\frac{exp\Big(s(\boldsymbol{k_i,q})\Big)}{\sum_jexp\Big(s(\boldsymbol{k_i,q})\Big)}v_i,其中s(k_i,q)为打分函数。

    注意力机制

    如果K=V,就是普通模式,如果K!=V,就是键值对模式

    多头注意力

    是利用多个查询Q = [q_1,\cdots, q_M],来平行地计算从输入信息中选取多组信息。每个注意力关注输入信息的不同部分。

    att\Big((K,V),Q\Big)=att\Big((K,V),\boldsymbol{q}_1\Big)\oplus\cdots\oplus att\Big((K,V),\boldsymbol{q}_M\Big)

    结构化注意力

    如果输入信息本身具有层次结构,可以假设注意力为上下文相关的二项分布,用一种图模型来构建
    更复杂的结构化注意力分布。

    注意力机制的应用

    指针网络

    指针网络是一种序列到序列模型,只利用注意力机制中的第一步,将注意力分布作为一个软性的指
    针(pointer)来指出相关信息的位置。输入是长度为n 的向量序列X = x_1, \cdots, x_n, 输出是下标序列c_{1:m }=c_1, c_2,\cdots, c_m,c_i \in [1, n], ∀i

    和一般的序列到序列任务不同,这里的输出序列是输入序列的下标(索引)。比如输入一组乱序的数字,输出为按大小排序的输入数字序列的下标。比如输入为20, 5, 10,输出为1, 3, 2。

    条件概率p(c_{1:m|x_{1:n}})=\prod_{i=1}^m p(c_i|c_{1:i-1},x_{1:n})\approx\prod_{i=1}^m p(c_i|x_{c_1},\cdots,x_{c_{i-1}},x_{1:n}),其中条件概率p(c_i|x_{c_1},\cdots,x_{c_{i-1}},x_{1:n})可以通过注意力分布来计算。假设用一个循环神经网络对x_{c_1},\cdots,x_{c_{i-1}},x_{1:n}进行编码得到向量hi,则:p(c_i|c_{1:i-1},x_{1:n})=softmax(s_{i,j}),其中s_{i,j}为在解码过程的第i 步时,每个输入向量的未归一化的注意力分布,s_{i, j}=\boldsymbol{v}^{\mathrm{T}} \tanh \left(W \boldsymbol{x}_{j}+U \boldsymbol{h}_{i}\right), \forall j \in[1, n]

    指针网络
    自注意力模型

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

    基于卷积网络和循环网络的变长序列编码

    基于卷积或循环网络的序列编码都可以看做是一种局部的编码方式,只建模了输入信息的局部依赖关系。虽然循环网络理论上可以建立长距离依赖关系,但是由于信息传递的容量以及梯度消失问题,实际上也只能建立短距离依赖关系。

    如果要建立输入序列之间的长距离依赖关系,可以使用以下两种方法:一种方法是增加网络的层数,通过一个深层网络来获取远距离的信息交互;另一种方法是使用全连接网络。全连接网络是一种非常直接的建模远距离依赖的模型,但是无法处理变长的输入序列。不同的输入长度,其连接权重的大小也是不同的。这时我们就可以利用注意力机制来“动态”地生成不同连接的权重,这就是自注意力模型(自注意力也称为内部注意力)。

    假设输入序列为X = [x_1, \cdots, x_N] \in \mathbb{R}^{d_1×N},输出序列为H = [h_1, \cdots, h_N] \in \mathbb{R}^{d_2×N},首先我们可以通过线性变换得到三组向量序列:

    \begin{align*} Q&=W_QX\in\mathbb{R}^{d_3\times N}\\K&=W_KX\in\mathbb{R}^{d_3\times N}\\V&=W_VX\in\mathbb{R}^{d_2\times N} \end{align*}

    其中Q,K, V 分别为查询向量序列,键向量序列和值向量序列,W_Q\in \mathbb{R}^{d_3\times d_1} ,W_K\in \mathbb{R}^{d_3\times d_1} ,W_V\in \mathbb{R}^{d_2\times d_1}分别为可学习的参数矩阵。上面的公式可以看出,self-Attention中的Q是对自身(self)输入的变换,而在传统的Attention中,Q来自于外部。

    自注意力中Q,K,V的计算

    输出向量h_i=att\Big((K,V),\boldsymbol{q}\Big)=\sum^N_{j=1}\alpha_{ij}v_j=\sum^N_{j=1}softmax(s(\boldsymbol{k}_j,\boldsymbol{q}_i))v_j,其中i, j ∈ [1,N] 为输出和输入向量序列的位置,连接权重\alpha_{ij} 由注意力机制动态生成。

    自注意力的计算示图

    如果使用缩放点积来作为注意力打分函数,输出向量序列可以写为H=Vsoftmax(\frac{K^TQ}{\sqrt{d_3}}),其中softmax 为按列进行归一化的函数。

    全连接模型和自注意力模型

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

    自注意力模型可以作为神经网络中的一层来使用,既可以用来替换卷积层和循环层,也可以和它们一起交替使用(比如X 可以是卷积层或循环层的输出)。自注意力模型计算的权重\alpha_{ij}只依赖\boldsymbol{q}_i\boldsymbol{k}_j的相关性,而忽略了输入信息的位置信息。因此在单独使用时,自注意力模型一般需要加入位置编码信息来进行修正。

    外部记忆

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

    人脑中的记忆

    人脑中的记忆具有周期性和联想性。

    记忆周期

    分为长期记忆和短期记忆。

    短期记忆、长期记忆的动态更新过程称为演化(Evolution)过程。因此,长期记忆可以类比于人工神经网络中的权重参数,而短期记忆可以类比于人工神经网络中的隐状态。

    除了长期记忆和短期记忆,人脑中还会存在一个“缓存”,称为工作记忆。工作记忆是一个记忆的临时存储和处理系统,维持时间通常为几秒钟。

    从时间上看,工作记忆也是一种短期记忆,但和短期记忆的内涵不同。短期记忆一般指外界的输入信息在人脑中的表示和短期存储,不关心这些记忆如何被使用;而工作记忆是一个和任务相关的“容器”,可以临时存放和某项任务相关的短期记忆和其它相关的内在记忆。工作记忆的容量比较小

    联想记忆

    大脑记忆的一个主要特点是通过联想来进行检索的。

    联想记忆是指一种学习和记住不同对象之间关系的能力,比如看见一个人然后想起他的名字,或记住某种食物的味道等。联想记忆是指一种可以通过内容匹配的方法进行寻址的信息存储方式,也称为基于内容寻址的存储(Content-Addressable Memory,CAM)。作为对比,现代计算机的存储方式是根据地址来进行存储的,称为随机访问存储。

    和LSTM中的记忆单元相比,外部记忆可以存储更多的信息,并且不直接参与计算,通过读写接口来进行操作。而LSTM模型中的记忆单元包含了信息存储和计算两种功能,不能存储太多的信息。因此,LSTM中的记忆单元可以类比于计算机中的寄存器,而外部记忆可以类比于计算机中的内存单元。

    外部记忆的实现途径有两种:一种是结构化的记忆,这种记忆和计算机中的信息存储方法比较类似,可以分为多个记忆片段,并按照一定的结构来存储;另一种是基于神经动力学的联想记忆,这种记忆方式具有更好的生物学解释性。

    记忆周期 计算机 人脑 神经网络
    短期 寄存器 短期记忆 状态(神经元活性)
    中期 内存 工作记忆 外部记忆
    长期 外存 长期记忆 可学习参数
    存储方式 随机寻址 内容寻址 内容寻址为主

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

    结构化的外部记忆

    比较简单的方式是引入结构化的记忆模块,将和任务相关的短期记忆保存在记忆中,需要时再进行读取。这种装备外部记忆的神经网络也称为记忆网络(Memory Network,MN)或记忆增强神经网络(Memory Augmented Neural Network,MANN)。

    记忆网络结构
    1. 主网络C:也称为控制器(Controller),负责信息处理,并与外界的交互(接受外界的输入信息并产生输出到外界)。主网络还同时通过读写模块和外部记忆进行交互。
    2. 外部记忆单元M: 外部记忆单元用来存储信息, 一般可以分为很多记忆片段(Memory Segment),这些记忆片段按照一定的结构来进行组织。记忆片段一般用向量来表示,外部记忆单元可以用一组向量m_{1:N} =[m_1, \cdots ,m_N]来表示。这些向量的组织方式可以是集合、树、栈或队列等。大部分信息存储于外部记忆中,不需要全时参与主网络的运算。
    3. 读取模块R:根据主网络生成的查询向量\boldsymbol{q}_r,从外部记忆单元中读取相应的信息r = R(m_{1:N}, q_r)
    4. 写入模块W:根据主网络生成的查询向量\boldsymbol{q}_w和要写入的信息a 来更新外部记忆m_{1:N} = W(m_{1:N}, q_w, a)

    通过注意力机制可以实现一种“软性”的寻址方式,即计算一个在所有记忆片段上的分布,而不是一个单一的绝对地址。比如读取模型R的实现方式可以为:\boldsymbol{r}=\sum^N_{i=1}\alpha_im_i=softmax\Big(s(m_i,\boldsymbol{q}_r)\Big),其中\boldsymbol{q}_r是主网络生成的查询向量。

    典型的记忆网络
    端到端记忆网络

    采用一种可微的网络结构,可以多次从外部记忆中读取信息。在端到端记忆网络中,外部记忆单元是只读的。

    端到端记忆网络

    给定一组需要存储的信息m_{1:N} =\{m_1, \cdots ,m_N\},首先将其转换成两组记忆片段A = [a_1, · · · , a_N]C = [c_1, · · · , c_N],分别存放在两个外部记忆单元中,其中A用来进行寻址,C用来进行输出。(简单起见,这两组记忆单元可以合并,即A = C。)

    主网络根据输入x生成q,并使用注意力机制来从外部记忆中读取相关信息r:\boldsymbol{r}=\sum_{i=1}^Nsoftmax(a^T_i\boldsymbol{q})c_i,并产生输出:y=f(q+r),其中f(·) 为预测函数。当应用到分类任务时,f(·) 可以设为Softmax 函数。

    多跳操作

    为了实现更复杂的计算,我们可以让主网络和外部记忆进行多轮交互。在第k 轮交互中,主网络根据上次从外部记忆中读取的信息\boldsymbol{r}^{(k−1)},产生新的查询向量:\boldsymbol{q}^{(k)}=\boldsymbol{r}^{(k-1)}+\boldsymbol{q}^{(k-1)},其中\boldsymbol{q}^{(0)} 为初始的查询向量,\boldsymbol{r}^{(0)}= 0

    假设第k 轮交互的外部记忆为A^{(k)}C^{(k)},主网络从外部记忆读取信息为:\boldsymbol{r}^{(k)}=\sum_{i=1}^Nsoftmax((a_i^{(k)})^T\boldsymbol{q}^{(k)})c_i^{(k)}

    在K 轮交互后,用y = f(\boldsymbol{q}^{(k)}+\boldsymbol{r}^{(k)}) 进行预测。这种多轮的交互方式也称为多跳操作。多跳操作中的参数一般是共享的。为了简化起见,每轮交互的外部记忆也可以共享使用,比如A^{(1)} = · · · = A^{(K)}C^{(1)} = · · · = C^{(k)}

    神经图灵机

    图灵机是图灵在1936年提出的一种抽象数学模型,可以用来模拟任何可计算问题。

    图灵机结构示例

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

    神经图灵机示例

    在每个时刻t,控制器接受当前时刻的输入xt、上一时刻的输出ht−1 和上一时刻从外部记忆中读取的信息rt−1,并产生输出ht,同时生成和读写外部记忆相关的三个向量:查询向量qt,删除向量et 和增加向量at。然后对外部记忆\mathcal{M}_t 进行读写操作,生成读向量rt,和新的外部记忆Mt+1

    读操作

    在时刻t, 外部记忆的内容记为M_t = [m_{t,1}, \cdots ,m_{t,n}],读操作为从外部记忆Mt 中读取信息\boldsymbol{r}\in \mathbb{R}^d

    首先通过注意力机制来进行基于内容的寻址,即\alpha_{t,i}=softmax\Big(s(m_{t,i},\boldsymbol{q}_t)\Big),其中qt 为控制器产生的查询向量,用来进行基于内容的寻址。函数s(·, ·) 为加性或乘性的打分函数。注意力分布αt,i 是记忆片段m_{t,i}对应的权重,并满足\sum^n_{i=1}\alpha_{t,i}=1

    根据注意力分布\alpha_t,可以计算读向量\boldsymbol{r}_t作为下一个时刻控制器的输入:\boldsymbol{r}_t=\sum^n_{i=1}\alpha_im_{t,i}

    写操作

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

    首先,控制器产生删除向量et 和增加向量at,分别为要从外部记忆中删除的信息和要增加的信息。

    删除操作是根据注意力分布来按比例地在每个记忆片段中删除et,增加操作是根据注意力分布来按比例地给每个记忆片段加入at

    \boldsymbol{m}_{t+1, i}=\boldsymbol{m}_{t, i}\left(1-\alpha_{t, i} \boldsymbol{e}_{t}\right)+\alpha_{t, i} \boldsymbol{a}_{t}, \forall i \in[1, n]

    通过写操作得到下一时刻的外部记忆\mathcal{M}_{t+1}

    基于神经动力学的联想记忆

    主要是通过神经网络的动态演化来进行联想,有两种应用场景:1)输入的模式和输出的模式在同一空间,这种模型叫做自联想模型(Auto-Associative Model)。自联想模型可以通过前馈神经网络或者循环神经网络来实现,也常称为自编码器(Auto-Encoder,AE);2)输入的模式和输出的模式不在同一空间,这种模型叫做异联想模型(Hetero-Associative Model)。从广义上讲,大部分机器学习问题都可以看作是异联想,因此异联想记忆模型可以作为分类器使用。

    Hopfield 网络

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

    四个节点的Hopfield 网络

    假设一个Hopfield 网络有m个神经元,第i 个神经元的更新规则为:s_{i}=\left\{\begin{array}{ll}{+1} & {\text { if } \sum_{j=1}^{m} w_{i j} s_{j}+b_{i} \geq 0} \\ {-1} & {\text { otherwise }}\end{array}\right.,其中w_{ij}为神经元i 和j 之间的连接权重,bi 为偏置。

    连接权重w_{ij} 有两个性质:w_{ij}=0\qquad \forall i\in [1,m],w_{ij}=w_{ji} \qquad \forall i,j\in [1,m]

    Hopfield 网络的更新可以分为异步和同步两种方式。异步更新是每次更新一个神经元。神经元的更新顺序可以是随机或事先固定的。同步更新是指一次更新所有的神经元,需要有一个时钟来进行同步。第t 时刻的神经元状态为s_t=[s_{t,1},s_{t,2},\cdots,s_{t,m}]^T,其更新规则为:s_t=f(Ws_{t-1}+b)。其中s_0=x,W=[w_{ij}]_{m\times m}为连接权重,\boldsymbol{b}=[b_i]_{m\times 1}为偏置向量,f(·) 为非线性阶跃函数。

    能量函数:在Hopfield 网络中,我们给每个不同的网络状态定义一个标量属性,称为“能量”。
    \begin{aligned} E &=-\frac{1}{2} \sum_{i, j} w_{i j} s_{i} s_{j}-\sum_{i} b_{i} s_{i} \\ &=-\frac{1}{2} s^{\mathrm{T}} W s-b^{\mathrm{T}} s \end{aligned}
    Hopfield 网络是稳定的,即能量函数经过多次迭代后会达到收敛状态。权重对称是一个重要特征,因为它保证了能量函数在神经元激活时单调递减,而不对称的权重可能导致周期性震荡或者混乱。

    给定一个外部输入,网络经过演化,会达到某个稳定状态。这些稳定状态称为吸引点(Attractor)。一个Hopfield 网络中,通常有多个吸引点,每个吸引点为一个能量的局部最优点。

    Hopfield 网络的能量函数:红线为网络能量的演化方向,蓝点为吸引点。

    联想记忆:吸引点可以看作是网络中存储的模式,因为Hopfield 网络是稳定的,所以输入向量x最终都会达到收敛状态(吸引点),这个过程叫做检索过程。因此,Hopfield的检索是基于内容寻址的检索,具有联想记忆能力。

    信息存储:就是将输入向量存入到网络中的过程,也就是调整神经元之间的连接权重,因此可以看做是一种学习过程。一种最简单的学习方式为:神经元i 和j 之间的连接权重:w_{i j}=\frac{1}{N} \sum_{n=1}^{N} x_{i}^{(n)} x_{j}^{(n)}

    存储容量:对于联想记忆模型来说,存储容量为其能够可靠地存储和检索模式的最大数量。对于数量为m的互相连接的二值神经元网络,其总状态数2m,其中可以作为有效稳定点的状态数量就是其存储容量。

    相关文章

      网友评论

          本文标题:《神经网络与机器学习》笔记(六)

          本文链接:https://www.haomeiwen.com/subject/kzamnctx.html