深度学习基础:从感知机到激活函数和简单算法解析(附代码实现)
引言:
为什么需要深度学习? 传统机器学习(如决策树、SVM)需要人工设计特征(如手写数字识别中手动提取边缘、纹理特征),但面对图像、语音等复杂数据时,人工特征设计难度大、效果差。深度学习的核心价值在于:自动从数据中学习多层级的特征表示,无需人工干预——就像教孩子认识猫,不用告诉他“猫有尖耳朵、毛茸茸”,而是让他看1000张猫的图片,自然总结出猫的特征,所以神经网络成功取决于三大因素:大数据,计算能力和算法创新。 本文将从最基础的感知机出发,循序渐进讲解,配可运行代码,帮你夯实深度学习基础。
一、入门基石:感知机(神经网络的“砖块”)
1、感知机是什么?
感知机(Perceptron)通常指单层感知机,是一种简单的二元线性分类器,也是最早的前馈神经网络模型之一(由Frank Rosenblatt在1957年提出)。 它的核心作用是解决二分类问题(比如判断“是/否”“正/负”),属于监督学习算法。
2、单层感知机的结构
单层感知机的结构非常简单,只有输入层和输出层,没有隐藏层:
- 输入层:接收原始数据(特征向量);
- 输出层:输出分类结果(0或1)。
它的计算逻辑可以概括为:
- 对输入特征做加权求和(结合权重和偏置)
- 通过阈值/激活函数判断结果,输出分类标签。
3、感知机的数学模型
感知机的基本形式可以表示为: f(x) = sign(w*x +b)
其中:
- x :输入向量(比如样本的特征)
- w :权重向量(每个特征对应的重要程度);
- b :偏置项(调整分类的“门槛”);
- sign:符号函数(激活函数)
4、单层感知机的训练逻辑
单层感知机的权重更新过程,本质是最简单的梯度下降:
- 当预测结果与真实标签不一致时,沿“减少误差”的方向调整权重 w 和偏置 b
- 但它通常不被称为“反向传播”——因为反向传播是多层网络的误差传递方式,而单层感知机只有一层权重,无需逐层传播误差。
5、从“单层”到“多层”:感知机的进化
单层感知机只能解决线性可分问题(比如用直线分隔两类数据),但面对“异或(XOR)”这类线性不可分问题时会失效。 于是有了多层感知机(MLP):
- 结构:包含输入层、隐藏层、输出层(至少3层);
- 特点:每一层由多个感知机(神经元)组成,通过隐藏层对特征做“非线性转换”;
- 作用:解决线性不可分问题,是现代神经网络的基础结构。
6、接下来让我们动手编写一个前馈网络(Feed-Forward Network,FFN)来进行二分类,由于模型没有被训练,所以答案是错误的:
import numpy as np
x = np.array([[0,0],[0,1],[1,0],[1,1]])
y = np.array([0,0,0,1])
w = np.random.randn(2)#权重
b = np.random.randn()#偏置
def activate(x):#激活函数和阈值
return 1 if x >=0 else 0
#前馈传播
def forward_propagation(x,w,b):
z = np.dot(x,w) + b
a = activate(z)
return a
#测试前馈传播
for i in range(len(x)):
output = forward_propagation(x[i],w,b)
print('输入:',x[i],'输出:',output)
输出1,1,0,1
7、权重更新
在深度学习中,权重更新是模型训练的核心环节——通过调整网络的权重(w)和偏置(b),让模型输出逐渐接近真实标签。
权重更新的目标:最小化损失函数
深度学习的训练过程可以看作优化问题:通过调整权重和偏置,最小化“损失函数”(模型预测值与真实值的差异)。
常用的损失函数是均方误差(适用于回归/分类问题): 其中:
- y:真实标签(目标输出);
- o:模型预测输出(o = wx + b)。
8、权重更新的方法:梯度下降
梯度下降是权重更新的核心算法——沿“损失函数的负梯度方向”调整参数,逐步接近损失最小值。
- 梯度的计算(链式法则)
要更新权重 w 和偏置 b,需先计算损失函数对它们的梯度(导数):
(1)损失对权重 w 的梯度
已知 o = wx + b,结合链式法则:
- 第一步:(对均方误差求导);
- 第二步:(对 o = wx + b 求导);
最终梯度:
(2)损失对偏置 b 的梯度
同理:
- 权重更新公式
沿负梯度方向更新参数(η 为学习率,控制更新幅度):
- 权重更新:
- 偏置更新:
9、多层网络的权重更新:反向传播(BP)
单层感知机的权重更新逻辑简单,但多层神经网络(如MLP)需要用反向传播(Back Propagation) 计算各层梯度: 反向传播的核心逻辑
通过链式法则+动态规划,从输出层向输入层逐层传递误差,计算每一层的梯度:
- 先计算输出层的误差;
- 利用“后一层的梯度”和“当前层的导数”,推导当前层的梯度;
- 逐层更新各层的权重和偏置。
反向传播的代码实现(以单层感知机为例)
learning_rate = 0.1 # 学习率
def backward_propagation(x, w, b, y, output):
# 1. 计算误差:真实值 - 预测值
error = y - output
# 2. 计算权重更新量
delta_w = learning_rate * error * x
# 3. 计算偏置更新量
delta_b = learning_rate * error
# 4. 更新权重和偏置
new_b = b + learning_rate * error
w +=delta_w
return new_b
#b为浮点数,为不可变
完整训练流程(含前向+反向传播)
import numpy as np
x = np.array([[0,0],[0,1],[1,0],[1,1]])
y = np.array([0,0,0,1])
w = np.random.randn(2)#权重
b = np.random.randn()#偏置
threshold = 3
def activate(x):
return 1 if x >=0 else 0
#前馈传播
def forward_propagation(x,w,b):
z = np.dot(x,w) + b
a = activate(z)
return a
#反向传播
learning_rate = 0.3
#propagation:传播,宣传,培养
def backward_propagation(x,w,b,y,output):
error = y - output
deltaw = learning_rate * error * x
new_b = b + learning_rate * error
w +=deltaw
return new_b
#b为浮点数,为不可变
epochs = 100
#epoch:迭代次数
for i in range(epochs):
for j in range(len(x)):
output = forward_propagation(x[j],w,b)
b = backward_propagation(x[j],w,b,y[j],output)
#测试训练后的
for i in range(len(x)):
output = forward_propagation(x[i],w,b)
print('input:',x[i],'ouput:',output)
二、激活函数全解析
激活函数是人工神经网络的“灵魂”——它为网络引入非线性,让模型能拟合复杂数据模式。没有激活函数,多层网络会退化为线性模型,失去深度的价值。
1、激活函数的核心作用
- 引入非线性:突破线性运算的限制,让网络学习复杂映射关系;
- 控制信息流动:决定神经元是否“激活”,筛选并传递有效信息;
- 辅助梯度传播:合理的激活函数能避免梯度消失/爆炸,加速模型训练。
2、经典激活函数
- Sigmoid函数(Logistic函数)
- 功能:将输入映射到 [0,1] 区间,常用于二分类任务的输出层(表示概率);
- 公式:
- 优点:输出可解释为概率,平滑连续;
- 缺点:存在“梯度消失”(输入绝对值过大时导数接近0),输出非零均值。
- 双曲正切函数(tanh函数)
-
功能:将输入映射到 [-1,1] 区间,常用于隐藏层;
-
公式:
-
优点:输出均值为0,梯度消失问题比Sigmoid轻;
-
缺点:仍存在梯度消失问题。
- ReLU函数
- 功能:对正值输入直接输出,负值输入输出0,是当前隐藏层的主流激活函数;
- 公式:
- 优点:计算简单,缓解梯度消失,训练速度快;
- 缺点:存在“神经元死亡”(负值输入时梯度为0,永久不更新)。
- Leaky ReLU函数
- 功能:解决ReLU的“神经元死亡”问题,负值输入时保留小梯度;
- 公式:
- 优点:避免神经元死亡,保留ReLU的训练效率;
- 缺点:小斜率(如0.01)是固定值,缺乏适应性。
- Parametric ReLU函数(PReLU)
- 功能:在Leaky ReLU基础上,将负值输入的斜率设为可学习参数;
- 公式:
- 特点:适应性强,能根据数据自动调整斜率。
- Softmax函数
- 功能:将输入向量归一化为概率分布(总和为1),常用于多分类任务的输出层;
- 公式:
3、新型激活函数
- Swish函数
- 提出:Google团队2017年提出;
- 公式:
- 平滑性:连续可导,利于梯度传播;
- 非线性:引入可学习的非线性趋势,增强网络表达能力;
- 自适应性:形状可通过学习调整,适配不同数据。
- GLU(门控线性单元)
- 提出:Google Brain团队,广泛用于Transformer等模型;
- 核心思想:通过门控机制控制信息流动——将输入分为“门”和“激活向量”,门控决定哪些信息被保留;
- 功能:
- 增强信息表达:选择性传递有效信息;
- 缓解梯度消失:保留非线性变换的梯度;
- 提升建模能力:擅长处理自然语言等序列数据。
- SwiGLU
- 提出:2020年Google团队提出,结合GLU和Swish的特性;
- 门控控制:用Sigmoid调节信息流;
- 非线性:引入Swish的非线性特性;
- 上下文建模:适合处理序列数据。
- GeGLU
- 提出:GLU的改进版,引入高斯误差项;
- 增强特征交互:每个输入维度可与其他维度交互;
- 降噪能力:提升模型在自然语言任务中的鲁棒性。
4、激活函数的选择建议
| 场景 | 激活函数 |
|---|---|
| 二分类输出层 | Sigmoid |
| 多分类输出层 | Softmax |
| 隐藏层(通用) | ReLU/Leaky ReLU/PReLU |
| 序列数据(如NLP) | GLU/SwiGLU/GeGLU |
| 追求适应性 | Swish/PReLU |
三、优化算法(函数)解析
优化算法是深度学习训练的“引擎”——通过调整模型参数(权重、偏置),最小化损失函数,让模型拟合数据规律。以下是主流优化算法的核心逻辑与对比。
1、优化算法的核心目标
通过迭代调整模型参数,最小化损失函数(模型预测与真实标签的差异),实现:
- 让模型输出更接近真实值;
- 避免局部最优,找到全局较优解;
- 加速训练收敛,提升模型泛化能力。
2、经典优化算法
- 梯度下降(Gradient Descent)
梯度下降是所有优化算法的基础,核心是沿损失函数的负梯度方向更新参数。
常见变体:
类型 核心逻辑 特点 批量梯度下降(BGD) 用全量数据计算梯度,更新参数 稳定但训练慢(数据量大时) 随机梯度下降(SGD) 用单个样本计算梯度,更新参数 训练快但震荡大 小批量梯度下降(MBGD) 用一小批样本计算梯度,更新参数 平衡训练速度与稳定性
- 动量优化(Momentum)
模拟物理“动量”,积累历史梯度的方向,减少震荡,加速收敛。
- 核心公式: 动量更新 参数更新 (v 为动量,β为动量系数,g 为当前梯度,η为学习率)
- 优点:缓解SGD的震荡,加速梯度下降;
- 缺点:动量系数固定,缺乏自适应性。
- AdaGrad
自适应学习率优化算法,对稀疏特征更友好(学习率随参数梯度的历史平方和调整)。
- 核心逻辑: 对每个参数,学习率与“梯度历史平方和的平方根”成反比,梯度大的参数学习率小,梯度小的参数学习率大。
- 优点:自动适配不同参数的学习率;
- 缺点:学习率单调递减,后期可能训练停滞。
- RMSProp
对AdaGrad的改进,引入指数移动平均,缓解学习率过早衰减的问题。
- 核心公式: (v 为梯度平方的移动平均,\epsilon 防止除零)
- 优点:避免学习率过快衰减,训练更稳定;
- 缺点:仅适配学习率,未结合动量。
- Adam
结合动量与自适应学习率的算法,是当前深度学习的主流优化器。
- 核心逻辑: 同时维护梯度的一阶矩(动量)和二阶矩(梯度平方的移动平均),自适应调整每个参数的学习率。
- 核心公式: (t 为迭代次数,β1=0.9, β2=0.999 为默认超参数)
- 特点:
- 优点:收敛快、稳定性强,适配大多数任务;
- 缺点:对学习率敏感,需调参。
- AdamW
Adam的变体,将权重衰减与梯度更新分离,解决Adam中权重衰减与学习率混淆的问题。
- 优点:优化过程更稳定,泛化能力更强;
- 适用场景:大模型训练(如Transformer)。
3、优化算法的继承关系
各优化算法的演进逻辑:
动量 + 梯度优化 → Momentum AdaGrad + 衰减系统 → RMSProp Momentum + RMSProp → Adam Adam + 权重衰减分离 → AdamW
4、优化算法选择建议
| 场景 | 模型 |
|---|---|
| 小数据集、简单模型 | SGD/MBGD |
| 稀疏特征任务 | AdaGrad/RMSProp |
| 通用深度学习任务 | Adam |
| 大模型、高泛化需求 | AdamW |
四、权值初始化,归一化
归一化是深度学习中稳定训练、加速收敛的关键技术——通过对数据分布进行调整,避免梯度消失/爆炸,让模型更高效地学习特征。以下是主流归一化方法的核心逻辑与对比。
1、归一化的核心目标
- 稳定数据分布:让每一层的输入分布保持相对稳定,缓解“内部协变量偏移”;
- 加速训练收敛:使激活函数处于梯度较陡的区域,避免梯度消失;
- 提升泛化能力:降低模型对参数初始化和学习率的敏感性。
2、主流归一化方法
- 批归一化(Batch Normalization, BN)
2015年提出的经典归一化方法,在“批维度”上对数据进行归一化(适用于CNN等批量训练场景)。
核心逻辑:
对每个batch的特征,分别计算均值和方差,将其归一化为“零均值、单位方差”的分布,再通过可学习参数(γ, β)恢复数据表达能力。
公式:
特点:
- 优点:加速收敛、缓解梯度消失,适配大多数CNN任务;
- 缺点:依赖batch大小(小batch效果差)、不适用于RNN等序列任务。
- 层归一化(Layer Normalization, LN)
在“层维度”上对数据进行归一化(不依赖batch,适用于RNN、Transformer等序列模型)。
核心逻辑:
对单个样本的所有特征计算均值和方差,进行归一化(与batch无关)。
特点:
- 优点:不依赖batch大小、适配序列任务;
- 缺点:对不同输入分布的适应性较弱。
- RMSNorm(Root Mean Square Layer Normalization)
LN的简化版,仅计算特征的均方根(不减去均值),减少计算量的同时保持稳定性。
核心逻辑:
- 优点:计算更快、适配长序列任务;
- 缺点:仅进行方差归一化,未处理均值偏移。
3、归一化方法的选择建议
| 场景 | 推荐方法 |
|---|---|
| CNN、大batch任务 | 批归一化(BN) |
| RNN、Transformer等序列任务 | 层归一化(LN)/ RMSNorm |
| 小batch、资源受限场景 | RMSNorm |