大家好啊,我是董董灿。
本篇文章是什么是神经网络的非线性的后续,之所以写这篇文章,是因为有小伙伴看了上一篇之后有个疑问,那就是:
为什么加了relu 这种激活函数之后,神经网络就可以拟合出任意复杂的函数了呢?relu 函数小于零的输出永远是零啊。
下面就带着这个疑问,一起来看看这个问题吧。
1、先看下线性函数的局限
假设我们使用的神经网络只包含线性函数,在这种情况下,无论神经网络有多少层,那么整体而言,神经网络仍然是一个线性函数。
这是因为多个线性变换的组合仍然是线性的,这个例子的解释可以查看:什么是神经网络的非线性。
这种线性变换组合的思想,我们都能理解,但关键是,为什么引入一个 relu 函数之后,一切就变了呢。
2、非线性逼近其他函数的例子
我们以 relu 这个最简单的非线性函数来举例,relu 函数的图形如下。
考虑一个线性模型:
这里,w 是权重,b 是偏置,无论我们如何调整 w 和 b,这个模型都只能是一个线性模型。
即使我们堆叠再多个这样的线性层,整个网络仍然只能表示线性关系,无法捕捉复杂的非线性关系。
现在,我们在这个线性函数 f(x) 的基础上,引入一个非线性函数 relu, relu 用公式可以写成下面这样:
将 relu 应用于上述线性模型的输出上,则:
此时,我们假设 w = 2, b = -1, 那么函数可以写出:
也就说,当 x < 0.5 时,y = 0;x >= 0.5 时,y = 2x - 1,将这个图像画出来,大概是如下的样子:
现在重新修改下 w 和 b 的值,假设此时 w = -1, b = 5, 那么函数就可以表示为:
y = Relu(-x + 5)
则, x < 5 时,y = 5 - x; x >= 5 时, y = 0;此时函数图像为下面的样子。
从上述两个例子可以看出,通过调整 w 和 b 的值,包括但不限于增大减少、调整正负等方法,可以生成任意的分段函数。
一个简单的 relu 函数就可以通过调整w 和 b 的值,拟合任意的分段函数,更别提其他的非线性函数比如 sigmoid 了。
而在深度神经网络中,有很多大量的神经元和激活层,通过这些激活层的叠加,理论上神经网络就可以逼近任意的函数了。
3、 万能逼近定理
为了更加严谨的说明这个问题,我们引入一个数学上的定理,叫作"万能逼近定理"。
这个定理表明一个具有足够数量隐藏层和足够数量神经元的神经网络,只要使用非线性激活函数,就能够以任意精度逼近任意函数。
而我们从上面举得两个例子也可以看出:只要神经网络中有足够多的神经元和非线性激活层,只要层数足够深,通过神经网络的自我学习,它可以学到足够的参数组合(比如上面说的 w 和 b 的组合)。
这些参数组合形成构成的一些非线性函数的叠加,理论上便可以拟合任意函数,这也是深度学习在处理各种任务中取得成功的关键原因之一。
现在的大模型为什么效果这么好,就是因为他们的参数量很多,动辄就几百上千亿,拟合一些超级复杂的函数不在话下。
甚至科学家也搞不清楚它到底拟合了什么函数,或者说此时拟合的不能再用一个函数来表示,更多的是一个复杂的网络,像是人脑一样。
但是通过大量的互联网数据训练出来的这个类似人脑的复杂网络,实际效果就是很有效。
本文首发于公众号:董董灿是个攻城狮。参考:^ 非线性思想真的神