讨论 2023-09-06 = ###### tags: `tutorials` `Fudan` `2023` 生成模型与学习目标 = ## 生成模型 生成模型的主要目标是建模数据分布,与之相对的是判别模型,其目标是建模不同类的数据之间的分界面。 以自然语言为例,假设我们有一个空间,空间中一点代表一个字符串,我们知道有些字符串对应了自然语言,而有些是乱码。 ![](https://hackmd.io/_uploads/S1ia9cSC2.png =400x) 在这个场景下,生成模型的目标是估计某一个字符串属于自然语言的概率。可以近似的理解为日常生活中我们说出这个字符串的频率。而判别模型只关心一个字符串是不是自然语言,即判别模型只建模了很红色的边界。判别模型无法给出同样属于自然语言的两个字符串之间谁的频率更高或更低。 对于一个生成模型 $P_g$和一个判别模型$P_d$, |模型|蓝色五角星|绿色五角星|蓝色三角形| |-|-|-|-| |$P_g$|0.3|0.2|0.0| |$P_d$|1.0|1.0|0.0| 在实际学习的模型中,$P_d(x)=0.5$的含义是$x$是自然语言的概率是0.5(在置信度可靠的情况下),而不是$x$在自然语言中出现的频率是0.5。这两者是有本质区别的。 ## 语言生成模型(语言模型) 现在的大模型都属于语言生成模型,常用的建模方法是对于一段文本$X=\{x_1, ..., x_T \}$,我们想通过一个生成模型去建模 $P(X)$。例如$P(今天天气不错呀!)$的概率,最直接的方法当然是数一下这句话在所有自然语言语料的频率。但这样有些问题,假如我们要估计一段500字的文章,很可能这500字没有在其他地方出现过,或出现频率极低。这500字文章的每一句话可能都是高频率的使用的,但由于组合之后就变得低频了。 这里其实对应了一个统计学的难题,长尾分布难以估计的问题。目前最常用的应对方法是利用全概率公式,$$P(X) = P(x_1, ..., x_T) = P(x_1)\prod_i P(x_i | x_{<i}) $$ 注意,全概率公式可以按任意确定顺序展开,按文字从左到右的顺序不是唯一展开方式。 下一步,也就是最关键的问题简化,参数在时间维度(也就是文本的顺序)共享或部分共享,即 $$ P_\theta \prod_i P_\theta (x_i | x_{<i}) $$ 。这其实是一个极大的简化,因为最复杂的情况我们可以为每个时间步都设置单独的参数,即 $P_{\theta_1} \prod_i P_{\theta_i} (x_i | x_{<i})$,但这样就太复杂了,并且同样无法解决长尾分布的估计问题。 回到前面的例子,虽然我们的模型可能没见过这完整的500字文章,但是因为参数共享,他可以根据这500字文章的片段去估计整段的概率。 ## 学习目标 在引入了语言模型之后,我们需要一个训练目标来指导参数估计过程,并最终确定模型的实际参数。目前最主流的做法是基于最大似然估计(Maximum Likelihood Estimation),其含义是我们观测到的频率很好的反映了实际的概率,比如我们观测到A事件发生了10次,B事件发生了5次,那A发生的概率就应该比B要高一倍。但这其实只是一种假设,比如生活中的幸存者效应或其他统计不可靠的情况。当然也有其他的训练目标,比如只利用偏序关系,比如拒绝某些样本等。 当然,绝大多数语言模型还是遵从最大似然估计,考虑语言模型中的一环,$P(x_i|x_{<i})$,我们可以看到模型的输入是$x_{<i}$,最大似然指导我们,$x_i$的概率应该是1,那么我们的优化目标很自然的变成了$\max_\theta P_\theta(x_i|x_{<i})$,当然,这里其实有一个不严谨之处,局部最优不一定是全局最优,比如让$P_{\theta_1}(x_1,...x_{\frac{T}{2}})$取到最大值的参数和让$P_{\theta_2}(x_1,...x_T)$取到最大值的参数不一定是同一个。这里其实有一个有意思的解决方法,我们不做过多展开,即在自然语言中加入一个停止符,这样任何一段自然语言都不会是另一段的前缀,也就规避了局部和全局的冲突。例如,本来“你好”是“你好呀”的前缀,但现在变成了“你好<EOS>”和“你好呀<EOS>”,这样它们就不是前缀关系了。 目前最流行的语言模型训练目标是这样的(通称为CrossEntropy,但其实CrossEntrop的概念更宽泛),考虑真实数据分布$P(X)$和模型估计的分布$P_\theta(X)$,我通过KL散度来比较二者的区别,即 \begin{gather} \mathrm{E}_{X \sim P(X)} \log P(X) - \log P_\theta(X) \\ = \mathrm{E}_{X \sim P(X)} \log [P(x_1) \prod P(x_i|x_{<i})] - \log [P_\theta(x_1) \prod_i P_\theta(x_i | x_{<i})] \end{gather} 根据最大似然的观点,我们就认为$P(x_1)=1, P(x_i|x_{<i})=1$,所以log之后就变成0了,最终的式子就是$$\mathrm{E}_{X \sim P(x)} -\sum_i\log P_\theta(x_i|x_{<i}) -\log P_\theta(x_1)$$ ## 其他学习目标 假如我们承认最大似然估计的合理性,训练目标的选择仍就是多样的。我们可以从进一步理解上一节用到的KL散度开始。 KL散度常见的写法有$$KL(P||Q) = \sum_x P(x) \log \frac{P(x)}{Q(X)} = \mathrm{E}_{x \sim P} [\log P(x)-\log Q(x)]$$ 考虑两个分布(见板书),KL散度首先是不对称的,即$KL(P||Q)\neq KL(Q||P)$,并且KL总是以第一个分布的视角出发去比较差异的。以$KL(P||Q)$为例,在$P(x)=0$的位置,无论Q如何取值都不影响最终的结果,这也就是说如果我们把数据分布当作KL的第一个分布,模型预测分布当作KL的第二个分布,那么在已知数据点之外,模型预测不过平滑与否,都会得到同样的分数。反过来,把模型预测当作第一个分布,那么模型只要覆盖一部分数据,即可得到很好的得分。 KL的常用对称版本为JSD距离 $$JSD(P||Q) = \frac{1}{2}KL(P||\frac{P+Q}{2}) + \frac{1}{2}KL(Q||\frac{P+Q}{2}) $$ 当然我们可以质疑为啥距离一定要log这些函数?这完全合理,常用的函数有 L1 距离,$$ L_1 (P||Q) = \sum_x |P(x) - Q(x)|$$ 但这些距离其实还有一个局限性,加入P,Q两个分布完全不像交怎么办(见板书)? 比如搬运距离中的 Wasserstein 距离,即 $$W_p(P,Q) = \sqrt[p]{\min_{\gamma \sim \Gamma(P, Q)} \sum_{x,y \sim \gamma} \gamma(x,y) (x-y)^p}$$ 遍历所有可能的搬运方案,把所有P(x)>0的点搬运到Q(x)>0的位置,并且让他们的权重一样。$\Gamma(P,Q)$是两个分布笛卡尔积之后的联合分布。 没有普遍的意义上的最佳距离,需要根据任务和数据特性进行选择。