CNN 参数量计算:从卷积核到整网规模

副标题 / 摘要 CNN 的参数量取决于卷积核大小、通道数与偏置项。本文用 ACERS 框架给出计算公式、示例与工程实践,帮助你快速评估模型规模。 预计阅读时长:12~16 分钟 标签:cnn、parameter-count、convolution SEO 关键词:CNN, 参数量, 卷积, 模型大小 元描述:讲清 CNN 参数量的计算公式与工程取舍。 目标读者 想快速估算模型规模的初学者 关注部署成本与显存预算的工程实践者 需要做模型压缩与设计取舍的开发者 背景 / 动机 模型参数量直接影响训练速度、推理成本与部署体积。 对于 CNN,参数量可精确计算,但容易被忽略或算错。 掌握计算方法是做结构设计与成本评估的基础。 核心概念 卷积核参数量:核高 * 核宽 * 输入通道 * 输出通道。 偏置项:每个输出通道一个偏置。 组卷积:参数量随 groups 减少。 A — Algorithm(题目与算法) 用通俗语言说明主题内容 CNN 参数量的核心是: “每个输出通道有一组卷积核,核大小覆盖所有输入通道”。 基础示例(1) 卷积:3x3, in=3, out=64 参数量:333*64 + 64 = 1,792 基础示例(2) 1x1 卷积:in=256, out=128 参数量:11256*128 + 128 = 32,896 实践指南 / 步骤 明确卷积核大小 (KxK)。 确认输入通道数 C_in 与输出通道数 C_out。 计算参数量:K*K*C_in*C_out + C_out。 若是组卷积,再除以 groups。 可运行示例(最小 PyTorch 计算) import torch import torch.nn as nn conv = nn.Conv2d(3, 64, kernel_size=3, bias=True) params = sum(p.numel() for p in conv.parameters()) print(params) # 1792 解释与原理 卷积层参数量与输入图像大小无关,只与核与通道有关。 1x1 卷积参数量依然可能很大,因为通道数通常很高。 C — Concepts(核心思想) 方法类型 CNN 参数量计算属于模型规模评估方法,用于衡量存储与计算成本。 ...

2026年1月24日 · 2 分钟 · map[name:Jeanphilo]

CNN、RNN、LSTM 与 Transformer 的区别与适用场景

从依赖路径长度与资源复杂度两个核心概念出发,系统对比 CNN、RNN、LSTM 与 Transformer,并给出可运行示例与工程选型步骤。

2026年1月24日 · 9 分钟 · map[name:Jeanphilo]

动量(Momentum)优化的过程:从直觉到公式

副标题 / 摘要 动量通过累积历史梯度“惯性”来加速收敛、减少震荡。本文用 ACERS 框架拆解动量更新过程、公式与工程场景,并提供最小 PyTorch 示例。 预计阅读时长:12~16 分钟 标签:momentum、sgd、optimizer SEO 关键词:动量, Momentum, SGD, 优化器 元描述:系统讲清动量优化的更新过程与工程实践。 目标读者 想理解动量优化机制的入门读者 需要解决训练震荡与收敛慢问题的工程实践者 关注优化器调参的开发者 背景 / 动机 纯 SGD 在陡峭方向上容易震荡、在平缓方向上推进缓慢。 动量引入“速度”概念,让更新方向更稳定、收敛更快。 它是许多优化器(如 Adam)的核心组件之一。 核心概念 速度(Velocity):累计梯度形成的方向与幅度。 动量系数:控制历史梯度影响程度。 平滑更新:减少梯度噪声带来的震荡。 A — Algorithm(题目与算法) 用通俗语言说明主题内容 动量可以理解为: 每一步不仅看当前梯度,还看过去的梯度方向。 像滚小球一样,惯性会让它更容易越过浅坑。 基础示例(1) 在狭长“谷地”里,纯 SGD 左右摆动,而动量能沿谷底快速前进。 基础示例(2) 在噪声梯度场景,动量能平均掉噪声,方向更稳定。 实践指南 / 步骤 选择 momentum(常见 0.9)。 如果震荡明显,适当提高动量或降低学习率。 观察训练/验证曲线,确认收敛速度。 可运行示例(最小 PyTorch 动量更新) import torch torch.manual_seed(42) w = torch.tensor([5.0], requires_grad=True) velocity = torch.zeros_like(w) lr = 0.1 mu = 0.9 for _ in range(5): loss = (w - 1.0).pow(2) loss.backward() with torch.no_grad(): velocity = mu * velocity + w.grad w -= lr * velocity w.grad.zero_() print(w.item()) 解释与原理 速度累积让更新方向“更平滑”。 在弯曲损失面上,动量减少横向摆动。 学习率与动量需要联合调参。 C — Concepts(核心思想) 方法类型 动量属于一阶优化增强策略,通过历史梯度平滑更新。 ...

