基于双向语言模型的上下文化单词表示的tensorflow实现
bilm的Python项目详细描述
bilm tf
用于elmo计算的预训练bilm的tensorflow实现 来自"深层上下文化单词表示"
此存储库支持训练BILMS和使用预先训练的模型进行预测。
我们还有一个pytorch实现,可以在allennlp中找到。
如果您只是想进行预测,您可能会发现使用tensorflow hub中提供的版本更容易。
引文:
@inproceedings{Peters:2018,
author={Peters, Matthew E. and Neumann, Mark and Iyyer, Mohit and Gardner, Matt and Clark, Christopher and Lee, Kenton and Zettlemoyer, Luke},
title={Deep contextualized word representations},
booktitle={Proc. of NAACL},
year={2018}
}
安装
安装python版本3.5或更高版本,tensorflow版本1.2和h5py:
pip install tensorflow-gpu==1.2 h5py
python setup.py install
通过运行以下命令确保测试在您的环境中通过:
python -m unittest discover tests/
使用Docker安装
要运行映像,必须使用nvidia docker,因为此存储库 需要GPU。
sudo nvidia-docker run -t allennlp/bilm-tf:training-gpu
使用预先培训的模型
export CUDA_VISIBLE_DEVICES=0,1,2
python bin/train_elmo.py \
--train_prefix='/path/to/1-billion-word-language-modeling-benchmark-r13output/training-monolingual.tokenized.shuffled/*' \
--vocab_file /path/to/vocab-2016-09-10.txt \
--save_dir /output_path/to/checkpoint
<H4>3。评估训练模型。使用bin/run\u test.py
评估经过培训的模型,例如
export CUDA_VISIBLE_DEVICES=0
python bin/run_test.py \
--test_prefix='/path/to/1-billion-word-language-modeling-benchmark-r13output/heldout-monolingual.tokenized.shuffled/news.en.heldout-000*' \
--vocab_file /path/to/vocab-2016-09-10.txt \
--save_dir /output_path/to/checkpoint
<H4>4。使用bilm
或allennlp
将tensorflow检查点转换为hdf5进行预测
首先,为新训练的模型创建一个options.json
文件。这样做,
遵循现有文件中的模板(例如原始的选项.json
并修改超参数。
重要信息:培训后,请将n_个字符设置为262(见下文)。
然后运行:
python bin/dump_weights.py \
--save_dir /output_path/to/checkpoint
--outfile /output_path/to/weights.hdf5
常见问题和其他警告
你能提供训练后的Tensorflow检查点吗?
TensorFlow检查点可通过下载以下文件获得:
如何在附加的未标记数据上微调模型?
首先下载上面的检查点文件。
然后按照"在新语料库上训练bilm"一节中所述准备数据集,但我们将使用现有词汇表文件而不是创建新的词汇表文件。最后,使用脚本bin/restart.py
使用新数据集上的现有检查点重新启动培训。
对于小数据集(例如1000万个令牌),我们只建议调整少量的时间段并监视heldout集上的困惑,否则模型将过适合小数据集。
SoftMax重量是否可用?
它们在上面的培训检查站提供。
你能提供更多关于模特是如何训练的细节吗?
脚本bin/train_elmo.py有用于训练模型的超参数。 最初的模型在3gtx 1080上训练了10个阶段,大约需要 两周。
对于输入处理,我们使用原始的10亿字基准数据集
这里,以及现有的793471个令牌词汇表,包括<;s>;
、<;s>;
和<;unk>;
。
您可以在这里找到我们的词汇文件。
在模型输入时,所有文本都使用基于全字符的表示,
包括歌手之外的标记。
对于SoftMax输出,我们将OOV令牌替换为<;unk>;
该模型使用20个令牌的固定大小窗口进行训练。
这些批是通过在句子中填充<;s>;
和<;s>;
来构建的,然后将一个或多个句子中的标记打包到每一行中,以完全填充每个批。
部分语句和lstm状态被从一个批传递到另一个批,这样语言模型就可以使用跨批的信息作为上下文,但是在每个批边界处都会破坏反向传播。
如果我在预先训练的模型中运行相同的文本两次,为什么会得到稍微不同的嵌入?
作为训练方法(见上文)的结果,lstms是有状态的,并将其状态从一个批传递到另一个批。 因此,这引入了少量的非决定论,特别是 前两批。
为什么即使是我的小数据集,培训似乎也要花很长时间?
训练过程中渐变更新的次数由确定:
- 训练数据中的令牌数(
n_train_tokens
) - 批量大小(
批量大小
) - 历元数(
n_历元
)
请确保在bin/train\u elmo.py
中为您的特定数据集设置这些值。
字符和填充有什么关系?
在培训过程中,我们通过在每个句子中添加<;s>;
和<;s>;
来将每一批中的标记填充到正好20个标记,然后将一个或多个句子中的标记打包到每一行中,以完全填充每一批。
因此,我们不为特殊的填充标记分配空间。
将标记字符串转换为字符列表的UnicodeChars词汇表
ids总是使用固定数量的字符嵌入n_characters=261
,因此总是
在训练过程中设置n_characters=261
。
但是,为了预测,我们确保每个句子都完全包含在一个批中,
结果是用一个特殊的填充id填充不同长度的句子。
这发生在批处理程序中
请参见此处。
因此,在options.json的预测过程中,设置
n_characters=262
如何使用elmo计算句子表示?
简单的方法,如单词级elmo表示在句子中的平均和最大池,效果很好,通常在基准数据集上优于有监督的方法。 参见"下游和语言探测任务中句子嵌入的评估",Perone等人,2018年arxiv链接
序列化模型时,我看到一个警告,是不是有问题?
可以安全地忽略以下警告:
2018-08-24 13:04:08,779 : WARNING : Error encountered when serializing lstm_output_embeddings.
Type is unsupported, or the types of the items don't match field type in CollectionDef.
'list' object has no attribute 'name'