循环神经网络(rnn)

循环神经网络的入门

大家好,上次我介绍了回归训练模型。这节课我们来介绍一个怎么对时间信号序列进行处理的一个网络类型,叫做循环神经网络,或者英文名字叫做RNN。

首先我们来看一个非常简单的案例,也就是说对于我们的评价,比如说我们淘宝的好评和差评,首先我们的系统要能够分析,我们给出的这个评论我们给出的评论到底是一个正向的,还是一个负向的,就是说是一个好评,还是一个差评,怎么处理这种数据?
在这里插入图片描述
比如说我们有一个5句话的评价,A,I hate this boring movie,首先我们通过hate和boring这两个单词,基本上我们以人的制定来说就可以很好地评价出来了,这是一个负面评价,对吗?
就说这个电影不好看。那么对于机器来说,我们怎么来解决这样一个问题?首先我们已经知道怎么对一个单词来进行表示,我们如果用gloab的方式的话,i会是一个100维的向量,hate这里也是一个100维的向量,那么整句话他们要怎么表示?
整句话,它是一个第1维度是5,第2维是100的一个这样的tensor,然后在每个时间戳我们会得到一个100维的tensor,对于每个100维的tensor,我们一种最容易的方式是什么?
我们把100维的tensor和一个线性层相连接来提取一部分的特征,比如说我们会把100维度的tensor作为一个X样本输入,然后再跟一个W1和B1相乘 ,这是一个标准的线性层,我们把这个标准的线性层得到一个tensor
或者说做一个降维抽取一些高层特征,比如说我们会把它变成一个二维的特征,然后我们把这一部分同样道理,我们跟另外一个W2和B2的线形成做一个这样的线性的作为一个特征的抽取,假如说我们这里是得了一个二维的,这里也是得到一个二维的,因此我们网络中间一共有多少个这样的tensor,一共有5个线性层对吗?
然后每个线性层它有两个参数,一个是W和B参数,然后这方面我们再用一个线形成,也就是说我们会把这些特征5个2这样合并在一起,因此它就是一个五个二这样的数据和在一起在做一个线性层 输出都是1,它代表给出一个句子的情况,下面它的评价是positive的概率,因此他就是一个二分类的问题,我们这种方式比较很好的把这个问题给表达出来了 ,但是我么你来分析一下,这种方式存在一个问题是什么呢

首先对一个句子,我们这里表达的是一个5个单词的句子,但是实际的凭证来说,有些人可能会写上百条上千台的汉字的评论,因此实际生活中的一个句子也是非常长的,比如说一段 文字一本小说单词数量就更多了,所以要处理这么多信息的话,我们的模型来说常常是非常大的,你要对于每一个单词要生成一个W和B的这样的线性层,然后你会把这线形成在做一个聚合,所以的话。
这种方式是非常不利于处理一个长度的句子的。然后还有另外一个更为致命的是什么?更为致命的是它没有一个向下的语境信息,我们人去交流的时候,他会有一个向下语境的信息,比如说我在说这句话的时候上一句话说了什么?下一句话说了什么,我们联合起来做一个综合的推断。然后说简单一点,就是说即使是我们讲一句话,我们讲了我不喜欢你,如果你只是看到喜欢的话,你以为还有我喜欢你对吗?
大家在喜欢前,我有一个步子,所以就意味着说我们这句话不能够单独的一个单子拿来分析,如果你一个单词一个单词拿来分析的话,那种方法就非常不智能的不健全人的思维模式,所以的话我们是需要一个constant子这样的记忆,就有一个协调的一致性的、从头到尾的这样的单元,希望能够存储一个语境信息,然后你能够很好地把语境信息利用起来,这样子的话,你处理这个时间训练的信号的话,你才能够得心应手,对吗?

那么怎么处理这种时间信号的序列的信息,这是最开 始的版本,我们每个地方都有个W1和B1,w2和B2对不对?

在这里插入图片描述
首先是我们希望权值能得到共享,这样子的话我们会减少网络的参数量,然后能够很好地处理一些更长的句子,那么怎么会权值共享的?我们一个初步的想法,就是说大家看一下,把所的W1、W2、W3全部用一个tensor来处理。在这里插入图片描述
这意味着说我wb我这个线形成的抽取特征的能力,它是针对于所有单词的,而不是说我这一个层只处理第1个单词,第二个层只处理2个单词,我现在把它共享以后,就是说我这一层它可以处理所有的单词所有的单词经过我这里过一遍以后,那么我就会把你的语境信息给提取出来,这种模式是很好的利用了White sharing,他也是cnn的一个基本思路,就是一局部相关的信息,我只考虑局部相关的信息,然后我们把kernel不停的共享,然后我们在rnn里面也用了个信息。
我们现在是利用white sharing的方式来尝试的减少这个网络的参数量, 然后我们把每一句话的w和b,每一个层抽取特征的这个功能给共享掉, 这样子的参数量就会减少很多

