YOLO入门教程(番外):为什么激活函数如此关键。
如果没有激活函数,无论神经网络有多少层,最终都等价于一个线性模型,无法学习复杂的非线性模式。
我需要理解为什么激活函数如此关键。
核心答案(一句话概括)
因为没有激活函数,多层神经网络的组合本质上只是一个复杂的线性变换,而多个线性变换的叠加仍然是一个线性变换。这就失去了堆叠多层网络的意义。
1. 直观比喻:做一杯鸡尾酒
想象一下,你是一个调酒师,你的工作是把几种基酒(输入)混合成一杯鸡尾酒(输出)。
-
没有激活函数(只有线性变换):
你只能做简单混合。比如,将30%的朗姆酒和70%的可乐倒在一起。无论你找多少个助手(相当于增加网络层数),每个助手都只是把你递过来的混合物再简单地和其他东西混合一次。最终,你得到的只是一杯成分比例不同的混合饮料,永远无法创造出全新的、复杂的口味层次。 你的操作空间被限制在“线性混合”这个狭小的范围内。 -
有激活函数(引入非线性):
现在,你有一个摇酒壶(激活函数)!你不仅仅混合,你还会摇晃、挤压、冰镇。这个“摇晃”的动作就是一个非线性操作。它打破了简单的线性混合,使得各种成分之间发生了剧烈的相互作用和融合,产生了泡沫、带来了冰爽的口感、释放了水果的香气。最终,你得到了一杯全新的、拥有复杂风味和口感的鸡尾酒,这与简单混合有本质的区别。
结论:激活函数就是神经网络中的“摇酒壶”,它通过引入非线性,使得网络能够混合和创造出输入数据中极其复杂的非线性模式和特征。
2. 数学解释:为什么线性叠加还是线性?
让我们用数学来严格证明这一点。
一个没有激活函数的神经网络层,其计算可以表示为:
输出 = W * 输入 + b
其中 W
是权重矩阵,b
是偏置向量。这就是一个标准的线性变换。
现在,假设我们堆叠两层这样的网络:
- 第一层输出:
h₁ = W₁ * X + b₁
- 第二层输出:
Y = W₂ * h₁ + b₂
现在,我们把第一层的表达式代入第二层:
Y = W₂ * (W₁ * X + b₁) + b₂
Y = (W₂ * W₁) * X + (W₂ * b₁ + b₂)
我们简化一下:
令 W_combined = W₂ * W₁
令 b_combined = W₂ * b₁ + b₂
那么最终的输出就变成了:
Y = W_combined * X + b_combined
看!无论你堆叠多少层,最终都可以被合并成一个单一的线性变换 W_combined * X + b_combined
。
这意味着:
- 一个10层的线性网络,它的表达能力和一个1层的线性网络是完全一样的。
- 它只能解决像线性回归这样的问题,即用一条直线(或高维空间中的一个平面)去拟合数据。
- 它永远无法学会如何画一条曲线来区分下图中的两类点,也无法理解图像、语言等复杂数据。
3. 激活函数如何解决这个问题?
激活函数(如ReLU, Sigmoid, Tanh)都是非线性函数。它们在每个神经元的输出上作用,改变了其简单的线性关系。
现在,我们看看加入激活函数 σ
(例如ReLU)后会发生什么:
- 第一层输出:
h₁ = σ(W₁ * X + b₁)
// 注意:这里应用了非线性激活函数! - 第二层输出:
Y = σ(W₂ * h₁ + b₂)
// 这里再次应用了非线性!
现在,我们无法再将第一层的表达式简单地代入第二层并合并成一个线性变换了,因为非线性函数 σ
的存在打破了这种可合并性。
Y = σ( W₂ * σ( W₁ * X + b₁ ) + b₂ )
这个函数是一个高度非线性的复合函数。每一层的非线性变换都为模型增加了新的“弯曲”能力。通过堆叠多层这样的结构,神经网络就可以构建出非常复杂、精细的非线性决策边界,从而拟合几乎任何复杂的函数。
总结
场景 | 数学表达 | 表达能力 | 比喻 |
---|---|---|---|
无激活函数 | Y = W_combined * X + b_combined | 弱,等价于单层线性模型 | 简单混合饮料 |
有激活函数 | Y = σ( W₂ * σ( W₁ * X + b₁ ) + b₂ ) | 极强,可拟合极度复杂的模式 | 用摇酒壶制作的复杂鸡尾酒 |
所以,激活函数的作用是:
- 引入非线性:使网络能够学习并模拟复杂的非线性关系,这是解决现实世界问题(如图像识别、语言翻译)所必需的。
- 决定神经元是否被激活:模拟生物神经元的工作原理,即只有输入信号超过某个阈值时才会被激活并传递信号。
正是激活函数赋予了深度学习“深度”的意义,使得堆叠多层网络变得有价值。