本系列生成式人工智能导论博文基于国立台湾大学李宏毅老师发布的课程视频整理而来, 仅用作复习参考.
可以算是人工智能领域的入门课程.
需要明确的是, 李宏毅老师上传的课程已经是2024年的课程, 距今有两年的时间, 知识难免有过时的可能, 如果出现了这种情况, 博主会尽可能补足当前的状态.
生成式人工智能导论 Chap.5 关于其余种类的人工智能模型
5.1 生成式人工智能的生成策略
5.1.1 各类不同生成式材料的基本组成单位
我们在此前四章中, 谈论的从始至终是LLM, 也就是大语言模型的生成策略, 而对于其它的生成式资料, 我们似乎并未完全涉及.
语言是由词汇(在人工智慧中将其抽象成了Token)组成的, 图像是由像素(Pixel)组成的, 声音是由不同的取样点(Sample)组成的.
我们真正需要解决的问题, 也就是怎么给出对应的条件(Condition), 让模型将这些基本元素以 正确的顺序组合起来 .
5.1.2 各类不同生成对象的生成策略
对于文本生成, 我们已经很熟悉, 它使用 自回归生成策略(Autoregressive Generation, AR) , 本质上就是接龙.
在图像以及音频上, 研发者们自然会想用这种已经非常成熟, 并且被证实在文本上十分成功的策略, 这是研究者们在5至10年前在进行的尝试, 并且其实被证明是可行的.
那为什么现在这种策略被推翻了?
因为接龙时间太长了.
我们拿目前主流的影像清晰度来做对比, 1920*1080像素数的图片需要一个模型做 207万 次接龙!
这代价太高了, 不论是时间成本还是算力成本, 想想现在我们等待一个很聪明的语言模型生成1w字要多久? 又要花费多少Token?
因此, 我们需要换种思路.
我们要尝试规避掉自回归需要按部就班, 一个个产生基本单位所带来的代价, 非自回归生成策略(Non-Autoregessive Generation, NAR) 应运而生.
5.2 NAR
5.2.1 NAR的优势与症结
NAR的本质是让生成模型进行 “并行” 运算, 让其尽可能同时将所有位置的基本单元都生成出来.
当然, 它的弱点也是显而易见的: 我们无法保证模型在生成每一个单元的时候都在思考同一件事情. 因为在生成每一个单元时都是一种概率分布, 同时取结果很有可能搞出来一团乱麻.
这个办法有方式缓解吗?
事实上, 此前比较流行的图像生成模型, 如VAE, GAN, Diffusion(不过现在几乎全是Diffusion了)等都有类似的设计, 它们除开你的输入之外, 还会随即输入一个向量, 来保证模型在生成每一个基本单元时, 脑子里想到的是同一个东西.
除此之外, 我们可以兼取AR和NAR的优势. 表现为先让AR产生出一个简要的内容, 随后让NAR在对这个内容进行细化. 在图片中, 这个方法表现为先通过AR产生一个压缩过后的图片(分辨率很低), 随后让NAR对这个图片进行再生成.
第三个方式, 是通过 多步NAR 的方式来降低每个单元之间的内容差距. 拿图片举例, 第一次只生成4*4的图片, 随后8*8, 16*16, …以此类推. 由于每一步中单位面积的像素差距比较小, 因此被证实可以有效降低这种问题的产生几率.
现在最流行的Diffusion Model本质上就是做的这件事情, 只不过它倒过来, 从全噪声的图像, 逐渐变为没有噪声的图像.
5.2.2 Speculative Decoding
虽然目前市面上的几乎全部语言模型都还是采用的AR生成策略, 但这并不代表它们没有使用NAR的相关技术, Speculative Decoding就是其中的代表. 它能够大幅度提升模型生成Token的速度.
其具体原理是这样的:
我们希望有一个比语言模型更加快速的生成器, 它能够在接收到输入后快速给出后面几个Token的预测, 假设输入为Input, 这个生成器给出的预测Token为a’, b’.
随后, 我们可以将以下三个序列同时丢给语言模型(AR), 让它再次计算这三个输入序列的下一个Token.
$$
\begin{array}{l}
Input \to a \\
Input // a’ \to b \\
Input // a’ // b’ \to c
\end{array}
$$
此时, 我们进行比对, 若 $ a == a’, b == b’ $ , 那太好了, 我们原先只能输出一个Token的时间直接算出了3个Token; 若只有 $ a == a’ $ , 我们也算出了2个Token; 就算完全不相同, 至少我们也能算出原先本应得到的a.
从这个角度上理解, 这玩意算是个稳赚不赔的买卖. 那么问题是, 这个 “生成器” 去哪里找呢?
我们上文提到过, 以NAR为生成策略的模型, 准确率不高, 但由于其并行计算的方式, 很快. 它正好能够充当这个角色.
所以本质上, 我们就是在每一轮AR干活之前, 让NAR先 “蒙一轮” , 如果蒙对了, 那皆大欢喜, 蒙错了, 那无伤大雅.
还有什么模型符合这个要求(生成速度非常快)?
当然有, 我们将当前的大模型(往往参数达到上10B)进行压缩, 其压缩而成的小模型速度通常能够快上一个层级.
5.3 与影像有关的生成式AI
与影像有关的生成式AI往往让人直接想到文生图, 但我们这里需要严谨一些, 它分为两类:
- 以影像作为Condition(或者是Condition的一部分), 产生对应的文字输出.
- 以文字作为Coddition(或者是文字加上影片), 产生对应的影像输出.
本小节中会主要针对后者进行说明.
5.3.1 有什么用? 以生成影像为目标的AI
其实在写这篇博文的同时, 来自字节跳动的Seedance 2.0已经发布了, 它已经完全能够让人类感知到AI生成影像的强大之处.
不过, 我们权且在这里还是枚举下能够做到的事情:
- 单纯的文字生成影像
- 从已有的图像中补全影像
- 将现有的影像进行风格转换
- 对现有的影像进行画质提升
因此当前的影像AI目标并不仅仅局限于文生影像, 还有关乎影像修复的各个方面, 听上去还是非常美好的.
5.3.2 在AI中影像的构成方式
影像是由一张张图片拼接而成的. 理论上而言, 单位之间内的图片, 也叫做一帧(Frame), 越多, 影像越流畅, 也就是我们通常所说的帧率(FPS, Frame Per Second).
对于人工智能而言, 需要的也就是如何构成这一幅幅图片, 要理解这一点, 我们需要首先从人工智能怎么观察图片开始说起.
最初的设想往往最简单, 我们以像素为基本单位, 让人工智能进行处理不行吗?
事实证明, 像素过于复杂, 也过于繁多. 因此, 在当下的影像模型中, 往往只是将一张图像以 4*4 (只是个举例)的比例进行拆分, 并将其中每一小块通过 编码器(Encoder) 进行压缩, 我们将这种压缩过后的单位称为一个 Patch , 这也就是当前图像处理的基本单位.
这一步的根本目的在于 把影像变得更简单 .
在影像的生成中, 实质上模型也只是产生了一串对应的Patch, 随后通过一个 解码器(Decoder) 将其还原为一张图片而已.
上述段落中所提及的Encoder与Decoder, 可能听起来很像压缩与解压缩这两个步骤, 不过我们需要明确的是, 它所做的工作远远不止那么简单, 它往往自己本身也是个类神经网络, 里面有很多层, 它所产生出, 亦或是进行处理的Patch也远远不仅仅是自身的信息, 往往也包含了整张图片中它的一些信息特点.
对于视频而言, 往往需要更进一步的压缩, 因为其时间这一尺度的存在, 因此常见的方式是将连续的帧中相同位置的Patch合并起来, 作为一个新的Patch.
5.3.3 文生图
我们首先要知道文生图需要什么样的资料.
由于我们已经比较了解LLM的训练资料类型, 因此对于文生图也可以相对应的类比过去. 我们需要 大量的经过标注的图片 .(标注, 即一段简单明了的能够描述出图片主要内容的文字)
通过这种大量的训练资料, 我们拿到了一个模型, 随后通过NAR的生成策略, 平行生成一张图片中所有位置的Patch, 过一遍Decoder, 事情就成了.
当然, 这个过程十分的简略, 不过由于这只是个导论课, 我们也就不过度揪细节了.
怎么详细评估生成图片的好坏?
人类自然是最好的评估者, 但还是我们老生常谈的问题, 成本太高了.
因此, 现在常见的做法是将图片扔给另一个模型, 让模型来评估生成图像质量的好坏.
在本处, 课程本身的知识已经有些过时.
课程中仅仅提及了CLIP这个模型, CLIP目前只负责 图文一致性 相关的评估工作.
当前做评估时, 往往还需要加上更多的多模态大模型 / 以及各种人类偏好模型进行进一步的评估工作.
怎么让模型生成不在它数据库中的东西?
通常的选择是单独贴上去一个补丁, 也就是一些文字描述与一些图片, 让它认识这个玩意就是我要让你画的, 然后再进行生成.
这个方式至今仍然常用, 只不过目前它被更加细化了, 有个在AI生图领域大名鼎鼎的名字Lora, 就是用于实现这个目的的最主流手段.
5.3.4 文生影片
理解了文生图, 文生影片就很好理解, 我们就是要生成更多张图.
那为什么文生图之后文生影片隔了这么久, 至今都是很大的问题?
因为我们把这个事情想简单了.
假设每秒24帧, 每帧64*64个Patch.
一分钟的视频有足足六百万个patch需要生成, 但这个数字其实也还好.
更重要的问题在于Transformer内部是需要做Attention的. 如果这些Patch两两做Attention, 这个数字需要进行一个平方. 这个运算量过于惊人了.
因此目前的几乎全部的研究都是在尝试减少运算量, 针对不同的Patch之间是否需要进行Attention操作来动手脚.
这篇博文就到这里~
我们之后会进入机器学习的博文.




