神经网络的激活函数(二)

简介: 本文介绍了神经网络中的激活函数,特别是tanh和ReLU。tanh函数将输入映射到(-1,1),以0为中心,加快了训练速度,但两侧导数为0可能导致梯度消失。ReLU函数在正区间的导数为1,解决了梯度消失问题,常用于隐藏层。softmax函数用于多分类,将输出转换为概率分布。文章还包含了代码示例,展示了这些函数的图形和导数。

神经网络的激活函数(一)+https://developer.aliyun.com/article/1544635?spm=a2c6h.13148508.setting.16.2a1e4f0eDtAPEV



tanh 激活函数



Tanh 的函数图像、导数图像 :


Tanh 函数将输入映射到 (-1, 1) 之间,图像以 0 为中心,在 0 点对称,当输入 大概<-3 或者 >3 时将被映射为 -1 或者 1。与 Sigmoid 相比,它是以 0 为中心的,使得其收敛速度要比 Sigmoid 快,减少迭代次数。然而,从图中可以看出,Tanh 两侧的导数也为 0,同样会造成梯度消失。



💡由于tanh函数的输出均值是0,这与许多样本数据的分布均值相近,因此在训练过程中,权重和偏差的更新可以更快地接近最优值。


💡tanh函数的导数在0到1之间变化,而Sigmoid函数的导数最大值仅为0.25,这意味着在反向传播过程中,tanh函数能够提供相对较大的梯度,从而减缓梯度消失的问题,有助于网络更快地收敛。


💡由于tanh函数的对称性和输出范围,它在正向传播时能够更好地处理正负输入值,这有助于在反向传播时进行更有效的权重更新,减少迭代次数。


import torch
import matplotlib.pyplot as plt
import torch.nn.functional as F
 
 
def test():
 
    _, axes = plt.subplots(1, 2)
 
    # 函数图像
    x = torch.linspace(-20, 20, 1000)
    y = F.tanh(x)
    axes[0].plot(x, y)
    axes[0].grid()
    axes[0].set_title('Tanh 函数图像')
 
    # 导数图像
    x = torch.linspace(-20, 20, 1000, requires_grad=True)
    F.tanh(x).sum().backward()
 
    axes[1].plot(x.detach(), x.grad)
    axes[1].grid()
    axes[1].set_title('Tanh 导数图像')
 
    plt.show()


🔎F.tanh(x)计算了输入张量x的tanh值,然后.sum()将这些tanh值相加得到一个标量值。接下来,.backward()方法会计算这个标量值关于输入张量x的梯度,即tanh函数的导数。这样,我们就可以得到tanh函数在每个输入点上的导数值,从而绘制出tanh导数图像。


backward方法


  • 通用性:backward()方法不限于计算损失函数的梯度,它可以用于任何需要进行梯度计算的张量。例如,如果你在进行一些非神经网络的任务,比如简单的数学运算,你也可以使用backward()来计算梯度。
  • 要使用backward()计算梯度,必须满足几个条件。首先,需要计算梯度的张量必须是叶子节点,即它们不是任何其他张量的计算结果。其次,这些张量必须设置requires_grad=True以表明需要跟踪它们的梯度。最后,所有依赖于这些叶子节点的张量也必须设置requires_grad=True,以确保梯度可以传播到整个计算图中。


relu 激活函数


ReLU激活函数的公式是 ReLU(x)=max(0, x)。


ReLU激活函数(Rectified Linear Unit)在神经网络中用于引入非线性特性,其特点是计算简单且能够加速训练过程。对于正值,它直接输出输入值(即 𝑓(𝑥)=𝑥f(x)=x),对于负值,输出为零(即 𝑓(𝑥)=0f(x)=0)。这种简单的阈值操作避免了复杂的指数或乘法运算,从而显著减少了计算量。


由于ReLU在正值区间内具有不变的梯度(即梯度为1),它有助于维持信号的传播,使得基于梯度的优化算法(如SGD、Adam等)能够更有效地更新网络权重。


函数图像如下:  



ReLU 能够在x>0时保持梯度不衰减,从而缓解梯度消失问题。随着训练的推进,部分输入会落入小于0区域,导致对应权重无法更新。


与sigmoid相比,RELU的优势是:


采用sigmoid函数,计算量大(指数运算),反向传播求误差梯度时,求导涉及除法,计算量相对大,而采用Relu激活函数,整个过程的计算量节省很多。 sigmoid函数反向传播时,很容易就会出现梯度消失的情况,从而无法完成深层网络的训练。 Relu会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生。


