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

说实话,每次带新人入门深度学习,我都是从感知机讲起。为什么?因为它是所有神经网络的基础。你想想看,从最简单的单层感知机,到如今动辄几百层的Transformer,核心思想其实没变——就是「加权求和 + 非线性变换」。我在2016年第一次用Keras搭模型时,就是被这个简洁的逻辑震撼到了。

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

感知机(Perceptron)是1957年由Frank Rosenblatt提出的。说白了,它就是模仿生物神经元的一种数学结构。

一个感知机接收多个输入信号,每个信号有对应的权重,然后求和,再通过一个阈值判断是否激活。数学表达式很简单:

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

其中sign是阶跃函数,输出要么是1,要么是-1。

我个人习惯把感知机看作一个「二分类器」。它会在特征空间中画一条直线,把数据分成两类。但注意——它只能处理线性可分的问题。我记得有一次在项目中想用单层感知机做图像分类,结果怎么调都不收敛。后来才意识到,图像数据哪有线性可分的?

核心要点: 感知机是线性分类器,无法解决异或(XOR)问题。这是它的天花板,也是多层神经网络的起点。

3.2 激活函数:给模型注入非线性

为什么需要激活函数?你想想看,如果只用线性变换,那堆叠再多层也等价于一层。说白了就是「叠了个寂寞」。激活函数的作用就是引入非线性,让网络有能力拟合复杂函数。

我常用的三种激活函数,咱们一个一个说。

3.2.1 Sigmoid函数

Sigmoid把输入映射到(0,1)之间,公式是:

σ(x) = 1 / (1 + e⁻ˣ)

它的优点是输出平滑,适合做概率输出。但有个致命问题——梯度饱和。当x很大或很小时,梯度几乎为0,导致深层网络训练不动。

避坑指南: 我曾经在做一个5层的分类网络时,全部用了Sigmoid。结果训练了3个epoch,loss几乎没降。后来换成ReLU,10个epoch就收敛了。Sigmoid在深层网络中要慎用。

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,就再也学不动了。

我的经验: 默认用ReLU,如果发现大量神经元死亡,试试Leaky ReLU或ELU。我在一个语音识别项目中,用ReLU死活训不好,换成Leaky ReLU后效果立竿见影。

下面这张图展示了三种激活函数的对比:

三种常用激活函数对比 Sigmoid Tanh ReLU 输出值 输入值 Sigmoid Tanh ReLU

3.3 损失函数:衡量模型的好坏

损失函数就是告诉模型「你错得有多离谱」。我选损失函数的原则很简单:看任务类型。

任务类型 常用损失函数 说明
回归 均方误差(MSE) 预测值与真实值差的平方均值
二分类 二元交叉熵 配合Sigmoid使用
多分类 分类交叉熵 配合Softmax使用

举个例子。做回归预测房价时,我用MSE。做图像分类时,我用交叉熵。为什么?因为交叉熵对概率分布更敏感,梯度更新更有效。

关键认知: 损失函数的选择直接影响训练效果。选错了,模型可能永远学不到你想要的东西。

3.4 梯度下降:让模型学会学习

有了损失函数,接下来就是怎么让损失变小。梯度下降就是干这个的。

它的核心思想很简单:沿着损失函数下降最快的方向,更新参数。数学上就是求梯度(导数),然后往反方向走一步。

w_new = w_old - learning_rate * gradient

这里有个关键参数——学习率。它决定了每一步走多大。

我曾经踩过的坑: 学习率设太大,loss直接炸了,变成NaN。设太小,训了100个epoch还在原地踏步。后来我学乖了,先用0.001试试,再根据loss曲线调整。

梯度下降有三种常见变体:

  • 批量梯度下降(BGD): 用全部数据算梯度。准确但慢,数据量大时跑不动。
  • 随机梯度下降(SGD): 每次用一个样本算梯度。快但不稳定,loss曲线像心电图。
  • 小批量梯度下降(Mini-batch GD): 折中方案,每次用一小批样本。我90%的项目都用这个。

下面这张图展示了梯度下降的优化过程:

梯度下降优化过程 起点 最优解 迭代次数 损失值
实用建议: 我一般用Adam优化器作为默认选择。它结合了动量和自适应学习率,对大多数问题都有效。如果数据量特别大,我会试试SGD + 学习率衰减。

3.5 把它们串起来:一个完整的训练流程

好了,现在我们把所有概念串起来。一个完整的深度学习训练流程是这样的:

  1. 初始化网络参数(权重和偏置)
  2. 前向传播:输入数据经过感知机、激活函数,得到预测值
  3. 计算损失:用损失函数比较预测值和真实值
  4. 反向传播:计算损失对每个参数的梯度
  5. 梯度下降:用梯度更新参数
  6. 重复2-5步,直到损失收敛

这个过程,说白了就是「猜答案 → 看错多少 → 调整参数 → 再猜」。我刚开始学的时候觉得这很神奇,后来发现它本质上就是一个不断试错的过程。只不过,这个试错过程有数学保证——只要学习率合适,损失函数是凸的,就一定能收敛到全局最优。

当然,现实中的神经网络是非凸的,所以会陷入局部最优。但实践证明,在深度学习中,局部最优往往已经足够好了。嗯,这里要注意,不要被「局部最优」这个词吓到,很多时候它并不影响实际效果。

本章核心: 感知机是基础,激活函数引入非线性,损失函数衡量误差,梯度下降驱动学习。这四个概念,构成了深度学习的基石。后面的所有内容,都是在这四个概念上的扩展和优化。

公众号:蓝海资料掘金营,微信deep3321