【項目小結】英語語法錯誤檢測(GEC)開題論文閱讀記錄

畢業論文準備嘗試一下GEC,雖然沒有過這方面的經驗,但做老生常談的課題實在是虧待寶貴的最後一年。其實最主要的原因是莫名奇妙被一個從來沒上過課的教授加微信翻了牌子,我看了一下他給出的題目:英語句法分析、英語用詞錯誤檢測,文本摘要、文本閱讀理解,還有一個亂入的野生動物識別,我自己覺得很有興趣也非常具有挑戰性,他讓我自己選一個,我覺得後面三個思路相對單純一些,可能就是seq2seq的模型和圖片識別的問題;前兩個似乎比較有趣一些(也許之後我就不這麼覺得了...),便腦子一熱選了句法分析檢測。

但畢竟這塊白板一塊,所以做個綜述草稿,主要是記錄文獻閱讀的總結。


20191029 英語學習者書面語法錯誤自動檢測研究綜述_劉磊(2018.1)

1. 第一代GEC系統:採用簡單的字符串匹配和替換識別、修改錯誤(Writer's Workbench)
   第二代GEC系統:人工編纂的語法規則對文本進行句法分析(Epistle, Critique, MS Office)
   第三代GEC系統:從大規模本族語或學習者語料庫中提取詞彙-句法特徵,通過機器學習算法自動構建統計模型檢測語法錯誤,如微軟公司開發的ESL Assistant系統;

2. 學習者語料庫:UICLE FCE Lang-8 NUCLE
3. 本族語者語料庫:BNC Gigaword Wikipedia
4. 常用方法:
   > N元語法模型(N-gram)
     >> Markov Chain
        判斷是否 替換/添加/刪除 介詞會使得句子概率更大
   > 自動分類模型
     >> 用於冠詞介詞虛詞錯誤,以及動詞時態和形態錯誤
     >> 語言特徵:詞形、詞性、句法和語義信息
     >> 算法:LR SVM NB 檢測介詞周圍的語言特徵概率分佈
     >> 一般根據具體錯誤類型,從訓練語料提取特徵,構建針對特定錯誤的語言模型
     >> 能夠檢測未出現在訓練語料中的新樣本所包含的語法錯誤
   > 機器翻譯模型
     >> 無需人工標註
     >> 爲了檢測包含多處語法錯誤的句子:Many cat runs after a mouse, 如果主謂一致模塊置於名詞單複數之前則無法得出正確結果
     >> 模型從雙語平行語料庫中自動抽取基於短語的雙語詞典,
        e* = argmax(e){P(e|f)} = argmax(e){P(f|e)P(e)} f中文,e英文
     >> 可以自動選取特徵訓練模型,更加擅長處理複雜錯誤
     >> 通常與自動分類模型混合使用

5. 不同標註人員對語法錯誤的意見一致性存在差異(往往這種差異很大),因此在數據集的選取上需要多人員標註
6. 模型評估:主要根據PR曲線, 準確度即改的錯誤是否正確, 召回率即是否改全了所有錯誤?
CoNLL-2014 GEC系統評測結果:
語法錯誤類型    召回率    方法
(1)動詞時態        19.61%    規則+N-gram
(2)情態動詞        20.51%    規則+N-gram
(3)動詞缺失        15.19%    規則+機器翻譯模型
(4)動詞形式        18.99%    規則+N-gram
(5)主謂一致        57.67%    自動分類模型
(6)冠詞            47.87%    自動分類模型
(7)名詞單複數    46.18%    自動分類模型
(8)名詞所有格    11.11%    機器翻譯模型
(9)代詞格        15.52%    規則+機器翻譯模型
(10)代詞指代    9.35%    規則+機器翻譯模型
(11)介詞        24.94%    規則+機器翻譯模型
(12)搭配        6.79%    機器翻譯模型
   
7. 總結與展望:
(1)PR曲線質量很差,在CoNLL-2014中最好的模型PR值分別爲39.71%與30.10%
(2)改進的方向:
· 語法規則的引入
· 語言特徵的抽取
· 母語對語言產出的影響


20191029 基於LSTM和N_gram的ESL文章的語法錯誤自動糾正方法_譚詠梅(2018.6)

1. 本文主要就 冠詞錯誤、介詞錯誤、名詞單複數錯誤、動詞形式錯誤和主謂不一致五類語法錯誤 進行研究

2. GEC方法主要分爲基於規則和基於統計
(1) 基於規則:
> 基於上下文無關規則驅動的方法
  >> 少量規則不實用,大量規則會出現矛盾。侷限性大
> 基於簡單統計的規則驅動的方法

3. 基於LSTM與N-gram的GEC
(1)對於冠詞、介詞錯誤,將其看作一項特殊的序列標註任務(LSTM方法)
(2)名詞單複數錯誤、動詞形式錯誤、主謂不一致錯誤,混淆集爲開放集合(N-Gram投票)
(3)一些預設的表:
> 冠詞混淆集:
  >> 三種冠詞:the a/an 零冠詞
> 介詞混淆集:
  >> 17個常見介詞:on about into with as at by or from in of over to among between under within
> 名詞單複數變化表:
  >> 字段:類型(規則 不規則 單複數一致),單數(word person fish),複數(word people fish)
> 動詞形式變化表:
  >> 字段:類型(規則 不規則),動詞原形(work write),過去式(worked wrote),過去分詞(worked written),現在分詞(working writing)
> 動詞單複數變化表
  >> 字段:類型(規則 不規則),單數(plays has),複數(play have)

(4)移動窗口及N-gram投票策略:(主要用於名詞單複數錯誤、動詞形式錯誤和主謂不一致)
> 移動窗口:
  >> i:句中第i個單詞; k:窗口大小; j:窗口內第一個單詞與w(i)的距離
  >> MW(i,k,w) = {w(i-j),...,w(i-j+k-1)} where j=0,1,...,k-1 共計k個子句構成一個移動窗口
  >> k的大小及j的取值範圍影響很大,通常k取3~5
> N-Gram投票策略(基於語料庫的策略):
  >> 如修改冠詞錯誤時:"have the apple"頻次2,"have an apple"頻次1,"have apple"頻次1,則選擇頻次最高的
  >> 由於語料有限不可能遍歷,考慮最小頻次(頻次高於某一水平方可參與投票)
  >> 同時可以不同窗口大小的一起投票集成

(5)基於LSTM的標註糾正策略:(主要用於冠介詞)
> 即先把冠詞、介詞的地方挖去,然後預測該位置最有可能的冠詞或介詞(softmax)
> 模型輸入應該是雙向LSTM更爲合理,即爲上下文都要有,我理解上上下文各取一個合適的padding
> 在預測冠詞時序列信息可以包含詞向量與詞性,個人覺得相對來說詞性佔比重較大

4. 實驗結果:
(1)基於CoNLL2013的GEC,就P-R曲線數據上看來仍然很差勁
(2)F1:冠詞(0.2395),介詞(0.2783),名詞(0.3402),主謂一致(0.3445),動詞形式(0.3387)
   Baseline: 0.18 0.19 0.29 0.30 0.31


20191101更新

論文編號:W14-1713

論文題目:A Unified Framework for Grammar Error Correction

# 1. 引入
> HOO-2012僅考慮限定詞(the a/an some等)與介詞錯誤
> CoNLL-2013進一步考慮了名詞單複數,動詞形式和主賓一致
  >> 高分系統對不同錯誤進行了不同的訓練,使用不同的分類器
> CoNLL-2014共計考慮28種語法錯誤,包括拼寫錯誤
  >> 28種語法錯誤用不同的分類器是代價極大且不現實的
  >> 因此希望用一種統一架構來解決GEC,不可避免的忽視一些語法錯誤
> 利用翻譯模型要求大量的學習者母語語料庫的數量,而往往這是很難找到的
 
# 2. 任務描述
> 針對CoNLL-2014的解決方案

# 3. 系統概觀
## 3.1 改觀
> 爲每種語法錯誤訓練一個模型不現實,系統使用統一框架進行語法錯誤修正
  >> 句中每個單詞可能對應多種錯誤,由此爲每個單詞生成候選集
  >> 使用語言模型(LM)周到最大概率的序列(N-gram)
    >>> LM用於替代型錯誤,而非插入與刪除型錯誤
    >>> 因此爲限定詞與介詞各訓練一個分類器

## 3.2 修正候選集生成
> 基於如下規則:
  >> 同源詞
  >> 相似拼寫的單詞(計算alignment distance) --> 提前計算好單詞序列距離矩陣
> 系統中爲每個單詞設置了10個候選
> 只爲如下的單詞設置了第二種規則的候選:
  >> 沒有出現過在語料中的單詞
  >> 出現在語料中但頻次少於某閾值
  >> 不爲NNP NNPS的單詞設置(它們是名詞複數形式),因爲它們的正確性還取決於許多其他因素,如上下文

## 3.3 LM for 候選挑選
> 使用3-gram:P(wi|wi-2,wi-1)
> 可以根據實際情況調整P(wi|wi-2,wi-1),如一些明顯正確的搭配可以加大概率
> 不爲介詞/限定詞設置候選,因爲它們很頻繁,且學習者很容易犯錯,因此另尋模型

## 3.4 限定詞修正
> 同樣的這裏的冠詞修正也是看作定冠詞,不定冠詞,零冠詞的多分類問題
  >> 考慮冠詞時因爲存在零冠詞錯誤的可能性,所以需要考慮空格,這裏沒有考慮所有空格,只考慮名詞性短語前的空格
  >> 實驗表明1-gram和2-gram已經足夠,3-gram與4-gram沒有能夠提升性能
> 訓練集很少,選擇使用 English Gigaword corpus 生成訓練數據(而非CoNLL-2014)
  >> English Gigaword corpus 中都是新聞文本,英語本土人說的話,因此可以認爲是黃金法則

> 生成訓練集的方法:
  >> 每個空格都掛上NULL的標籤,選取每個NULL前三個單詞與後三個單詞生成特徵
  >> 每個冠詞我們同樣是前三個後三個單詞生成特徵

 
## 3.5 介詞修正
> 原理基本與3.4相同,但是我感覺要難很多,因爲零介詞的情況很難區分

## 3.6 預處理
> 區分a/an
> 分割單詞(如dailylife分爲daily和life)
> 句首字母大寫

# 4 實驗分析
> 結果:
MODEL        P        R        F0.5
LM            0.2989    0.1004    0.2142
LM+det        0.3223    0.1364    0.2533
LM+prep        0.2973    0.1004    0.2135
LM+det+prep    0.3221    0.1365    0.2532

> 調參後最優結果:
LM+det+prep    0.3664    0.1596    0.2910

> recall很小,因爲設置的det與prep的閾值很高,即置信度高於0.99(論文中使用的閾值)時纔會改正


20191121 更新 1812.08434 一篇來自清華大學的GNN的綜述,個人覺得寫得非常好,因爲很多都看不懂。。。

今天問了一下,可能GNN跟GEC的關係並不大,似乎GEC是用不到GNN的。。。

圖神經網絡綜述

【摘要】
很多學習任務中處理包含衆多關係的圖數據。物理系統建模、分子指紋圖譜、預測蛋白質界面、疾病分控需要一個圖輸出的結果。在其他領域如學習非結構化數據(文本、圖片),推理(如從圖片中提取文字信息)也很需要GNN。GNN是一種通過節點來捕獲圖的相關性的關聯型模型。起初GNN在早期存在訓練上的難度,目前圖卷積網絡GCN與門控圖神經網絡GGNN的興起改善了這種情況。本文我們詳細綜述各個GNN模型,系統性的分類並且展望發展前景

# 1 Introduction
> GNN刻畫實體與關係,具有更強的表現力
> GNN源於CNN,CNN刻畫局部特徵,但只能處理常規的歐式數據(如2D的圖像與1D的序列)。深入研究CNN我們發現CNN的關鍵是局部聯繫、共享權重、多層架構。這在解決圖領域也是很重要的:
  >> 圖是典型的局部聯繫結構
  >> 共享權重在圖中同樣可以節約計算量
  >> 多層架構是處理層次模式的關鍵
  因此從CNN到GNN是很直觀的
> 另一種動機來自圖嵌入,用於學習表示圖節點、邊和子圖
  >> DeepWalk用於解決隨機遊走問題,是基於表示學習,應用SkipGram模型的第一次圖嵌入的成功應用
  >> Node2Vector,LINE,TADW之後陸續取得突破
  >> 上述方法的缺陷及改進:
    >>> encoder中缺少參數共享,計算量龐大
    >>> 直接嵌入方法缺少泛化能力,無法處理其他動態圖以及應用到新圖中
    >>> 基於CNN與圖嵌入,GNN可以從圖結構中彙集信息
    >>> 基於RNN可以對傳播過程(diffusion process)建模
> GNN的優勢:
  >> 第一,CNN與RNN無法處理圖輸入,因爲它們通常視圖節點爲有序的,然而圖節點不存在自然排序,因此爲了體現無序性,需要遍歷所有的排序,這種計算量是駭人聽聞的。而GNN處理圖結構時分別分別傳播節點,無視節點的輸入順序,也就是說,GNN的輸出與GNN的輸入順序是無關的
  >> 第二,圖中的邊表示兩個節點的依賴關係,在CNN與RNN中這種依賴關係被認爲是節點的特徵,而GNN則通過這種特徵來傳播。GNN通過對鄰接點狀態加權求和更新隱層節點
  >> 推理是高級AI,在人腦中推理過程就是基於日常經歷得到的圖結構,CNN與RNN無法從經驗數據推出圖結構,而GNN則致力於從非結構化數據繪製圖。
  >> 近期,實驗表明即使是一個未訓練的簡單結構GNN也能表現的很好

# 2 Models
## Graph Neural Networks
> GNN起初被提出用於處理圖表示的數據結構,圖中每個節點被用其本身特徵以及其相關節點來定義
> GNN的目標是學習一個狀態嵌入hidden_vector h_v ∈ R^s來刻畫一個節點本身及其鄰里關係,它可以有輸出out_vector o_v(如節點的標籤)
  >> h_v = f(x_v,x_co[v],h_ne[v],x_ne[v]) f稱爲“局部轉移函數”,它的四個參數分別爲節點v的特徵、連接節點v的邊的特徵、節點狀態、節點鄰里特徵
  >> o_v = g(h_v,x_v) g稱爲“局部輸出函數”
> 令H,O,X,X_N包含這一切狀態、一切輸出、一切特徵、一切節點特徵,則我們得到一個完全形體:
  >> H = F(H,X) F成爲“全局轉移函數”,注意到H在本方程中是不動點,當F爲壓縮映射時H唯一確定,並且可以通過H_t+1 = F(H_t,X)的迭代方式逼近H的值
  >> O = G(H,X_N) G稱爲“全局輸出函數”
> f,g中的計算可以被看作是前饋神經網絡,如何計算f,g的參數值是問題?
> 我們定義損失函數loss = SUM_1~p(t_i-o_i) 其中p是有監督的節點數量,學習算法基於梯度下降策略,具體算法步驟如下:
  >> h_v_t 通過 h_v = f(x_v,x_co[v],h_ne[v],x_ne[v]) 迭代T步得到,最終的H(T)≈H
  >> 權重W的梯度從損失函數中計算得到,並通過梯度下降法更新
> 侷限性:
  >> 爲了一個不動點H來迭代地更新隱層節點h_v是低效的,如果我們鬆弛這個不動點H的假設,則可以設計一個多層GNN來得到一個節點及其鄰里關係的穩定表示
  >> GNN在不同次的迭代中使用相同的參數,大部分的主流網絡每層都是不一樣的,注意到更新隱層狀態h_v是一個序列過程,可以用RNN來優化(如GRU與LSTM)
  >> GNN也並非能夠表示所有特徵,如知識圖譜中的邊包含了關係類型以及傳播中的一些信息(上下位),並且如何學習h_v也是一個問題
  >> 使用不動點H的是不合適的,如果我們知識着重於節點表示而不是圖的表示,因爲不動點的表示分佈在值上過於光滑且信息太少,很難區別於其他點(這個我沒看懂,也無所謂懂不懂)?

## Variants of Graph Neural Networks
### Graph Types
> 常規GNN中的圖是無向圖,存在許多變體:
  >> 有向圖
    >>> 如知識圖譜中的的箭頭從上位指向下位,不同的方向在傳播上是不一樣的
    >>> ADGPM使用兩種不同的權重矩陣,H_t = σ(D_p^-1 * A_p * σ(D_c^-1 * A_c * H_t-1 * W_c) * W_p) 其中 D_p^-1 * A_p 與 D_c^-1 * A_c 分別是父子標準化的鄰接矩陣
  >> 異構圖
    >>> 異構圖中存在多種不同的節點,最簡單的處理方法是用 one-hot 特徵向量表示
    >>> GraphInception 引入了“元路徑”的概念,它根據不同的節點類型及距離用來彙總鄰接節點
    >>> 對於每個鄰居組,GraphInception將其視爲子圖來傳播與聯繫
  >> 有邊信息的圖
    >>> 先把圖變成二部圖(這個轉化方法有點迷),然後在節點上添加信息即可
    
### Propagation Types
> 傳播步驟與輸出步驟是GNN中最重要的部分,它們是用來獲得節點(或者)隱層狀態的
> 不同的傳播類型:
  >> 以圖的類型分類:
    >>> 有向圖:ADGPM
    >>> 異構圖:GraphInception
    >>> 帶有邊信息的圖:G2S R-GCN
  >> 以訓練方法分類:
    >>> 鄰里採樣:GraphSAGE FastGCN Adaptive
    >>> 感知域控制:ControlVariate
    >>> Boosting:Co-trainingGCN Self-trainingGCN
  >> 以傳播步驟分類:
    >>> 卷積彙集:GCN
    >>> 注意力彙集:GraphAttentionNetwork
    >>> 門更新單元:GRU LSTM
    >>> 跳過聯繫:HighWayGNN

#### Convolution
> 將卷積帶入圖領域是很有趣的事情,主要分爲spectral-approaches與nonspectral-approaches
  >> spectral-approaches:(看不懂,無能爲力)
  >> nonspectral-approaches:(看不懂,無能爲力)

#### Gate
> GRU與LSTM使用了門單元,在GNN中使用門單元可以提高圖架構中信息長期傳播的質量
> GGNN:在傳播步驟中使用GRU門單元,展開RNN到一個固定的次數T,並且使用反向傳播計算梯度
  >> 公式21:Page_9
> LSTM與GRU一樣也會使用到:
  >> 公式22:Page_9
  >> Child-Sum Tree-LSTM
  >> N-ary Tree-LSTM
  >> Sentence-LSTM:用於提升文本編碼,將文本轉化爲一張圖且優化Graph LSTM來學習表示
 
 
#### Attention
> 注意力機制已經被成功應用於基於序列的任務,如機器翻譯、機器閱讀
> Graph Attention Network(GAT)
> Graph Attention Layer
> multi-head attention:
  >> 常規更新:h_i' = σ(∑(a_ij*W*h_j))
  >> 多頭更新:h_i' = σ((1/K)*∑_1~K(∑(a_ij_k*W*h_j)))
> 注意力機制的性質
  >> 相鄰節點對的計算可以並行,因此傳播是高效的
  >> 可以用於有不同出入度節點的圖
  >> 可以被輕鬆用於歸納學習問題(我覺得這裏的意思可能是遷移學習)

#### Skip connection
> 許多應用選擇展開或者堆疊神經網絡來取得更好的結果
> 但是實驗發現更深的模型未必有更好的結果,甚至表現得更差,原因可能是更多的網絡層會使得噪聲在傳播過程中不斷擴大
> 解決這種問題的一個直接的方法是使用殘差網絡,即便如此,2層的GCN在大部分的數據集上也要比多層GCN要表現得更好
> 另外還有一種叫作 Highway-GCN 的方法,是添加了Highway gate的東西,此時4層最優

### Training Methods
> GCN的弱點:
  >> GCN要求全圖拉普拉斯矩陣(拉普拉斯矩陣L = 度矩陣D - 鄰接矩陣A),對於大圖來說計算很耗時
  >> 因爲每層GCN都要recurrent遞歸,所以節點數是幾何階數遞增的
  >> GCN只能爲特定圖訓練,缺乏延展性(遷移能力)
> GraphSAGE是對GCN的一個綜合提升
> FastGCN進一步提升了採樣算法
> 另外還有兩種改進,分別基於隨機近似算法與協同訓練

## General Frameworks
### Message Passing Neural Networks(MPNNs)
> 用於監督學習
> 模型包括兩階段:信息傳遞階段與讀出階段
  >> 信息傳遞階段:看不懂
  >> 讀出階段:看不懂
 

### Non-local Neural Networks(NLNN)
> 爲了深度神經網絡中捕獲長範圍的關聯而提出
> non-local算子:它用一個加權彙總所有位置的特徵來計算表示一個位置的響應
  >> NLNN可以視爲不同的“自注意力”的方法的融合
  >> 由該算子推得出的generic non-local 算子定義如下:h_i' = (1/C(h)) * ∑_j(f(h_i,h_j)*g(h_j)),其中f與g有很多的不同的選擇:
    >>> Gaussian:f(h_i,h_j) = exp(h_i.T * h_j)
    >>> Embedded Gaussian:f(h_i,h_j) = exp(θ(h_i).T * δ(h_j))
    >>> Dot Product:θ(h_i).T * δ(h_j)
    >>> Concateation:ReLU(...)

### Graph Networks
> 圖定義:G = (u,H,E),分別表示全局性質,頂點集,邊集
> 圖網絡塊:每個GN block裏面包含3個“更新函數”(Φ_e(ek,h_rk,h_sk,u) Φ_h(e'_i,h_i,u) Φ_u(e'_,h'_,u))與3個“彙總函數”(ρ_eh(Ei') ρ_eu(E') ρ_hu(H'))
> 圖計算步驟(GN block):(看不懂,要結合)
  >> Φ_e函數更新每個邊
  >> ρ_eh彙總邊Ei' --> e'_i
  >> Φ_h函數更新節點
  >> ρ_eu彙總邊E' --> e'_
  >> ρ_hu更新H' --> h'_
  >> Φ_u更新u
 
> 設計規則
  >> 靈活表示
  >> 配置within-block架構
  >> 可合成的多塊架構

# 3 Applications 應用
## Structural Scenarios
> 物理
  >> Interaction Networks
  >> Visual Interaction Networks
> 化學與生物
  >> 分子指紋
  >> 蛋白質界面預測
> 知識圖譜!!!

## Non-structural Scenarios
> 圖片
  >> 圖片分類
  >> 虛擬推理
  >> 語義分割 Semantic segmentation
 
> 文本
  >> 文本分類
  >> 序列標註
  >> 神經機器翻譯
  >> 關聯挖掘
  >> 實踐挖掘
  >> 其他應用

## Other Scenarios
> 生成模型
  >> NetGAN
> 聯合優化

# 4 Open Problems
> Shallow Structure
> 動態圖
> 非結構化場景
> Scalability:可延展性及規模化

# 5 Conclusion


20191129更新    1909.00502 當前時間節點上的NO.1論文

An Empirical Study of Incorporating Pseudo Data into Grammatical Error Correction

# 【摘要】
- 將僞造數據引入到GEC中是一種提升模型性能的方法, 然而這種共識缺乏實驗配置, 即選擇如何生成僞造數據以及使用僞造數據, 本研究中, 通過廣泛的實驗找到了在CONLL-2014上的較好測試結果, F0.5指數爲65.0, 且官方測試集(BEA-2019)的測試結果F0.5指標70.2, 其中後者沒有對前者在模型上進行修正;

# 1. Introduction
- 如今許多研究將GEC問題當作機器翻譯(MT)任務來解決, 不符合語法的句子被認爲是源語言, 符合語法的句子被認爲是目標語言, 於是encoder-decoder(EncDec)得以使用, 並且取得較好的結果;
    + EncDec使用的問題在於需要大量訓練數據, 而最大的公開數據集是Lang-8僅有200M個句子對;
    + 所以我們需要僞造訓練數據的方法是很緊急的;

- 僞造數據的要點:
    + 生成僞造數據的方法;
    + 僞造數據的種子語料;
    + 優化設置;

- 僞造數據的要點並未達成共識:
    + 回譯(backtranslation)方法: 回譯方法要比DirectNoise方法表現得好
    + 但最近的優秀模型使用的是DirectNoise方法

- 本研究主要提供提升模型效果的生成僞造數據的方法

# 2. Problem Formulation and Notation
- 常用標記:
    + D: GEC的訓練數據集, 包含了不合語法的句子X與合語法的句子Y, 我們一般通過Y來生成僞造數據(此時我們稱Y爲種子語料SeedCorpus), D={(Xi,Yi) i=1~n}
    + Θ: 表示模型中所有可訓練的參數, 我們的目標是找到最優的參數集Θ^來最小化目標函數L(D,Θ)
    + L: 損失函數 L(D,Θ)=-(1/|D|) * ∑log(p(Yi|Xi,Θ))----(1)

- 我們的興趣在於(1)式的三個非平凡方面:
    + 生成僞造數據集Dp的有哪些方法?
    + 如何選擇種子語料(即合語法的句子集)?
        * 我們比較了三種種子語料: Wikipedia, SimpleWiki, English Gigaword;
        * 前面兩個領域相似但有不同的語法複雜度, 因此可以用於對比不同語法複雜度對模型的影響;
        * Gigaword被認爲是噪聲最小的, 可以用來驗證是否乾淨的文本能夠提升模型性能;
    + 對於(1)式的優化至少有兩個辦法:
        * 第一種令 D = Dg ∪ Dp (JOINT), Dg稱爲真實的平行數據集, Dp是僞造集, 直接訓練
        * 第二種對Dp進行與訓練, 即先最小化L(Dp,Θ)以獲得Θ', 然後再最小化L(Dg,Θ') // 個人覺得這個方法好像有點意思

