递归神经网络(Recursive Neural Network, RNN)可以解决有时间序列的问题c;处理诸如树、图这样的递归结构。
CNN主要应用在计算机视觉CV中c;RNN主要应用在自然语言处理NLP中。
c="https://img-blog.csdnimg.cn/direct/7f8163ecf8c145d4a513257f0aebb24c.png" width="1200" />
c="https://img-blog.csdnimg.cn/direct/10d820b4bd344f2ab85785980d1623b0.png" width="1200" />
1.h0c;h1.....ht对应的是不同输入得到的中间结果。
2.处理自然语言I am GodFishhh or AFish:
则对应的输入为X0 -- Ic;X1 -- amc;X2 -- GodFishhhc;X3 -- orc;X4 -- AFishc;再通过一定的方法将自然语言输入转换为计算机能够理解的形式(例如Word2Vec方法c;将文本中的词语转换为向量形式)。
3.RNN网络最后输出的结果会考虑之前所有的中间结果c;记录的数据太多可能会产生误差或者错误。
LSTM长短记忆网络是一种特殊的递归神经网络c;可以解决上述记录数据太多的问题:
c="https://img-blog.csdnimg.cn/direct/440967bbfc4a4816bb8f457a13dbdbbc.png" width="1200" />
在普通的RNN中c;t-1时刻得到的输出值h(t-1)会被简单的复制到t时刻c;并与t时刻的输入值X(t)整合再经过一个tanh函数后形成输出。
而在LSTM中c;对于t-1时刻得到的输出值h(t-1)会有更加复杂的操作。
将文本向量化后c;就可以通过不同方法(欧氏距离、曼哈顿距离、切比雪夫距离、余弦相似度等)来计算两个向量之间的相似度。
c="https://img-blog.csdnimg.cn/direct/bd97c5e5daf24918b3d775043cd04473.png" width="631" />
同时通常来说c;向量的维度越高c;能够提供的信息也越多c;因此所计算出的相似度的可靠性也就越高c;匹配的正确性也就越高(常用向量维度为50~300)
c="https://img-blog.csdnimg.cn/direct/f2003b83f5b54b72822c8adc846580d8.png" width="1200" />
而词向量模型Word2Vec的作用就是把词转化为向量
例如如下训练好的词向量c;将每一个词都表示为50维的向量:
c="https://img-blog.csdnimg.cn/direct/64575bdac8be4a03982ea7fe48309367.png" width="1200" />c="https://img-blog.csdnimg.cn/direct/f8646a624d434927987f953ea61e1a85.png" width="1200" />通过比对不同词向量的热度图可以发现c;有相关特性的词在热度图上较为相似c;而无明显相关特性的词在热度图上则差异较大:
c="https://img-blog.csdnimg.cn/direct/b36cd03e1c2f47369606f545d60f1953.png" width="1112" />
在词向量模型中c;输入可以是多个词c;而在模型的最后一层中连接了SoftMaxc;所以会输出所有词可能是下一个词的概率。
c="https://img-blog.csdnimg.cn/direct/98038b2787b34f5e885ea7fd2bcdf186.png" width="1194" />
而文字的输入则是通过一个embeddings层(词嵌入层)来解决。在神经网络初始化时c;会随机初始化一个N×K的矩阵c;其中N为词典的大小c;K为词向量的维度数。初始的词嵌入曾是随机生成的c;通过反向传播进行更新优化。
c="https://img-blog.csdnimg.cn/direct/c9a641f25c2c495cbee8088967f1a65e.png" width="1200" />
一切具有正常逻辑的语句都可以作为训练数据。
(1).CBOW模型
CBOW的全称是continuous bag of words(连续词袋模型)。其本质也是通过context word(背景词)来预测target word(目标词)。
该模型的输入为上下文c;输出为该上下文中间的词汇:
c="https://img-blog.csdnimg.cn/direct/3bf89426f9724346bcab871423af2553.png" width="765" />
(2).Skip-gram模型
该模型与CBOW模型相反c;模型的输入为一个词汇c;而输出是该词汇的上下文:
c="https://img-blog.csdnimg.cn/direct/a41272b5a51f411293e94ee1da9ced81.png" width="724" />
示例:
c="https://img-blog.csdnimg.cn/direct/0548894223634e4289adc770a9025e6c.png" width="1200" />
如下图所示c;将构建好的数据集丢给词模型进行训练:
c="https://img-blog.csdnimg.cn/direct/7e8340a99631457eb07cae31339b4149.png" width="1200" />
发现最后一层SoftMax的计算在语料库很大的情况下会非常耗时。
因此c;有一种改进方法是将此时的输入和输出都作为输入值c;做一个二分类问题c;如果两个输入是邻居则输出1c;不是邻居则输出0。(eg.传统模型中c;输入notc;希望输出是thouc;但需要经过SoftMax层计算出所有词可能作为下一个词的概率c;但此时则是将not和thou均作为输入c;如果相邻则输出1c;不相邻则输出0)
c="https://img-blog.csdnimg.cn/direct/7e9679d86f0c40a085bb772a54b71990.png" width="984" /> c="https://img-blog.csdnimg.cn/direct/f63a860e1f794cc6afef2f2e513cc4f4.png" width="1045" />
但此时的问题在于c;训练集本身就是由上下文构建出来的c;所以训练集构建出来的输出targer均为1c;无法进行较好的训练。
改进方案:加入一些负样本c;即不相邻的两个输入词c;输出的target值为0.(一般负样本个数为5个左右)
c="https://img-blog.csdnimg.cn/direct/23a05a14f00d480f88bf1317f0ae88fe.png" width="1200" />
(1).初始化词向量矩阵
c="https://img-blog.csdnimg.cn/direct/cfe5e609e45348f1b6e501e2aa68a53d.png" width="1200" />
c="https://img-blog.csdnimg.cn/direct/ca0dff11557d4b3997e2e5c453b115f7.png" width="1200" />
(2).训练模型
通过神经网络反向传播来训练模型c;与普通的训练模型只更新权重值不同c;此时不光会更新权重参数矩阵c;还会更新输入数据。
c="https://img-blog.csdnimg.cn/direct/76234723c5e54aa1bfacdc0f69d37f75.png" width="1095" />