所有类别的概率相同

数据挖掘 分类 多标签分类 权重初始化
2022-03-13 17:00:22

我实现了一个形状为 [783(输入)、128(隐藏层)和 10(输出)] 的全连接 MLP,隐藏层有一个 sigmoid 激活函数,输出一个 sofmax。

我用 keras 的数据集进行了测试:分类服装图像

起初,无论输入如何,所有出口的输出都是 0.1。然后我阅读了这篇文章,因为有人询问了权重初始化,所以我将权重初始化从 [0, 1) 之间的正态分布更改为 [-1, 1)。之后我的网络开始工作。

为什么会这样?我相信 0.1 的预测是某种局部最小值,因为它只是表示所有人的概率相同,至少如果您对数据一无所知,这是有道理的。但为什么?我很想被引用一篇讨论这个问题以及如何防止它的论文,因为我现在正在尝试使用另一个数据集并且我遇到了同样的问题(但这次我无法让它工作。我什至尝试 Xavier 初始化和仍然没有好的结果)。

1个回答

假设您按照教程中所做的那样对像素值进行了归一化,您的输入是 0 和 1 之间的数字向量。现在,如果您的权重矩阵也是 0 和 1 之间的随机绘制的数字,则隐藏层的输入将是介于 0 和 1 之间的 783 个数字的总和,即可能大于 100。现在,检查 sigmoid 函数及其导数

在此处输入图像描述

如您所见,输入值 > 5 时它会很快饱和。如果您选择初始化,所有隐藏神经元应该非常接近 1,同时导数应该非常接近 0。这可以解释 softmax 的所有输出如何同样接近 0.1,并且由于梯度接近于零,网络可能没有学到任何东西。

一旦您将权重初始化更改为介于 -1 和 1 之间的值,隐藏层的输入应该是数字之和,在 0 附近相当均匀地分布,因此 sigmoid 输出约为 0.5,最重要的是,梯度不为零,所以你的网络实际上得到了训练。

正如您已经注意到的,明智地选择初始化对于获得良好的结果至关重要。初始化还应该考虑输入神经元的数量,否则你以这样一种方式初始化网络,梯度将接近于零。

如果您没有正确规范化输入数据,例如,如果您将 0 到 255 之间的像素值直接提供给模型,则可能会出现类似的问题。

我不确定这方面的论文,但可能从关于Glorot 初始化的原始工作开始,或者检查Tensorflow必须提供的初始化程序。在该站点的“函数”下,它们列出了常见的初始化程序并链接到相应的论文。

我希望这可以帮到你。