为什么神经网络很难学习恒等函数?

机器算法验证 机器学习 神经网络 喀拉斯
2022-03-17 16:52:39

我想看看神经网络是否可以使用 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 在边缘附近)。知道这是一个局部最小值,我可以从中学到什么来指导我,而不是玩超参数,直到找到更好的东西?

1个回答

对于单个示例,该网络将 784 个元素的向量作为其输入。所以改写OP帖子中的问题,他们希望学习该功能

f(x)=Ix

其中单位矩阵。I784×784

这个模型不可能完美契合

1 层网络可能更容易,因为与其尝试通过四个非线性“排列”四个权重矩阵,它只需排列一个,即更容易在中找到近似值W1,b1

Ix=g(W1x+b1).

但即使是简单的表达式也应该是一个明显的警告,即试图找到一个完美的拟合是愚蠢的差事,因为它试图用非线性函数逼近线性函数。特别是,由于 ReLU 的定义方式,任何都设置为 0,的任何元素为负时,该模型永远不会实现 0 错误。Ix=g(W1x+b1)x<0x

UAT 是一个近似定理

实际上,对于非线性激活的任何选择,我都可以找到一个误差为正那么有趣的问题就变成了“我们可以拟合一个模型,以便在某个区间内,对于吗?” 这个问题的陈述或多或少与 UAT 的警告兼容。它还为我们指明了一个更有利可图的方向:我们希望在输入处于某个区间时找到最小的错误,而不是寻求 0 错误。gxϵxI

换句话说,关于神经网络的定理并不能保证您可以实现 0 误差,它们保证您可以在某个区间内(受某些条款和条件)限制输入的误差。

UAT 没有评论训练任何特定网络是否容易。

实际上找到实现最小误差的权重和偏差是一个非常具有挑战性的问题。特别是,我们没有太多理由相信这段代码片段中对初始化、优化器、学习率和 epoch 数等的选择最适合这项任务。

这个优化问题很难

的四层网络由下式给出g(x)=max{0,x}

h(x)=g(W4g(W3g(W2g(W1x+b1)+b2)+b3)+b4).

因此,您在问题中寻求的是解决方案使得 对于所有,其中具有适当的形状。Wi,bi

Ix=g(W4g(W3g(W2g(W1x+b1)+b2)+b3)+b4)
xWi,bi

尝试和解决这看起来并不是特别友好。事实上,鉴于我对 UAT 的评论,我们将不得不重申这一点以限制错误并关注输入间隔

即使我们以这种方式重述这个问题,从梯度下降的角度来看,它仍然具有挑战性,因为ReLU 现象的消亡、梯度下降的弱点以及由于输入规模导致的优化任务条件不佳。

调整神经网络是使用神经网络的主要部分。

如果您不想花费大量时间更改超参数,那么您应该使用不同的模型。