一,线性神经网络

1.1线性回归

1.2Softmax回归

1.2.1 softmax公式

Softmax 函数是一种在机器学习和深度学习中广泛使用的激活函数,特别是在处理多类分类问题时。它的作用是将一个向量或一组实数转换为概率分布,使得每个元素的值都在0到1之间,并且所有元素的和为1。这使得Softmax函数非常
softmax(xn)=exn∑i=1Nexi \mathrm{softmax}(\mathrm{x}_n)=\frac{\mathrm{e}^{x_n}}{\sum_{i=1}^N\mathrm{e}^{x_i}} softmax(xn)=i=1Nexiexn
[x_i] 当前标量

其中輸出一一个长度为n的向量
ex1∑i=1Nexi + ex2∑i=1Nexi + ... + exN∑i=1Nexi = ∑i=1Nexi∑i=1Nexi=1 \frac{\mathrm{e}^{x_{1}}}{\sum_{i=1}^{N}e^{x_{i}}}\:+\:\frac{\mathrm{e}^{x_{2}}}{\sum_{i=1}^{N}e^{x_{i}}}\:+\:...\:+\:\frac{\mathrm{e}^{x_{N}}}{\sum_{i=1}^{N}e^{x_{i}}}\:=\:\frac{\sum_{i=1}^{N}e^{x_{i}}}{\sum_{i=1}^{N}e^{x_{i}}}=1 i=1Nexiex1+i=1Nexiex2+...+i=1NexiexN=i=1Nexii=1Nexi=1
例如:设存在一个向量[1.4,-.01,0.3]经过softmax映射后得到
softmax−>[e1.4e1.4+e−0.1+e0.3e−0.1e1.4+e−0.1+e0.3e0.3e1.4+e−0.1+e0.3]=[0.6430.1430.214] softmax->\begin{bmatrix}\frac{\mathrm{e}^{1.4}}{\mathrm{e}^{1.4}+\mathrm{e}^{-0.1}+\mathrm{e}^{0.3}}\\\frac{\mathrm{e}^{-0.1}}{\mathrm{e}^{1.4}+\mathrm{e}^{-0.1}+\mathrm{e}^{0.3}}\\\frac{\mathrm{e}^{0.3}}{\mathrm{e}^{1.4}+\mathrm{e}^{-0.1}+\mathrm{e}^{0.3}}\end{bmatrix}=\begin{bmatrix}0.643\\0.143\\0.214\end{bmatrix} softmax>e1.4+e0.1+e0.3e1.4e1.4+e0.1+e0.3e0.1e1.4+e0.1+e0.3e0.3=0.6430.1430.214
尽管Softmax函数本身是一个非线性变换,但在Softmax回归模型中,最终的输出(即每个类别的概率分布)实际上是由输入特征经过一个仿射变换(线性变换加上偏置)决定的。这里的“线性模型”并不是指整个模型是线性的,而是指模型的输出是输入特征的线性组合的函数。

多类分类问题中,基于Softmax回归模型的预测过程。y**^** 表示模型的预测结果,它是使概率最大化的类别索引。换句话说,模型预测输入特征 x 属于具有最高概率的类别

argmax函数:argmax 是一个函数,它返回使给定表达式最大化的索引。
y^=argmax(ewi⋅xΣc=1Newcw⋅x, i−1,...,N) \mathbf{\hat{y}}=\mathrm{argmax}(\frac{\mathrm{e}^{\mathrm{w}_i\cdot\mathbf{x}}}{\Sigma_{c=1}^Ne^{\mathrm{w}c^{\mathrm{w}}\cdot\mathbf{x}}},\:i\mathrm{-}1,...,\mathrm{N}) y^=argmax(Σc=1Newcwxewix,i1,...,N)

1.2.2损失函数

交叉熵损失(Cross Entropy Loss)是一种在机器学习和深度学习中常用的损失函数,特别是在处理分类问题时。它衡量的是模型预测的概率分布与真实标签的概率分布之间的差异。

