为什么需要残差?一个来自DeepNet的视角

文章讨论了深度学习中‘增量爆炸’现象,即层数增加时参数微小变化导致损失函数剧烈波动。Wamrup策略通过初始小学习率缓解此问题,但并非根本解决方案。文章提倡通过修改模型结构,如使用残差网络,来自然抵消层数对更新量的影响,以实现更稳定深层模型的训练。

简单来说,“增量爆炸”就是在层数变多时,参数的微小变化就会导致损失函数的大变化,这对于模型的训练,特别是初始阶段的训练时尤其不利的。对此,一个直接的应对技巧就是Wamrup,初始阶段先用极小的学习率,然后再慢慢增大,避免在初始阶段学习过快。待模型平稳渡过初始阶段的“危险期”后,就可以正常训练了。

然而,尽管Wamrup能起到一定的作用,但其实是“治标不治本”的,因为“参数的微小变化就会导致损失函数的大变化”意味着模型本身的抖动很大,用更专业的话说就是模型的landscape极度不平滑了,这不是一个好模型应该具备的性质。因此,我们应该通过修改模型来解决这个问题,而不是通过降低学习率这种“表面”方法。

所谓修改模型,就是通过调整模型结构或初始化方式,来自然地抵消层数N对更新量的影响。残差结构是可以同时稳定前向传播和反向传播、并且可以缩放参数梯度以解决增量爆炸的一种设计,它能帮助我们训练更深层的模型。

以下转载自https://kexue.fm/archives/8994
在这里插入图片描述

