概述
都说神经网络是一个万能的函数拟合器,如何理解这句话呢?让我们做一些实验,去获取更直观的理解。
为了直观与方便理解,我们用神经网络去拟合一元函数,也就是
实验
1. 函数
训练样本

如图所示:
- 蓝色点代表训练样本,它们都是从函数
中取样获得
- 橙色的直线代表神经网络所表示的函数,目前未训练,与样本偏离较大
思路
拟合一条直线,我们需要使用什么结构的神经网络去拟合它呢?为了理解透彻,我们需要理解单个神经元。
单个神经元的形式为:
-
和
为待确定的参数
-
为激活函数
如果去掉,其形式就是
,刚好就是一条直线。也就是说,我们使用一个不带激活函数的神经元,就可以拟合该函数。
实验

如上图所示,使用单个输出神经元,经过20步的训练,神经网络就与目标函数拟合的很好了。所得到的参数如下图所示:

对应的函数为,与目标函数极为接近,再多训练几步即可更为接近。
2. 函数y=|x|
训练样本

该函数是一个分段函数
思路
由于这里不是直线,这就需要用到非线性激活函数了,它可以将直线弯折。由于不涉及曲线,ReLU是比较合适的激活函数:

观察ReLU函数的曲线,一边是水平直线,另一个是一条斜线。如果能够获得2条ReLU曲线,让他们反向叠加,是不是就可以得到目标曲线了?

最终结果如下:

其中2个隐藏神经元为:
输出神经元为:,刚好得到目标曲线。
(以上结果未经参数训练,直接通过手工设置参数获得)
3. 函数

所需隐藏神经元上升到4个。
4. 函数

网络更加复杂,拟合的曲线也不再完美。
总结
随着目标函数变得更加复杂:
- 对应的神经网络也更加复杂
- 所需的训练数据量也更多
- 训练难度越来越大
- 越来越不直观,越来越难以解释
反过来说,更复杂神经网络、更多的数据量,可以用来拟合更复杂的函数。理论上可以拟合任意函数,当然,网络要无限大,数据量也要无限多。
参考软件

网友评论