为什么深层神经网络难以训练

本文探讨了深层神经网络训练困难的原因,主要聚焦于消失梯度和梯度不稳定性问题。通过分析梯度消失和梯度爆炸现象,揭示了深层网络中学习速度不一致的根本原因。此外,还提到了深度学习面临的其他障碍,如激活函数选择、权重初始化和优化算法的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Chapter5 为什么深层神经网络难以训练

Intuitively we’d expect networks with many more hidden layers to be more powerful.
原文链接:http://neuralnetworksanddeeplearning.com/chap5.html

一、消失的梯度

图片名称

这些条表示了每个神经元上的dC/db,也就是代价函数关于神经元的偏差更变的速率(作为学习速率的一种衡量)。

图片名称

前面的隐藏层的学习速度要低于后面的隐藏层(hard to train),这个现象也被称作是消失的梯度问题(vanishing gradient problem)。

二、神经网络中的梯度不稳定性

1.梯度消失问题

极简单的深度神经网络(3个隐藏层):
简单深度神经网络结构
分析可得:

除了最后一项,该表达式是一系列形如 wjσ(zj) 的乘积。为了理解每个项的行为,画出 σ(z) 图像如下:
这里写图片描述

导数最大值: σ(0)=1/4 ,初始化权重: |wj|<1

### 浅层与深层卷积神经网络训练效率对比分析 #### 性能差异 浅层卷积神经网络通常具有较少的参数量和较低的计算复杂度,这使其在小型数据集上的表现较为高效[^4]。然而,在面对更大的数据集或更复杂的任务时,其表达能力可能不足,难以捕捉到高层次的特征表示。 相比之下,深层卷积神经网络通过增加层数能够提取更加抽象和丰富的特征,从而显著提高模型的表现力。例如,AlexNet相比LeNet不仅加深了网络结构,还引入了多个连续堆叠的卷积层以及ReLU激活函数等改进措施,这些设计极大地提升了模型对于大规模数据集的学习能力和泛化性能[^3]。不过,这种增强是以更高的计算成本为代价的,因为随着网络深度的增加,所需的浮点运算次数也会大幅上升,进而延长整个训练过程所需的时间长度[^2]。 #### 资源消耗情况 从资源利用角度来看,较简单的架构如LeNet可以在有限硬件条件下快速完成迭代更新操作而无需过多等待时间;但对于那些追求极致精确率的大规模应用场景来说,则往往倾向于选用像AlexNet这样的深层数组形式来进行建模工作尽管如此这般做会带来额外的能量开销问题比如电力供应方面的要求变高等等方面因素都需要被纳入考虑范围之内另外值得注意的是当涉及到GPU加速技术运用与否也将直接影响最终得出结论即是否值得为了获得更好一点的结果而去牺牲掉部分执行速度或者购置昂贵设备等问题都需仔细权衡利弊后再作出决定[^1]. #### 实际案例说明 具体而言,如果仅以MNIST手写数字识别为例的话那么采用相对简易版本即可满足需求没有必要动辄就搬出重型武器来对付轻量级对手毕竟后者可能会造成不必要的浪费现象发生与此同时我们还可以观察到即便是在CIFAR-10这样稍微复杂一些的数据集合当中只要合理配置超参设定再加上适当预处理手段之后即便是基础款型也能交出一份令人满意的答卷成绩出来当然前提是使用者本身具备足够的经验积累和技术储备才行. ```python import tensorflow as tf from tensorflow.keras import layers, models def create_shallow_cnn(input_shape): model = models.Sequential() model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=input_shape)) model.add(layers.MaxPooling2D((2, 2))) model.add(layers.Flatten()) model.add(layers.Dense(10, activation='softmax')) return model def create_deep_cnn(input_shape): model = models.Sequential() model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=input_shape)) model.add(layers.MaxPooling2D((2, 2))) model.add(layers.Conv2D(64, (3, 3), activation='relu')) model.add(layers.MaxPooling2D((2, 2))) model.add(layers.Conv2D(64, (3, 3), activation='relu')) model.add(layers.Flatten()) model.add(layers.Dense(64, activation='relu')) model.add(layers.Dense(10, activation='softmax')) return model ``` 上述代码展示了如何构建一个简单版CNN与稍深入些的设计方案供读者参考学习之用其中前者仅有单一卷积加最大值采样组合而成而后者的特色在于多出了好几轮类似的单元重复叠加在一起形成更为错综复杂的整体框架结构以便更好地适应不同类型的输入样本特性变化趋势规律等等.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值