sigmoid - 反向传播神经网络
sigmoid - back propagation neural network
我正在尝试创建一个可用于信用评分的样本神经网络。因为这对我来说是一个复杂的结构,所以我试着先从小的方面学习它们。
我使用反向传播创建了一个网络 - 输入层(2 个节点)、1 个隐藏层(2 个节点 +1 个偏置)、输出层(1 个节点),它使用 sigmoid 作为所有层的激活函数。我试图首先使用 a^2+b2^2=c^2 来测试它,这意味着我的输入将是 a 和 b,目标输出将是 c。
我的问题是我的输入值和目标输出值是实数,范围是 (-/infty, +/infty)。因此,当我将这些值传递到我的网络时,我的错误函数类似于(目标网络输出)。那是正确的还是准确的?从某种意义上说,我得到了网络输出(范围从 0 到 1)和目标输出(一个很大的数字)之间的差异。
我读到解决方案是先规范化,但我不太确定该怎么做。在将它们提供给网络之前,我应该对输入值和目标输出值进行归一化吗?什么归一化函数最适合使用,因为我在归一化中阅读了不同的方法。在获得优化的权重并使用它们测试一些数据后,由于 sigmoid 函数,我得到了 0 到 1 之间的输出值。我应该将计算值恢复为 un-normalized/original form/value 吗?或者我应该只规范化目标输出而不是输入值?这真的让我陷入了数周的困境,因为我没有得到想要的结果,也不确定如何将规范化思想纳入我的训练算法和测试中..
非常感谢!!
所以回答你的问题:
- Sigmoid 函数正在将其输入压缩到区间 (0, 1)。它通常在 class 化任务中很有用,因为您可以将其输出解释为某个 class 的概率。您的网络执行回归任务(您需要逼近实值函数)-因此最好将线性函数设置为最后一个隐藏层的激活(在您的情况下也是第一个:))。
- 我建议您不要在隐藏层中使用 sigmoid 函数作为激活函数。使用
tanh
或 relu
非线性要好得多。可以在 here. 中找到详细的解释(以及一些有用的提示,如果你想保留 sigmoid 作为你的激活)
- 了解您的网络架构不适合您要解决的任务也很重要。您可以了解一些不同网络可能学到的东西 here。
- 在规范化的情况下:你应该规范化你的数据的主要原因是不给你的网络任何 spourius 先验知识。考虑两个变量:
age
和 income
。第一个不同于例如5 到 90。第二个不同于例如1000 到 100000。income
的平均绝对值比 age
大得多,因此由于模型中的线性变换 - ANN 将 income
视为更 重要 在训练开始时(因为随机初始化)。现在考虑您正在尝试解决一项任务,您需要 class 验证给定的人是否有白发 :) income
对于这项任务来说真的是更重要的变量吗?
- 有很多
rules of thumb
关于如何规范化输入数据的文章。一种是将所有输入压缩到 [0, 1]
区间。另一种是让每个变量都有 mean = 0
和 sd = 1
。当给定变量的分布类似于正态分布时,我通常使用第二种方法,而在其他情况下,我通常使用第一种方法。
- 在对输出进行归一化时,在解决回归任务时(尤其是在多元回归情况下)对其进行归一化通常也很有用,但它不像在输入情况下那么重要。
- 您应该记住保留恢复输入和输出原始大小所需的参数。您还应该记住仅在训练集上计算它们并将其应用于训练集、测试集和验证集。
我正在尝试创建一个可用于信用评分的样本神经网络。因为这对我来说是一个复杂的结构,所以我试着先从小的方面学习它们。
我使用反向传播创建了一个网络 - 输入层(2 个节点)、1 个隐藏层(2 个节点 +1 个偏置)、输出层(1 个节点),它使用 sigmoid 作为所有层的激活函数。我试图首先使用 a^2+b2^2=c^2 来测试它,这意味着我的输入将是 a 和 b,目标输出将是 c。
我的问题是我的输入值和目标输出值是实数,范围是 (-/infty, +/infty)。因此,当我将这些值传递到我的网络时,我的错误函数类似于(目标网络输出)。那是正确的还是准确的?从某种意义上说,我得到了网络输出(范围从 0 到 1)和目标输出(一个很大的数字)之间的差异。
我读到解决方案是先规范化,但我不太确定该怎么做。在将它们提供给网络之前,我应该对输入值和目标输出值进行归一化吗?什么归一化函数最适合使用,因为我在归一化中阅读了不同的方法。在获得优化的权重并使用它们测试一些数据后,由于 sigmoid 函数,我得到了 0 到 1 之间的输出值。我应该将计算值恢复为 un-normalized/original form/value 吗?或者我应该只规范化目标输出而不是输入值?这真的让我陷入了数周的困境,因为我没有得到想要的结果,也不确定如何将规范化思想纳入我的训练算法和测试中..
非常感谢!!
所以回答你的问题:
- Sigmoid 函数正在将其输入压缩到区间 (0, 1)。它通常在 class 化任务中很有用,因为您可以将其输出解释为某个 class 的概率。您的网络执行回归任务(您需要逼近实值函数)-因此最好将线性函数设置为最后一个隐藏层的激活(在您的情况下也是第一个:))。
- 我建议您不要在隐藏层中使用 sigmoid 函数作为激活函数。使用
tanh
或relu
非线性要好得多。可以在 here. 中找到详细的解释(以及一些有用的提示,如果你想保留 sigmoid 作为你的激活)
- 了解您的网络架构不适合您要解决的任务也很重要。您可以了解一些不同网络可能学到的东西 here。
- 在规范化的情况下:你应该规范化你的数据的主要原因是不给你的网络任何 spourius 先验知识。考虑两个变量:
age
和income
。第一个不同于例如5 到 90。第二个不同于例如1000 到 100000。income
的平均绝对值比age
大得多,因此由于模型中的线性变换 - ANN 将income
视为更 重要 在训练开始时(因为随机初始化)。现在考虑您正在尝试解决一项任务,您需要 class 验证给定的人是否有白发 :)income
对于这项任务来说真的是更重要的变量吗? - 有很多
rules of thumb
关于如何规范化输入数据的文章。一种是将所有输入压缩到[0, 1]
区间。另一种是让每个变量都有mean = 0
和sd = 1
。当给定变量的分布类似于正态分布时,我通常使用第二种方法,而在其他情况下,我通常使用第一种方法。 - 在对输出进行归一化时,在解决回归任务时(尤其是在多元回归情况下)对其进行归一化通常也很有用,但它不像在输入情况下那么重要。
- 您应该记住保留恢复输入和输出原始大小所需的参数。您还应该记住仅在训练集上计算它们并将其应用于训练集、测试集和验证集。