4、深度学习基础(上):感知机与多层感知机(MLP)、激活函数、损失函数
各位同学,欢迎来到深度学习降噪课程的理论基石部分。今天我们要聊的,是深度学习大厦最底层的砖块——感知机、多层感知机,以及那些让网络“活”起来的激活函数和“评判标准”损失函数。
说实话,很多做音频的人一上来就扎进各种花哨的网络结构里,结果调参调到怀疑人生。我个人习惯是,先把这些最基础的东西吃透。你想想看,如果连砖块的性质都不了解,怎么能盖好摩天大楼呢?
4.1 感知机:一切开始的地方
感知机是1957年由Frank Rosenblatt提出的。说白了,它就是模仿生物神经元的一个简化数学模型。输入信号乘以权重,加上偏置,然后通过一个阶跃函数输出结果。
数学上,一个感知机可以表示为:
output = step( w1*x1 + w2*x2 + ... + wn*xn + b )
其中 step 函数通常是:如果输入大于0,输出1;否则输出0。
我在项目中遇到过一位同事,试图用单层感知机做音频事件检测,结果效果很差。为什么?因为感知机只能解决线性可分问题。像异或(XOR)这种简单的非线性问题,单层感知机就无能为力了。这是它的致命伤。
4.2 多层感知机(MLP):打破线性枷锁
多层感知机,也叫前馈神经网络,就是在输入层和输出层之间,加入了若干“隐藏层”。每一层都由多个神经元组成,层与层之间全连接。
MLP 的核心能力在于:通过多层非线性变换,它可以逼近任意复杂的函数。这就是所谓的“万能逼近定理”。
一个典型的 MLP 结构如下:
输入层 (n个特征) → 隐藏层1 (m个神经元) → 隐藏层2 (k个神经元) → 输出层 (p个输出)
每一层的计算可以写成:
z = W * a_prev + b
a = activation(z)
其中 W 是权重矩阵,b 是偏置向量,activation 是激活函数。
我记得刚开始做语音降噪时,用的就是一个3层的MLP。输入是带噪语音的频谱特征,输出是干净语音的频谱估计。虽然效果不如现在的Transformer,但在当时已经是很大的突破了。
4.3 激活函数:给网络注入灵魂
如果没有激活函数,多层线性变换叠加起来还是线性变换。那MLP和单层感知机就没区别了。激活函数的作用,就是引入非线性。
下面我们聊聊三种最经典的激活函数。
4.3.1 Sigmoid 函数
Sigmoid 将输入映射到 (0, 1) 区间,公式是:
σ(x) = 1 / (1 + exp(-x))
它的优点是输出可以解释为概率。但缺点也很明显:
- 梯度饱和: 当输入很大或很小时,梯度接近于0,导致梯度消失,网络几乎学不动。
- 输出非零中心: 输出恒为正,这会导致下一层神经元的输入全部为正,影响梯度更新效率。
我曾经在早期的降噪模型里用过Sigmoid,训练到后面loss几乎不动了。后来换成ReLU,收敛速度快了好几倍。
4.3.2 Tanh 函数
Tanh 是 Sigmoid 的改进版,输出范围是 (-1, 1),公式是:
tanh(x) = (exp(x) - exp(-x)) / (exp(x) + exp(-x))
它解决了输出非零中心的问题,但梯度饱和问题依然存在。在RNN和LSTM中,Tanh 仍然很常用,但在前馈网络中,ReLU 已经成了主流。
4.3.3 ReLU 函数
ReLU(Rectified Linear Unit)是目前最常用的激活函数,公式简单到令人发指:
ReLU(x) = max(0, x)
它的优点是:
- 计算简单: 就是取最大值,没有指数运算。
- 缓解梯度消失: 在正区间梯度恒为1,不会饱和。
- 稀疏激活: 一部分神经元输出为0,增加了网络的稀疏性。
但 ReLU 也有个问题——神经元“死亡”。如果某个神经元的输入一直为负,它的梯度就是0,权重再也无法更新。我在做音频降噪时遇到过这种情况,后来用 Leaky ReLU 或者 PReLU 解决了。
| 激活函数 | 输出范围 | 优点 | 缺点 |
|---|---|---|---|
| Sigmoid | (0, 1) | 可解释为概率 | 梯度饱和,非零中心 |
| Tanh | (-1, 1) | 零中心输出 | 梯度饱和 |
| ReLU | [0, +∞) | 计算快,缓解梯度消失 | 神经元死亡 |
4.4 损失函数:衡量预测的好坏
损失函数量化了模型预测值与真实值之间的差距。训练的过程,就是最小化这个损失函数。
在音频降噪任务中,我们最常用的是以下两种。
4.4.1 均方误差(MSE)
MSE 计算预测值与真实值之差的平方的平均值:
MSE = (1/n) * Σ(y_true - y_pred)²
它的特点是:
- 对大误差惩罚更重: 因为误差被平方了。
- 数学性质好: 处处可导,优化方便。
- 对异常值敏感: 一个离群点就可能把loss拉得很高。
我在做语音增强时,MSE 是最常用的损失函数。但它有个问题——MSE 最小化并不直接等于感知上的音质最好。有时候 MSE 很低,但听起来还是有明显的背景噪声。
4.4.2 平均误差(MAE)
MAE 计算预测值与真实值之差的值的平均值:
MAE = (1/n) * Σ|y_true - y_pred|
它的特点是:
- 对异常值更鲁棒: 不像 MSE 那样被平方放大。
- 梯度恒定: 在误差不为0时,梯度始终是 ±1,不会像 MSE 那样梯度随误差减小而变小。
但 MAE 在误差接近0时梯度不连续,这会影响优化效率。在实际项目中,我经常把 MSE 和 MAE 结合起来用,比如在训练初期用 MSE 快速收敛,后期用 MAE 微调。
| 特性 | MSE | MAE |
|---|---|---|
| 对异常值敏感度 | 高 | 低 |
| 梯度特性 | 随误差减小而减小 | 恒定(除0点外) |
| 收敛速度 | 初期快,后期慢 | 全程较稳定 |
| 音频降噪适用性 | 常用,但需配合其他指标 | 对突发噪声更鲁棒 |
4.5 反向传播:让网络学会“纠错”
有了损失函数,我们怎么更新网络的权重呢?答案就是反向传播算法。
核心思想很简单:计算损失函数对每个权重的梯度,然后沿着梯度下降的方向更新权重。用链式法则从输出层一层一层往回传。
更新公式:
w_new = w_old - learning_rate * ∂L/∂w
其中 learning_rate 是学习率,控制每次更新的步长。
我曾经犯过一个错误:学习率设得太大,结果loss直接炸了,变成了NaN。后来我学乖了,一般从 0.001 开始试,配合学习率衰减策略。
好了,这一章的内容就到这里。感知机、MLP、激活函数、损失函数,这些是深度学习最基础的组件。别看它们简单,但理解透彻了,后面学CNN、RNN、Transformer都会轻松很多。