神经网络 - 关于简单的激活函数的思考总结

发布于:2025-04-10 ⋅ 阅读:(41) ⋅ 点赞:(0)

最近一直在学习神经网络,有一些收获,也有一些迷惑,所以驻足思考:为什么简单的激活函数如sigmoid函数、ReLU函数,当应用在神经网络的模型中,却可以实现对现实世界复杂的非线性关系的模拟呢?本文我们来进行理解其中的原理。

一、神经网络与简单的激活函数

神经网络使用激活函数的主要原因在于它们引入了非线性变换,使得网络具备逼近复杂函数和建模非线性关系的能力。下面详细解释这一点,并探讨为什么常用的激活函数往往比较简单,而不是更复杂的非线性函数。

1. 为什么使用激活函数

  • 非线性建模能力
    如果网络中只使用线性变换(矩阵乘法和加法),无论网络有多少层,整体仍然只能表示一个线性变换,这严重限制了模型的表达能力。激活函数通过在每层中引入非线性变化,使得多层网络可以构造出复杂的非线性映射,满足逼近任意连续函数的要求(正如通用逼近定理所示)。

  • 层与层之间的信息转换
    激活函数使得每层神经元的输出不再是输入的简单线性组合,而是经过非线性转换后传递下去。这种非线性作用能够捕捉数据中更细粒度、复杂的特征变化和模式。

  • 控制输出范围和稳定训练
    例如,tanh⁡将输出限定在 [−1,1] 内,而 sigmoid 限定在 [0,1] 内,这种约束可以防止数值在网络中无限增长,也有助于保持梯度在合理范围内,从而促进模型训练的稳定性。

2. 为什么激活函数通常比较简单?

  • 计算效率
    简单的激活函数(如 ReLU、sigmoid、tanh⁡)在数学上形式简洁,计算量小,能够在大量数据和深层网络中高效运行。复杂的函数如果计算耗时较长,会降低模型训练和推理的效率,尤其在大规模应用场景下,简单高效的函数更为实用。

  • 梯度求导便利性
    激活函数在反向传播中的导数是关键因素。简单函数具有简单且易于计算的导数,确保梯度能够被有效传递。较复杂的函数可能会产生复杂的导数表达式,导致梯度计算和优化更为困难,甚至可能引发数值不稳定问题。

  • 经验验证与效果
    数十年来,研究和实践表明这些简单的激活函数已经足够强大,能够与深度网络的层级结构配合,逼近非常复杂的函数。简单激活函数在许多任务上取得了优异的效果,并且具有较好的泛化性能,所以大部分模型选择它们而不是复杂的函数。

  • 稳定性和可调性
    激活函数不仅需要非线性,还需要在训练过程中保持良好的梯度流(避免梯度消失或爆炸)。一些复杂的非线性函数可能理论上能够提供更丰富的表达,但它们往往对权重初始化、正则化等更为敏感,不容易调优。简单的激活函数已经在各种任务中经过验证,表现出较好的稳定性和鲁棒性。

3. 举个例子说明

假设我们设计一个简单的两层神经网络来拟合非线性函数 y=sin⁡(x)。网络结构如下:

  • 输入 x 经过第一层线性变换:z1=W1x+b1​

  • 使用激活函数(例如 tanh⁡)得到第一层输出:a1=tanh⁡(z1)

  • 接着第二层线性变换:z2=W2a1+b2

  • 最终输出:y^=z2

如果没有激活函数,整个网络计算就是一系列线性变换,最终结果是线性的,无法拟合 sin⁡(x) 这样的非线性函数。但由于我们在第一层引入了 tanh⁡ 非线性变换,输出 a1​ 是输入的非线性表达,接着第二层再做线性组合,整体效果可以逼近非线性函数 sin⁡(x)。这里用到的 tanh⁡ 非线性函数虽然形式简单,但其非线性曲线足以让模型学习到较复杂的变化模式。

二、简单的激活函数,为何可以模拟现实世界的非线性特征?

理解这个,是理解神经网络的关键,所以这一块,大家需要返回去看看神经网络的概念,和进一步加深对“通用逼近定理”的理解。

简单的激活函数虽然数学形式比较简单,但其关键在于“组合效应”:通过多层神经网络中不断堆叠这些简单函数,可以逼近非常复杂的非线性映射。这背后有几个核心原因:

  1. 非线性叠加的威力(通用逼近定理)
    根据通用逼近定理,只要隐藏层足够大、层数足够多,哪怕每个隐藏单元仅使用简单的非线性函数(例如 tanh⁡\tanhtanh 或 sigmoid),整个网络也能逼近任何连续的非线性函数。换句话说,各层简单激活函数叠加后构成复合函数,整体非线性表达能力大大增强,从而能够模拟现实世界中的复杂关系。

  2. 分层特征抽象
    在深层网络中,每一层都对输入数据做简单的非线性变换,然后将数据传递到下一层。底层的简单变换可以捕捉局部特征,而高层则通过组合这些低层特征来表示更为抽象和复杂的信息。这种分层抽象方式使得单个简单激活函数所能表达的信息变得“指数级”丰富。

  3. 计算效率与优化稳定性
    简单函数(如 tanh⁡、sigmoid、ReLU)计算速度快,求导形式简单,从而使得网络的反向传播更易于计算和调优。更复杂的激活函数虽然可能在理论上表达更丰富的非线性关系,但往往会带来计算开销增加、梯度计算变得复杂甚至数值不稳定的问题。实践中,人们发现简单激活函数已经能达到理想的表现与泛化能力,因此广泛采用这种“简单而有效”的方法。

  4. 经验验证与泛化能力
    多年来的研究和实践证明,简单激活函数的组合已经能够有效地捕捉和表达各种现实世界的非线性特征。实际应用中,通过大量数据训练出来的参数(权重和偏置)能自适应地调整,充分利用这些简单激活函数的特性,构造出非常复杂和灵活的映射,而不必引入额外的非线性复杂度。

