机器学习模型训练三大步骤:

  1. 建模(找函数):Function with Unknown Parameters
  2. 定义损失函数(Loss Function):Define Loss from Training Data
  3. 优化(Optimization)

对于二分类问题得模型定义理想情况下想到的可能是:

1.Function with Unknown Parameters:假定模型f(x)为一个函数g(x),如果带入x使得g(x)>0,则输出为第一类Class 1,否则为Class 2:

2.Define Loss from Training Data:定义为L(f)=\sum \delta (f(x^{n})\neq \hat{y}^{n}),表示通过模型f(x)分类训练集错误的次数。

3.Optimization:上述的模型与损失函数在优化时没办法进行微分,也就没办法使用梯度下降,所以需要采取别的方法。

Generative Model

另一种利用概率定义的模型思路如下(Generative Model,生成模型):

对于二分类问题,我们要解决的问题是任意给定一个x,通过模型输出它属于哪个分类。这就类似于给定两个箱子(每个箱子里有两种球),任意拿出一个球,计算它更可能来自哪个盒子。如下所示,Box1有4个蓝球1个绿球,Box2有2个蓝球3个绿球,取出一个蓝球计算它来自第一个盒子的概率(已知从Box1抽球的几率为2/3,从Box2抽球的几率为1/3)

这就用到了数学上的贝叶斯公式:

P(B_{1}|Blue)=\frac{P(Blue|B_{1})P(B_{1})}{P(Blue|B_{1})P(B_{1})+P(Blue|B_{2})P(B_{2})}

将两个盒子Box1、Box2换成Class 1、Class 2即可:

P(C_{1}|x)=\frac{P(x|C_{1})P(C_{1})}{P(x|C_{1})P(C_{1})+P(x|C_{2})P(C_{2})}

只要计算出P(C_{1}|x)就可以知道x来自哪个种类的几率最大,就可以完成二分类问题。而要计算P(C_{1}|x)就需要知道P(C_{1}),P(C_{2}),P(x|C_{1}),P(x|C_{2}),这就需要从训练数据(training data)中估测出来。

上述介绍的思路也是Generative Model(生成模型)的基本思路:

Generative Model 是通过学会数据的 “真实分布”,然后自己生成新数据的模型,它不是用来分类、检测、回归的,而是用来画图、写文字、生成语音视频等。

Generative Model本质上是学习P(x),也就是数据本身的概率分布,学会分布之后,它就可以从这个分布里采样来生成全新的、没见过的数据。
 

假设你有一堆真实图片 / 文字,它们服从某个复杂分布P_{data}(x),Generative Model要学一个模型分布P_{model}(x),训练目标是使P_{model}(x)尽可能逼近P_{data}(x),训练完成后从P_{model}(x)里采样得到新数据。

上述二分类问题介绍的思路是最简单的Generative Model的使用场景,通过P(C_{1}),P(C_{2}),P(x|C_{1}),P(x|C_{2})就可以得到
                                     P(x)=P(x|C_{1})P(C_{1})+P(x|C_{2})P(C_{2})

假设我们的数据样本有140个(每个样本两个特征feature),其中79个来自Class 1,61个来自Class 2,那么:

P(C_{1})=\frac{79}{140}=0.56,P(C_{2})=0.44

对于79个样本记录如下(横纵轴分别为一个特征feature),一个点代表一个样本。图中均为已知的训练样本,但是任意取一x它大概率不会在这79个样本中,所以要求解P(x|C_{1}),P(x|C_{2})需要考虑总体分布。

由于只存在随机取样的79个样本,我们假设P(x|C_{k})服从多元高斯分布(Gaussian Distribution),这是因为现实中很多自然现象 / 测量数据,都是大量独立微小因素叠加的结果,根据中心极限定理,这类数据的分布会趋近于高斯分布。因此用高斯分布建模是对现实的合理近似。

一维高斯分布的概率密度函数:

其中\mu为均值(分布的中心位置),\sigma ^{2}为方差(分布的离散程度,\sigma是标准差),图形如下:


二维高斯分布的概率密度函数:

