前言
上一次我们探讨了神经网络能够拟合非线性关系的底层原理。
本篇稿件将延续上一篇所讨论的话题,着重讨论以下问题:
- Sigmoid 作为激活函数时,输出层如何通过控制权重和偏置的大小来处理从隐藏层传过来的数据
- 为什么 线性激活函数 做不到这一点
- ReLU 为什么可以作为激活函数
一、问题引入
回顾:三角形判断问题
在输出层中,线性函数是如何根据权重和偏置的选择,解析从隐藏层传过来的 Sigmoid 的输出,并得到结果交给 Sigmoid 得到最终判断结果的?
同样是那个判断一个数据是否在 三条直线围成的三角形内部 的例子。
假设从隐藏层三个神经元经过 Sigmoid 处理后的输出分别为 a1, a2, a3。线性函数如何将其处理为承载“在三角形内部还是外部“这一信息的输出呢?
Sigmoid 输出承载的信息
首先我们知道,Sigmoid 的输出承载 两个信息:
| 信息 | 说明 |
|---|---|
| 判断信息 | 数据在这个神经元所拟合的直线的哪一侧 |
| 远近程度 | 离决策边界的远近程度 |
具体表现为:
- 0.5 ~ 1:表示正样本及远近程度
- 0 ~ 0.5:表示负样本及远近程度
输出层的目标
通过 Sigmoid 将判断是否在三角形内的结果进行输出,这需要线性函数的输入:
- 正的越多 → 输出越接近 1
- 负的越多 → 输出越接近 0
处理思路: 让正样本的输入经过输出层的线性函数后是正的,让负样本的输入经过输出层的线性函数后是负的。
二、Sigmoid 作为激活函数的实现
权重和偏置的选择
什么样的权重和偏置的选择能够达到这样的效果呢?
我们先假设有一个 负得比较多的偏置 b,比如 -20:
- 在输入为 0 时,因为这个偏置负的比较大,所以 Sigmoid 的输出接近 0
每个 w 我们让它先为正的比较合适的数字,比如 10:
- 在输入均为 1 时:
10 + 10 + 10 - 20 = 10 - 给 Sigmoid 之后,它的输出是接近 1 了
边界情况分析
那这样的选择 (10a1 + 10a2 + 10a3 - 20) 在数据点比较接近决策边界是什么样子呢?
情况 1:三个输入均为 0.5
10×0.5 + 10×0.5 + 10×0.5 - 20 = -5
得到的就是很接近 0 的数。
似乎在三条边界时不是很准确,但是其实这种情况 不会出现——不可能有离三角形三条边都很接近的点。(大家可以画一个三角形看看)
情况 2:顶点处(接近两条边)
输入:0.5, 0.5, 1
计算:10×0.5 + 10×0.5 + 10×1 - 20 = 5
得到的数是正的,经过 Sigmoid 后输出是接近 0.5 的值。这是比较合理的。
逻辑“与“操作
偏置的作用:设置一个阈值
权重的作用:让输入在均表示在三角形内时,大于阈值
使 z > 0,进而 Sigmoid 的输出趋近于 1
这类似逻辑"与"操作
因此,我们可以知道,对于 Sigmoid 作为激活函数,通过调整 w1, w2, w3 及 b 的值,我们是能够做到很好的判断的。
⚠️ 至于如何确定这些很好的值具体为多少,反向传播算法 会实现。
三、为什么线性激活函数做不到
问题的本质
现在我们不妨回想一下:神经网络之所以能够拟合非线性关系,是因为 Sigmoid 将每个神经元拟合的每条线性决策边界的判断结果输出到了输出层。
Sigmoid 这种输出能够被输出层正确解析并利用,因为它能够调整权重和偏置的大小来达到进行最终判断的效果。
但是,线性激活函数呢?
其实仔细想想的话,似乎在没有 Sigmoid 函数的情况下,也就是隐藏层线性函数的输出本身也携带了它的判断信息的:
- 正负 就表示它的判断结果
- 正的多少或者负的多少 表示离决策边界的远近程度
之前我们说它不能拟合非线性关系,是因为全部由线性激活函数作为激活函数的隐藏层,经过数学推导以后 等效为一个线性函数。
数学证明(反例法)
这里我们用上述说法再来判断一下。
倘若隐藏层全部用线性激活函数,传递到输出层的数据就是隐藏层线性运算后的结果。
我们能不能像对 Sigmoid 函数操作的那样,通过调整权重和偏置的值来达到最终判断的作用呢?
实际上,这可以通过一个简单的数学方式进行证误。
假设我们设置:
- 当
h₁, h₂, h₃ > 0时,z > 0(表示在三角形内部) - 其他情况
z ≤ 0
考虑以下特殊情况:
| 点 | 位置描述 | 隐藏层输入 | 要求 |
|---|---|---|---|
| P | A 右侧,B 上方,C 下方 | (+∞, 1, 1) | z → +∞(错误分类为正) |
| Q | A 右侧,B 上方,C 上方 | (1, 1, -1) | z ≤ 0 |
| R | A 右侧,B 下方,C 下方 | (1, -1, 1) | z ≤ 0 |
| S | A 左侧,B 上方,C 下方 | (-1, 1, 1) | z ≤ 0 |
| 标准点 | 三角形内部 | (1, 1, 1) | z > 0 |
数学推导:
将条件 2、3、4 相加:
(k₁+k₂-k₃+c) + (k₁-k₂+k₃+c) + (-k₁+k₂+k₃+c) ≤ 0
⇒ k₁ + k₂ + k₃ + 3c ≤ 0
这与条件 5 k₁ + k₂ + k₃ + c > 0 矛盾!
结论
线性激活函数作为隐藏层神经元的激活函数时,无法在输出层做到通过对权重和偏置的调整,实现对其携带的信息的解析和利用。
四、深入理解:为什么 Sigmoid 可以
核心原因总结
| 特性 | Sigmoid | 线性激活函数 |
|---|---|---|
| 输出范围 | 0 ~ 1(有界) | -∞ ~ +∞(无界) |
| 饱和性 | ✅ 有明确边界 | ❌ 无饱和性 |
| 信息完整性 | ✅ 不丢失判断信息 | ✅ 携带判断信息 |
| 可被解析 | ✅ 可被输出层解析 | ❌ 无法被正确解析 |
为什么 Sigmoid 可以:
- 它所给的值位于 0~1 之间,有明确的边界(称为具有 饱和性)
- 它 没有丢失 每个隐藏层的神经元拟合的线性决策边界的判断信息
- 这种信息能够被输出层的神经元通过线性函数解析后,再通过 Sigmoid 进行输出
为什么线性激活函数做不到:
- 虽然它也携带了这些信息
- 但是它 不具有饱和性,输出取值从负无穷到正无穷
- 输出层的神经元的线性函数 无法解析出这些信息 并交给 Sigmoid 做出最终判断
关于“非线性“的微观理解
同时,我要指出的是,理解的角度有很多,比如几何角度、线性代数矩阵运算角度等。
但是就我自己来说,宏观的 “引入了非线性因素所以能够拟合非线性关系” 的表述是不太能就这么理解然后接受的。
非线性关系的函数多了去了,二次函数、三次函数、三角函数、指数函数都是非线性的。为什么不用这些来作为激活函数呢?我们需要更加 微观 地去理解。
五、其他激活函数分析
ReLU 为什么可以
然后我们再来看一种常用的激活函数——ReLU。为什么它可以作为激活函数呢?
首先,它确实能够承载分类信息。
对于绝对在三角形内部的点,它的输出是 正值;对于绝对在三角形外部的点,它的输出为 0。
我们可以这样设计权重及偏置使其能够达到逻辑“与“的效果:
1. 设置偏置为一个负数的阈值
2. 设置一系列正数权重
绝对在外部的点:
三个输入均为 0 → 线性函数结果 = 阈值(负数)
→ Sigmoid 输出接近 0
绝对在内部的点:
与权重相乘后 > 阈值 → 结果为正值
→ Sigmoid 输出接近 1
决策边界附近的点:
与权重相乘后 + 阈值 ≈ 0
→ Sigmoid 输出接近 0.5
ReLU 的优点:
- 算得快
- 在数很小或者很大的时候,梯度不会趋于 0
其他激活函数
| 激活函数 | 特点 | 说明 |
|---|---|---|
| tanh | 有饱和性 | 与 Sigmoid 类似,输出范围 -1~1 |
| softmax | 多分类 | 能够进行多分类处理 |
| Sign | 不可导 | 早期感知机使用,阻碍反向传播 |
激活函数的选择会与反向传播的实现密切相关。早期单层感知机采用的 Sign 符号函数因为不能求导,所以对反向传播迭代更新参数有很大阻碍。
六、决策边界方向问题
问题的提出
之前提到的一个问题:倘若我给的点在一条向右下方倾斜的边的上方,如果其上方是三角形内部所在的一侧,那没问题。
但是如果三角形内部在这条斜直线的下方呢?
示例分析
比如我们设三条直线为:
y = 10
x = 20
y = -x + 200
法向量方向:
- 第一条直线:
(0, 1)↑ - 第二条直线:
(1, 0)→ - 第三条直线:
(1, 1)↗(与三角形内部方向相反)
线性函数计算:
l1 = y - 10 → l1 > 0 表示在第一条直线上方
l2 = x - 20 → l2 > 0 表示在第二条直线右方
l3 = x + y - 200 → l3 > 0 表示在第三条直线上方反向传播的自动校准
在模型训练的时候,因为第三条直线的方向判断不对,反向传播算法 会对其 w1 和 w2(也就是 x 和 y)以及 b 进行优化,使其符合样本集。
最后的结果会如何呢?
你会发现:l3 = -x - y + 200
如果将其表述为线性边界直线的表达式:
-x - y + 200 = 0
⇒ y = -x + 200
居然和原直线是一样的!
为什么方向对了?
原直线的法向量方向不是朝外吗?为什么优化半天后又回到了这条直线?方向还对了?
实际上,决策边界直线 y = -x + 200 在转化成 l3 时有两种选择:
| 选择 | 表达式 | 说明 |
|---|---|---|
| 选择一 | l3 = x + y - 200 | 刚开始的结果 |
| 选择二 | l3 = -x - y + 200 | 模型优化后的结果 |
也就是说,线性函数 l3 = -x - y + 200 是 有方向的表述。它虽然对应的是一条直线,但是其能够反映它所对应的直线的 法向量方向。
而它对应的这条直线可以写为 -x - y + 200 = 0 的一般式,此时法向量就指向三角形内部的这一侧了。
关键理解
模型在调整神经元的线性函数的权重和偏置的时候,会自动校准直线的方向,无需我们担心这个问题。
总结
核心要点
- Sigmoid 可以:输出有界(0~1),具有饱和性,信息可被输出层解析
- 线性激活函数不可以:输出无界,无法被正确解析利用
- ReLU 可以:输出非负,计算高效,梯度不会消失
- 方向自动校准:反向传播会自动调整决策边界的方向
理解层次
| 层次 | 理解角度 |
|---|---|
| 宏观 | “引入非线性因素” |
| 微观 | 输出范围、饱和性、信息可解析性 |
| 几何 | 决策边界、法向量方向 |
| 代数 | 线性组合、权重偏置调整 |
希望大家能够从多个角度深入理解激活函数的选择原理!
参考资料
- 相关教学视频与网络资料
- 神经网络与深度学习相关教材
评论