2026年1月24日 · 2 分钟 · map[name:Jeanphilo]

优化器的了解:从 SGD 到 Adam 的工程取舍

副标题 / 摘要 优化器决定训练速度、稳定性与最终泛化。本文按 ACERS 框架对比 SGD、Momentum、Adam、AdamW 等主流优化器,并给出最小可运行示例与工程实践建议。 预计阅读时长:15~18 分钟 标签:optimizer、sgd、adam、adamw SEO 关键词:优化器, SGD, Adam, AdamW 元描述:对比主流优化器原理与工程场景,给出可运行示例。 目标读者 刚入门深度学习训练的读者 需要在速度与泛化之间权衡的工程实践者 想系统理解优化器选择的开发者 背景 / 动机 在训练大模型时,损失函数不是唯一关键,优化器同样决定成败。 同一模型下,不同优化器会带来完全不同的收敛曲线与最终效果。 理解优化器差异,是做出稳定工程方案的前提。 核心概念 梯度下降:沿损失函数梯度方向更新参数。 动量(Momentum):引入历史梯度方向,减少震荡。 自适应学习率:为不同参数分配不同步长。 权重衰减(Weight Decay):控制参数规模,提升泛化。 A — Algorithm(题目与算法) 用通俗语言说明主题内容 SGD:每次更新都沿着当前梯度方向。 Momentum:带“惯性”的 SGD,加速收敛。 Adam:对每个参数自适应调整学习率。 AdamW:把权重衰减从 Adam 的梯度中解耦。 基础示例(1) SGD 在陡峭峡谷会来回震荡。 Adam 会自动缩小震荡方向的步长。 基础示例(2) Adam 收敛快但可能泛化弱。 SGD 收敛慢但往往更稳。 实践指南 / 步骤 快速验证模型可行性 → Adam/AdamW。 追求最终泛化性能 → SGD + 动量。 训练大模型时优先 AdamW。 用验证集曲线而非训练 loss 评估。 可运行示例(最小 PyTorch 对比) import torch import torch.nn as nn torch.manual_seed(42) x = torch.randn(256, 10) y = torch.randn(256, 1) model = nn.Linear(10, 1) loss_fn = nn.MSELoss() # SGD sgd = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9) for _ in range(5): pred = model(x) loss = loss_fn(pred, y) sgd.zero_grad() loss.backward() sgd.step() # AdamW adamw = torch.optim.AdamW(model.parameters(), lr=1e-3, weight_decay=0.01) for _ in range(5): pred = model(x) loss = loss_fn(pred, y) adamw.zero_grad() loss.backward() adamw.step() print("done") 解释与原理 Adam 引入一阶与二阶动量,提升收敛速度。 AdamW 通过“解耦权重衰减”更稳定。 SGD 的优势在于更好的泛化表现。 C — Concepts(核心思想) 方法类型 优化器属于数值优化方法,核心目标是稳定、快速、可泛化地找到最优解。 ...

2026年1月24日 · 2 分钟 · map[name:Jeanphilo]

图像自编码是怎么做的:原理、流程与最小实现

