1 优化方法
|
|
梯度下降 |
SGD, Momentum, Nesterov, Adagrad, Adadelta, RMSprop, Adam, Adamax |
牛顿法 |
|
拟牛顿法 |
|
共轭梯度法 |
|
梯度下降
θ t = θ t − 1 + Δ θ t \theta_{t}=\theta_{t-1}+\Delta \theta_{t} θt=θt−1+Δθt
SGD
- 小批量随机梯度下降
g t = ∇ θ t − f ( θ t − 1 ) Δ θ t = − η × g t \begin{array}{c} g_{t}=\nabla_{\theta_{t-}} f\left(\theta_{t-1}\right) \\ \Delta \theta_{t}=-\eta \times g_{t} \end{array} gt=∇θt−f(θt−1)Δθt=−η×gt
- 每一次都计算mini-batch的梯度, 然后对参数进行更新. 公式中 η \eta η的是学习率, g t g_{t} gt是当前 batch 的梯度
优点
在合理的学习率和相应的衰减策略下, 通常能够优化到一个不错的点, 配合下面的 Momentum, 通常可以获得比自适应方法更优的点
缺点
(1) 因为要兼顾整个神经网络中所有参数的训练效果, 因此学习率敏感. (2) SGD 容易收敛到局部最优, 并且在某些情况下容易被困在鞍点( 这句话是不对的, 只有在特定的 inital point 时才会被困在鞍点, 通常情况下, 我们使用 random inital point, 被困在鞍点的概率非常小, 当使用合适的初始化和步长时, 几乎不会出现鞍点问题
); (3) 参数的更新仅仅依赖于当前 batch 中的数据, 当数据分布波动较大时, 更新不稳定.
SGD+Momentum (动量项)
g t = ∇ θ t − f ( θ t − 1 ) m t = μ × m t − 1 + g t Δ θ t = − η × m t \begin{array}{c} g_{t}=\nabla_{\theta_{t-}} f\left(\theta_{t-1}\right) \\ m_{t}=\mu \times m_{t-1}+g_{t} \\ \Delta \theta_{t}=-\eta \times m_{t} \end{array} gt=∇θt−f(θt−1)mt=μ×mt−1+gtΔθt=−η×mt
- μ \mu μ 为动量因子,通常取值0.9或0.99
- 通过动量的积累来在相关方向上加速 SGD 优化速度, 抑制震荡, 同时有助于跳出局部最优, 进而加快收敛.
优点
(1) 下降初期, 动量因子可以加速网络的训练速度; (2) 当遇到鞍点时, 梯度虽然为零, 但是动量不为零, 可以跳出鞍点(局部最优) ; (3) 在梯度改变方向时, 能够降低更新幅度, 减小震荡, 加速网络收敛;
- 总之, momentum 项能够在相关方向加速 SGD, 抑制震荡, 从而加快收敛。
缺点
需要人工设置学习率
SGD+Nesterov (前瞻动量)
- Nesterov Accelerated Gradient
g t = ∇ θ t − f ( θ t − 1 − η × μ × m t − 1 ) m t = μ × m t − 1 + g t Δ θ t = − η × m t \begin{array}{c} g_{t}=\nabla_{\theta_{t-}} f\left(\theta_{t-1}-\eta \times \mu \times m_{t-1}\right) \\ m_{t}=\mu \times m_{t-1}+g_{t} \\ \Delta \theta_{t}=-\eta \times m_{t} \end{array} gt=∇θt−f(θt−1−η×μ×mt−1)mt=μ×mt−1+gtΔθt=−η×mt
- Nesterov 与 Momentum 公式的区别在于, 前者不是在当前的位置上求梯度, 而是根据本来计划要走的那一步提前前进一步以后, 再在新的位置上求梯度, 然后对这个新求得的梯度进行 Momentum 梯度下降计算
优点
(1) 先站在下一步的位置看看, 再进行更新, 使得梯度更新方向更具前瞻性; (2) 实际使用中, NAG 会比 Momentum 收敛的速度更快
缺点
需要人工设置学习率
AdaGrad (梯度平方累计)
n t = n t − 1 + g t 2 Δ θ t = − η n t + ε × g t \begin{array}{c} n_{t}=n_{t-1}+g_{t}^{2} \\ \Delta \theta_{t}=-\frac{\eta}{\sqrt{n_{t}+\varepsilon}} \times g_{t} \end{array} nt=nt−1+gt2Δθt=−nt+ε η×gt
- 学习率前面乘了一个约束项 1 n t + ϵ , \frac{1}{\sqrt{n_{t}+\epsilon}}, nt+ϵ 1,
- 该约束项会随着算法的不断选代而增大, 那么对应学习率就会越来越小, Adagrad 算法在开始时是大步前进的, 而在后面则会减小步伐, 缓慢收敛
优点
:(1) 更新期间学习率随着训练过程变化 (2) 适合面对稀疏梯度 (3) 对于每一个不同的参数, 其具有不同的学习率, 由梯度动态调节
缺点
(1) 依赖人工全局学习率; (2) 中后期, 分母上的梯度累加和会越来越大, 使得更新停滞, 训练提前结束
AdaDelta (梯度平方平均值+自适应学习率)
E g t 2 = ρ × E g t − 1 2 + ( 1 − ρ ) × g t 2 Δ θ t = − η E g t 2 + ϵ g t = − η R M S ∣ g ∣ t g t = − R M S ∣ Δ θ ∣ t − 1 R M S ∣ g ∣ t g t R M S [ Δ θ ] t = E [ Δ θ 2 ] t + ϵ E [ Δ θ 2 ] t = γ E [ Δ θ 2 ] t − 1 + ( 1 − γ ) Δ θ t 2 \begin{array}{c} E g_{t}^{2}=\rho \times E g_{t-1}^{2}+(1-\rho) \times g_{t}^{2} \\ \Delta \theta_{t}=-\frac{\eta}{\sqrt{E g_{t}^{2}+\epsilon}} g_{t} \\ =-\frac{\eta}{R M S|g|_{t}} g_{t} \\ =-\frac{R M S|\Delta \theta|_{t-1}}{R M S|g|_{t}} g_{t} \\ R M S[\Delta \theta]_{t}=\sqrt{E\left[\Delta \theta^{2}\right]_{t}+\epsilon} \\ E\left[\Delta \theta^{2}\right]_{t}=\gamma E\left[\Delta \theta^{2}\right]_{t-1}+(1-\gamma) \Delta \theta_{t}^{2} \end{array} Egt2=ρ×Egt−12+(1−ρ)×gt2Δθt=−Egt2+ϵ ηgt=−RMS∣g∣tηgt=−RMS∣g∣tRMS∣Δθ∣t−1gtRMS[Δθ]t=E[Δθ2]t+ϵ E[Δθ2]t=γE[Δθ2]t−1+(1−γ)Δθt2
- ρ 类似于冲量项, 其值在 0.9 附近. Adadelta是对Adagrad的扩展, 和 Adagrad 相比, 其改进是将分母约束项换成了 过去的梯度平方的衰减平均值, 相当于梯度的均方根 (Root Mean Squared, RMS), 此外, 如果将学习率也换成 R M S [ Δ θ ] t R M S[\Delta \theta]_{t} RMS[Δθ]t的话, 甚至可以不用设置学习率了
优点
(1) 对 Adagrad 的扩展, 约束项只计算梯度平方一段时间内的平均值, 而不是累计值, 不容易产生太大值而使得更新提早结束; (2) 无需人工设置学习率, 可以动态改变学习率的大小;
缺点
(1) 训练后期会反复在局部最小值附近抖动, 无法收敛到最优点, 这时候用 SGD+Momentum, 通常会有 2%~5% 的验证集正确率提升.
RMSprop (梯度平方平均值)
E g t 2 = ρ × E g t − 1 2 + ( 1 − ρ ) × g t 2 Δ θ t = − η E g 2 + ϵ g t \begin{array}{c} E g_{t}^{2}=\rho \times E g_{t-1}^{2}+(1-\rho) \times g_{t}^{2} \\ \Delta \theta_{t}=-\frac{\eta}{\sqrt{E g^{2}+\epsilon}} g_{t} \end{array} Egt2=ρ×Egt−12+(1−ρ)×gt2Δθt=−Eg2+ϵ ηgt
- AdaDelta的特例,
优点
(1) Adadelta 的特例, 也是对学习率添加约束, 适合处理非平稳目标, 对 RNN 效果较好
缺点
RMSprop可以算作是Adadelta的一个特例, 可以看出 RMSprop 仍然需要设置全局学习率
Adam (梯度平方平均值 + 动量项)
m t = β 1 × m t − 1 + ( 1 − β 1 ) × g t n t = β 2 × n t − 1 + ( 1 − β 2 ) × g t 2 m ^ t = m t 1 − β 1 t n ^ t = n t 1 − β 2 t Δ θ t = − m ^ t n ^ t + ϵ × η m_{t}=\beta_{1} \times m_{t-1}+\left(1-\beta_{1}\right) \times g_{t} \\ n_{t}=\beta_{2} \times n_{t-1}+\left(1-\beta_{2}\right) \times g_{t}^{2} \\ \hat{m}_{t}=\frac{m_{t}}{1-\beta_{1}^{t}} \\ \hat{n}_{t}=\frac{n_{t}}{1-\beta_{2}^{t}} \\ \Delta \theta_{t}=-\frac{\hat{m} t}{\sqrt{\hat{n}_{t}+\epsilon}} \times \eta mt=β1×mt−1+(1−β1)×gtnt=β2×nt−1+(1−β2)×gt2m^t=1−β1tmtn^t=1−β2tntΔθt=−n^t+ϵ m^t×η
- 利用修正后的梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率. m t , n t m_{t}, n_{t} mt,nt 分别是对梯度的一阶矩估计和二阶矩估计, 可以看做是对期望 E g t , E g t 2 E g_{t}, E g_{t}^{2} Egt,Egt2 的估计, m ^ t , n ^ t \hat{m}_{t}, \hat{n}_{t} m^t,n^t 是对 m t , n t m_{t}, n_{t} mt,nt 的校正, 这样可以近似为对期望的无偏估计.
优点
(1) 经过偏置校正后, 每一次迭代学习率都有一个确定的范围, 使得参数更新比较平稳; (2) 结合了动量 RMSprop 的优点; 既可以加速收敛, 又可以根据梯度的大小动态调节每个参数的学习步长 (3) 对内存需求 (偏置估计, 不用存储前几次梯度) 较小; (4) 适用于大多非凸优化, 适用于大数据集和高维空间; (5) 超参数可以比较直观的解释, 同时只需要极少量的调参
缺点
最终的收敛点通常比经过精心调参后的 SGD+Momentum 的收敛点差一些. 常取参数值:( β 1 = 0.9 , β 2 = 0.999 , ϵ = 1 0 − 8 \beta_{1}=0.9, \beta_{2}=0.999, \epsilon=10^{-8} β1=0.9,β2=0.999,ϵ=10−8)
Adamax (学习率设上界 + Adam)
n t = max ( ν × n t − 1 , a b s ( g t ) ) Δ x = − m ^ t n t + ϵ × η n_{t}=\max \left(\nu \times n_{t-1}, a b s\left(g_{t}\right)\right) \\ \Delta x=-\frac{\hat{m}_{t}}{n_{t}+\epsilon} \times \eta nt=max(ν×nt−1,abs(gt))Δx=−nt+ϵm^t×η
- Adamax 是 Adam 的一种变体, 此方法对学习率的上限提供了一个更简单的范围, 可以看出, 学习率的边界范围更加简单
Nadam (NAG + Adam)
g ^ t = g t 1 − Π i = 1 t μ i m t = μ t ∗ m t − 1 + ( 1 − μ t ) ∗ g t m ^ t = m t 1 − ∏ i = 1 t + 1 μ i n t = ν ∗ n t − 1 + ( 1 − ν ) ∗ g t 2 n ^ t = n t 1 − ν t m ˉ t = ( 1 − μ t ) ∗ g ^ t + μ t + 1 ∗ m ^ t Δ θ t = − η ∗ m ˉ t n ^ t + ϵ \hat{g}_{t}=\frac{g_{t}}{1-\Pi_{i=1}^{t} \mu_{i}} \\ m_{t}=\mu_{t} * m_{t-1}+\left(1-\mu_{t}\right) * g_{t} \\ \hat{m}_{t}=\frac{m_{t}}{1-\prod_{i=1}^{t+1} \mu_{i}} \\ n_{t}=\nu * n_{t-1}+(1-\nu) * g_{t}^{2} \\ \hat{n}_{t}=\frac{n_{t}}{1-\nu^{t}} \\ \bar{m}_{t}=\left(1-\mu_{t}\right) * \hat{g}_{t}+\mu_{t+1} * \hat{m}_{t} \\ \Delta \theta_{t}=-\eta * \frac{\bar{m}_{t}}{\sqrt{\hat{n}_{t}}+\epsilon} g^t=1−Πi=1tμigtmt=μt∗mt−1+(1−μt)∗gtm^t=1−∏i=1t+1μimtnt=ν∗nt−1+(1−ν)∗gt2n^t=1−νtntmˉt=(1−μt)∗g^t+μt+1∗m^tΔθt=−η∗n^t +ϵmˉt
合适的优化方法
- Adam, RMSprop 等算法, 使用的都是一阶原点矩和二阶原点矩. 并且是利用滑动平均法来对一阶矩和二阶矩进行估计.
- SGD+Momentum 相比于自适应优化器通常训练时间长, 但在好的学习率和衰减方案的情况下结果更优
- AdaGrad, RMSprop, Adam 等适合希望得到快速结果的情况下使用
-
- 在使用 RMSprop 和 Adam 的地方, 大多可以使用 Nadam 取得更好的效果.
- 在训练较深层的网络时, 也推荐先使用 Adam 方法进行正确性验证, 然后再使用SGD+Momentum 微调.
- 在实际训练中比较好的方法是: 先用 Adam 预训练一段时间, 然后使用 SGD+Momentum, 以达到最佳性能. Adam vs SGD 的表现通常如下图所示, 由于鲁棒性和自适应的学习速率, Adam 在一开始表现更好, 而 SGD 最终更容易达到全局最优.
Adam (Adaptive Moment Estimation)
Adam 中使用的指数加权滑动平均法
- 在数学中一般会以 1/e 来作为一个临界值, 小于该值的加权系数对应的值不作考虑. 因此, 当 β=0.9 时, 0.9^10 约等于 1e, 认为此时是约 10 个数值的加权平均.
- 偏差修正:由于初始化的值太小, 导致初期的滑动平均值偏小, 随着时间的增长, 初期的值影响减小, 滑动平均值才逐渐正常. 为了让初期的滑动平均值也相对正常,所以除以一个数进行修正!
偏差修正
- 令其在梯度变得稀疏时要比 RMSprop 算法更快速和优秀。
n 0 = 0 n t = β 2 × n t − 1 + ( 1 − β 2 ) × g t 2 = ( 1 − β 2 ) ∑ i = 1 t β 2 t − i × g i 2 E [ n t ] = E [ ( 1 − β 2 ) ∑ i = 1 t β 2 t − i × g i 2 ] = E [ g t 2 ] × ( 1 − β 2 ) ∑ i = 1 t β 2 t − i + C = E [ g t 2 ] × ( 1 − β 2 t ) + C ′ n_0 = 0 \\ n_{t}=\beta_{2} \times n_{t-1}+\left(1-\beta_{2}\right) \times g_{t}^{2}=\left(1-\beta_{2}\right) \sum_{i=1}^{t} \beta_{2}^{t-i} \times g_{i}^{2} \\ E\left[n_{t}\right]=E\left[\left(1-\beta_{2}\right) \sum_{i=1}^{t} \beta_{2}^{t-i} \times g_{i}^{2}\right]=E\left[g_{t}^{2}\right] \times\left(1-\beta_{2}\right) \sum_{i=1}^{t} \beta_{2}^{t-i}+C= E\left[g_{t}^{2}\right] \times\left(1-\beta_{2}^{t}\right)+C^{\prime} n0=0nt=β2×nt−1+(1−β2)×gt2=(1−β2)i=1∑tβ2t−i×gi2E[nt]=E[(1−β2)i=1∑tβ2t−i×gi2]=E[gt2]×(1−β2)i=1∑tβ2t−i+C=E[gt2]×(1−β2t)+C′
Adam的原理机制
- Adam 算法和传统的随机梯度下降不同。随机梯度下降保持单一的学习率更新所有的权重,学习率在训练过程中并不会改变。而 Adam 通过计算梯度的一阶矩估计和二阶矩估计而为不同的参数设计独立的自适应性学习率。
- 本质上,Adam是AdaGrad和RMSprop的集合:适应性梯度算法(AdaGrad)为每一个参数保留一个学习率以提升在稀疏梯度(即自然语言和计算机视觉问题)上的性能;均方根传播(RMSprop)基于权重梯度最近量级的均值为每一个参数适应性地保留学习率。这意味着算法在非稳态和在线问题上有很有优秀的性能。
Adam参数和默认参数
- α \alpha α:同样也称为学习率或步长因子,它控制了权重的更新比率(如 0.001)。较大的值(如 0.3)在学习率更新前会有更快的初始学习,而较小的值(如 1.0E-5)会令训练收敛到更好的性能。
- β 1 \beta_1 β1:一阶矩估计的指数衰减率(如 0.9)。
- β 2 \beta_2 β2:二阶矩估计的指数衰减率(如 0.999)。该超参数在稀疏梯度(如在 NLP 或计算机视觉任务中)中应该设置为接近 1 的数。
- ϵ \epsilon ϵ:该参数是非常小的数,其为了防止在实现中除以零(如 10E-8)
二阶梯度方法
牛顿法
f ( x ) = f ( x ( k ) ) + ∇ f ( x ( k ) ) T ( x − x ( k ) ) + 1 2 ( x − x ( k ) ) T H ( x ( k ) ) ( x − x ( k ) ) ( ) ∇ f ( x ) = ∇ f ( x ( k ) ) + H ( x ( k ) ) ( x − x ( k ) ) 因 为 : ∇ f ( x ( k + 1 ) ) = 0 则 : ∇ f ( x k ) ) + H ( x ( k ) ) ( x ( k + 1 ) − x ( k ) ) = 0 x ( k + 1 ) = x ( k ) − H ( x ( k ) ) − 1 ∇ f ( x ( k ) ) 即 : x ( k + 1 ) = x ( k ) − H k − 1 g k f(x)=f\left(x^{(k)}\right)+\nabla f\left(x^{(k)}\right)^{T}\left(x-x^{(k)}\right)+\frac{1}{2}\left(x-x^{(k)}\right)^{T} H\left(x^{(k)}\right)\left(x-x^{(k)}\right)(\text) \\ \nabla f(x)=\nabla f\left(x^{(k)}\right)+H\left(x^{(k)}\right)\left(x-x^{(k)}\right) \\ 因为: \nabla f\left(x^{(k+1)}\right)=0 \\ 则: \nabla f\left(x^{k)}\right)+H\left(x^{(k)}\right)\left(x^{(k+1)}-x^{(k)}\right)=0 \\ x^{(k+1)}=x^{(k)}-H\left(x^{(k)}\right)^{-1} \nabla f\left(x^{(k)}\right) \\ 即:x^{(k+1)}=x^{(k)}-H_{k}^{-1} g_{k} f(x)=f(x(k))+∇f(x(k))T(x−x(k))+21(x−x(k))TH(x(k))(x−x(k))()∇f(x)=∇f(x(k))+H(x(k))(x−x(k))因为:∇f(x(k+1))=0则:∇f(xk))+H(x(k))(x(k+1)−x(k))=0x(k+1)=x(k)−H(x(k))−1∇f(x(k))即:x(k+1)=x(k)−Hk−1gk
拟牛顿法
- 牛顿法中海赛矩阵的逆矩阵计算复杂度高
- 拟牛顿的基本思路:考虑用一个正定矩阵替代海赛矩阵
g k + 1 − g k = H ( x ( k ) ) ( x ( k + 1 ) − x ( k ) ) g_{k+1}-g_{k}=H\left(x^{(k)}\right)\left(x^{(k+1)}-x^{(k)}\right) gk+1−gk=H(x(k))(x(k+1)−x(k))
- 得到拟牛顿条件: y k = H k δ k y_{k}=H_{k} \delta_{k} yk=Hkδk
- 如果 H k H_{k} Hk 是正定的 H k − 1 H_{k}^{-1} Hk−1 也是正定的, 那么可以保证牛顿法搜索方向 p k p_{k} pk是下降方向。这是因为搜索方向是 p k = − H k − 1 g k p_{k}=-H_{k}^{-1} g_{k} pk=−Hk−1gk
- 如何找到和更新这个矩阵有DFP算法、BFGS算法和Broyden类算法 TODO … …
- 高斯牛顿法 TODO … …
共轭梯度法
- 共轭梯度法是介于最速下降法与牛顿法之间的一个方法,它仅需利用一阶导数信息,但克服了最速下降法收敛慢的缺点,又避免了牛顿法需要存储和计算Hesse矩阵并求逆的缺点
- 共轭梯度法不仅是解决大型线性方程组最有用的方法之一,也是解大型非线性最优化最有效的算法之一。
- 在各种优化算法中,共轭梯度法是非常重要的一种。其优点是所需存储量小,具有步收敛性,稳定性高,而且不需要任何外来参数。
问题模型
min x f ( x ) = 1 2 x T A x − b T x \min _{x} f(x)=\frac{1}{2} x^{T} A x-b^{T} x xminf(x)=21xTAx−bTx
- A为半正定矩阵,x为优化变量,A和b为已知,负梯度如下:
r k = − ( A x k − b ) r_{k}=-\left(A x_{k}-b\right) rk=−(Axk−b)
- 其实 就是求 方程 4 x ∗ = b 4 x^{*}=b 4x∗=b 的解(通过迭代避免了求逆的难度),定义每次迭代和最优解的误差如下: e k = x ∗ − x k e_{k}=x^{*}-x_{k} ek=x∗−xk
解法
- 虽然梯度下降法的每一步都是朝着局部最优的方向前进的,但是它在不同的迭代轮数中会选择非常近似的方向,说明这个方向的误差并没通过一次更新方向和步长更新完,在这个方向上还存在误差,因此参数更新的轨迹是锯齿状。共轭梯度法的思想是,选择一个优化方向后,本次选择的步长能够将这个方向的误差更新完,在以后的优化更新过程中不再需要朝这个方向更新了。由于每次将一个方向优化到了极小,后面的优化过程将不再影响之前优化方向上的极小值,所以理论上对N维问题求极小只用对N个方向都求出极小就行了。为了不影响之前优化方向上的更新量,需要每次优化方向共轭正交。假定每一步的优化方向用 p k p_k pk表示,可得共轭正交:
p i A p j = 0 i ≠ j p_{i} A p_{j}=0 \quad i ≠ j piApj=0i=j
- 则据上式,误差和优化方向:
p k A e k + 1 = 0 p_{k} A e_{k+1}=0 pkAek+1=0
- 若为N维空间优化问题, 则每次优化方向可以组成这个空间中的一组基底 P = { p 1 , p 2 , … , p N } P = \left\{p_{1}, p_{2}, \ldots, p_{N}\right\} P={p1,p2,…,pN}
推导(优化方向和步长确定)
- 第一次优化方向为初始负梯度方向:
p 1 = r 1 = b − A x 1 p_{1}=r_{1}=b-A x_{1} p1=r1=b−Ax1
- 使用施密特正交化,得到第k次优化方向为(对 r k r_k rk进行正交化):
- p k = r k − ∑ i < k p i T A r k p i T A p i p i p_{k}=r_{k}-\sum_{ipk=rk−i<k∑piTApipiTArkpi
- β i = p i T A r k p i T A p i \beta_{i}=\frac{p_{i}^{T} A r_{k}}{p_{i}^{T} A p_{i}} βi=piTApipiTArk
- 优化步长计算如下:
- p k T A e k + 1 = p k T A ( x ∗ − x k + 1 ) = p k T A ( x ∗ − x k + x k − x k + 1 ) = p k T A ( e k − α k p k ) = p k T A e k − α k p k T A p k = 0 \begin{aligned} p_{k}^{T} A e_{k+1} &=p_{k}^{T} A\left(x^{*}-x_{k+1}\right) \\ &=p_{k}^{T} A\left(x^{*}-x_{k}+x_{k}-x_{k+1}\right) \\ &=p_{k}^{T} A\left(e_{k}-\alpha_{k} p_{k}\right) \\ &=p_{k}^{T} A e_{k}-\alpha_{k} p_{k}^{T} A p_{k}=0 \end{aligned} pkTAek+1=pkTA(x∗−xk+1)=pkTA(x∗−xk+xk−xk+1)=pkTA(ek−αkpk)=pkTAek−αkpkTApk=0
- α k = p k T A e k p k T A p k = p k T A ( x ∗ − x k ) p k T A p k = p k T ( A x ∗ − A x k ) p k T A p k = p k T ( b − A x k ) p k T A p k = p k T r k p k T A p k \begin{aligned} \alpha_{k} &=\frac{p_{k}^{T} A e_{k}}{p_{k}^{T} A p_{k}} \\ &=\frac{p_{k}^{T} A\left(x^{*}-x_{k}\right)}{p_{k}^{T} A p_{k}} \\ &=\frac{p_{k}^{T}\left(A x^{*}-A x_{k}\right)}{p_{k}^{T} A p_{k}} \\ &=\frac{p_{k}^{T}\left(b-A x_{k}\right)}{p_{k}^{T} A p_{k}} \\ &=\frac{p_{k}^{T} r_{k}}{p_{k}^{T} A p_{k}} \end{aligned} αk=pkTApkpkTAek=pkTApkpkTA(x∗−xk)=pkTApkpkT(Ax∗−Axk)=pkTApkpkT(b−Axk)=pkTApkpkTrk
三个推论
- 第k步计算的梯度 r k r_{k} rk 和前k-1步的优化向量 { p i } i = 1 k − 1 \left\{p_{i}\right\}_{i=1}^{k-1} {pi}i=1k−1 正交。
- 证明: 当 i < j ii<j
p i T r j = p i T ( A x j − b ) = p i T ( A x j − A x ∗ ) = p i T A e j = p i T A ( e i + 1 − ∑ k = 1 j − 1 β k p k ) = 0 \begin{aligned} p_{i}^{T} r_{j} &=p_{i}^{T}\left(A x_{j}-b\right) \\ &=p_{i}^{T}\left(A x_{j}-A x^{*}\right) \\ &=p_{i}^{T} A e_{j} \\ &=p_{i}^{T} A\left(e_{i+1}-\sum_{k=1}^{j-1} \beta_{k} p_{k}\right) \\ &=0 \end{aligned} piTrj=piT(Axj−b)=piT(Axj−Ax∗)=piTAej=piTA(ei+1−k=1∑j−1βkpk)=0
- 第k步计算的梯度 r k r_{k} rk 和前k-1步的梯度 { r i } i = 1 k − 1 \left\{r_{i}\right\}_{i=1}^{k-1} {ri}i=1k−1 正交。
- 证明: 当 i < j ii<j
r i T r j = ( p i + ∑ k = 1 i − 1 β k p k ) r j = 0 r_{i}^{T} r_{j}=\left(p_{i}+\sum_{k=1}^{i-1} \beta_{k} p_{k}\right) r_{j}=0 riTrj=(pi+k=1∑i−1βkpk)rj=0
- 第K步计算的梯度 r k r_{k} rk 和前k-2步的优化向量 { p i } i = 1 k − 2 \left\{p_{i}\right\}_{i=1}^{k-2} {pi}i=1k−2 共轭正交。
- 证明:
r j + 1 T r i = ( b − A x j + 1 ) T r i = ( b − A ( x j + α j p j ) ) T r i = ( b − A x j − α j A p j ) T r i = ( r j − α j A p j ) T r i = r j T r i − α j p j T A r i \begin{aligned} r_{j+1}^{T} r_{i} &=\left(b-A x_{j+1}\right)^{T} r_{i} \\ &=\left(b-A\left(x_{j}+\alpha_{j} p_{j}\right)\right)^{T} r_{i} \\ &=\left(b-A x_{j}-\alpha_{j} A p_{j}\right)^{T} r_{i} \\ &=\left(r_{j}-\alpha_{j} A p_{j}\right)^{T} r_{i} \\ &=r_{j}^{T} r_{i}-\alpha_{j} p_{j}^{T} A r_{i} \end{aligned} rj+1Tri=(b−Axj+1)Tri=(b−A(xj+αjpj))Tri=(b−Axj−αjApj)Tri=(rj−αjApj)Tri=rjTri−αjpjTAri
- 当 j + 1 = i j+1=i j+1=i 时, p j T A r i ≠ 0 p_{j}^{T} A r_{i}≠0 pjTAri=0
- 当 j + 1 < i j+1j+1<i 时, p j T A r i = 0 p_{j}^{T} A r_{i}=0 pjTAri=0
使用推论简化计算
- 使用上述公式,每次迭代都要计算 β \beta β,现简化如下:
- 优化方向:(推论三)
p k + 1 = r k + 1 − p k T A r k + 1 p k T A k k p k = r k + 1 − ( A p k ) T r k + 1 ( A p k ) T p k p k = r k + 1 − ( r k − r k + 1 α ) T r k + 1 ( r k − r k + 1 α ) T p k p k = r k + 1 − ( r k − r k + 1 α ) T r k + 1 ( r k − r k + 1 α ) T ( r k − β k − 1 p k − 1 ) p k = r t + 1 + r k + 1 T r k + 1 r k T r k p k \begin{aligned} p_{k+1} &=r_{k+1}-\frac{p_{k}^{T} A r_{k+1}}{p_{k}^{T} A k_{k}} p_{k} \\ &=r_{k+1}-\frac{\left(A p_{k}\right)^{T} r_{k+1}}{\left(A p_{k}\right)^{T} p_{k}} p_{k} \\ &=r_{k+1}-\frac{\left(\frac{r_{k}-r_{k+1}}{\alpha}\right)^{T} r_{k+1}}{\left(\frac{r_{k}-r_{k+1}}{\alpha}\right)^{T} p_{k}} p_{k} \\ &=r_{k+1}-\frac{\left(\frac{r_{k}-r_{k+1}}{\alpha}\right)^{T} r_{k+1}}{\left(\frac{r_{k}-r_{k+1}}{\alpha}\right)^{T}\left(r_{k}-\beta_{k-1} p_{k-1}\right)} p_{k} \\ &=r_{t+1}+\frac{r_{k+1}^{T} r_{k+1}}{r_{k}^{T} r_{k}} p_{k} \end{aligned} pk+1=rk+1−pkTAkkpkTArk+1pk=rk+1−(Apk)Tpk(Apk)Trk+1pk=rk+1−(αrk−rk+1)Tpk(αrk−rk+1)Trk+1pk=rk+1−(αrk−rk+1)T(rk−βk−1pk−1)(αrk−rk+1)Trk+1pk=rt+1+rkTrkrk+1Trk+1pk
- 优化步长:(推论一)
α k = p k T r k p k t A p k = ( r k − β k − 1 p k − 1 ) T r k p k t A p k = r k T r k p k T A p k T \begin{aligned} \alpha_{k} &=\frac{p_{k}^{T} r_{k}}{p_{k}^{t} A p_{k}} \\ &=\frac{\left(r_{k}-\beta_{k-1} p_{k-1}\right)^{T} r_{k}}{p_{k}^{t} A p_{k}} \\ &=\frac{r_{k}^{T} r_{k}}{p_{k}^{T} A p_{k}^{T}} \end{aligned} αk=pktApkpkTrk=pktApk(rk−βk−1pk−1)Trk=pkTApkTrkTrk
- 最终梯度计算公式:
r k + 1 = b − A x k + 1 = b − A ( x k + α k p k ) = b − A x k − α k A p k = r k − α k A p k \begin{aligned} r_{k+1} &=b-A x_{k+1} \\ &=b-A\left(x_{k}+\alpha_{k} p_{k}\right) \\ &=b-A x_{k}-\alpha_{k} A p_{k} \\ &=r_{k}-\alpha_{k} A p_{k} \end{aligned} rk+1=b−Axk+1=b−A(xk+αkpk)=b−Axk−αkApk=rk−αkApk
伪代码
r 0 = b − A x 0 r_{0} = b-A x_{0} r0=b−Ax0
p 0 = r 0 p_{0} = r_{0} p0=r0
k = 0 k = 0 k=0
w h i l e α k = r k T r k p k T A p k while \quad \alpha_{k}=\frac{r_{k}^{T} r_{k}}{p_{k}^{T} A p_{k}} whileαk=pkTApkrkTrk
x k + 1 = x k + α k p k \qquad x_{k+1}=x_{k}+\alpha_{k} p_{k} xk+1=xk+αkpk
r k + 1 = r k − α k A p k \qquad r_{k+1}=r_{k}-\alpha_{k} A p_{k} rk+1=rk−αkApk
i f r k + 1 < ϵ b r e a k \qquad if \quad r_{k+1}<\epsilon \quad break ifrk+1<ϵbreak
β k + 1 = r k + 1 T r k + 1 r k T r k \qquad \beta_{k+1}=\frac{r_{k+1}^{T} r_{k+1}}{r_{k}^{T} r_{k}} βk+1=rkTrkrk+1Trk+1
p k + 1 = r k + 1 + β k p k \qquad p_{k+1}=r_{k+1}+\beta_{k} p_{k} pk+1=rk+1+βkpk
k = k + 1 \qquad k=k+1 k=k+1
r e t u r n x k + 1 return \quad x_{k+1} returnxk+1
2 网络参数初始化
- constant, uniform, gaussian, xavier, msra(kaiming), bilinear
|
|
|
均匀分布 |
… |
将权值与偏置进行均匀分布的初始化 |
高斯分布 |
… |
初始化为服从 N ( μ , σ 2 ) N\left(\mu, \sigma^{2}\right) N(μ,σ2)的高斯分布 |
Xavier |
W ∼ U [ − 6 n j + n j + 1 , 6 n j + n j + 1 ] W \sim U\left[-\frac{\sqrt{6}}{\sqrt{n_{j}+n_{j+1}}}, \frac{\sqrt{6}}{\sqrt{n_{j}+n_{j+1}}}\right] W∼U[−nj+nj+1 6 ,nj+nj+1 6 ] 服从均值为 0, 方差为 2 n i + n i + 1 \frac{2}{n_{i}+n_{i+1}} ni+ni+12 的均匀分布 |
公式中, n i n_i ni 为本层输入的神经元个数, n i + 1 n_{i+1} ni+1 为本层输出的神经元个数, 适合于线性激活函数(原文公式推导的假设) |
MSRA(Kaiming) |
基于均值为0, 方差为 2 ( 1 + a 2 ) × f a n i n \sqrt{\frac{2}{\left(1+a^{2}\right) \times fan_{in}}} (1+a2)×fanin2 的高斯分布 |
它特别适合 ReLU 激活函数(非线性) |
双线性初始化 |
… |
常用在反卷积网络里的权值初始化 |
相关概率公式
推导时使用的現率公式:
D ( x ) = E ( x 2 ) − E 2 ( x ) D ( x y ) = E ( x 2 y 2 ) − E 2 ( x y ) = E ( x 2 ) E ( y 2 ) − E 2 ( x ) E 2 ( y ) D(x)=E\left(x^{2}\right)-E^{2}(x) \\ D(x y)=E\left(x^{2} y^{2}\right)-E^{2}(x y) =E\left(x^{2}\right) E\left(y^{2}\right)-E^{2}(x) E^{2}(y) D(x)=E(x2)−E2(x)D(xy)=E(x2y2)−E2(xy)=E(x2)E(y2)−E2(x)E2(y)
如果 E ( y ) = 0 , E(y)=0, E(y)=0, 则有:
D ( x y ) = D ( y ) E ( x 2 ) D(x y)=D(y) E\left(x^{2}\right) D(xy)=D(y)E(x2)
如果(x,y)是相互独立的,则有
E ( x y ) = E ( x ) E ( y ) E(x y)=E(x) E(y) E(xy)=E(x)E(y)
Xavier 初始化 2010
- 核心理念是: 优秀的初始化方法应该使得各层的激活值和状态梯度在传播过程中的方差保持一致
- 它为了保证前向传播和反向传播时每一层的方差一致:
- 在正向传播时,每层的激活值的方差保持不变;
- 在反向传播时,每层的梯度值的方差保持不变。
- 根据每层的输入个数和输出个数来决定参数随机初始化的分布范围,是一个通过该层的输入和输出参数个数得到的分布范围内的均匀分布。
假设
- 首先,输入数据来说,其均值和方差应满足: E(x)=0,Var(x)=1 (通过BN,较容易满足)
- 权重矩阵 W W W 和 网络输入 x x x 互相独立
- 每层输入的每个特征方差一样
- 激活函数对称: 这主要是为了满足均值为0的假设
- 激活函数是线性的, 也就是说其导数为1
- 初始时, 状态值落在激活函数的线性区域, 即此时导数为1
推导
- 正向传播的推导过程
Y = W 1 X 1 + W 2 X 2 + … + W n X n Y=W_{1} X_{1}+W_{2} X_{2}+\ldots+W_{n} X_{n} Y=W1X1+W2X2+…+WnXn
- 方差
Var ( W i X i ) = E ( X i ) 2 Var ( W i ) + E ( W i ) 2 Var ( X i ) + Var ( X i ) Var ( W i ) \operatorname{Var}\left(W_{i} X_{i}\right)=E\left(X_{i}\right)^{2} \operatorname{Var}\left(W_{i}\right)+E\left(W_{i}\right)^{2} \operatorname{Var}\left(X_{i}\right)+\operatorname{Var}\left(X_{i}\right) \operatorname{Var}\left(W_{i}\right) Var(WiXi)=E(Xi)2Var(Wi)+E(Wi)2Var(Xi)+Var(Xi)Var(Wi)
- 当输入的 X 均值为 0 时(通过 BN, 较容易满足), 输出的方差就是:
Var ( W i X i ) = Var ( W i ) Var ( X i ) \operatorname{Var}\left(W_{i} X_{i}\right)=\operatorname{Var}\left(W_{i}\right) \ \operatorname{Var}\left(X_{i}\right) Var(WiXi)=Var(Wi) Var(Xi)
- 独立同分布
Var ( Y ) = n × Var ( W i ) Var ( X i ) \operatorname{Var}(Y)=n \times \operatorname{Var}\left(W_{i}\right) \operatorname{Var}\left(X_{i}\right) Var(Y)=n×Var(Wi)Var(Xi)
- 也就是说输出的方差跟输入的方差只是相差了一个倍数 n V a r ( W i ) , n V a r\left(W_{i}\right), nVar(Wi), 因此, 为了保证前向传播和反向传播时每一层的方差一致, 则有下面的公式成立:
∀ i , n i × Var [ W i ] = 1 \forall i, n_{i} \times \operatorname{Var}\left[W^{i}\right]=1 ∀i,ni×Var[Wi]=1
- 同时考虑反向传播时输入输出刚好相反, 于是就有:
∀ i , n i + 1 × Var [ W i ] = 1 \forall i, n_{i+1} \times \operatorname{Var}\left[W^{i}\right]=1 ∀i,ni+1×Var[Wi]=1
- 权衡上述两个公式,可得方差为:
∀ , Var [ W i ] = 2 n i + n i + 1 \forall, \operatorname{Var}\left[W^{i}\right]=\frac{2}{n_{i}+n_{i+1}}\\ ∀,Var[Wi]=ni+ni+12
- 取均匀分布 U ( a , b ) U(a,b) U(a,b)的方差为 ( b − a ) 2 12 \frac{(b - a) ^ 2}{12} 12(b−a)2,反推得到Xavier最终的初始化分布如下:
W ∼ U [ − 6 n j + n j + 1 , 6 n j + n j + 1 ] W \sim U\left[-\frac{\sqrt{6}}{\sqrt{n_{j}+n_{j+1}}}, \frac{\sqrt{6}}{\sqrt{n_{j}+n_{j+1}}}\right] W∼U[−nj+nj+1 6 ,nj+nj+1 6 ]
- 而取正态分布,则有:
W ∼ N ( 0.0 , 2 n i n + n out ) W \sim N(0.0, \sqrt{\frac{2}{n_{i n}+n_{\text {out}}}}) W∼N(0.0,nin+nout2 )
- 对于权值的初始化,Glorot提出两个准则:
- 各个层激活值的方差保持不变(正向传播)
- 各个层的梯度值的方差保持不变(反向传播)
- 通常初始的权值矩阵的均值为0. 这这些条件的基础上,Glorot 使用(tanh)作为激活函数,并假设输入值的均值为0,提出了Xavier初始化的方法。
He Kaiming 初始化 2016 (MSRA)
链接
- 而Kaiming使用ReLU作为激活函数,就无法满足数值的均值为0的条件,因此使用Xavier来初始化ReLU作为激活函数的网络,效果也就不是那么理想。其提出了MSRA的初始化方法,来解决该问题
- 由于Xavier的假设条件是激活函数是关于0对称的,而常用的ReLU激活函数并不能满足该条件
- 正向传播:
y l = W l x l + b l \mathbf{y}_{l}=\mathbf{W}_{l} \mathbf{x}_{l}+\mathbf{b}_{l} yl=Wlxl+bl
- 独立同分布
Var [ y l ] = n l Var [ w l x l ] \operatorname{Var}\left[y_{l}\right]=n_{l} \operatorname{Var}\left[w_{l} x_{l}\right] Var[yl]=nlVar[wlxl]
- 设w_的均值为0,即 E ( w l ) = 0 , E\left(w_{l}\right)=0, E(wl)=0, 则有:
Var ( y l ) = n l Var ( w l ) ⋅ E ( x l 2 ) \begin{aligned} \operatorname{Var}\left(y_{l}\right) =n_{l} \operatorname{Var}\left(w_{l}\right) \cdot E\left(x_{l}^{2}\right) \end{aligned} Var(yl)=nlVar(wl)⋅E(xl2)
- 这里有和Xavier一个很大的不同是,这里没有假设输入的值的均值为0。这是由于,使用ReLU的激活函数, x l = max ( 0 , y l − 1 ) x_{l}=\max \left(0, y_{l-1}\right) xl=max(0,yl−1),每层输出的值不可能均值为0
- 初始化时通常设, w的均值为0,偏置 b = 0 , b=0, b=0, 以及w和x是相互独立的,则有:
E ( y l ) = E ( w l x l ) = E ( x l ) ⋅ E ( w l ) = 0 \begin{aligned} \mathrm{E}\left(y_{l}\right) &=\mathrm{E}\left(w_{l} x_{l}\right) \\ &=\mathrm{E}\left(x_{l}\right) \cdot \mathrm{E}\left(w_{l}\right) \\ &=0 \end{aligned} E(yl)=E(wlxl)=E(xl)⋅E(wl)=0
- 再假设w是关于0对称分布的 (均匀分布,高斯分布都符合) ,则可以得到 y l y_{l} yl 在0附近也是对称分布的。这样,使用ReLU作为激活函数,则有: x l = max ( 0 , y l − 1 ) x_{l}=\max \left(0, y_{l-1}\right) xl=max(0,yl−1)
- 由于只有当 y l − 1 > 0 y_{l}-1>0 yl−1>0 的部分, x l x_{l} xl 才有值, 且 y l y_{l} yl 在0附近也是对称分布的, 则可以得到:
E ( x l 2 ) = 1 2 E ( y l − 1 2 ) = 1 2 ( E ( y l − 1 2 ) − E ( y l − 1 ) ) , ( 由于 E ( y l − 1 ) = 0 ) = 1 2 Var ( y l − 1 ) \begin{aligned} \mathrm{E}\left(x_{l}^{2}\right) &=\frac{1}{2} \mathrm{E}\left(y_{l-1}^{2}\right) \\ &=\frac{1}{2}\left(E\left(y_{l-1}^{2}\right)-E\left(y_{l-1}\right)\right),\left(\text { 由于 } E\left(y_{l-1}\right)=0\right) \\ &=\frac{1}{2} \operatorname{Var}\left(y_{l-1}\right) \end{aligned} E(xl2)=21E(yl−12)=21(E(yl−12)−E(yl−1)),( 由于 E(yl−1)=0)=21Var(yl−1)
- 带入到: Var ( y l ) = n l Var ( w l ) ⋅ E ( x l 2 ) \operatorname{Var}\left(y_{l}\right)=n_{l} \operatorname{Var}\left(w_{l}\right) \cdot E\left(x_{l}^{2}\right) Var(yl)=nlVar(wl)⋅E(xl2)
- 得到:
Var [ y l ] = 1 2 n l Var [ w l ] Var [ y l − 1 ] \operatorname{Var}\left[y_{l}\right]=\frac{1}{2} n_{l} \operatorname{Var}\left[w_{l}\right] \operatorname{Var}\left[y_{l-1}\right] Var[yl]=21nlVar[wl]Var[yl−1]
- 即:
Var [ y L ] = Var [ y 1 ] ( ∏ l = 2 L 1 2 n l Var [ w l ] ) \operatorname{Var}\left[y_{L}\right]=\operatorname{Var}\left[y_{1}\right]\left(\prod_{l=2}^{L} \frac{1}{2} n_{l} \operatorname{Var}\left[w_{l}\right]\right) Var[yL]=Var[y1](l=2∏L21nlVar[wl])
- 为了方差一致:
1 2 n l Var [ w l ] = 1 , ∀ l \frac{1}{2} n_{l} \operatorname{Var}\left[w_{l}\right]=1, \quad \forall l 21nlVar[wl]=1,∀l
- 即权值得方差应该是: 2 / n l \sqrt{2 / n_{l}} 2/nl
- 取均匀分布,则有:
W ∼ U [ − 6 n l , 6 n l ] W \sim U[-\sqrt{\frac{6}{n_{l}}}, \sqrt{\frac{6}{n_{l}}}] W∼U[−nl6 ,nl6 ]
- 取正态分布,则有:
W ∼ N ( 0. , 2 n l ) W \sim N(0., \sqrt{\frac{2}{n_{l}}}) W∼N(0.,nl2 )
网络参数不可以初始化为0
- 首先, 在神经网络中, 每一层中的任意神经元都是同构的, 它们拥有相同的输入, 如果再将参数全部初始化为同样的值(如0), 那么输出也就是相同的, 反过来它们的梯度也都是相同的. 那么无论是前向传播还是反向传播的取值都是完全相同的, 那么每一个神经元都是基于input做相同的事情, 这样一来, 不同的神经元根本无法学到不同的特征, 这样就失去网络学习特征的意义了
3 损失函数
- 01损失;L1损失;L2损失;
- Softmax函数(用于分类),常用类似于逻辑回归的对数似然函数 E ( t , y ) = − ∑ j t j log y j E(t, y)=-\sum_{j} t_{j} \log y_{j} E(t,y)=−∑jtjlogyj
- Softmax容易上溢下溢(指数容易数据溢出),采用 f ( x − m a x ( x ) ) f(x - max(x)) f(x−max(x)) 替代 f ( x ) f(x) f(x) (
科大讯飞问到我了, 我竟然忘了
)
KL散度(相对熵)和交叉熵
- KL散度,值越小表示两个分布越接近:
- p(x)常用于描述样本的真实分布且q(x)则常常用于表示预测的分布
D K L ( p ∥ q ) = ∑ i = 1 n p ( x i ) log p ( x i ) q ( x i ) D_{K L}(p \| q)=\sum_{i=1}^{n} p\left(x_{i}\right) \log \frac{p\left(x_{i}\right)}{q\left(x_{i}\right)} DKL(p∥q)=i=1∑np(xi)logq(xi)p(xi)
- KL散度和交叉熵只差一个常数项(数据样本的熵):
D K L ( p ∥ q ) = ∑ i = 1 n p ( x i ) log ( p ( x i ) ) − ∑ i = 1 n p ( x i ) log ( q ( x i ) ) = − H ( p ( x ) ) + [ − ∑ i = 1 n p ( x i ) log ( q ( x i ) ) ] D_{K L}(p \| q)=\sum_{i=1}^{n} p\left(x_{i}\right) \log \left(p\left(x_{i}\right)\right)-\sum_{i=1}^{n} p\left(x_{i}\right) \log \left(q\left(x_{i}\right)\right) \\ =-H(p(x))+\left[-\sum_{i=1}^{n} p\left(x_{i}\right) \log \left(q\left(x_{i}\right)\right)\right] DKL(p∥q)=i=1∑np(xi)log(p(xi))−i=1∑np(xi)log(q(xi))=−H(p(x))+[−i=1∑np(xi)log(q(xi))]
- 交叉熵公式:
J ( W , b ) = − [ 1 m ∑ i = 1 m ( y ( i ) log f ( i ) + ( 1 − y ( i ) ) log ( 1 − f ( i ) ) ) ] J(W, b)=-\left[\frac{1}{m} \sum_{i=1}^{m}\left(y^{(i)} \log f^{(i)}+\left(1-y^{(i)}\right) \log \left(1-f^{(i)}\right)\right)\right] \\ J(W,b)=−[m1i=1∑m(y(i)logf(i)+(1−y(i))log(1−f(i)))]
- 多分类
J ( W , b ) = − [ 1 m ∑ i = 1 m ∑ k = 1 n y k ( i ) log f k ( i ) ] J(W, b)=-\left[\frac{1}{m} \sum_{i=1}^{m} \sum_{k=1}^{n} y_{k}^{(i)} \log f_{k}^{(i)}\right] J(W,b)=−[m1i=1∑mk=1∑nyk(i)logfk(i)]
- 交叉熵和softmax的关系:crossentropy和softmax关系
Smooth L1
smooth L 1 ( x ) = { 0.5 x 2 ∣ x ∣ < 1 ∣ x ∣ − 0.5 otherwise \operatorname{smooth}_{L_{1}}(x)=\left\{\begin{array}{ll}0.5 x^{2} & |x|<1 \\ |x|-0.5 & \text { otherwise }\end{array}\right. smoothL1(x)={0.5x2∣x∣−0.5∣x∣<1 otherwise
优点
:① smooth L1 损失是一种鲁棒性较强的 L1 损失, 相比于 R-CNN 和 SPPNet 中使用的 L2损失, 它对离异点的敏感度更低. 当回归目标趋于无限时, L2 损失需要很小心的处理学习率的设置以避免发生梯度爆炸, 而 smooth L1 损失则会消除这种敏感情况. ② 相比于 L2 损失, L1 损失对于离异值更加鲁棒, 当预测值与目标值相差很大时, 梯度很容易爆炸, 因为梯度里面包含了 ( t i u − v i ) \left(t_{i}^{u}-v_{i}\right) (tiu−vi)这一项, 而smooth L1 在值相差很大是, 其梯度为 ±1 ( L1 在 x 绝对值较大时, 是线性的, 而 L2 是指数的, 很容易爆炸).
Focal Loss
- Focal Loss for Dense Object Detection
- 论文论点:1stage不如2stage效果好一个重要原因就是类别不平衡导致:① Two-Stage算法,在经过RPN,再通过score筛选和nms筛选过滤掉了大量的负样本,然后在分类、回归阶段又固定了正负样本比例(
1:3
),或者通过OHEM技巧使得前景和背景相对平衡。类别不平衡的问题并不明显,算法精度得以保证。② One-Stage算法需要产生超大量的预选框,训练被大量负样本所主导,Focal Loss对此种情况卓有成效。
- 即:① 无用的易分反例样本会使得模型的整体学习方向跑偏,导致无效学习,即只能分辨出没有物体的背景,而无法分辨具体的物体。② 负样本数量太大,占总的loss函数输入参数的大部分,而且多是容易分类的,因此使得模型的优化方向(即loss函数的梯度下降方向)并不是我们所希望的那样
消除类别不平衡 & 挖掘难分类样本
- 先前也有一些算法,如OHEM(online hard example mining)为解决类别不平衡(
In OHEM each example is scored by its loss, non-maximum suppression (nms) is then applied, and a minibatch is constructed with the highest-loss examples
)但是过分关注于错分类的正负样本,而忽视了容易分的正样本
- 提出Focal Loss:
- 在交叉熵损失函数基础上改的
改进思路
- 二分类交叉熵函数
L = − y log y ′ − ( 1 − y ) log ( 1 − y ′ ) = { − log y ′ y = 1 − log ( 1 − y ′ ) , y = 0 \mathrm{L}=-\mathrm{y} \log y^{\prime}-(1-y) \log \left(1-y^{\prime}\right)=\left\{\begin{array}{ll}-\log y^{\prime} & y=1 \\ -\log \left(1-y^{\prime}\right), & y=0\end{array}\right. L=−ylogy′−(1−y)log(1−y′)={−logy′−log(1−y′),y=1y=0
- 缺点:此时的损失函数在大量简单样本的迭代过程中比较缓慢且可能无法优化至最优。
- Focal Loss
L f l = { − α ( 1 − y ′ ) γ log y ′ y = 1 − ( 1 − α ) y ′ γ log ( 1 − y ′ ) , y = 0 \mathrm{L}_{f l}=\left\{\begin{array}{ll}-\alpha\left(1-y^{\prime}\right)^{\gamma} \log y^{\prime} & y=1 \\ -(1-\alpha) y^{\prime \gamma} \log \left(1-y^{\prime}\right), & y=0\end{array}\right. Lfl={−α(1−y′)γlogy′−(1−α)y′γlog(1−y′),y=1y=0
- ① γ > 0 \gamma>0 γ>0 用途:挖掘难分类样本。使得减少易分类样本的损失,使得模型更关注于困难的、错分的样本。
2最好
- ② α > 0 \alpha>0 α>0 用途:平衡正负样本本身的数量比例不均(即类别不均衡)
0.25最好
- 多分类Focal Loss:
F L ( y t ) = − α t ∗ ( 1 − y ^ t ) γ ∗ log ( y ^ t ) F L\left(y_{t}\right)=- \alpha_{t} *\left(1-\hat{y}_{t}\right)^{\gamma} * \log \left(\hat{y}_{t}\right) FL(yt)=−αt∗(1−y^t)γ∗log(y^t)
- 进一步提出 RetinaNet TODO
DR loss
- DR Loss: Improving Object Detection by Distributional Ranking
- 也是类似于Focal Loss,解决One-Stage中的类别不平衡问题。将分类问题转换为排序问题,从而避免了正负样本不平衡的问题。同时针对排序,提出了排序的损失函数DR loss,并给出了可求导的解。
- 公式变形
- 原分类优化函数为,其中: P i , j , k P_{i,j,k} Pi,j,k表示第i个图像中第j个候选对象第k类的估计概率!
min θ ∑ i N ∑ j , k ℓ ( p i , j , k ) = > min θ ∑ i N ( ∑ j + n + ℓ ( p i , j + ) + ∑ j − n − ℓ ( p i , j − ) ) \min _{\theta} \sum_{i}^{N} \sum_{j, k} \ell\left(p_{i, j, k}\right) => \\ \min _{\theta} \sum_{i}^{N}\left(\sum_{j_{+}}^{n_{+}} \ell\left(p_{i, j_{+}}\right)+\sum_{j_{-}}^{n_{-}} \ell\left(p_{i, j_{-}}\right)\right) θmini∑Nj,k∑ℓ(pi,j,k)=>θmini∑N⎝⎛j+∑n+ℓ(pi,j+)+j−∑n−ℓ(pi,j−)⎠⎞
- 将其转换为排序配对问题( γ \gamma γ表示margin):
min θ ∑ i N ∑ j + n + ∑ j − n − ℓ ( p i , j − − p i , j + + γ ) \min _{\theta} \sum_{i}^{N} \sum_{j_{+}}^{n_{+}} \sum_{j_{-}}^{n_{-}} \ell\left(p_{i, j_{-}}-p_{i, j_{+}}+\gamma\right) θmini∑Nj+∑n+j−∑n−ℓ(pi,j−−pi,j++γ)
- 每一幅图像可以写成:
1 n + n − ∑ j + n + ∑ j − n − ℓ ( p i , j − − p i , j + + γ ) = E j + , j − [ ℓ ( p i , j − − p i , j + + γ ) ] \frac{1}{n_{+} n_{-}} \sum_{j_{+}}^{n_{+}} \sum_{j_{-}}^{n_{-}} \ell\left(p_{i, j_{-}}-p_{i, j_{+}}+\gamma\right) \\ =E_{j_{+}, j_{-}}\left[\ell\left(p_{i, j_{-}}-p_{i, j_{+}}+\gamma\right)\right] n+n−1j+∑n+j−∑n−ℓ(pi,j−−pi,j++γ)=Ej+,j−[ℓ(pi,j−−pi,j++γ)]
- 进一步:(Distributional Ranking)
min θ ∑ i N ℓ ( max j − p i , j − − min j + p i , j + + γ ) \min _{\theta} \sum_{i}^{N} \ell\left(\max _{j_{-}} p_{i, j_{-}}-\min _{j_{+}} p_{i, j_{+}}+\gamma\right) θmini∑Nℓ(j−maxpi,j−−j+minpi,j++γ)
- 将O( n + n_+ n+ n − n_- n−)复杂度转换到O(1),但是max min 对Outier过于敏感!
- 进一步改进,选取正负样本中最具代表性的样本来排序!其中,sum(q) = 1,是概率分布
P i , + = ∑ j + n + q i , j + p i , j + ; P i , − = ∑ j = n − q i , j − p i , j − P_{i,+}=\sum_{j_{+}}^{n_{+}} q_{i, j_{+}} p_{i, j_{+}} ; \quad P_{i,-}=\sum_{j=}^{n_{-}} q_{i, j_{-}} p_{i, j_{-}} Pi,+=j+∑n+qi,j+pi,j+;Pi,−=j=∑n−qi,j−pi,j−
- 当q为均匀分布,则上述的公式就是求期望!
- 求解q的公式:
P i , + = min q i , + ∈ Δ ∑ j + n + q i , j + p i , j + ; P i , − = max q i , − ∈ Δ ∑ j − n − q i , j − p i , j − P_{i,+}=\min _{\mathbf{q} i,+\in \Delta} \sum_{j_{+}}^{n_{+}} q_{i, j_{+}} p_{i, j_{+}} ; \\ \quad P_{i,-}=\max _{\mathbf{q} i,-\in \Delta} \sum_{j_{-}}^{n_{-}} q_{i, j_{-}} p_{i, j_{-}} Pi,+