重言 Re-Sinitic:找到聲符,還是丟了形聲 - 研究日誌(二)

第一集結尾留了一個猜測:形聲沒有湧現,可能是因為詞表只有 226 個詞,太小,可分解性沒有收益。下一步該把詞表放大一個數量級。

沒有放大詞表。因為找到一個零標註就能測同一個猜測的方法,而那個方法測出來的答案,把整個「為什麼沒有湧現」的故事往前推了一步——不是詞表太小,是訓練任務本身在騙自己。這篇是第二集,記兩件事:一個新的正向結果(聲符原則湧現了),和一次自我推翻(S2 的門檻不重現)。順便交代一個埋了兩週、讓長度懲罰完全沒作用的常數 bug。

這篇是日誌,記的是當時的推論過程。想看目前最新的整體結論,見現況總覽

第一集的猜測沒有被放大詞表證實——因為根本不用放大

放大詞表要花的是標註成本,而那正是最貴的資源。有一個更便宜的做法:不放大詞表,改問「系統看到沒學過的字,能不能靠拆解猜出它的音」。

做法是凍結 Writer、重新初始化 Reader、只在 70% 的字上訓練它,再問剩下的 30%。這等於用同一份 226 詞的詞表,白嫖到「詞表放大十倍」真正想買的東西——泛化

先前所有形聲指標(共部件率、純度、雙重分離)量的都是已見過的字之間的關係。一個把語音資訊塗滿整個字形的系統,和一個真的有聲符的系統,在那些指標上可以長得一模一樣——差別只在沒學過的字上會不會表現出來,而那必須拿沒學過的字來測。

正向結果:聲符原則存在,而且隨同音壓力單調增強

同音率 0.021 0.069 0.150 0.178 0.295 0.437
主力 5.9% 15.7% 12.7% 15.4% 16.2% 25.2%
基線 3.4% 3.7% 2.0% 3.9% 2.7% 2.5%

劑量點 r = +0.903,逐 run 迴歸(n=36,含種子固定效果)β = +0.366、t = +6.41、R² = 0.564。chance 是 1/68 ≈ 1.5%,最高劑量的 25.2% 是 chance 的 17 倍。

三件事讓這個結果乾淨:

  • 基線全程貼著 chance(2.0–3.9%),完全沒有隨劑量漂移——效應來自語音路,不是字形整體品質變好
  • 語意方向是反的且顯著(β = −0.109,t = −2.97):同音率越高,沒學過的字反而越難從字形猜出意思,排除了「高劑量字形只是比較好認」這個解釋
  • 評估在 unseen 內部做 68 選 1,候選也只從 seen 抽——認得出「這不是我學過的字」拿不到分數

系統演化出的東西是一套系統性的、可泛化到新字的語音編碼——看到「江」的「工」就能猜出讀音,即使沒學過「江」這個字。這就是聲符的核心功能。

但那不是形聲

形聲的定義性特徵不是「字形帶語音資訊」,是字形可分解為兩個功能不同的部分。這裡的語音資訊仍然瀰漫全字形(雙重分離全程為負),而且語意方向的零樣本能力隨劑量下降——系統不是把兩種資訊分開放,是整體從語意編碼滑向語音編碼。

可泛化的語音編碼會湧現,而且隨同音壓力單調增強。但它是取代語意編碼,不是與它分工。

撤回:S2 的「同音率 0.2 門檻」在訓練任務改對之後不重現

第一集報告過一個門檻:同音率低於 0.2 平均效果量 −0.028(t = −1.00),高於 0.2 是 +0.494(t = +5.84),而且門檻模型(R² = 0.775)勝過線性模型(0.730)。

那整批資料是在訓練 16 選 1、評估全詞表 226 選 1 的設定下跑的,Reader 的語意準確率只有 27%。把訓練候選數改成 64(準確率升到 65%)之後重跑四個劑量點:

同音率 語意準確 主力 d 基線 d
0.031 75.2% 0.172 0.082 +0.091
0.177 61.1% 0.765 −0.048 +0.813
0.257 65.5% 0.258 0.036 +0.221
0.496 71.2% 0.025 0.156 −0.131

沒有門檻,沒有單調趨勢,高劑量端還反轉了。16 選 1 下同音率 0.177 落在門檻以下(差 ≈ +0.010),64 選 1 下是 +0.813;16 選 1 下 0.496 落在門檻以上(差 ≈ +0.59),64 選 1 下是 −0.131。兩端都反了。

16 選 1 只要求字形和它的 15 個鄰居不同——那是局部約束。系統性是全域性質,收益只在「必須和所有 225 個都不同」時才出現。一個只需要贏過 15 個對手的字形,把資訊塗滿六筆完全夠用。先前所有 S2 數字都是在一個被低估三倍的任務上量出來的。

⚠ 這批 64 選 1 的資料只有 1 個種子,cap5 的 +0.813 比兩側鄰居高一個數量級,很可能是離群值——所以這不是「門檻不存在」的證明,是「門檻不重現」,兩者的後續動作不同:前者可以下結論,後者只能說原結論失去支持。唯一在兩種設定下都單調的量是雙重分離對同音率的迴歸(16 選 1:+0.002 → −0.038;64 選 1:+0.000 → −0.155 → −0.173 → −0.243,r = −0.94):

同音壓力不只不產生分工,它主動破壞分工,而且訓練任務越接近評估任務,破壞得越徹底。

