赞
踩
假设 神经元的输入:
输出的结果:
ICS 问题: X 的 分布可能相差很大
解决方法:
基本思想:在将 x 送给神经元之前,先对其做平移和伸缩变换, 将 x 的分布规范化成在固定区间范围的标准分布;
变换框架:
参数介绍:
μ:平移参数
δ:缩放参数
得到的数据符合均值为 0、方差为 1 的标准分布
得到的数据符合均值为 b 、方差为 g 2 g^2 g2 的分布
其中 M 是 mini-batch 的大小。
每个 mini-batch 比较大,数据分布比较接近。在进行训练之前,要做好充分的 shuffle. 否则效果会差很多。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o1r9z6Ut-1677244916184)(img/20201223132538.png)]
其中 i 枚举了该层所有的输入神经元。对应到标准公式中,四大参数 μ, δ, g, b 均为标量(BN中是向量),所有输入共享一个规范化变换。
LN 针对单个训练样本进行,不依赖于其他数据,因此可以避免 BN 中受 mini-batch 数据分布影响的问题,可以用于 小mini-batch场景、动态网络场景和 RNN,特别是自然语言处理领域。此外,LN 不需要保存 mini-batch 的均值和方差,节省了额外的存储空间。
BN 的转换是针对单个神经元可训练的——不同神经元的输入经过再平移和再缩放后分布在不同的区间,而 LN 对于一整层的神经元训练得到同一个转换——所有的输入都在同一个区间范围内。如果不同输入特征不属于相似的类别(比如颜色和大小),那么 LN 的处理可能会降低模型的表达能力。
其中:W’ = λW
原因:当权重 W 伸缩时,对应的均值和标准差均等比例伸缩,分子分母相抵。
优点:
注:因此,权重的伸缩变化不会影响反向梯度的 Jacobian 矩阵,因此也就对反向传播没有影响,避免了反向传播时因为权重过大或过小导致的梯度消失或梯度爆炸问题,从而加速了神经网络的训练。
因此,下层的权重值越大,其梯度就越小。这样,参数的变化就越稳定,相当于实现了参数正则化的效果,避免参数的大幅震荡,提高网络的泛化性能。
注:x’= λx
对于某一层神经元 :
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HWL21amK-1677244919405)(null)]
可得:
每一层神经元的输出依赖于底下各层的计算结果。如果没有正则化,当下层输入发生伸缩变化时,经过层层传递,可能会导致数据发生剧烈的膨胀或者弥散,从而也导致了反向计算时的梯度爆炸或梯度弥散。
加入 Normalization 之后,不论底层的数据如何变化,对于某一层神经元 而言,其输入 x i x_i xi 永远保持标准的分布,这就使得高层的训练更加简单。从梯度的计算公式来看:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8dZxeMFS-1677244916191)(img/20201223140304.png)]
数据的伸缩变化也不会影响到对该层的权重参数更新,使得训练过程更加鲁棒,简化了对学习率的选择。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gCTo33GE-1677244916192)(img/微信截图_20210203230623.png)]
因为 每一列 数据的量纲不同,导致 数据分布区间存在差异。
举例:(人的身高可以是 180cm,也可以是 1.8m,这两个虽然表示意义相同,但是由于单位的不同,导致 机器学习在计算过程中也容易出现差异,所以就需要对数据进行归一化)。
每个维度都是去量纲化的,避免了不同量纲的选取对距离计算产生的巨大影响。
欠拟合和过拟合属于对立情况,都是导致模型泛化能力不高的两种常见原因,均是模型学习能力和数据复杂性失调的表现
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dZvGdFrH-1677244916197)(img/激活函数.png)]
σ ( x ) = 1 1 + e − x \sigma(x)=\frac {1}{1+e^{-x}} σ(x)=1+e−x1
sigmoid 函数 能够把输入的连续实值变换为0和1之间的输出,特别的,如果是非常大的负数,那么输出就是0;如果是非常大的正数,输出就是1.
t a n h ( x ) = e x − e − x e x + e − x tanh(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}} tanh(x)=ex+e−xex−e−x
tanh 函数 能够 解决 sigmoid 函数 非 0 均值 问题
f ( x ) = m a x ( 0 , x ) f(x)=max(0, x) f(x)=max(0,x)
判别模型是直接对P(Y|X)建模,就是说,直接根据X特征来对Y建模训练。
对数据量要求没生成式的严格,速度也会快,小数据量下准确率也会好些。
在模型训练中,我学习到的是X与Y的联合模型 P(X,Y) ,也就是说,我在训练阶段是只对 P(X,Y) 建模,我需要确定维护这个联合概率分布的所有的信息参数。完了之后在inference再对新的sample计算 P(Y|X) ,导出 Y,但这已经不属于建模阶段了。
所包含的信息非常齐全,我称之为“上帝信息”,所以不仅可以用来输入label,还可以干其他的事情。生成式模型关注结果是如何产生的。
但是生成式模型需要非常充足的数据量以保证采样到了数据本来的面目,所以速度相比之下较慢。
在机器学习算法中,通常存在很多问题并没有最优的解,或是要计算出最优的解要花费很大的计算量,面对这类问题一般的做法是利用迭代的思想尽可能的逼近问题的最优解。将解决此类优化问题的方法叫做优化算法,优化算法本质上是一种数学方法。
每次使用一批数据进行梯度的计算,而非计算全部数据的梯度,因为如果每次计算全部数据的梯度,会导致运算量加大,运算时间变长,容易陷入局部最优解,而随机梯度下降可能每次不是朝着真正最小的方向,这样反而可以跳出局部的最优解。
介绍:由于SGD没有动量的概念,也即没有考虑历史梯度,所以当前时刻的动量即为当前时刻的梯度 m t = g t m_t=g_t mt=gt,且二阶动量 V t = E V_t=E Vt=E,所以SGD的参数更新公式为
Δ θ t = − η ⋅ g t \Delta\theta_t=-\eta\cdot g_t Δθt=−η⋅gt
θ t + 1 = θ t − η ⋅ g t \theta_{t+1}=\theta_t-\eta\cdot g_t θt+1=θt−η⋅gt
优点:每次使用一批数据进行梯度的计算,而非计算全部数据的梯度,因为如果每次计算全部数据的梯度,会导致运算量加大,运算时间变长,容易陷入局部最优解,而随机梯度下降可能每次不是朝着真正最小的方向,这样反而可以跳出局部的最优解。
缺点:下降速度慢,而且可能会在沟壑(还有鞍点)的两边持续震荡,停留在一个局部最优点。
介绍:为了抑制SGD的震荡,SGDM认为梯度下降过程可以加入惯性。下坡的时候,如果发现是陡坡,那就利用惯性跑的快一些。SGDM全称是SGD with momentum,在SGD基础上引入了一阶动量。而所谓的一阶动量就是该时刻梯度的指数加权移动平均值: η ⋅ m t : = β ⋅ m t − 1 + η ⋅ g t \eta\cdot m_t:=\beta\cdot m_{t-1}+\eta\cdot g_t η⋅mt:=β⋅mt−1+η⋅gt(其中当前时刻的梯度 g t g_t gt并不严格按照指数加权移动平均值的定义采用权重 1 − β 1-\beta 1−β,而是使用我们自定义的学习率 η \eta η),那么为什么要用移动平均而不用历史所有梯度的平均?因为移动平均存储量小,且能近似表示历史所有梯度的平均。由于此时仍然没有二阶动量,所以 V t = E V_t=E Vt=E,那么SGDM的参数更新公式为
Δ θ t = − η ⋅ m t = − ( β m t − 1 + η g t ) \Delta\theta_t=-\eta\cdot m_t=-\left(\beta m_{t-1}+\eta g_t\right) Δθt=−η⋅mt=−(βmt−1+ηgt)
θ t + 1 = θ t − ( β m t − 1 + η g t ) \theta_{t+1}=\theta_t-\left(\beta m_{t-1}+\eta g_t\right) θt+1=θt−(βmt−1+ηgt)
所以,当前时刻参数更新的方向不光取决于当前时刻的梯度,还取决于之前时刻的梯度,特别地,当 β = 0.9 \beta=0.9 β=0.9时, m t m_t mt近似表示的是前10个时刻梯度的指数加权移动平均值,而且离得越近的时刻的梯度权重也越大。
优点:在随机梯度下降法的基础上,增加了动量(Momentum)的技术。其核心是通过优化相关方向的训练和弱化无关方向的振荡,来加速SGD训练。Momentum的方法能够在一定程度上缓解随机梯度下降法收敛不稳定的问题,并且有一定的摆脱陷入局部最优解的能力。
缺点:对于比较深的沟壑有时用Momentum也没法跳出
指数加权移动平均值(exponentially weighted moving average,EWMA):假设 v t − 1 v_{t-1} vt−1是 t − 1 t-1 t−1时刻的指数加权移动平均值, θ t \theta_t θt是 t t t时刻的观测值,那么 t t t时刻的指数加权移动平均值为
v
t
=
β
v
t
−
1
+
(
1
−
β
)
θ
t
=
(
1
−
β
)
θ
t
+
∑
i
=
1
t
−
1
(
1
−
β
)
β
i
θ
t
−
i
其中 0 ≤ β < 1 , v 0 = 0 0 \leq \beta < 1,v_0=0 0≤β<1,v0=0。显然,由上式可知, t t t时刻的指数加权移动平均值其实可以看做前 t t t时刻所有观测值的加权平均值,除了第 t t t时刻的观测值权重为 1 − β 1-\beta 1−β外,其他时刻的观测值权重为 ( 1 − β ) β i (1-\beta)\beta^i (1−β)βi。由于通常对于那些权重小于 1 e \frac{1}{e} e1的观测值可以忽略不计,所以忽略掉那些观测值以后,上式就可以看做在求加权移动平均值。那么哪些项的权重会小于 1 e \frac{1}{e} e1呢?由于
lim n → + ∞ ( 1 − 1 n ) n = 1 e ≈ 0.3679 \lim_{n \rightarrow +\infty} \left(1-\frac{1}{n}\right)^n = \frac{1}{e} \approx 0.3679 n→+∞lim(1−n1)n=e1≈0.3679
若令 n = 1 1 − β n=\frac{1}{1-\beta} n=1−β1,则
lim n → + ∞ ( 1 − 1 n ) n = lim β → 1 ( β ) 1 1 − β = 1 e ≈ 0.3679 \lim_{n \rightarrow +\infty} \left(1-\frac{1}{n}\right)^n =\lim_{\beta \rightarrow 1} \left(\beta\right)^{\frac{1}{1-\beta}}=\frac{1}{e} \approx 0.3679 n→+∞lim(1−n1)n=β→1lim(β)1−β1=e1≈0.3679
所以,当 β → 1 \beta\rightarrow 1 β→1时,那些 i ≥ 1 1 − β i\geq\frac{1}{1-\beta} i≥1−β1的 θ t − i \theta_{t-i} θt−i的权重 ( 1 − β ) β i (1-\beta)\beta^i (1−β)βi一定小于 1 e \frac{1}{e} e1。代入计算可知,那些权重小于 1 e \frac{1}{e} e1的观测值就是近 1 1 − β \frac{1}{1-\beta} 1−β1个时刻之前的观测值。例如当 t = 20 , β = 0.9 t=20,\beta=0.9 t=20,β=0.9时, θ 1 , θ 2 , . . , θ 9 , θ 10 \theta_1,\theta_2,..,\theta_9,\theta_{10} θ1,θ2,..,θ9,θ10的权重都是小于 1 e \frac{1}{e} e1的,因此可以忽略不计,那么此时就相当于在求 θ 1 1 , θ 1 2 , . . , θ 1 9 , θ 20 \theta_11,\theta_12,..,\theta_19,\theta_{20} θ11,θ12,..,θ19,θ20这最近10个时刻的加权移动平均值。所以指数移动平均值可以近似看做在求最近 1 1 − β \frac{1}{1-\beta} 1−β1个时刻的加权移动平均值, β \beta β常取 ≥ 0.9 \geq 0.9 ≥0.9。由于当 t t t较小时,指数加权移动平均值的偏差较大,所以通常会加上一个修正因子 1 − β t 1-\beta^t 1−βt,加了修正因子后的公式为
$$v_t=\cfrac{\beta v_{t-1}+(1-\beta)\theta_t}{1-\beta^t} \$$
显然,当 t t t很小时,修正因子 1 − β t 1-\beta^t 1−βt会起作用,当 t t t足够大时 ( 1 − β t ) → 1 (1-\beta^t)\rightarrow 1 (1−βt)→1,修正因子会自动退场。
介绍:除了利用惯性跳出局部沟壑以外,我们还可以尝试往前看一步。想象一下你走到一个盆地,四周都是略高的小山,你觉得没有下坡的方向,那就只能待在这里了。可是如果你爬上高地,就会发现外面的世界还很广阔。因此,我们不能停留在当前位置去观察未来的方向,而要向前一步、多看一步、看远一些。NAG全称Nesterov Accelerated Gradient,是在SGD、SGD-M的基础上的进一步改进,改进点在于当前时刻梯度的计算,我们知道在时刻t的主要下降方向是由累积动量决定的,自己的梯度方向说了也不算,那与其看当前梯度方向,不如先看看如果跟着累积动量走了一步,那个时候再怎么走。也即在Momentum的基础上将当前时刻的梯度 g t g_t gt换成下一时刻的梯度 ∇ J ( θ t − β m t − 1 ) \nabla J(\theta_t-\beta m_{t-1}) ∇J(θt−βmt−1),由于此时也没有考虑二阶动量,所以 V t = E V_t=E Vt=E,NAG的参数更新公式为
Δ θ t = − η ⋅ m t = − ( β m t − 1 + η ∇ J ( θ t − β m t − 1 ) ) \Delta\theta_t=-\eta\cdot m_t=-\left(\beta m_{t-1}+\eta\nabla J(\theta_t-\beta m_{t-1})\right) Δθt=−η⋅mt=−(βmt−1+η∇J(θt−βmt−1))
θ t + 1 = θ t − ( β m t − 1 + η ∇ J ( θ t − β m t − 1 ) ) \theta_{t+1}=\theta_t-\left(\beta m_{t-1}+\eta\nabla J(\theta_t-\beta m_{t-1})\right) θt+1=θt−(βmt−1+η∇J(θt−βmt−1))
优点:在Momentum的基础上进行了改进,比Momentum更具有前瞻性,除了利用历史梯度作为惯性来跳出局部最优的沟壑以外,还提前走一步看看能否直接跨过沟壑。
介绍:此前我们都没有用到二阶动量。二阶动量的出现,才意味着“自适应学习率”优化算法时代的到来。SGD及其变种以同样的学习率更新每个维度的参数(因为 θ t \theta_t θt通常是向量),但深度神经网络往往包含大量的参数,这些参数并不是总会用得到(想想大规模的embedding)。对于经常更新的参数,我们已经积累了大量关于它的知识,不希望被单个样本影响太大,希望学习速率慢一些;对于偶尔更新的参数,我们了解的信息太少,希望能从每个偶然出现的样本身上多学一些,即学习速率大一些。因此,AdaGrad则考虑对于不同维度的参数采用不同的学习率,具体的,对于那些更新幅度很大的参数,通常历史累计梯度的平方和会很大,相反的,对于那些更新幅度很小的参数,通常其累计历史梯度的平方和会很小(具体图示参见:https://zhuanlan.zhihu.com/p/29920135 )。所以在一个固定学习率的基础上除以历史累计梯度的平方和就能使得那些更新幅度很大的参数的学习率变小,同样也能使得那些更新幅度很小的参数学习率变大,所以AdaGrad的参数更新公式为
v
t
,
i
=
∑
t
=
1
t
g
t
,
i
2
v_{t,i}=\sum_{t=1}^{t}g_{t,i}^2
vt,i=t=1∑tgt,i2
Δ
θ
t
,
i
=
−
η
v
t
,
i
+
ϵ
g
t
,
i
\Delta\theta_{t,i}=-\frac{\eta}{\sqrt{v_{t,i}+\epsilon}}g_{t,i}
Δθt,i=−vt,i+ϵ
ηgt,i
θ t + 1 , i = θ t , i − η v t , i + ϵ g t , i \theta_{t+1,i}=\theta_{t,i}-\frac{\eta}{\sqrt{v_{t,i}+\epsilon}}g_{t,i} θt+1,i=θt,i−vt,i+ϵ ηgt,i
其中 g t , i 2 g_{t,i}^2 gt,i2表示第 t t t时刻第 i i i维度参数的梯度值, ϵ \epsilon ϵ是防止分母等于0的平滑项(常取一个很小的值 1 e − 8 1e-8 1e−8)。显然,此时上式中的 η v t , i + ϵ \frac{\eta}{\sqrt{v_{t,i}+\epsilon}} vt,i+ϵ η这个整体可以看做是学习率,分母中的历史累计梯度值 v t , i v_{t,i} vt,i越大的参数学习率越小。上式仅仅是第 t t t时刻第 i i i维度参数的更新公式,对于第 t t t时刻的所有维度参数的整体更新公式为
V t = diag ( v t , 1 , v t , 2 , . . . , v t , d ) ∈ R d × d V_{t}=\operatorname{diag}\left(v_{t,1},v_{t,2},...,v_{t,d}\right)\in R^{d\times d} Vt=diag(vt,1,vt,2,...,vt,d)∈Rd×d
Δ θ t = − η V t + ϵ ⊙ g t \Delta\theta_{t}=-\frac{\eta}{\sqrt{V_{t}+\epsilon}}\odot g_t Δθt=−Vt+ϵ η⊙gt
θ t + 1 = θ t − η V t + ϵ ⊙ g t \theta_{t+1}=\theta_{t}-\frac{\eta}{\sqrt{V_{t}+\epsilon}}\odot g_t θt+1=θt−Vt+ϵ η⊙gt
注意,由于 V t V_t Vt是对角矩阵,所以上式中的 ϵ \epsilon ϵ只用来平滑 V t V_t Vt对角线上的元素。
介绍a:由于AdaGrad单调递减的学习率变化过于激进,我们考虑一个改变二阶动量计算方法的策略:不累积全部历史梯度,而只关注过去一段时间窗口的下降梯度,采用Momentum中的指数加权移动平均值的思路。这也就是AdaDelta名称中Delta的来历。首先看最简单直接版的RMSProp,RMSProp就是在AdaGrad的基础上将普通的历史累计梯度平方和换成历史累计梯度平方和的指数加权移动平均值,所以只需将AdaGrad中的 v t , i v_{t,i} vt,i的公式改成指数加权移动平均值的形式即可,也即
v t , i = β v t − 1 , i + ( 1 − β ) g t , i 2 v_{t,i}=\beta v_{t-1,i}+(1-\beta)g_{t,i}^2 vt,i=βvt−1,i+(1−β)gt,i2
V t = diag ( v t , 1 , v t , 2 , . . . , v t , d ) ∈ R d × d V_{t}=\operatorname{diag}\left(v_{t,1},v_{t,2},...,v_{t,d}\right)\in R^{d\times d} Vt=diag(vt,1,vt,2,...,vt,d)∈Rd×d
Δ θ t = − η V t + ϵ ⊙ g t \Delta\theta_{t}=-\frac{\eta}{\sqrt{V_{t}+\epsilon}}\odot g_t Δθt=−Vt+ϵ η⊙gt
θ t + 1 = θ t − η V t + ϵ ⊙ g t \theta_{t+1}=\theta_{t}-\frac{\eta}{\sqrt{V_{t}+\epsilon}}\odot g_t θt+1=θt−Vt+ϵ η⊙gt
而AdaDelta除了对二阶动量计算指数加权移动平均以外,还对当前时刻的下降梯度 Δ θ t \Delta\theta_{t} Δθt也计算一个指数加权移动平均,具体地
E [ Δ θ 2 ] t , i = γ E [ Δ θ 2 ] t − 1 , i + ( 1 − γ ) Δ θ t , i 2 \operatorname{E}[\Delta\theta^2]_{t,i}=\gamma\operatorname{E}[\Delta\theta^2]_{t-1,i}+(1-\gamma)\Delta\theta^2_{t,i} E[Δθ2]t,i=γE[Δθ2]t−1,i+(1−γ)Δθt,i2
由于 Δ θ t , i 2 \Delta\theta^2_{t,i} Δθt,i2目前是未知的,所以只能用 t − 1 t-1 t−1时刻的指数加权移动平均来近似替换,也即
E [ Δ θ 2 ] t − 1 , i = γ E [ Δ θ 2 ] t − 2 , i + ( 1 − γ ) Δ θ t − 1 , i 2 \operatorname{E}[\Delta\theta^2]_{t-1,i}=\gamma\operatorname{E}[\Delta\theta^2]_{t-2,i}+(1-\gamma)\Delta\theta^2_{t-1,i} E[Δθ2]t−1,i=γE[Δθ2]t−2,i+(1−γ)Δθt−1,i2
除了计算出 t − 1 t-1 t−1时刻的指数加权移动平均以外,AdaDelta还用此值替换我们预先设置的学习率 η \eta η,因此,AdaDelta的参数更新公式为
v t , i = β v t − 1 , i + ( 1 − β ) g t , i 2 v_{t,i}=\beta v_{t-1,i}+(1-\beta)g_{t,i}^2 vt,i=βvt−1,i+(1−β)gt,i2
V t = diag ( v t , 1 , v t , 2 , . . . , v t , d ) ∈ R d × d V_{t}=\operatorname{diag}\left(v_{t,1},v_{t,2},...,v_{t,d}\right)\in R^{d\times d} Vt=diag(vt,1,vt,2,...,vt,d)∈Rd×d
E [ Δ θ 2 ] t − 1 , i = γ E [ Δ θ 2 ] t − 2 , i + ( 1 − γ ) Δ θ t − 1 , i 2 \operatorname{E}[\Delta\theta^2]_{t-1,i}=\gamma\operatorname{E}[\Delta\theta^2]_{t-2,i}+(1-\gamma)\Delta\theta^2_{t-1,i} E[Δθ2]t−1,i=γE[Δθ2]t−2,i+(1−γ)Δθt−1,i2
Θ t = diag ( E [ Δ θ 2 ] t − 1 , 1 , E [ Δ θ 2 ] t − 1 , 2 , . . . , E [ Δ θ 2 ] t − 1 , d ) ∈ R d × d \Theta_{t}=\operatorname{diag}\left(\operatorname{E}[\Delta\theta^2]_{t-1,1},\operatorname{E}[\Delta\theta^2]_{t-1,2},...,\operatorname{E}[\Delta\theta^2]_{t-1,d}\right)\in R^{d\times d} Θt=diag(E[Δθ2]t−1,1,E[Δθ2]t−1,2,...,E[Δθ2]t−1,d)∈Rd×d
Δ θ t = − Θ t + ϵ V t + ϵ ⊙ g t \Delta\theta_{t}=-\frac{\sqrt{\Theta_{t}+\epsilon}}{\sqrt{V_{t}+\epsilon}}\odot g_t Δθt=−Vt+ϵ Θt+ϵ ⊙gt
θ t + 1 = θ t − Θ t + ϵ V t + ϵ ⊙ g t \theta_{t+1}=\theta_{t}-\frac{\sqrt{\Theta_{t}+\epsilon}}{\sqrt{V_{t}+\epsilon}}\odot g_t θt+1=θt−Vt+ϵ Θt+ϵ ⊙gt
显然,对于AdaDelta算法来说,已经不需要我们自己预设学习率 η \eta η了,只需要预设 β \beta β和 γ \gamma γ这两个指数加权移动平均值的衰减率即可。
Adam=adagrad(用于处理稀疏的梯度)+RMSPro(处理非常态数据)
m t = β 1 m t − 1 + ( 1 − β 1 ) g t m_t = \beta_1 m_{t-1} + (1 - \beta_1) g_t mt=β1mt−1+(1−β1)gt
v t , i = β 2 v t − 1 , i + ( 1 − β 2 ) g t , i 2 v_{t,i}=\beta_2 v_{t-1,i}+(1-\beta_2)g_{t,i}^2 vt,i=β2vt−1,i+(1−β2)gt,i2
V t = diag ( v t , 1 , v t , 2 , . . . , v t , d ) ∈ R d × d V_{t}=\operatorname{diag}\left(v_{t,1},v_{t,2},...,v_{t,d}\right)\in R^{d\times d} Vt=diag(vt,1,vt,2,...,vt,d)∈Rd×d
m
^
t
=
m
t
1
−
β
1
t
v
^
t
,
i
=
v
t
,
i
1
−
β
2
t
V
^
t
=
diag
(
v
^
t
,
1
,
v
^
t
,
2
,
.
.
.
,
v
^
t
,
d
)
∈
R
d
×
d
所以,Adam的参数更新公式为
Δ θ t = − η V ^ t + ϵ ⊙ m ^ t \Delta\theta_{t}=-\frac{\eta}{\sqrt{\hat{V}_{t}+\epsilon}}\odot \hat{m}_t Δθt=−V^t+ϵ η⊙m^t
θ t + 1 = θ t − η V ^ t + ϵ ⊙ m ^ t \theta_{t+1}=\theta_{t}-\frac{\eta}{\sqrt{\hat{V}_{t}+\epsilon}}\odot \hat{m}_t θt+1=θt−V^t+ϵ η⊙m^t
θ
t
+
1
=
θ
t
−
η
V
^
t
+
ϵ
⊙
m
^
t
=
θ
t
−
η
V
^
t
+
ϵ
⊙
(
β
1
m
t
−
1
1
−
β
1
t
+
(
1
−
β
1
)
g
t
1
−
β
1
t
)
此时,如果我们将第 t − 1 t-1 t−1时刻的动量 m t − 1 m_{t-1} mt−1用第 t t t时刻的动量 m t m_{t} mt近似代替的话,那么我们就引入了「未来因素」,所以将 m t − 1 m_{t-1} mt−1替换成 m t m_{t} mt即可得到Nadam的表达式
θ
t
+
1
=
θ
t
−
η
V
^
t
+
ϵ
⊙
(
β
1
m
t
1
−
β
1
t
+
(
1
−
β
1
)
g
t
1
−
β
1
t
)
=
θ
t
−
η
V
^
t
+
ϵ
⊙
(
β
1
m
^
t
+
(
1
−
β
1
)
g
t
1
−
β
1
t
)
我们所说的正则化,就是在原来的loss function的基础上,加上了一些正则化项或者称为模型复杂度惩罚项。
介绍:指向量中非零元素的个数,希望参数中大部分元素为0,希望参数是稀疏的;
公式: ∑ j = 1 , θ j ≠ 0 m θ j 0 \sum_{j=1, \theta_{j} \neq 0}^{m} \theta_{j}^{0} ∑j=1,θj=0mθj0
直观理解:即将所有的非零项都作为1加起来,然后再用步长 λ \lambda λ调节。意思很明显,每一个对预测产生了贡献的参数,我都惩罚一次,不多不少,大家都一样。
就像一个法官判决,你偷了一毛钱,他杀了一个人,法官均以“价值观不正确”为由,把你们判一样的罪……只有一点都没参与的人,才不会被判刑。
∑ j = 1 m ∣ θ j ∣ \sum_{j=1}^{m}\left|\theta_{j}\right| ∑j=1m∣θj∣
拿法官举例子,就是,法官要按照你们的罪行量刑判罪,但是都得判,无论你影响最终是好是坏(比如你杀了个人,这个人也是个坏人,但是你还是犯了杀人罪得判刑)都按照罪行判罪。于是就都取个绝对值,表示都判,然后按照罪行大小判罪了……
∑ j = 1 m θ j 2 \sum_{j=1}^{m} \theta_{j}^{2} ∑j=1mθj2
在经验风险最小化的基础上(也就是训练误差最小化),尽可能采用简单的模型,以此提高泛化预测精度。
下面是一个图像解释(假设X为一个二维样本,那么要求解参数 w w w也是二维):
L1和L2加入后的函数图像:
从上面两幅图中我们可以看出:
如果不加L1和L2正则化的时候,对于线性回归这种目标函数凸函数的话,我们最终的结果就是最里边的紫色的小圈圈等高线上的点。
当加入L1正则化的时候,我们先画出以下函数的图像:
∣ ω 1 ∣ + ∣ ω 2 ∣ = F \left|\omega_{1}\right|+\left|\omega_{2}\right|=F ∣ω1∣+∣ω2∣=F
该图像也就是一个菱形,代表这些曲线上的点算出来的1范数 ∣ ω 1 ∣ + ∣ ω 2 ∣ \left|\omega_{1}\right|+\left|\omega_{2}\right| ∣ω1∣+∣ω2∣ 都为F,那我们现在的目标是不仅是原曲线算得值要小(越来越接近中心的紫色圈圈),还要使得这个菱形越小越好(F越小越好)。那么还和原来一样的话,过中心紫色圈圈的那个菱形明显很大,因此我们要取到一个恰好的值。那么如何求值呢?
以同一条原曲线目标等高线来说,现在以最外圈的红色等高线为例,我们看到,对于红色曲线上的每个点都可以做一个菱形,根据上图可知,当这个菱形与某条等高线相切(仅有一个交点)的时候,这个菱形最小。用公式说这个时候能使得在相同的 1 / N ∗ ∑ i = 1 N ( y i − ω T x i ) 2 1 / N * \sum_{i=1}^{N}\left(y_{i}-\omega^{T} x_{i}\right)^{2} 1/N∗∑i=1N(yi−ωTxi)2下,由于相切的时候的 C ∥ ω ∥ 1 C\|\omega\|_{1} C∥ω∥1,即 ∣ ω 1 ∣ + ∣ ω 2 ∣ \left|\omega_{1}\right|+\left|\omega_{2}\right| ∣ω1∣+∣ω2∣小,所以:能够使得 1 / N ∗ ∑ i = 1 N ( y i − ω T x i ) 2 + C ∥ ω ∥ 1 1 / N * \sum_{i=1}^{N}\left(y_{i}-\omega^{T} x_{i}\right)^{2}+C\|\omega\|_{1} 1/N∗∑i=1N(yi−ωTxi)2+C∥ω∥1更小。
有了上述说明,我们可以看出,最终加入L1范数得到的解,一定是某个菱形和某条原函数等高线的切点。现在有个比较重要的结论来了,我们经过观察可以看到,几乎对于很多原函数等高曲线,和某个菱形相交的时候及其容易相交在坐标轴(比如上图),也就是说最终的结果,解的某些维度及其容易是0,比如上图最终解是
ω
=
(
0
,
x
)
\omega=(0, x)
ω=(0,x)
这也就是我们所说的L1更容易得到稀疏解(解向量中0比较多)的原因。
当然了,光看着图说,L1的菱形更容易和等高线相交在坐标轴,一点都没说服力,只是个感性的认识,不过不要紧,其实是很严谨的,我们直接用求导来证明,具体的证明这里有一个很好的答案了,简而言之就是假设现在我们是一维的情况下
h ( ω ) = f ( ω ) + C ∣ ω ∣ h(\omega)=f(\omega)+C|\omega| h(ω)=f(ω)+C∣ω∣
其中$ h(\omega) 是目标函数, 是目标函数, 是目标函数,f(\omega) 是没加 L 1 正则化的目标函数, 是没加L1正则化的目标函数, 是没加L1正则化的目标函数,C|\omega|$是L1正则项,那么要使得0点成为最值的可能得点,,虽然在0点不可导,但是我们只需要让0点左右的导数异号,即
h 左 ′ ( 0 ) ∗ h 右 ′ ( 0 ) = ( f ′ ( 0 ) + C ) ( f ′ ( 0 ) − C ) < 0 h_{\mathrm{左}}^{\prime}(0) * h_{\mathrm{右}}^{\prime}(0)=\left(f^{\prime}(0)+C\right) \quad\left(f^{\prime}(0)-C\right)<0 h左′(0)∗h右′(0)=(f′(0)+C)(f′(0)−C)<0
也就是 C > ∣ f ′ ( 0 ) ∣ C>\left|f^{\prime}(0)\right| C>∣f′(0)∣的情况下,0点都是可能得最值点。
当加入L2正则化的时候,分析和L1正则化是类似的,也就是说我们仅仅是从菱形变成了圆形而已,同样还是求原曲线和圆形的切点作为最终解。当然与L1范数比,我们这样求的L2范数的从图上来看,不容易交在坐标轴上,但是仍然比较靠近坐标轴。因此这也就是我们老说的,L2范数能让解比较小(靠近0),但是比较平滑(不等于0)。
综上所述,我们可以看见,加入正则化项,在最小化经验误差的情况下,可以让我们选择解更简单(趋向于0)的解。
L1 | L2 | |
目标 | 绝对值最小化 | 平方值最小化 |
下降速度 | 以绝对值函数方式下降,较快 | 以二次函数函数方式下降,较慢 |
规则化的代价函数 | 图 1 | 图 2 |
最优解是 w1 和 w2 的取值 | L1在和每个坐标轴相交的地方都有“角”出现,而目标函数的测地线除非位置摆得非常好,大部分时候都会在角的地方相交。注意到在角的位置就会产生稀疏性,例如图中的相交点就有w1=0,而更高维的时候(想象一下三维的L1-ball 是什么样的?)除了角点以外,还有很多边的轮廓也是既有很大的概率成为第一次相交的地方,又会产生稀疏性 | 因为没有角,所以第一次相交的地方出现在具有稀疏性的位置的概率就变得非常小了。这就从直观上来解释了为什么L1-regularization 能产生稀疏性,而L2-regularization 不行的原因了 |
总结 | L1 会趋向于产生少量的特征,而其他的特征都是0 | L2 会选择更多的特征,这些特征都会接近于0 |
特点 | Lasso在特征选择时候非常有用 | Ridge就只是一种规则化而已 |
使用选择方面 | 特征多,但是其作用的特征少的情况【自动选择特征】 | 特征中起作用的特征多的情况 |
分布类型 | 拉普拉斯分布 | 高斯分布 |
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RVeYWyFh-1677244916204)(img/20200812203815.png)]
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。