副标题 / 摘要 图像自编码通过“编码-解码-重构”学习紧凑表征。本文用 ACERS 框架讲清原理、训练流程与工程应用,并给出最小可运行的 PyTorch 示例。 预计阅读时长:14~18 分钟 标签:autoencoder、image、pytorch SEO 关键词:图像自编码, Autoencoder, 重构 元描述:讲解图像自编码的核心机制与工程场景,含最小示例。 目标读者 想理解自编码器原理的入门读者 需要构建图像表示学习的工程实践者 关注异常检测与去噪应用的开发者 背景 / 动机 标注数据昂贵,但图像数据充足。 自编码器通过“重构输入”学习特征表示,适合无监督或弱监督场景。 在去噪、压缩、异常检测等任务中,自编码器是一条高性价比路径。 核心概念 编码器(Encoder):把图像压缩成低维特征。 解码器(Decoder):从特征重建图像。 重构损失:衡量输入与输出差异(MSE/MAE)。 A — Algorithm(题目与算法) 用通俗语言说明主题内容 图像自编码器的流程很直观: 把图像压缩为低维向量。 用低维向量重建图像。 用重构误差训练模型。 基础示例(1) 去噪自编码:输入带噪图像,输出干净图像。 基础示例(2) 异常检测:正常样本重构误差小,异常样本误差大。 实践指南 / 步骤 选择编码器/解码器结构(CNN 或 MLP)。 设定瓶颈维度(压缩比)。 选择重构损失(MSE/MAE)。 训练后用重构误差评估应用效果。 可运行示例(最小 PyTorch 自编码器) import torch import torch.nn as nn torch.manual_seed(42) class AE(nn.Module): def __init__(self): super().__init__() self.encoder = nn.Sequential( nn.Conv2d(1, 8, 3, stride=2, padding=1), nn.ReLU(), nn.Conv2d(8, 16, 3, stride=2, padding=1), nn.ReLU(), ) self.decoder = nn.Sequential( nn.ConvTranspose2d(16, 8, 4, stride=2, padding=1), nn.ReLU(), nn.ConvTranspose2d(8, 1, 4, stride=2, padding=1), nn.Sigmoid(), ) def forward(self, x): z = self.encoder(x) return self.decoder(z) x = torch.randn(4, 1, 28, 28) model = AE() out = model(x) print(out.shape) 解释与原理 编码器学习“压缩表示”,解码器学习“重构映射”。 重构损失逼近输入分布,从而学习数据结构。 去噪版本在输入端加噪,输出仍对齐原图。 C — Concepts(核心思想) 方法类型 自编码器属于无监督表示学习与生成式重构模型范式。 ...

2026年1月24日 · 2 分钟 · map[name:Jeanphilo]

ViT 结构描述:从 Patch Embedding 到 Transformer 编码器

