RNN

作者: Jarkata | 来源:发表于2021-03-05 19:26 被阅读0次

现在考虑这样一个问题,给一句话,如何判断这句话的情感是积极的 (Positive) 还是消极的 (Negative).

例如下图中的一句话 "I hate this boring movie",我们看一眼就知道这句话肯定是消极的,但是如何构建一个网络模型去识别呢?

Naive的方法:

这只是一个 naive 的做法,这样做会存在很多问题。首先如果输入是一个很长的句子,那么这个句子里的单词就会很多,再加上每个单词对应还需要一段长度的词向量,整个参数量就会非常大;其次,这种做法没有考虑到上下文的信息,例如 "我不喜欢你" 这句话,如果你只分析 "喜欢",你会以为这是一个积极的句子,但其实没有考虑到上文中的 "不" 字。再比如,一个人说:我喜欢旅游,其中最喜欢的地方是云南,以后有机会一定要去__。这里填空,是个正常人都知道填 "云南"。我们是根据上下文内容推断出来的,这就意味着,一句话不能单独一个单词一个单词来分析,所以我们希望能有一个 consistent tensor 来存储语境信息,并且在训练的时候能够将这个语境信息利用起来

权重共享的方式

对于第一个问题,如何解决参数量过大,我们可以参考 CNN,卷积神经网络中的每个 kernel 都利用的权重共享的思想,应用到我们这里就是,每个单词经过的 Linear Layer,其 wb ,都是相同的,而不再是上面那张图的 w_1,w_2,...b_1,b_2,...,具体见下图

对于第二个问题,如何将语境信息也贯穿在整个网络训练的过程中?
看下图的网络结构,每一层的输出,都会作为下一层的一部分输入。例如将 "I" 的词向量 x_1h_0作为输入,输出得到 h_1,然后将 "hate" 这个词的词向量 x_2h_2 作为输入,输出得到 ,如此循环下去。因此这种网络被称为循环神经网络(RNN)

下图是一个典型的 RNN 网络结构。右边可以理解为左边按照时间进行展开

假设x_{t-1},x_t表示输入“我”和“是”,x_{t+1}表示输入“中国”,连起来输入就是“我是中国”,那么O_{t-1},O_{t}就应该对应“是”和“中国”,预测下一个词最有可能是什么就是预测O_{t+1}最有可能是什么,应该是"人"的概率比较大。

因此我们可以这样定义:
X_t:表示t时刻的输入, O_t:表示t时刻的输出, S_t:表示t时刻的记忆

因为我们当前时刻的输出是由记忆和当前时刻的输入共同决定的。就像你现在大四,你的知识是由大四学到的知识(当前输入)和大三以及大三以前学到的知识(记忆)的结合。RNN 在这点上也类似,神经网络最擅长做的就是通过一系列参数把很多内容整合到一起,然后学习这个参数,因此就定义了 RNN 的基础
S_t=f(U*x_t+W*S_{t-1})
这里的 f()函数表示激活函数,对于 CNN 来说,激活函数一般选取的都是 ReLu,但是 RNN 一般选用 tanh

假设你大四快毕业了,要参加考研,请问你参加考研是先记住学过的内容然后去考研,还是直接带几本书参加考研呢?答案很显然。RNN 的做法也就是预测的时候带着当前时刻的记忆 S_t 去预测。假如你要预测 "我是中国" 的下一个词,运用 SoftMax 在合适不过了,但预测不能直接用一个矩阵去预测,要转为一个向量,所以最终的公式表示为:
O_t = softmax(W*S_t)

RNN的结构细节:

  1. 可以把S_t当作隐状态,捕捉了之前时间点上的信息。就像你去考研一样,考的时候记住了你能记住的所有信息
  2. 可惜的是S_t并不能捕捉之前所有时间点的信息,或者说在网络传播的过程中会"忘掉" 一部分。就像你考研也记不住所有的英语单词(?)一样
  3. 和卷积神经网络一样,RNN 中的每个节点都共享了一组参数 (U,W,V),这样就能极大降低计算量

BPTT(Back propagation through time)

在之前你已经见过对于前向传播(上图蓝色箭头所指方向)怎样在神经网络中从左到右地计算这些激活项,直到输出所有地预测结果。而对于反向传播,我想你已经猜到了,反向传播地计算方向(上图红色箭头所指方向)与前向传播基本上是相反的

我们先定义一个元素损失函数

整个序列的损失函数:


在这个计算图中,通过y^{'(1)} 可以计算对应的损失函数,于是计算出第一个时间步的损失函数,然后计算出第二个时间步的损失函数,然后是第三个时间步,一直到最后一个时间步,最后为了计算出总体损失函数,我们要把它们都加起来,通过等式计算出最后的𝐿,也就是把每个单独时间步的损失函数都加起来。然后你就可以通过导数相关的参数,用梯度下降法来更新参数。

在这个反向传播的过程中,最重要的信息传递或者说最重要的递归运算就是这个从右到左的运算,这也就是为什么这个算法有一个很别致的名字,叫做“通过(穿越)时间反向传播(back propagation through time)”。取这个名字的原因是对于前向传播,你需要从左到右进行计算,在这个过程中,时刻𝑡不断增加。而对于反向传播,你需要从右到左进行计算,就像时间倒流。“通过时间反向传播”,就像穿越时光,这种说法听起来就像是你需要一台时光机来实现这个算法一样。

其他类型的RNN

  • One to one:这个可能没有那么重要,这就是一个小型的标准的神经网络,输入𝑥然后得到输出𝑦。
  • One to many:音乐生成,你的目标是使用一个神经网络输出一些音符。对应于一段音乐,输入𝑥
    可以是一个整数,表示你想要的音乐类型或者是你想要的音乐的第一个音符,并且如果你什么都不想输入,𝑥可以是空的输入,可设为 0 向量。
  • Many to one:句子分类问题,输入文档,输出文档的类型。
  • Many to many():命名实体识别。
  • Many to many():机器翻译。

CNN与RNN的区别

类别 特点描述
相同点 1、传统神经网络的扩展。
2、前向计算产生结果,反向计算模型更新。
3、每层神经网络横向可以多个神经元共存,纵向可以有多层神经网络连接。
不同点 1、CNN空间扩展,神经元与特征卷积;RNN时间扩展,神经元与多个时间输出计算
2、RNN可以用于描述时间上连续状态的输出,有记忆功能,CNN用于静态输出

为什么RNN训练的时候Loss波动很大

由于RNN特有的memory会影响后期其他的RNN的特点梯度时大时小,learning rate没法个性化的调整,导致RNN在train的过程中,Loss会震荡起伏,为了解决RNN的这个问题,在训练的时候,可以设置临界值,当梯度大于某个临界值,直接截断,用这个临界值作为梯度的大小,防止大幅震荡。

相关文章

网友评论

      本文标题:RNN

      本文链接:https://www.haomeiwen.com/subject/mrclqltx.html