Neural network Can';单隐层神经网络中的t近似简单乘法函数
我只是想测试神经网络逼近乘法函数的能力(回归任务)。 我正在使用Azure机器学习工作室。我有6500个样本,1个隐藏层 (我测试了每个隐藏层5/30/100个神经元),没有正常化。和默认参数 . 我的准确度非常差,接近0。 同时,森林回归显示出很好的逼近性 我做错了什么?对于NN来说,这项任务应该非常容易。需要检查的一些事项: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形激活函数,检查
大的乘法函数梯度迫使网络几乎立即进入某种可怕的状态,其所有隐藏节点的梯度为零。 我们可以使用两种方法: 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以学习乘法。