序列标记任务的联合学习框架
nlp-pie的Python项目详细描述
pie:序列标记任务的联合学习框架
pie的初衷是使丰富变异语言的序列标记实验变得容易和用户友好。pie主要是被用来进行元素化测试,但是其他任务(如pos)的sota精度也被复制(参见plank等人)。pie在输入预处理和模型定义方面都是高度可配置的,原则上不要求用户编写任何代码(相反,实验是用json文件定义的)。它是高度模块化的,因此易于扩展。它包括作为额外序列标记任务的传导引理化,最后,它是相当快和内存有效的。
文件工作正在进行中,并将在接下来的几个月内得到改进。了解其功能的一个好地方是检查pie/default_settings.json
它解释了所有输入参数,并显示了配置文件的完整示例(减去输入数据)。
馅饼可以从pypi获得,这意味着您需要做的就是:
pip install nlp-pie
用于开发
如果您计划在pie之上进行开发,最简单的方法是下载存储库并安装依赖项(请参见requirements.txt
)。在文件系统中的任何位置都可以使用pie
的唯一步骤是将pie
的路径添加到pythonpath
环境变量。要做到这一点,有两种方法:
- 从bash init文件(取决于您的发行版和配置,这可能是
.bashrc
,.bash配置文件
,.profile
,等等…):
exportPYTHONPATH="$PYTHONPATH:/path/to/pie"
- 从python脚本中,使用
sys
:
importsyssys.path.append('/path/to/pie')<H2>2。培训
训练模型使用pie train path/to/config.json
(或scriptpython pie/scripts/train.py
)完成。所有非嵌套参数都可以使用环境变量直接从命令行覆盖,如pie_device=cpu
(对于输入参数device
。警告:请记住,由于bash解析环境变量的方式,pie\u…=false
将被解析为布尔值true
,这可能违反直觉。如果您希望从命令行获取参数的false
,则可以使用pie=>)。
给定的模型可以使用pie evaluate
(或python pie/scripts/evaluate.py
)进行计算。
给定一个或多个经过训练的模型,提供两个脚本来标记给定的输入:pie tag
和pie tag pipe
(或python pie/scripts/tag.py
,python pie/scripts/tag_pipe.py
),区别在于第一个标记输入文件,第二个标记可以从Unix管道获取输入。
这两个脚本的共同点是允许组合多个模型的模型规范,其中特定任务的输出来自于擅长该任务的模型。
例如,给定型号good pos tagger.tar
和good lemma tagger.tar
,我们可以使用good pos tagger.tar
来进行pos标记,并使用good lemma tagger.tar
来进行元素化,其规格如下:<;好引理tagger.tar,引理>;<;好pos tagger.tar,pos>;
- 如果您的输入位于文件
test.txt中(每行一个句子),则可以使用:
pie tag"<;good lemma tagger.tar,lemma>;<;good pos tagger.tar,pos>;"test.txt"
输出将写入test.pie.txt
- 如果要从命令行传递输入,可以使用:
$ echo "el gato duerme encima de la silla" | pie tag-pipe spanish-lemmatizer.rar
token lemma
el el
gato gato
duerme dormir
encima encima
de de
la el
silla silla
<H2>5。模型饼图底层模型包括一组从字符级到句子级的分层特征抽取器。对于每个输入标记,提取句子级特征向量,并用于预测任意数量的目标任务(例如词性标记、引理化等)。下面显示了使用双向rnns提取单词级和句子级特征的底层模型的可视化效果。
预测由解码器模块完成。我们提供了一个线性
解码器的实现,该解码器通过一个softmax函数(类似于maxent分类器)训练以最大化模型分配给语料库数据的概率。acrf
解码器,特别适合于表示相邻输出标签和注意解码器之间的依赖关系的任务,适合于通过以字符串转换方式逐个字符生成标记级输出字符(例如,元素化、规范化)来解决的任务。
培训一个模型只需要一个模型规范以及培训和开发数据集的路径。pie用户界面使用了一个简单的json文件(为了允许行内注释,我们使用了包json\u minify
),下面是一个示例:
{"modelname":"lemmatization-latin","modelpath":"models","input_path":"datasets/LLCT1/train.tsv","dev_path":"datasets/LLCT1/dev.tsv","sep":"\t","tasks":[{"name":"lemma","target":true,"context":"sentence","level":"char","decoder":"attentional","settings":{"bos":true,"eos":true,"lower":true,"target":"lemma"},"layer":-1}],"batch_size":25,"epochs":100,"dropout":0.25,"optimizer":"Adam","patience":3,"lr":0.001,"lr_factor":0.75,"lr_patience":2,"cell":"GRU","num_layers":1,"hidden_size":150,"wemb_dim":0,"cemb_dim":300,"cemb_type":"rnn","cemb_layers":2}
培训模型所需的最小选项集包括输入路径
(包含培训数据的文件路径)、开发路径
(包含开发数据的文件路径)和定义要培训的模型的任务。其他参数指模型超参数(
单元
,层数
,隐藏单元大小
,WEMB单元大小
,CEMB单元大小
,CEMB单元类型
,CEMB单元层
),培训(批量大小
,时代
)和优化(退出
,优化器
,耐心
,lr
,lr因素
,`lr耐心)。
使用CRF进行POS标记
{"tasks":[{"name":"pos","target":true,"decoder":"crf","layer":-1}]}
使用线性解码器和2个辅助任务进行词性标记
{"tasks":[{"name":"pos","level":"token","target":true,"decoder":"crf","layer":-1,"schedule":{"patience":3}},{"name":"case","level":"token","target":false,"decoder":"linear","layer":0,"schedule":{"patience":2,"factor":0.5}},{"name":"number","level":"token","target":false,"decoder":"linear","layer":0,"schedule":{"patience":2,"factor":0.5}}]}
通过设置时间表,我们可以在多任务设置中微调辅助任务的学习动态(有关详细信息,请参见下文)。
为了避免冗长,只能使用task\u defaults
在辅助任务之间指定一次参数不变。类似地,学习调度参数在任务调度定义中是不变的(因子
,耐心
,阈值
,最小权重
)。总之,以前的配置可以用以下形式重写:
{"tasks":[{"name":"pos","level":"token","target":true,"decoder":"crf","layer":-1,"schedule":{"patience":3}},{"name":"case"},{"name":"number"}],"task_defaults":{"level":"token","decoder":"linear","layer":0},"patience":2,"factor":0.5}
基于转导的柠檬酸化
pie内置了对作为字符串转换任务的元素化的支持,使用如下所示的编码器-解码器架构(将拉丁标记"esse"元素化为其引理"edo"):
pie实现了几种最新的注意机制,以方便编码器和解码器之间的信息流。此外,解码器可以根据句子级特征进行调整,以帮助消除歧义。
下面显示了一个带有编码器-解码器模型和集成句子级功能的元素化任务配置。
{"tasks":[{"name":"lemma","level":"char","target":true,"decoder":"attentional","context":"sentence","layer":-1,"schedule":{"patience":3}}]}<H2>7。利用联合语言模型损失改进特征提取
pie有一个内置的选项,通过预测句子级特征向量中的相邻单词来改进特征提取。机制已经在目前提交审查的研究中,对引理化进行了彻底的测试,结果表明,它对于没有固定写作标准的语言(如历史语言)和其他具有高标记引理歧义的语言非常有效。除此之外,理论上没有任何东西反对这样的观点,即它可能有助于其他任务,如词性标注,形态分析等。影响联合lm损失的选项有:包括lm
(打开选项)、lm_shared_softmax
(是否在正向和反向lms之间共享参数,建议值:true
)、lm_schedule
(用于降低分配给lm loss over training,一旦lm loss开始过度拟合,最好开始减少损失,并最终将其设置为0,以避免影响目标任务的学习。
当定义了多个任务时,至少一个任务必须具有键值对"target":true
,表示这是我们最终关心的任务。所有其他任务都将被视为辅助任务,目的是为目标任务提取更好的特征。请注意,在任何情况下,该模型仍然能够预测辅助任务的输出,但本着多任务学习的精神,您更愿意为您关心的每个任务训练单独的模型,每次选择合适的目标任务,并让所有其他任务帮助优化。最后,您有尽可能多的模型作为您关心的任务,每个模型都针对各自的任务进行了优化。
有关辅助任务的详细信息
辅助任务可能有助于学习更好的特征,目标任务的分类器可以利用这些特征产生更好的(就分类性能而言)和更稳健的输出(不易受到虚假相关性的影响)。然而,在多任务环境下的训练动态是复杂的(甚至比在正常环境下更为复杂),因为不同的任务通常会导致不同的学习曲线,必须对其进行监控。特别是,如果一个辅助任务在目标任务之前收敛,进一步的训练可能会导致该辅助任务过度拟合,从而撤消到目前为止所做的潜在工作。此外,不同任务的损失通常在不同的尺度上,这可能会产生这样的效果:辅助任务在更高尺度上的损失会支配训练。
为了避免这种情况,为pie选择的策略包括为任务设置学习计划(类似于提前停止),该计划根据开发性能随着时间的推移而降低特定任务的权重。
多任务学习包括为不同任务联合训练一个模型,同时为所有任务共享通用架构的一部分。这可以通过计算每个批次的所有任务的损失并在向后传递之前将其聚合来实现,也可以针对基于特定分布随机抽样的单个任务在每个批次中进行优化来实现。派遵循后一种设置,这是已知的产生更好结果的设置。
此外,对于多层句子级的特征抽取器,在哪一层选择一个特定的任务最有帮助也是很重要的(这可以通过"layer"选项来控制)。
最后,多任务学习远不是一个银弹,它是一个经验问题,一个多任务学习设置是否会产生改善。建议首先训练一个单一的模型,然后尝试不同的多任务学习配置,看看是否可以实现改进。
<H2>9。(TOdo)Web应用程序 <H2>10。(TOdo)校正后应用程序