# 3. Methods for Generating Pseudo Data
- 介紹三種方法, 前兩種是回譯方法的變體, 用於EncDec模型, 從一個合法句子生成一個非法句子(這是一個逆模型), 逆模型的輸出配上輸入可以作爲僞造數據:
    + Backtrans(noisy): 添加一個r*β_random到迭代優化每步中的得分中
        * 噪聲 r 服從 Uniform[0,1]
        * β_random爲超參數用於控制噪聲規模, 若爲0則退化爲標準的回譯方法;
    + Backtrans(sample): 即句子被decode通過對逆模型的分佈中採樣得到;
    + Directnoise:
        * 前兩種方法都是利用逆模型生成不合乎語法的句子, 該方法是直接將噪聲插入到合乎語法的句子中去;
        * 特別的, 對於給定的一個句子, 該方法隨機做下面四種事情之一(概率應當預設μ_mask,μ_deletion,μ_insertion,μ_keep):
            · 用一個佔位符<mask>標記來mask;
            · 刪除;
            · 插入一個隨機標記;
            · 保持原樣;
        
# 4. Experiments
- 實驗目的基於第二部分中的三個非平凡方面;
- 爲確保實驗結果在GEC中具有普遍性, 使用了以下兩個策略:
    + 我們使用一個沒有明確目標的架構或技術的 off-the-shelf EncDec 模型;
    + 我們調整超參數, 評估以及比較每種方法在驗證集上進行, 然後在測試集上做一次模型檢測;

