iT邦幫忙

2024 iThome 鐵人賽

DAY 28
1
AI/ ML & Data

一個Kaggle金牌解法是如何誕生的?跟隨Kaggle NLP競賽高手的討論,探索解題脈絡系列 第 28

[Day 28]不講武德的Host-不能太倚賴錯字率,一起看第二名「復刻米其林三星料理式」的資料擴增法,與「雞蛋放兩籃」的 ensemble 思路

  • 分享至 

  • xImage
  •  

我很喜歡今天介紹的第二名的 solution,在研究的時候有一種 「啊哈moment」的快樂。

昨天我們分享將文章轉成 TF-IDF 向量後送進 Logistic RegressionSGDClassifier ,就可以在 public test set 上很好地分辨到底這篇文章是出自人類學生還是LLM之手。

那接下來要怎麼好上加好、提升現在的效果呢?當然可以繼續嘗試優化 TF-IDF Kernels,或者也可以嘗試用 deberta-v3 之類的 deep learning model。

但有很多嘗試 deep learning model 的參賽者發現,像 DeBERTa 這類基於 Transformer 的模型在 PERSUADE dataset上的表現非常好,在進行本地交叉驗證時,分數可以達到 0.99+。然而,當這些模型應用到 public test set時,表現並不好,分數大約只有 0.75 左右,而且上傳不同版本的 fine-tuned model 到系統上,得到的LB分數很不穩定,這個現象意謂模型沒有很好地泛化到測試集。

"Transformers love diverse data" - Deberta-V3 泛化性實驗

於是網友@James Day 做了一個假設-

引入更多樣化的數據可能有助於提高Transformers-based(i.e deberta)的模型在這個賽題上的泛化能力。

為了驗證這個假設,他使用了一個名為 "The Pile" 的大型文本數據集,其中包含大約 500,000 篇文件,並隨機截斷這些文件;再使用本地部署的 12 個不同的大語言模型(LLMs)生成大約 500,000 篇可能的續寫文本,並嘗試使用不同的採樣配置來增加生成文本的多樣性。
他一共使用了下列這些模型來生成多樣化的文本:
image

他將 The Pile 裡面人類寫的文章混合這五十萬筆LLM寫的文章,訓練了 DeBERTa-v3-base 和 DeBERTa-v3-large 模型去區分文本是來自人類寫的文章還是由 LLM 生成的。

結果發現,僅使用四分之一的 The Pile 數據進行訓練時,模型在 LB 的表現從原來的 0.75-0.8 提升到 0.90;當擴展到整個數據集並使用 DeBERTa-v3-large 模型時,並且將上下文長度設置為 1024 個 token 後,模型的分數進一步提升到 0.958-0.960;最後通過集成多個模型,得分達到 0.963。
image
(👆🏻圖片來源)

在 0.963 LB Score 之前,可以發現 CV 和 LB 的 linear correlation 很明顯,代表 deberta 透過在他擴增的大型 The Pile dataset 上訓練,確實提升了模型的泛化能力,使得在 CV 的表現會和 LB 的表現大致對齊。
從他的實驗可以得到一個結果 - deberta 之流的 transformer-based 深度模型,要在五十萬以上的大型資料量訓練,才會抓到一些人類和AI比較 general 的特徵。

🥈2nd Solution

在這場比賽中有很多 distribution shift 的問題,像是主辦單位用 LLM 生成的文本資料可能因為和我們擴增資料時使用的 LLM 不同、decode config 的設定不同、prompt 不同,而和我們自己生成資料分佈不同;另外,training data 和 public test set ,以及 public test set 和 private test set 又因為是來自不同作文題目的關係,文章之間也有很大的差異。

受到 @James 的啟發,第二名的團隊設計下面這個框架來試圖彌平這些 data distribution shift 的問題:
image

