多分类问题softmax传递函数+交叉熵损失
在多分类问题中,Softmax 函数通常与交叉熵损失函数结合使用。
Softmax 函数
Softmax 函数是一种常用的激活函数,主要用于多分类问题中。它将一个实数向量转换为概率分布,使得每个元素的值在 0 到 1 之间,且所有元素的和为 1。
Softmax 函数的数学表达式:
softmax ( z i ) = e z i ∑ j = 1 K e z j \text{softmax}(z_i) = \frac{{\rm e}^{z_i}}{\sum_{j=1}^{K} {\rm e}^{z_j}} softmax(zi)=∑j=1Kezjezi
其中, z i z_i zi是输入向量的第 i i i个元素, K K K是向量的长度。
Softmax 函数的实现
在 Python 中,可以使用 NumPy 库来实现 Softmax 函数。
import numpy as npdef softmax(x):exp_x = np.exp(x - np.max(x)) # 防止数值溢出return exp_x / np.sum(exp_x)# 示例输入
x = np.array([2.0, 1.0, 0.1])
print(softmax(x))
Softmax 函数的应用
Softmax 函数广泛应用于机器学习中的分类问题,特别是在神经网络的输出层。它可以将网络的原始输出转换为概率分布,从而方便地进行分类决策。
在使用 Softmax 函数时,需要注意数值稳定性问题。由于指数函数的增长非常快,直接计算 e z i e^{z_i} ezi可能导致数值溢出。为了避免这个问题,通常会从输入向量中减去其最大值,再进行指数计算。
def softmax_stable(x):exp_x = np.exp(x - np.max(x))return exp_x / np.sum(exp_x)
Softmax 函数的梯度
在反向传播算法中,需要计算 Softmax 函数的梯度。
Softmax 函数的梯度公式:
∂ softmax ( z i ) ∂ z j = softmax ( z i ) ( δ i j − softmax ( z j ) ) \frac{\partial \text{softmax}(z_i)}{\partial z_j} = \text{softmax}(z_i) (\delta_{ij} - \text{softmax}(z_j)) ∂zj∂softmax(zi)=softmax(zi)(δij−softmax(zj))
其中, δ i j \delta_{ij} δij是 Kronecker delta 函数,当 i = j i = j i=j时为 1,否则为 0。
交叉熵损失
交叉熵损失(Cross-Entropy Loss)是深度学习中常用的损失函数,尤其在分类任务中广泛应用。它衡量模型预测的概率分布与真实标签分布之间的差异。
对于有 K K K个类别的多分类问题,模型预测各类的概率为 p = [ p 1 , p 2 , … , p K ] p = [p_1, p_2, \dots, p_K] p=[p1,p2,…,pK](满足 ∑ i = 1 K p i = 1 \sum_{i=1}^{K} p_i = 1 ∑i=1Kpi=1),则单个样本的交叉熵损失为:
L ( y , p ) = − ∑ i = 1 K y i log ( p i ) L(y, p) = -\sum_{i=1}^{K} y_i \log(p_i) L(y,p)=−i=1∑Kyilog(pi)
由于 y i y_i yi只有一个元素为 1,其余为 0,损失函数实际上只计算了正确类别的预测概率的对数。
对于多分类问题,交叉熵损失的公式为:
L = − 1 N ∑ i = 1 N ∑ k = 1 K y i , k log ( p i , k ) L = -\frac{1}{N} \sum_{i=1}^{N} \sum_{k=1}^{K} y_{i,k} \log(p_{i,k}) L=−N1i=1∑Nk=1∑Kyi,klog(pi,k)
其中, y i , k y_{i,k} yi,k是样本 i i i在类别 k k k上的真实标签(0 或 1), p i , k p_{i,k} pi,k是模型预测的样本 i i i属于类别 k k k的概率, K K K是类别总数。
假设真实标签为one hot编码向量 y y y(只有一个元素为 1,其余为 0),交叉熵损失的公式简化为:
L = − 1 N ∑ i = 1 N log ( p i , j ) L = -\frac{1}{N} \sum_{i=1}^{N}\log(p_{i,j}) L=−N1i=1∑Nlog(pi,j)
j j j为样本 i i i的真实类别。
交叉熵损失函数源于信息论中的交叉熵概念,用于度量两个概率分布之间的差异。在分类任务中:
- 真实标签分布:可以视为一个确定的分布(如独热编码)。
- 模型预测分布:是模型输出的概率分布。
交叉熵损失函数通过计算这两个分布的差异,指导模型优化,使预测分布尽可能接近真实分布。
交叉熵损失当预测概率与真实标签一致时,损失值为 0。当预测概率与真实标签差异较大时,损失值会迅速增大,从而促使模型快速调整参数。
代码示例:交叉熵损失
def cross_entropy(y_true, y_pred):return -np.sum(y_true * np.log(y_pred))# 示例标签和预测
y_true = np.array([1, 0, 0])
y_pred = softmax(np.array([2.0, 1.0, 0.1]))print("Cross Entropy Loss:", cross_entropy(y_true, y_pred))