使用 Sigmoid 激活函数训练 MNIST 数据集

Training MNIST dataset with Sigmoid Activation function

根据 this tutorial,使用 PythonNumpy,我想将 MNIST 数据集训练成可以识别手写数字的神经网络。我理解逻辑,但我现在有问题。

本教程中的测试用例是 AND 逻辑门,由于数据量小,它运行良好。但是我正在使用 MNIST 数据库并且每个图像都有 28*28 维度,当我将它们中的每一个转换为矢量时,我有 N*784 矩阵。如果我有一个 784*1 矩阵作为 weight matrix,当我将它与输入矩阵相乘时,结果数字将非常小或非常大(负或正),因为我使用 Sigmoid 激活函数,我所有的数据在第一个学习周期分为两部分,1 和 0,但我需要小数字,收敛速度慢。

例如,我在乘法后得到这些数字:-569.87541502218.62477264,第一个在 Sigmoid 激活函数中为 0,第二个为 1,并且没有空间用于训练和收敛。所有这一切都是因为大量的数据,它们的总和导致了如此大或非常小的数字。

我使用这个技巧来生成比原始教程小的权重,但我得到了相同的结果(我在想,因为这些都是小数字,它们的总和不会很大,但我得到了相同的结果) :

syn0 = (2*np.random.random((784,10))-1)*(0.00000005-0.00000001) + 0.00000001

我不知道该如何克服。

解决方案:

确保预处理您的输入。

如果您的输入像素在 [0, 255] 范围内,最好将它们重新调整为 [0.0, 1.0]。这在大多数情况下就足够了。

更高级的方法是使用 batch normalization

确保以标准化方式初始化权重矩阵。

所谓归一化,是指权重矩阵的784维列向量中的每一个都应该有一个固定的L2范数。对于简单的设置,您可以将它们标准化为 1。

权重矩阵初始化是一个研究课题,例如使用 glorot initialization 往往会为深度网络显示更好的结果。