Day07

常见的激活函数-tanh激活函数

Tanh的公式:x越大,整体越接近于1x越小,整体越接近-1

激活函数求导公式:

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

1、Tanh函数将输入映射到(-1,-1)之间,图像以0为中心,在0点对称,当输入大概<-3或者>3时将被映射为-1或者1其导数值范围(0,1),当输入的值大概<-3或者>3时,其导数值近似0

2、与Sigmoid相比,它是以0为中心的,且梯度相对于sigmoid大,使得其收敛速度要比sigmoid块,减少迭代次数。然而,从图中可以看出,Tanh两侧的倒数也为0,同样会造成梯度消失

3、若使用时可在隐藏层使用tanh函数,在输出层使用sigmoid函数

"""

案例:

    绘制Tanh函数图像和导数图像



Sigmoid激活函数介绍:

    激活函数的目的:

        给模型增加非线性功能,让模型(神经元)既可以分类,还可以做回归问题,

    激活函数的分类:

        Sigmoid

        ReLU

        Tanh

        SoftMax



    Sigmoid激活函数:

        主要应用于 二分类输出层,且适用于 浅层神经网络(不超过5层)

        数据在【-6,6】之间有效果,在【-3,3】之间效果明显

        求导后范围在【0,0.25】

    Tanh激活函数:

        主要应用于隐藏层,且适用于 适用于 浅层神经网络(不超过5层)

        数据在【-3,3】之间有效果,在【-1,1】之间效果明显,会将结果映射到【-1,1】

        求导后范围在【0,1】,较之于Sigmoid收敛速度快



细节:

    绘制激活函数图像时出现以下提示,需要将 anaconda3/Lib/site-packages/torch/Lib/目录下的libiomp5md.dll文件删除

OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized.

"""

import plt

import torch



plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签

plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号



#1、创建画布和坐标轴

fig,axes=plt.subplots(1,2)



#2、生产数据点

x=torch.linspace(-20,20,1000)



#3、计算上述点,tanh函数处理后的值

y=torch.tanh(x)



#4、在第一个子图中绘制tanh函数图像

axes[0].plot(x,y)

axes[0].set_title('tanh激活函数图像')

axes[0].grid()



#5、在第二个图上,绘制tanh激活函数的导数图像

#5.1 重新生成1000个点

#参1:起始值 参2:结束值 参3:生成个数 参4:是否需要梯度

x=torch.linspace(-20,20,1000,requires_grad=True)



#5.2具体的计算上述1000点。tanh函数导数后的值

torch.tanh(x).sum().backward()



#5.3绘图

axes[1].plot(x.detach(),x.grad)

axes[1].set_title('tanh激活函数导数图像')

axes[1].grid()

plt.show()

常见的激活函数ReLU激活函数

ReLU公式如下:

激活函数的求导公式:

函数图像:

1、ReLU激活函数将小于0的值映射为0,而大于0的值则保持不变,它更加重视正信号,而忽略负信号,这种激活函数运算更为简单,能够提高模型的训练效率

2、当x<0时,ReLU导数为0,而当x>0时,则不存在饱和问题,所以,ReLU能够在x>0保持梯度不衰减,从而缓解梯度消失问题。然而,随着训练的推进,部分输入会落入小于0区域,导致对应权重无法更新。这种现象被称为“神经元死亡”

3、ReLU是目前是最常用的激活函数,与Sigmoid相比优势是:

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

"""

案例:

    绘制ReLU函数图像和导数图像



Sigmoid激活函数介绍:

    激活函数的目的:

        给模型增加非线性功能,让模型(神经元)既可以分类,还可以做回归问题,

    激活函数的分类:

        Sigmoid

        ReLU

        Tanh

        SoftMax



    Sigmoid激活函数:

        主要应用于 二分类输出层,且适用于 浅层神经网络(不超过5层)

        数据在【-6,6】之间有效果,在【-3,3】之间效果明显

        求导后范围在【0,0.25】

    Tanh激活函数:

        主要应用于隐藏层,且适用于 适用于 浅层神经网络(不超过5层)

        数据在【-3,3】之间有效果,在【-1,1】之间效果明显,会将结果映射到【-1,1】

        求导后范围在【0,1】,较之于Sigmoid收敛速度快

    ReLU激活函数

        计算公式:max(0,x),计算量相对较小,训练成本低,多应用于隐藏层,且适合 深层 神经网络,

        求导前,值要么是0,要么是1,较之于Tanh,收敛速度更快

        默认情况下ReLU只考虑 正样本,可以使用LeakyReLU,PReLU来考虑正负样本



细节:

    绘制激活函数图像时出现以下提示,需要将 anaconda3/Lib/site-packages/torch/Lib/目录下的libiomp5md.dll文件删除

OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized.

"""

