深度学习模型系列一——多分类模型——Softmax 回归

1、概述

\quad \quad Softmax回归(Softmax regression),也称为多项(Multinomial)或多类(Multi-Class)的Logistic回归,是Logistic回归在多分类问题上的推广。

\quad \quad 【关于 logistic 回归可以看我的这篇博客👉机器学习笔记九——线性模型原理以及python实现案例

2、Softmax回归模型

\quad \quad Softmax回归跟线性回归一样将输入特征与权重做线性叠加。与线性回归的一个主要不同在于,Softmax回归的输出值个数等于标签里的类别数。比如一共有4种特征和3种输出动物类别(狗、猫、鸡),则权重包含12个标量(带下标的 w w w)、偏差包含3个标量(带下标的 b b b),且对每个输入计算 o 1 , o 2 , o 3 o_1, o_2, o_3 o1,o2,o3这3个输出:

o 1 = x 1 w 11 + x 2 w 21 + x 3 w 31 + x 4 w 41 + b 1 , o 2 = x 1 w 12 + x 2 w 22 + x 3 w 32 + x 4 w 42 + b 2 , o 3 = x 1 w 13 + x 2 w 23 + x 3 w 33 + x 4 w 43 + b 3 . \begin{aligned} o_1 &= x_1 w_{11} + x_2 w_{21} + x_3 w_{31} + x_4 w_{41} + b_1,\\ o_2 &= x_1 w_{12} + x_2 w_{22} + x_3 w_{32} + x_4 w_{42} + b_2,\\ o_3 &= x_1 w_{13} + x_2 w_{23} + x_3 w_{33} + x_4 w_{43} + b_3. \end{aligned} o1o2o3=x1w11+x2w21+x3w31+x4w41+b1,=x1w12+x2w22+x3w32+x4w42+b2,=x1w13+x2w23+x3w33+x4w43+b3.
最后,再对这些输出值进行Softmax函数运算
在这里插入图片描述

\quad \quad 图3.2用神经网络图描绘了上面的计算。softmax回归同线性回归一样,也是一个单层神经网络。由于每个输出 o 1 , o 2 , o 3 o_1, o_2, o_3 o1,o2,o3的计算都要依赖于所有的输入 x 1 , x 2 , x 3 , x 4 x_1, x_2, x_3, x_4 x1,x2,x3,x4,所以softmax回归的输出层也是一个全连接层。

3、Softmax函数

\quad \quad Softmax用于多分类过程中,它将多个神经元的输出(比如 o 1 , o 2 , o 3 o_1, o_2, o_3 o1,o2,o3)映射到(0,1)区间内,可以看成概率来理解,从而来进行多分类!它通过下式将输出值变换成值为正且和为1的概率分布:

y ^ 1 , y ^ 2 , y ^ 3 = softmax ( o 1 , o 2 , o 3 ) , \hat{y}_1, \hat{y}_2, \hat{y}_3 = \text{softmax}(o_1, o_2, o_3), y^1,y^2,y^3=softmax(o1,o2,o3),

其中

y ^ 1 = exp ⁡ ( o 1 ) ∑ i = 1 3 exp ⁡ ( o i ) , y ^ 2 = exp ⁡ ( o 2 ) ∑ i = 1 3 exp ⁡ ( o i ) , y ^ 3 = exp ⁡ ( o 3 ) ∑ i = 1 3 exp ⁡ ( o i ) . \hat{y}_1 = \frac{ \exp(o_1)}{\sum_{i=1}^3 \exp(o_i)},\quad \hat{y}_2 = \frac{ \exp(o_2)}{\sum_{i=1}^3 \exp(o_i)},\quad \hat{y}_3 = \frac{ \exp(o_3)}{\sum_{i=1}^3 \exp(o_i)}. y^1=i=13exp(oi)exp(o1),y^2=i=13exp(oi)exp(o2),y^3=i=13exp(oi)exp(o3).

