Sigmoid 和 LogSigmoid 激活函数

激活函数主要用来向神经网络中加入非线性因素,以解决线性模型表达能力不足的问题,它对神经网络有着极其重要的作用。我们的网络参数在更新时,使用的反向传播算法(BP),这就要求我们的激活函数必须可微。sigmoid 激活函数在早期的神经网络中经常使用,目前已经逐渐被其他激活函数取代。

1. sigmoid 激活函数

sigmoid 函数公式:

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('Sigmoid 函数图像')

    # 导数图像
    x = torch.linspace(-20, 20, 1000, requires_grad=True)
    torch.sigmoid(x).sum().backward()

    axes[1].plot(x.detach(), x.grad)
    axes[1].grid()
    axes[1].set_title('Sigmoid 导数图像')

    plt.show()


if __name__ == '__main__':
    test()

函数图像如下:

从 sigmoid 函数图像可以得到,sigmoid 函数可以将任意的输入映射到 (0, 1) 之间,当输入的值大致在 <-6 或者 >6 时,意味着输入任何值得到的激活值都是差不多的,这样会丢失部分的信息。比如:输入 100 和输出 10000 经过 sigmoid 的激活值几乎都是等于 1 的,但是输入的数据之间相差 100 倍的信息就丢失了。

对于 sigmoid 函数而言,输入值在 [-6, 6] 之间输出值才会有明显差异,输入值在 [-3, 3] 之间才会有比较好的效果。

通过上述导数图像,我们发现导数数值范围是 (0, 0.25),当输入 <-6 或者 >6 时,sigmoid 激活函数图像的导数接近为 0,此时网络参数将更新极其缓慢,或者无法更新。

2. logsigmoid 激活函数

sigmoid 激活函数还有一个变种 LogSigmoid,其将输入的数值映射到 (-inf, 0),其公式如下:

import torch
import matplotlib.pyplot as plt
import torch.nn.functional as F


# 绘制图像
def draw(x, y):
    plt.plot(x, y)
    plt.grid()
    plt.show()


def test():

    # 函数图像
    x = torch.linspace(-20, 20, 1000)
    y = F.logsigmoid(x)
    draw(x, y)

if __name__ == '__main__':
    test()

函数图像如下:

未经允许不得转载:一亩三分地 » Sigmoid 和 LogSigmoid 激活函数
评论 (0)

7 + 8 =