人工智能一百问-2深度学习里说的**函数是什么意思?

很多刚刚接触深度学习的朋友,在看书籍、博文的时候,经常会看到一个名词:**函数。那**函数到底是干什么的呢?

实际上**函数并不是真正用来“**”什么的,而是用来对神经元计算出来的结果进行计算和处理的。目的是把特征保留下来,去除数据中的冗余,并且使得神经网络能够解决非线性问题。
简单来说,**函数就是把计算结果再进行一次处理,加入一些非线性因素,使得神经网络可以更好地解决比较复杂的问题。

常用的**函数有:

一、Sigmoid函数

Sigmoid函数函数是目前被了解最多的一种**函数,在生物学中也是常见的S型函数,又被称为S型生长曲线,它长这个样子:
人工智能一百问-2深度学习里说的**函数是什么意思?

公式定义是这样的:

f(x)=11+exf(x) = \frac{1}{1+e^-x}

它具有单调递增、反函数单调递增、连续可导、输出值都大于0等性质,所以我们可以把变量通过这个函数映射到[0,1]之间。

它的优点:

  • 1 )输出在(0,1)之间,单调连续,连续可导,可以用作输出层。
  • 2 )求导比较容易

它的缺点:

  • 1)比较容易产生梯度消失,导致训练出问题
  • 2)输出并不是以0位中心

二、Tanh函数

Tanh函数也是一种比较常见的**函数,它实际是Sigmoid的一种变型。它长这个样子:
人工智能一百问-2深度学习里说的**函数是什么意思?
它的公式是:
tanh(x)=1e2x1+e2x tanh(x) = \frac {1 - e^{-2x}} {1+e^{-2x}}

它的优点是:

  • 1)Tanh函数的输出均值是0,因此收敛速度比Sigmoid函数快
  • 2)迭代次数相对较少

它的缺点是:

  • 1)与Sigmoid相同,有可能产生梯度消失的

三、ReLU函数

ReLU(Rectified Linear Units)是目前比较常用的**函数,它与Sigmoid相比,收敛速度回更快,而且运算复杂度更低。它长这个样子:

人工智能一百问-2深度学习里说的**函数是什么意思?

它的公式为:

f(x)=max(0,x) f(x) = max(0,x)

因为在x>0的时候x可以保持梯度不衰减,从而可以缓解梯度消失的问题。

优点:

  • 1)相比Sigmoid函数和tanh函数,ReLU函数收敛速度更快
  • 2)ReLU的实现比较简单
  • 3)ReLU可以有效缓解梯度消失问题

缺点:

  • 1 )随着训练的进行,可能会出现神经元死亡、权重无法更新的情况
  • 2 )偏移现象和神经元死亡会影响收敛性

四、Softplus函数

Softplus函数可以看做ReLU函数的平滑形式。并且如果对Softplus函数进行求导,得到的函数就是Sigmoid函数。它长这个样子:
人工智能一百问-2深度学习里说的**函数是什么意思?
上图是Softplus和ReLU的对比
Softplus的表达式为:

Softplus(x)=log(1+ex) Softplus(x) = log(1+e^x)

Softplus优点:

  • 1)相比Sigmoid和tanh计算量相对小
  • 2)对于深层次网络,Softplus函数不会像Sigmoid函数那样很容易出现梯度消失的情况

缺点:
-1)反向传播时计算耗费较大

五、Softmax函数

Softmax函数是深度学习中常用的**函数之一,经常作为神经网络最后一层,用来进行多分类。它并不是一个简单的运算,所以木有图,但这里可以给出在运用的时候的例子:

人工智能一百问-2深度学习里说的**函数是什么意思?

人工智能一百问-2深度学习里说的**函数是什么意思?

前面计算的结果输入到Softmax层中,得到结果,结果是一组概率,概率之和为1,而概率最大的那个,就是我们倾向选择的结果

它的公式为:

f(xi)=exp(xi)x=1nexp(x)f(x_i) = \frac {exp(x_i)} {\sum_{x=1}^nexp(x)}

Softmax和前面的函数都不同,主要表现在:Softmax函数主要针对的是多分类问题,而其他的主要是二分类问题

六、Swish 函数

Google Brain也提出了一个形似ReLu的**函数, Swish。它长这个样子:
人工智能一百问-2深度学习里说的**函数是什么意思?

它的公式为:
f(x)=xσ(βx) f(x) = x {\sigma}({\beta}x)

它的优点是:

  • 1)处处连续可导
  • 2)计算起来不那么麻烦
  • 3)拥有和ReLU同样的有点同时一定程度上避免了死区问题。

因此在google的论文中,他们宣称Swish函数普遍优于ReLu(及其变体),并且更适用于深层的网络结构。

七、我们应该如何选用合适的**函数?

这里我们讨论的是隐藏层的**函数选用,输出层**函数的选择通常是基于其预测值类型

  • 首先要认识到,目前没有一个公认的“最优的”**函数,不同的**函数可能在不同类型的数据上做到较好的效果。
  • 其次,由于tanh和sigmoid函数这两个最早的**函数由于其缺陷现在已经不太使用了,因而我们通常都是用ReLu函数起手。
  • 如果ReLu的效果不好(特别是发现有很多神经元长期失活),然后不妨试试看它的各种变体(新潮点可以选择Swish函数)或是softplus。
  • 如果能够不计时间调参的话,可以简单在原来的**函数上自定义,通常是乘以一个常数的超参数来调节。