一、為什麼需要正則化
當神經網絡的層數和參數量增加時,模型容易出現過擬合的情況,即在訓練集上的準確率高於在測試集上的準確率,導致模型泛化性能不佳。因此,需要使用正則化方法來緩解過擬合問題。
常見的正則化方法包括L1正則化和L2正則化。
import tensorflow as tf
from tensorflow.keras import layers
model = tf.keras.Sequential([
# 添加一層L1正則化,指定正則化強度為0.01
layers.Dense(64, activation='relu', kernel_regularizer=tf.keras.regularizers.l1(0.01)),
layers.Dense(64, activation='relu'),
layers.Dense(10, activation='softmax')
])
二、L1正則化
L1正則化通過在損失函數中添加權重的絕對值之和來懲罰模型的複雜度,可以使得一部分權重變為0,從而實現特徵選擇的效果。
L1正則化的數學公式為:
Loss = 原始損失函數 + λ * ∥w∥1
其中λ為正則化強度,w為權重參數,∥w∥1為權重的L1範數。
import tensorflow as tf
from tensorflow.keras import layers
model = tf.keras.Sequential([
# 添加一層L1正則化,指定正則化強度為0.01
layers.Dense(64, activation='relu', kernel_regularizer=tf.keras.regularizers.l1(0.01)),
layers.Dense(64, activation='relu'),
layers.Dense(10, activation='softmax')
])
三、L2正則化
L2正則化通過在損失函數中添加權重的平方和來懲罰模型的複雜度,可以使得所有權重都趨向於較小的值。
L2正則化的數學公式為:
Loss = 原始損失函數 + λ/2 * ∥w∥22
其中λ為正則化強度,w為權重參數,∥w∥2為權重的L2範數。
import tensorflow as tf
from tensorflow.keras import layers
model = tf.keras.Sequential([
# 添加一層L2正則化,指定正則化強度為0.01
layers.Dense(64, activation='relu', kernel_regularizer=tf.keras.regularizers.l2(0.01)),
layers.Dense(64, activation='relu'),
layers.Dense(10, activation='softmax')
])
四、Dropout正則化
Dropout正則化是一種隨機失活的方法,通過在訓練過程中隨機丟棄一部分神經元的輸出來降低複雜度,從而緩解過擬合問題。
Dropout正則化的數學公式為:
Output = Dropout(Input, keep_prob)
其中Input為輸入張量,keep_prob為保留概率,即留下的神經元輸出的概率。
import tensorflow as tf
from tensorflow.keras import layers
model = tf.keras.Sequential([
layers.Dense(64, activation='relu'),
# 添加一層Dropout正則化,指定保留概率為0.5
layers.Dropout(0.5),
layers.Dense(64, activation='relu'),
layers.Dropout(0.5),
layers.Dense(10, activation='softmax')
])
五、BatchNormalization正則化
BatchNormalization正則化是通過對每一批樣本的輸出進行歸一化來緩解過擬合問題,可以使得模型對輸入數據的變化更加魯棒,縮短訓練時間。
BatchNormalization正則化的數學公式為:
Output = γ * (Input – μ) / σ + β
其中Input為輸入張量,μ和σ為當前批次所有樣本的均值和標準差,γ和β為可訓練的縮放係數和平移係數。
import tensorflow as tf
from tensorflow.keras import layers
model = tf.keras.Sequential([
layers.Dense(64, activation='relu'),
# 添加一層BatchNormalization正則化
layers.BatchNormalization(),
layers.Dense(64, activation='relu'),
layers.BatchNormalization(),
layers.Dense(10, activation='softmax')
])
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/160926.html