ReLU 是否无法解决某些问题?

人工智能 神经网络 激活函数 函数逼近 雷路 乙状结肠
2021-11-12 00:40:58

背景

几年来我一直对神经网络感兴趣并阅读它们,但直到最近我才开始测试它们。

为了好玩和增加我的理解,我尝试在 .Net 中从头开始编写一个类库。对于测试,我尝试了一些简单的函数,例如生成与输入相同的输出,使用 MNIST 数据集,以及一些二进制函数(两个输入 OR、AND 和 XOR,有两个输出:一个为真,一个为错误的)。

当我使用sigmoid函数作为激活函数时,一切似乎都很好,但是,在阅读了 ReLUs 之后,我决定切换到速度。

问题

我目前的问题是,当我切换到使用 ReLU 时,我发现我无法训练任何复杂的网络(从 2 个内部节点到 100x100 节点的网格进行测试)以正确地用作 XOR 门.

我在这里看到两种可能性:

  1. 我的实现是错误的。(这很令人沮丧,因为我已经以各种方式多次重写了代码,但我仍然得到相同的结果)。

  2. 除了训练更快或更慢之外,在给定特定激活函数的情况下,还有一些问题是无法解决的。(有趣的想法,但我不知道这是不是真的)。

我倾向于认为上面的 1) 是正确的。但是,考虑到我投入的时间量,如果我能在我花更多时间进行实施之前明确排除 2),那就太好了。

更多细节

对于 XOR 网络,我尝试使用两个输入(0 表示假,1 表示真)和使用四个输入(每一对,一个信号真,一个假,每个“位”输入)。我还尝试使用 1 个输出(其中 1(实际上,>0.9)对应于真,0(或 <0.1)对应于假),以及两个输出(一个表示真,另一个表示假)。

每个训练时期,我针对一组 4 个输入运行{(00,0),(01,1),(10,1),(11,0)}.

我发现前三个收敛到正确答案,但最终输入 (11) 收敛到 1,即使我用期望值 0 训练它。

3个回答

有多种可能的事情可能是错误的,但让我给你一些可能有用的信息。

具有 ReLU 激活函数的神经网络是图灵完备的,其计算步骤与网络包含的节点一样多——对于循环网络(RNN),这意味着与任何有限计算机相同的图灵完备程度。换句话说,对于您想要计算的任何函数/算法,您可以设计一个神经网络,可能是循环的,它将近似/计算它。

例如,假设我们要计算NOR函数,该函数可用于实现图灵机。我们可以使用以下具有 ReLU 激活函数的神经网络来做到这一点。

让输入为

W=[x1  x2]

权重矩阵为

W=[2020]

和偏差是

b=[1]

然后 ReLU 单元(或神经元)执行以下操作

o=max(Wx+b,0)

所以,o=1只有当两者x1x20,否则,它总是0.

然而,梯度下降是搜索 RNN 的一种挑剔方式。它可能以多种方式失败。一般来说,一旦你非常彻底地检查了你的梯度,我会确保使用 Adam 作为优化器,然后无休止地使用超参数,直到我找到一个有效的咒语。

为了进一步了解对这一级别深度学习能力限制的一般理解,我推荐 Ilya Sutskever 的这篇博文,他现在是一名 OpenAI 研究员:http: //yyue.blogspot.com/2015/01/a-brief-overview -of-deep-learning.html?m=1

虽然我还没有确定是否存在 ReLU 无法解决的问题,但我在文献中找到了大量文档,表明 XOR 可以用少至 1 个隐藏节点来解决。

解决方案比我想象的要简单。输出层需要连接,不仅是到中间层,还需要直接到输入层。这允许网络有效地训练 XOR。

最后一点,XOR 对学习率非常敏感。本质上,无论适合 AND 和 OR 函数的学习率,大约 1000 倍都太大而无法有效地训练 XOR。

我尝试使用 2 个基于 ReLU 的隐藏单元,1 个输出单元来解决 XOR 问题,发现训练 1000 次后梯度总是会变得非常小。

损失与训练时间:

在此处输入图像描述

渐变看起来像:

在此处输入图像描述

我认为这意味着单位都死了。解决这个问题的稳健方法是增加单元的数量。

当谈到 4 个单位时,有时我会成功,但有时不会。

5个单位,我会失败,但速度会降低。

在此处输入图像描述

等等。就这些。

我将尝试使用 sigmoid + 交叉熵而不是 ReLU,我想线性函数在这种情况下会更好地工作。