阶层型神经网络结构

在这里插入图片描述

通过前面的学习已经了解了一个神经元的输入输出的整合处理,现在将多个神经元按层的结构组成一个基本的阶层型神经网络,其通常由以下几个核心部分组成,每一部分对应不同的层级结构及其作用:

  1. 输入层(Input Layer)
  • 仅仅接收外部输入数据,并将其传递给隐藏层,不进行任何处理。对于二维数据(如图像),每个像素点都可以看作输入特征。
  1. 隐藏层(Hidden Layer)
  • 对输入数据进行特征提取、转换和非线性映射。
  • 隐藏层的神经元会加权输入信号并应用激活函数(sigmoid、ReLU、Tanh等),使得网络可以学习到复杂的模式和关系。
  1. 输出层(Output Layer)
  • 根据任务类型给出最终的预测值或分类结果。
  • 在分类问题中,通常使用Softmax函数将输出转换为概率分布。
  1. 神经元(Neuron)
  • 神经元是神经网络的基本计算单元,其不仅在隐藏层存在,还包括输入层和输出层。对应图中的圆圈。
  1. 全连接(Fully Connected, FC)
  • 在全连接层中,每一个神经元与前一层的所有神经元相连接。这种连接意味着后一层的每个神经元都会接收到前一层所有神经元的输出信号。这种计算过程可以通过线性变换来描述,因此全连接层可以视为一个线性层。具体地说,后一层的每个神经元会将前一层所有神经元的输出与对应的权重相乘,然后求和,并加入一个偏置项。
    简而言之,全连接层的核心功能是执行线性变换,利用权重来对输入特征进行加权处理,为后续层提供新的特征表示。
  1. 非线性(Nonlinearity)
  • 此时网路中均为线性处理,如果没有非线性(即没有激活函数),网络的每一层都只是一个线性变换,多个线性变换叠加在一起仍然是一个线性变换。因此,无论网络的层数有多少,它只能表示线性关系,无法拟合复杂的非线性数据。通过引入非线性激活函数,网络能够学习到更复杂的模式,解决非线性问题。
    激活函数通常在每个神经元的加权求和之后应用,激活函数的作用是将线性输出转换为非线性输出。

在这里插入图片描述

在这里插入图片描述

为了更好地理解模型的各部分、选择不同的参数组合和调整参数,首先需要掌握模型中的关键参数及其作用,下面则具体的说相关参数的效果及调整方式。

正则惩罚项的调整

正则项可以应用于神经网络模型的所有层,特别是在权重的学习上,包含了输入层、隐藏层和输出层的权重。正则化的主要目标是通过限制权重的大小,防止模型过拟合,提升泛化能力。因此,它主要作用于网络中的权重参数,而权重参数存在于每一层的连接中,包括隐藏层。

具体而言在神经网络中,每一层神经元与前一层神经元通过权重相连。正则化通过在损失函数中加入惩罚项,来控制这些权重的大小。常见的惩罚形式包括L1和L2正则化,目的是防止权重变得过大,从而控制模型的复杂度。

常见的惩罚形式

在这里插入图片描述

L1正则项

  • 绝对值惩罚使得模型参数更加倾向于选择0。

L2正则项

  • 平方惩罚使得模型参数更加倾向于减小,即更加平滑。

惩罚力度的调整效果

在这里插入图片描述

在图5可以可到当惩罚力度较小时模型的形式较为复杂,即拥有更多更细的决策边界,而较大的惩罚力度能够使得模型的参数复杂度减小,对给定数据的拟合效果下降(减少了对于噪声数据的学习),从而降低过拟合的风险,提高模型的泛化能力。

神经元个数的调整

调整神经元数量主要是为了平衡模型的学习能力和计算效率。过少的神经元可能导致模型无法充分学习数据特征,表现为欠拟合;而过多的神经元则可能导致模型在训练数据上过于精细,导致在测试数据上泛化能力下降,表现为过拟合。因此,应选择合适的神经元数量,以找到欠拟合和过拟合之间的最佳平衡点。

神经元数量对模型结果的影响

下图展示了在不同数量的隐藏神经元下,神经网络在分类任务中的表现。绿色和红色区域表示模型的分类结果,散点表示训练数据。图中显示了 3 个、6 个和 20 个隐藏神经元的分类边界:

在这里插入图片描述

  • 左图(3 个神经元):模型复杂度较低,分类边界简单,容易欠拟合。
  • 中图(6 个神经元):模型复杂度适中,较好地捕捉了数据的分布模式。
  • 右图(20 个神经元):模型复杂度较高,分类边界复杂,可能过拟合训练数据。

总结来说,增加隐藏层神经元数量会提高模型复杂度,但过多时容易导致过拟合;而神经元数量过少则可能导致欠拟合。因此,选择合适的神经元数量对于提升模型的泛化能力至关重要。

激活函数的选择

激活函数是神经网络中关键的非线性组件,决定了网络的输出和训练效率。不同的激活函数适用于不同的场景,各有优缺点。
在这里插入图片描述

以下是几种常用的激活函数及其应用场景和不足之处。

激活函数 特点与应用场景
SigmoidTanh - 适合小型网络或二分类问题
- 容易出现梯度消失问题
- 较少用于深层网络
ReLU (Rectified Linear Unit) - 在深度学习中广泛使用
- 计算效率高
- 适合大多数场景
- 可能出现“神经元死亡”问题(Dying ReLU)
Leaky ReLUELU - 解决 ReLU 的缺陷
- 防止神经元死亡
- 收敛速度较好
Softmax - 用于多分类问题的输出层
- 将输出转换为概率分布

在这里插入图片描述

选择激活函数时关注的几个问题

(1)梯度消失
当激活函数进入饱和区(输出接近极值)时,梯度值趋近于0。随着层数增加,梯度会逐层衰减,当某一层的梯度为0时候模型训练停滞。这在深层网络中尤为突出。

  • 示例:Sigmoid 和 Tanh 激活函数在输入值较大或较小时,输出会趋近于 0 或 1。

  • 解决方案:选择 ReLU 等不饱和激活函数,或在深层网络中加入残差连接以缓解梯度消失问题。

(2) 梯度下降收敛变慢
激活函数输出不以零为中心时(如 Sigmoid 的输出在 0 到 1 之间),反向传播中的梯度方向会缺少足够的负向调整,导致某些权重的更新方向单一,不利于快速逼近最优解。

  • 示例:Sigmoid 的输出范围 (0, 1) 使得更新方向一致,导致收敛缓慢。

  • 解决方案:使用 Tanh 激活函数(输出范围在 -1 到 1),或在输入数据上进行零均值归一化,以增强梯度多样性。

(3) Dying ReLU 问题
ReLU 函数在输入小于0时恒输出0,可能导致神经元“死亡”——即神经元永远不会激活,无法对模型做出贡献,尤其在较大学习率时更加显著。

  • 解决方案:使用 ELU 等,这些激活函数在负值区域具有小的负斜率,可以避免神经元完全“死亡”。

(4) 梯度爆炸
梯度在反向传播中逐层累积放大,最终导致梯度值过大,使得模型权重更新过大而导致训练不稳定。深层网络在反向传播时更易出现此问题。

  • 解决方案:在反向传播时使用梯度裁剪;添加残差连接来跳过一些层,减少梯度的累积;减小学习率以平缓参数更新。

关键优化方法

  • 梯度裁剪:限制梯度在反向传播中的最大值,防止梯度爆炸。
  • 残差连接:跳过若干层直接连接,减少梯度累积,提升训练稳定性。
  • 调整学习率:合理选择学习率,避免过大或过小带来的训练不稳定。

选择合适的激活函数并合理控制梯度传播,是提升神经网络训练效果的关键。不同任务和模型结构对激活函数的选择需求不同,理解并控制激活函数的梯度传播特点,能够显著提升深层神经网络的性能与收敛速度。


在初步理解了阶层型神经网络的层级结构之后,我们需要进一步关注其底层的实现方式以及如何有效地调整超参数。

这包括模型结构的细节构建、参数初始化、正则化策略的选择、神经元数量的配置、激活函数的应用,以及优化算法的设置。这些底层实现和超参数的合理调整,直接决定了模型的学习效果和泛化能力,是构建高性能神经网络的关键所在。

后面将以MNIST为例子说说从零开始利用python实现神经网络。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