一些常用的激活函数

一:ReLU函数

公式:

通俗地说,ReLU函数通过将相应的活性值设为0,仅保留正元素并丢弃所有负元素

例如:对于从-8到+8,间隔为0.1

x = torch.arange(-8.0, 8.0, 0.1, requires_grad=True)
y = torch.relu(x)
d2l.plot(x.detach(), y.detach(), 'x', 'relu(x)', figsize=(5, 2.5))

用图直观表示的话:

一些常用的激活函数_第1张图片

可以从图中清楚的看出,小于0的部分取为0,大于0的部分保留原值

导数图:

y.backward(torch.ones_like(x), retain_graph=True)
d2l.plot(x.detach(), x.grad, 'x', 'grad of relu', figsize=(5, 2.5))

一些常用的激活函数_第2张图片

使用ReLU的原因是,它求导表现得特别好:要么让参数消失,要么让参数通过。 这使得优化表现得更好,并且ReLU减轻了困扰以往神经网络的梯度消失问题 。

 二:sigmoid函数

对于一个定义域在R中的输入,sigmoid函数将输入变换为区间(0, 1)上的输出

 当人们逐渐关注到到基于梯度的学习时, sigmoid函数是一个自然的选择,因为它是一个平滑的、可微的阈值单元近似。 当我们想要将输出视作二元分类问题的概率时, sigmoid仍然被广泛用作输出单元上的激活函数 (你可以将sigmoid视为softmax的特例)。 然而,sigmoid在隐藏层中已经较少使用, 它在大部分时候被更简单、更容易训练的ReLU所取代。 在后面关于循环神经网络的章节中,我们将描述利用sigmoid单元来控制时序信息流的架构。

上诉这段话的简述:sigmoid在二分类中较好用,但是在隐藏层中的表现没有其他的好,后面我们大多将sigmoid使用于时序信息流架构中,因为时序信息非0则1.

sigmoid函数图像:

y = torch.sigmoid(x)
d2l.plot(x.detach(), y.detach(), 'x', 'sigmoid(x)', figsize=(5, 2.5))

一些常用的激活函数_第3张图片

sigmoid函数导数图像:

x.grad.data.zero_()
y.backward(torch.ones_like(x),retain_graph=True)
d2l.plot(x.detach(), x.grad, 'x', 'grad of sigmoid', figsize=(5, 2.5))

一些常用的激活函数_第4张图片

 三:Tanh函数

与sigmoid函数类似, tanh(双曲正切)函数也能将其输入压缩转换到区间(-1, 1)上。 tanh函数的公式如下:

 当输入在0附近时,tanh函数接近线性变换。 函数的形状类似于sigmoid函数, 不同的是tanh函数关于坐标系原点中心对称。

tanh函数图像:

y = torch.tanh(x)
d2l.plot(x.detach(), y.detach(), 'x', 'tanh(x)', figsize=(5, 2.5))

一些常用的激活函数_第5张图片

 tanh函数导数的图像:

一些常用的激活函数_第6张图片

tanh函数的导数图像如下所示。 当输入接近0时,tanh函数的导数接近最大值1。 与我们在sigmoid函数图像中看到的类似, 输入在任一方向上越远离0点,导数越接近0。

# 清除以前的梯度
x.grad.data.zero_()
y.backward(torch.ones_like(x),retain_graph=True)
d2l.plot(x.detach(), x.grad, 'x', 'grad of tanh', figsize=(5, 2.5))

一些常用的激活函数_第7张图片

 图片来源:4.1. 多层感知机 — 动手学深度学习 2.0.0-beta0 documentation (d2l.ai)

你可能感兴趣的:(机器学习)