在神经网络中,输出层(Output Layer) 的激活函数(Activation Function)直接决定了模型的输出形式,并影响损失函数的选择及训练效果。不同的任务类型(如分类或回归)需要使用不同的激活函数,以确保输出结果符合问题要求。
本文将详细介绍 二元分类(Binary Classification)、多分类(Multi-class Classification)和回归(Regression)任务中常用的输出层激活函数,并提供相应的代码示例。
1. 输出层激活函数概述
根据任务类型,输出层常用的激活函数如下:
任务类型 | 常见激活函数 | 输出值范围 |
---|---|---|
二元分类 | sigmoid | (0,1) |
多分类 | softmax | (0,1) 且所有类别概率之和为 1 |
回归 | 无激活函数(线性输出) | (-∞, +∞) |
接下来,我们分别介绍这些激活函数的作用、数学公式、特点及代码实现。
2. 二元分类:Sigmoid 函数
2.1 介绍
Sigmoid 函数常用于二元分类问题,其数学公式如下:
- 该函数将输出值映射到 (0,1) 之间,适用于概率预测。
- 若 ,通常预测为正类(1),否则为负类(0)。
2.2 代码示例
PyTorch 实现二元分类
import torch
import torch.nn as nn
import torch.optim as optim# 定义二元分类模型
class BinaryClassifier(nn.Module): # 二元分类模型def __init__(self): # 初始化模型super(BinaryClassifier, self).__init__() # 继承父类self.fc = nn.Linear(2, 1) # 2个输入特征,1个输出(概率)def forward(self, x): # 前向传播return torch.sigmoid(self.fc(x)) # Sigmoid 激活函数# 定义损失函数和优化器
model = BinaryClassifier() # 创建模型
criterion = nn.BCELoss() # 二元交叉熵损失
optimizer = optim.SGD(model.parameters(), lr=0.1) # 优化器# 生成示例数据
inputs = torch.tensor([[1.0, 2.0], [2.0, 3.0], [3.0, 1.0]], dtype=torch.float32) # 输入特征
labels = torch.tensor([[1.0], [0.0], [1.0]], dtype=torch.float32) # 标签# 训练模型
for epoch in range(100): # 训练100个周期optimizer.zero_grad() # 清空梯度outputs = model(inputs) # 前向传播loss = criterion(outputs, labels) # 计算损失loss.backward() # 反向传播optimizer.step() # 更新参数if epoch % 10 == 0: # 每10个周期输出一次损失print(f'Epoch [{epoch}/100], Loss: {loss.item():.4f}') # 输出损失
运行结果
Epoch [0/100], Loss: 1.1413
Epoch [10/100], Loss: 0.5956
Epoch [20/100], Loss: 0.5529
Epoch [30/100], Loss: 0.5320
Epoch [40/100], Loss: 0.5160
Epoch [50/100], Loss: 0.5033
Epoch [60/100], Loss: 0.4927
Epoch [70/100], Loss: 0.4835
Epoch [80/100], Loss: 0.4753
Epoch [90/100], Loss: 0.4679
2.3 适用场景
- 垃圾邮件检测(垃圾邮件 vs. 非垃圾邮件)
- 疾病预测(有病 vs. 无病)
- 金融欺诈检测(欺诈 vs. 正常交易)
3. 多分类:Softmax 函数
3.1 介绍
Softmax 函数用于多分类任务,其数学公式如下:
- 特点:
- 归一化所有输出值,使其总和等于 1(形成概率分布)。
- 适用于独占类别(Mutually Exclusive Classes)的分类任务。
3.2 代码示例
PyTorch 实现多分类
import torch
import torch.nn as nn
import torch.optim as optimclass MultiClassClassifier(nn.Module): # 多分类模型def __init__(self, input_dim, num_classes): # 输入维度和类别数super(MultiClassClassifier, self).__init__() # 继承父类初始化方法self.fc = nn.Linear(input_dim, num_classes) # 线性层self.fc.weight.data.normal_(0, 0.01) # 初始化权重def forward(self, x): # 前向传播return torch.softmax(self.fc(x), dim=1) # Softmax 归一化# 定义模型、损失函数和优化器
model = MultiClassClassifier(input_dim=3, num_classes=4) # 创建模型
criterion = nn.CrossEntropyLoss() # 交叉熵损失函数
optimizer = optim.Adam(model.parameters(), lr=0.01) # Adam 优化器# 生成示例数据(假设有3个特征,4个类别)
inputs = torch.tensor([[1.0, 2.0, 3.0], [2.0, 1.0, 3.0]], dtype=torch.float32) # 输入特征
labels = torch.tensor([1, 3]) # 类别索引(0-3)# 训练模型
for epoch in range(100): # 训练100个周期optimizer.zero_grad() # 清空梯度outputs = model(inputs) # 前向传播loss = criterion(outputs, labels) # 计算损失loss.backward() # 反向传播optimizer.step() # 更新参数if epoch % 10 == 0: # 每10个周期打印一次损失print(f'Epoch [{epoch}/100], Loss: {loss.item():.4f}') # 打印损失
运行结果
Epoch [0/100], Loss: 1.3481
Epoch [10/100], Loss: 1.2146
Epoch [20/100], Loss: 1.1262
Epoch [30/100], Loss: 1.0629
Epoch [40/100], Loss: 1.0134
Epoch [50/100], Loss: 0.9731
Epoch [60/100], Loss: 0.9401
Epoch [70/100], Loss: 0.9131
Epoch [80/100], Loss: 0.8909
Epoch [90/100], Loss: 0.8727
3.3 适用场景
- 手写数字识别(MNIST,类别 0-9)
- 图像分类(狗、猫、鸟等)
- 情感分析(积极、中性、消极)
4. 回归:无激活函数(线性输出)
4.1 介绍
在回归任务中,目标是预测连续数值,因此输出层通常不使用激活函数,保持线性输出:
- 预测值范围为(-∞, +∞),不受激活函数限制。
4.2 代码示例
PyTorch 实现回归
import torch
import torch.nn as nn
import torch.optim as optimclass RegressionModel(nn.Module): # 线性回归模型def __init__(self): # 初始化模型super(RegressionModel, self).__init__() # 继承父类self.fc = nn.Linear(1, 1) # 单输入单输出def forward(self, x): # 前向传播return self.fc(x) # 线性输出,无激活函数# 定义模型、损失函数和优化器
model = RegressionModel() # 创建模型
criterion = nn.MSELoss() # 均方误差损失
optimizer = optim.SGD(model.parameters(), lr=0.01) # 随机梯度下降优化器# 生成示例数据
inputs = torch.tensor([[1.0], [2.0], [3.0]], dtype=torch.float32) # 输入 x
targets = torch.tensor([[2.0], [4.0], [6.0]], dtype=torch.float32) # 目标 y = 2x# 训练模型
for epoch in range(100): # 训练100个周期optimizer.zero_grad() # 梯度清零outputs = model(inputs) # 前向传播loss = criterion(outputs, targets) # 计算损失loss.backward() # 反向传播optimizer.step() # 更新参数if epoch % 10 == 0: # 每10个周期打印一次损失print(f'Epoch [{epoch}/100], Loss: {loss.item():.4f}') # 输出损失
运行结果
Epoch [0/100], Loss: 18.9413
Epoch [10/100], Loss: 1.8053
Epoch [20/100], Loss: 0.1735
Epoch [30/100], Loss: 0.0181
Epoch [40/100], Loss: 0.0032
Epoch [50/100], Loss: 0.0017
Epoch [60/100], Loss: 0.0015
Epoch [70/100], Loss: 0.0014
Epoch [80/100], Loss: 0.0013
Epoch [90/100], Loss: 0.0013
4.3 适用场景
- 房价预测
- 股票价格预测
- 销量预测
5. 结论
任务类型 | 激活函数 | 适用损失函数 |
---|---|---|
二元分类 | Sigmoid | 二元交叉熵(BCELoss) |
多分类 | Softmax | 交叉熵损失(CrossEntropyLoss) |
回归 | 无激活函数 | 均方误差(MSELoss) |
不同任务类型需要选择合适的激活函数,以确保神经网络能够正确学习和预测目标值。希望本文能帮助你更好地理解输出层激活函数的使用!