机器学习100天论文阅读Machine Learning & Recommendation & NLP & DL

Pytorch学习记录-基于多层CNNSeq2Seq的GEC

2019-05-10  本文已影响1人  我的昵称违规了

Pytorch学习记录-GEC语法纠错07
五月第一周要结束了,接下来的三个月主要是文献阅读,准备8、9月的开题报告,技术类的文献集中在GEC和Text maching的应用方面,读完之后找demo复现,然后应用。
理论方面的论文也都是英文的

6. A Multilayer Convolutional Encoder-Decoder Neural Network for Grammatical Error Correction

基于多层CNNSeq2Seq的GEC,作者是新加坡国立大学的Chollampatt,他在2016年的论文《Neural network translation models for grammatical error correction》是第5篇的研究基础。这个模型也很有意思,在之前使用Pytorch实现过,是第5个模型,CNN与Seq2Seq结构相结合,其中加入attention机制,再后面就是Transformer模型了。

6.1 介绍

GEC是一个成熟的NLP任务。要纠正的错误不仅是语法的,也有拼写和搭配错误。
SMT已经成为主流(之前基于短语的SMT),但是仍有短板:SMT仍然受到有效访问全局源和目标上下文的限制。在解码期间将单词和短语视为离散实体也限制了其泛化能力。
Seq2Seq开始应用于GEC任务。但是效果并不理想,没有达到SOTA
原因是之前的GEC都是基于RNN的。与以前的神经方法相比,这个研究的的GEC神经方法基于CNNSeq2Seq架构,具有多层卷积和注意力。研究表明,相比RNN而言,CNN能够更有效地获取本地上下文信息(因为卷积运算是在较小的单词序列窗口上执行的)

大多数语法错误发生在相邻词汇,多层CNN和attention机制能够捕捉到更广泛上下文和远距离词之间的互动。
研究者还引入了多模型集合策略。
使用字节对编码(BPE)算法将稀有字分成多个频繁子字(sub-words)。
使用这样的英语语料库来预训练用于初始化编码器和解码器中的嵌入的字向量。
训练N-gram语言模型作为功能。

6.2 相关工作

之前的方法大多是基于构建错误类别分类器。
SMT框架在很大程度上得益于其结合大型纠错并行语料库的能力,如公开的Lang-8语料库(这是一个母语修改的社交网站,语料库更新至2013年,似乎没有中文 https://sites.google.com/site/naistlang8corpora/ ),用于训练健壮语言模型(LM)的其他英语语料库。然而,与神经方法相比,基于SMT的系统具有有限的泛化能力,并且无法有效地访问更长的源和目标上下文。为了解决这些问题,提出了几种针对GEC依赖于RNN的神经encoder-decoder方法。

6.2.1 神经encoder-decoder GEC

6.3 多层卷积encoder-decoder神经网络

6.3.1 模型

image.png

输入句子S,提供了m个token序列 s_1, s_2, s_3,..., s_m 并且s_i \in V_s 其中 V_s 是词汇列表。最后的一个token s_m 是一个特殊标记,类似“eos”。

S 是要经过嵌入操作。这部分参考这篇博文https://www.jianshu.com/writer#/notebooks/34004882/notes/45926192
s_i=w(s_i)+p(i)

encoder和decoder是由L层构成,结构在最开始部分,完成嵌入的S进行线性映射,获得第一层encoder的输入向量h_1^0, h_2^0, ..., h_m^0,输入到第一层,线性映射公式如下
h_i^0=W_{s_i}+b

在encoder第一层,尺寸为3*h 的 2h卷积滤波器将三个连续输入矢量的每个序列映射到特征矢量f_i^1 \in R^2h。在句子的开始和结尾均有tag(“pad”)。
f_i^1=Conv(h^0_{i-1}, h_i^0, h_{i+1}^0)

GLU(f_i^1)=f_{i,1:h}^1 ◦ \sigma(f_{i,h+1:2h}^1)

在decoder部分,每一个decoder层都有一个attention模块,attention的权重\alpha_{n,i}^l是由encoder的输出e_iz_n^l的点积,并使用softmax归一。
y_j^l = GLU(Conv(g_{j−3}^{l-1}, g_{j-2}^{l-1}, g_{j−1}^{l-1})
z^l_n = W_zy_n^l + b_z + t_{n−1}
\alpha_{n,i}^l=\frac{exp(e_i^Tz_n^l)}{\Sigma_{k=1}^m exp(e_k^Tz_n^l)}

而上下文向量x_n^l是通过将attention权重应用于encoder输出向量和源嵌入的总和来计算。
X_n^l=\Sigma_{n=1}^m \alpha_{n,i}^l(e_i+s_i)

然后对上下文向量进行线性映射到c_n^l \in R^h,这样,decoder的输出g_n^l,就可以表示为g_n^{l-1}c_n^ly_n^l的总和。
g_n^l=g_n^{l-1}+c_n^l+y_n^l

这样最终的decoder输出向量就是g_n^L,将其进行线性映射,得到d_n \in R^d。(需要注意的是,在decoder输出、嵌入、以及每个encoder和decoder层之前都要使用dropout)然后将decoder输出矢量映射到目标词汇量大小(| V_t |),并计算softmax以获得目标词概率。
o_n=W_od_n+b_o

p(t_n=w_i|t_1,...,t_{n-1},S)=\frac{exp(o_{n,i})}{\Sigma_{k=1}^{|V_t|}exp(o_{n,k})}
其中w_i是第i个单词在目标词汇V_t中。

我靠,这个模型好麻烦啊……

3.jpg
4.jpg

6.3.2 词嵌入的预训练

6.4 实验步骤

6.4.1 数据集

使用两个公共数据集Lang-8和NUCLE

6.4.2 评价

使用CoNLL-2014。


image.png

6.4.3 模型和训练细节

果然,这里提到了Facebook的FairSeq。他们在3个NVIDIA Titan X GPU上同时训练每个模型,每个GPU上的批量大小为32,并在另一个NVIDIA Titan X GPU上同时执行每个时期的验证。

6.5 实验和结果

6.5.1 基准语料库评估

我们根据输出句子的语法流畅性来评估系统

6.5.1.1 语法性

6.5.1.2 流畅性

使用JFLEG的dev和test数据集评价流畅性。

6.5.2 encoder和decoder结构

上一篇 下一篇

猜你喜欢

热点阅读