其中\mu \subseteq \mathbb{R}^{d}表示均值向量,描述分布的中心,\sum \subseteq \mathbb{R}^{d\times d}为协方差矩阵,描述各维度之间的相关性和离散程度,|\sum |为协方差矩阵的行列式

以二维高斯分布为例,图像如下:

不同的参数对其分布的影响如下:

对多维高斯分布中\sum的解释:

协方差矩阵 \sum(Covariance Matrix) 是描述多维数据分布形状的核心参数,它完整刻画了数据在各维度上的 离散程度维度间的相关性
d 维特征 x\subseteq \mathbb{R}^{d},协方差矩阵是一个  d\times d 的对称矩阵:

对角线元素 Var(x_{i})是第 i 维特征的方差,描述该维度数据的离散程度。
非对角线元素 Cov(x_{i},x_{j})是第 i维和第 j维特征的协方差,描述两者的线性相关性( Cov(x_{i},x_{j})>0表示正相关, Cov(x_{i},x_{j})<0表示负相关, =0表示线性无关)
若  \sum 是对角矩阵且对角元素相等 → 各维度独立且方差相同,分布是正球形。
若  \sum 非对角元素不为 0 → 维度间存在相关性,分布会呈现椭球形,长轴方向对应相关性强 / 方差大的方向。
如果输入 d 维特征 x\subseteq \mathbb{R}^{d},各特征之间没有关系(相互独立),那么
P(x|C_{1})=P(x_{1}|C_{1})P(x_{2}|C_{1})\cdots P(x_{k}|C_{1}),此时 \sum的非对角线元素均为0。

有了高斯分布和随机取样的79个样本数据后,需要根据已有的这79个数据找到最有可能的那个高斯分布。只要找到高斯分布,将任意点x代入公式即可得到它的概率P(x|C_{1})

找这个高斯分布的方法叫做最大似然估计(Maximum Likelihood Estimation, MLE),其核心思想是找到一组参数\theta =(\mu ,\sum ),让观测到的训练数据出现的概率最大。即对于符合高斯分布的79个数据点,它们出现的概率为:

L(\mu ,\sum )=f_{\mu ,\sum }(x^{1})f_{\mu ,\sum }(x^{2})f_{\mu ,\sum }(x^{3})\cdots f_{\mu ,\sum }(x^{79})

最大似然估计的目的就是找到找到\mu,\sum,使得L(\mu ,\sum )最大,即

\mu ^{*},\sum ^{*}=arg maxL(\mu ,\sum )

L(\mu ,\sum )求偏导并令其为 0,解得:

\mu^{*} =\frac{1}{79}\sum_{n=1}^{79}x^{n},\sum^{*} =\frac{1}{79}\sum_{n=1}^{79}(x^{n}-\mu^{*} )(x^{n}-\mu^{*} )^{T}

通过上述公式计算得到Class1和Class2最可能的高斯分布如下,由此可以通过高斯分布求出P(x|C_{1}),P(x|C_{2})

接下来我们就可以进行分类问题的:

P(C_{1}|x)=\frac{P(x|C_{1})P(C_{1})}{P(x|C_{1})P(C_{1})+P(x|C_{2})P(C_{2})}

如果P(C_{1}|x)>0.5,那x就属于Class1。否则为Class2

但是最终的分类结果并不理想,这可能是因为此任务两个特征量不足以进行分类任务:

后续我增加至7个特征量(输入为7维)来进行二分类任务,但是出现了Overfitting。所以接下来要考虑优化模型,其中一个优化方向是使所有类别共用一个\sum而不是一个类别有一个\sum,这样做的主要目的是为了减少参数,若每个类别都有独立的 \sum _{k}​,参数总量为 K\times \frac{d(d+1)}{2}K 为类别数,d 为特征维度),在高维场景下,有限样本会导致 \sum _{k}​ 估计极不稳定(甚至不可逆),模型容易过拟合,共用 \sum 后参数仅为 \frac{d(d+1)}{2},鲁棒性大幅提升。

理论上若真实分布中各类别 \sum _{k}​ 差异很大,共用 \sum 会引入建模偏差,此时用独立\sum _{k}更准确。实际上当样本量有限、特征维度较高时,过拟合的危害远大于建模偏差,共用 \sum 能获得更好的泛化性能,而且类别间的核心差异主要体现在均值 \mu _{k}​ 上,共用 \sum 不会丢失关键判别信息,依然能有效分类。

