神经网络的基本概念

神经网络,就像我们大脑中的神经元网络一样,是一种模仿生物神经元结构的计算模型。它通过互相连接的节点(称为神经元)来处理信息,这些连接有不同的权重,代表着不同信息的重要性。

🪧 Beginner Tips: 想象一下,你正在学习识别猫。你的眼睛接收图像信息,然后传递给大脑中的神经元。这些神经元分析图像的各个部分(比如耳朵、眼睛、尾巴),并根据这些部分的特征来判断是否是猫。神经网络的工作方式与此类似。

神经网络的结构

一个基本的神经网络通常由以下几层组成:

  • 输入层(Input Layer): 接收原始数据。比如,如果是处理图像,输入层可能包含图像的像素值。

  • 隐藏层(Hidden Layer): 对输入数据进行一系列复杂的转换和处理。一个神经网络可以有多个隐藏层。

  • 输出层(Output Layer): 产生最终的结果。比如,如果是猫狗分类,输出层可能有两个节点,分别代表“猫”和“狗”的概率。

神经元之间通过权重(Weights)连接。权重决定了每个连接的重要性。每个神经元还会有一个偏置(Bias),可以理解为神经元被激活的难易程度。

🪧 Beginner Tips: 我们可以把神经网络想象成一个函数,输入层是函数的输入,隐藏层是函数内部的计算过程,输出层是函数的输出。通过调整权重和偏置,我们可以让这个函数更好地拟合我们的数据,从而解决实际问题。

激活函数

激活函数的作用:引入非线性,解决复杂问题

激活函数是神经网络中非常关键的组成部分。它的主要作用是给神经元引入非线性。如果没有激活函数,神经网络的每一层都相当于一个线性变换,无论叠加多少层,最终的结果仍然是线性的。这意味着网络只能解决线性可分的问题,无法处理复杂的非线性问题。

🪧 Beginner Tips: 线性可分问题是指可以用一条直线(二维)或一个平面(三维)将数据分开。现实世界中的很多问题都不是线性可分的,比如图像识别、语音识别等。激活函数就像一个“开关”,只有当输入达到一定阈值时,神经元才会被激活,从而引入非线性。

常见的激活函数

接下来,我们来详细了解一些常见的激活函数。

Sigmoid

  • 公式: σ(x) = 1 / (1 + exp(-x))

  • 优点:

  • 将输出压缩到0和1之间,可以解释为概率。

  • 输出范围有限,对输出具有规范化的作用。

  • 缺点:

  • 梯度消失(Vanishing Gradient): 当输入非常大或非常小时,Sigmoid函数的梯度接近于0,这会导致网络在训练过程中难以更新权重,尤其是在深层网络中。

  • 输出不是以0为中心(Not Zero-Centered): 这会导致梯度更新时出现偏差,影响收敛速度。

  • 计算复杂度较高,因为需要计算指数。

  • 适用场景:

  • 二元分类问题的输出层。

  • 需要输出概率值的场景。

🪧 Beginner Tips: 想象一下,Sigmoid函数就像一个“挤压器”,它把任何实数都挤压到0到1之间。但是,当输入非常大或非常小时,这个“挤压器”几乎不动了,导致梯度消失。

Tanh (双曲正切函数)

  • 公式: tanh(x) = (exp(x) - exp(-x)) / (exp(x) + exp(-x))

  • 优点:

  • 输出以0为中心,可以缓解梯度更新的偏差问题。

  • 输出范围有限,对输出具有规范化的作用。

  • 缺点:

  • 仍然存在梯度消失问题,尤其是在深层网络中。

  • 计算复杂度较高,因为需要计算指数。

  • 适用场景:

  • 隐藏层。

  • 需要输出值在-1到1之间的场景。

🪧 Beginner Tips: Tanh函数和Sigmoid函数很像,也是一个“挤压器”,但它把输出挤压到-1到1之间,而且是以0为中心的,这比Sigmoid函数稍微好一些。