§14 的零樣本結果不受這次撤回影響——它本來就沒有門檻,是從同音率 0.069 就開始的連續上升,而且它重訓 Reader,跟訓練候選數無關。門檻撤回之後,這個專案的正向結果只剩零樣本這一條,但它比撤回的那條硬得多。

新假設:模組化是「習得性」問題,不是「資訊論」問題

第一集把「沒有湧現」歸因於詞表太小。這集的兩個結果指向一個更精確的版本:226 不是因為這個數字太小,是因為每個字都在訓練集裡。

分散式編碼(語音資訊瀰漫全字形)對神經 Reader 沒有任何劣勢——它看過全部 226 個字形,每個上萬次。對一個已經記住全表的讀者,「形符在左、聲符在右」和「兩者揉在六筆裡」解碼難度一樣,後者甚至更容易,因為參數自由度更高。

人類需要模組化,是因為:會遇到沒學過的字,必須靠拆解猜;每個字的曝光量有限;書寫是從有限的運動基元組合出來的。三個階段的實驗一個都沒有製造這三種壓力。放大到 2260 個詞、但每個字仍然全部參與訓練,可分解性的收益依然是零——只是花十倍標註成本買到同一個結論。

順便:S1 那張最難辯護的圖被修好了

第一集沒提這件事,但它一直是這個專案對外最尷尬的一張截圖:工具輸出「火車 = ŋo.ŋo.ŋo.ŋo.ŋo.ŋo」,同一個音節重複六次。那不是語言,是把一個音拉長。

repetition_rate 這個指標對它完全瞎——CV 音節模板下相鄰音素永遠是「子音、母音」交替,兩者永遠不相等,所以這個指標恆為 0。加了音節層級的哨兵之後,測了三個假設,前兩個錯:

  • 假設一:用不完的槽位最省事的填法就是重複。 掃 λ_len 發現長度砍掉 37% 時重複只動 1.6 個百分點,成功率反而崩掉 30 個百分點——長度和重複是兩個獨立的問題。
  • 假設二:加 OCP(相鄰音節相似度)懲罰能壓掉重複。 懲罰確實被最小化了(0.587 → 0.480,隨機基準是 0.11),但重複沒有趨勢,成功率掉了 12 個百分點。付了代價,沒買到東西。
  • 假設三:重複是抗噪冗餘,雜訊越小重複該越少。 掃描結果是關掉雜訊時重複反而最高(40.0%)——假設也錯了,但掃描本身找到一個沒人掃過的東西:噪音強度有最適值,而專案早期選定的 τ_end = 0.2 從來沒被掃過。τ=0.10 在成功率(85.4%)、重複率(27.9%)、相異音節數、同音率(0.004)四個維度上同時最好:
τ=0.20(舊預設)  火車  ŋo.ŋo.ŋo.ŋo.ŋo.ŋo
τ=0.10(新預設)  火車  pi.pu.ʃy.tø.ʃo.ŋo

從「把一個音拉長」變成「一串不同的音節」。27.9% 仍然高於隨機期望(約 7%),還沒完全解決,下一個要查的是架構層面的問題——留給下一集。

途中還抓到一個更嚴重的 bug:長度懲罰的遮罩函式在 EOS 位置本身也算進 cumprod,導致遮蔽後的訊息裡一個 EOS 都不剩,expected_length 恆等於上限。這代表齊夫簡短律(M2)的所有先前結果,都是在一個從頭到尾沒受過長度壓力的系統上量出來的——修好之後同一組參數的成功率從 61.5% 跳到 81.4%,那個 bug 不只沒作用,是主動有害:常數項的梯度仍然在流,把系統往一個結構上不可能達成的方向推。方法學上的結論(設限依變數要用 Tobit)仍然成立,數值要重測。

這一集動了 pre-registration

三個變更都不是「結果不如預期所以調參數」,是「當初據以選定的量測本身是錯的」,所以走了修訂而不是直接改凍結檔:

項目 凍結值 修訂後 理由
τ_end 0.2 0.10 從沒掃過;掃了之後 0.10 四維度同時最好
S2 高劑量組邊界 同音率 ≥ 0.25 撤回,不設固定邊界 依據的門檻(§13)不重現
λ_len = 0.005 的經驗基礎 重建 選定時系統沒有長度壓力;修好 bug 後重掃,0.005 仍是最佳值,但現在有數據支持

heldout 102 詞在這次修訂前後都沒有被動用過。

這些結論現在有多硬

狀態
探索 / 確認 全部仍是探索階段(train 226 詞)。heldout 從未載入
正向結果 聲符原則(零樣本泛化):n=36,t = +6.41,基線不隨劑量漂移
已撤回 S2 同音率 0.2 門檻(16 選 1 下的假象);S1 τ_end=0.2(次佳值,未掃描選定)
已修正但方法論不變 M2 齊夫斜率(λ_len bug 修好前後,該用 Tobit 這件事沒變,數值要重測)
訓練/評估任務不一致 確認階段起,訓練候選數必須等於評估候選數,已寫進修訂

下一步

零樣本探針取代了「放大詞表」——同一個問題,零標註成本測到了答案。下一個要驗的是「模組化是習得性問題」這個新假設本身:如果它對,讓系統付出習得成本(例如限制每個字形的曝光量,或是引入世代更替),應該會讓雙重分離開始轉正。這是可以在同一份 226 詞詞表上做的下一個介入,不需要更大的詞表,也不需要碰 heldout。

S1 的音節重複還剩 27.9%,「架構層面 Speaker 每個位置的輸入夠不夠分化」這個老問題還沒查完。S3 的 confirmatory run 也還沒開始。等其中一個有結果,會有第三集。