深度学习--激活函数
激活函数通过计算加权和并加上偏置来确定神经元是否应该倍激活,它们将输入信号转换为输出的可微运算。大多数激活函数都是非线性的,由于激活函数是深度学习的基础,下面简要介绍一些常见的激活函数。
1 RelU函数
最受欢迎的激活函数是修正线性单元,ReLU,因为它实现起来简单,同时在各种高预测任务中表现良好。ReLU提供了一种非常简单的非线性变化,给定元素x RelU函数倍定义为该元素与0中的最大值。
RelU(x) = max(x, 0);
通俗地说,RelU函数通过将相应的激活值设为0,仅仅保留正元素丢弃所有负元素。为了直观感受一下,我们可以绘制出函数的曲线图,正如从图中所看到的,激活函数是分段呈线性的。
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));
2 sigmoid激活函数
对于一个定义域在R上的输入,sigmoid函数将输入变换为区间(0,1) 上的输出。因此,sigmoid 通常称为挤压函数,将范围(-inf,inf)上的任意输入压缩到区间(0,1)上的某个值。
sigmoid(x) = 1/(1 + exp(-x))
sigmoid函数的导数是
d/dx sigmoid(x) = exp(-x) / (1 + exp(-x))^2 = sigmoid(x)(1 - sigmoid(x))
3 tanh函数
与sigmoid 函数类似,tanh(双曲正切)函数也能将其输入压缩转换到区间(-1,1)上,tanh函数如下
tanh(x) = 1 - exp(-2x) / 1 + exp(-2x)
下面我们绘制tanh函数的图像,注意,当输入在0附近时,tanh函数接近线性变换,函数的形状类似于sigmoid函数,不同的是tanh函数关于坐标系原点中心对称。
y = torch.tanh(x);
d2l.plot(x.detach(), t.detach(), 'x', 'tanh(x)', figsize = (5, 2.5));
tanh函数的导数是
d/dx tanh(x) = 1 - tanh^2(x)
tanh函数的导数的图像如下所示,当输入接近0时,tanh函数的导数接近最大值1,与我们在sigmoid函数的图像中看到的类似,输入在任一方向上越远离0点,导数越接近0.