闲言:
今天都有哪些事呢,忘记拿我的电话卡了,算了下个月激活得了,电信卡注销了。不知道能返多少钱,据说是下个月了,然后宝贝的一条裤子退款还没到账呢,服了,据说是物流丢失了。上午尝试ipv6,远程实验室的电脑,结果是失败了emmmmm,明天再试试。明天开始yolo的学习。
第四章:神经网络的学习
1. 从感知机到神经网络
1.1 感知机的局限性
单层感知机:只能解决线性可分问题(如逻辑与、或、非),无法处理异或(XOR)等非线性问题。
数学表达:单层感知机的输出为
y = step(w·x + b),其中step是阶跃函数(非0即1)。
1.2 激活函数的引入
核心思想:用连续可导的激活函数替代阶跃函数,使模型能够通过梯度下降法学习参数。
常用激活函数:
Sigmoid:
σ(z) = 1 / (1 + e^{-z}),输出范围 (0,1),但存在梯度消失问题(导数最大仅0.25)。ReLU(Rectified Linear Unit):
ReLU(z) = max(0, z),计算高效且缓解梯度消失,但负区间梯度为0。
非线性能力的来源:通过叠加多个激活函数层,网络可以拟合任意复杂函数(万能逼近定理)。
1.3 多层前馈网络的结构
层级划分:
输入层:接收原始数据(如图像像素、文本向量)。
隐藏层:至少一层,通过权重矩阵和激活函数提取高阶特征。
输出层:根据任务选择激活函数(如Softmax用于分类,Sigmoid用于二分类,线性激活用于回归)。
前向传播公式(以全连接层为例):
z = W·x + b a = activation(z)W为权重矩阵,b为偏置向量,activation为激活函数。
2. 损失函数与梯度下降
2.1 损失函数(Loss Function)
作用:量化模型预测值与真实值的差异,指导参数优化方向。
常见类型:
均方误差(MSE):适用于回归任务。
L = 1/(2N) * Σ(y_pred - y_true)^2交叉熵损失(Cross-Entropy):适用于分类任务,与Softmax配合使用。
L = -1/N * Σ y_true * log(y_pred)二分类交叉熵:配合Sigmoid使用,处理二分类问题。
2.2 梯度下降法
核心思想:沿损失函数的负梯度方向更新参数,逐步逼近最小值。
参数更新公式:
W = W - η * ∂L/∂W b = b - η * ∂L/∂bη为学习率(learning rate),控制更新步长。
三种实现方式:
批量梯度下降(BGD):使用全部样本计算梯度,稳定但计算量大。
随机梯度下降(SGD):每次随机选取一个样本,速度快但波动大。
小批量梯度下降(Mini-batch SGD):折中方案,常用批量大小32/64/128。
2.3 数值梯度 vs 解析梯度
数值梯度(有限差分法):
公式:
∂L/∂w ≈ [L(w+ε) - L(w-ε)] / (2ε)(ε为微小扰动,如1e-7)。优点:实现简单,无需数学推导。
缺点:计算效率低(需多次前向传播),精度受ε影响。
解析梯度(反向传播):
通过链式法则直接计算梯度,高效且精确。
梯度检查:训练初期可用数值梯度验证反向传播的正确性。
3. 学习算法的核心步骤
3.1 随机初始化权重
必要性:对称权重(如全0初始化)会导致所有神经元输出相同,失去学习能力。
常用方法:
小随机数初始化(如高斯分布
N(0, 0.01))。后续章节的Xavier/He初始化(根据激活函数调整)。
3.2 前向传播计算损失
计算流程:
输入数据通过各层传递:
输入 → 隐藏层1 → 激活 → 隐藏层2 → 激活 → 输出层。输出层结果与真实标签计算损失值。
3.3 反向传播计算梯度
链式法则的应用:
从输出层开始,逐层计算损失对参数的梯度。
例如,对权重矩阵
W的梯度:∂L/∂W = ∂L/∂a * ∂a/∂z * ∂z/∂W。
计算示例(以Sigmoid激活的全连接层为例):
# 输出层梯度 dL_da = ∂L/∂a da_dz = a * (1 - a) # Sigmoid导数 dz_dW = x ∂L/∂W = dL_da * da_dz * dz_dW
3.4 梯度下降更新参数
参数更新:根据梯度方向和学习率调整权重和偏置。
代码示例(Python伪代码):
python复制
for param in [W1, b1, W2, b2]: grad = compute_gradient(param) # 通过反向传播得到梯度 param -= learning_rate * grad # 更新参数
关键问题与注意事项
梯度消失/爆炸:
Sigmoid激活函数在深层网络中易导致梯度消失(导数过小)。
解决方案:使用ReLU、梯度裁剪(Gradient Clipping)、残差连接(ResNet)。
学习率选择:
过大会导致震荡不收敛,过小则训练缓慢。
自适应学习率方法:AdaGrad、RMSProp、Adam(后续章节)。
批量大小的影响:
大批量训练更稳定,但可能陷入局部最优;小批量噪声大但泛化性好。
总结
从感知机到神经网络的核心突破在于:
激活函数赋予网络非线性能力;
损失函数与梯度下降将学习转化为优化问题;
反向传播高效计算梯度,使深层网络训练成为可能。
这些理论为后续卷积神经网络(CNN)、循环神经网络(RNN)等复杂模型奠定了基础。
第五章:误差反向传播法
1. 计算图与链式法则
1.1 计算图的基本概念
定义:将复杂的数学计算分解为节点(操作)和边(数据流)构成的图结构,直观表示计算过程。
核心思想:
前向传播:从输入到输出,沿箭头方向执行计算(如
x → 加法 → 平方 → 输出)。反向传播:从输出到输入,沿箭头反方向传递梯度,利用链式法则计算每个节点的局部梯度。
1.2 链式法则的数学原理
链式法则:复合函数的导数等于各层函数导数的乘积。
例如,函数
L = f(g(h(x)))的导数为:dL/dx = (dL/df) * (df/dg) * (dg/dh) * (dh/dx)
反向传播的数学本质:将链式法则应用于计算图,从输出端(损失函数)向输入端逐层传递梯度。
1.3 计算图的构建与示例
示例:简单函数
z = (x + y)^2前向计算图:
x → Add → Square → z y ↗反向传播过程:
计算
z对自身的梯度:dz/dz = 1。反向到
Square节点:dz/d(Add) = 2*(x + y)。反向到
Add节点:梯度分两条路径传递:dz/dx = 2*(x + y)dz/dy = 2*(x + y)
2. 反向传播的具体实现
2.1 关键步骤
局部梯度计算:
每个节点只需计算输入对输出的局部导数(如
加法节点的导数为1,乘法节点的导数为另一输入值)。示例:
乘法节点 z = x * y的梯度为:∂z/∂x = y, ∂z/∂y = x
梯度累加(加法节点):
若一个节点有多个上游梯度(如分支结构),梯度需累加而非覆盖。
示例:若
x同时参与两个计算a = x + 1和b = x * 2,则x的梯度为da/dx + db/dx。
分支处理(广播机制):
广播操作(如矩阵与标量相加)需在反向传播时调整梯度维度。
示例:
A(矩阵) + b(标量),反向时db = Σ所有元素的梯度。
2.2 模块化设计
层的抽象:将网络拆分为独立模块(如
Affine,ReLU,SoftmaxWithLoss),每层实现前向传播(forward)和反向传播(backward)。代码结构示例:
python复制
class Affine: def __init__(self, W, b): self.W = W self.b = b self.x = None def forward(self, x): self.x = x return np.dot(x, self.W) + self.b def backward(self, dout): dx = np.dot(dout, self.W.T) # 输入梯度 dW = np.dot(self.x.T, dout) # 权重梯度 db = np.sum(dout, axis=0) # 偏置梯度 return dx, dW, db反向传播的链式调用:
python复制
# 网络的反向传播 dloss = 1.0 # 损失函数的初始梯度 dloss = softmax_layer.backward(dloss) dloss = relu_layer.backward(dloss) dloss, dW, db = affine_layer.backward(dloss)
3. 反向传播 vs 数值梯度
3.1 反向传播的优势
效率:计算复杂度为
O(N)(N为参数数量),只需一次前向和一次反向传播。精度:解析梯度无近似误差,适合大规模训练。
3.2 数值梯度的作用
梯度检查(Gradient Check):验证反向传播实现的正确性。
步骤:
随机生成输入数据和初始参数。
计算反向传播得到的梯度
grad_backprop。用数值梯度公式计算
grad_numerical。比较两者的差异(如欧氏距离或相对误差)。
容错标准:相对误差小于
1e-7为通过。
数值梯度公式:
grad_numerical = (f(x + ε) - f(x - ε)) / (2 * ε)ε通常取1e-7,过大导致误差,过小引入浮点计算误差。
3.3 梯度检查的代码示例
python复制
def gradient_check(layer, x, epsilon=1e-7):
# 计算反向传播梯度
_, grad_backprop = layer.backward(x)
# 初始化数值梯度
grad_numerical = np.zeros_like(grad_backprop)
# 逐参数计算数值梯度
for i in range(grad_backprop.size):
old_val = layer.params.flat[i]
# f(x + ε)
layer.params.flat[i] = old_val + epsilon
fx_plus = layer.forward(x)
# f(x - ε)
layer.params.flat[i] = old_val - epsilon
fx_minus = layer.forward(x)
# 数值梯度
grad_numerical.flat[i] = (fx_plus - fx_minus) / (2 * epsilon)
layer.params.flat[i] = old_val # 恢复参数
# 计算相对误差
diff = np.linalg.norm(grad_backprop - grad_numerical)
grad_norm = np.linalg.norm(grad_backprop) + np.linalg.norm(grad_numerical)
relative_error = diff / (grad_norm + 1e-12)
return relative_error < 1e-7关键问题与注意事项
梯度爆炸与消失:
深层网络中,梯度可能指数级增大(爆炸)或趋近于零(消失)。
解决方案:权重初始化(Xavier/He)、梯度裁剪(Gradient Clipping)、残差连接。
计算图的动态性:
动态图框架(如PyTorch)允许运行时构建计算图,灵活但内存开销大。
静态图框架(如TensorFlow 1.x)需预先定义计算图,高效但灵活性差。
自动微分(Autograd):
现代深度学习框架(PyTorch、TensorFlow)自动构建计算图并实现反向传播。
用户只需定义前向传播,框架自动追踪计算过程生成计算图。
总结
计算图与链式法则是反向传播的理论基础,通过分解复杂计算实现高效梯度传递。
模块化设计将网络层抽象为独立单元,简化实现并提高代码复用性。
数值梯度是验证反向传播正确性的关键工具,但实际训练中必须依赖解析梯度。
反向传播是深度学习的核心技术之一,理解其原理和实现方式对模型调试和优化至关重要。
第六章:与学习相关的技巧
1. 优化策略
1.1 参数更新方法
SGD(随机梯度下降)的局限性
基本公式:W=W−η⋅∂W∂L
缺点:
在损失函数存在“峡谷”或“鞍点”时收敛缓慢(梯度方向震荡)。
所有参数使用相同的学习率,无法自适应调整。
改进优化器
动量法(Momentum):
引入速度变量模拟物理动量,缓解震荡。
公式:v=βv+(1−β)⋅∂W∂LW=W−η⋅v
β 为动量系数(通常取0.9),累积历史梯度方向。
效果:加速收敛,减少震荡(类似“惯性”冲过鞍点)。
Adam(Adaptive Moment Estimation):
结合动量法和自适应学习率(RMSProp)。
公式(简化版):mt=β1mt−1+(1−β1)⋅∂W∂L(一阶矩估计)vt=β2vt−1+(1−β2)⋅(∂W∂L)2(二阶矩估计)m^t=1−β1tmt,v^t=1−β2tvt(偏差修正)W=W−η⋅v^t+ϵm^t
默认参数:β1=0.9,β2=0.999,ϵ=1e−8。
优势:自适应调整学习率,适合稀疏梯度或噪声数据。
1.2 权重初始化
Xavier初始化
适用场景:Sigmoid、Tanh等饱和激活函数。
数学原理:保持输入和输出的方差一致,避免梯度消失/爆炸。
公式:W∼Uniform(−nin+nout6,nin+nout6)
nin 和 nout 分别为输入和输出的神经元数量。
He初始化
适用场景:ReLU及其变体(如Leaky ReLU)。
公式:W∼Normal(0,nin2)
原理:考虑ReLU的“单侧抑制”特性,调整方差为Xavier的2倍。
2. 正则化与泛化
2.1 过拟合对策
L2正则化(权重衰减)
原理:在损失函数中增加权重范数惩罚项,限制模型复杂度。
公式:Lnew=L+2λ∑W2
λ 为正则化强度,越大则权重越小。
反向传播影响:梯度更新时额外减去 λW。
Dropout
原理:训练时随机以概率 p 丢弃神经元,强制网络学习冗余特征。
实现:
训练时:每个神经元以概率 p 置零,剩余神经元缩放为 1/(1−p) 倍。
测试时:保留全部神经元,无需缩放。
效果:类似集成学习,提升模型鲁棒性。
数据增强(Data Augmentation)
图像任务:随机裁剪、旋转、翻转、调整亮度/对比度。
文本任务:同义词替换、随机删除/交换单词。
本质:通过扩展训练数据分布,提升模型泛化能力。
2.2 批量归一化(Batch Normalization)
操作步骤:
输入:某层输出的批次数据 x(形状为
(batch_size, features))。归一化:μ=N1∑xi,σ2=N1∑(xi−μ)2x^i=σ2+ϵxi−μ
缩放与平移:yi=γx^i+β
γ 和 β 为可学习参数,恢复模型的表达能力。
优势:
减少内部协变量偏移(Internal Covariate Shift),加速训练。
允许使用更大的学习率,缓解对初始化的敏感度。
轻微的正则化效果(类似Dropout)。
3. 超参数调优
3.1 验证集的使用
训练集/验证集/测试集划分:
训练集:更新模型参数。
验证集:选择超参数(如学习率、正则化强度)。
测试集:仅用于最终评估,避免数据泄露。
3.2 超参数搜索策略
网格搜索(Grid Search)
遍历所有可能的超参数组合(如学习率
[0.1, 0.01]和批量大小[32, 64])。缺点:计算成本高,维度灾难(超参数越多越不实用)。
随机搜索(Random Search)
在超参数空间中随机采样(如学习率从对数均匀分布采样)。
优势:高维空间中更高效,可能更快发现优秀组合。
其他方法(进阶):
贝叶斯优化:基于历史结果建模目标函数,指导下一步采样。
自动化调参工具:如Hyperopt、Optuna。
3.3 关键超参数
学习率(η)
常用范围:
[1e-5, 1e-1],可从对数均匀分布采样(如10^{-4} \sim 10^{-2})。学习率衰减:训练后期逐步减小学习率(如
η = η0 * 0.95^epoch)。
批量大小(Batch Size)
权衡:大批量训练稳定但内存占用高,小批量噪声大但泛化性好。
常用值:32、64、128、256。
正则化强度(λ)
L2正则化:范围
[0.0001, 0.1]。Dropout概率:
[0.3, 0.7](输入层较低,隐藏层较高)。
关键问题与注意事项
梯度消失/爆炸的联合应对
组合使用权重初始化(He)、批量归一化、残差连接。
过拟合的诊断与处理
训练损失低,验证损失高 → 加强正则化(增大λ或Dropout概率)。
训练和验证损失均高 → 检查模型容量或优化策略。
Batch Norm的部署细节
训练时使用批次统计量,测试时使用移动平均统计量。
与Dropout共用时注意顺序(通常为
Conv → BN → ReLU → Dropout)。
总结
优化策略:从SGD到Adam,结合自适应学习率与动量,加速收敛。
正则化技术:L2、Dropout、Batch Norm共同提升泛化能力。
超参数调优:随机搜索为主,验证集严格隔离测试数据。
这些技巧是构建高性能深度学习模型的基石,后续章节(如CNN、RNN)将在此基础上引入领域特定的结构设计。
第七章:卷积神经网络(CNN)
1. 卷积层的核心思想
1.1 局部感受野(Local Receptive Field)
基本概念:
卷积核(Filter/Kernel)仅关注输入数据的局部区域,而非全连接层的全局连接。示例:3×3的卷积核每次仅处理输入图像的3×3区域。
生物学启发:模仿视觉皮层神经元对局部刺激的响应。
优势:
参数减少:避免全连接层的参数爆炸(如输入224x224图像,全连接层参数量级为10^7,而3x3卷积核仅需9个参数)。
局部特征提取:捕捉边缘、纹理等底层特征。
1.2 权值共享(Weight Sharing)
定义:同一卷积核在输入的不同位置重复使用,提取相同类型的特征。
数学表达:
输入矩阵 X,卷积核 W,输出特征图 Y 的每个元素为:Yi,j=m=0∑k−1n=0∑k−1Wm,n⋅Xi+m,j+n+bk 为卷积核大小(如3),b 为偏置。
参数量计算:
单个3×3卷积核的参数量为 3×3×Cin+1(偏置),Cin 为输入通道数。
1.3 填充(Padding)与步长(Stride)
填充(Padding):
目的:保持输出尺寸与输入一致(如边缘信息保留)。
操作:在输入周围填充零(Zero Padding)或其他值。
输出尺寸公式:Hout=⌊SHin+2P−k⌋+1
Hin:输入高度,P:填充数,k:卷积核大小,S:步长。
步长(Stride):
作用:控制卷积核滑动间隔,实现降采样(Downsampling)。
示例:步长2使输出尺寸减半。
2. 池化层与网络结构
2.1 池化(Pooling)
目的:降低空间分辨率,减少计算量,增强平移不变性。
类型:
Max Pooling:取区域最大值,保留最显著特征。
Average Pooling:取区域平均值,平滑特征。
操作示例:2×2池化窗口,步长2,输出尺寸减半。
反向传播:Max Pooling需记录最大值位置,梯度仅传递到对应输入位置。
2.2 经典CNN架构
LeNet-5(1998)
结构:
Input(32×32) → Conv6(5×5) → AvgPool → Conv16(5×5) → AvgPool → FC(120) → FC(84) → Output(10)应用:手写数字识别(MNIST),首次展示卷积层的实用性。
AlexNet(2012)
创新点:
使用ReLU激活函数缓解梯度消失。
引入Dropout和Data Augmentation防止过拟合。
多GPU训练(当时硬件限制下的分布式计算)。
结构:
Input(224×224×3) → Conv(11×11, 96, stride4) → MaxPool → Conv(5×5, 256) → MaxPool → Conv(3×3, 384) → Conv(3×3, 384) → Conv(3×3, 256) → MaxPool → FC(4096) → FC(4096) → Output(1000)意义:在ImageNet竞赛中突破性表现,推动深度学习复兴。
通用结构模式:
堆叠模块:
Conv → ReLU → Pooling重复多次,后接全连接层(FC)。深层网络趋势:VGG(小卷积核堆叠)、ResNet(残差连接)等。
3. 可视化与可解释性
3.1 卷积核可视化
浅层卷积核:
示例:第一层卷积核学习到边缘检测器(水平/垂直/斜边)、颜色斑块。
可视化方法:将卷积核权重映射为图像(如3×3×3的RGB卷积核显示为3×3彩色块)。
深层卷积核:
特征抽象:高层卷积核响应复杂模式(如车轮、动物眼睛、纹理组合)。
可视化技术:
激活最大化:生成使某神经元激活最大的输入图像。
遮挡实验:遮挡图像区域,观察输出概率变化。
3.2 CNN的先天优势
平移不变性(Translation Invariance)
定义:目标在图像中平移后,CNN仍能识别。
来源:池化操作(如Max Pooling)忽略局部位置细节。
层次化特征学习
浅层:边缘、颜色、纹理(通用特征)。
中层:部件组合(如车轮、窗户)。
深层:语义对象(如人脸、车辆)。
空间层次性(Spatial Hierarchy)
小卷积核捕捉局部细节,大感受野(通过堆叠层)整合全局信息。
关键问题与扩展
1×1卷积的作用:
降维/升维(调整通道数),跨通道信息融合,替代全连接层。
空洞卷积(Dilated Convolution):
扩大感受野而不增加参数量,用于分割任务(如WaveNet、DeepLab)。
转置卷积(Transposed Convolution):
实现上采样,用于生成(GAN)或分割网络。
总结
卷积层通过局部连接和权值共享,高效提取空间特征。
池化层降低维度并增强模型鲁棒性。
经典架构(LeNet、AlexNet)奠定CNN基础,后续模型(ResNet、Transformer)在此范式上创新。
可视化揭示了CNN从底层到高层的特征学习过程,证明其符合人类视觉认知规律。
CNN的设计思想深刻影响了计算机视觉领域,并启发了自然语言处理(如TextCNN)、语音识别等跨学科应用。