Skip to content

CS224U 組合性泛化:COGS、ReCOGS 與作業三

2026年9月29日1 分鐘
TL;DRCOGS 有幾個泛化切分幾乎每個模型都是 0 分。CS224U 用自家的 ReCOGS 研究拆解原因:遞迴切分的 0 分主要是長度泛化問題,介系詞片語切分的 0 分來自訓練資料只讓它出現在特定變數與位置。作業三 hw_recogs.ipynb 用 13.5 萬筆 ReCOGS 訓練資料,先要你找出 Charlie 與 Lina 這兩個訓練與測試角色完全相反的名字,再看一個訓練好的模型怎麼栽在它們身上。

🌏 English version

版本說明:本文依據 CS224U 2023 春季版(課程網站最後一次完整公開的校內版)。主要材料是 Advanced behavioral evaluation 投影片的 Compositionality 與 (Re)COGS 兩節、作業三 overview 投影片、hw_recogs.ipynb,以及 XCS224U 播放清單第 24、27、28 支錄影。repo 現行 notebook 的版本字串是 Spring 2024,本文會標出它和 2023 版的差異。事實皆於 2026-09-29 打開官方材料核對。存取等級 A3:題目、資料、訓練好的模型、單元測試與錄影都公開;拿不到的是 Gradescope 自動評分與 bake-off 排行榜。

系列位置:上一篇 行為評估|下一篇 解釋方法 I:probing 與 feature attribution|系列總覽

上一篇的結尾留了一個問題:什麼算公平的非 IID 泛化測試?這一篇用一個具體的 benchmark 回答它。

系列總覽已經貼過那張 COGS 成績表,重點是 structural 幾欄幾乎全是 0,本文不再重貼數字。這裡要講的是:那些 0 是怎麼來的、ReCOGS 怎麼拆解它們,以及作業三要你做什麼。

組合性是什麼,為什麼要測它

第 27 支錄影從組合性原則的非正式定義開始:

The meaning of a phrase is a function of the meanings of its immediate syntactic constituents and the way they are combined.

以「every student admired the idea」為例,整句的意義由主語 NP 與述語 VP 決定,NP 又由限定詞與名詞決定,一路遞迴到詞彙。學會詞彙和組合方式,就能理解從沒見過的新組合。

投影片列的動機有四個:替每個有意義的單位建模、「無限」的能力、創造力、系統性。Potts 在錄影裡對「無限」打了折扣:人都是有限的,他認為真正的直覺比較接近創造力,我們今天說的大部分句子,在人類歷史上都沒出現過。

系統性來自 Fodor & Pylyshyn 1988:理解「Sandy loves the puppy」的能力,本質上連著理解「The puppy loves Sandy」的能力。Potts 認為系統性比組合性更一般,也是很多挑戰測試背後的直覺。

投影片放了一個他自己的情感模型當反例:

句子標準答案模型預測
The bakery sells a mean apple pie.pospos
They sell a mean apple pie.pospos
She sells a mean apple pie.posneg
He sells a mean apple pie.posneg

這裡的 mean 是「很厲害」的意思。讓他擔心的不是錯了兩題,而是主詞從複數換成單數代名詞,照理不該影響 mean 的解讀,預測卻翻了。這就是缺乏系統性。

錄影最後回顧歷史:SHRDLU、Chat-80 這類早期系統是實作出來的符號文法,組合性是設計保證;Percy Liang 的語意剖析學的是組合文法規則的權重;Socher 的遞迴樹狀網路雖然不是符號系統,也照著句法樹一層層組合向量。到了今天的 Transformer,一切都互相連接,沒有任何組合性保證。問題於是變成:能不能設計行為測試,判斷這些模型是否自己找到了系統性的解法?

COGS:任務與邏輯形式的四個慣例

COGS(Kim & Linzen 2020) 的輸入是合成的英文句子,輸出是事件語意式的邏輯形式(LF)。投影片的例子:

Input:  A rose was helped by a dog .
Output: rose ( x _ 1 ) AND help . theme ( x _ 3 , x _ 1 )
        AND help . agent ( x _ 3 , x _ 6 ) AND dog ( x _ 6 )

第 28 支錄影說,COGS LF 有幾個特性,正好能解釋文獻裡的成績模式。投影片列了四條:

  1. 動詞指定基本事件,事件有必要或可選的角色(agent、theme 等)。
  2. 變數編號由詞在輸入句中的線性位置決定。 x _ 3 之所以是 3,是因為 helped 在句子第 3 個位置。
  3. 所有變數都被約束;看起來自由的變數,視為在最寬的範圍被存在量詞約束。
  4. 定冠詞描述用 * 標記。

第 2 條是關鍵。錄影說,這個特性會嚴重影響現代模型的表現,特別是帶位置編碼的模型。