总的来说,虽然看起来简单,但激活函数通过层层组合和参数的自适应学习,能够模拟现实世界中极为复杂的非线性关系。而使用更复杂的激活函数可能会增加训练难度和计算代价,且实验上并未必能带来明显优势,因此简单且高效的激活函数在实际应用中被广泛采用。

三、自然语言中的语义关联的例子

让我们结合一个例子,加深理解关于简单的激活函数对于神经网络的意义。

在自然语言处理任务中,我们经常需要捕捉词语之间复杂的语义关联,即使这些关联在数学上看起来非常非线性。虽然许多激活函数(例如 tanh、sigmoid 或 ReLU)形式简单,但它们在深层网络中通过层层叠加,可以实现非常丰富的非线性映射,进而捕捉到词语之间微妙的语义关系。下面通过一个具体例子说明这一点:

举例:词语语义关系的建模

假设我们要构造一个简单的神经网络,目的是从词向量中学习语义上的差异和关联。比如,一个经典的语义关系是:

  • “King” - “Man” + “Woman” ≈ “Queen”

在实际应用中,我们不会直接对原始词向量做加减运算,而是通过多层网络对输入的词向量进行非线性转换,最终得到能够捕捉这种语义平移关系的隐藏表示。

1. 输入与嵌入

首先,每个单词会通过词嵌入(Embedding)层转换成一个向量。例如:

  • “King” 被映射为向量 v_king​

  • “Man” 被映射为向量 v_man​

  • “Woman” 被映射为向量 v_woman​

2. 多层全连接网络与简单激活函数

接下来,我们将这些嵌入向量送入一个由多层全连接神经网络组成的模型。每一层的计算过程如下:

h=tanh⁡(Wx+b)

虽然这里使用的 tanh⁡ 激活函数在数学上并不复杂,但它的非线性性质(例如,当 x 较小时近似线性,当 x 较大时趋于饱和)使得网络可以对输入进行非线性变换。

通过多层(深度)结构,每一层都在对前一层的输出进行非线性转换。设想经过多层之后,网络学习到了一种映射 F:

F(vking)−F(vman)+F(vwoman)≈F(vqueen)

大概的过程理解如下:

  • 初始嵌入与输入层
    每个词(如 "King", "Man", "Woman", "Queen")首先通过词嵌入层(Embedding)转换为高维向量。这个初始向量捕捉了词汇的基本语义信息,但通常这些向量尚未明确表达诸如性别、地位等更深层次的语义细节。

  • 低级特征抽象(第一、二层)

    • 第一层:网络对输入向量进行线性变换(乘以权重矩阵)后,再通过简单非线性激活函数(如 tanh⁡ 或 ReLU)激活。这一层简单地组合和“扭曲”输入信息,可能捕捉到诸如“实体特征”(例如区分人与动物、具有人类属性的对象)的低级特征。

    • 第二层:这一层收到第一层输出的“预加工”向量,再次经过线性变换和激活函数的组合。经过这样的处理后,模型开始在向量空间中提取一些抽象的属性,比如“性别”特征或“权力”(如“王权”)的初步表示。

  • 高级语义关系建模(中间和高层)

    • 中间层:随着网络层数的增加,信息经过多次线性变换与非线性函数的组合后,低层捕捉到的特征会被重新组合。举例来说,网络可能自动学习到“King”和“Man”之间的差异主要反映了一种“王权”或者“贵族”特征,而这种特征在“Queen”和“Woman”之间也可以找到相似的差异。

    • 高层:此时,网络内部的表示已经变得高度抽象。我们可以认为,通过多层堆叠,网络将原始嵌入空间的简单线性表示转换成了一个经过复杂非线性“扭曲”的空间。在这个空间中,简单的线性操作(如向量减法和加法)就能反映出复杂的语义关系。例如,经过网络转换后的向量 F(King), F(Man) 和 F(Woman) 满足

      F(King)−F(Man)+F(Woman)≈F(Queen),

      这表示模型在学习过程中已经捕捉到“性别”、“身份”等更高层次的语义特征,并用一种简单、线性的方式在输出层呈现了这种复杂关系。

这个公式说明,尽管每层使用的激活函数(如 tanh⁡\tanhtanh)本身简单,但经过堆叠后,模型捕捉到的F(⋅) 映射具有足够的非线性能力,从而“理解”并近似模拟了这种复杂的语义关联。

3. 为什么不用复杂的激活函数?
  • 计算效率与稳定性:简单激活函数计算速度快、易于求导,保证了反向传播过程中的梯度计算和参数更新非常高效且稳定。复杂的非线性函数可能会引入额外的计算负担和不确定性,甚至导致数值不稳定。

  • 组合效应:神经网络的强大之处在于多层结构中简单非线性函数的组合。正如通用逼近定理所说,只要隐藏层足够大、层数足够多,简单激活函数构成的网络就能逼近任意连续的非线性函数。

  • 经验验证:大量实践证明,简单激活函数(如 tanh⁡ 和 ReLU)已经足够捕捉和表示自然语言中的复杂语义特征,而进一步增加激活函数的复杂性往往不会带来明显的性能提升,反而可能增加训练难度。

总结

简单激活函数(如 tanh⁡)虽然形式上简单,但当它们通过多层网络组合后,就能形成极其复杂的非线性映射,足以捕捉自然语言中诸如“King - Man + Woman = Queen”这种深层语义关联。简单激活函数的优势在于计算高效、易求导和稳定性好,这些特点使得它们在实际任务中能够良好地表达现实世界的非线性特征,而无需采用过于复杂的非线性函数。