深度学习与神经网络调参实战
约 1444 字大约 5 分钟
深度学习与神经网络调参实战
一、深度学习与深度神经网络
- 深度学习:通过不断增加神经网络的隐藏层神经元,对输入数据进行逐层抽象和理解,最终构建一个具有泛化能力的预测模型。
- 深度神经网络:通常指隐藏层超过三层的神经网络。
二、TensorFlow Playground 实验分析
这是一个可视化神经网络学习过程的在线工具,有助于理解网络结构与参数调整。
2.1 界面与功能区域
- 控制区域:设置与运行控制。
- 数据集区域:选择训练数据。
- 可视化区域:观察网络结构、数据分布及决策边界。
2.2 不同数据集的分类实验
1. 数据集一:线性可分数据
- 特点:数据点可被一条直线完美分开。
- 解决方案:仅需一个输出层神经元(无隐藏层)即可完成分类。
- 激活函数:Sigmoid。
2. 数据集二:异或(XOR)数据
- 问题背景:历史上曾因单层感知机无法解决此问题而导致AI研究陷入低谷。
- 特点:数据呈“异或”逻辑分布(相同为0,不同为1)。
- 解决方案:需要至少一层包含三个神经元的隐藏层。
- 思考题:为什么是三个神经元?(提示:从组合闭合决策边界的角度思考)
3. 数据集三:圆形分布数据
- 特点:一类数据点被另一类数据点环形包围。
- 解决方案:需要至少一层包含三个神经元的隐藏层。
- 单个神经元的决策边界是一条直线。
- 两个神经元的决策边界是两条直线,无法在平面内形成闭合图形。
- 三个神经元的决策边界(三条直线)可以组合成一个闭合形状(如三角形),再经输出层汇合,即可实现环形分类。
4. 数据集四:螺旋形分布数据
- 特点:数据复杂度高,呈螺旋状交织。
- 解决方案:需要更深的网络(多层隐藏层)和更多的神经元。
- 实验配置:
- 网络结构:3层隐藏层,每层8个神经元。
- 激活函数:隐藏层使用 ReLU,输出层使用 Sigmoid(用于二分类)。
- 关键发现:对于复杂数据,简单的网络(如一层隐藏层)表现“疲软”,深度网络通过大量参数调整,能学习到复杂的抽象特征,但可解释性变差。
三、核心概念:激活函数
激活函数为神经网络引入非线性,是模型能够拟合复杂函数的关键。
3.1 Sigmoid 函数
- 公式:
σ(z) = 1 / (1 + e^(-z)) - 优点:
- 输出范围在(0, 1),适合作为输出层的概率输出(二分类)。
- 处处可导。
- 致命缺点:梯度消失
- 在输入值
z很大或很小时,函数曲线趋于平缓,导数接近于0。 - 在深度网络反向传播时,梯度会逐层衰减,导致深层网络参数难以更新,训练停滞。
- 在输入值
3.2 ReLU 函数
- 公式:
ReLU(z) = max(0, z) - 优点:
- 在
z > 0时,导数为1,有效缓解了梯度消失问题。 - 计算简单,收敛速度快。
- 在
- 缺点:死亡 ReLU 问题
- 当
z <= 0时,输出和导数均为0。 - 导致部分神经元可能永久“死亡”,权重无法再更新。
- 当
- 改进版:Leaky ReLU 等,在
z < 0时给予一个很小的斜率,避免神经元完全死亡。
3.3 激活函数选择经验
- 隐藏层:ReLU 应作为首选激活函数,因其能有效加速训练并缓解梯度消失。
- 输出层(二分类):Sigmoid 因其输出在[0,1]区间,仍是最佳选择之一。
四、Keras 实战:搭建深度神经网络
使用Keras框架构建深度网络拟合螺旋形数据集。
4.1 网络结构解析
使用 model.get_weights() 可以查看网络参数,揭示了Keras的底层逻辑:
- 权重矩阵 (Weights):连接相邻两层神经元的参数。
- 偏置向量 (Biases):每层神经元附加的偏置参数。
- 计算过程:
输出 = 激活函数(输入 · 权重^T + 偏置),本质仍是线性组合+非线性激活。
4.2 构建深度网络
- 任务:拟合螺旋形数据集。
- 结构:
- 输入层:2个神经元(对应数据两个特征)。
- 隐藏层:3层,每层8个神经元,激活函数为 ReLU。
- 输出层:1个神经元,激活函数为 Sigmoid。
- 效果:经过训练(如5000个epoch),模型能学习到复杂的决策边界,成功分类螺旋数据。
总结
本节课通过 TensorFlow Playground 的直观演示和 Keras 的代码实践,深入探讨了深度神经网络的工作原理与调参要点:
- 网络深度与数据复杂度:简单问题(线性可分)可用浅层网络,复杂问题(螺旋分布)需要更深的网络和更多神经元。
- 激活函数的核心作用:为网络注入非线性。ReLU 因其能有效缓解梯度消失,已成为隐藏层的标准选择;Sigmoid 则因其输出特性,常用于二分类输出层。
- 调参的意义:通过对学习率、网络层数、神经元数量、激活函数等超参数的调整,可以大致引导神经网络的学习行为,但其内部具体如何抽象特征,仍缺乏精确的数学解释。
- 框架的便利性:如Keras等高阶API封装了底层复杂的矩阵运算和求导过程,让开发者能专注于模型结构的设计与实验。
