結論:這份作業的程式、執行、報告文字都是我做的,在你的電腦上實際跑完。下面照時間順序列出每一步、每一個我自己下的決定和理由。你要交出去,就要知道這些,因為報告第 6 題要如實寫出來,考試也可能問「你為什麼這樣做」。
| 階段 | 做了什麼 | 產出 |
|---|---|---|
| 1 讀規定 | 讀完作業 PDF 37 頁、程式模板 32 格、助教說明影片(24 分鐘,轉成逐字稿)、老師 W2/W3 上課逐字稿;把 2025 和 2026 兩版 PDF 逐行比對,找出 6 個說法互相打架的地方。 | HW1_作業介紹.html |
| 2 準備環境與資料 | 建一個獨立的 Python 3.12.3 環境;裝 gensim 4.4.0 等套件;下載維基百科 11 個壓縮檔(6.93 GB)、GloVe 詞向量(128 MB)、卡達論壇語料(234 MB)。 | .venv\、data\、requirements.txt |
| 3 寫程式 | 把老師的模板複製一份,只改 TODO 格和載入資料的格子(其他格一字不差);在報告下面加上報告第 2~5 題的實驗程式。 | 第一版筆記本 |
| 4 彩排+第一次正式執行 | 先用很少的資料把整本跑一遍,修掉 4 個問題;再用完整資料跑完整本(2 小時 38 分鐘,0 錯誤)。 | 第一版結果 |
| 5 第一輪審查 | 派 4 位互不相干的審查員,只給他們老師的原始資料(PDF、模板、助教影片、投影片、逐字稿),各自從一個角度挑毛病:①老師規章 ②課程內容正確性 ③假扮助教打分 ④數字逐一核對(728 個數字)。 | 審查紀錄 05a~05d |
| 6 依審查修正 | AI 標註改成如實寫法;把模板的提示說明放回去;改正 4 處講錯的觀念(apple、冷門字、跨模型比分數、min_count);新增 6 組證據實驗(雜訊量測、冷門字次數、只看常見字的鄰居、apple 前 15 名、回教材查 sourpuss、只算兩本字典都有的題目)。 | 繳交版程式 |
| 7 繳交版從頭重跑 | 整本從第一格跑到最後一格,執行編號連續,報告每一個說法都有自己的輸出當證據。 | NLP_HW1_submission_draft.ipynb |
| 8 寫報告、說明、再審查 | 用最終數字寫報告 6 題;用自動工具核對報告裡每一個數字都能在輸出找到;寫這份說明;再換一批新審查員檢查一次。 | 報告、本文件、審查紀錄 |
老師規定:只准改「載入資料」的部分,亂改扣 5 分。所以我把每一格都分類清楚:
| 格子 | 原本是什麼 | 我改成什麼 | 屬於 |
|---|---|---|---|
| 第 2 格 | !wget 下載考卷 | Python 的 urllib 下載同一個網址(Windows 沒有 wget) | 載入資料 |
| 第 18~22 格 | !gdown、!gunzip、!cat、!head | Python 下載;不解壓不合併、直接讀壓縮檔(省硬碟) | 載入資料 |
| 第 5、13、15、24、25、27、28 格 | TODO1~7 的空格 | 填入答案程式;模板原本的註解和 Hints 說明全部保留,程式接在後面 | TODO |
| 第 27 格(TODO6) | — | 多印了成績(模板在 TODO6 後面沒有評分格,不印看不到結果) | TODO 格內 |
| 第 29 格 | 報告題目 | 填入答案 | 報告 |
| 第 31 格 | # Write your code here | 第一行保留,下面接第 3 題的共用工具 | 第 3 題程式區 |
| 每一格我寫的程式 | — | 第一行加 # [Generative AI] The code in this cell was generated by Claude (Anthropic). | 規定要求的 AI 標註 |
| 第 32 格以後 | (模板沒有) | 第 2~5 題的實驗、總表、執行環境 | 報告下面新增 |
| 決定 | 選了什麼 | 為什麼 |
|---|---|---|
| 在哪裡跑 | 你的筆電,不用 Colab | 你的 CPU 16 執行緒,Colab 免費版通常 2 核;Colab 跑久會斷線、輸出會不見。 |
| 怎麼讀維基 | 直接讀壓縮檔、一行一行讀 | 不吃硬碟、不吃記憶體(老師課堂上特別警告過記憶體爆掉的寫法)。 |
| 怎麼抽樣 | 以篇為單位、固定亂數種子、5%⊂10%⊂20% | 結果能重現;三份資料只差在量,第 2 題比較才公平。 |
| 大小寫 | 題目全部轉小寫 | GloVe 和維基資料都是小寫,不轉會查不到字。 |
| 前處理 | 只留英文字母;不刪停用詞、不做詞形還原 | 停用詞和字形變化就是考卷的答案(第 12 節有實驗證明)。 |
| 模型 | Skip-gram、100 維、window 5、5 輪 | 老師投影片的重點是 Skip-gram;100 維跟 GloVe 一樣,比較才公平。 |
| 字典大小 | 最多 30 萬字 | 老師建議的「只留高頻字」;字典太大會變慢、容易猜到冷門字。 |
| 第 3 題的語料 | 卡達生活論壇問答 | 跟維基差最多(口語 vs 百科)、大小適中、可直接下載。 |
| 第 3 題怎麼比 | 多做一份一樣大小的維基對照組 | 把「資料量」和「內容種類」兩個因素分開(控制變因)。 |
| 加分實驗 | 停用詞、調參數、top-k、錯題分析、換公式、PCA 對照、重跑一次 | 每一個都回答一個老師上課提過或考試可能問的問題。 |
| 檔案 | 用途 |
|---|---|
HW1\示範實作\NLP_HW1_submission_draft.ipynb | 繳交版筆記本(程式+輸出+報告);交之前改成 NLP_HW1_學校_學號.ipynb |
HW1\示範實作\NLP_HW1_DEMO_示範.ipynb | 第一版(審查前),留作對照,不交 |
HW1\示範實作\requirements.txt | 套件清單 |
HW1\HW1_一條龍說明.html | 本文件 |
HW1\HW1_作業介紹.html | 規定、扣分、繳交檢查清單 |
HW1\_work\2026-10-04-nlp-hw1-submission\ | 審查紀錄 |
結論:這門課前三週在回答一個問題:「怎麼讓電腦知道字的意思?」這份作業就是讓你親手驗證課堂上的答案(詞向量),並找出「什麼決定詞向量好不好」。整份作業的實驗,都是在一次改一個因素、看結果怎麼變。
老師前三週的投影片,是一條「表示字的方法越來越好」的路。每一站都在解決上一站的問題:
| 站 | 方法 | 白話 | 問題在哪 | 投影片 |
|---|---|---|---|---|
| 1 | Bag of Words、one-hot | 每個字一個格子,有出現就打勾 | cat 和 dog 跟 cat 和 truck 一樣「不像」,電腦看不出誰跟誰相近 | W1 p55–58 |
| 2 | TF-IDF、BM25 | 打勾改成打分數(常出現但不是到處都有的字比較重要) | 還是一字一格,「計程車」和「的士」對不起來(同義詞問題) | W1 p48–53、p60–61 |
| 3 | 分布假說 | 「看一個字的朋友,就知道它是什麼字」(Firth 1957) | —(這是後面所有方法的基礎) | W1 p70、W2 p24 |
| 4 | LSA(共現矩陣+SVD 降維) | 數每兩個字一起出現幾次,再壓縮 | 矩陣有「字數×字數」那麼大、很稀疏、加一個字要全部重算 | W1 p71–80 |
| 5 | 神經網路語言模型(Bengio 2003) | 讓神經網路學「下一個字」,順便學出每個字的座標 | — | W1 p65–68 |
| 6 | Word2Vec(Skip-gram)← 作業自己訓練的 | 用中間的字猜旁邊的字,練出座標 | 一個字只有一組座標 | W1 p81–90、W2 p32–38 |
| 7 | GloVe← 作業借來用的、FastText | GloVe 用整份資料的共現統計;FastText 看字的拼法片段 | 同上 | W1 p91–93 |
| 8 | 上下文詞向量(BERT、GPT)← 之後的課 | 同一個字在不同句子給不同座標 | — | W2 p39–40 |
所以作業的位置是:站 6、7。你在作業裡看到的缺點(apple 混了兩種意思、bank 只剩銀行),正是站 8 要解決的問題。考試如果問「詞向量的限制是什麼、後來怎麼解決」,就是要你把這條路講出來。
左邊是會影響字典好壞的 4 個因素,右邊是檢查字典好壞的 3 種方法。報告的每一題,都是「動左邊一個因素,從右邊看結果」。
想知道「某個因素有沒有影響」,就要一次只改那一個,其他全部一樣。這叫控制變因。這份作業每個實驗都照這個原則設計:
| 想知道 | 只改了 | 其他保持一樣 |
|---|---|---|
| 資料量的影響 | 5% → 10% → 20% | 同一批文章(5% 包含在 10% 裡)、同參數 |
| 資料種類的影響 | 維基 → 論壇 | 字數一樣(各 7,292 萬字)、同前處理、同參數 |
| 停用詞的影響 | 刪 / 不刪 | 同一份 5% 維基、同參數 |
| 模型設定的影響 | CBOW、window、維度(一次改一個) | 同一份 5% 維基 |
| 算答案公式的影響 | 3CosAdd → 3CosMul | 同一本字典 |
最後還要確認一件事:同樣設定跑兩次,結果會晃多少?差距比「晃動」還小的,就不能下結論(第 12 節實驗 ⑦)。
結論:詞向量真的能抓到字的關係,但它學的是「誰跟誰一起出現」,所以讀什麼、讀多少、怎麼整理、怎麼學都會改變它學到的東西;它也有一字一向量的根本限制。下面 8 件事,每一件都有實驗數字當證據。
| # | 結論 | 證據(本作業的數字) | 對應投影片 |
|---|---|---|---|
| 1 | 字可以變成有意義的座標,關係可以用加減算出來 | GloVe 答對 63.11%;t-SNE 圖上男女配對黏在一起、按角色分群 | W2 p30(Washington − U.S. + U.K. = London) |
| 2 | 座標是從「一起出現」學來的,不是從「意思」 | good 的鄰居有 bad;論壇裡 salary 的鄰居是錯字 slary;cat 的鄰居是卡通貓 sourpuss | W1 p70、W2 p24(分布假說) |
| 3 | 資料越多越好,但越來越沒感 | 5%→10%→20%:45.22→46.87→48.29;資料 ×4 只多 3 分;少見字形(最高級)進步最多 | — |
| 4 | 資料種類決定學到哪些關係 | 一樣大小下,論壇語意類 12.37 vs 維基 46.07;但最高級 43.58 vs 19.25。cheapest 在論壇出現的頻率是維基的 28.6 倍、illinois 只有 0.01 倍 | W1 p93(It depends) |
| 5 | 前處理沒有絕對的好壞,要看任務 | 刪停用詞:整體幾乎不變(45.22→45.03),家人類 −17、地理類 +3~5 | W1 p47(When to remove stop words? Avoid to broke the semantics) |
| 6 | 模型設定的影響可以比資料量還大 | 300 維只用 5% 資料(56.95)就贏過 100 維的 20%(48.29);CBOW +7.5;window 10 −3.4 | W1 p81–90 |
| 7 | 評分方式本身也有限制 | 前 10 名命中率比第 1 名高 24.5 分;有些「錯」只是拼法不同(argentinian/argentinean);同設定重跑,小類可差 9 分;3CosMul 反而較差 | — |
| 8 | 一字一向量是根本限制 | apple 同時靠近手機和水果;bank 只剩銀行,沒有河岸 | W1 p60(bank 一詞多義)、W2 p39(上下文詞向量) |
考前背這一句
詞向量用「分布假說」把字變成座標,能用加減做類比;但它學的是共同出現而不是意思,所以受資料的量、種類、前處理與模型設定影響,也分不出一字多義——這就是後來需要 BERT 這類上下文詞向量的原因。