Mindspore框架循环神经网络RNN模型实现情感分类
Mindspore框架循环神经网络RNN模型实现情感分类|(一)IMDB影评数据集准备
Mindspore框架循环神经网络RNN模型实现情感分类|(二)预训练词向量
Mindspore框架循环神经网络RNN模型实现情感分类|(三)RNN模型构建
Mindspore框架循环神经网络RNN模型实现情感分类|(四)损失函数与优化器
Mindspore框架循环神经网络RNN模型实现情感分类|(五)模型训练
Mindspore框架循环神经网络RNN模型实现情感分类|(六)模型加载和推理(情感分类模型资源下载)
Mindspore框架循环神经网络RNN模型实现情感分类|(七)模型导出ONNX与应用部署
一、关于预训练词向量
在IMDB影评数据集的准备中提到词向量的预训练加载。
词向量(Word embedding),即把词语表示成实数向量。能体现词语直接的相近关系。词向量已经被证明可以提高NLP任务的性能,例如语法分析和情感分析。
词向量利用分布式假设,即相似的单词在上下文中出现的方式相似,因此可以使用向量空间模型将它们映射到低维向量表示。常见的词向量算法包括Word2Vec、GloVe
等。本项目用nn.embedding方法,计算词与词之间的语义距离,并结合词袋模型获取句子的语义表示。
在前面提到"I like the movie!" = 词向量[9 37 10 16 28],这是每个单词在词字典中的索引,这是映射。并没有词的含义,只有位置。即,第一步
:将每个单词或标记符号映射到一个唯一的整数ID。
第二步
:初始化一个随机的词向量矩阵,其中每行表示一个单词或标记的向量。
第三步
:通过最小化损失函数来训练词向量矩阵,以便使相似含义的单词具有相似的向量表示。常见的损失函数包括Skip-gram、CBOW和GloVe等。
第四步
:在训练完成后,使用训练出的词向量矩阵来表示新的文本数据,例如,可以将每个句子中的单词向量平均值作为句子的向量表示。
第五步
:可以使用这些词向量在各种自然语言处理任务中进行特征提取,例如文本分类、命名实体识别、情感分析等。
预训练的词向量,指提前训练好这种词向量,它是在极大样本上训练的结果,有很好的通用性,无论什么任务都可以直接拿来用。
当一个人读书时,如果遇到了生僻的词,一般能根据上下文大概猜出生僻词的意思,词向量训练结果表示,正好像是捕捉了这种思想,抽象了这种行为。这也是word2vec的思想。
以上步骤的目标就是将文本转化为数值特征。再用RNN网络进行语义情感分类,就有现实意义了。
二、glove词向量
Glove模型的目的:求出能表示出词与词之间的关系 的词向量
Glove的整体思想:词 k 在词 i 和词 j 中的的出现概率有着特殊规律
模型出自论文: Glove: Global Vectors for Word Representation
2.1glove模型原理
模型实现:
1)共现矩阵(对称矩阵)
以窗口的大小,出现在同一个窗口中的词计数
例:
I love you.
you love me.
you like me?
对于第一句:I love you.
假设窗口为一,[I love],I为中心词,则I为行,love为列处+1;然后移动窗口为[I love you],love为中心词,love为行,I列和you列+1;再移动窗口[I love you.],you为中心词,you做行,I 、love、句号列+1;
第一个句子处理后,再处理第二个句子,第三个句子,就得到上述共现矩阵。
共现矩阵的每一列(或行)都可以当做一个词向量。
2)SVD处理成三角矩阵
将共现矩阵转换成三角矩阵 Σ,目的为了降维和减少计算量。
生成共现矩阵,再SVD降维。
python
from glove import Glove
from glove import Corpus # 语料库
# 生成共现矩阵,再SVD降维
corpus_model = Corpus()
corpus_model.fit(sentense,
window=10) # 窗口大小 (用于统计同一窗口的词,生成共现矩阵)
glove = Glove(no_components=10, # 词向量维度
learning_rate=0.05) # 学习率
glove.fit(corpus_model.matrix,
epochs=10, # 迭代次数
no_threads=1, # 计算线程数
verbose=False) # 打印epochs进度
输出及应用
python
# most_similar函数需要使用dictionary
glove.add_dictionary(corpus_model.dictionary)
print(glove.dictionary)
print(glove.word_vectors)
print(glove.most_similar('love', number=4))
词向量有 7 种词,每个词的维度为 10:
此处参考博客:xiao___qiao的Glove 词向量
3)拟合计算词向量
通过设计的函数,将词向量和共现概率比值进行计算,使loss函数越小。设计的函数如下,是通过共现词频率比值的规律来设计的:
f(x):权重,为了不让相关度太高,保持相对高就行
2.2 预训练词向量下载
Glove 模型主要是利用了共现频率比值,这个特殊的规律,以这个规律来设计 loss 函数进行训练,得到词向量的方法。以下是下载预训练的词向量。
python
glove_path = download('glove.6B.zip', 'https://mindspore-website.obs.myhuaweicloud.com/notebook/datasets/glove.6B.zip')
vocab, embeddings = load_glove(glove_path)
print(len(vocab.vocab()))
解压后:
glove模型-6B词数量-100d词向量维数。
2.3 预训练词向量应用
有了预训练的词向量后,前面提到"I like the movie!" = 词映射[9 37 10 16 28],就变成"I like the movie!" = 词向量(每个词都是100d向量)
Word | Vector |
---|---|
I | -0.046539 , 0.61966 , 0.56647 , -0.46584 , -1.189 ,0.44599 , 0.066035 , 0.3191 , 0.14679 , -0.22119 ,0.79239 , 0.29905 , 0.16073 , 0.025324 , 0.18678 ,... |
like | -0.2687 , 0.81708 , 0.69896 , -0.72341 , 0.091566, 0.19557 , -0.52112 , -0.24313 , -0.44701 , -0.27039 , -0.34126 , -0.46898 ,... |
the | -0.038194, -0.24487 , 0.72812 , -0.39961 , 0.083172, 0.043953, -0.39141 , 0.3344 , -0.57545 , 0.087459, 0.28787 , ... |
movie | 0.38251 , 0.14821 , 0.60601 , -0.51533 , 0.43992 ,0.061053 , -0.62716 , -0.025385 , 0.1643 , -0.22101 ,... |
! | 0.38472 , 0.49351 , 0.49096 , -1.5434 , -0.33614 ,0.6222 , 0.32265 , 0.075331 , 0.65591 , -0.23517 , ... |
三、小结
Glove 和 word2vec 相比,word2vec 是周围范围内的词训练,glove 是以统计的词,更全面。两者最直观的区别在于,word2vec是"predictive"的模型,而GloVe是"count-based"的模型。
由于GloVe算法本身使用了全局信息,自然内存费的也就多一些,相比之下,word2vec在这方面节省了很多资源。