語言模型的物理學 Physics of Language Models - ICML 2024 Tutorial

圖片
這是一個ICML 2024的tutorial talk,同時也是 一系列的研究 ,talk的youtube link在 這裡 本篇主要把看這個talk的一些讀書筆記記錄下來,雖然實際上talks是從 3 -> 2 -> 1 這個順序去講的,但這裡仍然以投影片的順序來描述,並把講者最後的感概放在Part 1的最後。 Intro 把智慧分為1.結構、2.知識以及3.推論 在可控制、理想的環境下做研究 (控制資料、調整參數) 可重複性高的實驗 (使用100M大小的模型,推出通用法則) 使用 probing 技巧去看模型裡面如何運作 1. Language Structures 這個部分有兩個目標:  1. 大型語言模型的解讀 (interpretation of LLMs)  並不是基於token level,而是使用更困難的階層式演算法來更精確地解釋LLM如何學習解決這樣的演算法 2.大型語言模型的結構 LLM如何學習格式(format)? → hallucination(幻覺) hallucination只是LLM學習到格式的速度比底層任務快而造成的現象 希望能觀察LLM如何解決更階層式、複雜的語言架構 他們使用的方法是CFG(context-free grammar)作為課題來達成以上兩個目標 他們設計了自己的CFG,大約有20+的長度,這是一個非常長的CFG CFG會從root開始 →  leaf 完成整個推論的樹,這樣長度的CFG會非常難從最終結果回推到他們的源頭,要完全記住這些samples也不可能,因為會有10的80次方個sample  他們從三個面向來測試模型是否能學習這樣的CFGs: accuracy, diversity, distribution 如果使用相對或旋轉嵌入的位置編碼,準確度會很高,但如果是用絕對的位置編碼就會得到很差的結果 為什麼會這樣呢? 因為使用相對/旋轉的位置編碼對於語言架構的注意力來說非常有幫助 相對注意力表現比旋轉好,但相對注意力太慢了 但如果用一個GPT_stupid也可以發現不錯的表現 (這個GPT的head h會往回看2^h-1個token) 例如第一個head會往前看第1個token,第二個head往前看前3個token,第三個head往前看前7個token,這些tok...

為什麼只能在訓練資料上平衡不平衡的資料集? Why should you deal with an imbalanced dataset only on training data?

最近有位同學向我詢問一些資料競賽相關的內容,剛好發現他在程式上犯了這個初心者可能會犯的常見錯誤,也就是將 SMOTE(Synthetic Minority Oversampling Technique) 這種針對不平衡資料集 (imbalanced Dataset) 產生資料來讓其平衡的相關演算法應用在整個資料集上,而非只用在訓練資料集上。

目前的數據分析相關競賽通常都是給參賽者一些不平衡的資料集或者是特徵非常多的資料集(通常多達上百個特徵,尤其是金融相關競賽),此時初學者也常常會查詢到像是 Imblearn 這種專門處理不平衡資料及的套件使用。但其實無論是上採樣或者下採樣又抑或是混合上下採樣的方法,它們其實都只能應用在訓練資料上,不能直接對整個資料集做平衡。錯誤的使用會造成模型作弊,並訓練出非常非常高的準確率,但實際上表現完全不好,就像過擬合(Overfitting)發生的時候那樣。

平衡資料集的方法


在面對上圖這種不平衡資料集時,基本上會有上採樣 (Oversampling) 和下採樣(Undersampling) 兩種方法可以使資料集平衡。上採樣指的是把資料少的類別複製幾份,直到兩類資料平衡。下採樣會將資料多的類別資料數減少或者是只從中選取少數資料出來代表這個類別。常見的方法有上採樣的 ADASYN、SMOTE、BorderlineSMOTE,還有結合上下採樣的 SMOTEENN,可參考imblearn API doc

總之無論是使用哪種方法,都可以預期會得到下圖這樣平衡的資料集。

為什麼不可以直接平衡整個資料集呢?

為了回答這個問題,得先知道為什麼資料分割的獨立性是必須優先在所有方法之上的。這裡借用 Google 的MLCC(Machine Learning Crash Course) 教材來講解。

當你拿到一份資料並想對其使用機器學習演算法來解決你的任務時,至少得將資料分割為訓練資料 (Training Set) 與測試資料 (Test Set),訓練資料是用來教你的模型從x推理到y,測試資料是用來測試這個訓練資料所訓練出來的模型在沒有見過的資料 (unseen data) 上表現如何,測試資料得必須與訓練資料完全沒有交集,否則就等於是數學老師直接在上課的時候告訴你期中考的題目和答案,也就是會造成作弊的情形發生。這不僅完全無助於模型的訓練,反而會誤導訓練模型的人。不能直接平衡整個資料集的主要原因就是打破了這個測試資料與訓練資料必須獨立的前提。接下來我們舉例說明回答這個問題。

為什麼要對訓練資料做平衡?

假設我們有500位病人需要利用模型來檢測它們是否有疾病,而實際上當中只有一位有疾病,此時我們的模型其實只要全猜病人都沒有疾病就可以得到99%的準確率,但可想而知的是這個模型其實完全沒有學習到任何東西。所以若要讓模型可以很好的學習就必須平衡訓練資料。

為什麼不能對測試資料做平衡?

假設我們直接將上述的500位病人平衡,獲得了499個有疾病的樣本和499個沒有疾病的樣本,但實際上那些有疾病的樣本都只是那1個樣本的複製品。若是我們再將這998個樣本分割為訓練資料與測試資料,那不就等同於訓練資料和測試資料擁有許多相同的樣本嗎?這也就是為什麼不能對整個資料集做平衡,而是只能針對訓練資料集做平衡的原因。

總之講了這些只是希望大家記住要將平衡資料集放在分割資料之後執行,並確保這個演算法只會使用在訓練資料之上。


留言

這個網誌中的熱門文章

機器學習競賽王者演算法:XGBoost、LightGBM、CatBoost

十種常見的軟體架構模式 10 Common Software Architectural Patterns