深度学习预备知识 分类神经网络流程-仿射、激活、损失、优化函数是如何完成分类的?为什么说最大似然=交叉熵+Softmax?

发布于:2025-04-11 ⋅ 阅读:(39) ⋅ 点赞:(0)

总体流程

省流:

过程:
仿射函数线性输出-》
激活函数转化为非线性概率分布-》
交叉熵损失函数计算误差-》
优化函数调整参数减小损失

整个过程就是最大似然估计。


基本概念:

分类的目的:

我们希望输出各个类别的概率,并放大最有可能的类别的概率

因此要先将仿射函数的输出用激活函数转换为非线性输出,再通过损失函数计算误差,并通过优化函数更新参数,直到损失函数取最小值,此时的参数就能最好地反映各类别的归属概率。

首先给出处理流程图,再依次讲解四个函数如何打配合的~

仿射函数:

仿射变换通常指的是对输入数据进行线性变换后再加上一个偏置项的操作(构建线性模型)。

即进行y = \omega_{1}x_{1}+ \omega_{2}x_{2}+... +\omega _{n}x_{n}+b

激活函数:

“激活”我们可以理解为激活非线性层。激活函数的作用就是在每个神经元的输出上应用一个非线性函数,在分类问题中即获取一个输出向量并将其映射为概率。

损失函数:

衡量网络输出值和真实值之间的差距,线性模型和分类模型有不同选择。

优化函数:

根据损失函数对参数的导数,得到优化方向,调整参数,使得损失最小。


仿射函数:

O=XW+b

在激活函数前引入仿射函数是因为需要先进行 线性关系的建模 并完成 捕捉输入特征的线性关系。

通过引入W和b,让之后的优化函数有参数可以调整。

显然一个仿射函数只能描述一个输出与多个输入的关系。为了估计所有类别的概率,我们需要一个有多个输出的模型,每个一个输出对应一个类别。 每个输出对应于它自己的仿射函数,因此我们需要和输出一样多的仿射函数。

 

输出层有三个输出,因此有三个仿射函数:

激活函数:Softmax的理解与实现

\hat{Y}=softmax(O)

接下来,我们希望输出各个类别的概率,并放大最有可能的类别的概率

而对于线性层的输出,由于我们没有限制这些输出数字的总和为1 且 根据输入的不同,它们可以为负值,因此无法直接作为概率输出。

因此需要将线性输出转换非线性的概率输出,这一步就是激活函数的功能。

根据需要我们这里需要完成三件事:

①归一化:保证输出总和为1。

②非负化:保证任意输出为正。

③优势扩大化:放大最有可能的输出。

①归一化:

很简单,将 任意输出 除以 所有输出的总和 就能使得 其总和恰好为1.

\hat{y_{j}}=o_{j}/ \sum_{1}^{n} o_{i}

②非负化与优势扩大:

对于双射函数,放大差距我们很容易想到指数映射,而这恰好可以将所有的线性输出映射到正数区间,一举两得。

\hat{y_{j}}=\exp (o_{j})/ \sum_{1}^{n}\exp (o_{i}))

因此,\hat{y}可以视为一个正确的概率分布。 softmax运算不会改变线性输出o之间的次序,只会确定分配给每个类别的概率。

损失函数:交叉熵损失的理解与实现

L(\hat{Y},Y)=-y_{i}log\hat{y_{i}}

针对分类问题,我们如何衡量真实类比与某一个概率的误差呢?这就需要交叉熵损失函数。

Softmax函数输出了一个向量\hat{Y}, 我们可以将其视为“输入属于某个类的概率的集合”。

其与真实归属向量Y的差距用交叉熵函数衡量:L(\hat{Y},Y)=-\sum_{j=1}^{q}y_{i}log\hat{y_{i}}

由于真实归属向量为独热向量(只有一个类为真),因此计算后化简为:L(\hat{Y},Y)=-y_{i}log\hat{y_{i}}

那为什么我们用交叉熵来衡量误差呢?

讲交叉熵之前引入两个概念辅助理解:

熵:数据随机程度。

信息量:意外带来的信息。

如果一个事件发生的概率很低,那么它带来的信息量就很大;反之,如果一个事件发生的概率很高,那么它带来的信息量就少。

我们规定,事件 x 的 信息量 I(x) 与其 发生概率P(x) 满足:

在分类问题,绝大多数样本都符合某一个分类标准,正确的概率很大,那么这些数据的熵就很低,信息量自然很小。模型训练时有可能标错标签,这种情况概率很低,但其信息量很大,我们希望这种影响尽可能小。

而 交叉熵 H(P,Q) 表示 预测分布 Q 描述 真实分布 P 所需的平均信息量

当 Q 与 P 差异很大时,需要更多信息量存储差异信息。

