Neural network Can';单隐层神经网络中的t近似简单乘法函数

Neural network Can';单隐层神经网络中的t近似简单乘法函数,neural-network,deep-learning,azure-machine-learning-studio,Neural Network,Deep Learning,Azure Machine Learning Studio,我只是想测试神经网络逼近乘法函数的能力(回归任务)。 我正在使用Azure机器学习工作室。我有6500个样本,1个隐藏层 (我测试了每个隐藏层5/30/100个神经元),没有正常化。和默认参数 . 我的准确度非常差,接近0。 同时,森林回归显示出很好的逼近性 我做错了什么?对于NN来说,这项任务应该非常容易。需要检查的一些事项: 输出层应具有线性激活功能。如果它是s形的,则不能表示超出其范围的值(例如-1到1) 您应该使用适合回归的损失函数(例如平方误差) 如果你的隐藏层使用了S形激活函数,检查

我只是想测试神经网络逼近乘法函数的能力(回归任务)。 我正在使用Azure机器学习工作室。我有6500个样本,1个隐藏层 (我测试了每个隐藏层5/30/100个神经元),没有正常化。和默认参数 . 我的准确度非常差,接近0。 同时,森林回归显示出很好的逼近性

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

需要检查的一些事项:

  • 输出层应具有线性激活功能。如果它是s形的,则不能表示超出其范围的值(例如-1到1)
  • 您应该使用适合回归的损失函数(例如平方误差)
  • 如果你的隐藏层使用了S形激活函数,检查你没有使它们饱和。乘法可以处理任意小/大的值。而且,如果你把一个大的数字作为输入,你可以得到饱和,这将丢失信息。如果使用ReLUs,请确保它们在所有示例中都不会停留在0(尽管在任何给定示例中激活通常很少)
  • 检查您的培训程序是否按预期工作。绘制培训期间随时间变化的错误。看起来怎么样?你的梯度表现得好吗,还是变大了?问题的一个来源可能是学习率设置过高(错误不稳定,梯度爆炸)或过低(进度非常缓慢,错误减少得不够快)

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

    1) 按常数偏离。我们只是在学习之前把一切都分开,然后再繁殖

    2) 进行日志规范化。它把乘法变成加法:

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

    “两种方法:除以常数或进行日志规范化”

    两种方法我都试过了。当然,日志规范化是有效的,因为正如您正确指出的,它强制实现加法。除以常数——或者在任何范围内进行类似的标准化——似乎无法在我的广泛测试中成功

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

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

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


    然后,我不清楚如何设计一个神经网络,通过反向传播在两个数据集中找到目标y。如果这是不可能的,那么我发现神经网络在找到“任何函数的近似值”的能力方面存在着令人惊讶的局限性。但是我对这个游戏还不熟悉,我的期望可能是不切实际的。

    这里有一种方法,可以使用一个隐藏层来近似乘法函数。它在隐藏层中使用了一个sigmoid激活,并且在一定的数字范围内工作得非常好。这是

    这是我如何使用神经网络进行乘法:

    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。在回答时,如果可能,请尝试解释您的代码。要理解此代码,您可以检查-这些输入在1上归一化-在一般情况下,如果输出未归一化,可以是任何数字,则很难近似/训练NN以学习乘法。