TensorFlow11.2 循环神经网络RNN-循环神经网络、RNN-layer实现
循环神经网络
Sentiment Analysis(情感分析)
类似于淘宝的好评还是差评,我们比较直观的一个方法就是:
这里不好的是:
Downsides:
1.Long sentence
- 100+ words
- too much parameters[w,b]。
就是比如说我们有100个单词,会产生很多个w,b,参数太多了。
2.No context information(没有语义的相关性)
- consistent tensor
就是不如说一句话,我们把他的单词的顺序打乱那个模型也是可以处理的,所以说这里没有语义的相关性。
对于之前的全连接神经网络的参数过多我们使用了一种sharing,就是滑动窗口的方法来解决的。
这里我们也引入它的思想。
就是我们使用同一个线性层。
但是我们每一层需要考虑它的语义,所以我们在每一层都加上它的上一层的参数。
我们可以看出来这个h5已经累加了前面所有的参数,所以我们可以只使用最后一个语境h5进行后续的操作。
我们看这个图,其实这个o5可以反应前面的全部的语义。
就是每一层的输出,它还会做下一层的输入。其中\(x_t\)@\(w_{xh}\)+\(h_{t-1}\)@\(w_{hh}\)其中这个\(x_t\)是这一层的输入。\(h_{t-1}\)是上一个时间轴上面的状态。这个h-1就是之前所有的语境信息。然后这个新得的\(h_t\)作为下一个状态的语境。
然后就是我们需要求loss和Gradient
这里我们使用的是全局共享的思想,所以我们的参数只有两个\(W_{xh}\)和\(W_{hh}\)。所以我们更新的时候只需要更新这两个。
这里我们的求他的偏导的时候我们有一个\(W_R^{k-1}\),这里有一个k-1次方所以会导致它的梯度弥散或者梯度爆炸。
RNN Layer的实现
我们这里的储存的是[batch,seq len,feature len]假设等于[b,80,100],我们需要根据它的seqlen进行展开,就是一个[b,100]。经过操作之后[b,100]=>[b,64]这相当于一个降维的过程。
我们这里的SimpleRNN就是一个简单的RNN=>X\(W_{xh}\)_H\(W_{hh}\)。
然后我们这里:\(W_{xh}\)就是=[input,h],\(W_{hh}\)=[h,h]。我们的这个layers.SimpleRNNCell(3),其中这个3就是h.
这里我们返回的out和h1是一样的。
实现:
我们通过输出可以看出这个out和xt1[0]是一样的。
这里我们input=[4,80,100],我们需要按照80进行分类,然后就是for word in 80:,我们最后按照\(out_{80}\)作为后续的分类。
在这里我们通常取最后一层的最为前面语义的载体
整个的更新过程:
我们后续循环80次之后我们得到的一个out2(t=80),在做后续的分类。
我们真正实现的时候并不用这么复杂,只需要这样就行: