【问题标题】:Is neural net only capable of solving problems with 0..1 input values and 0..1 expected output values?神经网络是否只能解决具有 0..1 个输入值和 0..1 个预期输出值的问题?
【发布时间】:2014-07-20 20:40:43
【问题描述】:

我刚刚创建了我的第一个神经网络,它使用梯度法和反向传播学习算法。它使用双曲正切作为激活函数。代码经过了很好的单元测试,所以我对网络能够真正工作充满希望。然后我决定创建一个集成测试并尝试教我的网络解决一些非常简单的功能。基本上我正在测试权重是否有所改善(只有一个,因为这是一个非常小的网络 - 输入加上一个神经元)。

    // Combinations of negative sign for values greater than 1
    [TestCase(8, 4)] // FAIL reason 1
    [TestCase(-8, 4)] // FAIL reason 1
    [TestCase(8, -4)] // FAIL reason 1
    [TestCase(-8, -4)] // FAIL reason 1
    // Combinations of negative sign for values lesser than 1
    [TestCase(.8, .4)] // OK
    [TestCase(-.8, .4)] // FAIL reason 2
    [TestCase(.8, -.4)] // FAIL reason 2
    [TestCase(-.8, -.4)] // OK
    // Combinations of negative sign for one value greater than 1 and the other value lesser than 1
    [TestCase(-.8, 4)] // FAIL reason 2
    [TestCase(8, -.4)] // FAIL reason 2
    // Combinations of one value greater than 1 and the other value lesser than 1
    [TestCase(.8, 4)] // OK
    [TestCase(8, .4)] // FAIL reason 1
    public void ShouldImproveLearnDataSetWithNegativeExpectedValues(double expectedOutput, double x)
    {
        var sut = _netBuilder.Build(1, 1); // one input, only one layer with one output
        sut.NetSpeedCoefficient = .9;

        for (int i = 0; i < 400; i++)
        {
            sut.Feed(new[] { x }, new[] { expectedOutput });
        }

        var postFeedOutput = sut.Ask(new[] { x }).First();
        var postFeedDifference = Math.Abs(postFeedOutput - expectedOutput);
        postFeedOutput.Should().NotBe(double.NaN);
        postFeedDifference.Should().BeLessThan(1e-5);
    }

我非常失望,因为大多数测试用例都失败了(只有 3 个标有“// OK”的测试通过了)。我深入研究了代码,发现了一些有趣的事实。

  1. 双曲正切最大值为 1。因此,无论权重 * 输入的总和有多大,神经元的输出绝对值将始终
  2. 在其中一个数字为负数的测试用例中,最终权重也应为负数。首先它减少了,但它永远不会变成负数。它要么在 0 左右停止,要么在 0 左右来回跳跃。

神经网络是否只能解决具有 0..1 个输入值和 0..1 个预期输出值的问题,还是我的实现有问题?

【问题讨论】:

    标签: artificial-intelligence neural-network


    【解决方案1】:

    您可以从 NN 获得其他输出。如果您想要离散输出(分类),请使用Softmax Regression。相反,如果您想要连续输出(回归),那么您必须在输出范围(最小值,最大值)和(0,1)之间创建一个双射映射。大多数情况下,映射 f:(min,max)->(0,1), f(x) = (x-min)/(max-min) 就足够了。

    在其中一个数字为负数的测试用例中,最终权重也应为负数

    为什么最终权重也应该是负数?

    您可以输入任何数字。 (虽然将特征归一化到更小的范围是一种很好的做法,通常通过使它们具有均值 0 和标准差 1)

    【讨论】:

    • 我的意思是,如果我只有一个权重(这是一个非常小的网络),那么将负输入变为正输出的唯一方法是当权重变为负时。在我的网络中,重量会在 0 左右波动,但绝不会显着负数。
    • 你定义的输入和输出值的范围是什么,映射规则是什么(我的意思是,如果输入是8,我不明白输出应该是什么?)
    • 这个网络中有一个神经元,它对唯一的输入有一个权重。首先,权重用一个随机的 0..1 数字初始化——我们称之为“X”。然后我尝试在输入 0.4 时教网络输出 -0.8。首先输出是 0.4*X(记住,X 是正数)。在迭代过程中,X 权重不断减小(这是好的),直到它达到 0。然后它会在零的正负两侧波动(这是不好的),它永远不会接近 -2。 (0.4 * (-2) = -0.8)。我正在使用这个算法。 home.agh.edu.pl/~vlsi/AI/backp_t_en/backprop.html
    猜你喜欢
    • 2020-01-26
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    • 1970-01-01
    • 2020-08-21
    • 1970-01-01
    相关资源
    最近更新 更多