容易看出 y ^ 1 + y ^ 2 + y ^ 3 = 1 \hat{y}_1 + \hat{y}_2 + \hat{y}_3 = 1 y^1+y^2+y^3=1 0 ≤ y ^ 1 , y ^ 2 , y ^ 3 ≤ 1 0 \leq \hat{y}_1, \hat{y}_2, \hat{y}_3 \leq 1 0y^1,y^2,y^31,因此 y ^ 1 , y ^ 2 , y ^ 3 \hat{y}_1, \hat{y}_2, \hat{y}_3 y^1,y^2,y^3是一个合法的概率分布。这时候,如果 y ^ 2 = 0.8 \hat{y}_2=0.8 y^2=0.8,不管 y ^ 1 \hat{y}_1 y^1 y ^ 3 \hat{y}_3 y^3的值是多少,我们都知道图像类别为猫的概率是80%。此外,我们注意到

argmax ⁡ o i = argmax ⁡ y ^ i , \operatorname{argmax} o_i = \operatorname{argmax} \hat y_i, argmaxoi=argmaxy^i,

因此softmax运算不改变预测类别输出。

在这里插入图片描述

4、Softmax回归的决策函数

\quad \quad 为了提高计算效率,我们可以将单样本分类通过矢量计算来表达。在上面的图像分类问题中,假设softmax回归的权重和偏差参数分别为

W = [ w 11 w 12 w 13 w 14 w 21 w 22 w 23 w 24 w 31 w 32 w 33 w 34 ] , b = [ b 1 b 2 b 3 ] , \boldsymbol{W} = \begin{bmatrix} w_{11} & w_{12} & w_{13} & w_{14} \\ w_{21} & w_{22} & w_{23}& w_{24} \\ w_{31} & w_{32} & w_{33} & w_{34} \end{bmatrix},\quad \boldsymbol{b} = \begin{bmatrix} b_1 & b_2 & b_3 \end{bmatrix}, W=w11w21w31w12w22w32w13w23w33w14w24w34,b=[b1b2b3],

设高和宽分别为2个像素的图像样本 i i i的特征为

x ( i ) = [ x 1 ( i ) x 2 ( i ) x 3 ( i ) x 4 ( i ) ] , \boldsymbol{x}^{(i)} = \begin{bmatrix}x_1^{(i)} & x_2^{(i)} & x_3^{(i)} & x_4^{(i)}\end{bmatrix}, x(i)=[x1(i)x2(i)x3(i)x4(i)],

输出层的输出为

o ( i ) = [ o 1 ( i ) o 2 ( i ) o 3 ( i ) ] , \boldsymbol{o}^{(i)} = \begin{bmatrix}o_1^{(i)} & o_2^{(i)} & o_3^{(i)}\end{bmatrix}, o(i)=[o1(i)o2(i)o3(i)],

预测为狗、猫或鸡的概率分布为

y ^ ( i ) = [ y ^ 1 ( i ) y ^ 2 ( i ) y ^ 3 ( i ) ] . \boldsymbol{\hat{y}}^{(i)} = \begin{bmatrix}\hat{y}_1^{(i)} & \hat{y}_2^{(i)} & \hat{y}_3^{(i)}\end{bmatrix}. y^(i)=[y^1(i)y^2(i)y^3(i)].

Softmax回归对样本 i i i分类的矢量计算表达式为

o ( i ) = x ( i ) W T + b , y ^ ( i ) = softmax ( o ( i ) ) = exp ⁡ ( o i ) ∑ i = 1 3 exp ⁡ ( o i ) . \begin{aligned} \boldsymbol{o}^{(i)} &= \boldsymbol{x}^{(i)} \boldsymbol{W}^T + \boldsymbol{b},\\ \boldsymbol{\hat{y}}^{(i)} &= \text{softmax}(\boldsymbol{o}^{(i)})= \frac{ \exp(o_i)}{\sum_{i=1}^3 \exp(o_i)}. \end{aligned} o(i)y^(i)=x(i)WT+b,=softmax(o(i))=i=13exp(oi)exp(oi).
则Softmax回归的决策函数可以表示为:

