RNN如何做learning ?之前我们的网络做learing时,我们需要一个loss function来评估你的model parameter好坏,最后选择一个model parameter让loss function最小。现在回到slot filling。
我们会有训练句子,然后要给句子label,告诉machine说属于哪个slot.
如何定义loss function,假设arrive丢进去,输出是y1,把y1和reference vector做cross entrphy,reference vector长度是定义的slot的个数,如果输入的word对应的slot是other,则在reference vector里对应的other slot的dimension是1,其它都是0.
所以损失函数就是每个时间节点输出的y和reference vector做交叉熵的和,我们需要最小化这个对象。我们也可以用梯度下降法,但是后向传播是进阶版的,BPTT是考虑了时间的。
error surface是非常陡峭的
如何解决?做clipping,比如当梯度大于15时候,就令梯度等于15结束。就算是飞在悬崖边上,也不会飞出去,可以继续做RNN的训练,为什么RNN会有这样的特性呢?有人会说是不是sigmoidfunction的问题,之前梯度消失的问题是因为sigmoid function,改用relu就解决了该问题。可是这里不是这个问题,RNN用relu相反表现比sigmoid function更差。我们有更直观的方法来知道梯度的大小,我们把参数做小小的变化,看它会network output的变化有多大,就可以测出这个参数的梯度的大小。
举一个例子,下面是一个非常简单的RNN,没有bias,输入和输出的weight都是1,另外从memory接到下一个神经元输入的weight是w.y1000=w999. w有一点小小的变化,对输出改变很大,说明梯度大。
以上说明了RNN训练出现的问题,从memroy连接到神经元的weight在不同的时间点被反复使用, 所以w的梯度有时很平缓,但有时却是天崩地裂的改变。
LSTM可以把梯度平缓部分拿掉,解决梯度消失的问题。可以放心把lr调小一点。
为什么LSTM可以解决梯度消失的问题?
GRU精神是旧的不去,新的不来,把forgetgate 和inputgate连动起来,inputgate打开的时候,forgetgate就会洗掉memory里面的值。
下面这篇论文表明identity matrix+relu表现和LSTM类似。
待补充
转载:https://blog.csdn.net/zhulinzhulinlin/article/details/102455807