6  第六章

接下来要谈论的东西我觉得非常有意思,就是如何从数据本身中学到东西,这种模式被称为无监督学习。不过名字不重要,重要的是让我们一起开启接下来的话题吧。

6.1 概率论基础概念

6.1.1 随机事件

世界是充满不确定性的,在这里面一件事情可能发生,也可能不发生,我们把在相同条件下可能发生、也可能不发生的事情称为随机事件。

随机事件发生的概率在\(0 \sim 1\)之间,分别代表不可能发生和必然发生。例如投骰子,所有可能的集合\(\{1,2,3,4,5,6\}\)被称为样本空间,随机事件则是样本空间的子集,如投到\(\{1\}\)发生的概率是\(\frac{1}{6}\),投到奇数\(\{1,3,5\}\)的概率则是\(\frac{1}{2}\),而投到样本空间之外的数字的概率则为0。

其中概率\(P(A)\)是衡量一个随机事件\(A\)发生的可能性的大小,概率具有非负性,即一个事情发生的可能不会比0还小,同时一个样本空间里所有随机事件发生的概率总和必然为1。

6.1.2 随机变量

不是所有的随机事件都可以直接用数字来表达,甚至大部分随机事件都是物理世界发生的一件事情,这个事情和数字本身没有直接关系。例如抛硬币的结果是“正面”或者“反面”、从图片堆里抽出来的图片是“猫咪”还是“小狗”等。

随机变量则是一个映射函数,把随机事件映射成一个数字,例如把抛硬币的结果是“正面”映射成1,“反面”映射成0、把投骰子投到“1”映射成1,投到“2”映射成2等等。

随机变量分为连续性随机变量和离散型随机变量,一个离散型随机变量可能的取值范围只有有限个或可列个,例如一个商场一小时内的流动人口数量,它只能在\(0 \sim +\infty\)之间取整数值。

而连续性随机变量则可以取某一区间内任何连续数值,例如某个学生的身高在\(160 \sim 180\)厘米之间。

6.1.3 期望

期望刻画的是随机变量的“中心”或者说是它的“平均”位置。它回答了一个核心问题:如果把这个随机实验重复进行成千上万次,我们“平均”能得到一个多大的数值?对于随机变量\(X\),期望记为\(E[X]\),计算公式为:

\[ E(X) = \sum_{i=1}^n x_i P(X=x_i) \tag{6.1}\]

其中\(x_i\)是随机变量\(X\)所有可能取的值,\(P(X=x_i)\)\(X\)取值为\(x_i\)(对应着某个随机事件发生)的概率。对于投骰子而言,它的期望就是3.5,对抛硬币而言,它的期望是0.5。

6.1.4 条件概率

条件概率就是在“某种情况已经发生”的前提下,一个随机事件发生的概率。记作 \(P(A \mid B)\),读作在事件 \(B\) 发生的条件下,事件 \(A\) 发生的概率。

条件概率所有可能的集合是样本空间的一个子集,例如在已经投出偶数的情况下投到2的概率。由于已经确定了投出的数字是偶数,所以样本空间从\(\{1,2,3,4,5,6\}\)变成了\(\{2,4,6\}\),而在\(\{2,4,6\}\)里结果为2的概率为\(\frac{1}{3}\),即\(P(\text{投出2} \mid \text{投出偶数})=\frac{1}{3}\)

6.1.5 概率分布

随机变量把随机事件映射成数字,概率分布则是随机变量的“全景地图”。对于离散型随机变量,概率分布就是列出所有可能的取值以及每种取值对应的概率(通常用柱状图或公式来表示)。

如下图所示,展示了四种离散概率分布:

图 6.1: 常见离散型概率分布示意图

但无论离散分布的形状如何变化,所有随机事件的概率总和必须为1。

对于连续型随机变量,因为在区间范围内可以无限取值,因此没法列出所有的可能,而它的概率分布则是用概率密度函数来描述的。概率密度函数\(f(x)\)定义了连续型随机变量位于区间\([a,b]\)的概率为:\(P(a \le X \le b) = \int_a^b f(x)dx\),且满足\(\int_{-\infty}^ {+\infty} f(x)dx = 1\)

简单来说概率密度函数用区间面积表示随机变量取值到区间内的概率。

图 6.2: 常见连续型概率密度函数示意图(区间曲线下的阴影面积代表概率)

6.2 空间变换

6.2.1 线性变换

考虑二维平面的情况,首先给这个平面均匀划分网格:

图 6.3: 二维网格平面

然后对整个空间进行线性变换,通过左乘一个矩阵\(A=\begin{bmatrix}a & b \\ c & d \end{bmatrix}\)

让我们先看看两个特殊的向量变换后是啥:

\[ A\begin{bmatrix}1\\0\end{bmatrix}=\begin{bmatrix}a & b \\ c & d \end{bmatrix}\begin{bmatrix}1\\0\end{bmatrix}= \begin{bmatrix}a\\c\end{bmatrix} \] \[ A\begin{bmatrix}0\\1 \end{bmatrix}= \begin{bmatrix}a & b \\ c & d \end{bmatrix}\begin{bmatrix}0\\1\end{bmatrix}= \begin{bmatrix}b\\d\end{bmatrix} \]

