人工智能入门-深度学习-深入浅出线性神经网络-从公式理解到代码实践,深入softmax
一,线性神经网络
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=1Nexi∑i=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+e−0.1+e0.3e1.4e1.4+e−0.1+e0.3e−0.1e1.4+e−0.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=1Newcw⋅xewi⋅x,i−1,...,N)
1.2.2损失函数
交叉熵损失(Cross Entropy Loss)是一种在机器学习和深度学习中常用的损失函数,特别是在处理分类问题时。它衡量的是模型预测的概率分布与真实标签的概率分布之间的差异。
对于二分类任务:
l(y,y^)=−∑iyilogy^i=−logy^y
l(\mathbf{y},\hat{\mathbf{y}})=-\sum_iy_i\log\hat{y}_i=-\log\hat{y}_y
l(y,y^)=−i∑yilogy^i=−logy^y
对于多分类任务:
l(y,y^)=−1T∑j=1T(∑i=1Myi(j)⋅log2y^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=1∑T(i=1∑Myi(j)⋅log2y^i(j))
N 是样本数量,M 是类别数量,yij 是第 i 个样本是否属于类别 j* 的真实标签(通常是0或1),y*^ij 是模型预测第 i 个样本属于类别 j 的概率。
1.2.3softmax导数
l(y,y^)=−∑j=1qyjlogexp(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=1∑qyjlog∑k=1qexp(ok)exp(oj)=j=1∑qyjlogk=1∑qexp(ok)−j=1∑qyjoj=logk=1∑qexp(ok)−j=1∑qyjoj.
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)
更多推荐




所有评论(0)