習(xí)距離偏置的軟約束方案)
1. 句法信息注入Transformer的動(dòng)機(jī)與整體思路1.1 為什么要在Transformer里塞進(jìn)句法樹Transformer架構(gòu)從2017年提出之后迅速在自然語(yǔ)言處理的各個(gè)任務(wù)上鋪開機(jī)器翻譯、文本分類、問(wèn)答系統(tǒng)、語(yǔ)言模型幾乎每個(gè)方向都在用。它的核心是自注意力機(jī)制每個(gè)詞都能直接和序列中任意位置的其他詞計(jì)算關(guān)聯(lián)權(quán)重不受距離限制。這個(gè)特性讓它在捕捉長(zhǎng)距離依賴上比循環(huán)神經(jīng)網(wǎng)絡(luò)強(qiáng)出一大截訓(xùn)練時(shí)還能并行計(jì)算速度優(yōu)勢(shì)非常明顯。但用久了就會(huì)發(fā)現(xiàn)一個(gè)問(wèn)題自注意力學(xué)到的關(guān)聯(lián)模式和人類理解語(yǔ)言時(shí)依賴的句法結(jié)構(gòu)并不總是一回事。舉個(gè)例子“那只追著貓跑的小狗終于停了下來(lái)”這句話里“小狗”是主語(yǔ)“停了下來(lái)”是謂語(yǔ)中間隔了很長(zhǎng)一段修飾成分。自注意力理論上能通過(guò)多層堆疊學(xué)到這種主謂關(guān)系但它需要大量數(shù)據(jù)去隱式地?cái)M合而且學(xué)到的注意力分布未必和句法樹對(duì)齊。換句話說(shuō)模型有能力學(xué)到句法但沒(méi)有被明確告知句法是什么。這就引出了一個(gè)很自然的研究方向能不能把句法樹的結(jié)構(gòu)信息顯式地注入到Transformer里讓模型不用從零開始摸索句法關(guān)系這個(gè)思路在循環(huán)神經(jīng)網(wǎng)絡(luò)時(shí)代就有大量工作比如把句法樹的路徑編碼進(jìn)隱狀態(tài)或者用樹結(jié)構(gòu)約束信息流動(dòng)。到了Transformer時(shí)代問(wèn)題變成了自注意力本身是一個(gè)全連接圖怎么把一個(gè)樹結(jié)構(gòu)嵌進(jìn)去同時(shí)不破壞它原有的并行性和表達(dá)能力這篇論文給出的方案核心思路是在自注意力的計(jì)算過(guò)程中引入一個(gè)基于句法樹的距離偏置。不是硬性地把注意力限制在樹的邊上而是把樹中兩個(gè)詞之間的路徑長(zhǎng)度轉(zhuǎn)化成一個(gè)可以加到注意力分?jǐn)?shù)上的偏置項(xiàng)。這樣模型仍然能看到全序列但句法上靠近的詞會(huì)獲得額外的注意力傾向。這個(gè)設(shè)計(jì)的好處是既保留了Transformer的靈活性又給了模型一個(gè)句法上的“先驗(yàn)提示”。1.2 整體方案的設(shè)計(jì)哲學(xué)這個(gè)方案的設(shè)計(jì)哲學(xué)可以用一句話概括軟約束優(yōu)于硬約束。所謂硬約束就是直接把注意力矩陣中不符合句法樹的位置mask掉強(qiáng)制模型只能沿著樹的邊做注意力。這種做法在依賴句法樹質(zhì)量的任務(wù)上可能有效但一旦句法分析器出錯(cuò)錯(cuò)誤會(huì)直接傳播到下游而且模型失去了捕捉句法之外關(guān)聯(lián)的能力。軟約束的做法則是在注意力分?jǐn)?shù)上加一個(gè)偏置句法上近的加正偏置遠(yuǎn)的加負(fù)偏置但所有位置仍然可訪問(wèn)。模型可以根據(jù)任務(wù)需要自己決定多大程度上依賴這個(gè)偏置。如果句法信息有用模型會(huì)學(xué)會(huì)放大這個(gè)偏置的影響如果句法信息有噪聲模型也可以學(xué)會(huì)忽略它。這種設(shè)計(jì)在工程上更穩(wěn)健也更符合“讓模型自己學(xué)”的深度學(xué)習(xí)哲學(xué)。另一個(gè)關(guān)鍵設(shè)計(jì)是偏置的計(jì)算方式。論文沒(méi)有直接用句法樹上的最短路徑長(zhǎng)度作為偏置而是把路徑長(zhǎng)度映射到一個(gè)可學(xué)習(xí)的嵌入向量。具體來(lái)說(shuō)路徑長(zhǎng)度被離散化到若干個(gè)桶里每個(gè)桶對(duì)應(yīng)一個(gè)可學(xué)習(xí)的標(biāo)量偏置。這樣模型可以自己學(xué)習(xí)“路徑長(zhǎng)度為1時(shí)偏置應(yīng)該是多少”“路徑長(zhǎng)度為2時(shí)又該是多少”而不是人為設(shè)定一個(gè)固定的衰減函數(shù)。這個(gè)細(xì)節(jié)很重要因?yàn)椴煌蝿?wù)對(duì)句法距離的敏感程度不一樣可學(xué)習(xí)的偏置讓方案能適應(yīng)不同場(chǎng)景。2. 核心細(xì)節(jié)解析與實(shí)操要點(diǎn)2.1 句法樹的獲取與預(yù)處理要注入句法信息第一步是拿到句法樹。論文里用的是依存句法分析器對(duì)每個(gè)輸入句子生成一棵依存樹每個(gè)詞有一個(gè)父節(jié)點(diǎn)和一條依存弧標(biāo)簽。依存樹的好處是它和詞序列一一對(duì)應(yīng)每個(gè)詞恰好有一個(gè)父節(jié)點(diǎn)根節(jié)點(diǎn)除外路徑長(zhǎng)度的計(jì)算比較直接。實(shí)際操作中句法分析器的選擇會(huì)影響最終效果。論文里用的是現(xiàn)成的依存分析器沒(méi)有自己訓(xùn)練。這里有一個(gè)經(jīng)驗(yàn)如果你做的任務(wù)有標(biāo)注好的句法樹比如某些語(yǔ)言有樹庫(kù)那直接用金標(biāo)準(zhǔn)句法樹效果最好。但大多數(shù)下游任務(wù)沒(méi)有句法標(biāo)注只能用自動(dòng)分析器。自動(dòng)分析器的準(zhǔn)確率通常在90%到95%之間意味著每句話里可能有一兩個(gè)詞的父節(jié)點(diǎn)是錯(cuò)的。軟約束的設(shè)計(jì)在這里就體現(xiàn)出優(yōu)勢(shì)了個(gè)別錯(cuò)誤不會(huì)導(dǎo)致整個(gè)注意力矩陣崩掉。預(yù)處理階段還需要把句法樹轉(zhuǎn)換成距離矩陣。對(duì)于長(zhǎng)度為n的句子需要計(jì)算一個(gè)n乘n的矩陣每個(gè)元素是詞i和詞j在句法樹上的最短路徑長(zhǎng)度。這個(gè)計(jì)算可以用樹的最近公共祖先算法來(lái)做時(shí)間復(fù)雜度是O(n^2)對(duì)于常規(guī)句子長(zhǎng)度幾十個(gè)詞完全夠用。如果句子特別長(zhǎng)可以考慮用一些近似算法但論文里沒(méi)有涉及這個(gè)場(chǎng)景。注意句法分析器對(duì)分詞很敏感。如果你的任務(wù)是中文分詞邊界和句法分析器的分詞邊界必須一致否則詞對(duì)不上距離矩陣就錯(cuò)了。我試過(guò)用不同分詞工具混搭結(jié)果路徑長(zhǎng)度全亂模型效果直接掉到基線以下。2.2 距離到偏置的映射機(jī)制拿到距離矩陣之后下一步是把距離映射成偏置。論文的做法是設(shè)置一個(gè)最大距離閾值比如10超過(guò)這個(gè)閾值的距離統(tǒng)一當(dāng)作10處理。然后為0到10這11個(gè)距離值各分配一個(gè)可學(xué)習(xí)的標(biāo)量參數(shù)。這些參數(shù)和模型的其他參數(shù)一起訓(xùn)練初始化通常是零或者小的隨機(jī)值。為什么用桶而不是連續(xù)函數(shù)因?yàn)榫浞ň嚯x的分布是長(zhǎng)尾的大部分詞對(duì)的路徑長(zhǎng)度在1到5之間超過(guò)10的很少。如果用一個(gè)連續(xù)函數(shù)比如指數(shù)衰減你需要調(diào)衰減率這個(gè)超參數(shù)調(diào)不好效果就差很多。用桶的話每個(gè)距離的偏置獨(dú)立學(xué)習(xí)模型自己決定怎么分配。而且桶的數(shù)量是一個(gè)可控的超參數(shù)桶太少表達(dá)力不夠桶太多參數(shù)多且容易過(guò)擬合。論文里用了10個(gè)桶這個(gè)數(shù)字在大多數(shù)任務(wù)上夠用。偏置加到注意力分?jǐn)?shù)上的方式也很關(guān)鍵。標(biāo)準(zhǔn)自注意力的分?jǐn)?shù)是query和key的點(diǎn)積除以根號(hào)d然后softmax。加偏置就是在softmax之前把偏置加到分?jǐn)?shù)上。這樣偏置會(huì)影響softmax的分布正偏置讓對(duì)應(yīng)位置的注意力權(quán)重變大負(fù)偏置讓它變小。注意這個(gè)偏置是加在分?jǐn)?shù)上的不是乘在權(quán)重上的所以它不會(huì)改變注意力的歸一化性質(zhì)。2.3 多頭注意力中的偏置共享Transformer是多頭的每個(gè)頭有自己的query、key、value投影矩陣。一個(gè)自然的問(wèn)題是句法偏置是所有頭共享還是每個(gè)頭獨(dú)立論文里做了實(shí)驗(yàn)發(fā)現(xiàn)共享偏置和獨(dú)立偏置效果差不多但共享偏置參數(shù)更少訓(xùn)練更穩(wěn)定。這個(gè)結(jié)論和直覺(jué)一致句法信息是句子層面的不應(yīng)該隨頭變化。如果每個(gè)頭學(xué)一套偏置容易過(guò)擬合而且不同頭之間沒(méi)有一致性約束可能學(xué)出矛盾的偏置。不過(guò)這里有一個(gè)細(xì)節(jié)偏置是加在分?jǐn)?shù)上的而不同頭的分?jǐn)?shù)尺度可能不一樣。如果某個(gè)頭的點(diǎn)積分?jǐn)?shù)普遍偏大同樣的偏置對(duì)它影響就小反之影響就大。論文里沒(méi)有對(duì)分?jǐn)?shù)做額外的歸一化直接加偏置。實(shí)測(cè)下來(lái)只要初始化合理這個(gè)問(wèn)題不嚴(yán)重因?yàn)閷託w一化和殘差連接會(huì)穩(wěn)定訓(xùn)練。實(shí)操心得如果你在自己的任務(wù)上發(fā)現(xiàn)加偏置后效果不穩(wěn)定可以試試對(duì)偏置做一個(gè)縮放比如乘以一個(gè)可學(xué)習(xí)的標(biāo)量初始化為1。這樣模型可以自己調(diào)整偏置的整體強(qiáng)度。我在一個(gè)文本分類任務(wù)上試過(guò)加了縮放之后收斂更快最終效果也略好。3. 實(shí)操過(guò)程與核心環(huán)節(jié)實(shí)現(xiàn)3.1 從零實(shí)現(xiàn)句法偏置注意力的步驟假設(shè)你已經(jīng)有了一個(gè)標(biāo)準(zhǔn)的Transformer編碼器現(xiàn)在要把它改造成帶句法偏置的版本。下面是我實(shí)際操作的步驟以PyTorch為例。第一步準(zhǔn)備句法距離矩陣。對(duì)每個(gè)batch里的每個(gè)句子用依存分析器生成依存樹然后計(jì)算距離矩陣。距離矩陣的形狀是batch_size乘seq_len乘seq_len。注意padding位置的距離要設(shè)成一個(gè)特殊值比如-1然后在加偏置時(shí)mask掉。第二步定義偏置嵌入層。創(chuàng)建一個(gè)Embedding層輸入維度是最大距離加1輸出維度是1。初始化用零。這個(gè)Embedding層的參數(shù)就是每個(gè)距離對(duì)應(yīng)的偏置值。第三步修改自注意力的forward函數(shù)。在計(jì)算完query和key的點(diǎn)積之后除以根號(hào)d之前或之后都可以把偏置加進(jìn)去。具體來(lái)說(shuō)對(duì)于每個(gè)位置對(duì)(i,j)查表得到偏置b然后分?jǐn)?shù)加上b。注意偏置的形狀要broadcast到和分?jǐn)?shù)矩陣一致。第四步處理padding。padding位置的分?jǐn)?shù)要設(shè)成負(fù)無(wú)窮這樣softmax之后權(quán)重為零。這個(gè)和標(biāo)準(zhǔn)Transformer一樣但要注意偏置不要加到padding位置上否則可能把負(fù)無(wú)窮變成有限值。第五步訓(xùn)練和調(diào)參。偏置嵌入層的學(xué)習(xí)率可以和主模型一樣也可以稍微大一點(diǎn)因?yàn)樗膮?shù)少。我試過(guò)用一樣的學(xué)習(xí)率效果就很好。最大距離閾值這個(gè)超參數(shù)論文里用10我試過(guò)5和15在大多數(shù)任務(wù)上10是安全的。如果句子平均長(zhǎng)度很短比如10個(gè)詞以內(nèi)可以降到5。import torch import torch.nn as nn import torch.nn.functional as F class SyntaxBiasedAttention(nn.Module): def __init__(self, d_model, n_head, max_distance10): super().__init__() self.d_model d_model self.n_head n_head self.d_k d_model // n_head self.max_distance max_distance self.q_proj nn.Linear(d_model, d_model) self.k_proj nn.Linear(d_model, d_model) self.v_proj nn.Linear(d_model, d_model) self.out_proj nn.Linear(d_model, d_model) self.distance_bias nn.Embedding(max_distance 1, 1) nn.init.zeros_(self.distance_bias.weight) def forward(self, x, distance_matrix, maskNone): batch_size, seq_len, _ x.shape q self.q_proj(x).view(batch_size, seq_len, self.n_head, self.d_k).transpose(1, 2) k self.k_proj(x).view(batch_size, seq_len, self.n_head, self.d_k).transpose(1, 2) v self.v_proj(x).view(batch_size, seq_len, self.n_head, self.d_k).transpose(1, 2) scores torch.matmul(q, k.transpose(-2, -1)) / (self.d_k ** 0.5) clamped_dist torch.clamp(distance_matrix, 0, self.max_distance) bias self.distance_bias(clamped_dist).squeeze(-1) bias bias.unsqueeze(1) scores scores bias if mask is not None: scores scores.masked_fill(mask 0, float(-inf)) attn F.softmax(scores, dim-1) context torch.matmul(attn, v) context context.transpose(1, 2).contiguous().view(batch_size, seq_len, self.d_model) return self.out_proj(context)這段代碼的關(guān)鍵點(diǎn)在于distance_bias的初始化為零這樣訓(xùn)練初期模型行為和標(biāo)準(zhǔn)Transformer完全一樣然后逐漸學(xué)會(huì)利用句法偏置。如果初始化成隨機(jī)值訓(xùn)練初期可能會(huì)引入噪聲收斂變慢。3.2 距離矩陣的計(jì)算實(shí)現(xiàn)距離矩陣的計(jì)算需要一個(gè)函數(shù)輸入是依存樹輸出是每對(duì)詞的最短路徑長(zhǎng)度。依存樹可以用一個(gè)父節(jié)點(diǎn)數(shù)組表示parent[i]是詞i的父節(jié)點(diǎn)索引根節(jié)點(diǎn)的父節(jié)點(diǎn)設(shè)為自己或者-1。計(jì)算最短路徑的常用方法是先找到兩個(gè)詞的最近公共祖先然后路徑長(zhǎng)度等于兩個(gè)詞到祖先的深度之和減去兩倍祖先的深度。def compute_distance_matrix(parents, seq_len): depth [0] * seq_len for i in range(seq_len): node i while parents[node] ! node: node parents[node] depth[i] 1 dist [[0] * seq_len for _ in range(seq_len)] for i in range(seq_len): for j in range(seq_len): a, b i, j path_a, path_b [], [] while a ! parents[a]: path_a.append(a) a parents[a] path_a.append(a) while b ! parents[b]: path_b.append(b) b parents[b] path_b.append(b) set_a {node: idx for idx, node in enumerate(path_a)} lca None for idx, node in enumerate(path_b): if node in set_a: lca node break dist[i][j] set_a[lca] path_b.index(lca) return dist這個(gè)實(shí)現(xiàn)的時(shí)間復(fù)雜度是O(n^2)乘以每次找LCA的O(n)對(duì)于n小于100的句子完全夠用。如果要做batch處理可以把每個(gè)句子的距離矩陣算好之后padding到相同長(zhǎng)度然后堆疊成tensor。注意依存分析器的輸出格式各不相同有的用0-based索引有的用1-based有的根節(jié)點(diǎn)索引是-1。在寫代碼之前一定要確認(rèn)清楚否則距離矩陣全錯(cuò)。我踩過(guò)這個(gè)坑調(diào)了半天才發(fā)現(xiàn)是索引偏移了一位。3.3 訓(xùn)練配置與超參數(shù)選擇論文里的實(shí)驗(yàn)設(shè)置是標(biāo)準(zhǔn)的Transformer base配置6層編碼器8個(gè)頭d_model是512ffn是2048dropout是0.1。優(yōu)化器用Adam學(xué)習(xí)率用warmup加逆平方根衰減。這些配置在大多數(shù)任務(wù)上都是安全的起點(diǎn)。句法偏置相關(guān)的超參數(shù)主要有兩個(gè)最大距離閾值和偏置的學(xué)習(xí)率。最大距離閾值論文里用10我建議根據(jù)任務(wù)的平均句子長(zhǎng)度來(lái)定。如果平均長(zhǎng)度是2010是合理的如果平均長(zhǎng)度是50可以設(shè)成15或20。偏置的學(xué)習(xí)率可以和主模型一樣也可以設(shè)成主模型的2倍因?yàn)樗膮?shù)少需要更快的學(xué)習(xí)。我試過(guò)2倍學(xué)習(xí)率收斂稍快但最終效果差不多。還有一個(gè)容易忽略的點(diǎn)句法分析器的質(zhì)量。如果分析器的準(zhǔn)確率低于90%注入句法信息可能反而有害。這種情況下可以考慮用集成多個(gè)分析器的結(jié)果或者降低偏置的初始強(qiáng)度讓模型自己決定用多少。論文里沒(méi)有討論分析器質(zhì)量的影響但這是實(shí)際部署時(shí)必須考慮的。4. 常見問(wèn)題與排查技巧實(shí)錄4.1 加了句法偏置反而掉點(diǎn)怎么辦這是最常見的問(wèn)題。明明句法信息應(yīng)該有用為什么加了之后效果變差了根據(jù)我的經(jīng)驗(yàn)原因通常有以下幾個(gè)。第一個(gè)原因是句法分析器質(zhì)量太差。如果你的任務(wù)領(lǐng)域和句法分析器的訓(xùn)練領(lǐng)域差距很大比如分析器是在新聞?wù)Z料上訓(xùn)練的你的任務(wù)是社交媒體文本分析準(zhǔn)確率可能掉到80%以下。這種情況下句法偏置引入的噪聲大于信號(hào)模型學(xué)不到有用的東西。解決辦法是換一個(gè)在目標(biāo)領(lǐng)域上表現(xiàn)更好的分析器或者干脆不用句法偏置等有了高質(zhì)量分析器再說(shuō)。第二個(gè)原因是偏置的初始化太強(qiáng)。如果偏置初始化成非零值訓(xùn)練初期模型就被迫接受一個(gè)可能錯(cuò)誤的句法先驗(yàn)導(dǎo)致優(yōu)化困難。論文里初始化成零這是最安全的做法。如果你改了初始化先改回零試試。第三個(gè)原因是最大距離閾值設(shè)得太小。如果閾值是5但很多有用的句法關(guān)系路徑長(zhǎng)度是6或7這些關(guān)系就被截?cái)喑?偏置無(wú)法區(qū)分它們。解決辦法是增大閾值或者用對(duì)數(shù)分桶讓長(zhǎng)距離的桶更稀疏。第四個(gè)原因是任務(wù)本身不依賴句法。有些任務(wù)比如情感分類主要靠關(guān)鍵詞和局部模式句法結(jié)構(gòu)幫助不大。這種情況下加句法偏置可能只是增加了參數(shù)沒(méi)有帶來(lái)信息增益??梢韵茸鲆粋€(gè)消融實(shí)驗(yàn)不加偏置的基線是多少加了之后是多少如果持平或略降說(shuō)明這個(gè)任務(wù)不適合。4.2 訓(xùn)練不收斂或loss震蕩加了句法偏置之后如果訓(xùn)練不收斂首先檢查距離矩陣是否正確。一個(gè)簡(jiǎn)單的驗(yàn)證方法是打印幾個(gè)句子的距離矩陣人工檢查是否合理。比如相鄰詞的路徑長(zhǎng)度通常是1或2如果打印出來(lái)是0或很大的數(shù)說(shuō)明計(jì)算有問(wèn)題。另一個(gè)常見原因是padding處理不當(dāng)。如果padding位置的距離沒(méi)有mask掉偏置會(huì)加到padding位置上softmax之后padding位置可能獲得非零權(quán)重污染上下文表示。檢查mask是否在加偏置之后、softmax之前應(yīng)用。還有一個(gè)可能的原因是偏置嵌入層的梯度太大。因?yàn)槠弥苯蛹拥椒謹(jǐn)?shù)上對(duì)softmax的影響是指數(shù)級(jí)的梯度可能很大。可以試試對(duì)偏置嵌入層的梯度做裁剪或者用更小的學(xué)習(xí)率。我遇到過(guò)一次loss震蕩把偏置學(xué)習(xí)率降到主模型的0.5倍就好了。4.3 推理時(shí)沒(méi)有句法分析器怎么辦訓(xùn)練的時(shí)候有句法分析器推理的時(shí)候如果分析器不可用或者太慢怎么辦有幾個(gè)方案。方案一是用一個(gè)小型快速分析器準(zhǔn)確率低一點(diǎn)但速度快。很多依存分析器有蒸餾版本速度是原版的幾倍準(zhǔn)確率只降一兩個(gè)點(diǎn)。對(duì)于推理延遲敏感的場(chǎng)景這個(gè)方案很實(shí)用。方案二是緩存句法分析結(jié)果。如果推理請(qǐng)求有重復(fù)比如同一個(gè)句子被多次處理可以緩存距離矩陣。但自然語(yǔ)言任務(wù)里完全重復(fù)的句子不多這個(gè)方案效果有限。方案三是訓(xùn)練一個(gè)句法距離預(yù)測(cè)器輸入是詞向量輸出是距離矩陣。這個(gè)預(yù)測(cè)器可以和主模型聯(lián)合訓(xùn)練推理時(shí)只用預(yù)測(cè)器不需要外部分析器。這個(gè)方案比較復(fù)雜論文里沒(méi)有涉及但我在一個(gè)項(xiàng)目里試過(guò)效果還可以代價(jià)是增加了一些參數(shù)和訓(xùn)練時(shí)間。方案四是直接去掉句法偏置用標(biāo)準(zhǔn)Transformer推理。如果訓(xùn)練時(shí)句法偏置的權(quán)重學(xué)得很小去掉之后影響不大。但如果權(quán)重很大去掉之后效果會(huì)明顯下降。所以這個(gè)方案只適合偏置權(quán)重小的情況。4.4 常見問(wèn)題速查表問(wèn)題現(xiàn)象可能原因排查方法解決辦法加了偏置后掉點(diǎn)分析器質(zhì)量差檢查分析器在目標(biāo)領(lǐng)域的準(zhǔn)確率換分析器或不用偏置訓(xùn)練不收斂距離矩陣錯(cuò)誤打印距離矩陣人工檢查修正距離計(jì)算邏輯loss震蕩偏置梯度太大監(jiān)控偏置層梯度范數(shù)降低偏置學(xué)習(xí)率或梯度裁剪推理速度慢分析器太慢測(cè)分析器延遲用蒸餾版分析器或緩存偏置權(quán)重學(xué)不動(dòng)初始化太小或?qū)W習(xí)率太低檢查偏置值變化增大學(xué)習(xí)率或初始化長(zhǎng)句效果差最大距離閾值太小統(tǒng)計(jì)長(zhǎng)句的距離分布增大閾值或?qū)?shù)分桶避坑技巧在正式訓(xùn)練之前先做一個(gè)小的消融實(shí)驗(yàn)用10%的數(shù)據(jù)訓(xùn)練標(biāo)準(zhǔn)Transformer和帶偏置的版本對(duì)比驗(yàn)證集效果。如果帶偏置的版本沒(méi)有優(yōu)勢(shì)先別急著上全量數(shù)據(jù)回頭檢查分析器和距離矩陣。這個(gè)習(xí)慣幫我省了很多算力。5. 效果分析與擴(kuò)展思路5.1 論文實(shí)驗(yàn)結(jié)果的解讀論文在機(jī)器翻譯和語(yǔ)言模型兩個(gè)任務(wù)上做了實(shí)驗(yàn)。機(jī)器翻譯用的是標(biāo)準(zhǔn)的數(shù)據(jù)集語(yǔ)言模型用的是維基百科語(yǔ)料。結(jié)果顯示加了句法偏置之后BLEU值和困惑度都有改善。改善幅度不算大機(jī)器翻譯上大概0.5到1個(gè)BLEU語(yǔ)言模型上困惑度降了幾個(gè)點(diǎn)。這個(gè)幅度在學(xué)術(shù)界算是顯著但在工業(yè)界可能不夠驚艷。值得注意的是論文做了消融實(shí)驗(yàn)把偏置換成固定的距離衰減函數(shù)效果比可學(xué)習(xí)的偏置差。這說(shuō)明可學(xué)習(xí)的偏置確實(shí)有用模型學(xué)到的偏置模式不是簡(jiǎn)單的衰減。論文還可視化了學(xué)到的偏置值發(fā)現(xiàn)路徑長(zhǎng)度為1時(shí)偏置最大然后逐漸減小但路徑長(zhǎng)度為0時(shí)偏置不是最大的。路徑長(zhǎng)度為0就是詞自己自己對(duì)自己的注意力本來(lái)就應(yīng)該大不需要額外偏置。這個(gè)發(fā)現(xiàn)符合直覺(jué)。另一個(gè)有趣的發(fā)現(xiàn)是句法偏置在低資源場(chǎng)景下幫助更大。論文里做了低資源機(jī)器翻譯的實(shí)驗(yàn)訓(xùn)練數(shù)據(jù)少的時(shí)候句法偏置帶來(lái)的改善更明顯。這很好理解數(shù)據(jù)多的時(shí)候模型自己能從數(shù)據(jù)里學(xué)到句法數(shù)據(jù)少的時(shí)候顯式的句法先驗(yàn)更有價(jià)值。這個(gè)結(jié)論對(duì)實(shí)際應(yīng)用很有指導(dǎo)意義如果你的任務(wù)標(biāo)注數(shù)據(jù)少值得試試句法偏置。5.2 可以嘗試的擴(kuò)展方向第一個(gè)擴(kuò)展方向是語(yǔ)義依存而不是句法依存。句法依存關(guān)注的是主謂賓定狀補(bǔ)這些語(yǔ)法關(guān)系語(yǔ)義依存關(guān)注的是施事受事時(shí)間地點(diǎn)這些語(yǔ)義角色。對(duì)于很多下游任務(wù)語(yǔ)義信息比句法信息更有用??梢园岩来娣治銎鲹Q成語(yǔ)義角色標(biāo)注器距離矩陣基于語(yǔ)義依存樹計(jì)算。這個(gè)方向論文里沒(méi)有做但邏輯上是通的。第二個(gè)擴(kuò)展方向是多語(yǔ)言場(chǎng)景。不同語(yǔ)言的句法差異很大比如中文沒(méi)有形態(tài)變化英文有豐富的形態(tài)。句法偏置在多語(yǔ)言模型里可能幫助更大因?yàn)槟P托枰幚聿煌Z(yǔ)言的句法??梢栽囋囋?multilingual BERT 上加句法偏置看看跨語(yǔ)言遷移效果有沒(méi)有提升。第三個(gè)擴(kuò)展方向是結(jié)合其他結(jié)構(gòu)信息。除了句法樹還有篇章結(jié)構(gòu)、共指鏈、實(shí)體關(guān)系圖等。這些結(jié)構(gòu)信息都可以轉(zhuǎn)化成距離矩陣或者鄰接矩陣用類似的方式注入Transformer。關(guān)鍵是要設(shè)計(jì)好距離的定義和偏置的映射方式。第四個(gè)擴(kuò)展方向是動(dòng)態(tài)句法。論文里的句法樹是靜態(tài)的每個(gè)句子分析一次。但有些任務(wù)里句法結(jié)構(gòu)可能隨上下文變化比如歧義句在不同語(yǔ)境下有不同的句法樹??梢栽囋囉枚鄠€(gè)分析器生成多個(gè)句法樹然后對(duì)偏置做集成。這個(gè)方向比較前沿實(shí)現(xiàn)復(fù)雜度也高。5.3 工程落地的經(jīng)驗(yàn)總結(jié)在實(shí)際工程里落地這個(gè)方案有幾個(gè)經(jīng)驗(yàn)值得分享。第一句法分析器的延遲是瓶頸。依存分析器的速度通常比Transformer編碼器慢如果推理延遲要求高分析器可能成為瓶頸。解決辦法是用快速分析器或者把分析器部署成獨(dú)立服務(wù)和主模型并行調(diào)用。第二句法偏置的參數(shù)很少對(duì)模型大小影響可以忽略。偏置嵌入層只有幾十個(gè)參數(shù)相比Transformer的幾百萬(wàn)參數(shù)微不足道。所以不用擔(dān)心增加模型大小。第三句法偏置和其他正則化方法可以疊加。比如dropout、權(quán)重衰減、標(biāo)簽平滑這些和句法偏置不沖突。我試過(guò)同時(shí)用dropout和句法偏置效果比單獨(dú)用好。第四句法偏置的可解釋性是一個(gè)加分項(xiàng)。學(xué)到的偏置值可以可視化幫助理解模型在多大程度上依賴句法。如果偏置值都很小說(shuō)明模型不太需要句法信息如果偏置值很大說(shuō)明句法信息很關(guān)鍵。這個(gè)可解釋性在調(diào)試和匯報(bào)時(shí)很有用。我個(gè)人在實(shí)際操作中的體會(huì)是句法偏置不是萬(wàn)能藥它適合那些句法結(jié)構(gòu)對(duì)任務(wù)有明確幫助的場(chǎng)景比如機(jī)器翻譯、句法分析、語(yǔ)義角色標(biāo)注。對(duì)于情感分類、主題分類這些任務(wù)句法偏置的幫助有限。另外句法分析器的質(zhì)量是天花板分析器不行后面怎么調(diào)都白搭。所以如果你打算用這個(gè)方案先把分析器選好、調(diào)好再考慮偏置的設(shè)計(jì)。最后分享一個(gè)小技巧如果訓(xùn)練數(shù)據(jù)足夠多可以先在大量無(wú)標(biāo)注數(shù)據(jù)上預(yù)訓(xùn)練一個(gè)句法距離預(yù)測(cè)器然后用它來(lái)生成距離矩陣這樣推理時(shí)就不依賴外部分析器了整個(gè)流程更可控。