import plt

import torch



plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签

plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号



#1、创建画布和坐标轴

fig,axes=plt.subplots(1,2)



#2、生产数据点

x=torch.linspace(-20,20,1000)



#3、计算上述点,relu函数处理后的值

y=torch.relu(x)



#4、在第一个子图中绘制relu函数图像

axes[0].plot(x,y)

axes[0].set_title('relu激活函数图像')

axes[0].grid()



#5、在第二个图上,绘制relu激活函数的导数图像

#5.1 重新生成1000个点

#参1:起始值 参2:结束值 参3:生成个数 参4:是否需要梯度

x=torch.linspace(-20,20,1000,requires_grad=True)



#5.2具体的计算上述1000点。relu函数导数后的值

torch.relu(x).sum().backward()



#5.3绘图

axes[1].plot(x.detach(),x.grad)

axes[1].set_title('relu激活函数导数图像')

axes[1].grid()

plt.show()

常见的激活函数SoftMax激活函数

softmax用于多分类过程中,它是二分类函数sigmoid在多分类上的推广,目的是将多分类结果以概率的形式展现出来,计算方式:

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

"""

案例:

    绘制ReLU函数图像和导数图像



Sigmoid激活函数介绍:

    激活函数的目的:

        给模型增加非线性功能,让模型(神经元)既可以分类,还可以做回归问题,

    激活函数的分类:

        Sigmoid

        ReLU

        Tanh

        SoftMax



    Sigmoid激活函数:

        主要应用于 二分类输出层,且适用于 浅层神经网络(不超过5层)

        数据在【-6,6】之间有效果,在【-3,3】之间效果明显

        求导后范围在【0,0.25】

    Tanh激活函数:

        主要应用于隐藏层,且适用于 适用于 浅层神经网络(不超过5层)

        数据在【-3,3】之间有效果,在【-1,1】之间效果明显,会将结果映射到【-1,1】

        求导后范围在【0,1】,较之于Sigmoid收敛速度快

    ReLU激活函数

        计算公式:max(0,x),计算量相对较小,训练成本低,多应用于隐藏层,且适合 深层 神经网络,

        求导前,值要么是0,要么是1,较之于Tanh,收敛速度更快

        默认情况下ReLU只考虑 正样本,可以使用LeakyReLU,PReLU来考虑正负样本

    softmax激活函数:

        将多分类的结果以概率的形式展示,且概率和相加为1,最终选取概率值最大的分类作为结果



细节:

    绘制激活函数图像时出现以下提示,需要将 anaconda3/Lib/site-packages/torch/Lib/目录下的libiomp5md.dll文件删除

OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized.

"""

import plt

import torch



plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签

plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号



# 1. 定义张量,记录:分类数据。

scores = torch.tensor([0.2, 0.02, 0.15, 0.15, 1.3, 0.5, 0.06, 1.1, 0.05, 3.75])

# 2. dim = 0,按行计算

probabilities = torch.softmax(scores, dim=0)

print(probabilities)

激活函数的选择方法

对于隐藏层:

1、优先选择ReLU激活函数

2、如果ReLU效果不好,那么尝试其他激活,如LeakyReLU等

3、如果使用了ReLU,需要注意一下Dead ReLU问题,避免出现0梯度从而导致过多的神经元死亡

4、少用使用sigmoid激活函数,可以尝试使用tanh激活函数

对于输出层

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

2、多分类问题选择softmax激活函数

3、回归问题选择identity激活函数

Logo

脑启社区是一个专注类脑智能领域的开发者社区。欢迎加入社区,共建类脑智能生态。社区为开发者提供了丰富的开源类脑工具软件、类脑算法模型及数据集、类脑知识库、类脑技术培训课程以及类脑应用案例等资源。

更多推荐