softmax的log似然代价函数(公式求导)

Softmax与Log似然代价函数
本文介绍了Softmax函数及其在人工神经网络输出层的应用,详细解释了它如何配合Log似然代价函数提高网络训练效率,避免学习速度减慢问题。

        在人工神经网络(ANN)中,Softmax通常被用作输出层的激活函数。这不仅是因为它的效果好,而且因为它使得ANN的输出值更易于理解。同时,softmax配合log似然代价函数,其训练效果也要比采用二次代价函数的方式好。




1. softmax函数及其求导

        softmax的函数公式如下:



        中,表示第L层(通常是最后一层)第j个神经元的输入,表示第L层第j个神经元的输出,表示自然常数。注意看,表示了第L层所有神经元的输入之和。

        softmax函数最明显的特点在于:它把每个神经元的输入占当前层所有神经元输入之和的比值,当作该神经元的输出。这使得输出更容易被解释:神经元的输出值越大,则该神经元对应的类别是真实类别的可能性更高。

        另外,softmax不仅把神经元输出构造成概率分布,而且还起到了归一化的作用,适用于很多需要进行归一化处理的分类问题。

        由于softmax在ANN算法中的求导结果比较特别,分为两种情况。希望能帮助到正在学习此类算法的朋友们。求导过程如下所示:




2. softmax配合log似然代价函数训练ANN


        在上一篇博文“交叉熵代价函数”中讲到,二次代价函数在训练ANN时可能会导致训练速度变慢的问题。那就是,初始的输出值离真实值越远,训练速度就越慢。这个问题可以通过采用交叉熵代价函数来解决。其实,这个问题也可以采用另外一种方法解决,那就是采用softmax激活函数,并采用log似然代价函数(log-likelihood cost function)来解决。

        log似然代价函数的公式为:


        其中,表示第k个神经元的输出值,表示第k个神经元对应的真实值,取值为0或1。

        我们来简单理解一下这个代价函数的含义。在ANN中输入一个样本,那么只有一个神经元对应了该样本的正确类别;若这个神经元输出的概率值越高,则按照以上的代价函数公式,其产生的代价就越小;反之,则产生的代价就越高。

        为了检验softmax和这个代价函数也可以解决上述所说的训练速度变慢问题,接下来的重点就是推导ANN的权重w和偏置b的梯度公式。以偏置b为例:



        同理可得:



        从上述梯度公式可知,softmax函数配合log似然代价函数可以很好地训练ANN,不存在学习速度变慢的问题。










### 负对数损失函数的具体公式及其推导 负对数(Negative Log-Likelihood, NLL)损失函数是基于最大估计原理的一种优化目标。其核心思想是通过最小化负对数来优化模型参数,从而使得模型的预测结果尽可能接近真实分布。 #### 1. 负对数损失函数的定义 在机器学习中,假设模型的输出是一个概率分布 \( P(y|x;\theta) \),其中 \( y \) 是真实标签,\( x \) 是输入特征,\( \theta \) 是模型参数。函数可以表示为所有样本的概率乘积: \[ L(\theta) = \prod_{i=1}^{N} P(y_i|x_i;\theta) \] 为了便于计算,通常取对数形式得到对数函数: \[ \log L(\theta) = \sum_{i=1}^{N} \log P(y_i|x_i;\theta) \] 负对数损失函数则是对数的负值,定义为: \[ NLL(\theta) = -\frac{1}{N} \sum_{i=1}^{N} \log P(y_i|x_i;\theta) \tag{1}[^1] \] #### 2. 负对数损失函数的推导 负对数损失函数的推导过程可以分为以下几个方面: - **函数的构建**:假设数据集中的每个样本独立同分布(i.i.d),则函数可以表示为所有样本的概率乘积。 \[ L(\theta) = \prod_{i=1}^{N} P(y_i|x_i;\theta) \] - **对数函数**:由于直接优化乘积形式的函数可能数值不稳定,通常取对数将其转化为加法形式: \[ \log L(\theta) = \sum_{i=1}^{N} \log P(y_i|x_i;\theta) \] - **负对数**:为了将最大化问题转化为最小化问题,取对数的负值作为损失函数: \[ NLL(\theta) = -\frac{1}{N} \sum_{i=1}^{N} \log P(y_i|x_i;\theta) \tag{2}[^2] \] #### 3. 高斯分布下的负对数 对于连续变量,假设模型的输出服从高斯分布 \( f(x|\mu, \sigma^2) \),则其概率密度函数为: \[ f(x|\mu, \sigma^2) = \frac{1}{\sqrt{2\pi\sigma^2}} e^{-\frac{(x-\mu)^2}{2\sigma^2}} \] 取对数后得到对数函数: \[ \log f(x|\mu, \sigma^2) = -\frac{1}{2} \log(2\pi) - \frac{1}{2} \log(\sigma^2) - \frac{(x-\mu)^2}{2\sigma^2} \] 负对数函数为: \[ NLL(x|\mu, \sigma^2) = \frac{1}{2} \log(2\pi) + \frac{1}{2} \log(\sigma^2) + \frac{(x-\mu)^2}{2\sigma^2} \tag{3}[^4] \] #### 4. 多分类任务中的负对数 在多分类任务中,模型通常输出每个类别的概率分布 \( p_k = P(y=k|x;\theta) \),其中 \( k \) 表示类别。假设真实标签为 \( y_i \),则负对数损失函数可以写为: \[ NLL(\theta) = -\frac{1}{N} \sum_{i=1}^{N} \log p_{y_i} \tag{4}[^3] \] 其中 \( p_{y_i} \) 表示模型预测的真实类别概率。 --- ```python import torch import torch.nn as nn # 示例:使用PyTorch实现负对数损失 # 假设模型输出为未归一化的分数(logits) logits = torch.tensor([[2.0, 1.0, 0.1], [0.5, 2.5, 0.3]], requires_grad=True) # 真实标签 targets = torch.tensor([0, 1]) # 定义负对数损失函数 nll_loss = nn.NLLLoss() # 计算softmax并取对数 log_probs = torch.log_softmax(logits, dim=1) # 计算损失 loss = nll_loss(log_probs, targets) print("负对数损失:", loss.item()) ``` --- ###
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值