除此之外,共用一个\sum可以使贝叶斯决策边界(分类边界)退化为线性函数,模型更简单、可解释性更强、推理速度更快。如下所示二分类问题的分类边界由曲线变为直线。(具体原理会在后续推导)

分类任务中的共用\sum的计算方式是按类别样本数加权平均:

其中N_{k}为第 k 类的样本数

有了优化思路所以接下来的二分类任务就变成了最大似然估计找到\mu ^{1},\mu ^{2},\sum,使L(\mu ^{1},\mu ^{2},\sum)=f_{\mu ^{1},\sum }(x^{1})f_{\mu ^{1},\sum }(x^{2})\cdots f_{\mu ^{1},\sum }(x^{79})f_{\mu ^{2},\sum }(x^{80})f_{\mu ^{2},\sum }(x^{81})\cdots f_{\mu ^{2},\sum }(x^{140})

我们对公式P(C_{1}|x)=\frac{P(x|C_{1})P(C_{1})}{P(x|C_{1})P(C_{1})+P(x|C_{2})P(C_{2})}做一些改变:

P(C_{1}|x)=\frac{P(x|C_{1})P(C_{1})}{P(x|C_{1})P(C_{1})+P(x|C_{2})P(C_{2})}=\frac{1}{1+\frac{P(x|C_{2})P(C_{2})}{P(x|C_{1})P(C_{1})}}

z=ln\frac{P(x|C_{1})P(C_{1})}{P(x|C_{2})P(C_{2})},则

P(C_{1}|x)=\frac{1}{1+exp(-z)}

\frac{1}{1+exp(-z)}=\sigma (z),也就是我们之前学过的Sigmoid函数:

z=ln\frac{P(x|C_{1})P(C_{1})}{P(x|C_{2})P(C_{2})}继续化简:

求解\frac{P(x|C_{1})}{P(x|C_{2})}

如果\sum _{1}=\sum _{2}=\sum,则最终化简得:

所以可以把P(C_{1}|x)写成:

P(C_{1}|x)=\sigma (z)=\sigma (w\cdot x+b)

\frac{P(C_{1}|x)}{P(C_{2}|x)}=\frac{P(x|C_{1})P(C_{1})}{P(x|C_{2})P(C_{2})}=(w\cdot x+b)\cdot \frac{N_{1}}{N_{2}}也就很好解释了共用一个\sum可以使贝叶斯决策边界(分类边界)变为直线。

Discriminative Model

Discriminative Model(判别模型)中的逻辑回归(Logistic Regression)实现的分类就是直接使用线性模型w\cdot x+b,然后经过Sigmoid函数转换为0~1之间的数值用来表示概率。即设计的模型(function set)为:

f_{w,b}(x)=P_{w,b}(C_{1}|x)=\sigma (z)=\sum w_{i}x_{i}+b

训练数据及标签值为:

对于模型f_{w,b}(x)=P_{w,b}(C_{1}|x)=\sigma (z)=\sum w_{i}x_{i}+b中的最好的能够实现正确分类参数w_{i}b,是使下式最大(最大似然估计):

L(w,b)=f_{w,b}(x^{1})f_{w,b}(x^{2})(1-f_{w,b}(x^{3}))\cdots f_{w,b}(x^{N})

w^{*},b^{*}=argmaxL(w,b)=argmin(-lnL(w,b))

-lnL(w,b)=-lnf_{w,b}(x^{1})-lnf_{w,b}(x^{2})-ln(1-f_{w,b}(x^{3}))\cdots

对于二分类问题,我们一般将类别x^{1}的输出写成\hat{y}^{1}=1\hat{y}^{1}=0(等于1代表属于第一个类别,等于2代表属于第二个类别)。根据二元交叉熵损失(PyTorch_conda-CSDN博客),上式可以改写成

上述的式-lnL(w,b)就是该模型的损失函数,优化目标就是使它最小。优化的方法就是使用梯度下降(Gradient Descent),根据f_{w,b}(x)=\sigma (z)=\frac{1}{1+exp(-z)},z=w\cdot x+b=\sum w_{i}x_{i}+b,经过以下计算:

最终得到

\frac{\partial lnf_{w,b}(x)}{\partial w_{i}}=(1-\sigma (z))x_{i}=(1-f_{w,b}(x))x_{i},\frac{\partial ln(1-f_{w,b}(x))}{\partial w_{i}}=-\sigma (z)x_{i}=-f_{w,b}(x)x_{i}
代入\frac{\partial (-lnL(w,b))}{\partial w_{i}}得:

所以使用梯度下降更新的公式为:

线性回归(Linear Regression)的损失函数是L(f)=\frac{1}{2}\sum (f(x^{n})-\hat{y}^{n})^{2},它的更新公式和逻辑回归的是一模一样的:

只是两者的输出区间不同。Logistic Regression的输出f_{w,b}(x^{n})在0~1,标签值\hat{y}^{n}是0或1;Linear Regression的输出f_{w,b}(x^{n})和标签值\hat{y}^{n}为任意实数。

为什么Logistic Regression的损失函数不使用Mean Square Error而是用Cross Entropy?

我们可以尝试使用Mean Square Error:

模型为f_{(w,b)}(x)=\sigma (\sum w_{i}x_{i}+b),损失函数为L(f)=\frac{1}{2}\sum (f_{w,b}(x^{n})-\hat{y}^{n})^{2},梯度下降进行偏导求解后得

\frac{\partial L(f)}{\partial w_{i}}=2(f_{w,b}(x)-\hat{y})\frac{\partial f_{w,b}(x)}{\partial z}\frac{\partial z}{\partial w_{i}}=2(f_{w,b}(x)-\hat{y})f_{w,b}(x)(1-f_{w,b}(x))x_{i}

如果此时\hat{y}^{n}=1,而此时通过模型计算的f_{(w,b)}(x^{n})=1,求偏导后\frac{\partial L(f)}{\partial w_{i}}=0
如果此时\hat{y}^{n}=1,而此时通过模型计算的f_{(w,b)}(x^{n})=0,求偏导后\frac{\partial L(f)}{\partial w_{i}}=0
也就是说无论结果离目标远还是近最终的偏导都为0,这意味着一旦离目标远参数更新很慢或者不更新。具体可以看下图参数与损失函数之间的关系(黑色表示Cross Entropy,红色表示Mean Square Error):

如果一开始随机选的参数w_{1},w_{2}距离最低点较远:

       对于Cross Entropy计算出的偏导较大,可以快速更新到Loss最低点;
       对于Mean Square Error计算出的偏导很小,更新很缓慢甚至不更新。

Discriminative VS Generative

在上述实现二分类的过程中,Discriminative和Generative的模型function set都是一样的:

P(C_{1}|x)=\sigma (w\cdot x+b)

在Discriminative中我们直接通过模型找w,b,而Generative中需要先找到\mu ^{1},\mu ^{2},\sum,然后利用公式求解w,b

尽管两者的模型function set相同,但是找到的最优w,b是不相同的,主要是因为Discriminative Model(判别模型)直接学习后验概率 P(C|x),即只关注 “输入 x 时,输出类别 C 的概率”,不关心 x 本身的分布,目标是让模型预测和真实标签尽可能一致。而Generative Model(生成模型)先学习类条件分布P(x|C)和先验P(x),再通过贝叶斯公式得到P(C|x), 在求解P(C|x)时我们假设x为高斯分布,这种分布假设这相当于给参数 w,b 加上了 “先验约束”,这种约束让生成模型的参数空间更小,比如 LDA 中 w=\sum ^{-1}(\mu ^{1}-\mu ^{2})w 必须满足这个由高斯分布导出的形式,而逻辑回归的 w 可以是任意方向。

经过实验在数据量充足、分布复杂的场景下,判别模型(Discriminative)的正确率通常高于生成模型(Generative),这是因为判别模型直接聚焦分类任务,没有被错误的分布假设拖累;而生成模型需要同时建模数据分布,容易因假设偏差或过拟合导致分类性能下降。换句话说,就是判别模型的所有参数都为 “区分类别” 服务,完全贴合分类任务本身;而生成模型必须对 P(x|C)做分布假设,一部分参数被用于拟合数据分布,而非直接优化分类边界。

