【问题标题】:Can't approximate simple multiplication function in neural network with 1 hidden layer无法在具有 1 个隐藏层的神经网络中逼近简单的乘法函数
【发布时间】:2016-05-30 08:19:53
【问题描述】:

我只是想测试一下神经网络近似乘法函数(回归任务)有多好。 我正在使用 Azure 机器学习工作室。我有 6500 个样本,1 个隐藏层 (我测试了每个隐藏层 5 /30 /100 个神经元),没有归一化。和默认参数 Learning rate - 0.005, Number of learning iterations - 200, The initial learning weigh - 0.1, The momentum - 0 [description]。我的准确率非常差,接近 0。 同时提升的决策森林回归显示出非常好的近似值。

我做错了什么?这项任务对 NN 来说应该很容易。

【问题讨论】:

    标签: neural-network deep-learning azure-machine-learning-studio


    【解决方案1】:

    大乘法函数梯度可能几乎立即迫使网络进入某种可怕的状态,其中所有隐藏节点的梯度都为零。 我们可以使用两种方法:

    1) 除以常数。我们只是在学习之前将所有内容分开并在之后进行乘法。

    2) 进行对数标准化。它把乘法变成加法:

    m = x*y => ln(m) = ln(x) + ln(y).
    

    【讨论】:

      【解决方案2】:

      需要检查的一些事项:

      1. 您的输出层应该具有线性激活函数。如果它是 sigmoidal,它将无法表示超出其范围的值(例如 -1 到 1)
      2. 您应该使用适合回归的损失函数(例如平方误差)
      3. 如果您的隐藏层使用 sigmoidal 激活函数,请检查您是否没有使它们饱和。乘法可以处理任意小/大的值。而且,如果您将大量数字作为输入传递,您可以获得饱和,这将丢失信息。如果使用 ReLU,请确保它们不会在所有示例上都卡在 0(尽管在任何给定示例上激活通常都是稀疏的)。
      4. 检查您的培训程序是否按预期工作。绘制训练期间随时间变化的误差。它看起来怎么样?您的渐变表现良好还是正在爆炸?问题的根源之一可能是学习率设置得太高(不稳定的错误、爆炸梯度)或太低(进展非常缓慢、错误减少得不够快)。

      【讨论】:

        【解决方案3】:

        这就是我用神经网络做乘法的方法:

        import numpy as np
        from keras import layers
        from keras import models
        
        model = models.Sequential()
        model.add(layers.Dense(150, activation='relu', input_shape=(2,)))
        model.add(layers.Dense(1, activation='relu'))
        
        data = np.random.random((10000, 2))
        results = np.asarray([a * b for a, b in data])
        model.compile(optimizer='sgd', loss='mae')
        
        model.fit(data, results, epochs=1, batch_size=1)
        model.predict([[0.8, 0.5]])
        

        有效。

        【讨论】:

        • 嗨,欢迎来到 Stackoverflow。回答时,请尽可能解释您的代码。
        • 要了解这段代码,您可以查看--machinelearningmastery.com/…
        • 这些输入在 1 上进行了归一化 - 在输出未归一化并且可以是任意数字的一般情况下,逼近/训练 NN 来学习乘法要困难得多。
        【解决方案4】:

        “两种方法:除以常数,或进行对数归一化”

        我尝试了这两种方法。当然,日志规范化是有效的,因为正如您正确指出的那样,它强制执行加法。在我的广泛测试中,除以常数(或类似地在任何范围内标准化)似乎没有成功。

        日志方法很好,但是如果您有两个数据集,其中包含一组输入和一个目标 y 值,其中:

        • 在数据集一中,目标始终是两个输入的总和

        • 在数据集二中,目标始终是两个输入的乘积

        然后我不清楚如何设计一个神经网络,该网络将使用反向传播在两个数据集中找到目标 y。如果这是不可能的,那么我发现神经网络找到“任何函数的近似值”的能力是一个令人惊讶的限制。但我是这个游戏的新手,我的期望可能不切实际。

        【讨论】:

          【解决方案5】:

          这是一种使用一个隐藏层来近似乘法函数的方法。它在隐藏层中使用 sigmoidal 激活,并且在达到一定范围的数字之前效果很好。这是gist link

          【讨论】:

            【解决方案6】:

            m = x*y => ln(m) = ln(x) + ln(y), 但仅当 x, y > 0

            【讨论】:

              猜你喜欢
              • 2019-09-10
              • 1970-01-01
              • 1970-01-01
              • 2010-12-06
              • 1970-01-01
              • 2013-04-14
              • 2014-07-24
              • 2012-12-03
              • 2020-12-28
              相关资源
              最近更新 更多