从模型评估、梯度难题到科学初始化:一步步解析深度学习的训练问题
偏差 方差要理解模型的泛化能力我们首先要量化它的“泛化误差”即模型在未知数据上的表现。然而泛化误差并非一个单一的问题它源于三种不同性质的错误模型固有的近似能力不足、对训练数据的过度敏感、模型数据本身的不可约噪声。偏差 - 方差分解公式规定data(,)Pdata(x,y)数据生成分布D从dataPdata中独立同分布采样得到的训练数据集(;)f(x;D)由训练集 D 学得的模型 f 对 x 的预测输出。‾()f(x)∼data⊗[(;)]ED∼Pdata⊗n[f(x;D)]对所有可能训练集的期望∼data⊗[⋅]ED∼Pdata⊗n[⋅]对训练集采样的期望有∣[((;)−)2]Bias2(())Var(())2Ey∣xED[(f(x;D)−y)2]Bias2(f(x))Var(f(x))σϵ2其中Bias2(())Bias2(f(x))偏差反映模型拟合能力。设真实函数为 ℎ()[∣]h(x)E[y∣x]条件期望则偏差应定义为 (‾()−ℎ())2(f(x)−h(x))2Var(())Var(f(x))方差反映不同数据集表现波动情况即泛化能力:[((;)−‾())2]:ED[(f(x;D)−f(x))2]2σϵ2噪声反映学习难度:[(−ℎ())2]:E[(y−h(x))2]这里正好对应两种模型线性拟合 vs. 神经网络若线性拟合模型容量低并且假设空间简单即大偏差小方差泛化误差大欠拟合。若复杂度过高的神经网络如未正则化会学到训练数据中的噪声导致在训练数据上表现很好小偏差但在未见过的数据上表现波动很大大方差泛化误差大过拟合。若复杂度适中的神经网络中等偏差中等方差泛化误差小最佳了。得出结论偏差大欠拟合意味着模型能力不足未能捕捉数据中的真实模式方差大过拟合意味着模型过于复杂对训练数据中的噪声和随机波动过度敏感。影响偏差与方差的三大因素1. 学习算法能力模型复杂度如果模型欠拟合偏差大就换更复杂的模型如果过拟合方差大就换更简单的模型或对复杂模型做正则化。2. 训练数据量可间接降低偏差对方差影响大如果模型过拟合方差大优先增加训练数据。3. 学习任务本身的难度任务复杂度如果任务简单但方差大就控制模型复杂度或增加数据如果任务复杂导致偏差大就提升模型复杂度处理模型高偏差、高方差的一些方法欠拟合高偏差应该换更复杂的模型、增加特征维数、仔细判断训练误差是否收敛到最低。过拟合高方差应该增加训练数据、正则化如使用L1正则化、L2正则化即权重衰减、Dropout等、批量归一化、剪枝降复杂度、降低特征维度。偏差-方差权衡偏差与方差通常是对立的提高模型复杂度可以减少偏差但可能增加方差反之降低模型复杂度可以减少方差但偏差可能会升高。这种权衡关系被称为偏差-方差权衡Bias-Variance Tradeoff在此我们应该拓展一下经典理论认为模型复杂度如参数数量增加泛化误差会先因偏差降低而下降后因方差增大而上升形成单一的U型曲线。双重下降则揭示了在插值阈值模型刚好能完美拟合训练数据后随着复杂度进一步增加误差会再次下降形成“下降-上升-下降”的波浪形曲线。在过参数化区域模型并非必然过拟合到更差的程度优化过程会引导其找到一个泛化良好的解。在过参数化体制下模型好像是先“记忆”拟合噪声后通过漫长的优化过程“逐渐获得”泛化规则。其实真正的原因是隐式正则化使得优化算法如SGD倾向于找到最小范数解或平坦极小值这告诉我们如果观察到增加模型参数后性能先变差不要立即止步。这可能只是处于插值阈值附近的危险区。继续增加规模并配合足够的训练性能可能会突破并变得更好。理解了模型的误差问题由偏差、方差间的权衡决定我们大体了解如何选择模型的复杂度。但是当我们着手训练一个复杂深层模型尤其是现代网络层数不断加深时我们应该考虑训练本身是否能够正常进行否则结果上的“偏差、方差”都成空谈。这就引出了深度学习中的梯度问题。梯度问题我们可以认为ℎ()(ℎ(−1))h(l)fl(h(l−1))因此∘−1∘…∘2∘1()ofL∘fL−1∘…∘f2∘f1(x)那么不难得到∂()∂ℎ(−1)ℎ()⏟()def⋅…⋅∂ℎ()ℎ(1)⏟(1)def∂()ℎ()⏟()def.∂W(l)oM(L)def∂h(L−1)h(L)⋅…⋅M(l1)def∂h(l)h(l1)v(l)def∂W(l)h(l).也因此梯度 ∂()∂W(l)o 是 (−)(L−l) 个雅可比矩阵 (),…,(1)M(L),…,M(l1) 与一个二维张量 ()v(l) 的乘积。在深层网络中连续矩阵乘法可能导致结果数值过大爆炸或过小消失。梯度消失如果使用Sigmoid函数就要考虑 Sigmoid 函数在其饱和区梯度逼近于零的情况。因此当输入很大或很小时梯度消失。为此我们最好用ReLU函数替代之。如果每一次的 梯度都减小一点那么多层传播后梯度值会非常小。如果权重的初始值太小向前传播过程中每层线性变换的输出方差大幅衰减进而使激活函数的输入落入该函数的危险区如 Sigmoid 的饱和区、ReLU的斩杀区。梯度爆炸特指反向传播过程中梯度值随着层级增加而不断变大乃至指数型增加。很可能因为 ℎweight 的初始值太大层数过多等等参数化的对称性若同一层内的的所有权重均初始化为相同值那么该层所有的神经元在反向传播中都会获得完全一样的梯度永远学习相同的特征极大降低模型容量。那么如何为我们模型的训练提供一个良好、稳健的起点呢这就是神经网络参数初始化的showtime了。良好的初始化方式能够前向传播中保持传递强度在反向传播中保证梯度流动从而打破上文的参数化的对称性等等问题。三种常见的初始化Xavier初始化目标保持各层激活值方差稳定确保前向传播的信号强度和反向传播的梯度强度在初始化时不衰减也不爆炸。Xavier 初始化因为提出的时间较早它主要针对像 ℎtanh 这样在原点附近近似线性且对称的饱和激活函数。因此对于后来广泛使用的 ReLU 及其变种它的效果并非最优。这里的3个函数都有饱和区也就是梯度消失的那段区域太大或太小时函数导数趋于 00 。这个理论的基本原则就是在前向传播中保持各层激活值的方差一致在反向传播中保持各层梯度的方差一致。 也就是说初始化阶段的激活值和梯度的期望均为 00。Xavier初始化是为 ℎtanh 这类在零点附近近似线性且对称的激活函数设计的对于 Sigmoid虽然 Xavier初始化可以用于 Sigmoid 但不是最优的。实际应用中对 Sigmoid 可以使用 Xavier初始化但可能需要调整缩放因子。用数学语言表述就是要激活函数在原点泰勒展开的一阶近似当然 x 也在 00 附近 ()f(x) 满足()−(−)即(0)0′(0)1f(x)−f(−x)即f(0)0f′(0)1再换句话由观察我们希望任意层的输入信号方差应等于其输出信号方差((−1))≈(())Var(a(l−1))≈Var(a(l))观察第 l 层的线性变换∑1()⋅(−1)zilj1∑ninwij(l)⋅aj(l−1)这里先基本假设一下权重 ()wij(l) 独立同分布均值为 00方差 2σw2激活值 (−1)aj(l−1) 独立同分布均值为 00方差 2σa2权重和激活值相互独立先看看期望[()][∑1()(−1)][()]∑1[()]⋅[(−1)][()]0E[zi(l)]E[zi(l)]E[zi(l)]E[j1∑ninwij(l)aj(l−1)]j1∑ninE[wij(l)]⋅E[aj(l−1)]0再看看方差先着眼于前向传播的过程(())[(())2]−([()])2[(())2][(∑1in()(−1))2][∑1in∑1in()()(−1)(−1)]…∑1[(())2]⋅[((−1))2] ()⋅2⋅2Var(zi(l))E[(zi(l))2]−(E[zi(l)])2E[(zi(l))2]E(j1∑ninwij(l)aj(l−1))2E[j1∑nink1∑ninwij(l)wik(l)aj(l−1)ak(l−1)]…j1∑ninE[(wij(l))2]⋅E[(aj(l−1))2] (jk)nin⋅σw2⋅σa2上文公式推导省略号中的内容当 ≠jk式子为 00当 jk式子为 ∑1[(())2]⋅[((1))2]∑j1ninE[(wij(l))2]⋅E[(aj(l1))2]因此求和中仅 jk 的项有贡献。为了保证激活方差不变即(())((−1))⋅2⋅22⋅21Var(zi(l))nin⋅σ2⋅σa2nin⋅σw2Var(aj(l−1))σa21接着推导一下反向传播反向传播的梯度传播公式如下∂∂(−1)∑1()⋅∂∂()∂aj(l−1)∂Li1∑noutwij(l)⋅∂zi(l)∂L那么假设 ∂∂()∂zi(l)∂L 独立同分布方差为 2σg2 可以得到梯度方差的表示(∂∂(−1))∑1[(())2]⋅[(∂∂())2]⋅2⋅2Var(∂aj(l−1)∂L)i1∑noutE[(wij(l))2]⋅E(∂zi(l)∂L)2nout⋅σw2⋅σg2我们希望反向传播前后梯度方差不变。即希望(∂∂(−1))(∂∂())Var(∂aj(l−1)∂L)Var(∂zi(l)∂L)那么就可以得到反向传播保持方差不变时应满足的条件⋅2⋅22⋅21nout⋅σw2⋅σg2nout⋅σw2σg21因此这种一下这两个条件取调和平均⋅21⋅2122nin⋅σw2nout⋅σw2σw211ninnout2即()2Var(w)ninnout2这样标准差就出来了2σninnout2因此初始权值应符合的正态分布∼(0,2)W∼N(0,σ2)或者转化为均匀分布形式即∼[−6,6]w∼U[−ninnout6,ninnout6]然而Xavier初始化提出的时间有点早ReLU激活函数还没有得到广泛应用。对于ReLU函数Xavier初始化力不从心ReLU的函数输出非对称∈[0,∞)y∈[0,∞)负的输入反向输出时梯度为 00会将 50%50% 的神经元输出清零从而前向传播()≈12()Var(a)≈21Var(y)反向传播梯度方差同样减半而且对于深层神经网络而言线性激活函数价值不大因为它需要非线性激活函数来构建复杂的非线性神经网络。面对这些问题He初始化Kaiming初始化被提了出来。Kaiming 初始化与 Xavier 初始化类似Kaiming 初始化的目的也是尽量让每一层输出层的方差与输入层的方差一致以缓解深层网络中的梯度消失、梯度爆炸问题最后使极深整流网络如30层能从零开始直接训练并收敛。对于向前传播Var()Var(∑1in⋅)input⋅Var()⋅Var()Var(yi)Var(j1∑ninwij⋅xj)ninput⋅Var(wij)⋅Var(xj)对yi加入ReLU函数得到ai那么我们就希望Var()≈Var(),∀,Var(ai)≈Var(xj),∀i,j这里的初始化假设与 Xavier 相同。因为 wij 与 xj 独立且均值为 00有Var()Var()Var()22Var(wijxj)Var(wij)Var(xj)σw2σx2则 yi 的方差为Var()Var(∑1)∑1Var()∑12222⋅Var()⋅Var()Var(yi)Var(j1∑ninwijxj)j1∑ninVar(wijxj)j1∑ninσw2σx2ninσw2σx2nin⋅Var(w)⋅Var(x)我们假设 yi 的分布是关于 0 对称的那么 yi 取正数和取负数的概率各占一半。再看 2yi2。因为平方把正负都变成了正数所以 2yi2 的期望值 [2]E[yi2] 可以拆成两半一半来自 0yi0一半来自 0yi0。由于对称这两半的贡献是一模一样的。而 ReLU 函数 max(0,)aimax(0,yi) 只取 yi 的正值部分负数部分直接归零。所以 2ai2 其实就是 2yi2 在 0yi0 时的值其他情况为 0。因此2ai2 的期望 [2]E[ai2] 正好就等于 2yi2 期望的一半即[2]12[2]E[ai2]21E[yi2]而 []0E[yi]0有 [2]Var()E[yi2]Var(yi)故[2]12Var()E[ai2]21Var(yi)当 ([])2(E[ai])2 相较于 [2]E[ai2] 可以忽略时可近似为Var()≈12Var()Var(ai)≈21Var(yi)我们希望 Var()Var()Var(ai)Var(x)当然至少得是近似的结合可得12⋅⋅()⋅()()()221⋅nin⋅Var(w)⋅Var(x)Var(w)Var(x)nin2以此类推可以得到反向传播时()2Var(w)nout2不过一般情况我们使用前向传播优先即∼(0,2)W∼N(0,nin2)我们为什么不常见类比Xavier做调和平均呢其实是可以的见 PyTorch 中的modefan_avg因为ReLU的单向激活特性使得前向传播和反向传播的方差传播规律不同对前向传播ReLU 杀死一半的神经元方差减半对反向传播相当于简单的伯努利掩码方差依旧减半。问题在于正向反向的网格结构可能是不同的且正向反向的衰减机制有席位差别。pytorch实现1234layer nn.Linear(64, 128) init.kaiming_normal_(layer.weight, a0, modefan_in, nonlinearityrelu) # a负斜率Leaky ReLU 的情况默认为0 # Leaky ReLU : 负x轴设置为 ax 而不是 0 通常 a 0.01正交初始化上面两种方法都是对每个权重分别进行随机独立采样但是由于采样的随机性仍不可避免出现各种梯度问题。对于一个 L 层的等宽线性网络可以很容易得到这个等式()(−1)(−2)⋯(2)(1)yW(L)W(L−1)W(L−2)⋯W(2)W(1)x那么我们可以直接将 ()W(i) 初始化为正交矩阵。根据线代知识我们对这个初始权重矩阵的构建分为两步用均值 00 , 方差 11 的高斯分布构建一个矩阵奇异值分解这个矩阵得到两个正交矩阵选择其中一个作为权重矩阵根据正交矩阵的性质这个线性网络就会在前向、反向传播中都有一定的范数保持性。如果这个网络是非线性的只需在矩阵前面乘上一个系数 ρ这个系数与激活函数有关如对于 ReLU 应该 2ρ2 对于 ℎtanh 应该 ≈1.0ρ≈1.0这是为了补偿激活函数对信号幅度的压缩扩张效应。更加现代的初始化方法Fixup可使在不使用批量归一化的情况下完成深度残差网络训练。通过缩放残差网络分支的权重来控制梯度规模避免深层网络的梯度爆炸方法
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2460370.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!