另外要注意的是,存储矩阵的行数可能很多。想象一下,把一部长篇小说存放到存储矩阵里,每个词都占用一行,需要占用存储矩阵的多少行。 寻址机制 DNC 改进了NTM 的寻址机制。NTM 的寻址机制是 content-based 和 location-based 的混搭。为什么需要改进呢?原因有三。 NTM 不能保障多个存储单元之间,不相互重叠,不相互干扰。dynamic memory allocation: allocate a free space NTM 不能释放存储单元,如果处理很长的序列时,譬如处理一部超长的长篇小说,搞不好所有存储都会被占满,导致系统崩溃。dynamic memory allocation: free gates 如果连续做几个读写操作,它们所使用的存储单元的位置,最好是相邻的。但是在NTM 中,一旦某个读写操作,远远跳到其它存储区域,那么后续操作也跟着去其它区域,而且失忆,想不起来原先的存储区域在哪里。temporal link matrix DNC 的寻址机制,把读操作和写操作分开。DNC 用 content-based 和 dynamic memory allocation 的混搭方式,处理写操作。用 content-based 和 temporal memory linkage 的混搭方式,处理读操作。 1. content-based 寻址: 比较需要处理的目标 vector,与存储矩阵中每一行的 vector,用余弦距离来计算两者相似性。取存储矩阵中,与目标 vector 距离最短的行。 计算余弦距离时,需要一个系数向量,beta,这个系数向量是被训练出来的。 2. dynamic memory allocation 存储单元分配: 每一个存储单元,都是等长的 vector。当每一个存储单元被 free 的时候,整个 vector 中的每一个 element,都可以用来写入新数据。但是当一个 vector 中有若干 elements 已经被占用时,剩下的 elements 还可以被写入新数据。 想象一下,如果每个 vector 的长度是 100,又如果某个 vector 里,已经写入了一个不长的词,但是还有剩余的 elements,这些剩余的 elements 可以用于给这个词做词性标注等等。但是如果剩余的 elements 不多,那么词性标注只好被写到其它行的 vector 里。 DNC 设计了一个存储单元占用向量 u。u(i) = 0 时第i行的 vector 中,所有 element 都可以被写入新数据,而当 u(i) = 1 时第 i 行的 vector 中所有 elements 都已经被占用了。 但是如果存储矩阵中有两行,i 和 j,分别有完全相同的 elements 可以被写。谁先被写,取决于权重向量 wt。wt 体现了存储使用的策略,策略既可以是尽可能写入最新释放的存储单元,也可以尽可能写入内容相似,而且没有被完全占用的存储单元。这个权重向量 wt,是可以根据被训练出来的。 3. Temporal memory linkage 读写时序的关联: Dynamic memory allocation 没有记录历次写操作时,loc(t) 发生在哪个存储单元,以及loc(t+1) 发生在哪个存储单元。而记录历次写操作的存储单元的位置顺序,是有用的。 DNC 用 N^2 的方阵,来记录 temporal link,其中 L(i, j) 记录着 t 时写操作发生在存储单元 j,而 t+1 时写操作发生在存储单元i的概率。L(i, j) 可以是简单的统计结果,也可以是加权的统计结果,权重体现了控制策略。权重是可以被训练出来的。 当 N 很大的时,理论上来说 L 方阵会占用很多空间。但是鉴于 L 方阵很稀疏,很多 L(i, j) 等于 0。根据 DeepMind 团队的估算,L 实际占用空间只有 O( N ),计算成本只有 O( N * Log N )。 需要训练哪些参数? 除了读写操作、以及寻址操作中的几个权重向量以外,还有作为 controller 的 RNN 的参数。RNN 可以选择结构比较简单的 neuralnet work,也可以选择结构更复杂的 LSTM。选用 LSTM 意味着有更多参数,需要被训练。 训练数据通常不包含读写操作发生在哪个存储空间上的信息。譬如 NTM 中,Priority Sort实验的训练数据,是一连串(输入,理想输出)pairs。每个 pair 中的输入,是 20 个向量,每个向量伴随着 priority 打分。每个 pair 中的理想输出,是从输入的 20 个向量中,挑选出来的 16 个,并且按 priority 得分排序。 注意,训练数据中不包含读写操作在哪些存储单元上进行的信息。 把 DNC 应用到 Graph 操作中 (责任编辑:本港台直播) |