副标题 / 摘要 ViT 把图像切成 patch 序列,再交给 Transformer 编码器处理。本文用 ACERS 框架拆解 ViT 的核心结构与工程选择,并提供最小可运行的 PyTorch 示例。 预计阅读时长:16~20 分钟 标签:vit、transformer、vision SEO 关键词:ViT, Vision Transformer, Patch Embedding, 图像分类 元描述:系统描述 ViT 架构与工程实践,含最小 PyTorch 示例。 目标读者 想理解 ViT 架构的入门读者 需要做视觉模型选型的工程实践者 想从 CNN 迁移到 Transformer 的开发者 背景 / 动机 CNN 通过局部卷积捕获特征,但长程依赖与全局建模能力有限。 ViT 把图像当成序列,直接用自注意力做全局建模, 在大规模数据预训练下表现非常强。 核心概念 Patch Embedding:将图像切成 patch 并线性投影。 Position Embedding:补充位置信息。 [CLS] Token:聚合全局特征用于分类。 Transformer Encoder:多头自注意力 + FFN 堆叠。 A — Algorithm(题目与算法) 用通俗语言说明主题内容 ViT 的核心流程: 把图像切成固定大小 patch。 每个 patch 拉平成向量并投影成 token。 加上位置编码和 [CLS] token。 送入 Transformer Encoder 得到全局表征。 用 [CLS] token 输出做分类。 基础示例(1) 图像 224x224,patch 16x16 → 196 个 patch + 1 个 [CLS]。 基础示例(2) 只保留编码器,就能做图像分类与检索。 实践指南 / 步骤 选择 patch 大小(8/16/32)。 设置隐藏维度与层数(如 12 层,768 维)。 添加位置编码与 [CLS] token。 训练:优先用预训练权重再微调。 可运行示例(最小 ViT 前向) import torch import torch.nn as nn torch.manual_seed(42) class MiniViT(nn.Module): def __init__(self, img_size=32, patch=8, dim=64, depth=2, heads=4): super().__init__() self.patch = patch self.unfold = nn.Unfold(kernel_size=patch, stride=patch) num_patches = (img_size // patch) ** 2 self.proj = nn.Linear(3 * patch * patch, dim) self.cls = nn.Parameter(torch.zeros(1, 1, dim)) self.pos = nn.Parameter(torch.zeros(1, num_patches + 1, dim)) enc_layer = nn.TransformerEncoderLayer(d_model=dim, nhead=heads, batch_first=True) self.encoder = nn.TransformerEncoder(enc_layer, num_layers=depth) self.head = nn.Linear(dim, 10) def forward(self, x): patches = self.unfold(x).transpose(1, 2) # B, N, patch_dim tokens = self.proj(patches) cls = self.cls.expand(x.size(0), -1, -1) tokens = torch.cat([cls, tokens], dim=1) + self.pos z = self.encoder(tokens) return self.head(z[:, 0]) x = torch.randn(2, 3, 32, 32) model = MiniViT() print(model(x).shape) 解释与原理 patch embedding 把图像变成序列。 self-attention 能在全局范围建模依赖。 [CLS] token 作为全局聚合向量用于分类。 C — Concepts(核心思想) 方法类型 ViT 属于基于注意力的视觉表征模型,用 Transformer Encoder 替代卷积堆叠。 ...

2026年1月24日 · 2 分钟 · map[name:Jeanphilo]

BN 与 Dropout:训练与推理时的关键区别

副标题 / 摘要 BatchNorm 在训练使用 batch 统计、推理使用滑动均值方差;Dropout 训练时随机失活、推理时关闭。本文用 ACERS 框架解释两者差异并给出最小 PyTorch 示例。 预计阅读时长:12~16 分钟 标签:batchnorm、dropout、training SEO 关键词:BatchNorm, Dropout, 训练, 推理 元描述:对比 BN 与 Dropout 在训练与推理阶段的行为与工程取舍。 目标读者 想系统理解 BN/Dropout 差异的入门读者 需要调试训练/推理不一致问题的工程实践者 关注模型稳定性与泛化的开发者 背景 / 动机 很多线上问题来自“训练正常、推理异常”。 BN 与 Dropout 在训练/推理阶段的行为不同,是常见根因。 理解它们的机制差异,能显著减少定位成本。 核心概念 BatchNorm:用 batch 统计归一化特征,并维护 running mean/var。 Dropout:训练时随机失活部分神经元以正则化。 Train/Eval 模式:控制 BN/Dropout 行为的关键开关。 A — Algorithm(题目与算法) 用通俗语言说明主题内容 BN 训练时用当前 batch 的均值与方差;推理时用历史统计。 Dropout 训练时随机丢弃;推理时关闭、输出稳定。 基础示例(1) BN:小 batch 训练可能统计不稳定,推理偏移明显。 基础示例(2) Dropout:训练输出有噪声,推理输出确定。 实践指南 / 步骤 训练时使用 model.train()。 推理时使用 model.eval()。 如果 batch 很小,考虑替代 BN(LayerNorm/GroupNorm)。 可运行示例(最小 PyTorch 对比) import torch import torch.nn as nn torch.manual_seed(42) model = nn.Sequential( nn.Linear(4, 4), nn.BatchNorm1d(4), nn.Dropout(p=0.5), ) x = torch.randn(3, 4) model.train() train_out1 = model(x) train_out2 = model(x) model.eval() eval_out1 = model(x) eval_out2 = model(x) print(torch.allclose(train_out1, train_out2)) # False (Dropout) print(torch.allclose(eval_out1, eval_out2)) # True 解释与原理 BN 在训练中依赖 batch 统计,推理依赖 running 统计。 Dropout 在训练中丢弃神经元以提升泛化,推理关闭以稳定输出。 C — Concepts(核心思想) 方法类型 BN 属于归一化技术,Dropout 属于正则化技术。 ...

2026年1月24日 · 2 分钟 · map[name:Jeanphilo]

Transformer 中可以用 BatchNorm 吗?

副标题 / 摘要 Transformer 默认使用 LayerNorm,但在某些视觉模型中也能看到 BatchNorm。本文解释 BN 在 Transformer 中的可行性、限制与适用场景,并提供最小 PyTorch 示例。 预计阅读时长:14~18 分钟 标签:transformer、batchnorm、layernorm SEO 关键词:BatchNorm, Transformer, LayerNorm 元描述:分析 Transformer 中使用 BatchNorm 的利弊与工程建议。 目标读者 想理解归一化策略差异的入门读者 需要提升训练稳定性的工程实践者 从事 NLP/视觉 Transformer 研发的开发者 背景 / 动机 Transformer 结构中常用 LayerNorm,但很多工程师会问:能不能用 BN? BN 在 CNN 中非常有效,但在序列模型上常受 batch 维度影响。 理解其差异能帮助你在不同场景下做更合理的选择。 核心概念 BatchNorm(BN):按 batch 维度归一化。 LayerNorm(LN):按特征维度归一化。 统计依赖:BN 依赖 batch 统计,LN 不依赖。 A — Algorithm(题目与算法) 用通俗语言说明主题内容 BN 会把“整批样本”的均值/方差作为归一化基准。 LN 只看单个样本内部特征,更稳定。 基础示例(1) 小 batch 训练时,BN 的均值/方差噪声大,容易不稳定。 基础示例(2) CV Transformer 大 batch 训练时,BN 有时能提供更快收敛。 实践指南 / 步骤 NLP/小 batch → LN 更稳。 CV/大 batch → 可尝试 BN。 先做对比实验,再决定归一化方案。 可运行示例(最小 PyTorch 对比) import torch import torch.nn as nn torch.manual_seed(42) x = torch.randn(4, 8, 16) # batch, seq, dim # LayerNorm:按特征维度 ln = nn.LayerNorm(16) out_ln = ln(x) # BatchNorm:需要把特征维度转为 channel bn = nn.BatchNorm1d(16) out_bn = bn(x.transpose(1, 2)).transpose(1, 2) print(out_ln.mean(dim=-1).shape) print(out_bn.mean(dim=-1).shape) 解释与原理 BN 依赖 batch 统计,推理时使用滑动均值/方差。 LN 不依赖 batch,训练/推理一致。 Transformer 多用 LN 是为了适配小 batch 与序列任务。 C — Concepts(核心思想) 方法类型 BN/LN 都属于归一化方法,用于稳定训练与加速收敛。 ...

2026年1月24日 · 2 分钟 · map[name:Jeanphilo]

BN 与 LN 的区别:训练稳定性与工程取舍

副标题 / 摘要 BatchNorm 利用批内统计稳定训练,LayerNorm 基于单样本统计适配变长序列。本文用 ACERS 框架对比两者原理、场景与取舍,并给出最小 PyTorch 示例。 预计阅读时长:14~18 分钟 标签:batchnorm、layernorm、normalization SEO 关键词:BatchNorm, LayerNorm, 归一化 元描述:系统对比 BN 与 LN 的机制差异、工程成本与适用场景。 目标读者 想理解归一化差异的入门读者 需要在 CNN/Transformer 中做结构选型的工程实践者 关注训练稳定性与推理一致性的开发者 背景 / 动机 归一化是深度学习训练稳定性的核心技术。 BN 在视觉模型中表现优秀,但在 NLP/小批量场景中常不稳定。 LN 则不依赖 batch 大小,成为 Transformer 的默认选择。 核心概念 BatchNorm(BN):按 batch 维度统计均值/方差。 LayerNorm(LN):按特征维度统计均值/方差。 训练/推理差异:BN 需要 running stats,LN 不需要。 A — Algorithm(题目与算法) 用通俗语言说明主题内容 BN:用“整批样本”的统计量做归一化。 LN:用“单个样本”的特征统计量做归一化。 基础示例(1) CNN 大 batch 训练时,BN 统计稳定,收敛更快。 基础示例(2) Transformer 小 batch/变长序列时,LN 更稳定。 实践指南 / 步骤 图像模型 + 大 batch → 首选 BN。 语言模型/小 batch → 首选 LN。 多卡训练 → 评估 SyncBN 或改用 LN。 推理时注意 BN 的 running stats 是否正确。 可运行示例(最小 PyTorch 对比) import torch import torch.nn as nn torch.manual_seed(42) x = torch.randn(4, 8) bn = nn.BatchNorm1d(8) ln = nn.LayerNorm(8) out_bn = bn(x) out_ln = ln(x) print(out_bn.mean(dim=0)) print(out_ln.mean(dim=1)) 解释与原理 BN 使用 batch 统计,训练时依赖 batch size。 LN 使用样本内统计,不依赖 batch。 推理阶段 BN 使用 running mean/var,而 LN 直接使用当前样本。 C — Concepts(核心思想) 方法类型 BN 与 LN 都属于特征归一化,用于稳定训练与改善梯度流。 ...

2026年1月24日 · 2 分钟 · map[name:Jeanphilo]

为什么注意力要除以 √(d_k):从数值稳定到工程收益

副标题 / 摘要 注意力中的缩放项 \u221a(d_k) 不是装饰,而是数值稳定的关键:它控制 QK^T 的方差,避免 softmax 饱和和梯度消失。本文用公式与实验解释其必要性,并给出工程场景建议。 预计阅读时长:12~16 分钟 标签:attention、transformer、scaled-dot-product SEO 关键词:Attention, Scaled Dot-Product, \u221a(d_k) 元描述:解释注意力缩放项的数学动机与工程收益。 目标读者 想理解 Transformer 注意力细节的入门读者 需要排查训练不稳定问题的工程实践者 关注数值稳定性与性能优化的开发者 背景 / 动机 在点积注意力中,维度越大,QK^T 的数值越大,softmax 越容易饱和。 一旦饱和,梯度接近 0,训练会变慢甚至不稳定。 \u221a(d_k) 的缩放项就是为了解决这个问题。 核心概念 点积注意力:$QK^\top$ 衡量相似度。 缩放项 \u221a(d_k):控制相似度的尺度。 softmax 饱和:输入过大导致概率趋近 0/1,梯度变小。 A — Algorithm(题目与算法) 用通俗语言说明主题内容 维度大时,QK^T 变大,softmax 过于“自信”。 缩放 \u221a(d_k) 后,数值回到合理范围,梯度更健康。 基础示例(1) d_k=64 时,如果不缩放,softmax 输出会非常尖锐。 基础示例(2) d_k=512 时,缩放与否会直接影响训练是否稳定。 实践指南 / 步骤 使用标准缩放:$QK^\top / \sqrt{d_k}$。 如果做自定义注意力,先验证 softmax 分布是否过尖锐。 在混合精度训练下,缩放更重要。 可运行示例(缩放与不缩放的对比) import torch import torch.nn.functional as F def attn_scores(d, scale=True): q = torch.randn(1, 1, d) k = torch.randn(1, 8, d) scores = q @ k.transpose(-2, -1) if scale: scores = scores / (d ** 0.5) probs = F.softmax(scores, dim=-1) return probs.max().item(), probs.min().item() for d in [32, 128, 512]: mx_s, mn_s = attn_scores(d, scale=True) mx_u, mn_u = attn_scores(d, scale=False) print(f"d={d} scaled max={mx_s:.3f} min={mn_s:.3f} | unscaled max={mx_u:.3f} min={mn_u:.3f}") 解释与原理 如果 $q_i, k_i \sim \mathcal{N}(0, 1)$, ...

2026年1月24日 · 2 分钟 · map[name:Jeanphilo]