另一個有趣的觀察 在你的文本語料庫上執行 SGD 以最小化交叉熵損失 等同於 REINFORCE,即,基於策略的策略梯度,使用二元獎勵 "我的模型是否從語料庫生成文本"
Dimitris Papailiopoulos
Dimitris Papailiopoulos8月12日 00:20
為什麼交叉熵對於語言預訓練是一個好的損失函數? 注意:這一切都是已知的;有趣的是,儘管對於「為什麼使用交叉熵」有許多觀點和直覺,但它們都可以從一個單一的起點得出。 這裡有一個簡單的第一原則推導,並不假設任何關於數據分佈的東西。它來自一個非常合理的操作需求:) 「我希望我的模型聽起來很智能」 但我們無法測量這一點,所以我們問: 「我希望我的模型聽起來像人類」 雖然我們可以訪問所有曾經寫過的文本,但我們也無法準確測量這一點,因此我們改為問: 「我希望我的模型生成的文本與所有曾經寫過的文本的可能性最大」 或者更直白地說: 「我希望我的模型記住訓練數據。」 考慮這個思想實驗: 給定一個數據集 S,包含人類所寫的所有文本,我們對 S 中的每個「文本」進行獨立試驗: 從我們的模型中抽樣:「樣本文本」 Pr( ;W) 檢查:「樣本文本」是否與原始文本完全匹配?注意:我們不對任何東西進行條件化!我們只是問,在模型可以生成的所有內容中,我們是否得到了「文本」。 將成功定義為事件: E = 「所有每個樣本檢查成功」 E 的概率是,你的模型 W 對正確真實值分配的概率的乘積: Pr(E) = Π_{text in S} Pr(text; W) 最大化 log Pr(E) 對 W 進行優化會給你交叉熵目標。 你如何用 SGD 來優化這個? 從語料庫中抽樣文本 計算每個文本前綴的 grad log Pr(token|prefix) 更新模型 優雅的是,這同時實現了: 1) 最小化模型 P( ;W) 下數據的描述長度(壓縮視角) 2) 最小化與真實分佈的 KL 散度——如果存在的話(雖然我們從未假設過一個) 3) 實現最大似然估計 這個推導是直接且眾所周知的,但它突顯了一個重要的事情:交叉熵自然地從想要精確重現訓練數據中產生。 P.S. 你本可以選擇最大化: Pr(模型生成的文本在真實值中) 有趣的是,優化這個可能導致模式崩潰,因為最佳解是始終預測語料庫中的單一文本。然而,梯度再次看起來像交叉熵,但有一個乘法因子。 即,Pr(text;W) grad log Pr(text;W)
63.47K