什么是softmax?
社会科学家Duncan Luce 于1959年在选择模型理论基础上发明的softmax函数正是这样做的:softmax函数能够将未规范化的预测变换为非负数并且总和为1,同时让模型保持可导性,为了实现这一目标,我们首先对每个未规范化的预测求幂,这样可以确保输出为非负数。为了确保最终输出的概率值总和为1,我们再让每个求幂后的结果除以结果的总和,如下式:
这里,对于所有的j总有0⩽
y
ˆ
\^{ y }
yˆ⩽1。因此
y
ˆ
\^{ y }
yˆ可以视为一个正确的概率分布。softmax运算不会改变未规范化的预测o之间的大小次序,只会确定分配给每个类别的概率。尽管softmax是一个非线性函数,但softmax回归的输出仍然由输入特征的仿射变化决定,softmax在多分类模型中应用非常广泛。
常与softmax回归伴随出现的还有交叉熵损失,交叉熵损失是所有的标签分布的预期损失值。例如我们通过softmax预测一个三分类结果y为(0.1,0.8,0.1)与实际结果(0,1,0)之间的差值即为交叉熵损失。
交叉熵的公式为:
softmax简洁实现
import torch
from torch import nn
from d2l import torch as d2l
batch_size = 256
train_iter,test_iter = d2l.load_data_fashion_mnist(batch_size)
#定义网络,输入为28x28=784 输出为10分类
net = nn.Sequential(nn.Flatten(),nn.Linear(784,10))
#对权重进行初始化
def init_weights(m):
if type(m) == nn.Linear:
nn.init.normal_(m.weight,std=0.01)
net.apply(init_weights)
#损失函数为交叉熵损失函数
loss = nn.CrossEntropyLoss(reduction='none')
#随机梯度下降的方式进行参数反向优化
trainer = torch.optim.SGD(net.parameters(),lr=0.1)
num_epochs = 110
d2l.train_ch3(net,train_iter,test_iter,loss,num_epochs,trainer)