深度学习之循环神经网络(12)预训练的词向量
在情感分类任务时,Embedding层是从零开始训练的。实际上,对于文本处理任务来说,领域知识大部分是共享的,因此我们能够利用在其它任务上训练好的词向量来初始化Embedding层,完成领域知识迁移。基于
预训练
的Embedding层开始训练,少量样本时也能取得不错的效果。
我们以预训练的GloVe词向量为例,演示如何利用预训练的词向量模型提升任务性能。首先从官网上下载预训练的GloVe词向量表,我们选择特征长度100的文件glove.6B.100d.txt,其中每个词汇使用长度为100的向量表示,下载后解压即可。
GloVe词向量模型文件
利用Python文件IO代码读取单词的编码向量表,并存储到Numpy数组中。代码如下:
import os
import numpy as np
print('Indexing word vectors.')
embeddings_index = {} # 提取单词及其向量,保存在字典中
# 词向量模型文件存储路径
GLOVE_DIR = r'/Users/XXX/Documents/深度学习/glove'
with open(os.path.join(GLOVE_DIR, 'glove.6B.100d.txt')) as f:
for line in f:
values = line.split()
word = values[0]
coefs = np.asarray(values[1:], dtype='float32')
embeddings_index[word] = coefs
print('Found %s word vectors.' % len(embeddings_index))
运行结果如下所示:
Indexing word vectors.
Found 400000 word vectors.
GloVe.6B版本共存储了40万个词汇的向量表。前面实战中我们只考虑最多1万个常见的词汇,我们根据词汇的数字编码表一次从GloVe模型中获取其词向量,并写入对应位置。代码如下:
num_words = min(MAX_NUM_WORDS, len(word_index)) + 1
embedding_matrix = np.zeros((num_words, EMBEDDING_DIM)) # 词向量表
for word, i in word_index.items():
if i > MAX_NUM_WORDS:
continue # 过滤掉其他词汇
embedding_vector = embeddings_index.get(word) # 从GloVe查询词向量
if embedding_vector is not None:
# words not found in embedding index will be all-zeros.
embedding_matrix[i] = embedding_vector
print(embedding_matrix.shape)
运行结果如下所示:
Found 0 unique tokens.
(1, 100)
在获得了词汇表数据后,利用词汇表初始化Embedding层即可,并设置Embedding层不参与梯度优化。其它部分均保持一致。我们可以简单地比较通过预训练的GloVe模型初始化的Embedding层的训练结果和随机初始化的Embedding层的训练结果,在训练完50个Epochs后,预训练模型的准确率达到了
84.7%
,提升了约
2%
。
版权声明:本文为weixin_43360025原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。