如何为深度学习选择激活函数

      【翻译自 : How to Choose an Activation Function for Deep Learning

      【说明:Jason Brownlee PhD大神的文章个人很喜欢,所以闲暇时间里会做一点翻译和学习实践的工作,这里是相应工作的实践记录,希望能帮到有需要的人!】

       隐藏层中激活功能的选择将控制网络模型学习训练数据集的程度。 输出层中激活函数的选择将定义模型可以做出的预测类型。因此,必须为每个深度学习神经网络项目仔细选择激活函数。

       在本教程中,您将发现如何为神经网络模型选择激活函数。完成本教程后,您将知道:

激活函数是神经网络设计的关键部分。
用于隐藏层的现代默认激活功能是ReLU功能。
输出层的激活功能取决于预测问题的类型。

教程概述

        本教程分为三个部分:他们是:

激活函数
激活隐藏层
激活输出层

激活函数

      神经网络中的激活函数定义了输入的加权和如何转换为来自网络层中一个或多个节点的输出。

      有时,激活功能称为“转移功能”。如果激活功能的输出范围受到限制,则可以将其称为“挤压功能”。许多激活函数是非线性的,在层或网络设计中可能被称为“非线性”。

       激活函数的选择对神经网络的功能和性能有很大的影响,并且可以在模型的不同部分中使用不同的激活函数。从技术上讲,激活功能是在网络中每个节点的内部处理之内或之后使用的,尽管网络被设计为对层中的所有节点使用相同的激活功能。网络可能具有三种类型的层:输入层从域中获取原始输入;隐藏层从其他层获取输入,然后将输出传递到另一层;输出层进行预测。所有隐藏层通常使用相同的激活功能。输出层通常将使用与隐藏层不同的激活函数,并且取决于模型所需的预测类型。

       激活函数通常也是可微的,这意味着可以为给定的输入值计算一阶导数。鉴于神经网络通常使用误差算法的反向传播进行训练,而误差算法需要预测误差的导数才能更新模型的权重,因此这是必需的。在神经网络中有许多不同类型的激活函数,尽管实际上只有很少一部分函数用于隐藏层和输出层。让我们依次看一下每种图层使用的激活功能。

激活隐藏层

      神经网络中的隐藏层是从另一层(例如另一个隐藏层或一个输入层)接收输入并提供输出到另一个层(例如另一个隐藏层或一个输出层)的层。至少通常,隐藏层不会直接联系输入数据或不会产生模型的输出。

神经网络可能具有零个或多个隐藏层。通常,在神经网络的隐藏层中使用可微的非线性激活函数。 与使用线性激活函数训练的网络相比,这允许模型学习更复杂的函数。

      您可能需要考虑在隐藏层中使用三种激活功能; 他们是:

Rectified Linear Activation (ReLU)
Logistic (Sigmoid)
Hyperbolic Tangent (Tanh)

       这不是用于隐藏层的激活功能的详尽列表,但是它们是最常用的。让我们依次仔细研究一下。

ReLU隐藏层激活函数

      整流线性激活函数或ReLU激活函数可能是用于隐藏层的最常见函数。这是很常见的,因为它既易于实现,又可以克服其他先前流行的激活功能(如Sigmoid和Tanh)的局限性。 特别是,它不易受到梯度消失的影响,无法训练深度模型,尽管它可能会遇到其他问题,例如饱和或“死”单元。

      ReLU函数的计算如下:

                                                                                                                                                          max(0.0,x)
     这意味着如果输入值(x)为负,则返回值0.0,否则返回该值。您可以在本教程中了解有关ReLU激活功能的详细信息:

                                                                                                                                      整流线性单元(ReLU)的简要介绍
      通过下面的工作示例,我们可以直观了解此函数的形状。

# example plot for the relu activation function
from matplotlib import pyplot

# rectified linear function
def rectified(x):
	return max(0.0, x)

