在今后较长的一段时间内,本人的工作方向主要专注在AI和计算机基础核心的相关理论原理和实践技能的知识分享和相关培训教学任务上,如在合作方的介绍下前不久给北京交通大学的本科同学们做的关于深度学习的小学期实践课程培训。现在处在个人创业(自由职业)的初期阶段,还请大家多多鼓励和支持。博客的内容是本人平时汇总总结的相关知识的一些注意的点,1为汇总方便以后的查阅,2为分享出来希望对感兴趣的读者有所帮助。不正确的地方欢迎大家批评指正,不喜勿喷,欢迎大家提出意见和建议。
DDPM算法在实现细节上有一些需要注意和特别的方法,在这里做一下简要记录。
1、模型的神经网络采用U-Net结构,U-Net最早用于医学图像分割上,其输出特征图和输入特征图可以保持相同的分辨率尺寸,而且适合于编码器解码器的这种特征建模,由于DDPM的算法预测的error和生成的图像的尺寸一样,因此用U-Net结构的神经网络是适合于DDPM的建模的输入输出场景需求的。
2、基于方差调度(variance schedule)和重参化技巧,训练时样本可以基于从1和T的时间上的均匀采样去获得t时刻的样本(通过x(0)的uncorrupted data和方差调度以及时间t和重参化技巧去一次性求出t时刻的样本,其中error为从标准高斯分布进行的随机采样,如下图中的第四行伪代码所示)。

3、神经网络同时也要考虑时间t的特殊性(神经网络的结构和参数在不同采样时刻是共享的),作者从transformer的输入特性中借鉴了相关想法,加入了Positional Embedding的时间信息,这样神经网络就能够学习到预测的误差的函数在时间上的表现有差异(对时间有依赖)。其中可以采用SinusoidalPositionEmbeddings。基于时间t和时间embeddng向量位置的正弦向量和余弦向量的拼接(concanate)或交织(interleaved)。
4、DDPM在和生成图像尺寸相同的纯标准高斯噪声空间开始迭代生成清晰图像,其U-Net结构是在二维图像的基础上进行的计算,一般二维图像的数据的训练数据的张量形状为(n,c,h,w),而一般基于NLP的自然语言的训练数据的张量形状为(n, l, e),其中l为输入的token的长度,e为embedding的长度(可以理解为通道数)。下面的一个attention module的实现是基于图像张量上进行的,对代码做了相应的注解。其中用到了einsum和rearrange相关的支持张量的计算和变形的函数。

5、图像中像素基于归一化到-1到1之间的范围,在转化为正式图像时,其先转换到0-1这样的范围,然后再乘以255(t.numpy().astype(np.uint8)。整个的DDPM训练和测试的代码借鉴了开源实现,做了相关的代码验证,关键的地方加了注释和说明,详情请参考链接: difffusion-models/annotated_native_ddpm_impl.ipynb
Leave a Reply