Appearance
CS336 自學筆記 Week 1:Micrograd 深度拆解
當我們把「可怕的術語」翻譯成「12 歲也懂的白話文」,一切就不一樣了。
作者:Ray
日期:2025 年 12 月
前言:這週我學了什麼?
按照先修攻略的規劃,Week 1-2 要跟著 Karpathy 的 micrograd 影片 學習自動微分。
但在動手寫程式之前,我發現自己對很多「基礎概念」其實一知半解。這篇文章記錄了我在學習過程中問自己的問題,以及我找到的答案。
我的學習原則:如果不能用 12 歲小朋友聽得懂的話解釋,代表我自己也沒真正理解。
Part 1:Micrograd 是什麼?
🔬 名字拆解
Micro + grad = Micrograd
| 部分 | 意思 |
|---|---|
| Micro | 微小的——整個專案只有約 150 行程式碼 |
| grad | Gradient(梯度)的縮寫——這是整個專案的核心功能 |
所以 Micrograd = 微型的梯度計算引擎。
它想表達的是:「這是一個超級小、但能真正計算梯度的引擎」。
這個專案在做什麼?
Micrograd 實現了兩件事:
- 自動微分引擎(約 100 行):讓電腦自動計算梯度
- 神經網路模組(約 50 行):用這個引擎建構神經網路
相比之下,PyTorch 有幾十萬行程式碼。Micrograd 就像把大象縮小成螞蟻,但螞蟻還是會走路!
命名傳統
在深度學習領域,很多框架都用類似的命名:
| 名稱 | 意思 |
|---|---|
| Autograd | PyTorch 的自動微分模組 |
| Micrograd | 超迷你版的 autograd |
| Tinygrad | 另一個小型框架(比 micrograd 大一些) |
Part 2:核心概念的白話解釋
學習 micrograd 之前,需要理解幾個核心概念。以下是我整理的「12 歲版」解釋。
🧠 神經網路 (Neural Network)
想像一下你的大腦 🧠
你的大腦裡有很多「神經元」,它們彼此連接。當你學習新東西時,這些連接會變強或變弱。
神經網路就是模仿大腦的電腦程式:
- 有很多小「節點」(像神經元)
- 節點之間有「連線」(像神經連接)
- 學習時,連線的「強度」會調整
例子:教電腦分辨貓和狗
- 給電腦看很多貓狗照片
- 電腦猜錯時,調整連線強度
- 猜對越來越多,就學會了!
📈 前向傳播 vs 反向傳播
這是神經網路的「去程」和「回程」。
前向傳播 (Forward Pass):計算的「去程」
想像你在算一道數學題:
a = 2
b = 3
c = a + b → c = 5
d = c × 2 → d = 10你從最開始的數字(a、b),一步一步算到最後的答案(d)。資料往前流動。
反向傳播 (Backpropagation):計算的「回程」
想像你考試考了 60 分,想知道「哪裡錯了」:
- 你往回檢查每一題
- 找出哪些地方需要改進
反向傳播就是這樣:
- 電腦算出一個答案
- 發現答案不對(有「誤差」)
- 往回追查:是哪些數字、哪些連線造成的?
- 找出每個部分的「責任」有多大
🎯 梯度 (Gradient)
梯度就是告訴我們**「要怎麼調整才會變好」**的指引。
想像你在爬山,但你閉著眼睛:
- 梯度就像告訴你「往左走會上坡,往右走會下坡」
- 如果你想下山(減少誤差),就往梯度說的方向走
數學上:梯度告訴我們「如果我把這個數字調大一點點,最終答案會變大還是變小?變多少?」
🌳 計算圖 / DAG
DAG 是「有向無環圖」(Directed Acyclic Graph),聽起來很複雜,其實很簡單。
想像一個家族樹 🌳:
- 爺爺奶奶 → 爸爸媽媽 → 你
- 有方向(從上到下)
- 不會繞圈(你不會是自己的祖先)
計算圖就是把數學計算畫成這樣的樹:
a b
\ /
\ /
+ ← 加法節點
|
c
|
× ← 乘法節點(c × 2)
|
d這樣電腦就知道「d 是怎麼從 a、b 一步步算出來的」,反向傳播時就能順著這棵樹往回走。
🔌 ReLU 激活函數
ReLU 是神經網路裡最常用的「開關」。
規則超級簡單:
- 如果數字 > 0,就保持原樣
- 如果數字 ≤ 0,就變成 0
ReLU(5) = 5
ReLU(-3) = 0
ReLU(0) = 0為什麼需要它?
如果神經網路只有加法和乘法,它只能學「直線」的關係。有了 ReLU 這種「非線性」的東西,神經網路才能學會複雜的「彎彎曲曲」的關係!
Part 3:微積分不可怕
學 micrograd 一定會碰到微積分。很多人聽到就害怕,但其實核心概念很直覺。
微積分在解決什麼問題?
只有兩個:
- 東西變化的速度有多快? (微分)
- 把很多小東西加起來是多少? (積分)
就這樣!
🚗 微分:用汽車來理解
想像你坐在車上,看著儀表板:
- 里程表:顯示你「總共走了多遠」(例如:50 公里)
- 時速表:顯示你「現在有多快」(例如:60 公里/小時)
這兩個數字有什麼關係?
時速就是「距離變化的速度」
微分就是:已知「總量」,求出「變化速度」
| 數學說法 | 白話文 |
|---|---|
| 對位置微分 | 求速度(位置變化多快) |
| 對速度微分 | 求加速度(速度變化多快) |
🍕 積分:用披薩來理解
想像你要算一個奇形怪狀的披薩面積。正方形、三角形有公式,但怪形狀怎麼辦?
積分的方法:切成很多小塊!
把它切成很多很多細長條,每個長條近似長方形,長方形面積很好算,然後把所有長條的面積加起來。
切越細 → 越準確。切到無限細 → 完美準確!
這就是積分:把無限多的小東西加起來
🔄 微分和積分是相反的!
這是微積分最美妙的發現:
微分
──────────→
距離 速度
←──────────
積分它們互為逆運算,就像加法和減法一樣!
這跟 Micrograd 有什麼關係?
在訓練神經網路時:
- 我們有一個「損失函數」:衡量 AI 的答案有多錯
- 我們想找出「怎麼調整權重才能減少錯誤」
- 這就需要微分! 對損失函數微分(求梯度),梯度告訴我們怎麼調整
- Micrograd 的
backward()就是在自動做微分
Part 4:為什麼數學術語這麼難懂?
學習過程中,我一直有個疑問:為什麼這些術語這麼不直覺?
「微積分」這三個字
其實是兩個詞組合:微分 + 積分
| 詞 | 意思 |
|---|---|
| 微分 | 微小的分割(把變化切成極小來分析) |
| 積分 | 累積的份量(把微小的部分加起來) |
英文 Calculus 來自拉丁文,意思是「小石頭」——古羅馬人用小石頭來算數。
數學命名的荒謬案例
| 術語 | 問題 |
|---|---|
| 虛數 (Imaginary) | 叫「虛」是因為當年數學家覺得「不可能存在」。但它在物理學、工程學超級有用,一點都不「虛」! |
| 無理數 (Irrational) | 原意是「不理性的、瘋狂的」。古希臘人發現 √2 無法寫成分數,嚇壞了。但 π 超級有用,哪裡「瘋狂」? |
| 負數 (Negative) | Negative 有「負面」的意思,但 -10°C 只是方向相反,沒有什麼「不好」。 |
為什麼不改掉?
- 慣性太強:幾百年的教科書都用這些詞
- 國際溝通:全世界用同樣術語,改了會混亂
- 數學家不在乎:「定義清楚就好,名字只是標籤」
我的結論
數學術語「定義精準」,但「命名不精準」
術語只是標籤,重要的是背後的概念。不管叫「微分」還是「求變化速度」,本質都是「某個東西變化有多快」。
給初學者的建議:
- 不要被術語嚇到——很多嚇人的名字背後是簡單的概念
- 先理解概念,再記術語
- 在腦中建立「白話翻譯」
- 不要以為聽不懂是自己笨——有時候真的是命名的問題!
Part 5:Micrograd 程式結構
engine.py — 核心引擎
主要是一個叫 Value 的類別:
python
a = Value(2.0) # 創造一個「有記憶的數字」
b = Value(3.0)
c = a + b # c 會記得它是 a + b 來的每個 Value 包含:
| 屬性 | 功能 |
|---|---|
data | 實際的數字值 |
grad | 這個數字的梯度 |
_backward | 如何往回傳梯度 |
_prev | 記得自己是從哪些數字算出來的 |
nn.py — 神經網路模組
| 類別 | 功能 |
|---|---|
| Neuron | 一個神經元 |
| Layer | 一層(很多神經元) |
| MLP | 多層神經網路 |
Part 6:本週總結
概念對照表
| 專有名詞 | 12 歲版解釋 |
|---|---|
| 神經網路 | 模仿大腦的電腦程式,會學習 |
| 純量 | 一個單獨的數字 |
| 前向傳播 | 從輸入算到輸出 |
| 反向傳播 | 從輸出往回找,看誰要負責 |
| 梯度 | 告訴你「往哪調整會變好」的箭頭 |
| 自動微分 | 電腦自動幫你算梯度 |
| 計算圖 | 把計算過程畫成家族樹 |
| 損失函數 | 衡量「錯多少」的分數 |
| ReLU | 負數變 0,正數不變的開關 |
| MLP | 好幾層神經元疊在一起 |
| 權重 | 連線的強度 |
| 微分 | 求變化速度 |
| 積分 | 把小東西累加起來 |
本週心得
- 先理解「為什麼」比「怎麼做」更重要:知道梯度的意義,比死背公式有用
- 術語是障礙,但可以克服:翻譯成白話文,一切就清楚了
- Micrograd 的精髓是簡單:150 行程式包含 AI 學習的所有核心概念
下週預告
Week 2 會繼續深入 micrograd,實際動手寫程式碼,實作:
- Chain rule 的程式碼實現
- 完整的反向傳播流程
- 簡單的神經網路訓練
延伸資源
本週使用的資源
如果你卡住了
- Chain rule 不懂 → 看 3Blue1Brown 微積分第 1-4 集
- 不懂為什麼要算 gradient → 看 3Blue1Brown 神經網路系列
如果這篇文章對你有幫助,歡迎分享給同樣在自學 LLM 的朋友!