☰
深度学习入门:从神经网络到Transformer的完整指南
2026/10/20 16:45:43 网站建设 项目流程

深度学习这个领域,刚入门的时候最容易犯的错就是一头扎进公式里,或者反过来,直接复制一段代码跑通了就觉得自己会了。我带了几年新人,发现真正能让人从“跑通Demo”到“自己能搭模型”的,其实是一条很窄的路——你得同时理解三件事:数据长什么样、模型在算什么、训练过程发生了什么。这个系列我打算按这个思路来拆,第一篇先聊神经网络的基础、计算机视觉的入门套路,以及自然语言处理里绕不开的Transformer到底在干什么。

这篇适合谁看?如果你已经会一点Python,用过NumPy,但对深度学习只有模糊印象,那正好。如果你已经能跑通一些示例代码,但说不清楚反向传播到底在调什么,那这篇也能帮你把地基夯实。我不会堆公式,但关键的地方一定会把“为什么这么设计”讲透,因为不理解设计动机,你调参就是瞎猜。

1. 从零理解神经网络:它到底在拟合什么

1.1 神经网络不是“模仿大脑”,而是高维函数拟合器

很多人第一次接触神经网络,会被“神经元”“激活”这些生物学术语带偏,以为我们在造一个电子大脑。实际上,从工程角度看,一个前馈神经网络就是一个可微的参数化函数。你给它输入向量x,它输出向量y,中间经过若干层线性变换和非线性激活的交替组合。

为什么必须要有非线性激活?假设没有,两层线性变换叠起来还是线性变换,一百层也等价于一层,深度就失去了意义。所以ReLU、Sigmoid、Tanh这些激活函数的核心作用,是打破线性,让网络能逼近任意复杂的函数。这就是通用近似定理的通俗版本:只要宽度或深度够,神经网络可以拟合任何连续函数。

但“能拟合”和“能训练出来”是两回事。实际中我们面对的是有限数据、有限算力、非凸优化,所以网络结构设计、初始化方式、优化器选择都会极大影响最终效果。我见过太多人把模型不收敛归咎于“数据不够”,其实往往是初始化或学习率的问题。

1.2 前向传播与反向传播:一次完整的参数更新

前向传播很直观:输入经过每一层的加权求和与激活,最终得到预测值。真正让神经网络能学习的是反向传播。它的本质是链式法则的高效实现——从损失函数出发,逐层往回计算每个参数对损失的梯度。

这里有个关键点容易被忽略:反向传播本身不是优化算法,它只是算梯度。真正更新参数的是优化器,比如SGD、Adam。很多人把这两个概念混在一起,导致调参时搞不清到底是梯度算错了还是更新策略不对。

我习惯用一个具体例子来检查理解:一个两层网络,输入维度2,隐藏层维度3,输出维度1,损失用均方误差。手动推导一遍梯度,你会发现每个参数的梯度都依赖于后面所有层的中间结果。这也是为什么框架要缓存前向传播的中间激活值——反向传播时要用。

注意:如果你在自定义层或自定义损失函数时发现梯度为None或爆炸,先检查前向传播中是否有不可导操作,比如argmax、round,或者是否在不需要梯度的上下文里做了运算。

1.3 损失函数与优化器:训练的方向盘和油门

损失函数定义了什么叫做“好”。分类任务常用交叉熵,回归任务常用均方误差。交叉熵的物理意义是衡量预测分布与真实分布的差异,它比均方误差更适合分类,因为梯度不会在预测严重错误时消失。

优化器则决定了怎么沿着梯度走。SGD简单但容易震荡,Momentum引入惯性,Adam结合了动量和自适应学习率。我的经验是:小数据集或需要精细调参时用SGD+Momentum,大数据集或快速原型时用Adam。Adam的默认学习率1e-3在多数情况下是个不错的起点,但如果发现训练初期损失震荡,可以降到1e-4。

还有一个常被忽视的点是学习率调度。固定学习率往往不是最优的,余弦退火、阶梯下降、预热加衰减这些策略能显著提升最终精度。我通常会在训练中期观察验证集损失,如果连续几个epoch不降,就手动降学习率,或者直接用ReduceLROnPlateau。

2. 计算机视觉入门:从图像分类到卷积神经网络

2.1 图像在计算机里到底是什么

一张彩色图像在内存里就是一个三维数组:高度×宽度×通道数。灰度图是二维的,彩色图通常是三维的,通道顺序取决于框架,TensorFlow默认是最后一位通道。像素值一般是0到255的整数,但输入网络前必须归一化到0到1或标准化到均值0方差1。

为什么归一化这么重要?因为神经网络的权重初始化通常假设输入是零均值、小方差的。如果输入是0到255,第一层的加权和会非常大,经过激活函数后直接饱和,梯度接近零,网络根本学不动。我见过新手直接把原始像素喂进去,训练损失一动不动,排查半天才发现是没归一化。