# define input data
inputs = [x for x in range(-10, 10)]
# calculate outputs
outputs = [rectified(x) for x in inputs]
# plot inputs vs outputs
pyplot.plot(inputs, outputs)
pyplot.show()

         运行示例将计算一系列值的输出,并创建输入与输出的关系图。 我们可以看到ReLU激活函数熟悉的扭结形状。

Sigmoid隐层激活函数

      Sigmoid激活函数也称为逻辑函数。它与逻辑回归分类算法中使用的功能相同。该函数将任何实数值作为输入,并输出0到1范围内的值。输入越大(正数越多),输出值就越接近1.0;而输入越小(负数越多),则输出值越近。 输出将为0.0。

      Sigmoid激活函数的计算如下:

                                                                                                                                                        1.0 /(1.0 + e ^ -x)
       其中e是一个数学常数,它是自然对数的底数。通过下面的工作示例,我们可以直观了解此函数的形状。

# example plot for the sigmoid activation function
from math import exp
from matplotlib import pyplot

# sigmoid activation function
def sigmoid(x):
	return 1.0 / (1.0 + exp(-x))

# define input data
inputs = [x for x in range(-10, 10)]
# calculate outputs
outputs = [sigmoid(x) for x in inputs]
# plot inputs vs outputs
pyplot.plot(inputs, outputs)
pyplot.show()

        运行示例将计算一系列值的输出,并创建输入与输出的关系图。 我们可以看到S型激活函数熟悉的S形。

Tanh隐藏层激活函数

       双曲正切激活函数也简称为Tanh(也称为“ tanh”和“ TanH”)函数。它与S型激活功能非常相似,甚至具有相同的S形。该函数将任何实数值作为输入,并输出-1到1范围内的值。输入越大(正值越大),输出值将越接近1.0;而输入越小(负值越大),则值越接近 输出将为-1.0。Tanh激活函数的计算如下:

                                                                                                                                                   (e ^ x – e ^ -x)/(e ^ x + e ^ -x)
        其中e是作为自然对数底数的数学常数。通过下面的工作示例,我们可以直观了解此函数的形状。

# example plot for the tanh activation function
from math import exp
from matplotlib import pyplot

# tanh activation function
def tanh(x):
	return (exp(x) - exp(-x)) / (exp(x) + exp(-x))

# define input data
inputs = [x for x in range(-10, 10)]
# calculate outputs
outputs = [tanh(x) for x in inputs]
# plot inputs vs outputs
pyplot.plot(inputs, outputs)
pyplot.show()

       运行示例将计算一系列值的输出,并创建输入与输出的关系图。 我们可以看到熟悉的Tanh激活函数的S形。

如何选择隐藏层激活函数

        神经网络在所有隐藏层中几乎总是具有相同的激活函数。通过网络模型改变激活功能是最不寻常的。传统上,S型激活函数是1990年代的默认激活函数。 也许在1990年代中期至2010年代后期,Tanh函数是隐藏层的默认激活函数。

        递归网络仍然通常使用Tanh或S型激活函数,甚至两者都使用。 例如,LSTM通常将Sigmoid激活用于循环连接,将Tanh激活用于输出。

多层感知器(MLP):ReLU激活功能。
卷积神经网络(CNN):ReLU激活功能。
循环神经网络:Tanh和/或Sigmoid激活功能。

        如果不确定要为网络使用哪种激活功能,请尝试一些并比较结果。下图总结了如何为神经网络模型的隐藏层选择激活函数。

激活输出层

       输出层是神经网络模型中直接输出预测的层。所有前馈神经网络模型都有一个输出层。您可能需要考虑在输出层中使用三个激活函数; 他们是:

Linear
Logistic (Sigmoid)
Softmax

         这不是用于输出层的激活函数的详尽列表,但是它们是最常用的。让我们依次仔细研究一下。

线性输出激活功能

      线性激活函数也称为“身份”(乘以1.0)或“无激活”。这是因为线性激活函数不会以任何方式更改输入的加权和,而是直接返回值。通过下面的工作示例,我们可以直观了解此函数的形状。