我们才能这种方式从一定程度上面解决到长句子处理难的问题。
然后我们再来看第2个更为致命的问题是什么呢?我们需要一个长期的记忆来保存一个语境信息,也就是说当我听到喜欢这个单词的时候,我不会只说开心,我应该看到喜欢之前还有一个不字,这样子的话,你才能够很好的处理这个东西存在。然后你甚至还要考虑下一句的 这些信息,这里的话我们就必须得想办法有一个这样的持续的单元,这个单元的话他能贯穿你整个语境。
这个东西它就是有个这样作用,就是说你每一次创立的时候,你不只是基于一个当前的输入,你应该还有一个语境这样的单元来帮助你更好的分析,帮助你更好的提取自己特征,对吗?所以的话我们来看一个语境的相关的信息,现在我说I,我这个i字,你可以根据我这个i字来分析一些特征出来,但是你不能单纯的根据输入,你还根据上一个单元或者说网络初始化化的一个输入,有没有发现?
跟上一个是完全不一样的,上一个直接基于这个输入来做一个特征的提取。然后我们现在的思路就是说要有一个持续的单元,这个单元就会贯穿整个网络,这样子能够保存一个语境信息,因此的话我对于这一步操作的话,我不只是考虑到X的输入,我还考虑了一个初始化的输入,对吗?然后我们会根据第1个单词和初始化输入会得到一个语境信息,我们把这个单元的语境信息叫做H1,

H1我们在下一步做的时候,不只要考虑下一步的单词,还要考虑上一步的语境信息,对吗?大家来看一下H1是不是到这里来了?在这里插入图片描述,我们这一步的输入是不是在这里?现在发现这个模式可能比较接近我们想要的一个模式,也就是说即使我们不只是实现了权值共享,WHH和WXH都是一样的,然后我们还实现了一个与语境贯穿,就每一步,我们不只是考虑当前的一个输入,我们还考虑一个上一步的一个输入。
在这里插入图片描述
对吗?大家再看下一个单词,H2作为当前的一个输入,X做了一个新的输入,对吗?这么一看,好像已经达到了我们想要的一个功能。也就是说我们在做这个时间信号处理的时候,我们有一个H的单元,叫做H的单元,它的功能就类似于一个memory。他会把你的一个语境的存储下来,只要你每一次会读入一个新的单词,但是你也会考虑一个当前语境信息,我们把这一个展开的东西给它合并在一起。
那就是什么呢?比如说我们当前的memory,我们把它初始化0,
在这里插入图片描述
您然后我们每一次送一个XT对吗?我首先我们一句话 ,比如说你有5个单词,然后三我们一个有三个batch,每个单词我们一个100维度的向量来表示。因此对于每个XT的维度是什么?[3,100]。然后我们把当前的XT和初始化了marry和在一起来考虑,快得到一个新的memory,对吗?
我们把新的memory叫做HT ,最开始的memory叫做H0。然后你得了新的memory以后,你会更新自我,大家注意这就是rnn和CNN的区别,cnn就是一股脑的往前传。但是所以对于RNN来说,有一个核心的变量叫做H7或者叫做memory会,叫做一些你可以自己起个名字自己去理解它,就类似于一个这样的语境的信息在这里面。这些语境信息会不停地自我更新,他自我更新的时候是取决于上一次的语境以及和这一次的当前输这种方式,其实我们刚刚分析了是非常合理的。
然后他就通过这种方式不停地滚动来得到一个最终的输出。展开就这个模式
在这里插入图片描述 你每一次会得到一个语境信息,每一次会达到一个语境信息,然后你最早说出到底是取决于哪个H呢?这个完全是由自己来决定,你可以只采用最后一个时间的ht,你也可以把每一个事件的HT综合起来再做一个聚合,这个是非常自由的。 它提供了一种那种提供了全部的可能性,因为他每个时间戳都有一个语境信息,你那里是取中间的一个位置信息,还要全部履历信息,还取最后一个时刻的语音信息,这完全取决于你。