Dropout 是一種在深度學習中廣泛使用的正則化(Regularization)技術,其核心目的是為了解決過擬合(Overfitting)問題。過擬合發生在模型在訓練數據上表現極佳,但在未見過的測試數據上性能卻大幅下降的情況。Dropout 通過在訓練過程中隨機“丟棄”(即暫時忽略)神經元,有效地防止了神經網絡對訓練數據的過度依賴和協同適應性,從而提高了模型的泛化能力。
Dropout 的名字直譯為“丟棄”,顧名思義,它在每次訓練迭代時,會以一定的概率 p 隨機地將隱藏層(Hidden Layers)或可學習層中的部分神經元及其連接暫時移除。
然而,為了保持期望輸出的尺度(Scale)一致性,需要對神經元的輸出進行縮放(Scaling)。如果訓練時使用的丟棄概率是 p,那麼在測試時,所有神經元的權重或輸出需要乘以 (1−p) 來進行調整,以補償訓練時部分神經元的缺失。
Dropout 是一種簡單而高效的正則化技術,通過在訓練時隨機丟棄神經元,迫使網絡學習更分散、更魯棒的特徵表示,從而顯著提高模型的泛化能力並抑制過擬合。在深度學習,特別是大型且複雜的模型中,Dropout 已經成為一個不可或缺的標準組件。
import tensorflow as tf
# 定義一個線性運算與 Dropout 層的網路
def MakeNN(inputs, in_size, out_size, keep_prob, activation_function=None):
# 權重 W:in_size * out_size 的矩陣,使用標準差為 0.1 的隨機正態分佈初始化
Weights = tf.Variable(tf.random.normal([in_size, out_size], stddev=0.1))
# 偏置 b:1 * out_size 的向量,初始化為 0.1
biases = tf.Variable(tf.zeros([1, out_size]) + 0.1)
# 線性運算:W*X + b
# tf.matmul(inputs, Weights) 執行矩陣乘法 W*X (程式碼中為 X*W)
Wx_plus_b = tf.matmul(inputs, Weights) + biases
# 應用 dropout
Wx_plus_b = tf.nn.dropout(Wx_plus_b, keep_prob)
# 判斷是否有激活函數
if activation_function is None:
# 如果沒有設置激活函數,則直接把帶有 dropout 的線性運算結果傳出去
outputs = Wx_plus_b
else:
# 如果設置了激活函數,則由此激活函數對信號進行傳遞
outputs = activation_function(Wx_plus_b)
return outputs
# 模擬輸入 X:(1, 784) 的向量,使用正態分佈隨機生成
X = tf.random.normal([1, 784])
# 調用 MakeNN 函數
ModelOut = MakeNN(X, 784, 10, 0.5, tf.nn.relu)
print(ModelOut)
隨機產生的數值,其中一些會是 0