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

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模型了。

  • 这篇文章通过CNNSeq2Seq提升了文本中的语法、拼写、搭配错误的自动校正
  • 网络使用字符n-gram信息嵌入来实现初始化。
  • 模型评价使用CoNLL-2014和JFLEG
  • 最后的分析显示CNN在使用attention捕捉上下文上优于LSTM,能够提高语法纠正的覆盖范围。
  • 使用了集合策略

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

  • 2016,Yuan 和 Briscoe,BiRNN encoder-decoder + attention RNN,使用非监督字对齐模型和字级别SMT模型。
  • 2016,Xie 字符级别RNN encoder-decoder,在Lang-8和NUCLE语料库上进行训练。
  • 2017,Ji 基于混合机器翻译模型的混合词 - 字符模型。
  • 2017,Schmaltz 使用字级别BiLSTM网络,基于Lang-8和NUCLE语料库训练。

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)

  • 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)

  • Conv(.)是在完成一个GLU之后的卷积操作,

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

  • GLU(f_i^1) \in R^h
  • ◦ σ 是元素乘法和sigmoid激活函数
    最后将encoder层的输入矢量添加为残余连接。第l个编码器层的输出矢量由下式给出:
    h_i^l=GLU(f_i^l)+h_i^{l-1}
    encoder的最后一层输出的h_i^L要经过线性映射得到最终输出向量e_i
    e_i=W_eh_i^L+b_e
  • h_i^L \in R^h 最后一层encoder输出向量
  • e_i \in R^d encoder的输出向量
  • W_e \in R^{d * h} 权重
  • b_e \in R^d

在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 词嵌入的预训练

  • 研究者使用从大型英语语料库中学习的预训练词嵌入来初始化源语词和目标语词的嵌入词(我们之前使用的是Glove预训练,这里他们自己训练了一个新的词嵌入)。
  • 将此英语语料库中的稀有词语拆分为基于BPE的子词单元。
  • 通过使用fastText工具将单词表示为字符N-gram包并对这些字符n-gram序列的skipgram嵌入进行求和来计算单词嵌入。
  • 这些嵌入包含有关单词的基本形态的信息,并且根据经验发现它比随机初始化网络或使用word2vec(Mikolov等人2013)嵌入更好地执行,嵌入将单词视为单独的实体并且没有关于制作的字符序列的信息。

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 语法性

  • 基于CoNLL-2014测试数据评价系统不同变种。
    • 单一模型没有任何额外语料库或rescoring 45.36
    • 集合4个模型 48.05,优于没有LM的先前最佳神经模型,尽管后者使用了更多的训练数据,包括非公共CLC。我们的神经系统也大大优于两个可比较的SMT基线,“SMT”和“SMT + NNJM”。
    • 使用编辑操作功能执行重新评分,49.78
    • 模型使用预训练的词嵌入,50.70
    • 模型增加web-scale LM后重新评分,54.13

6.5.1.2 流畅性

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

6.5.2 encoder和decoder结构

  • BiLSTM可以从左和右捕获每个输入单词的整个句子上下文,而SLConv只捕获几个周围的单词。
  • MLConv更有效地捕获更大的周围环境(7层×滤波器宽度3 = 21个token),使其优于SLConv和BiLSTM。
  • BiLSTM比MLConv更精确,尽管召回率更低。


    image.png

    对attention的可视化,可以看到BiLSTM的分布更加清晰。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,529评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,015评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,409评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,385评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,387评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,466评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,880评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,528评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,727评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,528评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,602评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,302评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,873评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,890评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,132评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,777评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,310评论 2 342

推荐阅读更多精彩内容