一、神经元与激活函数

神经网络是一种大规模的并行分布式处理器,天然具有存储并使用经验知识的能力。它从两个方面上模拟大脑:
(1)网络获取的知识是通过学习来获取的;
(2)内部神经元的连接强度,即突触权重,用于储存获取的知识。—— Haykin [1994]

生物学家在20世纪初就发现了生物神经元的结构。一个生物神经元通常具有多个树突和一条轴突。树突用来接受信息,轴突用来发送信息。当神经元所获得的输入信号的积累超过某个阈值时,它就处于兴奋状态,产生电脉冲。轴突尾端有许多末梢可以给其他个神经元的树突产生连接(突触),并将电脉冲信号传递给其它神经元。 1943年,心理学家McCulloch和数学家Pitts根据生物神经元的结构,提出了一种非常简单的神经元模型,MP神经元1。现代神经网络中的神经元和 M-P 神经元的结构并无太多变化。

人工神经元

MP神经元

我们通过类比生物神经元的结构与信息传递机制,可以给出MP神经元如下的定义:

MP神经元本质上是一个处理一组输入信号并输出一个信号的非线性函数,即最终非线性函数过滤并作最终输出之前,是以线性函数的形式组合输入信号。

请添加图片描述

  1. 输入信号:MP神经元接收一组输入信号,通常表示为一个数值向量。这些输入信号可以理解为其他神经元的输出或外部刺激。

  2. 权重:每个输入信号都有一个相应的权重,这些权重可以是正的(激励性连接)或负的(抑制性连接)。权重决定了相应输入信号对神经元输出的影响程度。

  3. 加权求和:神经元计算所有输入信号与其对应权重的加权和。这相当于对输入信号进行线性组合。

  4. 偏置:通常会有一个偏置项加入到加权和中,用于调整神经元的激活阈值。

  5. 激活函数:MP神经元使用一个简单的阶跃函数作为激活函数。如果加权输入和(包括偏置)超过某个阈值,神经元就会被激活(输出1),否则不激活(输出0)。

  6. 输出:由于MP神经元使用阶跃函数作为激活函数,所以输出是二值的,通常为0(未激活)或1(激活)。

在这里插入图片描述

MP神经元模型虽然简单,但它在神经网络和计算神经科学的早期发展中发挥了重要作用。它为更复杂的神经网络模型和算法奠定了基础。下面,我们使用Python代码来实现一个MP神经元模型,来展现一个神经元的处理过程。

def mp_neuron(input_vector, weights, bias):
    """
    General implementation of a mp - neural network neuron.

    :param input_vector: List of input signals (numeric values).
    :param weights: Corresponding weights for each input signal.
    :param bias: Bias term.
    :return: Output of the neuron (0 or 1).
    """
    # Calculate the weighted sum of inputs and bias
    weighted_sum = sum(i * w for i, w in zip(input_vector, weights)) + bias

    # Activation (Step function)
    return 1 if weighted_sum > 0 else 0
    

人工神经元

于是,人工神经元的数学模型可以抽象成:

假设一个神经元接受 d d d个输入 x 1 , x 2 , ⋅ ⋅ ⋅ , x d x_1,x_2,··· ,x_d x1,x2,⋅⋅⋅,xd,令向量 x = [ x 1 , x 2 , ⋅ ⋅ ⋅ , x d ] x = [x_1,x_2,··· ,x_d] x=[x1,x2,⋅⋅⋅,xd]来表示这组输入,并用净输入 z ∈ R z ∈ R zR 表示一个神经元所获得的输入信号 x x x 的加权和,

z = ∑ i = 1 d w i x i + b = W T x + b z=\sum_{i=1}^d w_ix_i+b = W^Tx+b z=i=1dwixi+b=WTx+b

其中 x = [ x 1 , x 2 , ⋅ ⋅ ⋅ , x d ] ∈ R d x = [x_1,x_2,··· ,x_d] ∈ \mathbb{R} ^d x=[x1,x2,⋅⋅⋅,xd]Rd d d d维的权重向量, b ∈ R b ∈ \mathbb{R} bR 是偏置。

净输入 z z z在经过一个非线性函数 f (   ) f(~) f( )后,得到神经元的活性值 a a a,即 a = f ( z ) a=f(z) a=f(z)

其中非线性函数 f (   ) f(~) f( )被称为激活函数

