首先,我们来思考下,当人工神经网络从浅层发展到深层;从全连接到卷积神经网络。在此过程中,人类在图片分类、语音识别等方面都取得了非常好的结果,那么我们为什么还需要循环神经网络呢?
![v2-ecb54a37944645f8718ac36c4dca6a23_b.jpg](https://i-blog.csdnimg.cn/blog_migrate/cb934323be954d15a625a38b632df1cb.jpeg)
因为,上面提到的这些网络结构的层与层之间是全连接或部分连接的,但在每层之间的节点是无连接的,这样的网络结构并不能很好的处理序列数据。
序列数据的处理,我们从语言模型 N-gram 模型说起,然后着重谈谈 RNN,并通过 RNN 的变种 LSTM 和 GRU 来实战文本分类。
语言模型 N-gram 模型
通过前面的课程,我们了解到一般自然语言处理的传统方法是将句子处理为一个词袋模型(Bag-of-Words,BoW),而不考虑每个词的顺序,比如用朴素贝叶斯算法进行垃圾邮件识别或者文本分类。在中文里有时候这种方式没有问题,因为有些句子即使把词的顺序打乱,还是可以看懂这句话在说什么,比如:
T:研究表明,汉字的顺序并不一定能影响阅读,比如当你看完这句话后。
F:研表究明,汉字的序顺并不定一能影阅响读,比如当你看完这句话后。
但有时候不行,词的顺序打乱,句子意思就变得让人不可思议了,例如:
T:我喜欢吃烧烤。
F:烧烤喜欢吃我。
那么,有没有模型是考虑句子中词与词之间的顺序的呢?有,语言模型中的 N-gram 就是一种。
N-gram 模型是一种语言模型(Language Model,LM),是一个基于概率的判别模型,它的输入是一句话(词的顺序序列),输出是这句话的概率,即这些词的联合概率(Joint Probability)。 使用 N-gram 语言模型思想,一般是需要知道当前词以及前面的词,因为一个句子中每个词的出现并不是独立的。比如,如果第一个词是“空气”,接下来的词是“很”,那么下一个词很大概率会是“新鲜”。类似于我们人的联想,N-gram 模型知道的信息越多,得到的结果也越准确。
在前面课程中讲解的文本分类中,我们曾用到基于 sklearn 的词袋模型,尝试加入抽取 2-gram
和 3-gram
的统计特征,把词库的量放大,获得更强的特征。
通过 ngram_range 参数来控制,代码如下:
因此,N-gram 模型,在自然语言处理中主要应用在如词性标注、垃圾短信分类、分词器、机器翻译和语音识别、语音识别等领域。
然而 N-gram 模型并不是完美的,它存在如下优缺点:
- 优点:包含了前 N-1 个词所能提供的全部信息,这些词对于当前词的出现概率具有很强的约束力;
- 缺点:需要很大规模的训练文本来确定模型的参数,当 N 很大时,模型的参数空间过大。所以常见的 N 值一般为1,2,3等。还有因数据稀疏而导致的数据平滑问题,解决方法主要是拉普拉斯平滑和内插与回溯。
所以,根据 N-gram 的优缺点,它的进化版 NNLM(Neural Network based Language Model)诞生了。
NNLM 由 Bengio 在2003年提出,它是一个很简单的模型,由四层组成,输入层、嵌入层、隐层和输出层,模型结构如下图(来自百度图片):
![v2-53e8dde3e3d7a59f7dc66b756ba4ac93_b.jpg](https://i-blog.csdnimg.cn/blog_migrate/3be90cb43c25c55f81c3ba6101d9e46f.jpeg)
NNLM 接收的输入是长度为 N 的词序列,输出是下一个词的类别。首先,输入是词序列的 index 序列,例如词“我”在字典(大小为|V|)中的