花书笔记|病态条件与产生原因

        病态条件(ill-conditioned)通常指在优化过程中某些问题的存在,这些问题会导致算法的数值不稳定性和训练过程中的困难。具体来说,病态条件在以下几个方面可能会出现:

一、病态条件类型

1、梯度爆炸和梯度消失

  • 梯度消失:在反向传播过程中,梯度会变得非常小,导致网络的权重更新非常缓慢,甚至可能停止更新。这在深层神经网络中尤其常见,特别是使用Sigmoid或Tanh激活函数时。
  • 梯度爆炸:在反向传播过程中,梯度变得非常大,导致权重更新幅度过大,从而导致数值溢出或者模型发散。

2、损失函数的平坦区域

  • 如果损失函数有非常平坦的区域,那么在这些区域中的梯度接近于零,优化算法可能会花费大量时间来穿越这些区域,从而导致训练速度极慢。

3、不良条件数

1)、定义

        一个矩阵 A 的条件数(condition number)可以定义为其范数(norm)与逆矩阵 A^{-1}  的范数的乘积。具体来说,矩阵 A 的条件数 \kappa (A) 定义为:

        也可通过奇异值定义,设 A 的奇异值为 \sigma _{i} (奇异值是奇异值分解后对角矩阵的对角元素),则条件数可以表示为最大奇异值与最小奇异值的比值:

2)、性质

        当矩阵 A 的条件数很大时,以为着矩阵 A 对小的输入变化非常敏感,会导致输出有较大变化,此时称矩阵 A 是病态的;若条件数接近于1, 意味着矩阵 A 对输入变化不敏感较为稳定,此时称为良态的。

3)、推导

        假设有二维矩阵 A ,其内容为:

        首先计算其奇异值,矩阵 A 的奇异值可以通过计算其特征值的平方根来得到:

        之后求解特征值:

        解得特征值 \sigma {_{max}} \approx 2,\sigma {_{min}} \approx 0.0002 ,进而求得 \kappa (A) = \frac{2}{0.0002} = 10000

        现在考虑输入向量 x:

        修改输入向量 x 为 x' ,添加一个极小项 \epsilon :

        我们发现,矩阵 A 导致极小变化 \epsilon 扩大了 10000 倍,即第二个分量的变化远小于第一个分量的变化。

4、权重初始化不当

        不恰当的权重初始化方式可能导致模型在训练初期即陷入病态条件。例如,所有权重初始化为相同的值会导致对称性破坏,进而影响模型的学习。

5、过度正则化

        正则化是防止过拟合的一种方法,但过度的正则化可能会导致模型参数缩减得过于激进,从而导致训练困难。

二、解决方法

1、使用适当的激活函数,如ReLU及其变种

  • ReLU:定义为 f(x) = max(0,x)。ReLU 的优点是计算简单,可以快速收敛,并且在正区间保持梯度不变。然而,它的一个缺点是当输入为负数时,梯度为零,可能导致神经元“死亡”。
  • Leaky ReLU:定义为 f(x) = max(0.01x,x)。通过允许负区间有一个小的斜率,Leaky ReLU 减少了“死亡”神经元的问题。
  • Parametric ReLU:类似于 Leaky ReLU,但负区间的斜率是可学习的参数。
  • ELU(Exponential Linear Unit):定义为 f(x)=x (x>0),f(x)=\alpha (e^x -1)(x\leq 0),其中 \alpha 是一个常数。ELU 在负区间有一个缓慢的指数衰减,能够减少梯度消失问题,同时保持对负输入的灵敏度。

2、使用适当的权重初始化方法,如He初始化或Xavier初始化

  • Xavier初始化:适用于Sigmoid和Tanh激活函数。它的基本思想是让输入和输出的方差相等,从而保持信号在层与层之间的传播。初始化权重时,Xavier方法使用均匀分布或正态分布,具体为:

  • He初始化:专为ReLU及其变种设计,He初始化的目标是让每层的输出方差保持不变。其初始化方式为:

3、使用批量归一化,合适的优化算法如Adam、RMSprop,使用梯度裁剪防止梯度爆炸

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, BatchNormalization, Activation

# 创建一个简单的模型
model = Sequential([
    Dense(64, input_shape=(784,)),
    BatchNormalization(),
    Activation('relu'),
    Dense(64),
    BatchNormalization(),
    Activation('relu'),
    Dense(10, activation='softmax')
])

# 编译模型
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])

# 或使用RMSprop优化器
# model.compile(optimizer='rmsprop', loss='sparse_categorical_crossentropy', metrics=['accuracy'])


# 打印模型总结
model.summary()

  • 11
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值