system: [SYSTEM]

user: 3. 模型结构 3.1. 基础结构 作为神经图灵机的一个分支，L-NTM的结构如图1所示，包括一个可供读写的记忆存储模块或称为内存模块 S 和一个神经网络控制器。 S 是一个 M × N 的矩阵，用于存储需要的数据，是记忆的载体，M为内存模块的长度，表示存储数据量的上限，N为每一条存储的维度。 控制器在每一个时刻t都会对 S 进行读取和写入，它的学习目标就是在不同时刻将不同的输入存储到 S t 中的不同位置，并读取相关的记忆用于输出。为了确保能够使用梯度下降进行端到端的训练，需要在整个计算过程中每一个部分都是可微的，因此控制器输出的地址指针不能指向具体的每某个位置，而是输出一个长度为M的指针向量 w t ，其定义与NTM一致： 图1. 神经图灵机基本结构 ∑ k     w t ( k ) = 1 ，     0 ≤ w t ( k ) ≤ 1 ，   ∀ k #(1) 向量中每一个元素代表在该位置写入的数据量。例如当 N = 3 ， w t ( k ) 为 [ 0 ， 1 ， 0 ， 1 ， 0.8 ] 时，控制器会主要在第三个位置写入信息。 L-NTM的控制器中的核心网络采用LSTM网络，LSTM有更好的能力应对序列中的长期依赖问题，从而学习到更好的与外部内存交互的功能。 3.2. 改进的读写方法 通常网络每一个时刻的输出，可能会依赖于多个前期输入，因此在L-NTM中，控制器将会生成多个指针，用于读取多个前期数据。 定义在时刻t第i个读取指针为 w t ( i ) ，所读取的内容为长度为N的行向量 r t ( i ) ，其内容为 S t 中每一行对应读取指针的加权叠加： r t ( i ) ← ∑ j     w t ( i ， j ) S t ( j ) #(2) 生成读取向量后，控制器中的输出映射函数 O 会将L-NTM的内部表示映射到具体的输出： o t = O ( r t ) #(3) 写入时，由于在每个时刻只有单个输入，所以只需一个写入指针 w t ，整个写入过程分为两个部分：擦除 [ 7 ] 和写入。在时刻t，控制器生成擦除向量 e t 、写入向量 a t 和控制写入量的参数 f t 。其中 e t 和 a t 均为N维向量，且 e t 中所有元素和参数 的数值范围均在(0， 1)内。令经过擦除操作的内存为 S ˜ t ： S ˜ t ( i ) ← S t − 1 ( i ) [ 1 − w t ( i ) e t ] #(4) 当 e t 中的元素越接近于0，则表示上一时刻在对应位置的内容会被保留，越接近于1，这部分内容会越接近于被清除。擦除操作之后会执行写入操作， a t 为在 时刻将要写入内存的信息，类似于LSTM中的输入门，此处会有一个控制参数 f t 决定当前输入在内存中的存储量。 在一些自然语言处理的任务中，人们的语言中包含了很多对于记忆没有必要的介词等词语，过滤掉这些非关键词是非常重要的。 S t ← S ˜ t ( i ) + f t w t ( i ) a t #(5) 需要注意这里读取指针和写入指针是不相关的，控制器会分别生成两个对应的指针。 3.3. 改进的写入寻址机制 与NTM对读写采用同一种寻址机制不同，L-NTM分别对读写采用了不同的寻址机制。对于写入指针，受DNC的启发，在确定写入位置时，应考虑整体内存的使用情况和记忆的存储分布。卷积运算提供了一种基于局部并可在整体上进行特征提取的方法 [ 15 ] ，因此首先使用二维相同(same)卷积核K生成一个长度为N的向量 w t l ，其中K的输入通道数为N，设卷积核大小为k。 w t l ( i ， j ) = ( S t ∗ K ) = ∑ m ∑ n     S t ( i + m ， j + n ) K ( m ， n ) #(6) 其中， m ∈ [ − k ， k ] ， n ∈ [ 0 ， N − 1 ] ，且 m ， n ∈ ℤ 。 k的大小决定了对内存模块局部特征提取的范围，k越大，内存中对应行的特征会关注更大的局部区域，同时边缘内存对全局的影响会降低。在我们的实验中内存长度比较短，因此更需要关注局部的内存特征，k的取值不需要过大，在实验中均取为3。 由卷积核提取的特征向量 w t l 的元素有正有负，不符合指针向量的要求(所有元素均大于等于0，且和为1)，因此我们采用softmax函数令每一个元素符合指针要求： w ˜ t = softmax ( w t l ) #(7) 如果内存模块中的存储比较分散，例如[[0.2， 0.3]， [0.1， 0.4]， [0.4， 0.3]]，而不是[[0.9， 0.8]， [0.1， 0.4]， [0.2， 0.3]]这种结构非常清晰的存储模式，这会导致 w t 中的位置过于分散，例如[0.3， 0.3， 0.4]，而不是[0.8， 0.1， 0.1]。分散的存储在规模较小的内存结构中不会存在太大问题，但当内存的长度即N较大时，相对于有限数量的读取指针，分散的存储不利于信息的读取。因此控制器会生成一个大于1的参数 γ t 用于写入指针的聚焦： w t ( i ) ← w ˜ t ( i ) γ t ∑ j   w ˜ t ( j ) γ t #(8) L-NTM与NTM都有指针的聚焦操作，L-NTM的目的是避免在规模较大的内存中的写入位置过于分散，这会导致读取指针数量不是足够大的时候无法获取到大部分有效信息，而NTM的聚焦更倾向于聚焦到某一行中，对于同样的输入，NTM会出现[0.05， 0.9， 0.05]这样的指针，而[0.25， 0.5， 0.25]对于L-NTM就已经足够。由于聚焦程度的不同，经过一段时间读写的内存状态也会有所不同。如图2(a)所示，在NTM中，会更倾向于在某一个位置写下信息，此时的内存状态按倒序依次在内存中进行写入，在其他地方的数据量则会很小，图2(b)所示为L-NTM的内存状态，聚焦程度较小时，写入的信息量会比较分散。 在NTM中，内存模块的初始化全部为接近于0的非常小的数，例如 10 − 6 ，这会导致卷积运算的结果 w t l 除了边界元素都相等，这会对写入指针的聚焦操作造成很大的困难，因此在L-NTM使用高斯分布对内存模块进行初始化，不同位置的存储越不相同，卷积运算后提取的特征越不一致，这将使最终的写入指针更加聚焦与某一位置。 完整的流程如图3所示，首先利用卷积运算提取出内存的特征，之后利用softmax函数令向量满足指针形式，最终利用聚焦运算将写入位置聚集到某几个位置上。 图2. 内存示例，(a)为NTM的内存示例，在NTM中，内存会偏向于按顺序读写，而在L-NTM中，则更加偏向于全局读写 图3. 写入指针的寻址机制 3.4. 改进的读取寻址机制 生成读取指针的过程分为内容寻址和全局寻址两个过程。内容寻址与NTM一致，控制器生成一个N维行向量 c t ，利用相似度度量方法 K [ ⋅ ， ⋅ ] 与 S t 中每一行 S t ( i ) 进行比较，生成基于内容的读取指针 w t c ： w t c ( i ) ← exp ( β t K [ c t ， S t ( i ) ] ) ∑ j exp ( β t K [ c t ， S t ( j ) ] ) #(9) 其中 β t 是一个用于增强或减弱这一时刻的基于内容的寻址权重。内容寻址的目的是在该时刻想要获取什么样的记忆存储，与精确地取得记忆不同，获取大致的想要的内容不需要大量的数据用于训练，同时又足够灵活能够应付更多种类的输入情况。 全局寻址采用的方法同样使用了卷积运算，与写入机制寻址的方法不同的是，在读取的全局寻址中使用多个卷积核，这是为了能够更好的分析内存模块以多种特征向量，同时针对不同的特征向量 w t l ( i ) ，生成不同的控制参数 g t ( i ) ， g t ( i ) 的范围在(0，1)内，用于将 w t c 与 w t l ( i ) 结合起来： w t ( i ) ← g t ( i ) w t c + ( 1 − g t ( i ) ) w t l ( i ) #(10) 上述所有的操作均为可微的，因此L-NTM可以使用梯度下降进行端到端的训练。由于中间有大量的卷积运算，得益于卷积运算可以并行计算的特性，L-NTM的训练和运行都会以更快的速度执行。图4展示了读取指针的寻址机制。 图4. 读取指针的寻址机制 从强化学习 [ 16 ] [ 17 ] 的角度来看，将内存模块视为状态(state)，那么写入机制是对状态转换的函数进行建模，读取机制则为依据当前状态进行动作(action)选择 [ 18 ] 。通过端到端的学习训练，读取机制会逐渐学习到不同内存状态下的读取位置，而写入机制则会学习到依据上一时刻的内存状态判断当前的写入位置。一旦某一个机制趋于稳定，那么后续训练则会按照类似于强化学习的训练过程不断优化以达到最优结果。