iT邦幫忙

2026 iThome 鐵人賽

DAY 21
0
AI Engineering

從 Pixel 到 AI:30 天影像辨識入門之路系列 第 21 篇

Day21 Learning Rate 太大、太小會怎樣?模型為什麼學不動?

  • 分享至 

  • xImage
  •  

前幾天我們陸續調整了 Epoch、Early Stopping 和 Batch Size,但模型在訓練時,還有一個非常重要的問題:

每次根據 Loss 更新 Weight 時,到底應該「改多少」?

如果每次只調整一點點,模型可能學得非常慢;但如果一次調整太多,又可能直接錯過比較好的方向。

而控制模型每次更新幅度的重要參數,就是今天要介紹的:Learning Rate(學習率)


一、Learning Rate 是什麼?

前面介紹 Loss 時,我們知道模型大致會重複下面的過程:

輸入圖片
↓
模型預測
↓
計算 Loss
↓
計算參數需要調整的方向
↓
更新 Weight
↓
再次預測

但知道「往哪個方向調整」之後,還有另一個問題就是這一次到底要調整多少?

這就是 Learning Rate 會影響的地方

Learning Rate 決定模型每次更新參數時,調整的步伐有多大


二、用下山來理解 Learning Rate

假設我們現在站在一座山上,而山谷最低的位置代表比較低的 Loss,我們的目標就是從目前位置到最低點,模型會根據目前的方向一步一步往比較低的位置移動

Learning Rate 就很像是在規範我們每一步要跨多大步,如果步伐適當,就可以逐漸靠近比較低的 Loss。

但如果步伐太小或太大,都可能出現問題。


三、Learning Rate 太小會怎樣?

假設 Learning Rate 非常小:learning_rate=0.00001,模型每次更新 Weight 時,只會改變非常小的幅度

就像爬山時方向可能沒有錯,但是每一步都非常小,因此可能需要非常多次更新,才能逐漸接近比較好的位置。

訓練時可能會看到 Loss 有下降,但是下降得很慢,或是 Accuracy 有上升,但是改善速度很慢,也就是模型不是完全沒有學習,而是學得太慢


四、Learning Rate 太大又會怎樣?

那如果我們把 Learning Rate 設得非常大呢?
例如 learning_rate=0.1,每次更新參數時,模型就會跨出很大一步。

模型明明想往 Loss 比較低的地方移動,卻因為每一步太大,不斷跨過比較好的位置。

因此 Loss 可能一下下降,一下上升,一下又下降,甚至可能無法穩定收斂,所以 Learning Rate 太大,不代表模型會學得比較快,步伐太大反而可能讓模型難以靠近適合的位置。


五、什麼是 Convergence?

這裡就會遇到另一個常見的名詞:Convergence(收斂)

模型剛開始訓練時,Weight 還沒有學好,因此 Loss 通常比較高。

隨著模型不斷更新參數,如果訓練逐漸趨於穩定,可以說模型的最佳化過程正在逐漸收斂,而 Learning Rate 就會直接影響這個過程。

Learning Rate 太小可能收斂得很慢,Learning Rate 太大,可能產生較大的震盪,甚至難以穩定收斂

適當的 Learning Rate 有機會較穩定地降低 Loss


六、我們之前的 Learning Rate 是多少?

前面的 CNN 都是這樣寫:

model.compile(optimizer="adam",loss="sparse_categorical_crossentropy",metrics=["accuracy"])

我們並沒有自己設定 Learning Rate,這種情況下,Keras 會使用 Adam Optimizer 的預設 Learning Rate。

但今天既然要觀察 Learning Rate 的影響,我們就把它明確寫出來:

optimizer = tf.keras.optimizers.Adam(learning_rate=0.001)

再放進:

model.compile(optimizer=optimizer,loss="sparse_categorical_crossentropy",metrics=["accuracy"])

這樣就可以自己控制 Learning Rate。


七、實際比較三種 Learning Rate

和上一篇 Batch Size 一樣,這次也不要直接猜哪個比較好。

我們實際比較:

Learning Rate = 0.0001
Learning Rate = 0.001
Learning Rate = 0.01

這三個數值分別相差 10 倍,可以比較清楚地觀察 Learning Rate 改變後的訓練情況。

為了公平比較:Dataset、CNN 架構、Batch Size、Early Stopping 都設相同
主要改變的只有:Learning Rate


八、修改 create_model()

上一篇我們已經把 CNN 寫成 create_model(),今天稍微修改一下,讓它可以接收不同的 Learning Rate:

import tensorflow as tf