<think>我们面对的问题是:在数据非正态、重尾,且残差非正态、异方差的情况下,能否通过将残差变换为高斯分布,然后用高斯过程拟合变换后的残差? 首先,回顾一下用户的问题背景: - 原始数据分布是非正态且重尾的。 - 在给定均值函数后,残差仍然是非正态分布并且具有异方差性。 - 用户希望使用高斯过程(GP)进行拟合,但标准GP假设噪声是独立同分布的高斯噪声(即同方差且正态)。 用户提出的解决方案:对残差进行变换,使其成为高斯分布,然后对变换后的残差用高斯过程建模。 这个思路是可行的,但要注意以下几个关键点: ### 1. **残差变换的可行性** 我们可以对残差进行变换(如Box-Cox变换)使其接近高斯分布。但需要注意的是: - 残差变换必须使用与响应变量变换相同的原则,因为残差是响应变量与预测均值之差。 - 残差变换后,我们是在变换后的空间建模,因此预测结果需要反变换回到原始空间。 ### 2. **步骤概述** (1) 首先,我们用一个初始的均值函数(比如常数均值或线性模型)拟合数据,得到残差$r_i = y_i - \mu(x_i)$。 (2) 然后,我们对残差进行变换:$z_i = g(r_i)$,使得$z_i$近似服从高斯分布(可以使用Box-Cox变换或其他变换)。 (3) 接下来,我们使用高斯过程对变换后的残差$z_i$进行建模,假设$z$是一个高斯过程: $$ z = f(x) + \epsilon $$ 其中$\epsilon$是独立同分布的高斯噪声(均值为0,方差为$\sigma^2$),而$f(x)$是一个高斯过程(均值为0,协方差函数为$k(x,x')$)。 (4) 在预测时,我们需要先预测$x_*$处的变换残差$z_*$,然后反变换得到残差的预测:$r_* = g^{-1}(z_*)$,最后得到预测值:$y_* = \mu(x_*) + r_*$。 ### 3. **注意事项** - **变换的选择**:常用的变换包括Box-Cox变换、Yeo-Johnson变换、对数变换等。需要根据残差的分布特性选择。Box-Cox变换要求数据为正,如果残差有负值,则可以考虑Yeo-Johnson变换。 - **变换参数的估计**:变换参数(如Box-Cox的$\lambda$)需要通过最大似然估计等方法确定,目标是使得变换后的数据最接近高斯分布。 - **均值函数的准确性**:初始的均值函数$\mu(x)$需要尽可能准确,否则残差中可能包含本应由均值函数捕获的结构,导致变换后仍有模式未捕获。 - **异方差的处理**:残差的异方差性可能会影响变换的效果。如果异方差性很强,可能需要考虑在变换后仍然对方差进行建模(例如,使用复合核或非高斯似然),或者采用加权变换。 - **变换的可逆性**:变换$g$必须是可逆的,以保证反变换的唯一性。 - **预测的不确定性传播**:在反变换时,变换后的高斯过程预测的不确定性(均值和方差)需要正确地传播到原始空间。由于变换通常是非线性的,预测分布可能会变得非高斯,因此我们需要进行近似(如使用Delta方法)或采用蒙特卡洛采样来获取预测区间。 ### 4. **具体步骤** #### 步骤1: 拟合初始均值函数 选择一个简单的模型(如线性回归或多项式回归)拟合$y$与$x$的关系,得到预测值$\hat{\mu}(x)$,并计算残差: $$ r_i = y_i - \hat{\mu}(x_i) $$ #### 步骤2: 残差变换 对残差进行变换,例如Box-Cox变换: $$ z_i = g(r_i, \lambda) = \begin{cases} \frac{r_i^\lambda - 1}{\lambda} & \lambda \neq 0 \\ \ln(r_i) & \lambda = 0 \end{cases} $$ 其中$\lambda$通过最大似然估计选择,使得变换后的$z_i$尽可能服从正态分布。 #### 步骤3: 用高斯过程建模变换后的残差 将$(x_i, z_i)$作为新的训练数据,使用标准高斯过程回归(高斯似然)进行建模: $$ z \sim \mathcal{GP}(0, k(x,x')) $$ 这里假设变换后的残差在输入空间上是平稳的。 #### 步骤4: 预测与反变换 对于新的输入$x_*$,预测其变换残差$z_*$的均值和方差(记为$\mu_z(x_*)$和$\sigma_z^2(x_*)$)。然后通过反变换得到原始残差的预测: $$ r_* = g^{-1}(z_*) = \begin{cases} (\lambda z_* + 1)^{1/\lambda} & \lambda \neq 0 \\ \exp(z_*) & \lambda = 0 \end{cases} $$ 最终预测值为: $$ y_* = \hat{\mu}(x_*) + r_* $$ 但是,由于反变换是非线性的,$r_*$的分布是非高斯的,因此我们需要考虑不确定性传播。通常,我们通过蒙特卡洛方法: - 从$z_*$的后验分布中采样多个$z_*^{(s)} \sim \mathcal{N}(\mu_z(x_*), \sigma_z^2(x_*))$,$s=1,...,S$ - 对每个样本进行反变换:$r_*^{(s)} = g^{-1}(z_*^{(s)})$ - 计算$y_*^{(s)} = \hat{\mu}(x_*) + r_*^{(s)}$ - 用这些样本的均值和分位数作为预测和预测区间。 ### 5. **优缺点分析** **优点**: - 将非正态、重尾的残差转换为高斯分布,满足高斯过程的假设。 - 可以部分缓解异方差问题(如果变换同时稳定了方差)。 - 利用高斯过程在变换空间建模,可以捕捉残差中的复杂模式。 **缺点**: - 初始均值函数的选择可能不充分,导致残差中仍然包含可预测的结构,这时可能需要迭代方法(例如,用GP拟合残差后,更新均值函数,再重新计算残差,反复进行)。 - 变换参数估计和模型拟合分开进行,可能导致次优结果(可以考虑联合优化)。 - 反变换时的不确定性传播需要额外计算(如蒙特卡洛采样)。 - 如果残差的异方差性很强,简单的变换可能无法完全消除异方差,此时变换后的残差可能仍存在异方差,需要进一步处理(例如,在GP中使用非平稳核)。 ### 6. **与之前回答的联系** 在之前的回答中,我们提到了数据变换(如Box-Cox变换)是处理非正态性和重尾的一种方法。这里将变换应用于残差,本质上类似,但操作对象不同:之前是对整个响应变量$y$进行变换,这里是对残差进行变换。残差变换的好处在于保留了均值函数的结构,而响应变量变换可能会改变均值函数的形式。 ### 7. **替代方案** 如果残差变换效果不佳(例如,变换后仍不满足高斯假设),可以考虑: - 使用非高斯似然的高斯过程(如Student-t似然),直接对原始残差建模[^3]。 - 采用变分高斯过程(VGP)或期望传播(EP)来近似非高斯后验。 ### 结论 可以这样做:通过对残差进行变换使其高斯化,然后在变换后的空间使用高斯过程建模。但需要注意变换的选择、参数估计、反变换时的不确定性传播,以及初始均值函数的充分性。如果操作得当,这是一种有效的方法。 --- §§相关问题§§ 1. 如何选择残差变换的最佳参数(如Box-Cox变换的$\lambda$)? 2. 反变换时如何准确传播不确定性? 3. 残差变换与直接对响应变量变换相比有何优劣? 4. 如果残差变换后仍存在异方差,该怎么办? </think>在数据分布非正态且重尾、残差非正态且异方差的情况下,**可以尝试将残差变换为高斯分布后再用高斯过程拟合**,但这种方法需要谨慎处理技术细节和潜在问题。以下是系统化的分析和实施建议: --- ### 一、残差变换的可行性分析 1. **核心原理** 通过变换使残差近似服从高斯分布,满足标准GP的高斯似然假设: $$ \begin{aligned} &r_i = y_i - \mu(\mathbf{x}_i) \quad \text{(原始残差)} \\ &z_i = g(r_i) \quad \text{其中 } z_i \sim \mathcal{N}(0, \sigma^2) \end{aligned} $$ 然后在变换空间拟合$z_i$的GP模型[^1]。 2. **适用条件** - 残差分布形态稳定(如偏斜方向一致) - 变换函数$g(\cdot)$需满足可逆性(保证预测可反变换) - 异方差性可通过变换缓解(如方差随均值单调变化) --- ### 二、关键实施步骤 #### 步骤1:选择变换函数 | 变换类型 | 公式 | 适用场景 | |----------------|--------------------------------|------------------------------| | **Box-Cox** | $$ z = \frac{r^\lambda - 1}{\lambda} $$ | 正数残差,$\lambda$优化尾部 | | **Yeo-Johnson**| $$ z = \begin{cases} \frac{(r+1)^\lambda -1}{\lambda} & r \geq 0 \\ \frac{1 - (1-r)^{2-\lambda}}{2-\lambda} & r < 0 \end{cases} $$ | 含负值残差 | | **分位数归一化**| $$ z = \Phi^{-1}(F_n(r)) $$ | 任意分布,强制高斯化 | > 通过MLE优化$\lambda$或ECDF估计$F_n$[^1] #### 步骤2:拟合变换后残差的GP $$ z(\mathbf{x}) \sim \mathcal{GP}\left(0, k(\mathbf{x}, \mathbf{x}')\right) $$ - 协方差核$k$选择:优先使用**马氏核**(如自动相关性确定ARD-RBF)处理异方差: $$ k_{\text{ARD}}(\mathbf{x}_i,\mathbf{x}_j) = \sigma_f^2 \exp\left( -\sum_{d=1}^D \frac{(x_{id}-x_{jd})^2}{2l_d^2} \right) $$ #### 步骤3:预测与反变换 1. 预测变换空间: $$ z_* | \mathbf{X}, \mathbf{z}, \mathbf{x}_* \sim \mathcal{N}(\mu_z, \sigma_z^2) $$ 2. **反变换关键**: - 单点预测:$ r_* = g^{-1}(z_*) $ - 不确定性传播:需Jacobian校正 $$ p(r_*) = p(z_*) \cdot \left| \frac{dg^{-1}}{dz} \right| $$ - 蒙特卡洛采样(推荐): ```python z_samples = np.random.normal(mu_z, sigma_z, 1000) r_samples = g_inv(z_samples) # 反变换 r_mean = np.mean(r_samples) r_std = np.std(r_samples) ``` --- ### 三、潜在问题与解决方案 | 问题 | 风险 | 解决方案 | |-------------------------|-------------------------------|------------------------------| | **变换失效** | 尾部仍厚重/多峰 | 改用Student-t似然GP[^3] | | **异方差残留** | 变换后方差仍依赖$\mathbf{x}$ | 添加方差过程:<br> $k_\sigma(\mathbf{x}_i,\mathbf{x}_j) = \mathbf{x}_i^\top \mathbf{x}_j$ | | **反变换偏差** | 期望$E[g^{-1}(z)] \neq g^{-1}(E[z])$ | 蒙特卡洛采样替代解析解 | | **计算不稳定** | $\lambda \to 0$或边界值 | 正则化$\lambda$先验$p(\lambda)$ | > 建议:通过**分位数图**验证变换后残差$z_i$的正态性[^1] --- ### 四、与替代方法的对比 | 方法 | 优势 | 劣势 | |---------------------|-------------------------------|-------------------------------| | **残差变换+GP** | 保持GP解析推断效率 | 变换选择敏感,反变换复杂 | | **直接Student-t似然**| 自然处理重尾,无需变换 | 推断需MCMC,计算成本高10倍[^3] | | **深度核GP** | 自动学习表示,缓解异方差 | 训练不稳定,超参调优复杂 | > **推荐策略**:先尝试Box-Cox/Yeo-Johnson变换,若QQ图未达标则切換到Student-t似然GP --- ### 五、完整代码框架(Python) ```python import numpy as np from scipy import stats from sklearn.preprocessing import PowerTransformer from gpflow.models import GPR from gpflow.kernels import RBF # 1. 计算初始残差 (使用简单均值函数) mu = np.mean(y_train) # 或更复杂的均值函数 r_train = y_train - mu # 2. 残差变换 (Yeo-Johnson) transformer = PowerTransformer(method='yeo-johnson', standardize=True) z_train = transformer.fit_transform(r_train.reshape(-1, 1)).flatten() # 3. 拟合GP (使用自动微分优化) kernel = RBF(lengthscales=[1.0] * X_train.shape[1]) model = GPR(data=(X_train, z_train), kernel=kernel, noise_variance=0.01) opt = gpflow.optimizers.Scipy() opt.minimize(model.training_loss, model.trainable_variables) # 4. 预测与反变换 z_mean, z_var = model.predict_f(X_test) z_samples = np.random.normal(z_mean, np.sqrt(z_var), 1000) # 蒙特卡洛反变换 r_samples = transformer.inverse_transform(z_samples.reshape(-1, 1)).reshape(1000, -1) y_samples = r_samples + mu # 添加均值函数 # 计算预测统计量 y_pred = np.median(y_samples, axis=0) y_lower = np.percentile(y_samples, 2.5, axis=0) y_upper = np.percentile(y_samples, 97.5, axis=0) ``` --- ### 结论 **可以实施残差变换+GP方案,但需严格验证**: 1. 优先选择参数化变换(Box-Cox/Yeo-Johnson) 2. 必须用蒙特卡洛处理反变换不确定性 3. 通过QQ图诊断变换后正态性 4. 若变换后仍有厚尾/异方差,切换到Student-t似然GP[^3] > 该方法在金融波动率预测、地质异常检测等重尾场景中验证有效[^1][^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值