Neural Turing Machine

原文网址:
http://cpmarkchang.logdown.com/posts/279710-neural-network-neural-turing-machine

Introduction

Recurrent Neural Network 在进行Gradient Descent 的时候,会遇到所谓的Vanishing Gradient Problem ,也就是说,在后面时间点的所算出的修正量,要回传去修正较前面时间的参数值,此修正量会随着时间传递而衰减。

为了改善此问题,可以用类神经网路模拟记忆体的构造,把前面神经元所算出的值,储存起来。例如: Long Short-term Memory (LSTM) 即是模拟记忆体读写的构造,将某个时间点算出的值给储存起来,等需要用它的时候再读出来。

除了模拟单一记忆体的储存与读写功能之外,也可以用类神经网路的构造来模拟Turing Machine ,也就是说,有个Controller ,可以更精确地控制,要将什么值写入哪一个记忆体区块,或读取哪一个记忆体区块的值,这种类神经网路模型,称为Neural Turing Machine

如果可以模拟Turing Machine ,即表示可以学会电脑能做的事。也就是说,这种机器学习模型可以学会电脑程式的逻辑控制与运算。

Neural Turing Machine

Neural Turing Machine 的架构如下:
Neural Turing Machine

可分为几个部分:
Input: 从外部输入的值。
Output: 输出到外部的值。
Controller: 相当于电脑的IO和CPU,可以从外部输入值,或从记忆体读取值,经过运算,再将算出的结果输出去,或写入记忆体, Controller 可以用feed forward neural network 或者recurrent neural network (相当于有register的CPU)来模拟。
Read/Write Head: 记忆体的读写头,相当于pointer ,是要被读取或被写入的记忆体的address。
Memory: 记忆体,相当于电脑的RAM,同一个地址可对应到一整排的记忆体单位,就像电脑一样,用8个bit组成的一个byte,具有同一个memory address。

以下细讲每一部份的数学模型。

Memory

memory 是一个二维阵列。如下图,一个memory block 是由数个memory cell 所构成。同一个block 中的cell 有相同的address 。如下图中,共有 n block , 每个blockmcell

操作Memory 的动作有三种:即ReadEraseAdd

Read

Read 是将记忆体里面的值,读出来,并传给controller 。由于记忆体有很多个memory block ,至于要读取哪个,由读写头( Read/Write Head )来控制,读写头为一个向量 w ,其数值表示要读取记忆体位置的权重,满足以下条件:

iw(i)=10w(i)1,i

读写头内部各元素 wi 的值介于0 到1 之间,且加起来的和为1 ,这可解释为,读写头存在的位置,是用机率来表示。而读出来的值,为记忆体区块所储存的值,乘上读写头在此区块 i 的机率 w(i) ,所得出之期望值,如下:

riw(i)M(i)(1)

其中, r Read vector ,即从记忆体读出来的值, M(i) 为记忆体 i 区块的值, 而 w(i) 为读写头 w 在区块 i 的机率。

例如下图中, w(0)=0.9 w(1)=0.1 ,即表示,读写头在位置0 的机率为0.9,在位置1 的机率为0.1 。

Read

将上图中记忆体内部的值 M(i) ,以及读写头位置的值 w(i) ,代入公式(1),即可得出

r0r1r2=10.9+20.110.9+10.120.9+40.11.11.02.2

Erase

如果要删除记忆体内部的值,则要进行Erase ,过程跟Read 类似,都需要用读写头w 来控制。但删除的动作,需要控制去删除掉哪个memory cell 的值,而不是一次就把整个memory block 的值都删除。所以需要另一个erase vector e 来选择要被删除的cellerase vector 为一向量,如下:

0e(j)1,0jm1,j

其中, j 为一个介于0~m-1 之间的数, m 为block size 。向量元素的值 e(j) 介于 0~1 之间。如果值为1,则表示要清空这个cell 的值,若为0 则表示保留cell 原本的值, erase 的公式如下:

M(i)(1w(i)e)M(i)(2)

其中, w 是用来控制要清除哪个memory block e 是要控制清除这个block 里面的哪些cell ,如下图所示:

Erase

上图中,根据 w e 这两个向量所选择的结果, 在 M 中,共有四个cell 的值被削减了,分别位于左上角和左下角,用较明亮的背景色表示其位置。
将上图中 w e M 中的值,代入公式(2) ,可得出此结果,如下:

M=1(10.9)12(10.9)2(10.1)14(10.1)321.........=0.110.21.813.6321.........

Add

将新的值写入记忆体的动作为 add 。之所以称为add (而非write )因为这个动作是会把记忆体内原本的值,再「加上」要写入的值。至于要把哪些值加到记忆体,则需要有一个add vector ,其维度和memory block 的大小 m 相同。 Add 的公式如下:

M(i)M(i)+w(i)a(3)

过程如下图所示:

Add

上图中,位于 M 的左上角,共有四个cell 的值被增加了。
将上图中 w a M 中的值,代入公式(3) ,可得出此结果,如下:

M=0.1+0.91.0+0.90.21.8+0.11.0+0.13.6321.........=1.01.90.21.91.13.6321.........

Controller

