ICS问题
“内部协变量偏移”(Internal Covariate Shift)
- 每一层的参数更新:
- 在深度神经网络中,每一层都有自己的参数(例如权重和偏置)。
- 在训练过程中,参数会通过反向传播和梯度下降法不断更新。
- 上层的输入数据分布变化:
- 每一层的输出是下一层的输入。当一层的参数更新时,它的输出分布会发生变化,从而导致下一层的输入分布发生变化。
- 这种现象在多层网络中会逐层传递,导致高层的输入分布也随之变化。
- 高层的输入分布变化非常剧烈:
- 由于层与层之间的叠加效应,高层输入分布的变化会被放大,变得更加剧烈。
- 这种剧烈变化会导致高层网络难以稳定学习,因为输入分布不断变化,高层需要不断调整自身参数去适应新的分布。
- 高层需要不断重新适应底层的参数更新:
- 由于底层参数的更新会导致上层输入分布的变化,高层网络需要不断重新调整自己的参数来适应这种变化。
- 这会使得训练过程变得不稳定,收敛速度变慢,甚至可能导致训练失败。
ICS会导致什么问题
不符合独立同分布,影响模型准确性
由于参数更新的原因,导致每层输入的特征分布,不再独立同分布
机器学习中有个很重要的假设:独立同分布假设,就是假设训练数据和测试数据是满足相同分布的,这是通过训练数据获得的模型能够在测试集获得好的效果的基本保障
对应的一个例子是黑猫白猫。我们用黑猫和非猫做正负样本来训练判别猫的模型,然后在橘猫上测试,结果就会不好
容易陷入激活层的梯度饱和区
当下层输入的变化可能出现扩大或缩小的情况时,这种 分布的不确定性 可能使得上层输入进入 激活函数的饱和区域(例如 Sigmoid 或 Tanh 函数的极端值部分),从而导致 梯度消失问题 的发生。
需要低学习率,降低了模型收敛速度
如前所说,由于输入变动大,上层网络需要不断调整去适应下层网络,因此这个时候的学习速率不宜设得过大,因为梯度下降的每一步都不是“确信”的。
ICS问题解决思路与方案
在不影响数据性质的前提下,使得每次参数更新前后
- 每层每个神经元的输入依然满足独立同分布
- 尽可能避免该分布下的数据,落入激活函数的饱和区 对于接下来要说的三个方案,前两个是改变分布,后一个是让激活函数去适应分布
知识补充:归一化/标准化
- 应对问题:不同特征量级不一样,导致各自的
w
的范围和比率不一样 - 原理:归一化/标准化本质上都是线性变换,这决定了对数据改变后不会造成"失效"(满足不影响数据性质的前提),反而能提高数据的表现
- 过程:将每个特征各自的分布,线性变换到均值为0,方差为1的标准正态分布上
- 归一化:归一化通常将数据缩放到一个固定的范围(如 [0, 1])
- $$x_{\text{归一化}} = \frac{x - x_{\text{min}}}{x_{\text{max}} - x_{\text{min}}}$$
- 标准化:标准化通过将数据转换为均值为 0、方差为 1 的分布
- $$x_{\text{标准化}} = \frac{x - \mu}{\sigma}$$
方案一:Normalization(Whiten)
- 对每层输入数据进行标准化处理,不止对输入做处理,而是每一层的输入都做处理,将分布变换至均值为0方差为1的标准正态分布,这个时候满足了 “每层每个神经元的输入依然满足独立同分布” 这个条件
- 另一个需要满足的条件是 “同时使得激活输入值落在非线性函数对输入比较敏感的区域”,可以看到Normalization以后,会落入sigmoid中间线性的区域,也就是所谓的对输入比较敏感的区域
方案二:Batch Normalization
基于Normalization的缺点
但是!!! 如果把数据映射到标准正态之中,数据几乎就是落入sigmoid的线性区间,其实就失去了激活函数的能力。为了保证非线性表达能力,后面又对此打了个补丁,对变换后的满足均值为0方差为1的x进行了scale加上shift操作,形成类似y=scale*x+shift
这种形式,参数通过训练进行学习,把标准正态分分布左移或者右移一点,并且长胖一点或者变瘦一点,将分布从线性区往非线性区稍微移动,希望找到一个线性和非线性的较好平衡点度:既能享受非线性的较强表达能力,又能够享受线性区较大的下降梯度,这就是BN的思路由来。
BN庐山真面目
$$\hat{x} = \frac{x - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}}$$ $$y = \gamma \hat{x} + \beta$$
- $x$:输入数据(通常是某一层的输出)
- $\mu_B$:当前 mini-batch 的均值
- $\sigma_B$:当前 mini-batch 的标准差
- $\epsilon$:一个很小的常数,用于避免除零错误
- $\hat{x}$:归一化后的数据
- $\gamma$ 和 $\beta$:可学习的缩放参数和平移参数
- $y$:批量归一化后的输出
为什么要设置不同的分布
归一化后,$x$的分布都是均值为0,方差为1,输入到激活函数,就会分布在激 活函数的线性区域。而我们希望多利用激活函数的非线性特性,帮助我们 训练出泛化能力更强的模型,所以不能让值都集中在线性区间。
因此,给每层$x$找到合适的分布,能提高模型的泛化能力与精度,同时加快训练速度。
方案三:自适应激活函数
上面都是改变输入数据的分布,另一种方案是改变激活函数,让激活函数自适应输入数据