L05|中文 F3 學生的學習紀錄
L05|中文 F3 學生的學習紀錄
角色設定:我是中三學生,只看得懂中文。Python 學過變數、for 迴圈和 list,數學讀到一元二次方程。我靠中文課程筆記、YouTube 自動翻譯字幕和查字典來學。Kaggle 筆記本的操作步驟,是依官方 notebook 流程寫下的練習紀錄。
我讀懂了什麼(用自己的話)
- 鐵達尼號資料要先清理:補缺失值、把文字類別變成 0/1、把太大的數字縮小。
- tensor 就是一個可以放在 GPU 上的表格(或更多維的表格)。
- 訓練迴圈每一輪都是:猜答案、算錯多少、算梯度、改係數。
- sigmoid 把答案壓在 0 到 1 之間,正好對應「生還機率」。
- 自己從零寫很麻煩,所以實際工作用 fastai;但自己寫過一次,才知道框架幫我做了什麼。
我卡住的地方,和我怎麼解決
| 卡住的地方 | 我怎麼解決 |
|---|---|
| 「*」和「@」有什麼不同 | 做了小實驗:* 是一格對一格相乘,@ 是矩陣乘法(相乘後再加總)。(a * b).sum(axis=1) 和 a @ b 結果一樣。 |
| loss.backward() 之後梯度要歸零 | 忘記歸零時,梯度會一直累加,損失變得很奇怪;加上 coeffs.grad.zero_() 就正常了。 |
| 不知道 sigmoid 的 e 是什麼 | 查到 e 約等於 2.718,是一個常數;用 Python 的 torch.sigmoid 直接算就好。 |
練習作答
Q1. 算出 sigmoid(−2)、sigmoid(0)、sigmoid(2)(取三位小數)。為什麼預測「是否生還」要在最後加 sigmoid?
sigmoid(−2) ≈ 0.119,sigmoid(0) = 0.5,sigmoid(2) ≈ 0.881。因為答案只能是 0(沒生還)或 1(生還),sigmoid 讓預測一定落在 0 到 1 之間,模型不用費力把數字剛好調到 0 或 1,訓練更容易。
Q2. 一個 tensor 的形狀是 (891, 12)。它的 rank 是多少?891 和 12 各代表什麼?
rank 是 2(二維表格)。891 是乘客人數(列),12 是每位乘客的特徵數量(欄)。
Q3. Age 欄有很多缺失值。為什麼課程用眾數補,而不是直接刪掉那些乘客?
刪掉會損失很多乘客的其他有用資料,訓練資料變少。用眾數補是最簡單的方法,大多數情況效果不差;而且「這欄原本缺失」本身也可能有意義。
Q4. 算出 log(1+0)、log(1+9)、log(1+99)(自然對數,取三位小數)。為什麼要加 1?
log(1) = 0,log(10) ≈ 2.303,log(100) ≈ 4.605。加 1 是因為 log(0) 沒有定義(會變成負無限大),票價為 0 的乘客就會出錯。
Q5. 課程訓練了 5 個只差在初始值的模型再取平均。為什麼這樣會比單一模型好?
每個模型因為起點不同,會犯不同的小錯誤。把預測平均之後,這些不相關的錯誤會互相抵消,留下大家都同意的部分,所以比單一模型穩定。
我的卡片盒筆記
卡片|自己從零寫過一次,才看得懂框架幫你做了什麼
用框架很快,但只會用框架,出錯時會不知道從哪裡查起。這課 Jeremy 刻意不用 fastai,一行行寫出線性模型、神經網路和深度模型,再換回 fastai 的一行程式。對照之後,我才知道那一行裡藏了補值、正規化、初始化和學習率搜尋。
我學 Scratch 時也是這樣。老師先給現成的遊戲範本,我改得很快樂,但角色一卡住我就不會修。後來自己從空白專案寫一個接球遊戲,才明白碰撞偵測是怎麼運作的,再回去看範本就看懂了。不過我覺得不是每樣東西都要從零做,時間有限,選最核心的一兩個(例如訓練迴圈)自己寫就夠了。
這週我要做的小行動:不看筆記,自己重寫一次 train_model 函數,在鐵達尼號資料上跑到準確率 0.78 以上。
🔗 推薦產生關聯的筆記: → 學習方法類:「拆開黑盒子一次,之後用起來更安心」 → 程式類:「把探索步驟封裝成函數,三個月後還看得懂」 → 資料類:「最簡單的補值方法,常常就夠用」
回到課程筆記:L05_從零打造模型_202611041526