也就是说,如果错标一个数据,其就会产生很大的信息量,使得H(P, Q)变得很大,我们就能知道如何调整参数了。

所以你理解为什么公式中带log了吗,一旦模型标错数据,log映射就会将这个错误放大很多倍,称为梯度爆炸

这就是为什么交叉熵适合衡量分类问题误差的原因。

优化函数:链式法则

\omega _{new}=\omega _{old}-\alpha \cdot L'(\omega _{old})

优化过程就是寻找损失函数最小值的过程。我们通过求参数关于损失函数的导数得到调整参数。

显然,参数W和b先通过了仿射函数、激活函数才得到了损失函数。

因此,要求Wb关于损失函数的导数是一道链式法则题:

【推导不用会,放在最后面,需要自取,理解是链式法则得到的即可】

给出结果:

\partial L/\partial z_{j} = -y_{j}+\hat{y_{j}}

得到导数后就知道了参数(W和b都是Zi的一员)与损失的关系

我们使用最简单的梯度下降方法,也叫下山法:

损失函数(蓝色)就是这座山,橙色是损失函数关于ω、b的导数,我们通过每次沿着下山方向走一段距离红色箭头(学习率),看看是不是最低点,持续这个过程就可以找到最小值了。

\omega _{new}=\omega _{old}-\alpha \cdot L'(\omega _{old})

b _{new}=b _{old}-\alpha \cdot L'(b _{old})

新的ω或b = 旧的ω或b 减去 (更新的幅度 乘以 更新的方向)

完成更新参数逻辑后就大功告成啦~


欸,好像漏了点什么,现在讲清楚了分类问题的思路,还没有讲最大似然、交叉熵、Softmax的关系。

最大似然(MLE)

MLE 的本质是寻找使得 模型预测概率 与 真实概率分布 最接近的一组参数。

那不就是我们的整个过程吗:

仿射函数线性输出-》
激活函数转化为非线性概率分布-》
交叉熵损失函数计算误差-》
优化函数调整参数减小损失

到此,你已经完全理解了最大似然与交叉熵+Softma的关系。

流程示例

为了有更形象的理解,让AI生成了一组数据流程,我们一起再过一遍:

假设一个三分类任务,输入样本 x=[2,3],真实标签为第2类(独热矩阵 [0,1,0]):

3.更新参数

总结:

Ⅰ 分类问题的解决思路:仿射函数线性输出-》激活函数转化为非线性概率分布-》交叉熵损失函数计算误差-》优化函数调整参数减小损失

Ⅱ Softmax函数干了三件事 : ①归一化 ②非负化 ③优势扩大化

 最大似然=交叉熵+Softmax

Ⅲ 交叉熵 H(P,Q) 表示 预测分布 Q 描述 真实分布 P 所需的平均信息量

Ⅳ 信息论:发生概率越小,其信息量越大。

Ⅴ 损失函数使用交叉熵损失是因为:如果模型错标一个数据,就会产生很大的信息量,使得H(P, Q)变得很大,我们就能知道如何调整参数了。

很开心你能耐着性子读到这里,很荣幸能将我的三脚猫知识分享给大家,之后的学习也祝你好运。

星马也是小白,因此更懂小白的心思,大佬认为一眼明白的代码和思路可能在我们眼中就是鸿沟。这篇文章也还有很多不足之处,或是纰漏,希望你发现了及时在评论区提醒我呀~

(人工智能学院就是每周四五天满课的啦,因此更新基本随缘~)

参考资料是李沐老师的:Dive-into-DL-PyTorch

星马是刚入门的大菜比,有错望指正,有项目可以带带我。

别丢收藏夹吃灰啦好嘛~

链式求导过程:

 softmax函数如下:

\hat{y_{j}}=\exp (o_{j})/ \sum_{1}^{n}\exp (o_{i}))

交叉熵损失函数如下:

L(\hat{Y},Y)=-y_{j}log\hat{y_{j}}

首先,对交叉熵损失函数求导,得到关于预测概率\hat{y}的梯度。

\partial L/\partial \hat{y_{j}}=-y_{j}/\hat{y_{j}}

然后进一步对Softmax函数求导求导。

在对 Softmax 函数求导时,我们需要分别考虑两种情况:当 i = j i ≠ j。这是因为 Softmax 函数的输出是一个概率分布,而每个概率值\hat{y_{i}}都依赖于所有输入z_{i}的指数和。

当 i = j 时:

即 \partial \hat{y_{j}}/\partial z_{j}=\partial \hat{y_{j}}(1-\partial \hat{y_{j}})

当 i ≠ j 时:

即 \partial \hat{y_{j}}/\partial z_{j}=-\hat{y_{i}}\hat{y_{j}}

应用链式法则

即 

最终形式 \partial L/\partial z_{j} = -y_{j}+\hat{y_{j}}