C/C++教程

【2024年】第1天 神经网络中的激活函数(pytorch)

本文主要是介绍【2024年】第1天 神经网络中的激活函数(pytorch),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
  • 激活函数可以理解为一个特殊的网络层。
  • 主要作用:是通过加入非线性因素,弥补线性模型表达能力不足的缺陷。
  • 神经网络的数学基础是处处可微分的函数,所以选择的激活函数要能保证数据输入与输出也是可微分的。

1. Sigmoid函数

  • Sigmoid是常用的非线性激活函数,他的数学形式为f(x) = 1/ (1+e-x) ,它的x值可以是负无穷到正无穷之间的值,但是对应的f(x)的值却只有0到1之间的值,因此,输出的值都会落在0和1之间。
  • 也就是说,它能够把输入的连续实数值“压缩”到0和1之间。
  • LogSigmoid即对Sigmoid函数的输出值再取对数,它的数学形式为:LogSigmoid(x) = log(Sigmoid(x))
  • 该激活函数常用来与NLLLoss损失函数一起使用,用在神经网络反向传播过程中的计算交叉熵环节。
  • torch.nn.Sigmoid():激活函数Sigmoid的实现。
  • torch.nn.LogSigmoid():激活函数LogSigmoid的具体实现。
import torch
import torch.nn as nn

# 定义两个随机数
input = torch.autograd.Variable(torch.randn(2))
print(input)

result1 = nn.Sigmoid()(input)
print(result1)

result2 = nn.LogSigmoid()(input)
print(result2)
  • 我们可以看到通过Sigmoid激活函数的张量一直都处在0-1之间。
  • 通过LogSigmoid激活函数的张量是小于0的。

2. tanh函数

  • tanh可以是Sigmoid的值域的升级版,将函数输出值的取值范围由Sigmoid的0-1,升级到-1到1。
  • 但是tanh不能完全代替Sigmoid,在某些输出下需要大于0的情况,我们就需要使用Sigmoid。
  • tanh也是常用的非线性的激活函数,他的数学形式为:tanh(x) = 2Sigmoid(2x) -1
  • 它的x取值范围也是负无穷到正无穷,对应的y变为从1到-1,相对于Sigmoid函数有更广的值域。
  • tanh与Sigmoid有一样的缺陷,也存在饱和问题,因为在使用tanh时,也要注意,输入值的绝对值不能过大,不然模型无法训练。
import torch
import torch.nn as nn

# 定义两个随机数
input = torch.autograd.Variable(torch.randn(2))
print(input)

result0 = nn.Tanh()(input)
print(result0,'\n')
  • 我们可以看到经过tanh激活函数的张量值处于-1到1之间。

3. ReLU函数

  • ReLU函数的数学形式为f(x) = max(0, x)
  • 如果x>0,那么函数的返回值为x本身,否则函数的返回值为0。
  • 它是重视正向信号,忽略负向信号的特征。
  • 因此在神经网络中,使用ReLU可以取得很好的拟合效果。
  • 由于其运算简单,因此大大提升了机器的运行效率,这也是一个很大的优点。
  • torch.nn.ReLU(input, inplace=False)是一般的ReLU函数,即max(input, 0)。
  • 如果参数inplace为True则会改变输入的数据,否则不会改变原有的输入,只会产生新的输出。

4. Softplus函数

  • Softplus函数是根据ReLU函数演变而来,函数曲线会更加平滑,但是计算量会更大,而且对于小于0的值会保留的更多一些。
  • Softplus函数的数学形式为f(x) = (1/β) In(1+eβx)
  • 使用方法:
result3 = nn.Softplus(beta=1, threshold=20)
print(result3)
  • 其中beta为数学表达式中的β。
  • 参数threshold为激活函数输出的最大阈值。

5. ReLU6函数

  • 将ReLU函数的最大值控制在6,该激活函数可以有效的防止在训练过程中的梯度爆炸现象。
  • 数学形式为:f(x)=min(max(0,x), 6)

6. LeakyReLU函数

  • 在ReLU基础上保留了一部分负值,在x为负的时候将其乘以0.01,即LeakyReLU对负信号不是一味地拒绝,而是将其缩小。
  • 数学形式为:
    f(x)={x(0≤x)0.01x(0>x)f(x) = \begin{cases} x & (0 \leq x) \\ 0.01x & (0>x) \end{cases}f(x)={x0.01x(0x)(0>x)
  • 再进一步将这个0.01换为可调参数,于是有当x<0时,将其乘以negativeslope,且negativeslope小于或等于1。
  • 数学形式为:
    f(x)={X(0≤X)negativeslope×X(0>X)f(x) = \begin{cases} X & (0 \leq X) \\ negativeslope×X & (0>X) \end{cases}f(x)={Xnegativeslope×X(0X)(0>X)
  • 上述分段函数就等价于f(x) = max(x, negativeslopeslope × X)
  • 所以我们最后得到LeakyReLU的公式max(x,negativeslope × X)

7. PReLU函数

  • 与LeakyReLU的公式类似,唯一不同的地方是,PReLU中的参数是通过自学习得来的。
  • 数学公式为:f(x) = max(x, ax)
  • 其中a是一个自学习得到的参数。

8.ELU函数

  • 当x<0时,进行了更复杂的变化:

f(x)={X(0≤X)a(ex−1)(0>X)f(x) = \begin{cases} X & (0 \leq X) \\ a(e^x -1) & (0>X) \end{cases}f(x)={Xa(ex1)(0X)(0>X)

  • ELU激活函数与ReLU一样,都是不带参数的,但是ELU的收敛速度比ReLU更快。
  • 在使用ELU时,不使用批处理能够比使用批处理获得更好的效果。
  • ELU不使用批处理的效果比ReLU加批处理的效果更好。
这篇关于【2024年】第1天 神经网络中的激活函数(pytorch)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!