## 4.1 Experimental Configurations
- 數據集:
    + BEA-2019 被分爲訓練集(561410), 驗證集(2377), 測試集(4477); 種子語料選取了SimpleWiki/Wikipedia/Gigaword, 對每個語料採用了噪聲化處理, 得到了僞造數據集Dp; 另外還使用了CoNLL-2014與JFLEG作爲測試集;
- 評估方式: ERRANT, M2-scorer, GLEU, JFLEG;
- 模型: Transformer EncDec 模型
- 優化:
    - 對於第二部分中提到的JOINT配置, 我們利用Adam優化;
    - 對於第二部分中提到的PRETRAIN配置, 我們利用Adam優化然後用Adafactor遷移學習;

## 4.2 Aspect(i): Pseudo Data Generation
- 比較Backtrans(Noise), Backtrans(sample), DirectNoise三種方法生成僞造數據的有效性;
    + DirectNoise 實驗: (μ_mask,μ_deletion,μ_insertion,μ_keep) = (0.5,0.15,0.15,0.2);
    + Backtrans(Noise)中: β_random = 6;
    + 使用JOINT配置以及種子語料爲SimpleWiki;
- 三種僞造數據的實驗結果:
    ---------------------------
    |方法|查準率P|查全率R|F0.5|
    |Baseline|46.6|23.1|38.8|
    |Backtrans(sample)|44.6|27.4|39.6|
    |Backtrans(noisy)|42.5|31.3|39.7|
    |DirectNoise|48.9|25.7|41.4|
    ----------------------------
    + Backtrans(noisy)在解碼不合語法的句子時比Backtrans(sample)快1.2倍;
    + DirectNoise在F0.5的表現非常好;