y ^ = a r g m a x y ^ ( i ) \hat{\boldsymbol{y}}=\boldsymbol{argmax}\quad \boldsymbol {\hat{y}}^{(i)} y^=argmaxy^(i)

5、参数估计

5.1 损失函数

\quad \quad 给定N个训练样本 { ( x ( n ) , y ( n ) ) } n = 1 N \{(x^{(n)},y^{(n)})\}_{n=1}^N {(x(n),y(n))}n=1N,样本一共有C个类别,用C维的one-hot向量 y ∈ { 0 , 1 } C y\in\{0,1\}^C y{0,1}C来表示类别标签。【对于类别c,其向量表示为 y c = [ I ( 1 = c ) , I ( 2 = c ) , . . . , I ( C = c ) ] T y_c=[I(1=c),I(2=c),...,I(C=c)]^T yc=[I(1=c),I(2=c),...,I(C=c)]T,其中 I ( . ) I(.) I(.)是指示函数】

\quad \quad 采用交叉熵损失函数,Softmax回归模型的损失函数为:

L ( W , b ) = − 1 N ∑ n = 1 N ∑ c = 1 C y c ( n ) l o g y ^ c ( n ) = − 1 N ∑ n = 1 N ( y ( n ) ) T l o g y ^ ( n ) L(\boldsymbol{W} ,\boldsymbol{b})=-\frac1N\sum_{n=1}^N\sum_{c=1}^C y_c^{(n)}log\hat{y}_c^{(n)}=-\frac1N\sum_{n=1}^N (y^{(n)})^Tlog\hat{y}^{(n)} L(W,b)=N1n=1Nc=1Cyc(n)logy^c(n)=N1n=1N(y(n))Tlogy^(n)
其中, y ^ ( n ) = S o f t m a x ( x ( n ) W T + b ) \hat{y}^{(n)}=Softmax(\boldsymbol{x}^{(n)} \boldsymbol{W}^T + \boldsymbol{b}) y^(n)=Softmax(x(n)WT+b)为样本 x ( n ) x^{(n)} x(n)在每个类别的后验概率。

当样本只有一个标签时,我们可以对损失函数简化,简化如下:

\quad \quad 当每个样本的真实标签 y ( n ) y^{(n)} y(n)只有一个标签,即是一个C维one-hot向量:若样本属于i类,则只有第i维是1,其余都是0( c ∈ [ 1 , C ] ; n ∈ [ 1 , N ] ) c\in[1,C];n\in[1,N]) c[1,C];n[1,N])。所以
L ( W , b ) = − 1 N ∑ n = 1 N ( y ( n ) ) T l o g y ^ ( n ) = − 1 N ∑ n = 1 N l o g y ^ y ( n ) ( n ) L(\boldsymbol{W} ,\boldsymbol{b})=-\frac1N\sum_{n=1}^N (y^{(n)})^Tlog\hat{y}^{(n)}=-\frac1N\sum_{n=1}^N log\hat{y}_{y^{(n)}}^{(n)} L(W,b)=N1n=1N(y(n))Tlogy^(n)=N1n=1Nlogy^y(n)(n)

其中,假设第n个样本的真实标签为第i类即 y ( n ) y^{(n)} y(n)的第i维为1,则 y ^ y ( n ) ( n ) \hat{y}_{y^{(n)}}^{(n)} y^y(n)(n)为样本预测值中第i维的值。

\quad \quad 从另一个角度来看,我们知道最小化损失函数 L ( W , b ) L(W,b) L(W,b)等价于最大化 exp ⁡ ( − n L ( W , b ) ) = ∏ i = 1 n y ^ y ( i ) ( i ) \exp(-nL(W,b))=\prod_{i=1}^n \hat y_{y^{(i)}}^{(i)} exp(nL(W,b))=i=1ny^y(i)(i),即最小化交叉熵损失函数等价于最大化训练数据集所有标签类别的联合预测概率。

