【漫话机器学习系列】088.常见的输出层激活函数(Common Output Layer Activation Functions)

部署运行你感兴趣的模型镜像

在神经网络中,输出层(Output Layer) 的激活函数(Activation Function)直接决定了模型的输出形式,并影响损失函数的选择及训练效果。不同的任务类型(如分类或回归)需要使用不同的激活函数,以确保输出结果符合问题要求。

本文将详细介绍 二元分类(Binary Classification)、多分类(Multi-class Classification)和回归(Regression)任务中常用的输出层激活函数,并提供相应的代码示例。


1. 输出层激活函数概述

根据任务类型,输出层常用的激活函数如下:

任务类型常见激活函数输出值范围
二元分类sigmoid(0,1)
多分类softmax(0,1) 且所有类别概率之和为 1
回归无激活函数(线性输出)(-∞, +∞)

接下来,我们分别介绍这些激活函数的作用、数学公式、特点及代码实现。


2. 二元分类:Sigmoid 函数

2.1 介绍

Sigmoid 函数常用于二元分类问题,其数学公式如下:

\sigma(x) = \frac{1}{1 + e^{-x}}

  • 该函数将输出值映射到 (0,1) 之间,适用于概率预测。
  • \sigma(x) > 0.5,通常预测为正类(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 函数用于多分类任务,其数学公式如下:

\text{Softmax}(x_i) = \frac{e^{x_i}}{\sum_{j=1}^{n} e^{x_j}}

  • 特点
    • 归一化所有输出值,使其总和等于 1(形成概率分布)。
    • 适用于独占类别(Mutually Exclusive Classes)的分类任务。

3.2 代码示例

PyTorch 实现多分类
import torch
import torch.nn as nn
import torch.optim as optim


class 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 介绍

回归任务中,目标是预测连续数值,因此输出层通常不使用激活函数,保持线性输出:

y = w \cdot x + b

  • 预测值范围为(-∞, +∞),不受激活函数限制。

4.2 代码示例

PyTorch 实现回归
import torch
import torch.nn as nn
import torch.optim as optim


class 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)

不同任务类型需要选择合适的激活函数,以确保神经网络能够正确学习和预测目标值。希望本文能帮助你更好地理解输出层激活函数的使用! 

您可能感兴趣的与本文相关的镜像

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值