【深度学习 理论】Recurrent Neural Network (RNN) - 2
给一个Training Sentences,RNN做出了如下分类。我们把”arrive“丢到RNN中,它的y1的reference vector属于”other“ slot。这个reference vector的长度就是slot的个数(属于哪个slot,哪个维度就是1,其余0)。RNN在Learning时如何定义loss function呢?以slot filling 为例,对每个输入, 其输出的
给一个Training Sentences,RNN做出了如下分类。
我们把”arrive“丢到RNN中,它的y1的reference vector属于”other“ slot。这个reference vector的长度就是slot的个数(属于哪个slot,哪个维度就是1,其余0)。
RNN在Learning时如何定义loss function呢?
以slot filling 为例,对每个输入, 其输出的与相应的reference vector计算cross entropy, cross entropy之和就是loss function,这就是train的目标对象。. sentence的每个word进入RNN的顺序不能乱。定义好loss function之后,也要用gradient descent做训练。
计算偏微分之后,就用gradient descent的方法去做。而gradient descent的算法从BP进阶为BPTT(Backpropagation through time). 这里不讲BPTT了。
RNN的training是比较困难的。Loss有时会剧烈抖动,只有幸运的时候才会逐渐变小。
Total Lossde 的变化,在有的地方很平坦,有的地方很陡峭。不幸的话,可能恰好踩在“悬崖”上,原来变化很小,learning rate可能调的很大,但在“悬崖”上的gradient很大,再乘上一个很大的learning rate,整个参数就“飞”出去了。
解决办法:clipping——当gradient大于某个值时,就让gradient等于这个值。
为什么RNN会出现这种情况呢?
通常,可能有人会认为是Activition function的问题,其实,关键点不在这里。
举一个直观的例子,把一个参数做小小的变化,看它output的变化有多大。下面是一个线性的例子。
RNN把同样的东西在不同的时间点反复使用。(memory)。这个w只要一有变化,它可能不会造成任何影响;一旦它造成影响,一半就是“天崩地裂”的影响。
有什么技巧可以帮助我们解决这个问题?
现在最广泛的方法是LSTM。
LSTM可以使error surface不那么崎岖,可以把把比较平坦的地方拿掉,可以把learning rate设得小一点,在learning rate特别小的时候训练。
为什么LSTM可以避免让Gradient特别小呢?
在RNN中,在每个时间点,memory都会被覆盖。而LSTM把memory的值乘一个值再加上output放到cell中去。如果weight会影响memory的话,LSTM会一直存在,除非forget gate关闭。但RNN中由于memory的值会被清除掉,不会一直有影响。
有人又会说,LSTM有forget gate啊,也会把memory清除掉。实际上,LSTM第一个版本的诞生就是为了解决gradient vanish问题的,forget gate是后来加上去的。(甚至现在有一个“传言”:在训练LSTM的时候你要给forget gate特别大的bias,来保证forget gate在大多数时候使打开的。)
现在有另外一个版本的用gate来操控memory的cell叫做Gated Recurrent Unit(GRU)。GRU只有2个gate:input gate、forget gate。我们不讲GRU详细的原理,它的“精神”是“新的不去,就得不来”——当input gate打开时,forget gate自动关闭,就会清除memory中的值;当cell中的值被清除后,才能进行input。
还有其他的方法来解决这个问题:Clockwise RNN 、Structurally Constrained Recurrent Network (SCRN)……
更多推荐
所有评论(0)