4. 深度学习入门:感知机模型、激活函数、损失函数与梯度下降

各位同学,今天我们聊点真正硬核的东西——深度学习的基础。说实话,很多搞神经信号处理的朋友,一上来就扎进CNN、RNN这些花里胡哨的网络里,结果调参调到怀疑人生。我个人的经验是,先把地基打牢,后面盖楼才稳当。

这一节,我们就从最原始的感知机讲起,一路捋到激活函数、损失函数,最后看看梯度下降到底是怎么让网络学会东西的。嗯,内容不少,但都是干货。

4.1 感知机模型:一切从这里开始

感知机(Perceptron)是1957年由Frank Rosenblatt提出的。说白了,它就是模仿我们大脑里一个神经元的工作方式——接收多个输入,加权求和,然后决定是否“兴奋”(输出1)或者“沉默”(输出0)。

数学上长这样:

y = sign(w₁x₁ + w₂x₂ + ... + wₙxₙ + b)

其中sign是阶跃函数,大于0输出1,否则输出0。w是权重,b是偏置。

我在早期做EEG信号二分类时,试过用感知机做基线模型。效果嘛……只能说勉强能用。但它的意义在于,让我们理解了“学习”的本质——就是不断调整w和b,让输出接近真实标签。

核心要点:感知机只能解决线性可分问题。像XOR这种非线性问题,单层感知机搞不定。这也是它后来被冷落的原因。

4.2 激活函数:给网络注入非线性

你想想看,如果只用线性加权求和,那不管堆多少层,本质上还是一个线性变换。那还谈什么深度学习?所以我们需要激活函数,给网络引入非线性能力。

常用的有三种,我一个个说。

4.2.1 Sigmoid函数

公式:σ(x) = 1 / (1 + e⁻ˣ)

输出范围在(0, 1)之间。早期神经网络很喜欢用它,因为它能把任意实数映射成概率值。

但是! 我在项目中吃过它的亏。Sigmoid有两个致命问题:

  • 梯度饱和:当x很大或很小时,梯度几乎为0,网络学不动了。
  • 非零中心:输出恒为正,导致梯度更新时出现“Zigzag”现象,收敛慢。

避坑指南:我曾经在一个深层分类任务里用了Sigmoid,结果训练到一半loss死活降不下去。后来换成ReLU,问题立马解决。所以,除非你是做二分类的输出层,否则尽量别用Sigmoid做隐藏层激活。

4.2.2 Tanh函数

公式:tanh(x) = (eˣ - e⁻ˣ) / (eˣ + e⁻ˣ)

输出范围在(-1, 1)之间。它解决了Sigmoid的非零中心问题,但梯度饱和问题依然存在。

我个人习惯在RNN或者某些需要对称输出的场景下用Tanh。比如处理双极性神经信号时,Tanh的表现往往比Sigmoid好。

4.2.3 ReLU函数

公式:ReLU(x) = max(0, x)

这玩意儿现在几乎是默认配置了。计算简单,梯度不会饱和,收敛快。

但ReLU也有个坑——神经元死亡。如果某个神经元一直输出负值,它的梯度就是0,再也活不过来了。我曾经在一个40层的网络里遇到过,一半神经元都死了……后来加了Leaky ReLU才救回来。

激活函数 输出范围 优点 缺点
Sigmoid (0, 1) 适合概率输出 梯度饱和,非零中心
Tanh (-1, 1) 零中心,对称性好 梯度饱和
ReLU [0, +∞) 计算快,缓解梯度消失 神经元死亡

4.3 损失函数:告诉模型错在哪

模型输出和真实标签之间总会有差距。损失函数就是量化这个差距的。我常用的有这几种:

  • 均方误差(MSE):适合回归任务。公式是 (y - ŷ)²。简单粗暴。
  • 交叉熵损失:分类任务的首选。尤其是多分类时,配合Softmax使用效果很好。

为什么分类任务不用MSE?我刚开始也纳闷。后来发现,MSE在分类任务中梯度太小,学得慢。交叉熵的梯度更大,收敛更快。说白了,就是“惩罚”得更狠。

小技巧:处理多通道神经信号分类时,我通常用交叉熵 + Softmax的组合。如果类别不平衡,可以加个权重调整一下。

4.4 梯度下降:让模型学会更新

有了损失函数,我们得想办法让损失变小。梯度下降就是干这个的。

核心思想很简单:沿着梯度的反方向更新参数,损失就会下降。

w = w - η * ∂L/∂w
b = b - η * ∂L/∂b

其中η是学习率。这个参数特别关键。设大了,loss震荡;设小了,半天学不动。

我一般这样调学习率:先用0.01试试,如果loss震荡就降到0.001,如果loss下降太慢就提到0.1。当然,现在有Adam这种自适应优化器,省心不少。

4.4.1 三种梯度下降方式

  • 批量梯度下降(BGD):用全部数据算一次梯度。准,但慢。数据量大时根本跑不动。
  • 随机梯度下降(SGD):每次用一个样本更新。快,但噪声大,容易震荡。
  • 小批量梯度下降(Mini-batch GD):折中方案。我一般用32或64的batch size,效果不错。

我的经验:处理神经信号时,batch size别太大。因为不同试次的信号差异大,batch太大反而会抹平细节。16或32就挺好。

4.5 知识体系总览

下面这张图,是我自己梳理的本章知识结构。你看一眼,心里就有谱了。

深度学习入门核心知识体系 感知机模型 线性加权 + 阶跃函数 激活函数 Sigmoid / Tanh / ReLU 损失函数 MSE / 交叉熵 梯度下降 BGD / SGD / Mini-batch GD 核心流程 输入 → 加权求和 → 激活函数 → 输出 → 计算损失 → 梯度下降更新权重

你看,整个流程其实就是一个闭环:输入数据,经过感知机(带激活函数)得到输出,算损失,然后用梯度下降更新参数。循环往复,直到损失不再下降。

嗯,这一节的内容就到这里。记住,理解这些基础概念,比背一堆网络结构有用得多。后面我们讲CNN、RNN的时候,你会发现,万变不离其宗。


专注资料整理