## 4.3 Aspect(i): Seed Corpus T
- 三種種子語料的實驗結果:
    ----
    |方法|種子語料|查準率P|查全率R|F0.5|
    |Baseline|N/A|46.6|23.1|38.8|
    |Backtrans(noisy)|Wikipedia|43.8|30.8|40.4|
    |Backtrans(noisy)|SimpleWiki|42.5|31.3|39.7|
    |Backtrans(noisy)|Gigaword|43.1|33.1|40.6|
    |DirectNoise|Wikipedia|48.3|25.5|41.0|
    |DirectNoise|SimpleWiki|48.9|25.7|41.4|
    |DirectNoise|Gigaword|48.3|26.9|41.7|
    ----
    + 設置|Dp|爲1.4M;
    + F0.5的差別很小, 表明種子語料對模型表現影響很小, 但是Gigaword的表現要優於其他兩個語料;

## 4.4 Aspect (iii): Optimization Setting
- 這部分比較JOINT與PRETRAIN兩種設置情況的效果;
- 該部分使用Wikipedia, 一方面因爲SimpleWiki太小了, 另一方面Gigaword似乎並不容易獲得, 不方便其他研究者來複制結果;

- JointTraining v.s. Pretraining
    -----------------------------------------------
    |優化策略|方法|Dp集合規模|準確率P|召回率R|F0.5|
    |N/A|Baseline|0|46.6|23.1|38.8|
    |Pretrain|Backtrans(noisy)|1.4M|49.6|24.3|41.1|
    |Pretrain|DirectNoise|1.4M|48.4|21.2|38.5|
    |Joint|Backtrans(noisy)|1.4M|43.8|30.8|40.4|
    |Joint|DirectNoise|1.4M|48.3|25.5|41.0|
    |Pretrain|Backtrans(noisy)|14M|50.6|30.1|44.5|
    |Pretrain|DirectNoise|14M|49.8|25.8|42.0|
    |Joint|Backtrans(noisy)|14M|43.0|32.3|40.3|
    |Joint|DirectNoise|14M|48.7|23.5|40.1|
    --------------------------------------
    + 顯然, Pretrain中Dp集合規模越大, 效果越好, Joint則不然;
    + 關於上面這件事情的解釋我覺得略顯牽強, 遂不加以贅述;