除了归一化,还有一个常见操作是数据增强。随机裁剪、翻转、旋转、颜色抖动,这些操作能显著提升模型的泛化能力,尤其是在数据量有限的时候。但要注意,增强方式要和任务匹配——数字识别里把6翻转成9就是灾难,但自然图像里水平翻转通常没问题。

2.2 卷积为什么比全连接更适合图像

全连接层处理图像有两个致命问题:参数太多和丢失空间结构。一张224×224×3的图,如果直接接一个1024维的全连接层,参数量是1.5亿,这还只是一层。而卷积层通过局部连接和权重共享,把参数量降到几千甚至几百。

局部连接的意思是每个神经元只看图像的一小块区域,这叫感受野。权重共享的意思是同一个卷积核在整张图上滑动,检测相同的特征。这两个设计基于一个先验:图像中的特征具有平移不变性——猫在左上角还是右下角,都是猫。

卷积核的深度决定了输出特征图的通道数。比如输入是224×224×3,用64个3×3的卷积核,输出就是222×222×64(假设stride=1,padding=0)。每个卷积核学习一种特定的模式,浅层学边缘、颜色,深层学纹理、部件。这也是为什么预训练模型在浅层特征上具有通用性。

2.3 池化、批归一化与残差连接:三个改变游戏规则的组件

池化层的核心作用是降维和增加平移鲁棒性。最大池化取局部最大值,平均池化取局部平均值。最大池化更常用,因为它保留了最显著的特征。但池化不是必须的,有些现代架构用步长卷积代替池化,效果也不错。

批归一化是深度网络能训练得更深的关键之一。它把每一层的输入重新标准化到均值0方差1,然后再做可学习的缩放和平移。这解决了内部协变量偏移问题,允许使用更大的学习率,并且有轻微的正则化效果。注意:批归一化在训练和推理时的行为不同,训练时用当前batch的统计量,推理时用移动平均。如果你在推理时发现结果异常,先检查这个。

残差连接解决的是深层网络的退化问题。理论上网络越深表达能力越强,但实际上超过一定深度后,训练误差反而上升。残差连接让梯度可以绕过某些层直接回传,使得训练上百层的网络成为可能。它的实现极其简单:输出等于某层的变换加上输入本身。但就是这个加法,改变了整个深度学习的格局。

实操心得:如果你在复现一个经典网络,发现精度差很多,优先检查三件事——数据预处理是否一致、批归一化的momentum设置、权重初始化方式。这三个地方最容易出隐蔽的bug。

3. 自然语言处理与Transformer:注意力机制的崛起

3.1 从词袋到词向量:文本表示的三次跃迁

早期NLP用词袋模型,把文本表示成词汇表上的稀疏向量。问题是丢失了词序,而且维度灾难严重。后来Word2Vec和GloVe出现,用稠密向量表示词,语义相近的词在向量空间里距离也近。但这些都是静态词向量,同一个词在不同语境下向量相同,无法处理一词多义。

ELMo和BERT引入了上下文相关的词向量,同一个词在不同句子中会有不同的表示。这背后的核心机制就是Transformer的自注意力。可以说,从静态到动态,是NLP表示学习最重要的一次跃迁。

3.2 自注意力:让每个词看到所有词

自注意力的计算过程可以拆成三步:查询、键、值。每个词的输入向量分别乘以三个可学习矩阵,得到Q、K、V。然后用Q和所有词的K做点积,得到注意力分数,经过softmax归一化后,对V加权求和。

为什么这样设计?点积衡量的是相似度,softmax把相似度变成概率分布,加权求和就是根据相关性聚合信息。这样每个词都能直接看到序列中所有其他词,路径长度是O(1),而RNN需要O(n)步才能建立远距离依赖。

多头注意力是并行做多组自注意力,每组关注不同的模式。比如一个头关注语法关系,另一个头关注语义相似度。最后把多组结果拼接再线性变换。这增加了模型的表达能力,而且计算上可以并行。

3.3 位置编码:没有它,Transformer就是个词袋

自注意力本身是置换不变的——打乱输入顺序,输出不变。但语言是有序的,所以必须注入位置信息。原始Transformer用正弦余弦函数生成位置编码,直接加到词向量上。后来也有可学习的位置嵌入,以及相对位置编码。

正弦编码的好处是可以外推到训练时没见过的长度,但实际中可学习嵌入在固定长度任务上表现更好。选择哪种取决于你的任务是否需要处理变长序列。我个人的经验是:如果序列长度固定且不大,可学习嵌入更简单有效;如果需要处理超长序列或长度变化很大,正弦编码或相对位置编码更稳妥。

注意:Transformer的计算复杂度是序列长度的平方。处理长文本时,内存和计算量会急剧上升。常见的优化手段包括稀疏注意力、局部注意力、线性注意力等,但这些都是以牺牲部分全局建模能力为代价的。

4. 从理论到代码:搭建你的第一个完整训练流程

