我应该标准化我的神经网络中的输入吗?

Posted

技术标签:

【中文标题】我应该标准化我的神经网络中的输入吗?【英文标题】:Should I normalize the inputs in my Neural Network? 【发布时间】:2017-07-05 00:24:56 【问题描述】:

首先是一些上下文。

我正在承担一个非常雄心勃勃的项目,让神经网络能够以不错的水平下棋。我可能不会成功,但我这样做主要是为了学习如何处理这种机器学习。

我决定使用遗传算法训练网络,以便在不同的神经网络在几场国际象棋比赛中相互对抗后微调权重。

每个神经元在数据处理后使用双曲正切 (-1, 1) 对数据进行归一化,但在输入网络之前尚未对输入进行归一化。

我从 Giraffe 国际象棋引擎中获得了一些灵感,尤其是输入。

它们会看起来像这样:

第一层:

剩余白兵数量(0-8)

剩余黑棋数量 (0-8)

剩余白骑士数量 (0-2)

剩余黑骑士数量(0-2)

....

第二层仍与第一层相同:

Pawn 1 的位置(可能有 2 个值,x[0-7] 和 y[0-7]) Pawn 2 的位置

...

女王1的位置 女王2的位置

...

第三层,又是前两层的同一层。数据只会在下一层抽象之后“串扰”。

被 Pawn1 攻击的棋子的值(这将在 0-12 ish 范围内) Pawn2 攻击的棋子数值

...

Bishop1 攻击的棋子的价值

你明白了。

如果你没有,这里有一个糟糕的 Paint 表示我的意思:

问题是:我应该在神经网络读取输入数据之前对其进行归一化吗?

我觉得压缩数据可能不是一个好主意,但我真的没有能力做出决定性的决定。

我希望这里有人能在这个问题上启发我,如果你认为我应该规范化数据,我希望你能提出一些这样做的方法。

谢谢!

【问题讨论】:

请定义你想要规范化的内容? 嗨。我想规范化输入,所以我在问题中列出了什么。例如,棋盘上的棋子数量从 0 到 8 不等,我应该将它与我列出的所有其他输入一起标准化吗? 我对您的 [0 到 8] 的回答是肯定的。请查看我的回答。 我在奥赛罗上做了类似的强化学习project。但是我没有使用计件输入,因为网络可以进行这种推断。我没有使用标准化。由于奥赛罗的搜索空间很小,因此对树搜索的成功相当有限 【参考方案1】:

您不需要对网络内部的任何内容进行规范化。机器学习的重点是训练权重和偏差以学习非线性函数,在您的示例中,它是静态国际象棋评估。因此,您的第二个标准化蓝色垂直条(靠近最终输出)是不必要的。

注意:Hidden layers 是比abstraction layer 更好的术语,所以我将使用它。

隐藏层之前的其他标准化是可选的,但建议使用。这还取决于我们所说的输入

长颈鹿论文在第 18 页写道:

“每个槽都有归一化的x坐标,归一化的y坐标……”

国际象棋有 64 个方格,如果没有归一化,范围将是 [0,1,....63]。这是非常离散的,范围远高于其他输入(稍后会详细介绍)。将它们标准化为更易于管理且与其他输入具有可比性的东西确实有意义。该论文没有说明究竟是如何标准化的,但我不明白为什么 [0...1] 范围不起作用。 标准化棋盘格(或坐标)是有意义的

其他输入,例如棋盘上是否有皇后是真或假,因此不需要归一化。例如,长颈鹿论文在第 18 页写道:

... 乐曲是否存在...

显然,您不会对其进行规范化。

回答您的问题

如果您像在 Giraffe 中一样表示 Piece Count Layer,则不需要进行标准化。但是,如果您更喜欢 [0..8] 中的离散表示(因为国际象棋中可能有 9 个皇后),您可能需要进行归一化。 如果你用棋子表示棋子位置层,你应该像长颈鹿一样进行归一化。 Giraffe 不规范化 Piece Attack Defense Layer 可能将信息表示为 the lowest-valued attacker and defender of each square。不幸的是,该论文没有明确说明这是如何完成的。您的实现可能需要规范化,因此请使用您的常识

在没有任何先验假设的情况下,哪些特征与模型更相关,您应该将它们标准化为可比较的缩放比例。

已编辑

让我回答你的评论。规范化不是正确的术语,您所说的是激活函数(https://en.wikipedia.org/wiki/Activation_function)。归一化和激活函数不是一回事。

【讨论】:

显然 enter 发送评论而不是换行。我的意思是再补充一些。我的印象是神经网络中的每个神经元(除了最后的输出神经元)都应该有某种激活函数,比如 tanh,你是说我在最后一层的神经元中不需要它输出? @Daniel 我为你关于输出前最后一层神经元的问题编辑了我的答案。 You shouldn't need to normalize anything inside the network. 不完全正确,因为在深度学习文献中有一种众所周知的技术,称为批量归一化 @Kh40tiK 你可能是对的(我对批量标准化不太了解),但 OP 的意图可能不是这样的。 您好,再次感谢您的回复。你说得对,我很抱歉,我交替使用激活函数和标准化。我并不是说我对层的输出进行了标准化,图中用蓝色条显示的是激活函数。

以上是关于我应该标准化我的神经网络中的输入吗?的主要内容,如果未能解决你的问题,请参考以下文章

神经网络拥有正态分布的数据重要吗?

神经网络标准化输出数据

如果您使用批量标准化,您是不是需要标准化输入?

MATLAB中神经网络建模中的归一化和非归一化

辍学和批量标准化 - 层的顺序重要吗?

神经网络中的批标准化