生成式模型基础知识
初步接触生成任务
生成任务,顾名思义就是要去生成一个东西,比如生成图片/音频/文字等等。
大家接触最多比如chatGPT、stable diffusion、还有一些语音合成相关的东西。
那么问题来了,具体生成步骤是什么样的?
一、生成任务的流程
我们注意到一件事情,生成一张图片也好、一段文字也好,它们不总是唯一的。
比如我希望生成一张鸡的图片,将**[一只鸡]** 这段文字送入模型让它去生成相应的图片,它生成的不总是同一个鸡,可能是一只有中分头的鸡,也可能是一个穿背带裤的鸡,但总的来说它们都符合文字的描述。
这就和其他任务比如分类任务有着很大的区别了,因为答案不唯一,甚至我们自己都不能枚举出所有的答案,你能想象到“一只鸡”这三个字可以对应到一张穿着背带裤打篮球的鸡的图片吗?
那么如何实现这种不唯一性呢?
我们要将一个值的思路转换为一个分布。这样每次去生成鸡的图片的时候就是从一个鸡的分布中随机采样一个结果,它们的结果不相同但又都符合鸡这个范围。
1. 生成一张图片
如上图所示,假设我要生成一张鸡的图片,如上图所示,首先我们在一个高斯分布(即正态分布)中随机取一个z作为我们的“种子”,可以说我们的所有不确定性都来自于这里。之后将这个“种子”送到一个神经网络模型中,输出一个结果 x x x,这个x满足一个分布 P θ ( x ) P_θ(x) Pθ(x)。当然,最开始的没训练网络的时候这个分布就是依托答辩,干啥啥不行。
而我们希望网络可以实现:“无论我从高斯分布中取什么样的值,他的输出都属于鸡的分布 P d a t a ( x ) P_{data}(x) Pdata(x)”,换句话说就是将高斯分布映射到鸡的分布 P d a t a ( x ) P_{data}(x) Pdata(x)上。
2. 训练网络
最右面的 P d a t a ( x ) P_{data}(x) Pdata(x)是我们真实的数据分布,也就是我们用来训练的数据集(里面装满了各种鸡的图片)。
我们现在要做的就是训练一个神经网络模型θ,让它生成的图片所满足的分布 P θ ( x ) P_θ(x) Pθ(x)和数据集的分布 P d a t a ( x ) P_{data}(x) Pdata(x)尽可能地相似,当模型训练完成之后,我从高斯分布中任意取一个z,他都会输出一个对应的x,这个x服从分布 P θ ( x ) P_θ(x) Pθ(x),同时也完全服从数据集的分布 P d a t a ( x ) P_{data}(x) Pdata(x)。换句话说,输出的x都是鸡的图片了。
3. 任务完成
有了训练好的模型,现在输入一段文字和一个从高斯分布中取的随机值z,比如“一只在打篮球的鸡”和z=1145141输入到模型中,它就会输出一个对应的图片,当输入不同的z时,就会产生不同的鸡在打篮球的图片,可能是一只穿背带裤的公鸡在打篮球,可能是中分头的母鸡在打篮球…
过程看起来很简单,现实却很x蛋。就好像考研的时候觉得:无非就是刷题嘛,按部就班地刷网课刷习题做模拟卷,最后考个120那不轻轻松松,结果学到最后模拟卷均分只有110,考研成绩一出来尼玛才考了90多分。
上述的想法很好,但是问题在于我们怎么去训练模型让分布 P θ ( x ) P_θ(x) Pθ(x)和数据集的分布 P d a t a ( x ) P_{data}(x) Pdata(x)尽可能地相似?
二、训练优化模型
看得懂英语的小伙伴一定看到了上图的标题:最大似然估计(Maximum Likelihood Estimation),忘了没关系,你只要知道它可以通过随机抽取的样本反向的去求得原始分布就够了。
1. 怎么去训练模型让分布 P θ ( x ) P_θ(x) Pθ(x)和数据集的分布 P d a t a ( x ) P_{data}(x) Pdata(x)尽可能地相似?
我们现在神经网络θ输出的所有内容都是满足 P θ ( x ) P_θ(x) Pθ(x)的对吧? P θ ( x ) P_θ(x) Pθ(x)的意思就是在分布 P θ ( x ) P_θ(x) Pθ(x)中得到x的概率值,既然我们要让 P θ ( x ) P_θ(x) Pθ(x)和 P d a t a ( x ) P_{data}(x) Pdata(x)尽可能相似,那么我们肯定希望能通过神经网络θ输出数据集中的原图,假设原图们是 x 0 x_0 x0, x 1 x_1 x1,…, x n x_n xn,那么只要让 P θ ( x 0 , 1 , . . . , n ) P_θ(x_{0,1,...,n}) Pθ(x0,1,...,n)最大就行了,也就是输出原图的概率越大越好。
标准一点的写法就是 θ ∗ = a r g max θ ∏ i = 1 n P θ ( x i ) \theta^*=arg\max_\theta\prod_{i=1}^nP_\theta(x^i) θ∗=argmaxθ∏i=1nPθ(xi),其中的 θ ∗ \theta^* θ∗就是我们希望得到的最大概率值,使用最大似然估计,也就是找出满足输出原图概率最大的那个分布,就可以确定分布 P θ ( x ) P_θ(x) Pθ(x)中的参数了。
说了一大堆,就会有人问,为什么输出原图的概率越大,这两个分布就越相似,就单凭感觉?
2. 理性理解分布之间“相似”
(1) KL散度
首先我们引入一个衡量分布之间相似度的标准,KL散度
以下引用GPT的答案
如果我们有两个离散型概率分布 P 和 Q,其概率质量函数分别为 p(x) 和 q(x),KL 散度可以定义为:
D K L ( P ∥ Q ) = ∑ x p ( x ) log ( p ( x ) q ( x ) ) D_{KL}(P\|Q)=\sum_xp(x)\log\left(\frac{p(x)}{q(x)}\right) DKL(P∥Q)=∑xp(x)log(q(x)p(x))
如果是连续型概率分布,则 KL 散度可以表示为积分形式:
D K L ( P ∥ Q ) = ∫ − ∞ ∞ p ( x ) log ( p ( x ) q ( x ) ) d x D_{KL}(P\|Q)=\int_{-\infty}^\infty p(x)\log\left(\frac{p(x)}{q(x)}\right)dx DKL(P∥Q)=∫−∞∞p(x)log(q(x)p(x))dx
KL 散度的值通常是非负的,且当且仅当两个概率分布完全相同时取得最小值 0。当 P 和 Q 之间的差异越大时,KL 散度的值也越大。
知道了KL散度可以衡量分布之间的相似度,我们希望PQ之间差异尽可能小 => 让KL散度尽可能小 => 让似然函数尽可能大。那么如果KL散度公式和似然函数相等,那不就有联系了,也就代表我们的感觉是正确的了?
废话不多说,直接开推!
(2)推理
S a m p l e { x 1 , x 2 , … , x m } f r o m P d a t a ( x ) θ ∗ = a r g max θ ∏ i = 1 m P θ ( x i ) = a r g max θ l o g ∏ i = 1 m P θ ( x i ) = a r g max θ ∑ i = 1 m l o g P θ ( x i ) ≈ a r g max θ E x ∼ P d a t a [ l o g P θ ( x ) ] = a r g max θ ∫ x P d a t a ( x ) l o g P θ ( x ) d x − ∫ x P d a t a ( x ) l o g P d a t a ( x ) d x = a r g max θ ∫ x P d a t a ( x ) l o g P θ ( x ) P d a t a ( x ) d x = a r g min θ K L ( P d a t a ∣ ∣ P θ ) \begin{align} &\mathsf{Sample}\left\{x^{1},x^{2},\ldots,x^{m}\right\}\mathsf{from}P_{data}(x) \\ &\theta^{*}=arg\operatorname*{max}_{\theta}\prod_{i=1}^{m}P_{\theta}\bigl(x^{i}\bigr) =arg\operatorname*{max}_{\theta}log\prod_{i=1}^{m}P_{\theta}\bigl(x^{i}\bigr) \\ &=arg\max_{\theta}\sum_{i=1}^{m}logP_{\theta}\bigl(x^{i}\bigr) \approx arg\max_{\theta}E_{x\sim P_{data}}\bigl[logP_{\theta}(x)\bigr] \\ &=arg\max_{\theta}\int_{x}P_{data}(x)logP_{\theta}(x)dx\quad-\int_{x}P_{data}(x)logP_{data}(x)dx \\ &=arg\max_{\theta}\int_{x}P_{data}(x)log\frac{P_{\theta}(x)}{P_{data}(x)}dx =arg\min_{\theta}KL(P_{data}||P_{\theta}) \end{align} Sample{x1,x2,…,xm}fromPdata(x)θ∗=argθmaxi=1∏mPθ(xi)=argθmaxlogi=1∏mPθ(xi)=argθmaxi=1∑mlogPθ(xi)≈argθmaxEx∼Pdata[logPθ(x)]=argθmax∫xPdata(x)logPθ(x)dx−∫xPdata(x)logPdata(x)dx=argθmax∫xPdata(x)logPdata(x)Pθ(x)dx=argθminKL(Pdata∣∣Pθ)
(2) 我们要求的是最大值,取log单调性不变
(3) 最大化 l o g P θ ( x ) logP_{\theta}\big(x\big) logPθ(x)们的累加等同于最大化 l o g P θ ( x ) logP_{\theta}\big(x\big) logPθ(x)的期望(x服从 P d a t a ( x ) P_{data}(x) Pdata(x)分布)
(4) 第一项期望 E ( X ) = ∫ x f ( x ) d x E(X)=\int xf(x)dx E(X)=∫xf(x)dx,其中 x x x看作是 l o g P θ ( x ) logP_{\theta}\big(x\big) logPθ(x),第二项只与数据集分布 P d a t a ( x ) P_{data}(x) Pdata(x)有关,而数据集都是已知的,所以可以看作是减了个常数项,不影响单调性
(5) 上一步减的常数项就是为了凑这个 l o g P θ ( x ) P d a t a ( x ) log\frac{P_{\theta}(x)}{P_{data}(x)} logPdata(x)Pθ(x)的形式,而整个式子也就是KL散度的定义式。
至此我们得出,最大化θ等同于最小化KL散度,也就是尽可能让分布 P θ P_\theta Pθ和 P d a t a P_{data} Pdata之间差异更小,证明完毕。
三、理想很丰满、现实就是一坨
恭喜你看到这里,估计你已经感觉自己无敌了:“生成模型也就这么回事嘛。”
然而很遗憾的告诉你,我们之前讲的东西都基于一个条件:假设分布 P θ ( x ) P_θ(x) Pθ(x)可求
我们本科期间做的一些最大似然估计的题目都是假设满足泊松分布,xxx分布,它们都有固定的参数值,自然可以通过偏导来计算参数。
然而谁能想象出一个充满了鸡的图片的数据集的分布长什么样?它又有哪些参数?
所以直接去求 P θ ( x ) P_θ(x) Pθ(x)是不太可行的(除非精心设计整个模型,那就十分的复杂了)。
不过别灰心,至少已经入门了,有很多文章去解决了这个问题
下期我会讲讲VAE, DDPM(扩散模型)是如何解决这个问题的(前提是有下一期)
至于是否还有下一期就请大家多多支持啦。