COGS 的切分是:訓練 24,000 筆加 155 個 primitives、dev 10,000、test 10,000,以及 21,000 筆泛化例子,分成 21 類。dev 與 test 都是 IID;真正有意思的是泛化切分。錄影舉了幾類:名詞從主語換到其他位置、原本只以單詞出現的 primitive 放進完整句子、修飾語從受詞位置換到主語位置、更深的遞迴、主被動轉換等。

ReCOGS 怎麼拆解那些 0

ReCOGS(Wu, Manning & Potts 2023)的摘要把立場講得很直接:

COGS poses generalization splits that appear impossible for present-day models, which could be taken as an indictment of those models. However, we show that the negative results trace to incidental features of COGS LFs.

投影片把拆解分成三步。

第一步,移除冗餘符號。 每個變數都以 x _ 開頭,真正有區別的只有後面的數字。把 kitten ( x _ 1 ) 改成 kitten ( 1 ),語意完全不變。錄影用 bigram 頻率解釋為什麼這有差:在 COGS 裡,最常見的 bigram 壓倒性地是「, x」;移除之後,最常見的專有名詞 Emma 跟變數的頻率變得差不多,分布平均很多。語言模型高度依賴局部條件機率,這對它們比較友善。但這一步主要幫到詞彙泛化,對那幾個頑固的結構切分幫助不大。

第二步,CP 與 PP 遞迴的 0 分,其實是長度問題。 泛化切分裡的句子與 LF 都比訓練資料長得多,有很長的尾巴。模型在測試時會碰到訓練時沒見過的位置,也會碰到沒見過的變數名:訓練最長只到變數 45,測試出現 46,那個 token 的向量從來沒被訓練過。Potts 說要求模型做長度泛化完全合理,但這裡的目標是測遞迴,現在兩件事纏在一起。ReCOGS 的做法是把既有例子串接起來、依 COGS 規則重新編號,讓訓練資料涵蓋測試時會出現的變數名。結果 LSTM 與 Transformer 都幾乎完全克服這個切分。錄影的結論是:這個切分難的不是遞迴,是長度泛化。

第三步,PP 修飾語的 0 分,是訓練分布教錯了東西。 投影片寫的假設是:

The train data teach the model that PPs occur only with a specific set of variables and positions. When models learn this lesson, they struggle with examples that contradict it.

為了驗證,他們用保留語意的方式讓介系詞片語出現在更多位置:把受詞前置(The box in the tent Emma was lent)、隨機插入「um」這類停頓詞、改用分詞修飾(A leaf painting the spaceship froze)。LSTM 與 Transformer 的表現都大幅上升。

最後,ReCOGS 做了三項改寫:冗餘符號移除、保留語意的資料擴增、任意變數命名(變數不再綁定輸入位置,而是以語意一致的方式隨機指派)。同一句「The sailor saw Emma」在兩種格式下長這樣:

ReCOGS: * sailor ( 48 ) ; Emma ( 53 ) ; see ( 10 ) AND
        agent ( 10 , 48 ) AND theme ( 10 , 53 )
COGS:   * sailor ( x _ 1 ) ; see . agent ( x _ 2 , x _ 1 ) AND
        see . theme ( x _ 2 , Emma )

錄影強調,ReCOGS 不一定比較簡單,某些面向在他們的實驗裡反而更難。它做到的是讓詞彙與結構兩類泛化的表現變得平均,讓原本毫無進展的結構切分可以被推動。投影片的措辭是 ReCOGS remains challenging。

還沒解決的四個概念問題

投影片 (Re)COGS 一節的最後一頁列了四個問題:

  1. 如果我們預測的是邏輯形式,要怎麼測「意義」?錄影說 LF 本身也只是另一種句法表達,總帶著任意性。
  2. 在這個脈絡下,什麼是公平的泛化測試?模型看到的世界有某些限制,有些限制我們希望它不要學,有些又希望它學;光是判斷每個現象屬於哪一類就很難。
  3. 人類組合性的極限在哪裡,該怎麼影響泛化測試的設計?
  4. 如果我們的目標超出資料集能支持的範圍,該怎麼把它寫進任務與模型?

這四題直接接到上一篇講的「不公平題目」。

作業三:hw_recogs.ipynb

2023 年講次表把作業三 overview 排在 4 月 26 日,跟行為評估那堂同一天;作業、bake-off 與 Quiz 3 在 5 月 8 日下午 3 點(Pacific)截止。

資料是 ReCOGS,overview 投影片列的切分:

  • 訓練:135,546 組輸入輸出
  • dev:3,000 組,跟訓練同分布
  • gen:21,000 筆,21 類,都是熟悉元素的新組合

gen 的類別名稱有規律:X_to_Y 或 only_seen_as_X_as_Y,意思是某些片語在訓練時只以 X 出現,測試時以 Y 出現。

整份作業只有一條規則,notebook 開頭與原創系統題各寫一次:

You cannot train your system on any examples from dataset["gen"], nor can the output representations from those examples be included in any prompts used for in-context learning.

題目與配分

題目內容配分
Q1 Task 1get_propername_role:從 LF 抽出(名字, 角色)配對1
Q1 Task 2find_name_roles:統計每個名字在某切分裡扮演哪些角色1
Q2category_assess:用訓練好的模型評估某一類泛化切分2
Q3用 DSPy 做 in-context learning(Task 1 基本模組、Task 2 LabeledFewShot)2
Q4原創系統3
Q5bake-off 參賽1

Q1 是純資料分析,不訓練模型。 overview 投影片直接給了劇透:Charlie 在訓練集只當 theme,在泛化集只當 agent;Lina 在訓練集只當 agent,在泛化集只當 theme。

Q2 之前有一段很長的建模插曲。 notebook 把訓練 ReCOGS 模型需要的六個元件都給你:Hugging Face tokenizer、PyTorch Dataset、EncoderDecoderModel.from_pretrained("ReCOGS/ReCOGS-model")、RecogsLoss、RecogsModule、RecogsModel。不打算自己訓練的話,只要把最後一個當介面用。Potts 在第 24 支錄影說,tokenizer 原本要出成作業題,但他自己寫得太痛苦,決定直接給。

Q2 用這個訓練好的模型延續 Q1 的分析,你會親眼看到:一個很好的模型,錯得最多的正是那些出現在陌生位置的名字。

Q2 用的評分函式 recogs_exact_match 有三條規則,notebook 各給一個例子:

  • 約束變數的名字不重要:dog ( 4 ) AND happy ( 4 ) 等於 dog ( 7 ) AND happy ( 7 )
  • 合取項的順序不重要:dog ( 4 ) AND happy ( 4 ) 等於 happy ( 7 ) AND dog ( 7 )
  • 變數的一致性重要:dog ( 4 ) AND happy ( 4 ) 不等於 dog ( 4 ) AND happy ( 7 )

Q3 換成 in-context learning。 錄影預告了一個現象:大型語言模型預測的 LF 乍看都像樣,但一跑評分,可能一題都沒對。這個任務要求完全正確,「看起來差不多」不算。

Q4 原創系統,overview 投影片列的方向有:DSPy 程式、繼續訓練課程的模型、拿預訓練模型來微調、從頭訓練、甚至符號求解器。notebook 附了 T5 的起始程式;錄影說直接拿 T5 來預測,它會把句子翻成德文,得先在 ReCOGS 上微調。

Q5 bake-off:在 cs224u-recogs-test-unlabeled.tsv 加一欄 prediction,存成 cs224u-recogs-bakeoff-entry.tsv 上傳。

2023 版與 repo 現行版的差異

題目結構與配分兩版相同,差在 Q3 的工具。2023 年 6 月的 notebook 快照用的是 DSP:寫一個 @dsp.transformation 函式 recogs_dsp,自己抽樣示範例、套模板。2024-01-28 一筆「Updating to switch from DSP to DSPy」的 commit 之後,Q3 改成寫一個 dspy.Module 加 LabeledFewShot。

需要什麼資源

  • 資料:recogs.tgz,2026-09-29 HTTP 200,7,075,025 bytes。
  • 模型:ReCOGS/ReCOGS-model 在 Hugging Face 上公開、未設存取限制,最後修改於 2023-04-18。
  • 運算:Q1 只要 pandas 與正規表示式。Q2 跑一類泛化切分的預測,notebook 註解說在較新的 Apple 筆電上約 3 分鐘,Colab 視機器而定。
  • API:只有 Q3 需要。現行版預設 dspy.OpenAI(model='gpt-3.5-turbo', ...),跟作業二一樣要 OpenAI key,也一樣受 dspy-ai==2.4.13 釘版影響(DSPy 3.x 已經沒有 dspy.OpenAI,細節見作業二那篇)。

自學怎麼做

  1. 先看第 27、28 支錄影,再做作業。Q1 與 Q2 的「發現」其實就是 ReCOGS 論文的論點縮小版,先懂論點,作業才不會只是寫正規表示式。
  2. Q1 做完,把 Charlie 與 Lina 的角色分布印出來,自己判斷:這算公平的泛化測試嗎?對照上一節第 2 個概念問題。
  3. 原創系統如果選 DSPy 路線,先用 10 題 dev 樣本加 recogs_exact_match 驗證輸出格式,確定不是 0 分再往下。

今晚可以做的一件事:下載 7 MB 的 recogs.tgz,用 pandas 讀進 train.tsv 與 gen.tsv,數一數 Charlie 在兩個檔案裡各出現在哪些角色。這一步不需要 GPU,也不需要 API key,卻能讓你在寫任何模型之前,先看到這個 benchmark 真正在測的東西。

延伸閱讀

參考資料