Controller 为控制器,它可以用类神经网路之类的机器学习模型来代替,但其实可以把它当成是黑盒子,只要可以符合下图中所要求的inputoutput 以及各种参数的值,就可以当controller

Controller

上图中, controller 根据外部环境的输入值input,以及read vector r ,经过其内部运算,会输出output 值到外在环境,还有erase vector e add vector a ,来控制记忆体的清除与写入。但还缺少了读写头向量 w

如果要产生读写头向量 w , 需要透过一连串的Addressing Mechanisms 的运算,最后即可得出读写头位置。而controller 则负责产生出Addressing Mechanisms 所需的参数。

Addressing Mechanism

controller 会产生五个参数来进行addressing mechanisms ,这些参数分别为: k,β,g,s,γ 。其中, k s 为向量,其余参数为纯量,这些参数的意义,在以下篇章会解释,整个addressing mechanisms 的过程如下图所示。

Addressing Mechanism

上图中,总共有四个步骤,这四个步骤共需要用到这五种参数,经过了这一连串的过程之后,最后所产生出的 w 即为读写头位置,如上图左下角所示。以下细讲每个步骤在做什么。

Content Addressing

首先,是找出记忆体中跟参数memory key k 值最相近的记忆体区块。

读写头的位置 w ,就先根据记忆体区块中,跟 k 的相似度来决定,公示如下:

w(i)eβK[k,M(i)]jeβK[,M(j)]

其中, K[k,M(i)] 表示memory key k 跟记忆体区块 M(i) cosine similarity ,即两向量的夹角,如果 k M(i) 的内容越接近的话,则 K[k,M(i)] 算出来的值会越大。最后算出来的值 w(i) ,即是 k M(i) 的相似度,除以记忆体内所有区块相似度,标准化的结果。
cosine similarity 的公式如下:

K[u,v]=uv|u||v|

经过了cosine similarity 后,越相似的向量,值会越大,而参数 β 是个大于0的参数,可用来控制 w 内的元素值,集中与分散程度,如下图所示:

Content Addressing

上图中,向量 k 中的值,与记忆体中第三行区块的值最相似(用较浅色的背景表示)。但如果 β 很大(例如: β=50 ),算出来的 w 值会集中在第三个位置,也就是说,只有第三个位置的值是1,其他都是0(用较浅色的背景表示),如上图的左下方。如果 β 很小(例如: β=0 ),则算出来的 w 值会平均分散到每个元素之中,如上图的右下方。

Interpolation

读写头其实也是有「记忆」的,也就是说,目前时间点的 wt ,也可能会受到上个时间点 wt1 的影响,要达到这样的效果,就是用content addressing 所算出的值 wt ,和上个时间点的读写头位置` wt1 interpolation ,公式如下:

wtgwt+(1g)wt1

其中,参数 g 用来表示 w 有多少比例是这个时间点content addressing 所算出的值,还是上个时间点的值。如下图所示:

Interpolation

如果 g=1 ,则 w 的值会完全取决于这个时间点content addressing 所算出的值,如上图的左下方,若 g=0 ` , w 会完全取决于上个时间点的值,如上图的右下方。

Convolutional Shift

如果要让读写头的位置可以稍微往左或往右移动,这就要用Convolutional Shift 来做调整。参数 s 是一个向量,用convolutional shift ,来将 w 的值往左或往右平移,公式如下:

w(i)jw(j)s(ij)

举个例子,如果 s 中有三个元素: s1,s0,s1 ,则 w(i) 经过了以上公式后,结果如下:

w(i)w(i+1)s(1)+w(i)s(0)+w(i1)s(1)

根据此公式, w(i) 的值,如下图所示:

Convolutional

也就是说, s1=1 时,可让原本的 wi+1 往左移一格,移到 wi ,若` s1=1 时,可让原本的 wi1 往右移一格,移到 wi

举个例子,如果 s1=1,s0=0,s1=0 ,则 w 中的值,全部往左移动一格,若碰到边界则再循环到最右边,如下图左方所示。如果 s1=0,s0=0,s1=1 ,则 w 中的值,全部往右移动一格。若 s1=0.5,s0=0,s1=0.5 ,则 w 为往左和往右移动后的平均,如下图右方所示。

Convolutional Shift

Sharpening

此过程是再一次调整 w 的集中与分散程度,公示如下:

w(i)w(i)γjw(j)γ

其中, γ 的功能和Content Addressing 中的 β 是一样的,但是经过了接下来的InterpolationConvolutional Shift 之后, w 里面的集中度又会改变,所以要再重新调整一次。

Sharpening

Experiment: Repeat Copy

关于Neural Turing Machine 的学习能力,可以参考以下例子。

在训练资料中,给定一个区块的data (如下图左上角红色区块)做为input data ,将这个区块复制成七份,做为output data 。则Neural Turing Machine 有办法学会这个「复制」过程所需的运算程序,也就是重复跑七次输出一样的东西。

Experiment
Experiment

从上图中,可看到读写头的移动,重复走了相同的路径,走了七次,依序将记忆体中储存的 input data 的值,读出来并输出到output

有个完整的 Neural Turing Machine 套件,以及此实验的相关程式码于:https://github.com/fumin/ntm

Reference

Alex Graves, Greg Wayne, Ivo Danihelka. Neural Turing Machines. 2014

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值