- 僞造數據的數量:
    + 我們測試了僞造數據集的數量{1.4M, 7M, 14M, 30M, 70M}, 從圖1可以看出Backtrans(noisy)的F0.5指標純優於DirectNoise, 並且兩者隨着僞造集的規模上升F0.5指標不斷上升(70M時回譯達到45.9);

## 4.5 Comparison with Current Top Models
- 如今的實驗表明以下設置是有效的:
    + 結合 Joint 與 Gigaword (## 4.3);
    + Joint配置中的僞造數據集數量不應過多(## 4.4a);
    + Pretrain配置中使用Backtrans(noisy)的可以儘量用大的僞造集(## 4.4b);
    + 目前的Top模型可以做到F0.5 = 61.3(P5有一張表);
- 可以改進的方向:
    + 人造拼寫錯誤(SSE): 加入字母級的噪聲進入Dp;
    + 從右到左的重排序(R2L): 我們訓練4個從右到左的模型, 在集成4個從左到右的模型, 生成n個最好的候選集以及他們對應的得分, 把這n個候選集輸入到從右到左的模型中得到得分並重排序(我人都傻了);
    + 句子級別的錯誤探測(SED): 動機在於SED可以潛在地減少GEC模型中的false-positive錯誤, 我們使用re-implementation of the BERT-based SED model(不懂這是啥玩意兒);

# 5 Conclusion
- 利用Gigaword作爲種子語料是有效的;
- Pretrain模型使用Backtrans(noisy)數據有用;
- 測試集爲CoNLL-2014與BEA-2019兩個測試集;


Improving Grammatical Error Correction via Pre-Training a Copy-Augmented Architecture with Unlabeled Data

1909.00138 當前時間節點上的NO.2 在Github上有源碼可參考

【摘要】
- 神經機器翻譯系統已經成爲解決GEC問題最先進的方法;
- 本文我們提出一種“複製增強架構”(下稱CAA)——它通過從原句中複製未改變的單詞到目標句中;
- 由於GEC受限於沒有足夠多已標註的訓練數據來達到高精確度, 我們使用一個“降噪自動編碼器”(下稱DAE)來預訓練CAA, 使用了10億未標註的Benchmark然後在全預訓練模型與部分預訓練模型間作比較;
- 這是GEC問題中第一次從原句中複製單詞並且構建一個完全預訓練的Seq2Seq模型;
- 此外我們增加了token-level與sentence-level多任務學習;
- 實驗結果表明我們的模型比別人好不少;
- 實驗代碼在: https://github.com/zhawe01/fairseq-gec

# 1 Introduction
- “原句-->目標句”過程中一般80%以上的單詞不會發生變化, 正因如此, 我們改進目前的神經架構通過使它能夠直接從原句中複製未改變的和不在詞彙表中的單詞, 就和人類糾錯時一樣, 這是第一次“複製機制”被用於GEC;
- 我們用了很多訓練語料: NUS Corpus of Learner English(NUCLE), Lang-8, 即便如此但是因爲缺少標註還是很難;
- 爲了緩解沒有足夠已標註的句子的問題, 我們提出使用DAE預訓練我們的CAA模型使用10億未標註的Benchmark;
- 我們也增加兩個“多任務”, 包括token-level標註任務與sentence-level複製任務, 用於提升模型性能;
    + 複製機制是首次用於GEC, 曾用於文本總結任務, 在GEC中它可以用於訓練集較小的情況, 將未改變的與不在詞彙表中的單詞直接複製;
- CAA比其他架構在GEC中運行的好, CoNLL2014中測試集取得F0.5指標56.42, 通過用DAE與“多任務”的加成, 最終F0.5爲61.15;
- 貢獻總結:
    + 提出一個更合適的神經架構CAA;
    + 預訓練沒有標註的數據, 緩解了訓練集標註不足的問題;
    + 在CoNLL2014上進行了測試;

# 2 Our Approach
## 2.1 Base Architecture
- 原句: 第二語言學習者寫的句子; 目標句: 糾正語法後的句子; 翻譯模型學習從原句到目標句的映射;
- 我們使用基於注意力機制的Transformer架構來作爲baseline, Transformer將原句編碼成L個完全相同的區塊, 每塊都在原句tokens上應用一個多頭自注意機制,  (Position-wise Feed-Forward Networks 位置全鏈接前饋網絡——MLP變形), 解碼器與編碼器架構相同, 但是在隱層上多加了注意力層;(這邊具體架構我也不是很看得懂)
- 目的是預測在單詞標記序列({y1,y2,...,yT})中的下一個單詞(???暫時沒弄明白)
    + h_src_1...N = encoder(L_src_x1...N)
    + h_t = decoder(L_trg * y_t-1...1, h_src_1...N)
    + P_t(w) = softmax(L_trg * h_t)
    + 其中矩陣 L ∈ R^(d_x*|V|) 是詞嵌入矩陣, |V|是詞彙表規模, h_src_1...N是編碼器隱層狀態, h_t是下一個單詞的目標隱層狀態,
    + 損失函數: l_ce = - ∑_t=1~t(log(p_t(y_t))) 交叉熵損失;
    + (我總結一下, 先對原單詞標記編碼, 再解碼, 再軟大即可, 交叉熵損失函數)
    

## 2.2 複製機制
- 複製機制在文本摘要任務與語義分析任務中是有效的, 本文首次將它應用於GEC;
- 圖1: 複製增強架構CAA(我下面做個簡要描述)
    + 編碼器輸出一個複製的分佈, 解碼器輸出一個詞彙分佈, 然後兩者通過一個權重加和得到最後的結果;
    + 總之隨後是通過加權Copy Scores與Vocabulary Distribution
    + 我覺得並沒有看得很懂, 因爲我沒太看得出來複製體現在哪裏了(詳細只能看圖了);


# 3 Pre-training
- 預訓練被證明在很多問題中都是有效的;
- 這裏提出使用DAE(這與NO.1的DAE應該是相同的, 這裏就再看一遍)

## 3.1 Denoising Auto-encoder
- BERT隨機對15%的標記進行降噪處理, 對其中80%的直接用[MASK]替代, 10%用隨機單詞, 10%是保持原樣;
- 本實驗中是依據以下順序操作:
    + 首先 10% 刪除一個token;
    + 然後 10% 增加一個token;
    + 接着 10% 用一個隨機挑選的單詞替代一個單詞;
    + 隨後正態隨機打亂單詞(以單詞位置爲偏差), 然後通過矯正後的位置對單詞重新排序, 標準差0.5(???)

## 3.2 Pre-training Decoder
- 預訓練嵌入詞向量;
- 本實驗中的對 CAA-seq2seq 架構中的解碼器進行參數預訓練;

# 4 Multi-Task Learning(MTL)
- MTL通過聯合訓練多個相關任務來解決問題, 在很多任務中有效(計算機視覺);
- 本文中給出兩個任務: 即標記級別的標註任務與句子級別的複製任務;

## 4.1 Token-level Labeling Task
- 給單詞加token, 加註標籤是否這個token是對/錯;
- 假設每個原標記xi可以與一個目標標記yj一致, 我們定義目標標記是正確的如果xi==yi, 否則錯誤, 每個標記的標籤通過經過編碼器的最後狀態h_src_i的softmax被預測;
    + 即: p(label_i|x_1...N) = softmax(W' * h_src_i), 其中W'爲W的轉置;
    + 這個標記級的標註任務直接加強了輸入標記的正確性對於編碼器而言, 之後還可以被decoder使用;

## 4.2 Sentence-level Copying Task
- 該任務的最初動機是使得模型看起來更加正確;
- 在訓練中我們將同等數量的校正樣句對與edited句子對發送給模型, 當輸入正確的句子時, 我們移除解碼器的注意力層, 失去了EncDec的注意力層, 生成工作變得困難, 於是模型中複製的部分將對正確的句子得到提升(我寫的我自己都懵了);

# 5 Evaluations

## 5.1 Datasets
- 與之前的研究相同, 我們的使用了已標註數據集如公開的NUCLE, Lang-8, FCE 語料庫作爲我們的平行訓練數據;
- 未標註的數據集如著名的"One Billion Word Benchmark", 我們選擇CoNLL2013,2014作爲測試集;
- 爲了使得我們研究有可比性, 我們只使用瞭如下的訓練集:
    + 訓練語料: Lang-8 NUCLE FCE One-Billion;
    + 驗證語料: CoNLL2013 CoNLL2014 JFLEG;
    + 我們建立了一個基於統計的拼寫錯誤糾正系統來糾正訓練集中的拼寫錯誤;
    + 從Lang-8數據語料中提取出50000詞的字典;
    + 訓練前先把沒有改變的句子扔了;
    
## 5.2 Model and Training Settings
- 公開的 FAIR seq2seq 工具包 codebase中的Transformer implementation;
- 對於transformer模型,
    + 我們使用標記嵌入層與隱層規模爲512;
    + 編碼器與解碼器都是6層8個注意力頭;
    + 對於內部的層前饋網絡, 我們使用4096;
    + dropout爲0.2;
    + 從訓練數據集中找到了一個50000詞的詞彙表;
    + 優化方法爲Nesterovs加速梯度;
    + 學習率爲0.002;
    + 權重衰減爲0.5;
    + patience爲0(patience是個什麼玩意兒?);
    + 動量爲0.99;
    + 最小學習率10-4(什麼意思?);
    + 訓練中我們檢測每個epoch的表現;
    + 好像還用了些統計上的東西, 看不懂, 不看了;    
    
## 5.3 Experimental Results
- 詳見Table4 P6
    + 歷年的模型好像大部分都用了LM作爲輔助;


## 5.4 Ablation Study
### 5.4.1 Copying Ablation Results
- 比較有無複製機制的情況, 顯然對結果提升很大(上一篇中也着重強調了);
- 複製確實對UNK單詞處理有很大優勢;
- 詳見Table5 P7;

### 5.4.2 Pre-training Ablation Results
- 預訓練當然有用了, 確實有很大提升;

### 5.4.3 Sentence-level Copying Task Ablation Results
- 前面提到的那個權重α_copy爲0.44/0.45是比較好的;

## 5.5 Attention Visualization
- 我覺得已經開始玄學了, 詳見Figure2 P8, 意思說大致如下:
    + copy alignment: 複製一句話, 每個單詞與它下一個單詞對應;
    + Enc-Dec Attention Alignment: 學習出更靈活的對應, 即每個單詞檢查它是否正確應該有個單詞會做出較強的指示, 我們要去學習這個注意力;

# 6 Discussion
## 6.1 Recall on Different Error Types
- 語法錯誤自動糾正是一個很複雜的任務, 在該部分, 我們分析不同語法錯誤類型上的表現;
- CoNLL2014測試集有28種不同的錯誤, 我們排序出最高的9種錯誤;
- 我們的方法Recall了72.65%的錯誤在“名詞單複數”以及61.79%的錯誤在“主謂一致”上, 但是在“錯誤的搭配/習語”上僅有10.38%的Recall;
- 計算機擅長確定性的機械式錯誤, 但在人類語言文化習慣方面還是不行;

# 7 Related Work
- SMT系統;
- 當前最優的系統;

# 8 Conclusions
- 我們提出CAA(然而我沒看懂):
    + 首先我們提出一個加強的CAA, 它改進了seq2seq模型的能力通過直接複製未改變的單詞和不在詞彙表中的單詞從原輸入標記;
    + 其次, 我們完全預訓練和CAA了使用大規模的未標註的數據, 平衡了降噪自動編碼器;
    + 其三, 我們引入兩個輔助任務爲了多任務學習;
    + 最後我們表現得很好;

!!!在這裏我說一下我對注意力機制及多頭注意力層的理解!!!

主要參考了https://zhuanlan.zhihu.com/p/54356280

主要是三個矩陣Query(Q),Key(K),Value(V),它們分別與詞向量相乘得到查詢向量q,鍵向量k,值向量v,qk點乘得到標量,一句話裏每個單詞得到一個標量,做softmax,把softmax的輸出值乘以v即作爲注意力層的輸出了。

多頭則是有多個QKV的三聯對(Transformer中有8個),它們分別得到一個注意力層輸出,但是模型不需要8個,所以把他們concat起來,用一個需要訓練的超參數矩陣W0相乘得到與一個輸出相同的維度即可(本質差不多是對這8個加權求和)。原理差不多就是這樣了。


20191204更新 著名的Attention is all you need摘要 1706.03762

1. Encoder:
- Encoder由六個同樣的編碼器層組成;
- 每個編碼器層有兩個子層: 先進入多頭自注意機制(multi-head self-attention mechanism), 再進入前饋全連接層(fully-connected feed-forword network);
- 這兩個子層我們都使用了殘差連接(residual connection), 且每個子層的輸出都會經過一個標準化層處理(Add&Norm: LayerNorm(x+Sublayer(x)));
- 輸出維度是d_model=512;

2. Decoder:
- Decoder由六個同樣的解碼器層組成;
- 每個解碼器層有三個子層: 第一層與第三層與編碼器中的兩個子層相同, 第二層除了接收第一層多頭自注意機制的輸出外, 還接收Encoder的最終輸出;
- 仍然採用殘差連接與標準化層;
- 第一個子層多頭自注意力機制有所改變, 爲了防止位置去影響子序列位置, 於是加了一個masking, 將embedding的輸出平移一個位置, 確保對位置i的預測只依賴於已知輸出的位置小於i的部分(masked multi-head attention);(說實話我並沒有看懂什麼意思)

3. Attention: Q K V
- 單位化後的點積注意力:
    + 點積: dot_qk = Q * K
    + 單位化: dot_qk = Q * K / sqrt(d_k)
    + Mask: ???
    + Softmax: 對dot_qk進行softmax處理
    + 點積: 將softmax的輸出結果點乘 V 即可
    
- Attention(Q,K,V) = softmax(QK'/sqrt(d_k))*V;
    + 其中 Q與K 的維度是d_k, V的維度是d_v

- MultiHead(Q,K,V) = Concat(head_1,...,head_h) * W_O
    + 其中head_i = Attention(Q*Wi_Q,K*Wi_K,V*Wi_V)
    + 單個注意力函數有d_model維度的K,V,Q; 然後我們創造h組不同的(Ki,Vi,Qi), 分別學習線性映射到d_k, d_k, d_v維度,

4. Transformer中Attention的應用
- Transformer使用多頭注意力在三個不同的方面:
    + 在"Encoder-Decoder Attention"層中, Q來自之前的decoder層, K,V來自encoder的輸出, 這使得deocoder中每個位置都可以處理輸入序列的每個位置;
    + Encoder中包含自注意力層, K,V,Q來自同樣的位置, 即前一層encoder的輸出, 同樣encoder中的每個位置都可以處理前一層Encoder中的每個位置;
    + Decoder中的自注意力層同樣可以處理前一層直到幷包括那個位置的; 我們需要防止左邊的信息流入decoder破壞了自迴歸(auto-regressive)性質;
    + 於是我們對

5. 全連接層:
- 使用ReLU作爲激活函數;
- FFN(x) = max(0,xW1+b1)W2 + b2
- 輸入與輸出都是512維; 隱層是2048維的;

6. Embeddings and Softmax:
- 我們使用已經訓練好的維度爲d_model的embeddings來轉換輸入token與輸出token;
- 在嵌入層中我們把權重乘以sqrt(d_model);
- 因爲Encoder-decoder模型中沒有RNN與CNN, 爲了使得模型可以利用序列的順序, 我們需要插入一些關羽相對/絕對位置信息;    
- 爲了達到這個目的, 我們在encoder與decoder的底部向input embeddings中加入positional encodings;
   

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章