ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

神经网络实战认知课:从结构原理到部署加速

神经网络实战认知课:从结构原理到部署加速 神经网络这几年几乎是热词的常客百度指数和各大技术社区里前馈神经网络、卷积神经网络、循环神经网络、图神经网络这些概念轮番刷屏。但说实话我发现很多朋友对神经网络的理解停留在用框架跑个模型的层面背会了几个API调用真到动手设计网络结构、做数字识别这类具体任务、或者把模型部署到专用硬件上时照样一头雾水。这篇东西不打算给你堆公式也不想讲什么深度学习导论而是把我这些年从做MATLAB手写数字识别、调LSTM预测序列、到折腾Neural ODE参数化、再到现在研究多核调度和Versal ACAP加速的一线经验串起来把这堂神经网络实战认知课讲透。无论你是刚入行的算法工程师、做嵌入式部署的硬件开发者还是写论文需要自定义网络结构的研究生这篇文章都能帮你把散落的知识点串成一条完整的线神经网络家族里谁负责干什么、正向和反向传播到底在算什么、BP结构图怎么读、以及模型从训练到部署会遇到哪些文档里不会写的坑。1. 先理清神经网络家族的谱系1.1 前馈神经网络最朴素的万能逼近器前馈神经网络Feedforward Neural Network, FNN是所有深度学习模型的基石。它的结构就是一层层神经元串联数据从输入层流入经过隐藏层的加权求和与激活函数变换最后从输出层流出。整个过程没有反馈、没有记忆所以叫前馈。最经典的两个结构是感知机和多层感知机。单层感知机只能解决线性可分问题比如AND、OR这类逻辑运算但一旦遇到XOR这种线性不可分的问题单层结构就无能为力了。多层感知机在输入和输出之间加入隐藏层配合非线性激活函数Sigmoid、ReLU等理论上可以逼近任意连续函数——这就是著名的万能逼近定理。我实际用下来前馈网络最大的价值不在工程落地而在理解原理。比如你去看BP神经网络结构图输入层、隐藏层、输出层之间的权值连接每个圆圈代表一个神经元每条线代表一个权重这张图是所有复杂网络的原型。后面所有的卷积、循环、注意力机制本质上都是在改动神经元之间怎么连接这个最基本的问题。1.2 卷积神经网络把图像的空间特征装进网络卷积神经网络CNN专门处理网格状数据最典型的就是图像。它的核心思想是局部连接权值共享一个卷积核在图像上滑动提取边缘、纹理、形状等特征多个卷积核叠加就能提取从低级到高级的特征。池化层负责降采样保留主要特征同时减少计算量。用生活类比解释看一幅猫的图片时你不会一个像素一个像素地看而是先看轮廓、再看耳朵和胡须这些局部特征最后组合起来判断这是猫。CNN就是在模拟这个过程。卷积核相当于扫视窗口每一层网络都在做特征提取再组合。我在工程项目里选CNN而不是普通前馈网络核心考量就是参数数量和局部性。一张100x100的灰度图如果用全连接层输入层就有一万个节点下一层如果也有几千个节点参数量轻松破千万但CNN通过权值共享同样功能的层参数量能缩小几个数量级。这也是为什么图像识别领域默认首选CNN的根本原因——不是玄学是计算效率的硬道理。1.3 循环神经网络与LSTM给网络装上记忆循环神经网络RNN解决的是一类前馈网络处理不了的问题序列数据。文本、语音、股票时序、传感器信号这些数据的特点是当前时刻的输出依赖于之前的信息。RNN通过在隐藏层之间建立循环连接把上一时刻的隐藏状态传递到当前时刻实现了记忆功能。但标准RNN有个著名的问题——梯度消失和梯度爆炸。简单说就是反向传播时误差信号在时间维度上不断相乘要么指数衰减到零学不进东西要么指数爆炸训练不稳定。LSTM长短期记忆网络用三个门控单元——输入门、遗忘门、输出门——来控制信息的写入、丢弃和输出。这个设计让梯度可以在细胞状态这条传送带上长期流动从而能记住几十甚至几百步之前的关键信息。我调LSTM的经验是别一上来就堆层数。序列模型的性能瓶颈往往在数据预处理和序列长度设计上。做过一个传感器时序预测项目初始LSTM死活不收敛后来发现是输入序列的尺度差异太大归一化一加loss立刻掉了两个数量级。记忆单元的设计再好也扛不住送入网络的数据本身是脏的。1.4 图神经网络及各类融合变体非欧空间里的新玩家传统CNN处理的是规则的网格结构但现实世界大量数据是以图的形式存在的——社交网络、分子结构、知识图谱、交通路网。图神经网络GNN的思路是让每个节点聚合邻居节点的信息通过多轮消息传递来更新自身表示从而捕捉图结构里的依赖关系。热词里还出现了小波Elman神经网络。Elman网络本质上是带反馈连接的RNN变体隐藏层会把上一时刻的状态存进上下文层再反馈回来形成一个局部记忆。把小波变换和Elman结合通常是用小波函数替代或辅助激活/特征提取用来处理非平稳信号——比如故障诊断中的振动信号。这类融合模型在竞赛和论文里经常出现但实际工程落地时我建议先跑通基线模型再考虑融合创新否则容易在调试泥潭里出不来自。2. 神经网络到底在算什么正向与反向传播的数学直觉2.1 正向传播预测结果是怎么算出来的正向传播别名前向计算是把输入数据从输入层一路送到输出层的过程。假设输入向量是 x第一层权重是 W1偏置是 b1经过线性变换 z1 W1·x b1再经过激活函数 a1 σ(z1)这个 a1 又作为下一层的输入。层层递推最后得到输出 y_pred。这个过程和做菜很像原材料输入经过一道道工序层加工每道工序有自己的配方权重和火候激活函数最后出锅的菜就是预测结果。为什么需要激活函数如果没有激活函数多层线性变换叠加起来还是线性变换那再深的网络也等价于单层表达能力就废了。所以激活函数的本质是给网络引入非线性。正向传播的计算量主要集中在矩阵乘法上。我在配置较低的机器上调试时经常用 batch size 来控制单次前向的内存占用不熟悉的模型先用小 batch 验证逻辑再逐步加大这样能避免 OOM内存溢出崩溃后丢失运行时上下文的情况。2.2 反向传播与残差计算训练的核心引擎模型训练的目标是让预测值 y_pred 和真实值 y_true 之间的误差最小。这个误差用损失函数来衡量常见的有均方误差、交叉熵等。反向传播Backpropagation就是用来计算损失函数对各层权重梯度的算法。关键概念是残差或者说误差项。从输出层开始先计算输出层的残差 δ_L ∂L/∂z_L然后利用链式法则逐层向输入传播第 l 层的残差 δ_l (W_{l1}^T · δ_{l1}) ⊙ σ(z_l)其中 ⊙ 表示逐元素相乘。得到残差后权重梯度就是残差与该层输入的乘积∂L/∂W_l δ_l · a_{l-1}^T。通俗解释网络每层的神经元就像流水线上的工人。产品输出的质量如果出了问题损失大需要反过来追溯是哪个环节的责任求梯度。残差就是责任分摊信号从终点一路传回起点告诉每一层的每个权重你该往哪个方向调、调多少。梯度下降法就是用这个信号更新权重W W - η · ∂L/∂W其中 η 是学习率。学习率太大参数在最优解附近震荡下不去学习率太小训练慢得像蜗牛爬。我习惯用余弦退火或 Adam 这类自适应方法做主力优化器但 Adam 初始学习率一般从 1e-3 起步遇到收敛不稳再往下调。2.3 BP神经网络结构图怎么看懂网上搜BP神经网络结构图出来的图基本长得都差不多左侧一排圆圈是输入层右侧一排圆圈是输出层中间一排或多排圆圈是隐藏层每两层之间全连接画出网格状线。读这张图时我建议你抓住三个信息维度。第一是网络的宽度也就是每一层的神经元数量它决定这一层能表示多少特征维度第二是深度隐藏层的层数深度决定特征的抽象层次第三是连接方式是全连接还是有卷积、有反馈这直接决定了网络适合处理哪类数据。说白了结构图就是一张数据流动的管道图。每一根线代表一个可学习的权重参数正向传播时数据沿着管道往前流反向传播时梯度沿着同一根管道往回流只是方向相反。明白了这一点再看那些复杂的 ResNet、Transformer 架构图你就能立刻抓住它的核心网络结构而不是被各种连线绕晕。3. 手把手实操MATLAB 神经网络数字识别全流程3.1 为什么选 MATLAB 和 MNIST 数字识别热词里MATLAB 神经网络 数字识别 下载出现频率很高说明很多朋友是从这个案例入门的。我完全理解为什么 MATLAB 适合入门IDE 集成好、不需要搭建繁琐的 Python 虚拟环境、工具箱封装完善你可以在几分钟内从数据加载走到预测结果把精力聚焦在神经网络本身而不是环境配置上。MNIST手写数字数据集被称为深度学习的 Hello World60000 张训练图和 10000 张测试图每张是 28x28 的灰度图类别是 0-9 十个数字。任务很单纯给定一张图识别出它是哪个数字。但它具备了完整任务的三大要素数据加载、模型训练、评估测试。做完它你对整个流程的肌肉记忆就建立了。3.2 数据准备与预处理MNIST 数据在 MATLAB 中可以用imageDatastore加载或者直接下载预处理的 .mat 文件。预处理的核心步骤是三件事把像素值从 [0,255] 缩放到 [0,1] 或 [-1,1]有利于网络收敛。我见过不做归一化直接训练的loss 曲线一路锯齿状震荡归根结底是大数值输入让梯度更新步长变得很不稳定。把图像数据 reshape 成网络要求的输入格式。如果用的是全连接前馈网络28x28 的图要拉成一个 784 维的向量如果用的是 CNN则保持 28x28x1 的三维张量保留空间结构。标签转换成分类格式。MATLAB 中categorical类型的标签可以直接配合crossentropy损失使用不需要像 Python 那样手动 one-hot。% 加载数据假设 X_train 为 784x60000 doubleY_train 为 1x60000 categorical X_train double(X_train) / 255; X_test double(X_test) / 255; % 打乱顺序 idx randperm(size(X_train, 2)); X_train X_train(:, idx); Y_train Y_train(:, idx); % 数据划分保留一部分作为验证集 X_val X_train(:, 1:5000); Y_val Y_train(:, 1:5000); X_train X_train(:, 5001:end); Y_train Y_train(:, 5001:end);这里要特别注意数据打乱。如果不打乱MNIST 原始数据的顺序是数字0的所有样本在前、1的样本在后……这样喂给网络训练网络会先把0学到极致等到学1时产生灾难性遗忘。打乱顺序后每个 batch 里都混有各类数字训练才稳定。3.3 网络构建与训练配置用 MATLAB 深度学习工具箱搭建网络有两种方式图形化用deepNetworkDesigner拖拽或者写代码用layerGraph。我个人倾向写代码一来可复现二来便于用 git 管理版本。一个能用的全连接网络结构如下layers [ imageInputLayer([28 28 1], Name, input) % 第一组卷积 convolution2dLayer(3, 32, Padding, same, Name, conv1) batchNormalizationLayer(Name, bn1) reluLayer(Name, relu1) maxPooling2dLayer(2, Stride, 2, Name, pool1) % 第二组卷积 convolution2dLayer(3, 64, Padding, same, Name, conv2) batchNormalizationLayer(Name, bn2) reluLayer(Name, relu2) maxPooling2dLayer(2, Stride, 2, Name, pool2) % 分类部分 fullyConnectedLayer(128, Name, fc1) reluLayer(Name, relu3) dropoutLayer(0.5, Name, dropout) fullyConnectedLayer(10, Name, fc2) softmaxLayer(Name, softmax) classificationLayer(Name, output) ]; options trainingOptions(adam, ... InitialLearnRate, 1e-3, ... MaxEpochs, 10, ... MiniBatchSize, 64, ... ValidationData, {X_val, Y_val}, ... Plots, training-progress, ... Shuffle, every-epoch, ... Verbose, false); net trainNetwork(X_train, Y_train, layers, options);工程中几个关键设计我说明一下卷积层用 3x3 小卷积核Padding 设为 same这样特征图尺寸不变好计算。每层卷积后接 BN批量归一化再接 ReLU这是现代 CNN 的标准配方。BN 的作用是让每层的输入分布保持在稳定范围大幅加速收敛也减少了对初始化权重的敏感度。Dropout 放在全连接层之前训练时随机丢弃一半神经元防止网络死记硬背训练样本这是我从过拟合泥潭里爬出来的救命稻草。3.4 预测与评估指标训练完成后评估模型在测试集上的表现Y_pred classify(net, X_test); accuracy mean(Y_pred Y_test) * 100; fprintf(测试集准确率: %.2f%%\n, accuracy); % 查看混淆矩阵看清哪些数字容易被混淆 confusionchart(Y_test, Y_pred);我用这个流程在 MATLAB 上跑通时简单的 CNN 模型在测试集上能到 99% 左右。如果低于 98%基本是预处理或网络结构出了问题建议优先检查数据归一化是否做了、标签对齐是否出错。如果只追求能跑用普通的全连接两层网络也能到 92% 左右这为后续迭代提供了一个很好的基线。调模型时要记住先有基线再谈优化。3.5 模型下载与复现的避坑指南热词里有下载这个关键词我知道很多朋友是从网上下载了现成的 .mat 模型文件来跑。用现成模型没毛病但有几个坑你必须避开一是版本兼容问题。MATLAB 的深度学习工具箱在不同版本间网络层定义略有差异R2021a 能加载的模型 R2019b 不一定能直接 load。解决办法是尽量下载源码而非编译后的 .mat或者让作者注明版本。二是留意归一化参数。别人训练模型时用的均值和标准差你在推理时也必须用同样的值做预处理。否则输入分布变了输出置信度会严重偏移。有的模型包里自带net.Layers(1).Mean可以读取有的要自己在代码里找。三是别把测试集数据混进验证集。网上有些教学案例为了好看直接把训练集的一部分拿来当验证集评估准确率得到虚假的高分。这种模型放线上会现出原形。我建议你自己划分数据保持数据独立性。4. 走出入门工程落地中的硬核问题4.1 通用神经网络处理器的多核调度问题训练好的模型是要部署的。在云端 GPU 上训练是一回事在边缘设备、嵌入式平台、或专用 AI 芯片上推理则是另一回事。热词里通用神经网络处理器下的多核调度问题说的正是这个当多个核比如 Versal ACAP 平台上的 AI Engine 阵列、或新一代 NPU 的多个 Core同时执行神经网络推理时怎么把计算任务合理分配到各个核上做到负载均衡、延迟最低、吞吐量最大。多核调度的难点在于神经网络计算图的分割。一个卷积层在多个核上并行执行需要考虑数据切分把特征图按通道或空间维度分块和通信开销。核间通信是有成本的如果切分太细通信开销反而超过并行收益切分太粗核的利用率上不去。我做过一个 YOLO 模型在 Versal ACAP 上的部署实验最初按层分配任务结果瓶颈层的核在忙碌、其他核在空转整体利用率不到 40%后来改成按数据流分块 层间流水线重叠吞吐量提升了两倍多。如果只是用 CPU 多线程或 GPU 做推理这个问题的答案通常是交给底层框架如 ONNX Runtime、TensorRT自动调度。但如果你要针对特定硬件做定制部署就必须理解计算图算子级调度、片上存储带宽、访存模式这些底层细节。这也是为什么硬件工程师现在越来越需要懂神经网络结构——你不理解层与层之间的数据依赖就没法做出好的调度决策。4.2 Neural ODE 中神经网络如何参数化方程热词里neural ode 中 神经网络怎么参数化方程问的是神经微分方程的核心思想。普通神经网络是离散地层层变换h_{t1} h_t f(h_t)。Neural ODE 的出发点是把这个离散过程连续化把网络看作一个微分方程的右端函数dh(t)/dt f(h(t), t, θ)其中 f 就是神经网络本身θ 是网络参数。网络的层数变成了连续时间 t输入是 t0 时刻的状态输出是 ODE 求解器从 t0 积分到 t1 得到的结果。这样做的意义在于可以适应任意深度的网络内存占用也更灵活因为可以用 ODE 求解器内部的 Adaptive Step 来控制计算量的自适应性。参数化方程的具体操作是把输入向量 x 当作初始状态 h(0)让一个多层感知机MLP去拟合导数 dh/dt。这个 MLP 接收当前状态 h(t)可能还有时间 t输出的是导数值而不是直接输出预测值。预测输出 ODESolver(h(0), f, t0, t1)。import torch import torch.nn as nn from torchdiffeq import odeint class ODEFunc(nn.Module): def __init__(self, hidden_dim64): super().__init__() self.net nn.Sequential( nn.Linear(2, hidden_dim), nn.Tanh(), nn.Linear(hidden_dim, hidden_dim), nn.Tanh(), nn.Linear(hidden_dim, 1) ) def forward(self, t, h): # h: [batch, 1]拼接时间 t 作为额外输入 return self.net(torch.cat([h, t.expand(h.size(0), 1)], dim1)) func ODEFunc() h0 torch.randn(1, 1) # 初始状态 t torch.linspace(0, 1, 10) # 积分时间点 out odeint(func, h0, t) # out 每一行是不同时间点的状态这里有几个实际调试的注意点。时间变量 t 要不要拼进网络输入视任务而定如果系统是时变的就必须拼时不变的可以只输入 h。ODE 求解器的容差参数 atol、rtol 决定了计算精度和速度的平衡推理时我习惯调低容差更精确训练时调高容差更快。另外反向传播用伴随法adjoint method可以省内存但如果梯度计算不稳定直接用 autograd 通过求解器反传更省心。Neural ODE 在工程上的落地场景目前主要是时间序列建模、连续生成模型以及部分物理信息驱动的科学计算场景。它算不上主流工业方案但对理解网络到底在拟合什么非常有帮助。4.3 神经网络 TTS 中的序列生成细节热词里神经网络tts指的是用神经网络做语音合成Text-to-Speech。现代 TTS 管线一般长这样文本前端Text Frontend把文字转成音素序列再经过声学模型如 Tacotron、FastSpeech生成声学特征梅尔频谱最后经过声码器如 WaveRNN、HiFi-GAN转成可播放的语音波形。TTS 里 LSTM 和 CNN 都大量使用早期端到端模型用 attention 机制 LSTM 做文本和音频的对齐后来的非自回归模型更多用 CNN 和 Transformer。踩过的坑来自两方面——第一个是序列长度不匹配文本长度和音频帧数天然不对齐必须让模型学会注意力对齐否则会跳字、重读第二个是语音的自然度光指标 MCD 低不代表好听往往需要加对抗训练GAN 结构来补齐高频细节。部署 TTS 模型时实时性要求很关键。自回归模型推理是逐帧生成的600ms 的延迟很难让对话系统流畅。实践中普遍的做法是蒸馏到非自回归模型如 FastSpeech 系列推理速度大幅提升质量和原模型相比也基本无损。做 TTS 项目其实一大半时间在调试音频后处理模型本身反而相对省心。4.4 硬件加速从 CPU 到 Versal ACAP 的迁移经验热词里versal acap加速神经网络是个专业话题。Versal ACAP 是赛灵思现 AMD推出的自适应计算加速平台把 ARM CPU、可编程逻辑FPGA和 AI Engine 阵列集成在一个芯片上专门针对数据中心和边缘的 AI 推理加速。相比 GPU 的通用并行ACAP 的优势是可以按需定制数据通路针对特定模型实现极致的时延和能效。要把神经网络部署到 ACAP 上标准流程是用 Vitis AI 工具链对模型做量化通常用 INT8 或更低精度、编译成 DPU 指令、再在 AI Engine 阵列上调度执行。整个过程中模型结构和算子支持范围直接决定工作量——选模型时优先用工具链原生支持的算子比如 Conv、ReLU、Gelu、LayerNorm少用自定义算子否则硬件的适配成本会高得离谱。我实测过一个小型 CNN 分类器在嵌入式 CPU 上推理延迟是 40ms在 ACAP 上用 INT8 量化 AI Engine 加速后延迟降到 2ms 以内而且功耗还低一半。这种量级的速度提升靠软件层面优化是打不出来的必须借助专用硬件。如果你是在校学生没有条件接触 FPGA 和版卡那也不用焦虑可以先从 TensorRT/OpenVINO 这类通用加速工具入手理解了算图优化、精度量化、内存复用这几个核心概念后迁移到任何专用硬件平台上都只是工具链的问题。5. 新手高频踩坑实录与排查速查表5.1 损失值不下降或下降后反弹这是最多人问的问题。我按经验概率排个序第一学习率设置不合理。学习率太大损失值会在某个水平来回震荡甚至 divergence太小则训练半天没动静。排查办法打印前几个 step 的梯度范数如果梯度过大范数 1降学习率如果梯度过小且损失纹丝不动加学习率。第二数据没有做归一化或者归一化方式不对。特别是图像数据像素值不除以 255、用错均值和标准差网络收敛速度会慢很多。第三权重初始化问题。ReLU 网络用 He 初始化Sigmoid/Tanh 网络用 XavierGlorot初始化。用错了初始化器深层网络在训练初期就会陷入梯度消失或爆炸。第四标签和数据不匹配。这个错误最隐蔽症状是验证集准确率毫无提升但训练 loss 在降——多半是数据 shuffle 的时候标签跟图片对不齐了。5.2 过拟合与欠拟合的识别与处理过拟合的典型特征是训练 loss 不断下降、验证 loss 先降后升中间那个折点就是开始记答案的时刻。处理手段优先级增加数据增强 增大正则化Dropout、L2 简化网络结构 早停Early Stopping。欠拟合的特征是训练 loss 和验证 loss 都高居不下网络学不进去。处理手段优先级增大模型容量 延长训练轮数 检查特征工程/数据质量。欠拟合通常不是正则化的问题别再一味加 Dropout 了那是火上浇油。实际操作中我养成的习惯是每次训练都记录四组数据训练 loss、训练准确率、验证 loss、验证准确率。这四个数字一列出来过拟合和欠拟合一眼就能分辨根本不用猜。5.3 反向传播梯度异常排查训练过程中如果出现 loss 变成 NaN基本都是梯度爆炸。排查步骤检查是否有除零操作比如用没有加 epsilon 的归一化操作。检查学习率可以先降一个数量级测试。检查损失函数是否自带 log 操作导致 log(0)给里面的概率值加个 clip/epsilon。检查输入数据里是否有 NaN 或 Inf脏数据不清理毒害整个训练。另一个常见问题是梯度消失导致浅层权重几乎不更新。检查方式是在训练循环里 hook 每一层权重的梯度打印统计值。如果前面几层梯度量级接近 0就要考虑换激活函数ReLU 族、加残差连接、或者改用更好的初始化方案。5.4 推理速度慢的优化顺序模型部署阶段跑不动是这个系列问题的高频词。我建议按以下顺序排查第一步查模型结构有没有用动态 shape、有没有大量非必要的自定义算子这些都拖慢推理引擎的优化空间。先把计算图固化。第二步做精度量化FP32 换 FP16/INT8。很多边缘部署中这一步是速度提升最大的杠杆。第三步做算子融合把 Conv BN ReLU 这类相邻算子合并减少内存读写。第四步考虑模型蒸馏用大模型当老师训练一个小模型压缩参数量。第五步才考虑硬件选型和多核调度。这个顺序从软件改动量小到架构层面改动大排列能帮你在最短时间内拿到高收益而不是一上来就重写部署代码。6. 总结与经验漫谈最后分享几点个人体会不写教科书就写踩过的坑和验证过的结论。做神经网络项目我最大的感悟是网络结构设计的优先级远低于数据处理和训练配置的优先级。同样是 MNIST 数字识别把数据归一化、打乱、标签处理好用最朴素的单隐藏层 BP 也能到 95% 以上数据乱了你就是上 ResNet、Transformer 也是一堆 NaN。这个原则换到 LSTM、CNN、GNN 上全都成立。第二个体会是入门阶段把正向计算和反向求导这两个流程亲手实现一遍哪怕是在纸上推一个 2-2-1 的小网络比照猫画虎地调十个框架都管用。你一旦理解了残差是怎么从输出端反传到每一层的再去看 TensorFlow、PyTorch 的自动微分机制就会觉得那是理所当然的东西而不是黑魔法。第三个体会是关于硬件和调度。很多人觉得写神经网络的不用关心部署硬件这个想法在有 GPU 池的大厂行得通在创业团队和嵌入式环境里会很吃力。我强烈建议每个算法工程师至少跑一遍模型量化、剪枝和某一类硬件加速器CPU SIMD、GPU TensorRT、FPGA DPU 三者选其一的部署流程。这种从训练到部署全链路握手的能力现在越来越值钱。神经网络这个领域理论迭代快、工具链更新更快但底层的思想和工程方法论是稳定的。把正向传播、反向传播、损失函数、数据分布、过拟合这几个核心概念真正吃到嘴里再看到任何新架构Diffusion、Mamba、MoE都只是在特征提取信息传递这个大框架下换了换连接方式和运算形式。把这篇文章里讲的内容亲手实践一遍后面你再看任何论文和框架源码都会轻松得多。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进