一、softmax回归
1、 softmax函数能够将未规范化的预测变换为非负数并且总和为1,同时让模型保持 可导的性质。 为了完成这一目标,我们首先对每个未规范化的预测求幂,这样可以确保输出非负。 为了确保最终输出的概率值总和为1,我们再让每个求幂后的结果除以它们的总和。如下式:
2、softmax回归是一个多分类模型;
使用softmax操作子得到每个类的预测置信度
使用交叉熵来衡量预测和标号的区别
二、损失函数:下图中:绿色为似然函数,橙色为导数,蓝色为损失函数
1、均方损失
2、绝对值损失函数
3、鲁棒损失函数
二、softmax实现
1、初始化模型参数
import torch from IPython import display from d2l import torch as d2l batch_size = 256 train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
num_inputs = 784 num_outputs = 10 W = torch.normal(0, 0.01, size=(num_inputs, num_outputs), requires_grad=True) b = torch.zeros(num_outputs, requires_grad=True)
这里的每个样本都将用固定长度的向量表示。 原始数据集中的每个样本都是28×28的图像。 本节将展平每个图像,把它们看作长度为784的向量。与线性回归一样,使用正态分布初始化我们的权重W
,偏置初始化为0。
2、定义softmax操作
实现softmax由三个步骤组成:
-
对每个项求幂(使用
exp
); -
对每一行求和(小批量中每个样本是一行),得到每个样本的规范化常数;
-
将每一行除以其规范化常数,确保结果的和为1。
def softmax(X): X_exp = torch.exp(X) partition = X_exp.sum(1, keepdim=True) return X_exp / partition # 这里应用了广播机制
3、定义softmax回归模型
def net(X): return softmax(torch.matmul(X.reshape((-1, W.shape[0])), W) + b)
4、交叉熵损失函数
def cross_entropy(y_hat, y): return - torch.log(y_hat[range(len(y_hat)), y]) cross_entropy(y_hat, y)
5、优化算法
trainer = torch.optim.SGD(net.parameters(), lr=0.1) #学习率为0.1
6、训练
num_epochs = 10 #训练迭代10次 d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)