5.2 梯度估计

5.2.1 Softmax函数的导数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
来源于神经网络与深度学习的附录

5.2.2 梯度

损失函数 L ( W ) L(W) L(W)关于W的梯度为:
∂ L ( W ) ∂ W = − 1 N ∑ n = 1 N x ( n ) ( y ( n ) − y ^ ( n ) ) T \frac{ \partial L(W) }{\partial W}=-\frac 1N\sum_{n=1}^Nx(n)(y^{(n)}-\hat{y}^{(n)})^T WL(W)=N1n=1Nx(n)(y(n)y^(n))T

采用梯度下降法,Softmax回归的训练过程为:

1)初始化 W 0 = 0 W_0=0 W0=0【在神经网络中,不能全部初始化为0,可随机初始化】
2) 迭代更新:
W t + 1 = W t + α ( 1 N ∑ n = 1 N x ( n ) ( y ( n ) − y ^ ( n ) ) T ) W_{t+1}=W_t+\alpha(\frac 1N\sum_{n=1}^Nx(n)(y^{(n)}-\hat{y}^{(n)})^T) Wt+1=Wt+α(N1n=1Nx(n)(y(n)y^(n))T)

6、模型预测与评价

预测
\quad \quad 在训练好softmax回归模型后,给定任一样本特征,就可以预测每个输出类别的概率。通常,我们把预测概率最大的类别作为输出类别。

评价
\quad \quad 如果它与真实类别(标签)一致,说明这次预测是正确的。一般使用准确率(accuracy)来评价模型的表现,它等于正确预测数量与总预测数量之比。

7、Softmax回归的从零开始实现

我们将使用Fashion-MNIST数据集【简介】,进行图像多分类问题。

导入所需的包

import torch
import torchvision
import numpy as np
import sys
sys.path.append('E:\d2lzh_pytorch')#加上d2lzh_pytorch的路径
import d2lzh_pytorch as d2l

1、读取数据集

batch_size = 256#小批量进行读取
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)

2、初始化模型参数

跟线性回归中的例子一样,我们将使用向量表示每个样本。已知每个样本输入是高和宽均为28像素的图像。模型的输入向量的长度是 28 × 28 = 784 28 \times 28 = 784 28×28=784:该向量的每个元素对应图像中每个像素。由于图像有10个类别,单层神经网络输出层的输出个数为10,因此softmax回归的权重和偏差参数分别为 784 × 10 784 \times 10 784×10 1 × 10 1 \times 10 1×10的矩阵。

num_inputs = 784
num_outputs = 10
#随机初始化参数
W = torch.tensor(np.random.normal(0, 0.01, (num_inputs, num_outputs)), dtype=torch.float)
b = torch.zeros(num_outputs, dtype=torch.float)

为模型参数附上梯度。

W.requires_grad_(requires_grad=True)
b.requires_grad_(requires_grad=True)

3、定义Softmax函数

def softmax(X):
    X_exp = X.exp()
    partition = X_exp.sum(dim=1, keepdim=True)#行元素求和
    return X_exp / partition  # 这里应用了广播机制

4、定义Softmax回归模型

def net(X):
    return softmax(torch.mm(X.view((-1, num_inputs)), W) + b)

5、定义损失函数

def cross_entropy(y_hat, y):
    return - torch.log(y_hat.gather(1, y.view(-1, 1)))

6、计算分类准确率

给定一个类别的预测概率分布y_hat,我们把预测概率最大的类别作为输出类别。如果它与真实类别y一致,说明这次预测是正确的。分类准确率即正确预测数量与总预测数量之比。

