神经网络可以看作是一个大的变分优化器:
给定 y=f(x1, x2..., w),求w使L(y, x..)最小
x是输入,y输出,w是网络参数,L是损失函数。
而任一函数y=f(x1, x2...),他的实际计算过程一般而言是分步骤的,例如:
h1=h1(x1,x2),
h2=h2(x3,x4),
h3=h3(h1,x2..),...
y=f(h2,h3,x5...)
也就是说该函数存在若干中间变量。
这种计算步骤可以画成计算图。
本文想说的是,对于一个待训练的{X,Y}数据集,如果我们能通过一些方法发现最终函数f的计算图关系和中间变量,则我们的神经网络搭建和训练就会大大的简化。
那么问题来了,如何通过数据集去发现计算图呢?该问题暂按下不表。下面举一个实际计算图的例子,详情参考这里,下面简要说明:
该例子是传统rnn的升级版。传统的rnn是一个函数:S1=f(x1,S0),Si就是时序数据在i时刻的总结,我们要求的函数是根据上一刻的总结和这一刻的输入,求出这一刻的总结(需要注意的是,若希望很远的过去的x0对现在的Si也有关的话,需要加一些约束,也就是lstm之类的)。
rnn的升级版on-lstm,是把已有的rnn计算图做了升级,加了一个中间变量r如下:
r1=r(S0, x1)
表示S1的改写级别,比如S是1*10的张量,r1=3的意思就是本次的S1只改写前3个数,后面7个数不变跟S0一样。
加了这个以后,训练出来的结果更好了,因为这个结构是lstm的一个子集,且最优结果函数依然在该子集内。
这个思想和这一篇文章一样,当计算图足够清晰了,最优解依然在子集内的时候,优化参数w的求解就十分容易了!
本例增加了一个中间变量r,就使得相同训练集下的结果更优就是实证。
所以回到我们的问题,如何发现目标函数的计算图以及中间变量,且保证最优函数依然在子集内呢?
This is a question!
网友评论