TensorFlow11.2 循环神经网络RNN-循环神经网络、RNN-layer实现

循环神经网络

Sentiment Analysis(情感分析)
image
类似于淘宝的好评还是差评,我们比较直观的一个方法就是:
image
这里不好的是:
Downsides:
1.Long sentence

  • 100+ words
  • too much parameters[w,b]。

就是比如说我们有100个单词,会产生很多个w,b,参数太多了。
2.No context information(没有语义的相关性)

  • consistent tensor
    就是不如说一句话,我们把他的单词的顺序打乱那个模型也是可以处理的,所以说这里没有语义的相关性。

对于之前的全连接神经网络的参数过多我们使用了一种sharing,就是滑动窗口的方法来解决的。
这里我们也引入它的思想。
image
就是我们使用同一个线性层。
但是我们每一层需要考虑它的语义,所以我们在每一层都加上它的上一层的参数。
image
我们可以看出来这个h5已经累加了前面所有的参数,所以我们可以只使用最后一个语境h5进行后续的操作。
image
我们看这个图,其实这个o5可以反应前面的全部的语义。

image

就是每一层的输出,它还会做下一层的输入。其中\(x_t\)@\(w_{xh}\)+\(h_{t-1}\)@\(w_{hh}\)其中这个\(x_t\)是这一层的输入。\(h_{t-1}\)是上一个时间轴上面的状态。这个h-1就是之前所有的语境信息。然后这个新得的\(h_t\)作为下一个状态的语境。
image

然后就是我们需要求loss和Gradient
image
这里我们使用的是全局共享的思想,所以我们的参数只有两个\(W_{xh}\)\(W_{hh}\)。所以我们更新的时候只需要更新这两个。
image
这里我们的求他的偏导的时候我们有一个\(W_R^{k-1}\),这里有一个k-1次方所以会导致它的梯度弥散或者梯度爆炸。

RNN Layer的实现

image

我们这里的储存的是[batch,seq len,feature len]假设等于[b,80,100],我们需要根据它的seqlen进行展开,就是一个[b,100]。经过操作之后[b,100]=>[b,64]这相当于一个降维的过程。

image
我们这里的SimpleRNN就是一个简单的RNN=>X\(W_{xh}\)_H\(W_{hh}\)
image
然后我们这里:\(W_{xh}\)就是=[input,h],\(W_{hh}\)=[h,h]。我们的这个layers.SimpleRNNCell(3),其中这个3就是h.
image
这里我们返回的out和h1是一样的。
实现:
image
我们通过输出可以看出这个out和xt1[0]是一样的。
这里我们input=[4,80,100],我们需要按照80进行分类,然后就是for word in 80:,我们最后按照\(out_{80}\)作为后续的分类。
image
image

在这里我们通常取最后一层的最为前面语义的载体
image
整个的更新过程:
image
我们后续循环80次之后我们得到的一个out2(t=80),在做后续的分类。
我们真正实现的时候并不用这么复杂,只需要这样就行:
image

posted @ 2023-06-25 12:59  lipu123  阅读(21)  评论(0编辑  收藏  举报