为了演示准确率的计算,下面定义准确率accuracy函数。其中y_hat.argmax(axis=1)返回矩阵y_hat每行中最大元素的索引,且返回结果与变量y形状相同。我们在“数据操作”一节介绍过,相等条件判别式(y_hat.argmax(axis=1) == y)是一个类型为ByteTensorTensor,我们用float()将其转换为值为0(相等为假)或1(相等为真)的浮点型Tensor

def accuracy(y_hat, y):
    return (y_hat.argmax(dim=1) == y).float().mean().item()

7、评价模型net在数据集data_iter上的准确率。

# 本函数已保存在d2lzh_pytorch包中方便以后使用。该函数将被逐步改进:它的完整实现将在“图像增广”一节中描述
def evaluate_accuracy(data_iter, net):
    acc_sum, n = 0.0, 0
    for X, y in data_iter:
        acc_sum += (net(X).argmax(dim=1) == y).float().sum().item()
        n += y.shape[0]
    return acc_sum / n

8、训练模型

num_epochs, lr = 5, 0.1

# 本函数已保存在d2lzh_pytorch包中方便以后使用
def train_ch3(net, train_iter, test_iter, loss, num_epochs, batch_size,
              params=None, lr=None, optimizer=None):
    for epoch in range(num_epochs):
        train_l_sum, train_acc_sum, n = 0.0, 0.0, 0
        for X, y in train_iter:
            y_hat = net(X)
            l = loss(y_hat, y).sum()
            
            # 梯度清零
            if optimizer is not None:
                optimizer.zero_grad()
            elif params is not None and params[0].grad is not None:
                for param in params:
                    param.grad.data.zero_()
            
            l.backward()
            if optimizer is None:
                d2l.sgd(params, lr, batch_size)
            else:
                optimizer.step()  # “softmax回归的简洁实现”一节将用到
            
            
            train_l_sum += l.item()
            train_acc_sum += (y_hat.argmax(dim=1) == y).sum().item()
            n += y.shape[0]
        test_acc = evaluate_accuracy(test_iter, net)
        print('epoch %d, loss %.4f, train acc %.3f, test acc %.3f'
              % (epoch + 1, train_l_sum / n, train_acc_sum / n, test_acc))

train_ch3(net, train_iter, test_iter, cross_entropy, num_epochs, batch_size, [W, b], lr)

epoch 1, loss 0.7852, train acc 0.750, test acc 0.789
epoch 2, loss 0.5707, train acc 0.813, test acc 0.813
epoch 3, loss 0.5258, train acc 0.826, test acc 0.818
epoch 4, loss 0.5008, train acc 0.832, test acc 0.824
epoch 5, loss 0.4843, train acc 0.838, test acc 0.827

9、预测

for X, y in test_iter:
    break

true_labels = d2l.get_fashion_mnist_labels(y.asnumpy())
pred_labels = d2l.get_fashion_mnist_labels(net(X).argmax(axis=1).asnumpy())
titles = [true + '\n' + pred for true, pred in zip(true_labels, pred_labels)]

d2l.show_fashion_mnist(X[0:9], titles[0:9])

在这里插入图片描述

