欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 创投人物 > 机器学习之激活函数

机器学习之激活函数

2025/3/18 21:01:00 来源:https://blog.csdn.net/d20062056/article/details/146310430  浏览:    关键词:机器学习之激活函数

在这里插入图片描述

什么是激活函数

激活函数是神经网络的关键组件,作用于神经元输出。神经元汇总输入并计算净输入值,激活函数将其非线性变换,生成神经元最终输出,该输出作为后续神经元输入在网络中传播。

为什么需要激活函数

引入非线性

无激活函数,神经网络只是线性模型,其输出仅是输入线性组合,难以拟合现实世界的非线性问题,像图像和语音识别。激活函数赋予神经网络学习非线性特征能力,极大提升模型表达力。

增加模型复杂度

激活函数为神经网络带来更多参数和自由度,通过调节激活函数参数及神经元连接权重,模型能适配不同数据集和任务,增强泛化能力。

常见的激活函数

Sigmoid 函数

公式 f ( x ) = 1 1 + e − x f(x)=\frac{1}{1 + e^{-x}} f(x)=1+ex1

特点:输出值在 ( 0 , 1 ) (0,1) (0,1)间,曲线平滑,可将任意实数映射至该区间,常用于输出概率。但存在梯度消失问题,输入值过大或过小时,梯度接近 0,致训练时参数更新慢。

应用场景:常用于二分类问题输出层,如垃圾邮件判断。

ReLU 函数

公式 f ( x ) = max ⁡ ( 0 , x ) f(x)=\max(0,x) f(x)=max(0,x)

特点:计算简便、收敛快,有效缓解梯度消失。但训练中可能出现神经元死亡,部分神经元持续输出 0,对应参数无法更新。

应用场景:广泛用于各类神经网络隐藏层,如卷积神经网络。

Tanh 函数

公式 f ( x ) = e x − e − x e x + e − x f(x)=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}} f(x)=ex+exexex

特点:输出值在 ( − 1 , 1 ) (-1,1) (1,1)间,为奇函数,均值为 0,比 Sigmoid 更适用于隐藏层。同样有梯度消失问题。

应用场景:用于需限定输出范围的场景,如自然语言处理的循环神经网络。

激活函数的选择

考虑模型类型

前馈神经网络:优先尝试 ReLU,若遇神经元死亡,可试 Leaky ReLU 等改进版。输出层依任务选激活函数,回归用线性、二分类用 Sigmoid、多分类用 Softmax。

循环神经网络(RNN)及其变体(如 LSTM、GRU):隐藏层常用 Tanh,因其能处理序列长期依赖。输出层依任务选,分类用 Softmax 或 Sigmoid,回归用线性。

卷积神经网络(CNN):卷积与池化层后常用 ReLU 提取特征。特殊 CNN 结构如生成对抗网络(GAN)生成器,或用 Leaky ReLU 等防梯度消失或模式崩溃。

依据数据特点

数据分布:数据集中且范围小,ReLU 适用;数据范围大且含大量负数或大绝对值,Tanh 或 Sigmoid 合适,可将数据映射至特定区间。

数据的稀疏性:对于稀疏数据,ReLU 能有效激活少量非零元素,提升效率与稀疏性。密集数据则需实验确定最佳激活函数。

参考任务类型

分类任务:二分类输出层用 Sigmoid 映射概率;多分类用 Softmax 生成概率分布。

回归任务:输出层一般用线性激活函数,直接输出预测值。特定情况可依数据和模型需求选其他激活函数,但避免引入不必要非线性影响拟合。

结合训练效果

梯度消失与爆炸:训练遇梯度消失,试 ReLU、Leaky ReLU 等缓解;遇梯度爆炸,调整激活函数或用梯度裁剪技术。

收敛速度:不同激活函数影响收敛速度,ReLU 通常较快,Sigmoid 因梯度消失较慢。训练时观察收敛曲线,对比不同激活函数下收敛速度与损失值,选使模型快速收敛且性能优的激活函数。

考虑计算资源和时间成本

计算复杂度:Sigmoid 和 Tanh 含指数运算,计算复杂;ReLU 仅需简单比较与取最大值,速度快,适用于计算资源有限或实时性要求高的场景。

模型规模:大规模神经网络中,激活函数计算成本会累加,选简单激活函数可缩短训练和推理时间。模型小且资源充足,可考虑性能优但计算复杂的激活函数。

常见实例

图像识别中 ReLU 与 Softmax 的应用(基于 Keras 框架)

