神经网络输出:缩放输出范围

3
我的神经网络(3层)的输出层使用sigmoid作为激活函数,只能输出[0-1]范围内的值。但是,如果我想要训练它输出超出[0-1]的值,比如在千位数级别上,我该怎么办?
例如,如果我想要进行以下训练:
输入 ----> 输出
0 0 -------> 0
0 1 -------> 1000
1000 1 -----> 1
1 1 --------> 0
我的程序可以处理AND、OR、XOR等二进制输入输出的情况。
有人建议使用以下方法:
激活函数:
y = lambda*(abs(x)1/(1+exp(-1(x))))
激活函数的导数: lambda*(abs(y)y(1-y))
这对于上述训练模式没有收敛(如果我没有做错什么的话)。请问是否有其他建议?
2个回答

6
对于分类问题,通常在输出层使用sigmoid / logistic激活函数以获得在[0,1]范围内的合适概率值;与多类别分类中的1-of-N编码配合使用,每个节点的输出将代表实例属于每个类别值的概率。
另一方面,如果你有一个回归问题,则不需要在输出上应用其他函数,只需获取原始线性组合输出即可。网络将自动学习权重以给出任何输出值(甚至在数千个数值)。
你还需要注意的是,对于输入特征,要进行缩放(例如通过将所有特征归一化为[-1,1]的范围)。

嗨,谢谢!但是为了实现您对回归案例的建议,我需要如何更改我的代码?例如,我正在使用反向传播,其中我使用了Sigmoid的导数来传播误差。(http://www.speech.sri.com/people/anand/771/html/node37.html) 我使用了这个算法,现在如果我在输出中不使用任何Sigmoid,那么在这种情况下delk会是什么?如果我只想训练问题中提到的模式,哪种拓扑结构会更好?回归还是分类?我的意思是你会怎么做? - Ashikur Rahman
请在输出层中使用恒等函数 f(x) = x,而不是 Sigmoid 激活函数。此外,您尝试使用神经网络预测的目标属性决定了您所面临的问题类型:分类/名义值(分类问题,例如将电子邮件分类为垃圾邮件/非垃圾邮件)与数值型值(回归问题,例如预测股票价格)。 - Amro

2

将输出值放大到所需的值,或将训练数据归一化为[0,1]范围是显而易见的解决方案。我想不出任何先验原因需要缩放是线性的(尽管它显然希望是单调递增的),因此您可以在这里尝试对数函数。

您正在处理什么样的问题,以便具有如此大的范围?


  1. 我需要对每个神经元的输出进行缩放吗?还是只需要对输出神经元进行缩放?
  2. 如果我对输入进行归一化,是否也需要对输出进行归一化?如何对输出进行归一化?与输入一起吗?
  3. 如何调整对数函数?
  4. 我的数据已分类,我需要训练问题中提到的模式,你有什么建议?
- Ashikur Rahman
你的输入就是它们本来的样子,我会让它们保持原样。你要做的是匹配输出神经元提供的范围,以符合你的训练数据所规定的值。你可以通过直接更改输出神经元的传递函数,或在需要时将其放大,或将训练数据所规定的输出缩小来实现这一点。从某种意义上说,这些方法都是等效的。神经元保持不变。 - Novak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接