深度学习之循环神经网络(12)预训练的词向量

  • Post author:
  • Post category:其他


深度学习之循环神经网络(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 版权协议,转载请附上原文出处链接和本声明。