前言

之前的文章都是以卷积网络为基础,对图像进行一些处理。但是有一类数据实际上并不是跟图像一样具有较强的空间关联性。而是与时间有关。比如我们的说的一句话,如“你好”,说出“你”这个字,下一个字大概率是“好”,这样组成一个词“你好”,所以传统卷积网络并不适合处理语言,因此我们将引出循环神经网络来对语言进行训练。

语言模型

首先我们引入语言模型,这是自然语言处理常用的技术。由前面的例子我们可以认为一句话的每一个字都与前面的字有关。所以我们可以把一整句话看成一个不同时间的序列。

比如有一个长度为T的句子,我们可以分解成

P(W1, W2, W3, W4…WT)

至于计算,我们很自然的想到了条件概率
即每个字都与之前的输出有关
假设我们是四个字的序列
那么整个序列的概率就为
P(W1, W2, W3, W4) = P(W1)P(W2|W1)P(W3|W1, W2)P(W4|W3, W2,W1)

我们这里就可以语言模型的一个缺陷
就是计算一个序列的时候,需要计算大量的概率

而且这些概率具有较强的相关性,计算w3的时候要计算与w1,w2的概率,当序列较长的时候,这个计算复杂度是急速上升的
所以我们提出这个语言模型参数过多,并不适合我们实际应用

n元语法——马尔可夫模型

那么我们在语言模型上进行简化,假设一个字只与之前的n个字有关,这种就是一种n元语法。它是以马尔可夫假设为基础,将语言模型简化成一个n元马尔可夫模型

当n为1的时候,每个字符就只与自己的概率有关
P(W1, W2, W3, W4) = P(W1)P(W2)P(W3)P(W4)

n为2的时候,只与前面的1个字符有关
P(W1, W2, W3, W4) = P(W1)P(W2|W1)P(W3|W2)P(W4|W3)

同理我们可以推出其他n元语法的情况

n比较小的时候,当前字符与前面的字符相关性较低,预测的并不准确

当n比较大的时候,也会出现跟语言模型相同的问题,即复杂度过大,并且需要大量内存存储各个词的词频

循环神经网络

于是我们提出了一种循环神经网络

它并不是单纯的记住各个词的词频
而是利用了传统神经网络的隐藏层思想

将之前的词汇作为各个词的隐藏层输入,这样每个词在一定程度上都与之前的词汇有关联,而且也不会带来计算复杂度的提升

循环神经网络初接触
上图就是循环神经网络的整体架构
它跟传统的神经网络结构的区别就是隐藏层这一块的设计

传统的神经网络是一种前馈神经网络
每一层的计算都只传递到下一层,再将梯度反向一层层传回来进行学习

而循环神经网络的隐藏层的输出不仅传递给输出层,并且传递到下一步状态的隐藏层, 这样一步步的传递,假设当前层为Xt,那么Xt的隐藏层输入就来自X1 - X(t-1) 的隐藏层各个输出

总结

循环神经网络的精髓就在于,利用隐藏层将之前时间步信息进行计算提取,并有效的传递给下一时间步

当然实际应用还有梯度爆炸等等问题、

具体实现待后续文章更新