对于二分类任务
l(y,y^)=−∑iyilog⁡y^i=−log⁡y^y l(\mathbf{y},\hat{\mathbf{y}})=-\sum_iy_i\log\hat{y}_i=-\log\hat{y}_y l(y,y^)=iyilogy^i=logy^y
对于多分类任务:
l(y,y^)=−1T∑j=1T(∑i=1Myi(j)⋅log⁡2y^i(j)) l(\mathbf{y},\hat{\mathbf{y}})=-\frac1{\mathrm{T}}\sum_{j=1}^\mathrm{T}(\sum_{i=1}^\mathrm{M}y_i^{(j)}\cdot\log_2\hat{\mathrm{y}}_i^{(j)}) l(y,y^)=T1j=1T(i=1Myi(j)log2y^i(j))
N 是样本数量,M 是类别数量,yij 是第 i 个样本是否属于类别 j* 的真实标签(通常是0或1),y*^ij 是模型预测第 i 个样本属于类别 j 的概率。

1.2.3softmax导数

l(y,y^)=−∑j=1qyjlog⁡exp⁡(oj)∑k=1qexp⁡(ok)=∑j=1qyjlog⁡∑k=1qexp⁡(ok)−∑j=1qyjoj=log⁡∑k=1qexp⁡(ok)−∑j=1qyjoj. \begin{aligned}l(\mathbf{y},\hat{\mathbf{y}})&=-\sum_{j=1}^qy_j\log\frac{\exp(o_j)}{\sum_{k=1}^q\exp(o_k)}\\&=\sum_{j=1}^qy_j\log\sum_{k=1}^q\exp(o_k)-\sum_{j=1}^qy_jo_j\\&=\log\sum_{k=1}^q\exp(o_k)-\sum_{j=1}^qy_jo_j.\end{aligned} l(y,y^)=j=1qyjlogk=1qexp(ok)exp(oj)=j=1qyjlogk=1qexp(ok)j=1qyjoj=logk=1qexp(ok)j=1qyjoj.

2.2.4 例子

假设有一个 3 分类问题,第 i 个样本的真实标签是第 2 类(one-hot 编码为 [0,1,0]),模型输出的 logits 为 z(i)=[0.5,1.2,0.8]。

计算 Softmax:

softmax(z)≈[0.229,0.467,0.304]

计算交叉熵损失

正确类别是第 2 类,对应的预测概率为 0.467。交叉熵损失为:

L(i)=−log(0.467)≈0.762

1.2.5代码
import torch
import torch.nn as nn

# 假设有一个输入张量,它的形状是(batch_size, num_classes),
# 其中num_classes是类别的数量。
input_tensor = torch.randn(3, 5)  # 随机生成一个形状为(3, 5)的张量

# 使用Softmax
# 通常在应用Softmax之前,会先通过一个线性层(全连接层)来获取logits。
# 直接对随机生成的logits应用Softmax。
softmax = nn.Softmax(dim=1)  # dim=1表示沿着每一行应用Softmax,即对每个样本的类别概率进行归一化
output = softmax(input_tensor)

print(output)
class SimpleClassifier(nn.Module):
    def __init__(self, input_dim, num_classes):
        super(SimpleClassifier, self).__init__()
        self.fc = nn.Linear(input_dim, num_classes)  # 全连接层
        self.softmax = nn.Softmax(dim=1)  # Softmax层

    def forward(self, x):
        x = self.fc(x)  # 计算logits
        x = self.softmax(x)  # 应用Softmax
        return x

# 假设输入特征维度是64,类别数量是5
model = SimpleClassifier(64, 5)

# 假设有一个输入张量,它的形状是(batch_size, input_dim)
input_tensor = torch.randn(3, 64)  # 随机生成一个形状为(3, 64)的张量

# 通过模型获取预测概率
output = model(input_tensor)

print(output)   

更多推荐