把語音視為序列轉換
腦訊號轉文字是一個序列轉換問題:T 個神經時間框的串流,必須化為 N 個符號的序列,其中 N \neq T,而且沒有逐框標籤告訴你哪一瞬間產生了哪個字元。兩大模型家族主導此局。以連結時序分類為基礎的免對齊模型會對所有可能的對齊做邊際化;而以注意力為基礎的序列對序列模型則邊解碼邊學習對齊。里程碑式的想像手寫 BCI正是以這種方式框定手寫轉文字,並達到接近自然手寫的輸入速度。
連結時序分類(CTC)
CTC 以一個巧妙手法處理缺失的對齊:加入一個空白符號,讓網路每一框輸出一個標籤(或空白),再定義一個收合函數 \mathcal{B},用以移除空白並合併重複(於是 `--h-e-l-llo-` 都會對應到 `hello`)。目標逐字稿 \ell 的機率,即為所有收合成它的逐框路徑之總和:
p(\ell \mid X) \;=\; \sum_{\pi \,\in\, \mathcal{B}^{-1}(\ell)} \; \prod_{t=1}^{T} y^{\,t}_{\pi_t}CTC 目標函數把所有與逐字稿相容的對齊之機率相加;一個前向–後向遞迴可有效率地計算它,其梯度則端到端地訓練網路。
CTC 為候選逐字稿評分的方式,是把「網路的逐框輸出能對齊產生它」的所有方式之機率全部加起來。一趟前向–後向計算使這個總和變得便宜,其梯度端到端地訓練整個網路——完全不需人工對齊時間。
- p(\ell \mid X)
- 給定神經輸入 X 時,逐字稿 \ell 的機率。
- \pi \in \mathcal{B}^{-1}(\ell)
- 一種對齊;此集合是所有會產生 \ell 的對齊。
- y^{\,t}_{\pi_t}
- 網路在第 t 框對符號 \pi_t 的機率。
- \prod_{t=1}^{T}
- 跨各框連乘,以為一個對齊評分。
「hi」可以被輸出成「h-h-i」「h-i-i」「_-h-i」等等;CTC 把它們全部加總。
CTC 很適合 BCI:它是單調的(時間只往前走)、不需要把神經串流明確切分成字元,且能以串流、低延遲的方式運行——這些都是即時拼字器所需的特性。
循環與 Transformer 解碼器
輸出這些逐框分布的網路,歷來是RNN 解碼器(作用於分箱放電率或高伽瑪特徵的 GRU 或 LSTM),近來則越來越多採用Transformer。然而架構的重要性,比不上其背後那個殘酷的限制。
迴圈中的語言模型
解碼器提議,語言模型定奪。形式上,解碼是在給定神經資料下,搜尋最可能的文字,這可分解成一個神經項與一個語言先驗:
\hat{w} \;=\; \arg\max_{w} \;\Bigl[\, \log p_{\text{dec}}(w \mid X) \;+\; \alpha\, \log p_{\text{lm}}(w) \;+\; \beta\, \lvert w \rvert \,\Bigr]集束搜尋最大化神經對數機率,加上加權的語言模型分數,並以插入獎勵 \beta 抵銷 CTC 偏向空白的傾向。權重 \alpha, \beta 於保留資料上調校。
最好的句子不只是神經解碼器喜歡的——它還得像真正的語言。集束搜尋挑出「解碼器分數加上加權語言模型分數」最大的逐字稿,並對每個插入的詞給一點獎勵,以抵銷 CTC 偏好輸出過多空白的習慣。
- \hat{w}
- 被選中的詞序列。
- \log p_{\text{dec}}(w \mid X)
- 解碼器對這些詞的對數機率。
- \alpha\, \log p_{\text{lm}}(w)
- 語言模型分數,以 \alpha 加權。
- \beta\, \lvert w \rvert
- 每個詞的插入獎勵,以 \beta 加權。
解碼器在「wreck a nice beach」與「recognise speech」之間拿不定;語言模型把它推向後者。
# CTC beam search rescored by a language model (schematic)
beams = [('', 0.0)] # (text, score)
for t in range(T):
probs = decoder_logits[t] # distribution over chars + blank
cand = []
for text, score in beams:
for c, p in top_k(probs, k):
merged = collapse_ctc(text, c)
s = score + log(p) + alpha * lm_logprob(merged) + beta * len(merged)
cand.append((merged, s))
beams = prune(cand, width)
best_text, _ = max(beams, key=lambda b: b[1])實務上,語言模型貢獻了最終準確度的很大一部分,詞彙量越大越是如此。但這是一把雙面刃:強先驗可能產生流暢、合乎文法、卻非使用者本意的文字——這是實實在在的失效模式,也是關於作者身分的警訊,第五篇會再回到此點。
評量指標與詞彙量
效能如何量測?以詞錯誤率或字元錯誤率,也就是解碼文字與參考文字之間、以參考長度正規化的編輯距離:
\text{WER} \;=\; \frac{S + D + I}{N}詞錯誤率把替換、刪除與插入的次數除以參考詞數;字元錯誤率則以字元計。注意當插入過多時,WER 可能超過 100%。
詞錯誤率把「你為了修正逐字稿而必須替換、刪除或插入的詞」加起來,除以參考文本有多少詞。它是標準的計分表;因為插入也算,所以它甚至可能超過 100%。
- S,\ D,\ I
- 所需的替換、刪除與插入次數。
- N
- 參考逐字稿中的詞數。
- \frac{S + D + I}{N}
- 每個參考詞平均所需的編輯數。
參考「the cat sat」被解碼成「the hat sat」是三個詞裡一次替換,所以 \text{WER} \approx 0.33——這就是詞錯誤率。