学习笔记415—激活函数(tanh、ReLU、softmax)
激活函数在神经网络中的作用有很多,主要作用是给神经网络提供非线性建模能力。如果没有激活函数,那么再多层的神经网络也只能处理线性可分问题。常用的激活函数有
sigmoid
、
tanh
、
relu
、
softmax
等。
1.1、sigmoid函数
sigmoid函数将输入变换为(0,1)上的输出。它将范围(-inf,inf)中的任意输入压缩到区间(0,1)中的某个值:
sigmoid函数是⼀个⾃然的选择,因为它是⼀个平滑的、可微的阈值单元近似。当我们想要将输出视作⼆元分类问题的概率时, sigmoid仍然被⼴泛⽤作输出单元上的激活函数(你可以将sigmoid视为softmax的特例)。然而, sigmoid在隐藏层中已经较少使⽤,它在⼤部分时候被更简单、更容易训练的ReLU所取代。下面为sigmoid函数的图像表示,当输入接近0时,sigmoid更接近线形变换。
import torch from d2l import torch as d2l %matplotlib inline x=torch.arange(-8.0,8.0,0.1,requires_grad=True) sigmoid=torch.nn.Sigmoid() y=sigmoid(x) d2l.plot(x.detach(),y.detach(),'x','sigmoid(x)',figsize=(5,2.5))
sigmoid函数的导数为下面的公示:
sigmoid函数的导数图像如下所示。当输入值为0时,sigmoid函数的导数达到最大值0.25;而输入在任一方向上越远离0点时,导数越接近0。
1 2 3 4 | #清除以前的梯度 #retain_graph如果设置为False,计算图中的中间变量在计算完后就会被释放。 y.backward(torch.ones_like(x),retain_graph = True ) d2l.plot(x.detach(),x.grad, 'x' , 'grad of sigmoid' ) |
1.2、tanh函数
与sigmoid函数类似,tanh函数也能将其输入压缩转换到区间(-1,1)上,tanh函数的公式如下:
tanh函数的图像如下所示,当输入在0附近时,tanh函数接近线形变换。函数的形状类似于sigmoid函数,不同的是tanh函数关于坐标系原点中心对称。
1 2 3 4 5 6 7 8 9 | import torch from d2l import torch as d2l % matplotlib inline x = torch.arange( - 8.0 , 8.0 , 0.1 ,requires_grad = True ) tanh = torch.nn.Tanh() y = tanh(x) d2l.plot(x.detach(),y.detach(), 'x' , 'tanh(x)' ,figsize = ( 5 , 2.5 )) |
tanh函数的导数是:
tanh函数的导数如下,当输入接近0时,tanh函数的导数接近最大值1。与sigmoid函数图像中看到的类似,输入在任一方向上远离0点,导数越接近0。
1 2 | y.backward(torch.ones_like(x),retain_graph = True ) d2l.plot(x.detach(),x.grad, 'x' , 'grad of tanh' ,figsize = ( 5 , 2.5 )) |
1.3、ReLU函数
线性整流单元(ReLU),ReLU提供了一种非常简单的非线性变换。给定元素 x x x,ReLU函数被定义为该元素与0的最大值。
1 2 3 4 5 6 7 8 9 | import torch from d2l import torch as d2l % matplotlib inline x = torch.arange( - 8.0 , 8.0 , 0.1 ,requires_grad = True ) relu = torch.nn.ReLU() y = relu(x) d2l.plot(x.detach(),y.detach(), 'x' , 'relu' ,figsize = ( 5 , 2.5 )) |
当输入为负时,reLU函数的导数为0,而当输入为正时,ReLU函数的导数为1。当输入值等于0时,ReLU函数不可导。如下为ReLU函数的导数:
1 2 3 | #retain_graph如果设置为False,计算图中的中间变量在计算完后就会被释放。 y.backward(torch.ones_like(x),retain_graph = True ) d2l.plot(x.detach(),x.grad, 'x' , 'grad of relu' ,figsize = ( 5 , 2.5 )) |
ReLU函数的求导表现的很好:要么让参数消失,要么让参数通过。ReLU减轻了神经网络的梯度消失问题。ReLU函数有很多变体,如LeakyReLU,pReLU等。
1.4、softmax函数
在二分类任务时,经常使用sigmoid激活函数。而在处理多分类问题的时候,需要使用softmax函数。它的输出有两条规则。
每一项的区间范围的(0,1)
所有项相加的和为1.
假设有一个数组V, V i V_i Vi代表V中的第i个元素,那么这个元素的softmax值的计算公式为:
下图为更为详细的计算过程:
如上图所示,输入的数组为[3,1,-3]。那么每项的计算过程为:
当输入为3时,计算公式为:
当输入为1时,计算公式为:
当输入为-3时,计算公式为:
1 2 3 4 | x = torch.Tensor([ 3. , 1. , - 3. ]) softmax = torch.nn.Softmax(dim = 0 ) y = softmax(x) print (y) |
那么在搭建神经网络的时候,应该如何选择激活函数?
1、如果搭建的神经网络的层数不多的时候,选择sigmoid、tanh、relu都可以,如果搭建的网络层数较多的时候,选择不当不当会造成梯度消失的问题,此时一般不宜选择sigmoid、tanh激活函数,最好选择relu激活函数。
2、 在二分类问题中,网络的最后一层适合使用sigmoid激活函数;而多分类任务中,网络的最后一层使用softmax激活函数。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)