為什麼神經網絡很難學習恆等函數?
我想看看神經網絡是否可以使用 MNIST 手寫數據集來學習恆等函數。
這是完整的代碼
import keras from keras.datasets import mnist from keras.models import Sequential from keras.layers import Dense from keras.optimizers import RMSprop batch_size = 128 epochs = 20 (x_train, y_train), (x_test, y_test) = mnist.load_data() x_train = x_train.reshape(60000, 784) x_test = x_test.reshape(10000, 784) model = Sequential() model.add(Dense(784, activation='relu', input_shape=(784,))) model.add(Dense(784, activation='relu')) model.add(Dense(784, activation='relu')) model.add(Dense(784, activation='relu')) model.summary() model.compile(loss='mean_squared_error', optimizer=RMSprop(), metrics=['mean_absolute_percentage_error']) history = model.fit(x_train, x_train, batch_size=batch_size, epochs=epochs, verbose=1, validation_data=(x_test, x_test)) score = model.evaluate(x_test, x_test, verbose=0) print('Test loss:', score[0]) print('Test MAPE:', score[1])
和輸出
**4 dense layers** Epoch 20/20 60000/60000 [==============================] - 50s 840us/step - loss: 456.7581 - mean_absolute_percentage_error: 351097677.7045 - val_loss: 523.7151 - val_mean_absolute_percentage_error: 504905991.0656 Test loss: 523.7150838867187 Test MAPE: 504905988.5056
我無法完全理解的是為什麼培訓無法找到問題的完美解決方案,以及為什麼要花這麼長時間才能接近它?即使只有一個密集層,也無法找到確切的解決方案:
**1 dense layer** Epoch 20/20 60000/60000 [==============================] - 16s 268us/step - loss: 180.6187 - mean_absolute_percentage_error: 209296481.2373 - val_loss: 167.9543 - val_mean_absolute_percentage_error: 192590419.9936 Test loss: 167.954341796875 Test MAPE: 192590420.1984
從概念上講,我可以看到有一個解決方案空間(不僅僅是精確的恆等函數),因為在所有圖像中可能有一些像素具有相同的值,這些像素可以在訓練集中毫無損失地交換(例如,0 在邊緣附近)。知道這是一個局部最小值,我可以從中學到什麼來指導我,而不是玩超參數,直到找到更好的東西?
對於單個示例,該網絡將 784 個元素的向量作為其輸入。所以改寫OP帖子中的問題,他們希望學習該功能
$$ f(x) = Ix $$
在哪裡 $ I $ 是個 $ 784\times 784 $ 單位矩陣。
這個模型不可能完美契合
1 層網絡可能更容易,因為與其嘗試通過四個非線性“排列”四個權重矩陣,它只需排列一個,即更容易在 $ W_1, b_1 $ 為了
$$ Ix = g(W_1 x+b_1). $$
但即使是簡單的表達 $ Ix = g(W_1 x+b_1) $ 應該是一個明顯的警告,試圖找到一個完美的擬合是愚蠢的差事,因為它試圖用非線性函數逼近線性函數。特別是,由於 ReLU 的定義方式,任何 $ x<0 $ 設置為 0,因此當任何元素 $ x $ 是負面的。
UAT 是一個近似定理
事實上,對於非線性激活的任何選擇 $ g $ ,我可以找到一個 $ x $ 誤差為正的。那麼有趣的問題就變成了“我們能不能擬合一個模型,使得誤差最多 $ \epsilon $ 為了 $ x $ 在某個區間 $ \mathcal{I} $ ?” 這個問題的陳述或多或少與 UAT 的警告兼容。它還為我們指明了一個更有利可圖的方向:我們希望在輸入處於某些狀態時找到最小的錯誤,而不是尋求 0 錯誤。間隔。
換句話說,關於神經網絡的定理並不能保證您可以實現 0 誤差,它們保證您可以在某個區間內(受某些條款和條件)限制輸入的誤差。
UAT 沒有評論訓練任何特定網絡是否容易。
實際上找到實現最小誤差的權重和偏差是一個非常具有挑戰性的問題。特別是,我們沒有太多理由相信這段代碼片段中對初始化、優化器、學習率和 epoch 數等的選擇最適合這項任務。
這個優化問題很難
具有 ReLU 激活的四層網絡 $ g(x)=\max{0, x} $ 是(誰)給的
$$ h(x)=g(W_4g(W_3g(W_2g(W_1x+b_1)+b_2)+b_3)+b_4). $$
所以你在你的問題中尋求的是解決方案 $ W_i, b_i $ 這樣 $$ Ix = g(W_4g(W_3g(W_2g(W_1x+b_1)+b_2)+b_3)+b_4) $$ 對所有人 $ x $ , 在哪裡 $ W_i, b_i $ 有適當的形狀。
嘗試和解決這看起來並不是特別友好。事實上,鑑於我對 UAT 的評論,我們將不得不重申這一點以限制錯誤並關注輸入間隔。
即使我們以這種方式重述這個問題,從梯度下降的角度來看,它仍然具有挑戰性,因為ReLU 的消亡現象、梯度下降的弱點以及由於輸入規模導致的優化任務條件不佳。
調整神經網絡是使用神經網絡的主要部分。