生成模型(Generative Model)的优势主要基于其 “概率分布假设” 和 “生成数据” 的本质:

1.数据需求更少(Less training data needed):生成模型不只是在 “死记硬背” 答案,而是在 “学习规律”。它通过假设数据服从某种分布(如高斯分布),利用数学原理强行拟合数据的底层结构。在训练样本很少的情况下,判别模型容易过拟合,而生成模型凭借强先验(Strong Prior)依然能稳定收敛,达到不错的效果。

2.对噪声更鲁棒(More robust to the noise):因为它是在学习整个数据的分布,而不是直接学习输入到输出的映射,判别模型看到噪声点可能会误判分类边界;而生成模型看到的是 “整个世界的地图”,噪声只是地图上的小点,它依然能识别出核心的分布规律,抗干扰能力更强

3.多源信息融合(Priors from different sources):生成模型基于贝叶斯公式 P(C|x)=\frac{P(x|C)P(C)}{P(x)},它可以将先验概率 P(C) 从独立的数据源中估计出来。判别模型很难利用这种外部统计信息。


生成模型在以下几个维度是判别模型无法替代的:
1.小样本与低资源场景:生成模型利用强分布假设,用极少数据就能估算出均值和方差,快速搭建分类器。

2.核心能力“生成” 与 “想象”:判别模型只能判断,而生成模型能创造,比如 GANs、Diffusion Model(扩散模型)、GPT,它们学习了数据的分布后,可以从噪声中生成全新的、逼真的图片、文字、语音。
3.异常检测与缺失数据填补:如果测试集出现了训练集中没有的异常数据,判别模型它可能会胡乱给一个分类结果。而生成模型可以计算 P(x),如果一个数据 x 出现的概率极低,它就判定为异常 / 噪声。同时,它还能补全缺失的特征(比如图片缺了一块,生成模型能填好)。

Multi-class Classification

以三分类问题为例,如下图,三个类别分别为C_{1},C_{2},C_{3},每个Class都一组自己的w,bx是输入,即要分类的对象,将x放入三个种类分别线性计算后得到z_{1},z_{2},z_{3}

然后z_{1},z_{2},z_{3}经过一个Softmax,其输出y_{1},y_{2},y_{3}的取值均在0~1之间,且和为1:

这时的输出y_{i}就可以当作概率,即y_{i}=P(C_{i}|x)

所以我们定义的多分类模型如下。其损失函数为CrossEntropyLoss(交叉熵损失)(PyTorch_conda-CSDN博客)。

如果此x属于Class1,那么target\hat{y}=\begin{bmatrix} 1\\ 0\\ 0 \end{bmatrix},如果x属于Class2,那么target\hat{y}=\begin{bmatrix} 0\\ 1\\ 0 \end{bmatrix}

Neuron Network

在介绍Neuron Network之前先介绍Logistic Regression的局限性:

如果数据集(x_{1},x_{2})如下所示,同一类别的数据它在坐标系上表示的点差距很大。假如此时输入x为Class1,那么我们会希望红点概率大于0.5,蓝点小于0.5

但是这个分类任务Logistic Regression做不到,因为Logistic Regression本质上是找两个类别Class之间的分界线,且这条分界线必须为直线。如下图所示,我们无法找到这条分界线使得Class1和Class2分类开。


解决办法是通过Feature Transformation来修改feature x,通过转换x让Logistic Regression可以处理,比如我们定义x_{1}'表示该点到\begin{bmatrix} 0\\ 0 \end{bmatrix}的距离,x_{2}'表示该点到\begin{bmatrix} 1\\ 1 \end{bmatrix}的距离。则将四个点转换之后的图像就可以画出分界线

上述的Feature Transformation是我们人为定义的转换规则,人为定义有时不容易找到一个好的转换规则。所以我们想要机器自己产生这种转换规则,方法就是将Logistic Regression堆叠起来(下面只用了两层Logistic Regression,第一层用于Feature Transformation,第二层用于Classification)

如果多堆叠几层就变成了神经网络(Neuron Network),每一个Logistic Regression我们成为一个Neuron。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