Titanic MLP 參數量怎麼算?
Titanic MLP 連題組第二題:參考下圖執行結果,下列何者正確?
model = Sequential()
model.add(Input(shape=(X_train.shape[1],)))
model.add(Dense(10, activation="relu"))
model.add(Dense(10, activation="relu"))
model.add(Dense(1, activation="sigmoid"))
model.summary()
model.compile(loss="binary_crossentropy", optimizer="adam", metrics=["accuracy"])
Model: "sequential"
Layer (type) Output Shape Param #
dense (Dense) (None, 10) 空格 1
dense_1 (Dense) (None, 10) 空格 2
dense_2 (Dense) (None, 1) 11
敘述:
A:activation="relu" 其數學式為 f(x) = 1/(1+e^(-x))
B:空格 1 值為 110,空格 2 值為 100
C:空格 1 值為 100,空格 2 值為 110
D:activation="sigmoid" 一般用於多類別分類預測模型
Titanic MLP 分析專案中,工程師建了一個三層全連接網路,輸入是 9 個特徵,輸出是「是否存活」的二元分類。model.summary() 輸出了每層的輸出形狀和參數量,但第一、第二個 Dense 層的參數量留下了空格 1 和空格 2。題目還附上了四個敘述,考你對激活函數和參數量計算的理解。
問你:四個敘述中,哪一個是正確的?
一句話總結
正確的是選項 C:空格 1(第一個 Dense 層)= 100,空格 2(第二個 Dense 層)= 110。輸入 9 維 → 輸出 10,參數 = 9×10+10 = 100;輸入 10 維 → 輸出 10,參數 = 10×10+10 = 110。
先感受問題:每層的「連線數」加「偏差數」就是參數量
Titanic MLP 的工程師建了一個三層網路,要在 model.summary() 的空格裡填入每層的參數量。
計算 Dense 層參數量的公式很固定:每個輸出神經元都和每個輸入神經元有一條連線(weight),再加上一個偏差(bias)。所以:
- Dense(10),輸入維度是 X_train.shape[1] = 9:參數 = 9×10(weight)+ 10(bias)= 90+10 = 100
- Dense(10),輸入來自前一層輸出的 10 個神經元:參數 = 10×10 + 10 = 100+10 = 110
- Dense(1),輸入來自 10 個神經元:參數 = 10×1 + 1 = 11(題目已給出)
關鍵:第一層 Dense 的輸入是 9(Titanic 的 9 個特徵),第二層的輸入是 10(上一層的輸出),所以兩者的參數量不一樣,是 100 和 110,而不是 110 和 100。
容易算錯的三個地方
- 忘記加 bias:Dense(10) 輸入 9 維,只算 9×10=90,忘記加 10 個 bias,得到 90 而不是 100。bias 是每個輸出神經元各一個,不是共用。
- 把空格 1 和空格 2 弄反:第一層輸入是 9 維(特徵數),第二層輸入是 10 維(上一層輸出),所以第一層 100 < 第二層 110,不是反過來的 110 和 100。
- 混淆 ReLU 和 Sigmoid 的公式:ReLU 的公式是 f(x) = max(0, x),Sigmoid 的公式才是 f(x) = 1/(1+e^(-x))。兩者是不同的激活函數。
- Sigmoid 用在多分類:Sigmoid 輸出 0-1 之間的單一數值,用於二元分類(是/否);多分類用 Softmax,輸出每個類別的機率,總和為 1。
- Input 層沒有參數:model.add(Input(shape=(9,))) 不算一個有參數的層,它只是定義輸入形狀,所以第一個 Dense 的「輸入來源」是 9,不需要特別計算 Input 層的參數。
按公式計算:(input + 1) × output
Titanic MLP 的工程師逐層計算:
dense(第一層 Dense(10)):輸入 = X_train.shape[1] = 9,輸出 = 10
參數 = 9 × 10 + 10 = 90 + 10 = 100(空格 1)
dense_1(第二層 Dense(10)):輸入 = 前一層輸出 = 10,輸出 = 10
參數 = 10 × 10 + 10 = 100 + 10 = 110(空格 2)
dense_2(第三層 Dense(1)):輸入 = 10,輸出 = 1
參數 = 10 × 1 + 1 = 10 + 1 = 11(題目已給)
空格 1 = 100,空格 2 = 110,這就是選項 C 的答案。
這就是選項 C 講的:空格 1 值為 100,空格 2 值為 110。
技術版:Dense 層參數量公式與激活函數對照
中級考試大概率會考程式碼跟公式,所以這部分你還是要學。但如果現在學起來很痛苦,可以先跳過,等讀完其他題目回頭再來。
想像 Dense 層是一個「所有員工和所有主管都要一對一報告」的部門。9 個員工,10 個主管,就有 9×10=90 條匯報路線(weight)。但每個主管還有一個自己的「基準判斷」(bias),10 個主管就多了 10 個額外的數字,共 90+10=100 個參數。
第二層:10 個員工(上一層的主管變成這層的員工),10 個新主管,10×10=100 條路線 + 10 個 bias = 110 個參數。
層越往後走,「員工數」就是上一層的「主管數」,這就是為什麼第一層和第二層的輸入數字不同。
| 白話說法 | 公式 / 程式碼 |
|---|---|
| Dense 層參數量公式 | (input_size + 1) × output_size |
| dense(輸入 9,輸出 10) | (9 + 1) × 10 = 100 |
| dense_1(輸入 10,輸出 10) | (10 + 1) × 10 = 110 |
| dense_2(輸入 10,輸出 1) | (10 + 1) × 1 = 11 |
| ReLU 公式 | f(x) = max(0, x) |
| Sigmoid 公式 | f(x) = 1 / (1 + e^(-x)) |
- Dense(units)
- 全連接層,每個輸出神經元連接所有輸入神經元,units 是輸出神經元數
- activation="relu"
- 修正線性單元,f(x) = max(0, x),負值輸出 0,正值保留原值,用於隱藏層
- activation="sigmoid"
- S 型函數,f(x) = 1/(1+e^(-x)),輸出 (0,1) 之間,用於二元分類輸出層
- activation="softmax"
- 多類別輸出層的激活函數,輸出各類別的機率,總和為 1
- Input(shape=(9,))
- 定義模型輸入形狀,本身沒有參數,不出現在 summary 的參數統計
Titanic MLP 逐層參數計算: Input shape=(9,) → 0 個參數(不計) Dense(10, relu) 輸入 9 → 9×10 + 10 = 100 ← 空格 1 Dense(10, relu) 輸入 10 → 10×10 + 10 = 110 ← 空格 2 Dense(1, sigmoid) 輸入 10 → 10×1 + 1 = 11 Total trainable params = 100 + 110 + 11 = 221 激活函數對照: ReLU: f(x) = max(0, x) ← 隱藏層常用 Sigmoid: f(x) = 1/(1+e^(-x)) ← 二元分類輸出層 Tanh: f(x) = (e^x-e^(-x))/(e^x+e^(-x)) ← ReLU 替代 Softmax: f(x_i) = e^(x_i) / Σe^(x_j) ← 多類別輸出層 選項 A 的錯誤:把 Sigmoid 的公式套在 ReLU 上 選項 D 的錯誤:Sigmoid 用於二元分類,不是多類別分類
- Dense(10) 的輸入從哪裡來?怎麼知道輸入維度是多少?
- Dense 層的 bias 有幾個?是共用一個還是每個輸出神經元各一個?
- ReLU 和 Sigmoid 各自用在什麼位置(隱藏層 vs 輸出層)?為什麼?
- 如果把最後一層改成 Dense(10, activation="softmax"),這個模型就能做什麼?
- binary_crossentropy 和 categorical_crossentropy 分別適用什麼場景?
為什麼其他選項是錯的
字面在說什麼:ReLU 激活函數的數學式是 Sigmoid 公式。
為什麼不對:ReLU(Rectified Linear Unit)的公式是 f(x) = max(0, x):x 大於 0 就輸出 x,小於等於 0 就輸出 0。f(x) = 1/(1+e^(-x)) 是 Sigmoid 函數的公式,兩者名稱和公式完全不同。
誰會選錯:記得「激活函數有個 S 型公式」,但不知道那是 Sigmoid 而非 ReLU;或者把 ReLU 和 Sigmoid 的名字背混了。
字面在說什麼:第一個 Dense 層有 110 個參數,第二個有 100 個。
為什麼不對:第一個 Dense(10) 的輸入是 X_train.shape[1] = 9(Titanic 的特徵數),參數 = 9×10+10 = 100;第二個 Dense(10) 的輸入是上一層的 10 個神經元,參數 = 10×10+10 = 110。選項 B 把兩個空格的數字弄反了。
誰會選錯:對第一個 Dense 的「輸入是 9 還是 10」不確定,看到兩個都是 Dense(10) 就以為輸入也是 10,計算出 110;但第一個 Dense 的輸入其實是特徵數 9。
字面在說什麼:Sigmoid 激活函數用於多類別分類。
為什麼不對:Sigmoid 輸出 0-1 之間的單一數值,代表「屬於正類的機率」,只適合二元分類(survived=0 或 1)。多類別分類(例如辨識 10 種數字)需要 Softmax,它輸出每個類別的機率,且所有類別的機率加起來等於 1。Titanic 預測「存活/死亡」正是典型的二元分類,用 Sigmoid 完全正確。
誰會選錯:誤以為 Sigmoid 可以輸出多個類別的機率,或者記混了 Sigmoid 和 Softmax 的用途。
同個考點下次怎麼變形
直覺:如果把第一個 Dense(10) 改成 Dense(64),空格 1 的參數量變成多少?
答案:9×64+64 = 576+64 = 640。第二層 Dense(10) 的輸入也從 10 變成 64,參數 = 64×10+10 = 650。網路加寬讓第一層和第二層的參數都大幅增加。
直覺:如果把這個網路改成 10 分類(如 digits 資料集),最後一層要怎麼改?
答案:把 Dense(1, activation="sigmoid") 改成 Dense(10, activation="softmax"),損失函數從 binary_crossentropy 改成 categorical_crossentropy(或 sparse_categorical_crossentropy 取決於標籤格式)。最後一層參數 = 10×10+10 = 110。
直覺:為什麼隱藏層用 ReLU 而不用 Sigmoid?
答案:1. 計算快:max(0,x) 比 e^(-x) 的指數運算快很多。2. 不會梯度消失:Sigmoid 在 |x| 很大時梯度趨近 0(飽和),ReLU 在正區間梯度固定為 1。3. 稀疏激活:負數輸出 0,讓網路更稀疏,減少過擬合。主要缺點是「神經元死亡」(dying ReLU):如果某神經元的輸入始終為負,它永遠輸出 0,梯度也是 0,無法恢復。
直覺:如果把 Dense(10) 設定 use_bias=False,參數量怎麼變?
答案:第一層:9×10 = 90(減少 10 個 bias);第二層:10×10 = 100(減少 10 個 bias)。雖然參數減少,但少了 bias 可能降低模型的表達能力,通常不推薦除非有特殊理由(例如使用 BatchNorm 後 bias 的效果被 BN 的 gamma/beta 取代)。
直覺:binary_crossentropy 和 mean_squared_error 都可以用於 Titanic 存活預測嗎?
答案:技術上兩者都能跑,但 binary_crossentropy 是二元分類問題的最佳選擇:它對機率的偏差更敏感(對數尺度),訓練收斂更快。mean_squared_error 用於迴歸問題,若用於分類,損失函數不對應機率分佈,梯度傳播效果較差,收斂更慢、效果更差。
想再往下看,這 5 個
- 前饋神經網路(Feedforward Neural Network)MLP 的正式名稱,Dense 層堆疊構成的全連接網路,本題的架構基礎。
- 修正線性單元(ReLU)選項 A 的混淆來源,f(x) = max(0, x),是深度學習隱藏層最常用的激活函數。
- S 型函數(Sigmoid)本題輸出層的激活函數,f(x) = 1/(1+e^(-x)),輸出二元分類機率,選項 A 把它的公式誤套在 ReLU 上。
- 模型參數(Parameters)本題計算的核心,Dense 層的參數 = weight + bias = 輸入數×輸出數 + 輸出數。
- 交叉熵損失(Cross-Entropy Loss)本題模型用 binary_crossentropy,是二元分類的標準損失函數,多類別用 categorical_crossentropy。