USTC-深度学习 | 从一条正弦曲线开始,我一路训练到图神经网络
深度学习实验刚开始的时候,我面对的是一条很普通的正弦曲线。输入几个数字,网络输出一个数字,loss 慢慢往下掉。那时我以为这门课大概就是不断加层、调学习率,然后等待准确率自己变好。
后来实验从回归走到 Tiny-ImageNet,再走到 Yelp2013 的文本分类,最后落到图神经网络,我才发现“深度学习”并不是一套可以到处照搬的代码。图像需要空间结构,文本需要顺序和上下文,图数据甚至没有规则的网格。模型换了,数据的脾气也跟着换了。
仓库地址:USTC-Deep-Learning-Labs。
一、先从一条 sin 曲线开始:MLP 回归
第一个实验很适合用来建立直觉。输入是数值,目标也是数值,我用多层感知机去拟合函数关系。没有复杂的图像、文本和标签,只有一条需要被逼近的曲线,以及训练过程中不断变化的预测结果。
最初的网络并不难写,但“能运行”和“学得好”之间仍然隔着不少细节。隐藏层宽度、激活函数、学习率、训练轮数都会改变最后的曲线。网络太小,曲线拐不过来;训练不够,预测结果还停留在一个很粗的轮廓;学习率不合适时,loss 会在下降和抖动之间来回切换。
我会把预测曲线和真实曲线一起画出来,盯着那些明显偏离的区间。比起只看一个最终数字,这种对照更容易让我意识到模型到底错在了哪里:是整体偏移,还是局部波动没有跟上。
这组实验最后记录的测试 MSE 约为 1.58e-7,而基线结果约为 0.00129292。数字差距很大,但它真正让我记住的不是“网络很强”,而是一个简单任务也需要认真设计训练过程。曲线看上去很平滑,背后仍然可能藏着数据划分、归一化和随机初始化的影响。
二、Tiny-ImageNet:当输入从数字变成一张张小图
从回归切到图像,感觉像是把实验室突然搬到了一个更嘈杂的房间。Tiny-ImageNet 的图片尺寸不算大,但类别更多,背景更复杂,模型不能只记住一条函数曲线。
这个实验使用 TinyResNet。残差连接一开始对我来说只是网络结构图上的几个箭头,真正训练时我才明白它在做什么:当网络变深,信息和梯度需要一条相对直接的路径继续往前走。残差分支不是让模型凭空变聪明,而是在优化变困难时给它留了一条回去的路。
训练图像模型时,数据增强和归一化也变得无法忽略。裁剪、翻转、颜色变化看起来只是对输入动手脚,实际是在告诉模型:不要把某个偶然的背景或位置当成类别本身。增强太弱,模型容易记住训练集;增强太强,连真正有用的视觉线索也被破坏。
当时记录的 Top-1 准确率约为 59.63%,基线约为 55.59%。这不是一个“换个模型马上翻倍”的故事,更多是一些结构、增强和训练设置一点点叠加后的结果。我看着验证曲线时,最警惕的是训练准确率继续上涨、验证准确率却开始停住的阶段——那通常意味着模型正在把训练图片记得越来越熟,却没有真正学会类别边界。
三、Yelp2013:模型怎样读懂一句评价的情绪
文本分类的实验让我第一次被 padding 和序列长度这些“小事情”折腾得很久。图像可以整齐地放进一个张量,句子却有长有短。短句需要补齐,长句需要截断,词要先映射成索引,batch 内的数据还要保持相同形状。
Yelp2013 的任务是根据评论文本判断类别。我先从 RNN 的顺序处理开始理解:模型读到一个词,更新一次隐藏状态,再把信息传给下一个时间步。理论上它可以记住前面的内容,实际长句一多,早期信息就变得越来越难保留。
LSTM 的门结构把这个问题讲得更直观。遗忘门、输入门和输出门并不是为了让网络看起来复杂,而是在每一步决定哪些信息保留、哪些信息丢掉。做实验时,我会专门看几条很长的评价,想象模型是否还记得前面出现过的转折词。很多时候,情绪并不在句子的第一个词里,而在后半句那句“但是”。
这组实验最后记录的测试集 Top-1 约为 69.10%,验证集最高值约为 61.84%。它没有图像实验那么直观,训练曲线也更容易受词表、截断长度和随机初始化影响。但我从这里开始真正意识到:数据的结构决定了模型需要怎样的记忆方式,不能只因为某个网络在图像上好用,就期待它在文本上也自然工作。
四、图神经网络:图没有“左上角”,那我该从哪里开始
最后一个实验把我带到了图神经网络。Cora、Citeseer 和 PPI 这些数据不再是规则的图片网格,节点通过边连接起来,每个节点的表示需要参考邻居。第一次看到邻接关系和消息传递时,我有一种很明显的陌生感:图不像一张图片,没有固定的上下左右,也没有一个天然的扫描顺序。
GCN 的基本过程可以理解成一轮轮聚合邻居信息。节点先拿到自己的特征,再把邻居的特征按某种方式混合,然后经过线性层和非线性激活,得到新的表示。层数太浅,信息传不过远;层数太深,不同节点的表示又可能被抹得太相似,这就是后来让我很在意的过平滑。
我把节点分类和链路预测分开看。节点分类是在问“这个节点属于哪一类”,链路预测则是在问“两个节点之间是否可能存在关系”。前者更像给节点贴标签,后者需要从表示里恢复图的连接结构。任务一换,指标和错误样本的解释也不一样。
| 数据集 | 节点分类 | 链路预测 |
|---|---|---|
| Cora | 0.8887 | 0.7297 |
| Citeseer | 0.7665 | 0.7747 |
| PPI | 0.6293 | 0.7535 |
这些结果放在一起很有意思:同一个模型思路换到不同图上,表现差异会很明显。PPI 的节点分类并没有前两个数据集那么高,但链路预测仍然保持在相对可用的水平。图的规模、特征、类别分布和连接方式都在影响结果,单看模型名字很难解释全部现象。
五、四组实验放在一起,我才看到“结构”两个字
这四组实验的代码形式差异很大,但它们其实都在问同一类问题:数据中有什么结构,模型怎样把这种结构利用起来?
| 实验 | 数据结构 | 我最先遇到的问题 |
|---|---|---|
| MLP 回归 | 连续数值与函数关系 | 拟合能力和优化是否合适 |
| TinyResNet | 图像的空间与局部纹理 | 深层网络、增强与泛化 |
| RNN/LSTM | 词语的顺序和上下文 | 变长序列与长期依赖 |
| GCN | 节点、边和邻居关系 | 消息传递与图结构差异 |
以前我会把模型当成一组可以替换的模块:换一个网络,调几个参数,看看分数有没有变高。做完这四组实验以后,我更愿意先问数据是什么样的。模型不是越复杂越好,重要的是它有没有接住数据里真正存在的结构。
六、也有不少“漂亮结果”不能直接照搬
仓库中的指标都是当时实验环境下留下来的记录,数据规模、训练策略和依赖版本都有限制。测试集结果不能自动说明模型可以推广到别的分布,验证集最高点也不能替代对训练过程的完整分析。
有些实验为了突出模型结构,保留了比较简化的训练流程。若重新做一次,我会统一随机种子和日志格式,补充更多重复实验,并把不同数据增强、网络深度和超参数的影响拆开记录。这样最终的表格可能不一定更漂亮,但解释会更可靠。
我也会更重视错误样本。回归里看曲线偏差,图像里看错分的类别,文本里看长句和转折,图里看连接稀疏或类别混淆的节点。准确率告诉我结果在哪,错误样本才更像是在告诉我为什么。
七、从 sin(x) 到图神经网络,路其实没有想象中远
回头看,第一条正弦曲线并不只是一个热身任务。它让我先理解了损失、梯度和拟合;Tiny-ImageNet 让我面对空间结构和泛化;Yelp2013 让我处理顺序和记忆;GCN 则把“结构”从网格和序列扩展到了任意连接关系。
这组实验没有让我一下子掌握深度学习。它更像是把几扇门依次推开,让我知道不同的数据需要不同的观察角度。下一次再看到一个新的模型,我大概不会先问“它有多少层”,而会先问:它到底在利用数据里的什么关系?
仓库地址:USTC-Deep-Learning-Labs。
说明:本文根据个人历史课程实验和公开仓库整理,部分文字经过 AI 辅助润色;文中指标属于历史实验记录,具体结果会受数据划分、随机种子和依赖版本影响。课程资料仅用于学习回顾和个人作品整理,不用于当前课程作业或考试。

浙公网安备 33010602011771号