周末在自己那块3060上从零写了一遍扩散模型,最朴素的SimpleUNet加时间嵌入,一千六百多万参数,权重存下来六十多兆。单轮四十三秒,二十轮十五分钟不到,显存峰值才0.43G,batch开到128还有富余。
结果挺打脸:本以为多少能看出飞机汽车的轮廓,实际吐出来的是一堆颜色对味但没有形状的抽象块。想想也正常,二十轮只够它学会色彩分布和去噪这件事本身,物体结构得再堆几十轮才可能浮出来。
两个点是真踩过才有体感。小batch下GroupNorm比BatchNorm稳太多,换回去loss直接抖;时间嵌入接得马虎,模型压根分不清当前是哪个噪声档位,看着loss在降其实什么都没学到。跳连也别省,细节全靠它兜。
核心逻辑说穿了就一句:让网络去预测噪声。简单到有点不真实,但它就是work。