不能在具有1个隐藏层的神经网络中逼近简单乘法函数

时间:2016-05-30 08:19:54

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

我只想测试神经网络近似乘法函数(回归任务)有多好。 我正在使用Azure Machine Learning Studio。我有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来说,这项任务应该非常简单。

6 个答案:

答案 0 :(得分:3)

要检查的一些事项:

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

答案 1 :(得分:3)

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

1)保持不变。我们只是在学习之前将所有内容都分开并在之后成倍增加。

2)进行日志规范化。它使乘法成为另外的:

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

答案 2 :(得分:1)

这是我与神经网络相乘的方法:

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]])

有效。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

对数方法很好,但是如果您有两个具有一组输入和目标y值的数据集,则:

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

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

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

答案 5 :(得分:0)

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