\(\begin{bmatrix}1\\0\end{bmatrix}\)\(\begin{bmatrix}0\\1\end{bmatrix}\)分别是原始空间的两个单位向量(也可以看成是坐标点),因为任意向量\(\begin{bmatrix}x\\y\end{bmatrix}\)都可以写成\(x\begin{bmatrix}1\\0\end{bmatrix}+y\begin{bmatrix}0\\1\end{bmatrix}\)的形式,因此映射过去之后向量的位置就是\(x\begin{bmatrix}a\\c\end{bmatrix}+y\begin{bmatrix}b\\d\end{bmatrix}\)

画出变换后的空间网格:

图 6.4: 经矩阵 \(A\) 线性变换后的网格平面

可以看到原本均匀划分的网格被拉伸和旋转了,原本面积为 \(1\) 的单位正方形,被拉伸成了一个倾斜的平行四边形,其面积刚好等于:\(|ad - bc| = |\det A|\)

这揭露了行列式的几何本质:它代表了一个线性变换\(A\)对空间面积(体积、或更高维的超体积)的缩放因子。

为了变回原来的空间,需要一个逆变换\(A^{-1}\),逆矩阵满足\(A^{-1}A=I\)\(I\)表示单位阵,对空间不做变换。

但是\(A^{-1}\)不是一定存在的,如果\(A\)把空间的某个维度压缩掉了,我们没办法把空间变回去。例如当\(A=\begin{bmatrix}1 & 0 \\ 0 & 0\end{bmatrix}\),这个变换会把\(\begin{bmatrix}0\\1\end{bmatrix}\)映射到\(\begin{bmatrix}0\\0\end{bmatrix}\),这将导致所有的向量都被压扁到了x轴上,失去了y轴方向的信息。

图 6.5: 空间压缩导致失去维度

这种情况下空间是变不回去的,为什么?因为假设我们拿到的就是被压缩后的空间,那我们无法分辨当前\(\begin{bmatrix}x \\ 0 \end{bmatrix}\)是来自原来的\(\begin{bmatrix}x \\ y_1 \end{bmatrix}\)还是\(\begin{bmatrix}x \\ y_2 \end{bmatrix}\),空间中的每个点都丢失了它自己的y轴信息,这种变换也被称为不可逆变换。

6.2.2 非线性变换

通过左乘一个线性矩阵,空间整体的变换是线性的,也就是每个方块变换过去后形状都是相同的。

另一种变换是非线性变换,就像手里有一块布料,通过拉扯它会有不同的形状,但每个区域的缩放率都是不同的。

图 6.6: 非线性空间变换示意图(网格产生不均匀弯曲,不同局部区域的形状与缩放率处处不同)

对于非线性变换,以二维空间为例,令\(x = x(u,v)\)\(y = y(u,v)\),即\(x\)\(y\)分别是\(u\)\(v\)的不同函数,当\(x(u,v)\)\(y(u,v)\)性质足够,也就可逆(不会有维度重叠)的时候,\(xy\)坐标下一块连续区域映射到\(uv\)坐标下也是连续区域:

图 6.7: 非线性坐标变换

为了计算面积,会把\(xy\)坐标下的区域切成无数个微小的方块,每个方块的面积为\(dA = dxdy\)\(dx\)\(dy\)可以看成是在\(x\)方向和\(y\)方向上的两个非常微小的增量或向量。

根据多元函数的泰勒展开可得:

\[ \begin{aligned} dx = \frac{\partial x}{\partial u}du + \frac{\partial x}{\partial v}dv\\ dy = \frac{\partial y}{\partial u}du + \frac{\partial y}{\partial v}dv \end{aligned} \tag{6.2}\]

因为无论是\(dx\)\(dy\)还是\(du\)\(dv\)都是对于面积的测量,我们不能直接把它当成数字相乘,对面积来说,两个同方向的线段相乘是没有面积的,即:\(dudu = 0 = dvdv\)

同样地根据这条性质,可以推导\((du+dv)(du+dv)=du^2+dudv+dvdu+dv^2=0\)可得\(dudv = -dvdu\)

这样再展开 式 6.2

\[ \begin{aligned} dxdy &= \frac{\partial x}{\partial u}du \cdot \frac{\partial y}{\partial v}dv+\frac{\partial x}{\partial v}dv \cdot \frac{\partial y}{\partial u}du \\ &= (\frac{\partial x}{\partial u}\frac{\partial y}{\partial v}-\frac{\partial x}{\partial v}\frac{\partial y}{\partial u})dudv \end{aligned} \tag{6.3}\]

式 6.3 中的 \((\frac{\partial x}{\partial u}\frac{\partial y}{\partial v}-\frac{\partial x}{\partial v}\frac{\partial y}{\partial u})\) 正好对应着矩阵 \(J = \begin{bmatrix} \frac{\partial x}{\partial u} & \frac{\partial x}{\partial v} \\ \frac{\partial y}{\partial u} & \frac{\partial y}{\partial v} \end{bmatrix}\) 的行列式 \(\det(J)\)