4.1 数据管道的搭建:别让IO成为瓶颈

训练深度学习模型时,GPU利用率低下的常见原因不是模型太复杂,而是数据供给跟不上。TensorFlow的tf.data API就是为解决这个问题设计的。核心操作包括:从文件读取、shuffle、map预处理、batch、prefetch。

prefetch是关键,它让数据准备和模型计算重叠进行。我通常设置prefetch(buffer_size=tf.data.AUTOTUNE),让框架自动决定缓冲区大小。另一个技巧是把预处理逻辑放在map里,并设置num_parallel_calls,利用多核CPU并行处理。

对于图像数据,如果全部加载到内存,要注意内存占用。一个简单的估算:10000张224×224×3的float32图像,大约占6GB内存。如果不够,就用生成器或TFRecord格式流式读取。

4.2 模型构建:Sequential、Functional与Subclassing怎么选

TensorFlow提供三种建模方式。Sequential适合简单的线性堆叠,代码最简洁。Functional API适合有分支、多输入多输出的结构,比如残差连接、多任务学习。Subclassing最灵活,适合需要自定义训练循环或动态结构的场景。

我的建议是:能用Functional就用Functional,因为它的计算图是静态的,容易可视化和调试。只有在Functional表达不了的时候才用Subclassing。很多新手一上来就用Subclassing,结果保存和加载模型时遇到各种问题,其实用Functional几行就搞定了。

4.3 训练循环与回调:让训练过程可控可观测

Keras的model.fit已经封装了训练循环,配合回调函数可以满足大部分需求。常用的回调包括:ModelCheckpoint保存最佳模型、EarlyStopping防止过拟合、TensorBoard记录训练过程、ReduceLROnPlateau动态调整学习率。

但如果你需要更精细的控制,比如自定义梯度裁剪、多优化器、对抗训练,就需要写自定义训练循环。用tf.GradientTape记录梯度,然后手动应用。这时候要注意:GradientTape默认只记录一次前向传播,如果要做梯度惩罚,需要设置persistent=True。

实操心得:无论用哪种方式训练,一定要在第一个epoch结束后检查验证集指标。如果验证集准确率远低于训练集,说明过拟合或数据泄露;如果两者都很低,说明欠拟合或学习率不对。这个检查能帮你省下大量盲目调参的时间。

4.4 常见问题速查表

现象可能原因排查方向
损失为NaN学习率过大、梯度爆炸降低学习率、加梯度裁剪
损失不下降数据未归一化、标签错误检查输入范围、打印标签
训练集好验证集差过拟合加正则化、数据增强、早停
验证集波动大batch太小、学习率过高增大batch、降低学习率
GPU利用率低数据管道瓶颈加prefetch、并行map
推理结果异常批归一化模式错误确认training=False

这张表是我自己踩坑总结的,实际排查时按顺序过一遍,大部分问题都能定位。但要注意,同一个现象可能有多个原因,不要只盯着一个方向。

5. 一些容易被忽略但很重要的细节

5.1 随机种子与可复现性

深度学习实验的可复现性是个大问题。即使设置了Python、NumPy、TensorFlow的随机种子,由于GPU并行计算的非确定性,结果仍可能有微小差异。如果要做严格的对比实验,建议在CPU上跑小规模验证,或者在GPU上固定所有能固定的种子,并接受一定程度的波动。

我通常会在实验开始时设置全局种子,并记录在实验日志里。对于关键实验,会跑三次取平均,而不是只看一次结果。这能避免被随机波动误导。

5.2 模型保存与加载的坑

TensorFlow保存模型有两种格式:SavedModel和HDF5。SavedModel是推荐格式,包含完整的计算图和权重,可以跨平台加载。HDF5只保存权重和结构,自定义层可能加载失败。

加载模型时最常见的坑是自定义层或自定义损失函数没有注册。解决方法是在加载时传入custom_objects参数,或者用@tf.keras.utils.register_keras_serializable装饰器注册。我建议从一开始就用SavedModel格式,省去很多麻烦。

5.3 迁移学习:站在巨人的肩膀上

实际项目中,从零训练一个模型往往不现实。迁移学习让你可以用预训练模型的特征提取能力,只训练最后的分类层。TensorFlow Hub和Keras Applications提供了大量预训练模型。

关键决策是冻结多少层。如果新任务和原任务相似,只训练最后几层就够了;如果差异大,可能需要解冻更多层甚至全部微调。微调时要用更小的学习率,因为预训练权重已经很好,大学习率会破坏它们。我通常先用1e-3训练分类层,再解冻部分层用1e-5微调。

这个系列的第一篇就到这里。下一篇我会深入卷积网络的经典架构和现代设计思路,以及如何在实际项目中做模型选型和性能优化。如果你跟着把上面的代码都跑了一遍,应该已经能独立完成一个图像分类或文本分类的完整流程了。后面遇到具体问题,欢迎一起讨论。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询