1

我正在尝试创建一个可用于信用评分的示例神经网络。由于这对我来说是一个复杂的结构,我试图先从小处学习它们。

我使用反向传播创建了一个网络 - 输入层(2 个节点)、1 个隐藏层(2 个节点 +1 个偏差)、输出层(1 个节点),它使用 sigmoid 作为所有层的激活函数。我首先尝试使用 a^2+b2^2=c^2 对其进行测试,这意味着我的输入是 a 和 b,目标输出是 c。

我的问题是我的输入和目标输出值是实数,范围可以从(-/infty,+/infty)。因此,当我将这些值传递给我的网络时,我的错误函数将类似于(目标网络输出)。那是正确的还是准确的?从某种意义上说,我得到了网络输出(范围从 0 到 1)和目标输出(很大)之间的差异。

我已经读过解决方案是首先规范化,但我不确定如何做到这一点。在将输入和目标输出值输入网络之前,我是否应该对其进行标准化?最好使用什么归一化函数,因为我阅读了不同的归一化方法。在获得优化的权重并使用它们来测试一些数据后,由于 sigmoid 函数,我得到了一个介于 0 和 1 之间的输出值。我应该将计算值恢复为未标准化/原始形式/值吗?或者我应该只标准化目标输出而不是输入值?这真的让我困了好几个星期,因为我没有得到想要的结果,也不确定如何将标准化思想融入我的训练算法和测试中。

非常感谢!!

4

1 回答 1

0

所以回答你的问题:

  1. Sigmoid 函数将其输入压缩到区间 (0, 1)。它通常在分类任务中很有用,因为您可以将其输出解释为某个类别的概率。您的网络执行回归任务(您需要近似实值函数) - 因此最好将线性函数设置为您最后一个隐藏层的激活(在您的情况下也是第一个:))。
  2. 我建议您不要在隐藏层中使用 sigmoid 函数作为激活函数。tanh使用或relu非线性要好得多。可以在此处找到详细说明(以及一些有用的提示,如果您想保留 sigmoid 作为激活)。
  3. 了解您的网络架构不适合您尝试解决的任务也很重要。您可以在这里了解一些不同的网络可能学到的东西
  4. 在规范化的情况下:您应该规范化数据的主要原因是不向您的网络提供任何 spourius 先验知识。考虑两个变量:ageincome。第一个从例如 5 到 90 不等。第二个从例如 1000 到 100000 不等。由于模型中的线性变换,平均绝对值incomeageso 大得多 - ANN在训练开始时被income视为更重要(因为随机初始化)。现在考虑您正在尝试解决一项任务,您需要对给定的人是否有白发进行分类:)income对于这项任务来说,真的更重要的变量吗?
  5. 有很多rules of thumb关于如何规范化输入数据的方法。一种是将所有输入压缩到[0, 1]区间。另一种方法是使每个变量都具有mean = 0sd = 1。当给定变量的分布类似于正态分布时,我通常使用第二种方法,而在其他情况下,我通常使用第一种方法。
  6. 当涉及到标准化输出时,在解决回归任务(尤其是在多元回归情况下)时,标准化它通常也很有用,但它不像在输入情况下那么重要。
  7. 您应该记住保留恢复输入和输出原始大小所需的参数。您还应该记住仅在训练集上计算它们并将其应用于训练集、测试集和验证集。
于 2016-05-22T09:39:24.593 回答