于是,我们可以通过组合这些人工神经元来模拟人脑的神经网络,即而组成了人工神经网络,不同神经元之间的连接被赋予了不同的权重,每个权重代表了一个神经元对另一个神经元的影响大小。每个神经元代表一种特定函数,来自其他神经元的信息经过其相应的权重综合计算,输入到一个激活函数中并得到一个新的活性值(兴奋或抑制)。整体来看,人工神经元网络是由大量神经元通过极其丰富和完善的连接而构成的自适应非线性动态系统。而通过某种算法,调整这个系统中每个神经元的权重和偏置信息,以逼近目标模型的过程,就是神经网络的训练过程。详细的数学过程我们将在训练过程章节讨论。

import numpy as np

def neural_network_neuron(input_vector, weights, bias, activation_function):
    """
    General implementation of a neural network neuron.

    :param input_vector: numpy array representing the input vector [x1, x2, ..., xd].
    :param weights: numpy array representing the weights for each input [w1, w2, ..., wd].
    :param bias: Bias term (scalar).
    :param activation_function: The activation function to be applied.
    :return: The activity value (output) of the neuron.
    """
    # Calculate the weighted sum of inputs and bias (net input z)
    z = np.dot(weights, input_vector) + bias

    # Apply the activation function to get the activity value (a)
    a = activation_function(z)

    return a

def sigmoid(x):
    return 1 / (1 + np.exp(-x))
    

在这里的代码示例中,该神经元调用的激活函数是Sigmoid函数,这是最常用的激活函数之一,后面将进行更深入的讨论。

在这里我们可以看出,无论从生物学方面来看,还是数学方面来讲,激活函数在神经元中的作用都是十分重要的。因为:

  1. 如果没有激活控制(激活函数),生物神经网络中就无法控制每个神经元选择性地将信号传递给下一个神经元,也就无法模拟出神经元的兴奋状态。
  2. 如果没有激活函数,数学神经网络模型变退化成了若干线性函数的线性组合,那么最终仍然等效于一个线性函数,这也就无法实现复杂的模型功能了。

因此,如何正确的设计和使用激活函数变得尤为重要,我们不难看出,激活函数首先应该具备以下的性质:

  • 激活函数必须是一个非线性函数;
  • 一般一个神经网络要包含大量的神经元,那么激活函数就要设计的尽可能的简单,以有利于提高整个网络的计算效率;
  • 激活函数的定义域一般设定为 R \mathbb{R} R,这是为了考虑能够处理所有可能的输入,但是值域要设定在一个合适的区间,不能太大也不能太小,否则会影响整个网络系统的计算时的效率和稳定性。

激活函数

Sigmoid型函数

Sigmoid 型函数是指一类 S 型曲线函数,为两端饱和函数。这里的两端饱和指的是在整个函数 f ( x ) f(x) f(x)在趋于无穷大时,它的导数趋于 0 0 0,函数图像如下图所示。
常用的 Sigmoid型函数有 Logistic 函数Tanh 函数
在这里插入图片描述

Logistic 函数

Logistic 函数定义为:

σ ( x ) = 1 1 + e − x \sigma(x)=\frac{1}{1+e^{-x}} σ(x)=1+ex1

Logistic 函数将整个实数域 R \mathbb{R} R 映射到 ( 0 , 1 ) (0,1) (0,1) 这个区间里,因此该函数的输出可以直接看作是一个概率分布,在概率上更好获得解释。同时,与阶跃函数相比,Logistic函数更加缓和,输入越小,输出越接近 0 0 0,输入越大,输出越接近 1 1 1,并且在输入为 0 0 0的附近,Sigmoid函数近似于线性函数。

Tanh 函数

Tanh 函数可以看作是放大并平移过的Logistic函数,其定义为:

t a n h ( x ) = e x − e − x e x + e − x = 2 σ ( 2 x ) − 1 tanh(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}} =2\sigma (2x)-1 tanh(x)=ex+exexex=2σ(2x)1

与Logistic 函数相比,Tanh 函数的输出并不是那么符合“生物学直觉”,因为它是将整个实数域 R \mathbb{R} R 映射到 ( − 1 , 1 ) (-1,1) (1,1) 这个区间里。但是Tanh 函数是 “零中心化函数” ,即当输入是 0 0 0时,输出也是 0 0 0,且输出的数据在正负方向上分布均匀,但Logistic 函数的输出始终是正的。