(👆🏻圖片來源)

  1. Data Diversity: 首先先創建一個包含五十萬筆資料以上、有著大量人類手寫文章和多種 LLM 生成的文本的大型資料集。創建的方式如下:

    • 從 C4 dataset 選取大約 500,000 篇文檔。

    C4是 "Colossal Clean Crawled Corpus" 的簡寫,是一個用於 NLP 任務的大型清理過的網絡抓取數據集。

    • 從每個文檔中隨機選擇一個截斷點,並將截斷點之前的 1024 個 token 作為輸入 prompt。
    • 用多種不同的 LLM(大語言模型)生成後續 1024 個 tokens,組成一筆 label 為 1 的 data。
      • LLM 生成文章小技巧:
        • 不要設定 min/max new token,讓 LLM 自己決定什麼時候輸出 [EOS] 停止文本生成,會讓生成的文章更自然
        • 每次生成都隨機選擇 decoding parameter,例如隨機選擇 temperature 和 top p, topk 之類的,會讓生成的文本更 diverse。
          我們舉兩個例子來看看:
          image
      • 截斷點之後的原始人類寫的文本 label 為 0。
  2. Pre-Training: 在上一步所產生的大型資料集上訓練 deberta-v3 模型做二元分類。這個步驟是希望模型先在大規模的 人類/AI dataset 上學習 general 的 feature。

  3. Fine-Tuning: 前面在大規模資料集上訓練完之後,模型學到人類和AI一些共同有的特徵和差異,但這次賽題資料集是 PERSUADE 2.0 Dataset,這個 dataset 有一些自己的特色和主題。如果我們希望可以將 pretraining 得到的 general model transfer 到這個特定的資料集上,就需要在 down stream 資料上進行 fine-tuned。

    由於主辦方提供給我們的 training data 只有兩個作文題目與學生和LLM根據這兩個作文題目寫的作文,可是實際的 testset 卻是要根據另外五個作文題目寫的文章判斷到底文章是學生寫的還是AI寫的。

    當然,我們前幾天已經通過一些 LB Probing 的方式找到 testset 另外五個作文題目是什麼(有興趣的朋友請參考[[Day 26]"是人是AI,一照便知" - 沒想到最終能找出LLM槍手的原因,是因為LLM太完美了?!]),所以很自然的我們就會想去完整的 PERSUADE 2.0 Corpus 抓取對應那五個題目的學生作文,並用那五個題目叫不同的 LLM 生成文章,一起來組建我們的 down stream fine-tuning dataset。

    可是事情沒那麼簡單。

    我們來看看其中兩個作文題目:
    image

    他的要求是要根據 "Unmasking the Face on Mars""The Challenge of Exploring Venus" 這些指定文章寫作(請參考黃色畫線的地方)。但是我們搜來搜去,就是沒有在網上找到標題是"Unmasking the Face on Mars""The Challenge of Exploring Venus"的文章。

    想想看,這會有什麼問題呢?

  • 缺乏參考資料
    問題是如果我們讓 LLM 生成文章的時候,跟他說“根據這篇指定文章生成 xxxx 內容",但卻沒有給他這篇參考資料,那 LLM 就會開始幻想(hallucination)這篇指定文章,使得它生成的文章絕對會和人類學生、有真正看過那些參考資料的人,超級不一樣。

    舉例來說,下面是一篇學生根據"Unmasking the Face on Mars"這個作文題目寫的文章,黃色是文章中學生引述該篇參考資料的內容,綠色畫線是學生寫錯字的部分:
    image
    可以發現,參考資料不是擺設耶,人家好學生是真的在引經據典、根據參考資料來發揮的。
    沒有給 LLM 的話,直接讓 gpt-4o 生成的結果如下:
    image
    GPT-4o 就不會像學生真實去引述文章 paragraph 12 的內容。

    直接生成這樣的資料拿去訓練,很有可能會導致最後訓練出來的 classifier 抓到這個錯誤的 feature,導致 CV 表現很好,到 testset 上又是一團糟。

    那到底要怎麼辦呢?就是找不到剩下那幾個作文題目指定要參考的文章呀!

    這時候第二名的團隊想了一個聰明的作法:

  • 復刻米其林三星料理 - 訓練學生作文仿寫模型

    雖然我們只有作文題目沒有作文題目要求要參考的資料,但是我們有看過這些文章並且依據這些文章寫出來的學生作文呀!

    那我們何不用這些學生作文訓練一個「仿寫學生作文」的 LLM 呢?

    誰說一定要按照學生的寫作過程,給定題目和參考資料再從頭開始寫呢?

    反正目標是「產生 LLM 寫的文章」,那我們直接在這些學生作文上訓練 LLM,不僅可以讓 LLM 從中模仿這些學生引述了哪些內容,在過程中模型可能可以拼湊出原文(但這不是重點),甚至模型還可以學會學生的一些特色(例如錯字和寫作習慣),使得用這種方式產生的二元資料集會變得比「有題目、有參考資料,找一個pretrained LLM 開始寫作文」產生的資料集更困難、更難分辨,所以理論上在這個資料集訓練的模型會有更強大的甄別能力。

    不知道大家有沒有看過 youtube 或是 bilibili 上面有一些人會復刻「米其林大廚料理」呢?(這邊推薦澳洲阿彭,我超愛看xdd)

    米其林大廚在創作料理的時候,是根據制定好的食譜,什麼食材加多少、煮多久精心設定烹製而成的,這份食譜往往是不傳之秘或價值千金。但是高手自在民間,往往有人品嚐過後憑藉味蕾的記憶混合其他觀察,還原拼湊出一個可能的食譜,最後做出外觀、味道都和米其林三星大廚大差不差的作品。

    我覺得這邊的作法有點像這樣~
    雖然我們沒有完整的題目,但是可以從知道完整題目並根據這些題目來寫作的學生作文中,拼湊出蛛絲馬跡,最後讓LLM寫出類似的文章。
    當然這邊訓練仿寫 LLM 的時候,不能在學生作文上訓練太多 epoch,不然 LLM 寫出來的東西就真的 overfit 在學生作文上了,我們還是需要帶有一些 LLM 特色才行。因此作者這邊只設定在這些LLM h2ogpt-4096-llama2-7b, h2ogpt-4096-llama2-7b-chat, h2ogpt-4096-llama2-13b , h2ogpt4096-llama2-13b-chat, Mistral-7B-v0.1訓練 1 個 epoch就好~
    我們來看看訓練好的 LLM 根據"Unmasking the Face on Mars"這個題目,會寫出什麼樣的文章呢:
    image
    黃色畫線的部分是 LLM 引述文章的內容,如果和學生寫的文章比對的話,引述部分還滿正確的;而且他還偷偷學會學生會寫錯字的特徵了(綠色畫線部分)。
    混合這筆資料訓練出的分類模型,理論上就比較不會把「錯字率」當作一個重要的 feature。

    但這是好事嗎?我們前幾天不是討論過,錯字率對 public test set 還有主辦方釋出的 training data 來說,好像是一個很有用的 feature。

    沒錯!但我們無法確定 Host 使用的 private test set 是不是和 public test set 一樣都在兩邊引入一定程度的錯字率?還是調整比例變成 AI 文本有更多錯字,或是他們根本在 private test set 上全面更正錯字了呢?如果是後者的話,那依賴錯字率當作重要特徵的模型,就會在 hidden test set 表現得非常糟糕。

  • 別把雞蛋放在同個籃子裡 - 專為兩種不同情況打造的 ensemble 策略
    為了避免因為 hidden test set 和其他 dataset 太不一樣,導致最後 private score 差太多,他們的做法是乾脆為這兩種情況都訓練模型,為兩種可能都做好準備!

    所以最後他們用自己做的大型資料集訓練三種 pretrained model:

    • deberta-v3-large1
    • deberta-v3-large2
    • deberta-large
      接著在兩種和本次賽題任務相關的小型資料集 fine-tuned:
    • ftdata: 包含 9000 筆從 persuade 找來的、根據其中七個作文題目所寫的學生作文,以及 18000 筆他們訓練「仿寫學生作文模型」生成的文章。這個資料集因為 LLM 也會模仿學生寫錯字,所以是為了處理「Private test set 修正所有錯字」的情況時,模型也要能找到其他特徵區別人類和 AI。
    • v4data:來自其他網友貢獻的,包含根據 15 個作文題目所寫的學生作文,與直接給定作文題目叫llm 生成的各式各樣文章。這部分就沒有對錯字做什麼改變,預測就是在這個資料集上學習的模型,可以把「錯字率」也當成一個重要的 feature。
      所以最後總共產生 6 個模型,每個模型以及 ensemble (直接取平均)後的表現如下:
      image

    從 Public LB 和 Private LB 的分數差異,我們可以推論 private test set 應該是對「錯字」進行比較大幅度的修正了。
    舉例來說,同樣是在 deberta-v3-large1 pretrained,但是在 ftdata fine-tuned 後,Public LB 的分數相比在 v4data fine-tuned 低一些,但 private LB 缺高出 4%;這個現象在使用其他 pretrained model 也可以看到。代表如果依賴「錯字率」當作分類標準的模型,無法泛化到 private test set上。

    雖然我覺得Host這樣設計,還滿不講武德的...
    image

  • Ablation Study
    另外,他們還做一些有趣的比較:
    image
    可以看出在這次賽題中,靠 fine-tuning 就能拿高分進入銀牌區;但是加上在大規模語料訓練的 pretraining 之後,才能拿到進入Public 和 Private 金牌區的門票~
    也比較不同規模的 deberta 帶來的增益:
    image
    v3-large 的優勢很明顯,其他模型都差不多。

