我的新書AI 職場超神助手:ChatGPT 與生成式 AI 一鍵搞定工作難題的教材投影片已製作完成
歡迎各位有需要的教師和博碩文化索取教材

模型的權重與偏差值

偏差值的功能

偏差值 在神經網絡中扮演著一個非常重要的角色,它就像是一個額外的參數,讓模型能夠更靈活地擬合數據。

  • 調整激活函數的輸出範圍:
    • 想像一下,激活函數就像是一個門檻,只有當輸入超過這個門檻時,神經元才會被激活。偏差值就像調整這個門檻的高度,讓神經元更容易或更難被激活。
    • 舉例來說,如果我們希望神經元在輸入較小的值時就更容易被激活,就可以增加偏差值。
  • 增加模型的表達能力:
    • 偏差值的存在,讓模型可以學習到更複雜的模式。
    • 它就像是在模型中加入了一個常數項,使得模型的輸出不總是過原點,而是可以根據數據的分布進行調整。
  • 影響模型的學習過程:
    • 偏差值的初始化值會影響模型的收斂速度和最終的性能。
    • 合理的偏差值初始化可以幫助模型更快地找到最優解。

偏差值與權重的關係

  • 權重 決定了輸入特徵對神經元輸出的影響程度。
  • 偏差 則是對輸出的一個常數偏移。
  • 共同作用:權重和偏差共同決定了神經元的輸出。權重負責提取特徵,而偏差則負責調整輸出範圍。

神經元的權重與偏差

在神經網絡中,權重 (weight) 和偏差 (bias) 是模型的兩個重要參數。

權重 (weight) 指的是神經網絡中的輸入層和輸出層之間的連接強度。每個神經元都有一個權重矩陣,表示與該神經元相連的輸入張量的強度。輸入張量與輸出張量之間的權重越大,該神經元對輸出的貢獻就越大。

偏差 (bias) 指的是神經網絡中的偏移量。每個神經元都有一個偏差值,表示該神經元的輸出在不考慮輸入的情況下的預設值。偏差值可以控制神經網絡的輸出範圍,並且可以用於控制模型的準確性。

在訓練神經網絡模型時,通常會使用梯度下降法來調整權重和偏差的值,以使得模型的輸出與真實值的差異最小。

設定神經元的偏差值

在訓練神經網絡模型時,通常可以自己設定神經元的偏差值。

例如,在 TensorFlow 中可以使用以下方式創建一個帶有偏差的神經元:

import tensorflow as tf

# 創建一個帶有偏差的神經元
neuron = tf.keras.layers.Dense(units=1, bias_initializer=tf.constant_initializer(1.0))

上面使用了 bias_initializer 參數指定了偏差的初始值為 1.0。

使用梯度下降法調整偏差值

在訓練神經網絡模型時,通常會使用梯度下降法來調整偏差的值,以使得模型的輸出與真實值的差異最小。通常會使用 TensorFlow 的自動微分機制來計算模型的梯度,並使用梯度下降法調整偏差的值。

簡單範例

import tensorflow as tf

# 創建一個帶有偏差的神經元
neuron = tf.keras.layers.Dense(units=1, bias_initializer=tf.constant_initializer(1.0))

# 創建模型
model = tf.keras.Sequential([neuron])

# 定義損失函數和優化器
loss_fn = tf.keras.losses.MeanSquaredError()
optimizer = tf.keras.optimizers.SGD(learning_rate=0.1)

# 訓練模型
for epoch in range(10):
  # 訓練數據
  x_train = [1.0, 2.0, 3.0, 4.0]
  y_train = [0.0, 0.0, 0.0, 0.0]

  # 將訓練數據放入模型
  for x, y in zip(x_train, y_train):
    with tf.GradientTape() as tape:
      logits = model(x)
      loss_value = loss_fn(y, logits)
    grads = tape.gradient(loss_value, model.trainable_variables)
    optimizer.apply_gradients(zip(grads, model.trainable_variables))

# 檢查神經元的偏差值
print(neuron.bias)  # 輸出: [0.9]

最後我們檢查了神經元的偏差值,可以看到它已經從 1.0 調整到了 0.9。

手動設定神經元的偏差值

以下為一個簡單範例

import tensorflow as tf

# 創建一個帶有偏差的神經元
neuron = tf.keras.layers.Dense(units=1, bias_initializer=tf.constant_initializer(1.0))

# 創建模型
model = tf.keras.Sequential([neuron])

# 定義損失函數和優化器
loss_fn = tf.keras.losses.MeanSquaredError()
optimizer = tf.keras.optimizers.SGD(learning_rate=0.1)

# 訓練模型
for epoch in range(10):
  # 訓練數據
  x_train = [1.0, 2.0, 3.0, 4.0]
  y_train = [0.0, 0.0, 0.0, 0.0]

  # 將訓練數據放入模型
  for x, y in zip(x_train, y_train):
    with tf.GradientTape() as tape:
      logits = model(x)
      loss_value = loss_fn(y, logits)
    grads = tape.gradient(loss_value, model.trainable_variables)
    optimizer.apply_gradients(zip(grads, model.trainable_variables))

# 檢查神經元的偏差值
print(neuron.bias)  # 輸出: [0.9]

# 手動設定神經元的偏差值
neuron.bias.assign([1.0])

# 再次檢查神經元的偏差值
print(neuron.bias)  # 輸出: [1.0]


17年資歷女工程師,專精於動畫、影像辨識以及即時串流程式開發。經常組織活動,邀請優秀的女性分享她們的技術專長,並在眾多場合分享自己的技術知識,也活躍於非營利組織,辦理活動來支持特殊兒及其家庭。期待用技術改變世界。

如果你認同我或想支持我的努力,歡迎請我喝一杯咖啡!讓我更有動力分享知識!