ReLU (Rectified Linear Unit)

  • 公式: ReLU(x) = max(0, x)

  • 优点:

  • 计算速度快,只需要比较大小。

  • 在正区间内,梯度为1,可以缓解梯度消失问题。

  • 在一定程度上解决了梯度消失问题,使得深层网络更容易训练。

  • 缺点:

  • 死亡ReLU(Dying ReLU): 当神经元的输入始终为负时,ReLU的输出始终为0,导致该神经元永远不会被激活,从而失去作用。

  • 输出不是以0为中心。

  • 适用场景:

  • 隐藏层。

  • 计算资源有限的场景。

🪧 Beginner Tips: ReLU函数就像一个“开关”,当输入大于0时,它就打开,输出等于输入;当输入小于等于0时,它就关闭,输出为0。ReLU函数非常简单高效,是目前最常用的激活函数之一。

Leaky ReLU

  • 公式: Leaky ReLU(x) = x if x > 0 else αx (其中 α 是一个很小的常数,比如 0.01)

  • 优点:

  • 解决了死亡ReLU问题。

  • 计算速度快。

  • 缺点:

  • α 的选择可能会影响性能。

  • 输出不是以0为中心。

  • 适用场景:

  • 隐藏层。

  • ReLU效果不佳的场景。

🪧 Beginner Tips: Leaky ReLU函数是ReLU函数的改进版本,它在输入小于0时,不再输出0,而是输出一个很小的负数,从而避免了死亡ReLU问题。

ELU (Exponential Linear Unit)

  • 公式: ELU(x) = x if x > 0 else α(exp(x) - 1) (其中 α 是一个常数,通常为1)

  • 优点:

  • 解决了死亡ReLU问题。

  • 输出接近于0均值。

  • 比ReLU具有更强的鲁棒性。

  • 缺点:

  • 计算复杂度较高,因为需要计算指数。

  • α 的选择可能会影响性能。

  • 适用场景:

  • 隐藏层。

  • 对噪声敏感的场景。

🪧 Beginner Tips: ELU函数是另一种ReLU函数的改进版本,它在输入小于0时,输出一个指数函数,从而避免了死亡ReLU问题,并且使输出更接近于0均值。

Softmax

  • 公式: Softmax(xᵢ) = exp(xᵢ) / Σⱼ exp(xⱼ) (对所有可能的j)

  • 优点:

  • 将输出转换为概率分布,所有输出之和为1。

  • 适用于多分类问题。

  • 缺点:

  • 对输入非常敏感,容易受到梯度消失的影响。

  • 适用场景:

  • 多分类问题的输出层。

🪧 Beginner Tips: Softmax函数就像一个“归一化器”,它把一组实数转换成概率分布,每个数的范围都在0到1之间,并且所有数的和等于1。

激活函数的选择

选择合适的激活函数对神经网络的性能至关重要。以下是一些选择激活函数的原则:

  • 基于问题类型选择:

  • 二元分类问题:Sigmoid函数通常用于输出层。

  • 多分类问题:Softmax函数通常用于输出层。

  • 隐藏层:ReLU及其变体(Leaky ReLU、ELU)通常是更好的选择。

  • 基于网络深度选择:

  • 浅层网络:Sigmoid和Tanh函数可能还可以使用。

  • 深层网络:ReLU及其变体通常是更好的选择,因为它们可以缓解梯度消失问题。

  • 基于计算资源选择:

  • 计算资源有限:ReLU函数通常是更好的选择,因为它计算速度快。

  • 计算资源充足:ELU函数可能可以提供更好的性能,但计算复杂度也更高。

  • 基于经验结果选择:

  • 尝试不同的激活函数,并根据实验结果选择最佳的激活函数。

🪧 Beginner Tips: 没有一种激活函数是万能的,最好的方法是根据具体问题和网络结构进行实验,选择最合适的激活函数。