首先,您为网络编写的函数缺少偏差变量(我确信您使用偏差来获得那些漂亮的图像,否则您的tanh
网络必须从零开始)。
一般来说,我会说只有 3 个神经元不可能很好地近似窦,但如果你想考虑一个窦期,那么你可以做点什么。为了清楚起见,请看这张图片:
我已经在 colab 中编写了这个任务的代码,你可以在这里找到它,如果你愿意,你可以玩它。
如果你多次运行网络,你可能会得到不同的结果(因为不同的初始化),你可以在上面链接的结果部分看到其中的一些。您在上图中向我们展示的只是两种可能性。但有趣的是,你可以得到更好的结果tanh
而不是sigmoid
,如果你想知道为什么,我强烈建议你看看这个CS231n 的讲座。总之,这是因为tanh
有负面的部分,网络可以更好地学习它。
但实际上它们的逼近能力几乎相似,因为2*sigmoid(1.5*x) - 1
看起来几乎相同tanh(x)
,您可以通过查看下图找到它:
那么为什么你不能得到与 相同的结果tanh
呢?那是因为tanh
更适合问题,如果网络想要获得tanh
与sigmoid
它相同的结果,应该学习它们的转换参数,学习这些参数会使学习任务变得更加困难。因此,获得相同的结果并非不可能,sigmoid
但更难。为了向您展示它的可能,我已经sigmoid
手动设置了网络的参数并得到了以下结果(如果您有更多时间,您可以获得更好的结果):
最后,如果你想知道为什么用 2 个神经元而不是 3 个神经元不能得到相同的结果,最好了解网络用 3 个神经元做了什么。
如果您查看第一层的输出,您可能会看到类似这样的内容(这是它具有的两个神经元的输出):
然后下一层得到这两个神经元(就像窦)的输出之间的差异,并应用sigmoid
或tanh
到它,这就是你得到一个好的结果的方式。但是当你在第一层只有一个神经元时,你无法想象这样的场景并且近似一个窦性周期超出了它的能力(欠拟合)。