我正在学习为回归问题构建神经网络。它可以很好地逼近线性函数。在隐藏层和输出层中设置5-1个具有线性激活函数的单元确实有效,结果快速可靠。然而,当我尝试向它提供简单的二次数据(f(x)=x*x)时,会发生以下情况:
使用线性激活函数,它试图通过数据集拟合一个线性函数
使用TANH函数,它尝试通过数据集拟合TANH曲线。
这让我相信当前的设置本质上无法学习任何东西,除了线性关系,因为它在重复图表上激活函数的形状。但这可能不是真的,因为我已经看到其他实现完美地学习曲线。所以我可能做错了什么。请提供您的指导。
关于我的代码
我的权重是随机的(-1,1)输入没有归一化。数据集以随机顺序馈送。改变学习率或添加图层,不会对图片产生太大影响。
我创建了一个jsfiddle,
玩的地方是这个功能:
function trainingSample(n) {
return [[n], [n]];
}
它生成单个训练样本:输入向量数组和目标向量数组的数组。在本例中,它生成一个f(x)=x
函数。将其修改为[[n],[n*n]]
,您就得到了一个二次函数。
播放按钮在右上方,还有两个输入框可以手动输入这些值。如果目标(右)框留空,您可以仅通过前馈来测试网络的输出。
代码中还有一个网络的配置文件,可以在这里设置学习率等东西。(搜索var Config
)
我突然想到,在我描述的设置中,由于特征的选择,不可能学习非线性函数。在前向传递中,我们没有任何地方的输入依赖性大于1,这就是为什么我在输出中看到了我的激活函数的快照。废话。