这也就导致了在大量神经元信息传递的过程中,上一级的神经元输出都是正值,那么下一级的神经元的输入将被推向正方向,导致偏移。这种偏移可能会对之后的神经网络训练造成影响,这部分将在后面进行讨论。

Hard-Logistic 函数和 Hard-Tanh函数

由于Logistic 函数和Tanh 函数都是饱和性激活函数,也就意味着如果输入值过大或过小,输出就会非常接近边界值(Logistics 中的 0 0 0 1 1 1,Tanh 中的 − 1 -1 1 1 1 1),那么在之后的神经网络训练过程(调整神经元内权重和偏置以近似目标模型)中,前后输出的差异非常小,这样就消耗了一定的计算资源,但这些计算对于学习过程来说几乎是无用的,即对整个训练贡献较小。因此,我们可以通过使用分段函数近似这两个激活函数,来减轻这方面的负担。

Hard-Logistic 函数

Logistics 函数在 0 0 0附近的一阶泰勒展开为:

g L ≈ σ ( 0 ) + x σ ′ ( 0 ) = 0.25 x + 0.5 g_L\approx \sigma (0)+x\sigma '(0)=0.25x+0.5 gLσ(0)+xσ(0)=0.25x+0.5

于是使用分段函数近似Logistics 函数,可以表示为:

H a r d L o g i s t i c ( x ) = { 1 g L ( x ) ≥ 1 g L 0 < g L ( x ) < 1 0 g L ( x ) ≤ 0 = m a x ( m i n ( g L ( x ) , 1 ) , 0 ) HardLogistic(x)=\left\{\begin{matrix} 1 & g_L(x)\ge 1\\ g_L & 0<g_L(x)<1\\ 0 & g_L(x)\le 0 \end{matrix}\right. =max(min(g_L(x),1),0) HardLogistic(x)= 1gL0gL(x)10<gL(x)<1gL(x)0=max(min(gL(x),1),0)

Hard-Tanh 函数

Tanh 函数在 0 0 0附近的一阶泰勒展开为:

g T ≈ t a n h ( 0 ) + x t a n h ′ ( 0 ) = x g_T\approx tanh (0)+xtanh '(0)=x gTtanh(0)+xtanh(0)=x

于是使用分段函数近似Tanh 函数,可以表示为:

H a r d T a n h ( x ) = { 1 g T ( x ) ≥ 1 g T 0 < g T ( x ) < 1 0 g T ( x ) ≤ 0 = m a x ( m i n ( g T ( x ) , 1 ) , 0 ) HardTanh(x)=\left\{\begin{matrix} 1 & g_T(x)\ge 1\\ g_T & 0<g_T(x)<1\\ 0 & g_T(x)\le 0 \end{matrix}\right. =max(min(g_T(x),1),0) HardTanh(x)= 1gT0gT(x)10<gT(x)<1gT(x)0=max(min(gT(x),1),0)

ReLU 激活函数

由于前面提到的Sigmoid 函数计算资源会有一定的浪费以及可能存在的训练时带来的问题,而针对这些问题设计的Hard-Sigmoid 函数也会导致额外的计算开销,如函数分段。于是,在大规模的神经网络中,我们更倾向于使用另一种激活函数:ReLU(修正线性单元)

修正线性单元(Rectified Linear Unit,ReLU),本质上是一个斜坡函数,定义为:

R e L U ( x ) = m a x ( 0 , x ) ReLU(x)=max(0,x) ReLU(x)=max(0,x)

在这里插入图片描述

通过ReLU 函数的图像更加直观的可以看到,该函数具有以下的优点:

  1. 计算高效性,ReLU函数的计算只需要设计基本的加法和比较操作,而前面的Sigmoid 函数涉及到复杂的指数,乘除等运算;
  2. 单侧抑制性,ReLU 函数虽然值域不像Sigmoid 函数在一个有限的范围内,但仍然在生物学中找到对应的解释。因为,有些生物神经元表现出类似于该函数的,刺激达到一定阈值以上才可以被激活,即 “单侧抑制性”,这些神经元一旦被激活,输出可以非常高,这种想象被称为“宽兴奋边界”;
  3. 兴奋神经元稀疏性,人脑中生物神经元只有很少一部分是处于兴奋状态的。与Sigmoid 函数大部分神经元处于被激活状态不同,ReLU 函数可以控制被激活的神经元数量处于 约50% 左右,更贴近人脑神经网络;
  4. 与Sigmoid 函数两端饱和相比,RuLU 函数只有左侧饱和,可以一定程度上减轻饱和带来的各种问题。

但是,由于ReLU 函数仍然是一个 “非零中心化” 的函数,其仍然会出现一定程度的偏置偏移现象,以及如果在神经网络训练过程中,某些神经元的权重出现不恰当的更新,那么该神经元可能永远不会被激活(即对下一级神经元的输出永远是 0 0 0),这也就是 “神经元死亡问题”

LeakyReLU 和 PReLU

为了解决上面提到的 “神经元死亡问题” ,这里我们引入一种带泄漏的ReLU激活函数(Leaky ReLU),即在 x < 0 x<0 x<0时,给予一个很小的斜率,保证在神经元没有被激活时,也能有被训练调整的可能,继而避免永远不能被激活的情况,LeakyReLU函数的定义如下:

L e a k y R e L U ( x ) = { x x > 0 α x x ≤ 0 = m a x ( 0 , x ) + α m i n ( 0 , x ) LeakyReLU(x)=\left\{\begin{matrix} x & x>0\\ \alpha x & x\le 0 \end{matrix}\right.=max(0,x)+\alpha min(0,x) LeakyReLU(x)={xαxx>0x0=max(0,x)+αmin(0,x)

其中,当 α < 0 \alpha<0 α<0时,LeakyReLU函数也可以改写为:

L e a k y R e L U ( x ) = m a x ( x , α x ) LeakyReLU(x)=max(x,\alpha x) LeakyReLU(x)=max(x,αx)

这时就相当于一个简单的maxout单元函数,下面将详细讨论它。

一般情况下, α \alpha α是一个很小的常数,如 0.01 0.01 0.01,但为了更形象的展示LeakyReLU和普通ReLU 函数的区别,下面展示一下 α = 0.2 \alpha = 0.2 α=0.2时,LeakyReLU 函数的图像。
在这里插入图片描述

在我们理解了LeakyReLU的工作原理后,我们可以发现,LeakyReLU的泄露系数 α \alpha α是固定的,那么是否有可能让该系数动态调整以适应每个神经元的具体情况呢?于是,这里我们引入一种更加灵活的ReLU变种,将泄露系数 α \alpha α变成一个可以学习的参数,和每个神经元的权重参数一样,这样可以给予整个神经网络中每个神经元以独特性,以便更好地适应训练数据。这种激活函数就是带参数的ReLU 函数(Parametric ReLU (PReLU) ),对于第 i i i个神经元,其定义为:

P R e L U ( x ) = { x x > 0 α i x x ≤ 0 = m a x ( 0 , x ) + α i m i n ( 0 , x ) PReLU(x)=\left\{\begin{matrix} x & x>0\\ \alpha _i x & x\le 0 \end{matrix}\right.=max(0,x)+\alpha _i min(0,x) PReLU(x)={xαixx>0x0=max(0,x)+αimin(0,x)

这其中 α i \alpha _i αi即可学习的泄露系数,当它是一个统一的较小的常数时,该函数变退化为普通的LeakyReLU 函数,当它为 0 0 0时,该函数变退化为普通的ReLU 函数,当然,可以允许一组神经元共享同一个 α \alpha α系数。这正反映了PReLU 函数的高灵活性,但也带来了一定程度上的计算开销。

def relu(x):
    """
    Rectified Linear Unit (ReLU) activation function.
    """
    return np.maximum(0, x)

def leaky_relu(x, alpha=0.2):
    """
    Leaky ReLU activation function with a fixed alpha (leak).
    """
    return np.maximum(0, x) + alpha * np.minimum(0, x)

def prelu(x, alpha):
    """
    Parametric ReLU (PReLU) activation function with a learnable alpha parameter.
    """
    return np.maximum(0, x) + alpha * np.minimum(0, x)

ELU 指数线性单元

指数线性单元(Exponential Linear Unit, ELU) 激活函数是神经网络中另一种用于解决“神经元死亡问题”的方案。它在某些方面类似于ReLU及其变体,但引入了不同的机制来处理负输入值,其定义为:

E L U ( x ) = { x x > 0 δ ( e x − 1 ) x ≤ 0 = m a x ( 0 , x ) + m i n ( 0 , δ ( e x − 1 ) ) ELU(x)=\left\{\begin{matrix} x & x>0\\ \delta (e^x-1) & x\le 0 \end{matrix}\right.=max(0,x)+min(0,\delta (e^x-1)) ELU(x)={xδ(ex1)x>0x0=max(0,x)+min(0,δ(ex1))

其中, δ > 0 \delta >0 δ>0是一个超参数,即不可被训练的参数,它决定了 x ≤ 0 x\le 0 x0时的饱和曲线,并调整输出均值在 0 0 0附近。

下面我们使用 δ = 5 \delta =5 δ=5 作为示例绘制ELU 函数的图像,我们可以很直观的看出,ELU在零点附近提供了更平滑的曲线,可以提供更好的模型训练过程。
在这里插入图片描述

Softplus 函数

现在我们回顾一下之前ReLU、Leaky ReLU、PReLU和ELU这些激活函数,它们都有一个共同的特点,在 0 0 0点处函数其实并不能微分,这主要是可能会对后面神经网络模型训练时带来不便,因此并不是最理想的状态,详细原因我们在后面的章节讨论。

所以,可以设计一个更加贴合数学上理想化的ReLU函数的平滑版本,即Softplus 函数,其定义为:

S o f t p l u s ( x ) = l n ( 1 + e x ) Softplus(x)=ln(1+e^x) Softplus(x)=ln(1+ex)

这里不难看出,Softplus 函数的导数就是 Logistic 函数: 1 1 + e − x \frac{1}{1+e^{-x}} 1+ex1,当然Softplus 函数也有单侧抑制宽兴奋边界的特性,但没有稀疏激活性

import numpy as np

def softplus(x):
    """
    Softplus activation function.
    """
    return np.log1p(np.exp(x))  # log1p is log(1 + x) for better precision with small x

这里在编程实现Softplus 函数时有一个需要注意的点:当这里 x x x的值很小时, e x e^x ex会很接近 0 0 0,那么由于浮点数运算的精度问题,计算出来的数值精度就可能会不够,于是这里使用 np.log1p( ) 函数解决这个问题,该函数的官方文档:np.log1p 官方文档
ReLU、Leaky ReLU (α = 0.2)、ELU (δ = 1) 和 Softplus 激活函数的比较

最后,我们将ReLU、Leaky ReLU (α = 0.2)、ELU (δ = 1) 和 Softplus 激活函数的比较如上图所示,并依次做一个阶段性的总结:

  1. 激活函数一定是非线性函数,并且不应该过于复杂,以便于整个神经网络可以更快更好地学习和逼近目标模型;
  2. 激活函数应该设计成非饱和或部分非饱和的函数,并且函数本身应该尽量平滑,这样可以避免训练神经网络过程中出现严重梯度爆炸梯度消失的现象2,且平滑的激活函数可以让梯度更加的稳定。
  3. 激活函数的设计与使用应该加入实际解决问题的参考,并不存在普适的激活函数,也并不意味着一个神经网络模型都要使用同一种激活函数。
主要公式主要特点主要优点主要缺点可以解决的问题
Logistic σ ( x ) = 1 1 + e − x \sigma(x)=\frac{1}{1+e^{-x}} σ(x)=1+ex1输出范围在 ( 0 , 1 ) (0, 1) (0,1),S 形曲线输出有界,适用于输出概率梯度消失问题,输出不是零中心的概率输出、二元分类
Tanh t a n h ( x ) = e x − e − x e x + e − x tanh(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}} tanh(x)=ex+exexex输出范围在 ( − 1 , 1 ) (-1, 1) (1,1),S 形曲线输出零中心化高饱和度导致的梯度消失问题需要零中心化输出时使用
Hard-logistic H a r d L o g i s t i c ( x ) = m a x ( m i n ( g L ( x ) , 1 ) , 0 ) HardLogistic(x)=max(min(g_L(x),1),0) HardLogistic(x)=max(min(gL(x),1),0)Logistic 函数的分段线性近似计算更简单高效不够平滑,可能影响梯度下降需要加速计算但可以牺牲一些精度的场合
Hard-tanh H a r d T a n h ( x ) = m a x ( m i n ( g T ( x ) , 1 ) , 0 ) HardTanh(x)=max(min(g_T(x),1),0) HardTanh(x)=max(min(gT(x),1),0)Tanh 函数的分段线性近似计算更简单高效不够平滑,可能影响梯度下降需要加速计算但可以牺牲一些精度的场合
ReLU R e L U ( x ) = m a x ( 0 , x ) ReLU(x)=max(0,x) ReLU(x)=max(0,x)正值线性,负值为零计算简单,有效缓解梯度消失问题神经元死亡问题加速训练,减少梯度消失
LeakyReLU L e a k y R e L U ( x ) = m a x ( 0 , x ) + α m i n ( 0 , x ) LeakyReLU(x)=max(0,x)+\alpha min(0,x) LeakyReLU(x)=max(0,x)+αmin(0,x)正值线性,负值有小的非零斜率减轻神经元死亡问题斜率固定,可能不适用于所有问题防止死神经元,增加模型的稳定性
PReLU P R e L U ( x ) = m a x ( 0 , x ) + α i m i n ( 0 , x ) PReLU(x)=max(0,x)+\alpha _i min(0,x) PReLU(x)=max(0,x)+αimin(0,x)正值线性,负值斜率可学习动态调整负值斜率增加了额外的可学习参数自适应调整负值处理,提高模型灵活性
ELU E L U ( x ) = m a x ( 0 , x ) + m i n ( 0 , δ ( e x − 1 ) ) ELU(x)=max(0,x)+min(0,\delta (e^x-1)) ELU(x)=max(0,x)+min(0,δ(ex1))正值线性,负值为指数衰减平滑输出,有助于减少梯度消失计算相对复杂更平滑的负值处理,减少梯度消失
Softplus S o f t p l u s ( x ) = l n ( 1 + e x ) Softplus(x)=ln(1+e^x) Softplus(x)=ln(1+ex)平滑版本的 ReLU处处可微分计算相对复杂,梯度消失问题仍然存在需要平滑激活函数时使用

Swish 激活函数

Swish 激活函数是由谷歌研究团队在 2017 年提出的,它是一种自门控(Self-Gated)的激活函数。回顾先前激活函数的图像我们可以看出,ReLU、Leaky ReLU、ELU和 Softplus 等激活函数虽然一端不饱和,但当输入过大或过小时,输出可能也会过于极端,而像Logistic 和 Tanh 激活函数输出会过于保守。于是,自门控激活函数通过结合这两者,巧妙规避了二者的缺点,Swish 激活函数便是其中一种,它的定义是:

S w i s h ( x ) = x σ ( α x ) Swish(x)=x\sigma (\alpha x) Swish(x)=xσ(αx)

其中, σ (   ) \sigma(~) σ( )是最开始的Logistic 激活函数, α \alpha α是一个可学习的参数或者是一个超参数,此时 σ (   ) ∈ ( 0 , 1 ) \sigma(~)\in (0,1) σ( )(0,1)可以看作一个限制 x x x的软性门函数,即 σ (   ) \sigma(~) σ( )接近于 1 1 1时,门处于类似于开的状态,反之 σ (   ) \sigma(~) σ( )接近于 0 0 0时,门处于类似关的状态。这样的设计,既避免了极端输入导致的激活值过大梯度消失问题,又确保了小数值信号不会被完全忽略,从而提高了整个模型的表达能力和稳定性。

在这里插入图片描述

通过对比不同的 α \alpha α值Swish 激活函数的图像,我们可以看到随着 α \alpha α值的增加,Swish 函数的曲线变得更加陡峭。特别是当 α \alpha α非常大(如 100)时,Swish 函数在零点附近的变化非常快,这意味着它对输入值的小变化非常敏感。而当 α \alpha α较小(如 0 和 0.5)时,曲线变得更加平滑,对输入的变化不那么敏感。值得注意的是,当 α = 1 \alpha =1 α=1时,函数图像呈现出非单调函数的特征,这可以捕捉到更复杂的数据模式,因为它们不受单调递增或递减的限制。

这种特性使得 Swish 函数能够根据 α \alpha α的设置适应不同的场景和需求。

Maxout 单元

在这里我们再回顾一下之前所有的激活函数,它们虽然各有特点,但都是作用在一个净输入 z z z上的。那么如果我们给每一个神经元设定不止一个净输入 z z z,那么就构成了Maxout 单元激活函数,Maxout 单元的基本思想是从神经元的多个线性输出中取最大值作为激活函数的输出。具体来说,如果一个 Maxout 单元有 k k k个线性部分,那么其输出是这些线性部分输出的最大值。这种操作更像是将原有的 k k k个神经元合成了 1 1 1个,从而单个神经元的模型容量获得了提升,当然也意味着 Maxout 网络通常会有更多的参数和更高的计算需求。

请添加图片描述


  1. [McCulloch and Pitts, 1943] ↩︎

  2. [梯度爆炸或梯度消失的数学原理将在模型训练中详细讨论] ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值