小結

我真的滿喜歡今天分享的第二名Solution!🤩🤩

我覺得他們對 Host 提供的 dataset 做了滿細緻的觀察,並且有發現不是太多人都有提到的問題,以及很有價值的 insight。

尤其在解決 distribution shift 以及缺乏參考資料生成文章等這些問題時所做的分析、和他們開發出來的解法,都讓人覺得非常好 follow、思路也清晰很有說服力,每個作法的意圖、目的性都非常明確,當然最終效果非常好也是 convinced 的一個原因xdd

接下來我們會繼續討論其他金牌解法,預計這個賽題還有兩篇才能寫完整,所以最後一個賽題應該會在 Day31 開始。
總之,我們明天見~


謝謝讀到最後的你,希望你會覺得有趣!
如果喜歡這系列,別忘了按下訂閱,才不會錯過最新更新,也可以按讚⭐️給我鼓勵唷!
如果有任何回饋和建議,歡迎在留言區和我說✨✨


LLM - Detect AI Generated Text 解法分享系列)


上一篇
[Day 27]照妖(AI)鏡下的秘密-利用TF-IDF、BPE編碼、Kmeans Cluster和DetectGPT技術區分人類與AI寫作
下一篇
[Day 29]模型與資料的超級 ensemble 體 - 淺談 Curriculum Learning 訓練方法與 Ghostbuster (捉鬼人)如何識別 AI 和人類作文
系列文
一個Kaggle金牌解法是如何誕生的?跟隨Kaggle NLP競賽高手的討論,探索解題脈絡30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言