# 建立 CNN Model
# learning_rate 可以由外面傳入不同的數值
def create_model(learning_rate):

    model = tf.keras.Sequential([

        # 輸入圖片
        tf.keras.layers.Input(shape=(64, 64, 3)),
        tf.keras.layers.Conv2D(32,kernel_size=(3, 3),activation="relu",padding="same"),
        tf.keras.layers.MaxPooling2D(pool_size=(2, 2)),
        tf.keras.layers.Conv2D(64,kernel_size=(3, 3),activation="relu",padding="same"),
        tf.keras.layers.MaxPooling2D(pool_size=(2, 2)),
        tf.keras.layers.Flatten(),
        tf.keras.layers.Dense(128,activation="relu"),
        tf.keras.layers.Dense(7,activation="softmax")
    ])

    # 設定 Adam Optimizer 的 Learning Rate
    optimizer = tf.keras.optimizers.Adam(learning_rate=learning_rate)

    model.compile(optimizer=optimizer,loss="sparse_categorical_crossentropy",metrics=["accuracy"])

    return model

這樣我們就可以:

create_model(0.0001)
create_model(0.001)
create_model(0.01)

建立三個架構相同、Learning Rate 不同的 CNN。


九、設定 Learning Rate

這邊示範比較小的 Learning Rate,剩下兩個的寫法相同

from tensorflow.keras.callbacks import EarlyStopping

model_lr_0001 = create_model(0.0001)

early_stopping_0001 = EarlyStopping(monitor="val_loss",patience=3,restore_best_weights=True)

history_lr_0001 = model_lr_0001.fit(X_train,y_train,validation_data=(X_val, y_val),epochs=50,batch_size=32,callbacks=[early_stopping_0001])

十、把三個 Learning Rate 的 Loss 畫在一起

這一篇我們主要想觀察的是模型「學習」與「收斂」的過程,因此比起只看 Accuracy,我更想先看看 Validation Loss。

import matplotlib.pyplot as plt

plt.plot(history_lr_0001.history["val_loss"],label="Learning Rate = 0.0001")
plt.plot(history_lr_001.history["val_loss"],label="Learning Rate = 0.001")
plt.plot(history_lr_01.history["val_loss"],label="Learning Rate = 0.01")
plt.xlabel("Epoch")
plt.ylabel("Validation Loss")
plt.title("Validation Loss with Different Learning Rates")

plt.legend()
plt.show()

https://ithelp.ithome.com.tw/upload/images/20261003/201692511J2U0CcMho.png

  • Learning Rate = 0.0001
    Validation Loss 從約 1.01 緩慢下降,後期大約維持在 0.79 左右。整體下降相對穩定,但需要較多 Epoch 才逐漸降低,表示 Learning Rate 較小時,每次參數更新的幅度也比較小。

  • Learning Rate = 0.001
    Validation Loss 下降得比較快,從約 0.90 降到最低約 0.75。雖然後面稍微回升,但在這次實驗中達到了三組設定中最低的 Validation Loss。

  • Learning Rate = 0.01
    一開始的 Validation Loss 接近 1.2,雖然很快下降,但後續出現較明顯的上下波動,最低大約只有降到 0.91 左右,之後又開始上升。相較另外兩組,整體 Validation Loss 也比較高。

這次的結果剛好可以看出 Learning Rate 對模型學習過程的影響,因此,Learning Rate 並不是越大,模型就一定學得越快、越好。

在這次 HAM10000 CNN 的實驗中,0.001 的 Validation Loss 表現較好;0.0001 的下降速度較慢,而 0.01 則出現較明顯的波動。

不過這只是這次模型與資料設定下的實驗結果,不能因此認為 0.001 適合所有模型。不同的模型架構、Dataset、Batch Size 或 Optimizer,都可能讓適合的 Learning Rate 不同。


十一、再比較 Test Accuracy

最後一樣使用相同的 Test Data 評估三個模型:

跑完後的結果如下:
https://ithelp.ithome.com.tw/upload/images/20261003/20169251I3lCtoyX5t.png

從結果可以看到,0.001 得到最高的 Test Accuracy,約為 74.97%;而 Learning Rate 提高到 0.01 後,Accuracy 降到 68.34%,Loss 也明顯增加。

這次實驗可以看出,Learning Rate 並不是越大越好。太大的 Learning Rate 可能讓模型更新幅度過大,使訓練較不穩定;適合的 Learning Rate 還是需要透過實際實驗比較。

十二、Learning Rate 大小整理

Learning Rate 可能出現的情況
太小 每次參數更新幅度小,Loss 可能下降得較慢
太大 更新幅度太大,Loss 可能明顯震盪,甚至難以穩定收斂
適當 能以較穩定的方式降低 Loss

上一篇
Day20 Batch Size 要設 16、32 還是 64?實際跑給你看
下一篇
Day22 Adam、SGD 到底選誰?Optimizer 實驗比較
系列文
從 Pixel 到 AI:30 天影像辨識入門之路 共 22 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言