第3章:深度学习入门:感知机模型、激活函数、损失函数与梯度下降
说实话,每次带新人入门深度学习,我都是从感知机讲起。为什么?因为它是所有神经网络的基础。你想想看,从最简单的单层感知机,到如今动辄几百层的Transformer,核心思想其实没变——就是「加权求和 + 非线性变换」。我在2016年第一次用Keras搭模型时,就是被这个简洁的逻辑震撼到了。
3.1 感知机模型:一切从这里开始
感知机(Perceptron)是1957年由Frank Rosenblatt提出的。说白了,它就是模仿生物神经元的一种数学结构。
一个感知机接收多个输入信号,每个信号有对应的权重,然后求和,再通过一个阈值判断是否激活。数学表达式很简单:
y = sign(w₁x₁ + w₂x₂ + ... + wₙxₙ + b)
其中sign是阶跃函数,输出要么是1,要么是-1。
我个人习惯把感知机看作一个「二分类器」。它会在特征空间中画一条直线,把数据分成两类。但注意——它只能处理线性可分的问题。我记得有一次在项目中想用单层感知机做图像分类,结果怎么调都不收敛。后来才意识到,图像数据哪有线性可分的?
3.2 激活函数:给模型注入非线性
为什么需要激活函数?你想想看,如果只用线性变换,那堆叠再多层也等价于一层。说白了就是「叠了个寂寞」。激活函数的作用就是引入非线性,让网络有能力拟合复杂函数。
我常用的三种激活函数,咱们一个一个说。
3.2.1 Sigmoid函数
Sigmoid把输入映射到(0,1)之间,公式是:
σ(x) = 1 / (1 + e⁻ˣ)
它的优点是输出平滑,适合做概率输出。但有个致命问题——梯度饱和。当x很大或很小时,梯度几乎为0,导致深层网络训练不动。
3.2.2 Tanh函数
Tanh是Sigmoid的改进版,输出范围是(-1,1):
tanh(x) = (eˣ - e⁻ˣ) / (eˣ + e⁻ˣ)
它解决了Sigmoid输出非零均值的问题,但梯度饱和依然存在。我在做RNN相关项目时,偶尔会用Tanh,因为它能让梯度在正负方向都有变化。
3.2.3 ReLU函数
ReLU是目前最常用的激活函数,没有之一:
ReLU(x) = max(0, x)
它简单粗暴——正数保留,负数归零。好处是计算快、梯度不饱和。但有个问题叫「神经元死亡」:如果某个神经元一直输出负数,它的梯度永远是0,就再也学不动了。
下面这张图展示了三种激活函数的对比:
3.3 损失函数:衡量模型的好坏
损失函数就是告诉模型「你错得有多离谱」。我选损失函数的原则很简单:看任务类型。
| 任务类型 | 常用损失函数 | 说明 |
|---|---|---|
| 回归 | 均方误差(MSE) | 预测值与真实值差的平方均值 |
| 二分类 | 二元交叉熵 | 配合Sigmoid使用 |
| 多分类 | 分类交叉熵 | 配合Softmax使用 |
举个例子。做回归预测房价时,我用MSE。做图像分类时,我用交叉熵。为什么?因为交叉熵对概率分布更敏感,梯度更新更有效。
3.4 梯度下降:让模型学会学习
有了损失函数,接下来就是怎么让损失变小。梯度下降就是干这个的。
它的核心思想很简单:沿着损失函数下降最快的方向,更新参数。数学上就是求梯度(导数),然后往反方向走一步。
w_new = w_old - learning_rate * gradient
这里有个关键参数——学习率。它决定了每一步走多大。
梯度下降有三种常见变体:
- 批量梯度下降(BGD): 用全部数据算梯度。准确但慢,数据量大时跑不动。
- 随机梯度下降(SGD): 每次用一个样本算梯度。快但不稳定,loss曲线像心电图。
- 小批量梯度下降(Mini-batch GD): 折中方案,每次用一小批样本。我90%的项目都用这个。
下面这张图展示了梯度下降的优化过程:
3.5 把它们串起来:一个完整的训练流程
好了,现在我们把所有概念串起来。一个完整的深度学习训练流程是这样的:
- 初始化网络参数(权重和偏置)
- 前向传播:输入数据经过感知机、激活函数,得到预测值
- 计算损失:用损失函数比较预测值和真实值
- 反向传播:计算损失对每个参数的梯度
- 梯度下降:用梯度更新参数
- 重复2-5步,直到损失收敛
这个过程,说白了就是「猜答案 → 看错多少 → 调整参数 → 再猜」。我刚开始学的时候觉得这很神奇,后来发现它本质上就是一个不断试错的过程。只不过,这个试错过程有数学保证——只要学习率合适,损失函数是凸的,就一定能收敛到全局最优。
当然,现实中的神经网络是非凸的,所以会陷入局部最优。但实践证明,在深度学习中,局部最优往往已经足够好了。嗯,这里要注意,不要被「局部最优」这个词吓到,很多时候它并不影响实际效果。
公众号:蓝海资料掘金营,微信deep3321