iPAS AI 應用規劃師 中級 科目三 機器學習技術與應用

Titanic MLP 參數量怎麼算?

原題 49

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。題目還附上了四個敘述,考你對激活函數和參數量計算的理解。

問你:四個敘述中,哪一個是正確的?

點選你的答案。

01 總結

一句話總結

正確的是選項 C:空格 1(第一個 Dense 層)= 100,空格 2(第二個 Dense 層)= 110。輸入 9 維 → 輸出 10,參數 = 9×10+10 = 100;輸入 10 維 → 輸出 10,參數 = 10×10+10 = 110。

02 情境

先感受問題:每層的「連線數」加「偏差數」就是參數量

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。

03 對照

容易算錯的三個地方

  1. 忘記加 bias:Dense(10) 輸入 9 維,只算 9×10=90,忘記加 10 個 bias,得到 90 而不是 100。bias 是每個輸出神經元各一個,不是共用。
  2. 把空格 1 和空格 2 弄反:第一層輸入是 9 維(特徵數),第二層輸入是 10 維(上一層輸出),所以第一層 100 < 第二層 110,不是反過來的 110 和 100。
  3. 混淆 ReLU 和 Sigmoid 的公式:ReLU 的公式是 f(x) = max(0, x),Sigmoid 的公式才是 f(x) = 1/(1+e^(-x))。兩者是不同的激活函數。
  4. Sigmoid 用在多分類:Sigmoid 輸出 0-1 之間的單一數值,用於二元分類(是/否);多分類用 Softmax,輸出每個類別的機率,總和為 1。
  5. Input 層沒有參數:model.add(Input(shape=(9,))) 不算一個有參數的層,它只是定義輸入形狀,所以第一個 Dense 的「輸入來源」是 9,不需要特別計算 Input 層的參數。
04 解法

按公式計算:(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 層參數量公式與激活函數對照

中級考試大概率會考程式碼跟公式,所以這部分你還是要學。但如果現在學起來很痛苦,可以先跳過,等讀完其他題目回頭再來。

Step 1 純故事版(不出現公式)

想像 Dense 層是一個「所有員工和所有主管都要一對一報告」的部門。9 個員工,10 個主管,就有 9×10=90 條匯報路線(weight)。但每個主管還有一個自己的「基準判斷」(bias),10 個主管就多了 10 個額外的數字,共 90+10=100 個參數。

第二層:10 個員工(上一層的主管變成這層的員工),10 個新主管,10×10=100 條路線 + 10 個 bias = 110 個參數。

層越往後走,「員工數」就是上一層的「主管數」,這就是為什麼第一層和第二層的輸入數字不同。

Step 2 中文 ↔ 公式對照
白話說法公式 / 程式碼
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))
Step 3 符號角色表
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 的參數統計
Step 4 完整公式對應
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 用於二元分類,不是多類別分類
Step 5 自我複述
  1. Dense(10) 的輸入從哪裡來?怎麼知道輸入維度是多少?
  2. Dense 層的 bias 有幾個?是共用一個還是每個輸出神經元各一個?
  3. ReLU 和 Sigmoid 各自用在什麼位置(隱藏層 vs 輸出層)?為什麼?
  4. 如果把最後一層改成 Dense(10, activation="softmax"),這個模型就能做什麼?
  5. binary_crossentropy 和 categorical_crossentropy 分別適用什麼場景?
05 陷阱

為什麼其他選項是錯的

選項 A activation="relu" 的公式是 f(x) = 1/(1+e^(-x))

字面在說什麼: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 的名字背混了。

選項 B 空格 1 為 110,空格 2 為 100

字面在說什麼:第一個 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。

選項 D activation="sigmoid" 一般用於多類別分類預測模型

字面在說什麼:Sigmoid 激活函數用於多類別分類。

為什麼不對:Sigmoid 輸出 0-1 之間的單一數值,代表「屬於正類的機率」,只適合二元分類(survived=0 或 1)。多類別分類(例如辨識 10 種數字)需要 Softmax,它輸出每個類別的機率,且所有類別的機率加起來等於 1。Titanic 預測「存活/死亡」正是典型的二元分類,用 Sigmoid 完全正確。

誰會選錯:誤以為 Sigmoid 可以輸出多個類別的機率,或者記混了 Sigmoid 和 Softmax 的用途。

06 變形

同個考點下次怎麼變形

變形 1 加寬網路

直覺:如果把第一個 Dense(10) 改成 Dense(64),空格 1 的參數量變成多少?

答案:9×64+64 = 576+64 = 640。第二層 Dense(10) 的輸入也從 10 變成 64,參數 = 64×10+10 = 650。網路加寬讓第一層和第二層的參數都大幅增加。

變形 2 換成多類別

直覺:如果把這個網路改成 10 分類(如 digits 資料集),最後一層要怎麼改?

答案:把 Dense(1, activation="sigmoid") 改成 Dense(10, activation="softmax"),損失函數從 binary_crossentropy 改成 categorical_crossentropy(或 sparse_categorical_crossentropy 取決於標籤格式)。最後一層參數 = 10×10+10 = 110。

變形 3 ReLU 的優勢

直覺:為什麼隱藏層用 ReLU 而不用 Sigmoid?

答案:1. 計算快:max(0,x) 比 e^(-x) 的指數運算快很多。2. 不會梯度消失:Sigmoid 在 |x| 很大時梯度趨近 0(飽和),ReLU 在正區間梯度固定為 1。3. 稀疏激活:負數輸出 0,讓網路更稀疏,減少過擬合。主要缺點是「神經元死亡」(dying ReLU):如果某神經元的輸入始終為負,它永遠輸出 0,梯度也是 0,無法恢復。

變形 4 bias=False 影響

直覺:如果把 Dense(10) 設定 use_bias=False,參數量怎麼變?

答案:第一層:9×10 = 90(減少 10 個 bias);第二層:10×10 = 100(減少 10 個 bias)。雖然參數減少,但少了 bias 可能降低模型的表達能力,通常不推薦除非有特殊理由(例如使用 BatchNorm 後 bias 的效果被 BN 的 gamma/beta 取代)。

變形 5 損失函數選擇

直覺:binary_crossentropy 和 mean_squared_error 都可以用於 Titanic 存活預測嗎?

答案:技術上兩者都能跑,但 binary_crossentropy 是二元分類問題的最佳選擇:它對機率的偏差更敏感(對數尺度),訓練收斂更快。mean_squared_error 用於迴歸問題,若用於分類,損失函數不對應機率分佈,梯度傳播效果較差,收斂更慢、效果更差。

07 延伸

想再往下看,這 5 個

出處

iPAS 經濟部產業人才能力鑑定 ・ 114 年第二梯次 iPAS AI 應用規劃師 中級 科目三 機器學習技術與應用 第 49 題

查看官方原文 PDF