序列模型可以用于很多领域,如语音识别,撰写文章等等。总之很多优点。。。
为了后面方便说明,先将会用到的数学符号进行介绍。
输入值中每个单词使用One-shot来表示。即首先会构建一个字典(Dictionary),假设该例中的字典维度是10000*1(如图示)。第一个单词"Harry"的数学表示形式即为[0,0,0,……,1 (在第4075位) ,0,……,0],其他单词同理。
但是如果某一个单词并没有被包含在字典中怎么办呢?此时我们可以添加一个新的标记,也就是一个叫做Unknown Word的伪造单词,用 <UNK> 表示。具体的细节会在后面介绍。
为了将单词之间关联起来,所以将前一层的结果也作为下一层的输入数据。如下图示
下面将对如下公式进行化简:
该节PPT内容:
下面将会对反向传播进行灰常灰常详细的介绍,跟着下面一张一张的图片走起来~
要进行反向传播,必须得有损失函数嘛,所以我们将损失函数定义如下:
计算出损失值后再通过梯度下降进行反向传播
本节主要介绍了其他更多类型的RNN结构,下图参考大数据文摘
凡事开头举个栗子,一切都好说:
假设一个语音识别系统听一句话得到了如下两种选择,作为正常人肯定会选择第二种。但是机器才如何做判断呢?
此时就需要通过语言模型来预测每句话的概率:
下图给出了构建模型的过程以及损失值计算公式。
下图给出了采样之后得到的效果:
左边是对训练得到新闻信息模型进行采样得到的内容;
右边是莎士比亚模型采样得到的内容。
梯度值在RNN中也可能因为反向传播的层次太多导致过小或者过大。
当梯度值过大的时候有一个比较简便的解决方法,每次将返回的梯度值进行检查,如果超出了预定的范围,则手动设置为范围的边界值。
if (gradient > max) {
gradient = max
}
但梯度值过小的解决方案要稍微复杂一点,比如下面两句话:
“The cat,which already ate apple,yogurt,banana,..., was full.”
“The cats,which already ate apple,yogurt,banana,..., were full.”
重点标出的 cat(s)和be动词(was,were) 是有很重要的关联的,但是中间隔了一个which引导的定语从句,对于前面所介绍的基础的RNN网络很难学习到这个信息,尤其是当出现梯度消失时,而且这种情况很容易发生。
我们知道一旦神经网络层次很多时,反向传播很难影响前面层次的参数。所以为了解决梯度消失问题,提出了GRU单元,下面一节具体介绍。
GRU(Gated Recurrent Unit)是一种用来解决梯度值过小的方法,首先来看下在一个时刻下的RNN单元,激活函数为 tanh
有了更新门公式后,我们则可以给出t时刻记忆细胞的值的计算公式了:
注意:上面公式中的 * 表示元素之间进行乘法运算,而其他公式是矩阵运算。
虽然LSTM比GRU更复杂,但是它比GRU更早提出哦。另外一般而言LSTM的表现要更好,但是计算量更大,毕竟多了一个门嘛。而GRU实际上是对LSTM的简化,它的表现也不错,能够更好地扩展到深层网络。所以二者各有优势。
下图是LSTM的结构示意图:
前面介绍的都是单向的RNN结构,在处理某些问题上得到的效果不尽人意
如下面两句话,我们要从中标出人名:
He said, "Teddy Roosevelt was a great President".
He said, "Teddy bears are on sale".
第一句中的Teddy Roosevelt是人名,但第二句中的Teddy bears是泰迪熊,同样都是单词Teddy对应的输出在第一句中应该是1,第二句中应该是0。
像这样的例子如果想让我们的序列模型明白就需要借助不同的结构比如 - 双向递归神经网络(Bidirectional RNN)。该神经网络首先从正面理解一遍这句话,再从反方向理解一遍。
双向递归神经网络结构如下:
下图摘自大数据文摘整理
深层,顾名思义就是层次增加。如下图是深层循环神经网络的示意图
横向表示时间展开,纵向则是层次展开。