【深度学习 理论】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 为例,对每个输入, 其输出的与相应的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)……

猜你喜欢

转载自blog.csdn.net/Aibiabcheng/article/details/108503471