1 前言
上一期所刊登的《从CLIP 应用领会隐空间的魅力》一文里,就是一个典型的范例:从Github 网页下载OpenAI 公司的CLIP 源代码(Source code),然后搭配自己收集的小数据来训练一个给超市商家使用的小模型( 图1)。
图1 Github上的免费CLIP源码
那么,这大模型与小模型,两者的代码之间,有何不同呢? 这可能会出乎您的预料,其核心模型的代码,大多是一致的、相容的。常常仅是大模型的参数量很大,而小模型参数量较少而已。
于是就能免费拿来大模型的开源代码,把其参数量调小,搭配企业自有IP 的数据( 训练数据量较少),在较省算力的计算机上即可把代码跑起来,训练出企业自有IP 的中小模型了。免费代码既省成本、可靠、省算力、又自有IP,可谓取之不尽、用之不竭的资源,岂不美哉!
例如,在上一期的文章里,就以商店柜台的产品推荐应用为例演示了:拿CLIP 的源代码,搭配商家自有产品图像(Image) 和图像叙述文句(Text),来训练出企业自用的CLIP 小模型。
然而,上一期文章里,并没有详细说明其训练的流程。于是,本文就拿另一个范例来演示,并且说明其开发流程。由于本文的主题是代码,如果您有些Python代码的基础知识,就会更容易理解。
2 以”训练Diffusion写书法”为例
在之前的文章《细观Diffusion 隐空间里UNet 的训练流程》里,曾经介绍过Diffusion 架构,及其训练方法。在AIGC 潮流中,SD(Stable Diffusion) 产品的推出是AIGC 图像生成发展历程中的一个里程碑,提供了高性能模型,能快速生成创意十足的图像。
于是,本范例就拿Diffusion 来学习,及创作书法字体,也就是俗称的:写书法。虽然Diffusion 也能学习依循标准笔顺,来逐笔写出字形。为了从简单范例出发,本文先让Diffusion 来学习程生成整个字形,而不是逐一生成各笔划。
在SD 里,UNet 模型扮演关键性角色。在SD 的隐空间里,它使用了一个UNet 模型,并搭配一个时间调度(Scheduling) 器,来担任图像生成的核心任务。而扩散(Diffusion) 一词则描述了SD 隐空间里进行的图像生成情形,整个过程都是在隐空间里逐步推进(Step by step) 的,现在就依循开发流程来逐步说明之。
Step-1:从Github网页下载Diffusers源码首先访问这个Huggingface 网页( 图2),然后,按下”code”就自动把Diffusers 源码下载到本机里了。这源码本身并不大,只有4.5MB 大小而已。
图2 Github上的免费Diffusers源码
Step-2:把Code放置于Python 的IDLE环境里
把刚才下载的Diffusers代码压缩檔解开,放置于Wibdows 本机的Python 工作区里,例如 /Python310/ 目录区里( 图3),这样,就能先在本机里做简单的测试,例如创建模型并拿简单数据( 或假数据) 来测试,有助于提升成功的自信心。
图3 放置于本机的Python环境里
Step-3:找出Diffusion的核心模型---UNet
由于小模型常常只需要部份代码就足够了,所以就打开上图里的/diffusers/ 活页夹,就会看到所需要的UNet 模型代码文件--- unet_2d_condition.py 档案,如图4 所示。
图4 放置于本机的Python环境里
接着,打开这个unet_2d_condition.py 档案,可以看到内含的类(Class) 定义:
class UNet2DConditionModel(…):
……………
……………
这个UNet2DCondition 类就是所需要的UNet 模型的定义了。
Step-4:准备训练数据(Training data)在本文的范例里,收集了”春、满、干、坤”四个字的书法图像,各5 个图像,如图5 所示。
图5 训练数据
总共有20 个书法字体的图像。使用这20 张书法图像,来让UNet 模型学习,就能让它”画”出书法字了。之后,也能进一步让它学习没一个字的笔顺,来逐笔地”写”出书法字体了。
Step-5:编写”模型训练”主程序,然后展开训练
准备好了训练数据( 书法图像),就来编写一个主程序,使用UNet2DCondition 类来创建一个UNet 模型。主程序的代码如下:
接着,就拿刚才所准备的训练图像,来展开训练,也就是让UNet 模型来学习了。其代码如下:
在SD 隐空间里,它使用了一个UNet 模型,并搭配一个时间调度(Scheduling) 器,来担任图像生成的核心任务。执行到上图红色框的指令时,就会把随机噪音添加到书法图像里,成为”含噪音图像”(Image noisy)。然后把它输入给UNet 模型,让它预测出此图像所含的噪音。在SD 里,使用数学运算,根据时间步数(即上图里的ts) 来决定将多少噪音量添加到原图像里。这样地重复训练500 回合。如果图像数量增大时,在单机上训练,可能速度非常缓慢。此时可以把这些代码迁移到有GPU 的机器上进行训练,能大幅提高效率。
Step-6:编写”图像生成”主程序,然后展开创作
训练好了,就得到了自用小模型了。最后就可编写另一个主程序,来让UNet 模型生成各种创意的书法作品了。例如,把字写在唐宋时期的国画里,如图6 所示。
图6 AI的书法创作
每次执行这个书法主程序,都会有一些不一样的创新,例如图-6 的左右两项书法创作。
3 结语
基于本文的范例,可以继续微调、优化这UNet 模型及主程序代码,让AI 做出更多的创新作品。例如,也能进一步让它学习没一个字的笔顺,来逐笔地“写”出书法字体了( 图7)。
图7 AI依笔顺而逐笔创作
本文以AI “画”书法为例,说明如何从Github 园地里,挖掘自己想要的大模型源代码,搭配自己收集的书法图像,来训练出有趣的AI 书法小模型。如果能善用这些免费代码,既能省成本、又可靠、省算力、甚至能拥有自己有IP,可谓取之不尽、用之不竭的资源,不亦美哉!
(本文来源于《电子产品世界》2023年12月期)