在图像识别任务里,以 MNIST 手写数字识别为例,构建一个简单的卷积神经网络:

from keras.models import Sequentialfrom keras.layers import Conv2D, MaxPooling2D, Flatten, Densefrom keras.datasets import mnistfrom keras.utils import to\_categorical\# 加载MNIST数据集(train\_images, train\_labels), (test\_images, test\_labels) = mnist.load\_data()\# 数据预处理train\_images = train\_images.reshape((-1, 28, 28, 1)).astype('float32') / 255.0test\_images = test\_images.reshape((-1, 28, 28, 1)).astype('float32') / 255.0train\_labels = to\_categorical(train\_labels)test\_labels = to\_categorical(test\_labels)model = Sequential()\# 卷积层与ReLU激活函数model.add(Conv2D(32, (3, 3), activation='relu', input\_shape=(28, 28, 1)))model.add(MaxPooling2D((2, 2)))model.add(Conv2D(64, (3, 3), activation='relu'))model.add(MaxPooling2D((2, 2)))\# 全连接层与Softmax激活函数用于多分类输出model.add(Flatten())model.add(Dense(64, activation='relu'))model.add(Dense(10, activation='softmax'))model.compile(optimizer='adam',              loss='categorical\_crossentropy',              metrics=\['accuracy'])model.fit(train\_images, train\_labels, epochs=5, batch\_size=64)test\_loss, test\_acc = model.evaluate(test\_images, test\_labels)print(f"Test accuracy: {test\_acc}")

在此代码中,卷积层使用 ReLU 作为激活函数,快速提取手写数字图像的边缘、角点等特征,输出层使用 Softmax 激活函数将结果转换为 10 个数字类别的概率分布,从而完成分类任务。

自然语言处理中 Tanh 在 RNN 的应用(基于 PyTorch 框架)

假设进行一个简单的文本情感分类任务,构建一个基本的 RNN 模型:

import torchimport torch.nn as nnfrom torchtext.legacy import datafrom torchtext.legacy import datasets\# 定义文本与标签的FieldTEXT = data.Field(tokenize='spacy', lower=True)LABEL = data.LabelField(dtype=torch.float)\# 加载IMDB数据集train\_data, test\_data = datasets.IMDB.splits(TEXT, LABEL)\# 构建词汇表TEXT.build\_vocab(train\_data, max\_size=25000)LABEL.build\_vocab(train\_data)\# 创建数据迭代器device = torch.device('cuda' if torch.cuda.is\_available() else 'cpu')train\_iterator, test\_iterator = data.BucketIterator.splits(    (train\_data, test\_data),    batch\_size=64,    device=device)class RNN(nn.Module):    def \_\_init\_\_(self, input\_dim, embedding\_dim, hidden\_dim, output\_dim):        super().\_\_init\_\_()        self.embedding = nn.Embedding(input\_dim, embedding\_dim)        self.rnn = nn.RNN(embedding\_dim, hidden\_dim, batch\_first=True)        self.fc = nn.Linear(hidden\_dim, output\_dim)        self.tanh = nn.Tanh()    def forward(self, x):        embedded = self.embedding(x)        output, hidden = self.rnn(embedded)        hidden = self.tanh(hidden.squeeze(0))        return self.fc(hidden)input\_dim = len(TEXT.vocab)embedding\_dim = 100hidden\_dim = 256output\_dim = 1model = RNN(input\_dim, embedding\_dim, hidden\_dim, output\_dim).to(device)criterion = nn.BCEWithLogitsLoss()optimizer = torch.optim.Adam(model.parameters())for epoch in range(5):    train\_loss = 0    train\_acc = 0    model.train()    for batch in train\_iterator:        optimizer.zero\_grad()        predictions = model(batch.text).squeeze(1)        loss = criterion(predictions, batch.label)        loss.backward()        optimizer.step()        train\_loss += loss.item()        train\_acc += ((torch.sigmoid(predictions) > 0.5).float() == batch.label).float().mean()    print(f'Epoch: {epoch + 1}, Train Loss: {train\_loss / len(train\_iterator)}, Train Acc: {train\_acc / len(train\_iterator)}')

在上述代码中,RNN 的隐藏层使用 Tanh 激活函数,对输入的文本数据进行处理,通过隐藏层状态的传递捕捉文本中的语义信息,以实现情感分类任务。

选择合适的激活函数需综合考量多方面因素,实际应用中常需实验对比确定最适配方案。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词