softmax函数简介

Softmax在机器学习中有非常广泛的应用,但是刚刚接触机器学习的人可能对Softmax的特点以及好处并不理解,其实你了解了以后就会发现,Softmax计算简单,效果显著,非常好用。

我们先来直观看一下,Softmax究竟是什么意思

我们知道max,假如说我有两个数,a和b,并且a>b,如果取max,那么就直接取a,没有第二种可能

但有的时候我不想这样,因为这样会造成分值小的那个饥饿。所以我希望分值大的那一项经常取

到,分值小的那一项也偶尔可以取到,那么我用softmax就可以了

现在还是a和b,a>b,如果我们取按照softmax来计算取a和b的概率,那a的softmax值大于b的,

以a会经常取到,而b也会偶尔取到,概率跟它们本来的大小有关。所以说不是max,而是 Soft max

那各自的概率究竟是多少呢,我们下面就来具体看一下

定义

假设我们有一个数组,V,Vi表示V中的第i个元素,那么这个元素的Softmax值就是

S_i = \frac{e^{V_i}}{\sum_j{e^{V_j}}}

也就是说,是该元素的指数,与所有元素指数和的比值

这个定义可以说非常的直观,当然除了直观朴素好理解以外,它还有更多的优点

1.计算与标注样本的差距

在神经网络的计算当中,我们经常需要计算按照神经网络的正向传播计算的分数S1,和按照正确标

注计算的分数S2,之间的差距,计算Loss,才能应用反向传播。Loss定义为交叉熵

L_i=-log(\frac{e^{f_{y_i}}}{\sum_j{e^j}})

取log里面的值就是这组数据正确分类的Softmax值,它占的比重越大,这个样本的Loss也就越小,

这种定义符合我们的要求

2.计算上非常非常的方便

当我们对分类的Loss进行改进的时候,我们要通过梯度下降,每次优化一个step大小的梯度

我们定义选到yi的概率是

P_{y_i}=\frac{e^{f_{y_i}}}{\sum_j{e^j}}

然后我们求Loss对每个权重矩阵的偏导,应用链式法则(中间推导省略)

\frac{\partial{L_i}}{\partial{f_{y_i}}}=\frac{\partial(-\ln(\frac{e^{f_{y_{i}}}}{\sum_{j}e^{​{j}}}))}{\partial{f_{y_i}}}=P_{f_{y_i}}-1

最后结果的形式非常的简单,只要将算出来的概率的向量对应的真正结果的那一维减1,就可以了

举个例子,通过若干层的计算,最后得到的某个训练样本的向量的分数是[ 1, 5, 3 ],

那么概率分别就是[0.015,0.866,0.117],如果这个样本正确的分类是第二个的话,那么计算出来的偏

导就是[0.015,0.866−1,0.117]=[0.015,−0.134,0.117],是不是很简单!!然后再根据这个进行back

propagation就可以了

### Java 实现 Softmax 函数 在Java中实现Softmax函数可以按照以下方式完成: ```java public class Softmax { public static double[] softmax(double[] input) { double sumExp = 0; double[] expValues = new double[input.length]; // 计算每个输入值的指数并求和 for (int i = 0; i < input.length; i++) { expValues[i] = Math.exp(input[i]); sumExp += expValues[i]; } // 归一化处理得到最终的概率分布 for (int i = 0; i < expValues.length; i++) { expValues[i] /= sumExp; } return expValues; } public static void main(String[] args) { double[] inputs = {2.0, 1.0, 0.1}; double[] probabilities = softmax(inputs); System.out.println("Probabilities: "); for (double prob : probabilities) { System.out.printf("%.4f ", prob); } } } ``` 上述代码展示了如何定义`softmax()`方法来接收一个双精度浮点数组作为参数,并返回经过Softmax变换后的结果。此过程涉及先计算各个元素e的自然指数,再除以这些指数之和从而获得相应的概率值[^1]。 对于Python中的实现,则可以通过更简洁的方式达成相同效果: ```python import numpy as np def softmax(x): e_x = np.exp(x - np.max(x)) # 防止数值溢出 return e_x / e_x.sum() input_values = [2.0, 1.0, 0.1] probabilities = softmax(np.array(input_values)) print('Probabilities:', probabilities) ``` 这里利用NumPy库简化了矩阵运算操作,在实际应用中推荐采用这种方式提高效率和可读性[^2]。 Softmax函数的作用在于将多个不同类别的得分转化为各自属于该类别可能性大小的一个估计值集合,其中每个分量都位于(0,1)区间内且总和等于1。这使得模型输出可以直接解释成条件概率[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值