参考资料:
1、https://blog.csdn.net/weixin_38169413/article/details/103598534
2、神经网络与深度学习
3、动手学深度学习

  • 29
    点赞
  • 210
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: softmax回归模型是一种常用的多分类模型,它通过将输入的特征向量映射到每个类别的概率分布上,从而实现多分类问题的求解。具体来说,softmax回归模型首先将输入的特征向量通过一个线性变换映射到一个新的向量空间中,然后再通过softmax函数将这个向量空间中的向量转化为每个类别的概率分布。在训练过程中,我们通常采用交叉熵损失函数来度量模型的预测结果与真实标签之间的差距,并通过梯度下降等优化算法来最小化损失函数,从而得到最优的模型参数。在预测过程中,我们可以直接使用softmax函数的输出作为每个类别的概率分布,然后选择概率最大的类别作为预测结果。 ### 回答2: softmax回归是一种常见的多分类问题求解方法。对于给定的样本,softmax回归模型通过线性变换和softmax函数将其映射到不同类别的概率分布上。训练softmax回归模型的目标是最小化交叉熵损失函数,通过梯度下降等优化方法不断更新模型参数,使得模型的预测结果与实际结果之间的误差最小化。 具体地说,对于一个有n个类别的多分类问题,softmax回归模型定义了n个线性变换,每个变换将输入向量映射到对应类别的logit值上。这些logit值经过softmax函数变换后,得到每个类别的概率值。softmax函数的定义如下: $softmax(y)_j = \frac{e^{y_j}}{\sum_{k=1}^{n}e^{y_k}}$ 其中$y$表示线性变换的结果,$softmax(y)_j$表示输入属于第$j$个类别的概率。 得到概率分布后,模型的损失函数可以定义为交叉熵损失。假设第$i$个样本的真实类别为$k_i$,则交叉熵损失的定义如下: $L_i = -log(\frac{e^{y_{k_i}}}{\sum_{j=1}^{n}e^{y_j}})$ 整个训练过程可以使用梯度下降等优化算法来最小化交叉熵损失。具体地,我们通过对每个样本的损失函数求导来更新模型参数,从而使得损失函数下降。一般来说,我们可以使用mini-batch gradient descent来进行优化,即每次更新一小部分数据集的参数。 最终训练出的softmax回归模型可以用于对新数据进行分类。首先,我们将输入向量通过前向传播得到每个类别的概率分布,然后选择概率最大的类别作为模型的预测结果。 除了softmax回归模型,还有一些其他的多分类问题求解方法,比如支持向量机(SVM)和决策树(Decision Tree)等。不同的方法有着不同的优缺点,我们需要根据具体应用场景来选择合适的模型。 ### 回答3: softmax回归模型是一种用于分类问题的监督式学习算法,可以用于多分类问题求解,是机器学习领域中重要的算法之一。其主要思想是通过将输入数据与权重矩阵相乘,然后将结果进行softmax转化,得到各个分类的概率分布,从而选择概率最高的分类作为预测结果。 对于一个具有n个特征的多分类问题,softmax回归模型需要学习n个特征的权重向量w,以及一个截距b。首先,根据输入的训练数据X的特征和权重向量w的乘积,得到每个分类的得分z。然后,通过softmax函数将得分转化为各个分类的概率分布,即将得分指数化然后归一化。 softmax函数可以将分类问题的输出转化为一个概率分布。它将原始的得分z映射到一个0到1的连续区间内,并且保证了概率分布的总和为1。softmax函数的公式如下: $$\hat{y_i} = \frac{e^{z_i}}{\sum_{j=1}^k e^{z_j}}, \quad i=1,2,\ldots,k,$$ 其中$\hat{y_i}$表示第i个分类的概率,k是总的分类数。 模型训练时,我们需要定义损失函数,并使用优化算法对损失函数进行优化。在softmax回归中,常用的损失函数是交叉熵损失函数。交叉熵损失函数衡量的是预测值与真实值之间的差距。其公式如下: $$\text{loss}=-\sum_{i=1}^{n}\sum_{j=1}^{k}y_{i,j}log(\hat{y_{i,j}}),$$ 其中,$y_{i,j}\in\{0,1\}$表示第i个样本是否属于第j个分类,$\hat{y_{i,j}}$表示第i个样本被分到第j个分类的概率。 模型训练时,目标是最小化损失函数。我们可以使用随机梯度下降优化算法来更新权重和截距,直到达到最小损失。 总之,softmax回归模型是一种用于多分类问题求解的监督式学习算法,其主要思想是使用softmax函数将输入数据与权重矩阵相乘的结果转化为各个分类的概率分布,然后使用交叉熵损失函数进行模型训练。该算法具有良好的性能和可解释性,已被广泛应用于各种类型的分类问题中。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值