在神经网络的前向传播过程中,每个隐藏层的神经元都会对其输入执行线性变换(通过权重和偏差),然后应用激活函数。例如,一个神经元的输出y可以通过以下方式计算 y=ReLU(W^Tx+b),其中W是权重矩阵,x是输入向量,b是偏置项。


在前向传播后,如果输出与实际值存在差距,则使用反向传播算法根据误差来更新网络中的权重和偏差。这个过程中,ReLU函数的梯度(导数)也会被计算出来,用于调整连接权重。


softmax 激活函数



这里,( K ) 是类别的总数,( e ) 是自然对数的底数(约等于2.71828)。


softmax用于多分类过程中,它是二分类函数sigmoid在多分类上的推广,目的是将多分类的结果以概率的形式展现出来。 SoftMax 函数将每个输入元素 ( z_i ) 映射到 (0,1) 区间内,并且所有输出值的总和为1,这使它成为一个有效的概率分布。


Softmax 直白来说就是将网络输出的 logits 通过 softmax 函数,就映射成为(0,1)的值,而这些值的累和为1(满足概率的性质),那么我们将它理解成概率,选取概率最大(也就是值对应最大的)节点,作为我们的预测目标类别。  



import torch
scores = torch.tensor([0.2, 0.02, 0.15, 0.15, 1.3, 0.5, 0.06, 1.1, 0.05, 3.75])
probabilities = torch.softmax(scores, dim=0)
print(probabilities)
 
# 结果:tensor([0.0212, 0.0177, 0.0202, 0.0202, 0.0638, 0.0287, 0.0185, 0.0522, 0.0183,
        0.7392])



🍳对于隐藏层:


  1. 优先选择RELU激活函数


  1. 如果ReLu效果不好,那么尝试其他激活,如Leaky ReLu等。


  1. 如果你使用了Relu, 需要注意一下Dead Relu问题, 避免出现大的梯度从而导致过多的神经元死亡。


  1. 不要使用sigmoid激活函数,可以尝试使用tanh激活函数



🍳对于输出层:


  1. 二分类问题选择sigmoid激活函数


  1. 多分类问题选择softmax激活函数


  1. 回归问题选择identity激活函数


相关文章
|
7天前
|
机器学习/深度学习
神经网络可能不再需要激活函数?Layer Normalization也具有非线性表达!
【7月更文挑战第14天】研究表明,层归一化(LayerNorm)可能具备非线性表达能力,挑战了神经网络对激活函数的依赖。在LN-Net结构中,仅使用线性层与LayerNorm就能实现复杂分类,其VC维度下界证明了非线性表达。尽管如此,是否能完全替代激活函数及如何有效利用这一特性仍需更多研究。[arXiv:2406.01255]
17 5
|
15天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于负相关误差函数的4集成BP神经网络matlab建模与仿真
**算法预览:** 图像显示无水印的2022a版MATLAB运行结果 **软件版本:** MATLAB 2022a **核心代码片段:** 省略展示 **理论概述:** NCL集成BP网络利用负相关提升泛化,结合多个弱模型减少错误关联。通过λ参数控制模型间负相关程度,λ&gt;0增强集成效果,提高预测准确性和系统稳健性。
|
25天前
|
机器学习/深度学习
激活函数:神经网络的生命之花
激活函数:神经网络的生命之花
激活函数:神经网络的生命之花
|
1月前
|
机器学习/深度学习 人工智能 Serverless
【深度学习】神经网络中的激活函数:释放非线性的力量
【深度学习】神经网络中的激活函数:释放非线性的力量
46 1
|
1月前
|
机器学习/深度学习 算法
神经网络的激活函数(一)
人工神经网络( Artificial Neural Network, 简写为ANN)也简称为神经网络(NN),是一种模仿生物神经网络结构和功能的 计算模型。人脑可以看做是一个生物神经网络,由众多的神经元连接而成。各个神经元传递复杂的电信号,树突接收到输入信号,然后对信号进行处理,通过轴突输出信号。
|
2月前
|
机器学习/深度学习 人工智能 算法
神经网络中的神经元和激活函数介绍
神经网络中的神经元和激活函数介绍
34 0
|
1月前
|
网络协议 算法 Linux
【嵌入式软件工程师面经】Linux网络编程Socket
【嵌入式软件工程师面经】Linux网络编程Socket
58 1
|
5天前
|
Shell Linux C语言
|
3天前
|
网络协议 Ubuntu Linux
|
10天前
|
Linux
linux网络统计信息和端口占用情况基本语法
linux网络统计信息和端口占用情况基本语法

热门文章

最新文章