史上最简单、实际、通俗易懂的PyTorch实战系列教程!(新手友好、小白请进、建议收藏)
自然语言处理(NLP)
一、递归神经网络(RNN)
递归神经网络只是在传统的神经网络上进行一个改进,就是可以处理时间序列了。下图右边的架构,隐藏层有一个回路,这个回路可以保存得到隐藏层得到的特征参与下一次的运算。
比如下图,x0,x1,x2,…,xt 表示多个时间序列,不同的时刻。假如 x0 表示今天上午的股票价格,x1 是今天中午的股票价格,x2 是今天晚上的股票价格等等等。那么 h0,h1,h2,…,ht代表的就是他们每个时刻输出的结果(中间结果)。
比如 I am Chinese 这个句子,我们需要一个顺序,I 在前面,am 在中间,Chinese 在后面,就是词向量嘛,然后通过中间隐层的转换转换成一个几维的特征这样子再进行训练。也就是word2vec(Word to Vector,由词到向量的方法)
二、长短期记忆网络(LSTM)
RNN就是上面介绍的,它有个缺点,就是记得太多了,把前面生成的中间产物,每一个时间序列生成的特征都保存了,记下来了,这样就容易记得不精,可能产生一些误差和错误。那么LSTM就是解决了这个缺点,让它忘记一些之前的特征,改记住的记住,不改记住的舍去。
LSTM就是在RNN的基础上进行改进的,加上了一个C控制参数,可以记住那些值得记住的,舍去不重要的,取其精华去其糟粕。
三、词向量模型 – Word2Vec
Word2Vec – Word to Vector,由词到向量的方法
先考虑第一个问题:如何将文本向量化呢?听起来比较抽象,但我们可以先从人的角度来观察思考。
如何来描述一个人呢?只用身高或者体重,还是综合其各项指标呢?
只要有了向量我们就可以用不同的方法来计算相似度。
通常,数据的维度越高,能提供的信息也就越多,从而计算结果的可靠性就更值得信赖。
如何来描述语言的特征呢?通常来说都在词的层面上来构建特征。Word2Vec就是要把词转换成向量。
上图假设你现在已经拿到一份训练好的词向量,其中每一个词都表示为50维的向量,这是一个包含50个数字的列表。通过观察数值我们看不出什么,但是让我们稍微给它可视化,以便比较其它词向量。
我们把所有这些数字放在一行,再根据它们的值对单元格进行颜色编码(如果它们接近2则为红色,接近0则为白色,接近-2则为蓝色)。在热度图中显示,结果如下:
在下图结果中可以发现,相似的词在特征表达中比较相似,也就是说明词的特征是有实际意义的。
在词向量模型中输入和输出分别是什么?
下一单词预测是一个可以通过语言模型实现的任务。语言模型会通过单词列表(比如说两个词)去尝试预测可能紧随其后的单词。我们可以把这个模型想象为这个黑盒:
但事实上,该模型不会只输出一个单词。实际上,它对所有它知道的单词(模型的词库,可能有几千到几百万个单词)按可能性打分,输入法程序会选出其中分数最高的推荐给用户。
模型在经过训练之后会生成一个映射单词表所有单词的矩阵。在进行预测的时候,我们的算法就是在这个映射矩阵中查询输入的单词,然后计算出预测值:
以上图为例,输入两个词–‘Thou’和‘shalt’,输入后在词库的大表中查找输入词对应的词向量,这个词库的大表就是随机的初始化参数,每一次训练都会更新。
数据从哪来?
相较于大多数其他机器学习模型,语言模型有一个很大的优势,那就是我们有丰富的文本来训练语言模型。所有我们的书籍、文章、维基百科、及各种类型的文本内容都可用。相比之下,许多其他机器学习的模型开发就需要手工设计数据或者专门采集数据。我们通过找常出现在每个单词附近的词,就能获得它们的映射关系。机制如下:
1、先是获取大量文本数据(例如所有维基百科内容)
2、然后我们建立一个可以沿文本滑动的窗(例如一个窗里包含三个单词)
3、利用这样的滑动窗就能为训练模型生成大量样本数据。
比如你要做一个新闻的,但是新闻的文本不够,因为我们的文字是相通的,所以你可以在其他地方比如小说找来训练的数据,因为一些合乎我们说话的逻辑的文本都是可以用的。
构建训练数据:
“滑窗法”
当这个窗口沿着文本滑动时,我们就能(真实地)生成一套用于模型训练的数据集。为了明确理解这个过程,我们看下滑动窗是如何处理这个短语的:
在一开始的时候,窗口锁定在句子的前三个单词上。我们把前两个单词看作特征,第三个单词看作标签:
这时我们就生产了数据集中的第一个样本,它会被用在我们后续的语言模型训练中。
接着,我们将窗口滑动到下一个位置并生产第二个样本:
这时第二个样本也生成了。
不用多久,我们就能得到一个较大的数据集,从数据集中我们能看到在不同的单词组后面会出现的单词:
不同模型对比:
CBOW:
输入是上下文,输出是中间的词。
Skipgram:
知道中间的词,去预测上下文。
Skip-gram模型所需训练数据集:
如何进行训练?
如果一个语料库稍微大一些,可能的结果简直太多了,最后一层相当于softmax,计算起来十分耗时,有什么办法来解决嘛?
初始方案:输入两个单词,看他们是不是前后对应的输入和输出,也就是相当于一个二分类任务。
出发点非常好,但是此时训练集构建出来的标签全为1,无法进行较好的训练
改进方案:加入一些负样本(负采样模型):0
词向量训练过程:
1、初始化词向量矩阵:
2、通过神经网络反向传播来计算更新,此时不光更新权重参数矩阵W,也会更新输入数据
参考:https://blog.csdn.net/kun_csdn/article/details/89061689