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