pytorch句子嵌入(InferSent)和NLI的训练代码。

Song • 165 次浏览 • 0 个回复 • 2018年10月26日

InferSent是一种句子embeddings方法,它为英语句子提供语理解。受过自然语言推理数据的训练,可以很好地运用到到许多不同的任务。

官方提供预训练的英语句子编码器our paperSentEval评估工具。

最近的更改: 添加了在fastText向量上训练的infereent2模型并添加了max-pool选项。

一、依赖

这段代码是用python编写的。依赖性包括:

  • Python 2/3
  • Pytorch(最新版本)
  • NLTK >= 3

二、下载数据集

要获取SNLIMultiNLI,请运行(在dataset/):

./get_data.bash

这将下载并预处理SNLI/MultiNLI datasets数据集。MacOS必须使用p7zip代替unzip

下载GloVe(V1)fastText(V2) 向量:

mkdir dataset/GloVe
curl -Lo dataset/GloVe/glove.840B.300d.zip http://nlp.stanford.edu/data/glove.840B.300d.zip
unzip dataset/GloVe/glove.840B.300d.zip -d dataset/GloVe/
mkdir dataset/fastText
curl -Lo dataset/fastText/crawl-300d-2M.vec.zip https://s3-us-west-1.amazonaws.com/fasttext-vectors/crawl-300d-2M.vec.zip
unzip dataset/fastText/crawl-300d-2M.vec.zip -d dataset/fastText/

三、用我们的句子编码器

我们提供了一个简单的界面来编码英语句子。有关 实际示例,请参阅encoder/demo.ipynb。开始使用以下步骤:

1、下载InferSent模型(使用GloVe训练的V1,使用fastText训练的V2)[147MB]:

curl -Lo encoder/infersent1.pkl https://s3.amazonaws.com/senteval/infersent/infersent1.pkl
curl -Lo encoder/infersent2.pkl https://s3.amazonaws.com/senteval/infersent/infersent2.pkl

注意,infersent1是用GloVe训练的(已经过对使用PTB标记器预处理的文本进行了训练),并且使用fastText(已经使用MOSES标记器预处理的文本训练过)训练了infereent2。后者还使用max-pooling去除零填充,这在将批量句子嵌入其中时是不方便的。

2、通过运行以下命令确保您拥有NLTK标记器:

import nltk
nltk.download('punkt')

3、加载预先训练的模型(在 encoder/):

from models import InferSent
V = 2
MODEL_PATH = 'encoder/infersent%s.pkl' % V
params_model = {'bsize': 64, 'word_emb_dim': 300, 'enc_lstm_dim': 2048,
                'pool_type': 'max', 'dpout_model': 0.0, 'version': V}
infersent = InferSent(params_model)
infersent.load_state_dict(torch.load(MODEL_PATH))

4、为模型设置单词矢量路径:

W2V_PATH = 'fastText/crawl-300d-2M.vec'
infersent.set_w2v_path(W2V_PATH)

5、构建单词向量的词汇表(即仅保留所需的词汇表):

infersent.build_vocab(sentences, tokenize=True)

其中的句子是你的列表n句子。您可以使用infersent.update_vocab(sentences)更新词汇表,或使用infersent.build_vocab_k_words(K=100000)直接加载K个最常用的英语单词。如果tokenizeTrue(默认情况下),则使用NTLK对句子进行标记化。

6、对句子进行编码(n个句子列表):

embeddings = infersent.encode(sentences, tokenize=True)

会输出一个numpy数组,其中n个向量为4096。在单个GPUbatch size128速度大约是每秒1000个句子。

7、显示模型中每个单词的权重

我们提供了一个函数来显示句子编码中每个单词的权重:

infersent.visualize('A man plays an instrument.', tokenize=True)

显示模型中每个单词的权重

四、在自然语言推理(SNLI)中训练模型

要在SNLI上重现我们的结果,请运行:

python train_nli.py --word_emb_path '<path to word embeddings>'

使用默认设置时,可以获得85的开发精度和84.5的测试精度。

五、在迁移任务上评估编码器

要在迁移任务上评估模型,请参阅SentEval。请注意选择用于训练编码器的相同标记。测试结果如下:

Model MR CR SUBJ MPQA STS14 STS Benchmark SICK Relatedness SICK Entailment SST TREC MRPC
InferSent1 81.1 86.3 92.4 90.2 .68/.65 75.8/75.5 0.884 86.1 84.6 88.2 76.2/83.1
InferSent2 79.7 84.2 92.7 89.4 .68/.66 78.4/78.4 0.888 86.3 84.3 90.8 76.0/83.8
SkipThought 79.4 83.1 93.7 89.3 .44/.45 72.1/70.2 0.858 79.5 82.9 88.4 -
fastText-BoV 78.2 80.2 91.8 88.0 .65/.63 70.2/68.3 0.823 78.9 82.3 83.4 74.4/82.4

原创文章,转载请注明 :pytorch句子嵌入(InferSent)和NLI的训练代码。 - pytorch中文网
原文出处: https://ptorch.com/news/214.html
问题交流群 :168117787
提交评论
要回复文章请先登录注册
用户评论
  • 没有评论
Pytorch是什么?关于Pytorch! Pytorch中正确设计并加载数据集方法