这个矩阵 \(J\) 被称为雅可比矩阵,因此面积微元的变换公式可以简洁地写为:

\[ dxdy = |\det(J)|dudv \tag{6.4}\]

式 6.4 表明,在坐标变换 \(x=x(u,v), y=y(u,v)\) 下,\(xy\) 平面上任意一点 \((x_0, y_0)\) 附近的微小面积 \(dxdy\),可以用 \(uv\) 坐标系下的微小面积 \(dudv\) 乘以局部的缩放因子 \(|\det(J)|\) 来表示。

6.3 归一化流

6.3.1 概率密度转换

概率密度转换就是已知一个随机变量 \(Z\) 的概率密度函数 \(Pr(Z)\)(如标准正态分布),当我们通过一个可逆映射 \(f(Z)\) 将其变换为新的随机变量 \(X\) 时,如何计算 \(X\) 的概率密度函数 \(Pr(X)\)

从一维正态分布看个直观例子,标准正态分布像一个钟形:

图 6.8: 一维标准正态分布概率密度函数

随机变量\(Z\)在某个区间范围取值的概率等于该区间与概率密度函数曲线所围成的面积。

考虑函数\(f(Z,\theta)\)\(\theta\)是函数的参数,\(f\)接受随机变量\(Z\)的输入,并输出另一个随机变量\(X\),假设\(f\)是可逆的,且曲线如图所示:

图 6.9: 单调可逆变换函数(\(z \in [-3, 1]\) 平缓映射至 \(x \in [-3, -1]\)\(z \in [1, 3]\) 陡峭映射至 \(x \in [-1, 3]\)

那随机变量\(X\)的概率分布\(Pr(X)\)咋计算呢?因为\(f(Z,\theta)\)只是映射随机变量,每个区间的随机变量映射过去之后,其概率应该保持一致,即:

\[ \int_a^b Pr(Z)dz = \int_{f(a,\theta)}^{f(b,\theta)}Pr(X)dx \]

根据上一节所讲述的内容,因为\(x\)是关于\(z\)的函数,我们可以用雅可比矩阵替换微元:

\[ \int_a^b Pr(Z)dz = \int_a^b Pr(X)\frac{\partial f}{\partial z}dz \]

因此\(Pr(x)={\frac{\partial f}{\partial z}}^{-1}Pr(z)\),也就是用\(Pr(Z)\)除以\(f(Z,\theta)\)的斜率。其图像如下图所示:

图 6.10: 一维概率密度变换示意图(右下:正态分布 \(Pr(z)\)、右上:可逆映射函数 \(x = f(z, \theta)\)、左上:变换后的目标分布 \(Pr(x)\)

一维概率密度变换的结论可以推广到高维度,假设 \(\mathbf{Z} \in \mathbf{R}^D\)\(D\) 维随机变量(通常服从标准多元正态分布),通过一系列可逆映射 \(x_i = f_i(Z,\theta)\) 得到高维变量 \(\mathbf{X} \in \mathbf{R}^D\)\(i = 1,2\dots D\)),其概率密度计算公式为:

\[ Pr(X) = \left| \det [\frac{\partial f_i}{\partial z_j}] \right|^{-1} Pr(Z) \tag{6.5}\]

为什么这一章节的标题叫归一化流呢?因为它形容的是 图 6.10\(X\)\(Z\)反过来的过程,从一个奇怪的分布到正态分布。

6.3.2 来自真实世界的有效数据

还是以一维的为例,一个分布为什么要想着归一化,根本原因在于,真实世界里面有意义的数据(例如一张图片)的所有数据点可以看成是从某个概率分布里采样出来的,在这个概率分布里,随机采样得到的点拼接成一张图片大概率是有意义的。

类似于\(Pr(X)\)里有意义的点集中位于\(-3 \sim -1\)间,然而这个分布是怎么样的我们无法得知。因此用归一化的方法,让我们可以从一个已知分布的采样通过函数等价到目标分布的采样。

归一化流在于让机器通过训练数据自己学习到这个映射函数。

6.3.3 损失函数

考虑真实数据是来自某个分布独立采样出来的,而学习到的分布完全由\(f(Z,\theta)\)决定,为了找到合适的参数\(\hat{\theta}\),损失函数需要最大化每个训练样本\(X_i\)\(\theta\)下出现的概率:

\[ \begin{aligned} \hat{\theta} &= \arg\max_{\theta}[\prod_{i=1}^N Pr(X_i|\theta)]\\ &=\arg \min_\theta [\sum_{i=1}^N -\log[Pr(X_i|\theta)]] \end{aligned} \tag{6.6}\]

其中\(N\)是训练样本总数。

6.3.4 网络层

关于如何设计归一化流的网络结构,保证可逆的同时雅可比矩阵也好计算,可以去参考《Understanding Deep Learning》第16章 Normalizing Flows

然而归一化流因为可逆映射、计算雅可比矩阵、网络架构限制等在生成模型上的应用渐渐被流匹配所替代了,后者在低计算开销的基础上同样也能达到很好的效果。