前言

會開始這個挑戰是因為筆者處於有點頹廢的狀態已經好幾週了,再加上為了Data engineering Zoomcamp去申請的GCP免費試用額度5/12就要到期,一直在煩惱著要怎麼盡可能在過期前把額度用掉,而後就想起來了CS336。這門課因為需要極大的工作量 (參考Lecture 1: Comment from Spring 2024 course evaluation: The entire assignment was approximately the same amount of work as all 5 assignments from CS 224n plus the final project. And that's just the first homework assignment.),再加上自學者通常還要為training model支付一些cloud的費用(課程頁面有提供一些較便宜的選項),因此筆者本來是打算至少等到2027再來學習的。但既然GCP有現成的免費額度沒地方使用,再加上筆者最近很希望能夠盡快回到隨時都可以保持高度專注的狀態,因此決定開始挑戰這門難度最高的Stanford課程之一。

筆記

筆者僅會將比較重視的內容寫到筆記中,如果想完全了解課程的內容,還是建議親自去看課程影片和教材

Course Syllabus

我們目前處於計算資源受限的時代,因此大多數的設計決策主要反映了我們如何盡可能充分運用現有的硬體。不過,雖然今天面臨的是算力限制,但未來我們可能會面臨數據受限的瓶頸,這將會進一步改變未來的設計決策。

關於課程各Module更詳細的概述可以參考 lecture_01.py,筆者這裡就不詳細說明了,也有可能有心情的時候補上一部份

Tokenization

Tokenization 幾乎是所有 NLP 技術的起點 - 也是編寫程式碼時最無聊且讓人痛苦的部分

Introduction

在電腦中,我們通常以 Unicode strings 的形式來表示文字,但 language model 是對 sequences of tokens 做 probability distribution modeling。因此,我們需要將 strings 轉為 tokens (encode) 的方法,以及將 tokens 還原為 strings (decode) 的方法。在l anguage model 中負責這兩項任務的 module 被稱為tokenizer,而 vocabulary size 代表 tokenizer 所有可能的token數量。

具體來說,tokenizer 的運作本質上是依賴一張「詞彙表(vocabulary)」。當 tokenizer 將 raw strings 切分後,會去查表將每個 token 映射(map)並轉換為對應的 integer indicies,這個過程稱為 encode;而 decode 則是將模型輸出的數字序列,根據同一張對照表反向查詢,轉換回人類可讀的 strings。

由於 tokenization 的方法會直接決定一段文本以多長的sequence餵給model,因此提升 compression ratio,也就是「每個 token 能代表多少 bytes 的資訊」非常重要。compression ratio 越大就意味著輸入給 model 的 sequence length 越短 (這對於 attention 的 $O(n^2)$ 計算效率是好事)。而要增加的 compression ratio 最簡單的做法則是增加 vocabulary size。然而,這麼做會帶來 sparsity 的代價:當 vocabulary 過大時,會有大量 token 出現頻率極低,導致模型難以有效學習它們的語意表徵。