前言
Softmax回归主要用于分类问题,它所解决的是常规分类算法输出值不稳定的问题
比如 有三种类别分类,我对于一组图像输出值为0.1 100 0.1
那很显然,我们第二个输出值较大,可以表明第二类是我们预测的类别
但是如果对于另外一组图片 1000 100 1000 对于这种例子,在刚刚举的例子最大输出值,在这一组就显得比较小,这种误差值比较大,我们难以在后续的优化算法进行优化
所以我们提出的Softmax算法,就是将输出值转换到0–1的概率分布
这么看可能很难看懂
我举个简单的例子 比如一个输出值为 [ 1, 2, 3]
那么经过softmax转换后
我们输出值1就转换为
e
1
/
(
e
1
+
e
2
+
e
3
)
e^1/(e^1 + e^2 + e^3)
e1/(e1+e2+e3)
我们就通过这样一个函数
将输出值映射为0–1的值,并且这些值累加起来等于1
实战
这里我举得例子是动手写深度学习里面的softmax回归实现分类FashionMnist
使用的是mxnet内核
我们要想反向求出梯度
那么我们需要定义一个损失函数
这个损失函数是交叉熵函数
H
=
−
Σ
(
y
log
(
y
⋅
)
)
H = -\Sigma(y\log(y·))
H=−Σ(ylog(y⋅))
这里y是正确的分类标签,而y`是我们预测出来的分类标签
交叉熵适合衡量两个概率分布的差异
我们这里重点讲一下Softmax回归实现
显然我们是需要求得样本的指数运算值,以及样本指数运算值累加和
def softmax(X):
X_exp = X.exp()
partition = X_exp.sum(axis=1, keepdims=True)
return X_exp / partition
这里运用了广播机制
我们可以进行验证
from mxnet import nd
def softmax(X):
X_exp = X.exp()
partition = X_exp.sum(axis=1, keepdims=True)
return X_exp / partition
X = nd.array([[1, 2, 3], [4, 5, 6]])
print(softmax(X))
输出结果为
[[0.09003057 0.24472848 0.66524094]
[0.09003057 0.24472846 0.66524094]]
<NDArray 2x3 @cpu(0)>
Process finished with exit code 0
进行简单的实验后我们开始正式进行模型的搭建
import deep_learning_course_d2lzh.d2lzh as d2l
from mxnet import gluon, init
from mxnet.gluon import loss as gloss, nn
batch_size = 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
net = nn.Sequential()
net.add(nn.Dense(10))
net.initialize(init.Normal(sigma=0.01))
loss = gloss.SoftmaxCrossEntropyLoss()
trainer = gluon.Trainer(net.collect_params(), 'sgd', {'learning_rate':0.1})
num_epochs = 5
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, batch_size, None, None, trainer)
其他的冗余代码就不敲了,本文主要是分析softmax回归的原理以及应用
总的来说softmax回归能让预测值稳定在0-1分布,能更好的进行损失值计算优化