# example plot for the linear activation function
from matplotlib import pyplot

# linear activation function
def linear(x):
	return x

# define input data
inputs = [x for x in range(-10, 10)]
# calculate outputs
outputs = [linear(x) for x in inputs]
# plot inputs vs outputs
pyplot.plot(inputs, outputs)
pyplot.show()

         运行示例将计算一系列值的输出,并创建输入与输出的关系图。 我们可以看到一条对角线形状,其中输入针对相同的输出进行绘制。

Sigmoid输出激活函数

        Logistic激活函数的S形已在上一节中进行了描述。不过,为了增加一些对称性,我们可以使用下面的工作示例来审查此函数的形状。

# example plot for the sigmoid activation function
from math import exp
from matplotlib import pyplot

# sigmoid activation function
def sigmoid(x):
	return 1.0 / (1.0 + exp(-x))

# define input data
inputs = [x for x in range(-10, 10)]
# calculate outputs
outputs = [sigmoid(x) for x in inputs]
# plot inputs vs outputs
pyplot.plot(inputs, outputs)
pyplot.show()

         运行示例将计算一系列值的输出,并创建输入与输出的关系图。 我们可以看到S型激活函数熟悉的S形。

Softmax输出激活函数

             softmax函数输出一个值的矢量,该矢量的总和为1.0,可以解释为类成员的概率。它与argmax函数有关,该函数为所有选项输出0,为所选选项输出1。 Softmax是argmax的“较软”版本,它允许获胜者通吃函数的似然输出。

这样,函数的输入是实数值的向量,而输出是相同长度的向量,其值的总和与概率相同,为1.0。softmax函数的计算如下:

                                                                                                                                                                             e ^ x /sum(e ^ x)
             其中,x是输出的向量,e是一个数学常数,它是自然对数的底数。您可以在本教程中了解有关Softmax函数的详细信息:

        使用Python的Softmax激活功能
        我们无法绘制softmax函数,但可以举一个在Python中进行计算的示例。

# softmax activation function
def softmax(x):
	return exp(x) / exp(x).sum()

# define input data
inputs = [1.0, 3.0, 2.0]
# calculate outputs
outputs = softmax(inputs)
# report the probabilities
print(outputs)
# report the sum of the probabilities
print(outputs.sum())

           运行示例将计算输入向量的softmax输出。 然后,我们确认softmax的输出总和确实为1.0。

[0.09003057 0.66524096 0.24472847]
1.0

        用于在输出层中使用softmax激活函数训练模型的目标标签将是矢量,其中目标类为1,其他所有类为0。

如何选择输出激活函数

     您必须根据要解决的预测问题的类型为输出层选择激活功能。具体来说,是预测变量的类型。例如,您可以将预测问题分为两大类,即预测类别变量(分类)和预测数值变量(回归)。如果您的问题是回归问题,则应使用线性激活函数。

      回归:一个节点,线性激活。
      如果您的问题是分类问题,则分类问题有三种主要类型,每种类型都可能使用不同的激活函数。

       预测概率不是回归问题。这是分类。在所有分类情况下,您的模型都将预测可以通过四舍五入(对于Sigmoid)或argmax(对于softmax)转换为清晰的类标签的类成员的概率(例如,一个示例属于每个类的概率)。

      如果有两个互斥类(二进制分类),则您的输出层将有一个节点,应使用S型激活函数。如果有两个以上互斥的类(多类分类),则您的输出层每个类将有一个节点,应使用softmax激活。如果有两个或两个以上相互包含的类(多标签分类),则您的输出层将为每个类一个节点,并使用S型激活函数。

二进制分类:一个节点,S型激活。
多类分类:每个类一个节点,softmax激活。
多标签分类:每个类一个节点,S型激活。

       下图总结了如何为神经网络模型的输出层选择激活函数。

 

 

 

 

 

 

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 护眼 设计师:闪电赇 返回首页
实付 19.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值