学会这招,机器学习代码命名不再乱糟糟
变量名加上这个后缀,神经网络代码好读10倍
说真的,调试神经网络代码本来就够累了,结果还要跟那些莫名其妙的变量名较劲。你肯定经历过:盯着一个 outputs,半天想不起来它是 batch 在前还是 batch 在后,有没有序列维度,之前哪里 reshape 过也完全没印象。
其实有个特别简单的办法。
什么是形状后缀
形状后缀就是在 tensor 变量名后面加上一串小写字母,用来标明维度。不用 outputs,改成 outputs_bc。不用 activations,改成 activations_bcn。
一开始可能觉得这是在给自己找麻烦,多打字。信我,真不是——这可能是你在机器学习项目里最值得养成的一个编码习惯。
维度字母表
标准的对应关系是这样的:
- b — batch 维度
- p — 位置或者序列索引
- n — 神经元维度(通常来自权重矩阵乘法之后的结果)
- c — channel 维度
- h — 高度(图像 tensor 用)
- w — 宽度(图像 tensor 用)
- d — 深度(3D 数据用)
- k — kernel 维度
所以 logits_bc 一眼就知道是 batch 化的 logits,带着 channel 维度,做分类任务正合适。positional_embeddings_bpn 说的是这个 embedding 依次是 batch、位置、神经元这三个维度。
好处立竿见影
一眼就有上下文。 看到 probs_bc,马上就知道这是按 batch 和类别组织好的概率。不用猜,不用翻文档。
自带错误检测功能。 这才是重头戏。如果你写了 outputs_bc = torch.matmul(activations_bcn, weights_bcn),这个不一致马上就能跳出来——权重矩阵应该是 weights_nc 才能正确和 activations_bcn 做矩阵乘法。变量名本身就成了一个 tensor shape 的静态检查器。
文档永远不过期。 注释写着写着就过时了。代码重构了,谁还记得去更新注释?但只要遵守这个约定,embeddings_bpn 就永远准确——因为变量名本身就是文档。
Code review 顺畅多了。 审查代码的人不用跑程序、不用追踪函数调用,在 PR 里就能直接看出维度不匹配的地方。大家省时间,bug 抓得更早。
几个实用模式
处理拼接和 stack: 合并 tensor 的时候,后缀要跟着变。两块 features_bc 沿新维度 stack 上去?那就变成 features_bck 或者 features_bkc,看你选的是哪个轴。
处理归约操作: 对位置维度求个和,inputs_bp 就变成 inputs_b。跨 channel 取 argmax,logits_bc 就变成 logits_b。后缀跟着实际情况缩水。
复杂 tensor 怎么处理: 多个维度直接拼起来就行:attention_bpp 表示位置对的 attention 分数,gradients_bpn 表示按 batch、位置、神经元组织的梯度。
怎么坚持下来
关键在于一致。定好规矩,就贯彻到底——输入、输出、中间的每一个 tensor 都加上。包括你临时 debug 用的一行变量,别偷懒。
你未来的自己会感谢你。队友也会。
如果你在做大模型应用,想要代码干净、好维护、能跟着团队一起成长,这种小习惯积累起来就是巨大的效率提升。本质跟软件开发里所有好的命名规范一样——让代码自己会说话。
下次项目里试一周。相信我,你很快就会琢磨:以前没有这东西的时候是怎么写代码的。