优化失败的可能原因
在critical point卡住了,即梯度为0的地方卡住了。
两种critical point:局部最小点;鞍点
在低维度中的局部最小点在高维度中可能是鞍点;在低维度中的critical point在高维度中可能不属于critical point
找出是哪一种情形:泰勒级数
当
θ
\theta
θ趋于
θ
′
\theta'
θ′时:
L
(
θ
)
≈
L
(
θ
′
)
+
(
θ
−
θ
′
)
T
∂
θ
′
∂
θ
i
+
1
2
(
θ
−
θ
′
)
T
∂
2
L
(
θ
′
)
∂
θ
i
∂
θ
j
(
θ
−
θ
′
)
L(\theta)≈L(\theta')+(\theta-\theta')^T \frac{\partial \theta'}{\partial \theta_i}+\frac{1}{2}(\theta-\theta')^T\frac{\partial^2L(\theta')}{\partial\theta_i\partial\theta_j}(\theta-\theta')
L(θ)≈L(θ′)+(θ−θ′)T∂θi∂θ′+21(θ−θ′)T∂θi∂θj∂2L(θ′)(θ−θ′)
对于critical point,一次微分项为0,即 ( θ − θ ′ ) T ∂ θ ′ ∂ θ i = 0 (\theta-\theta')^T \frac{\partial \theta'}{\partial \theta_i}=0 (θ−θ′)T∂θi∂θ′=0
记 ( θ − θ ′ ) T ∂ 2 L ( θ ′ ) ∂ θ i ∂ θ j ( θ − θ ′ ) = v T H v (\theta-\theta')^T\frac{\partial^2L(\theta')}{\partial\theta_i\partial\theta_j}(\theta-\theta')=v^THv (θ−θ′)T∂θi∂θj∂2L(θ′)(θ−θ′)=vTHv
其中
H
=
H=
H=
[
∂
2
L
∂
θ
1
2
∂
2
L
∂
θ
1
∂
θ
2
∂
2
L
∂
θ
2
∂
θ
1
∂
2
L
∂
θ
2
2
]
\begin{bmatrix} \frac{\partial^2 L}{\partial \theta^2_1} & \frac{\partial^2 L}{\partial \theta_1\partial\theta_2} \\ \frac{\partial^2 L}{\partial \theta_2\partial\theta_1} & \frac{\partial^2 L}{\partial \theta^2_2} \end{bmatrix}
[∂θ12∂2L∂θ2∂θ1∂2L∂θ1∂θ2∂2L∂θ22∂2L]
对所有的
v
v
v:
- v T H v > 0 → v^THv>0\to vTHv>0→在 θ ′ \theta' θ′附近 L ( θ ) > L ( θ ′ ) → L(\theta)>L(\theta')\to L(θ)>L(θ′)→局部最小
- v T H v < 0 → v^THv<0\to vTHv<0→在 θ ′ \theta' θ′附近 L ( θ ) < L ( θ ′ ) → L(\theta)<L(\theta')\to L(θ)<L(θ′)→局部最大
- v T H v v^THv vTHv时大时小 → \to →鞍点
延伸:(序号和上方一一对应)
- H是正定矩阵(所有特征值为正)
- H是负定矩阵(所有特征值为负)
- H的特征值有正有负
逃离鞍点(理论上)
记 H H H的特征向量为 u u u,则 u T H u = λ ∣ ∣ u ∣ ∣ 2 u^THu=\lambda||u||^2 uTHu=λ∣∣u∣∣2
若 λ < 0 ⇒ λ ∣ ∣ u ∣ ∣ 2 < 0 ⇒ u T H u < 0 \lambda<0\Rightarrow \lambda||u||^2<0\Rightarrow u^THu<0 λ<0⇒λ∣∣u∣∣2<0⇒uTHu<0
⇒ L ( θ ) ≈ L ( θ ′ ) + 1 2 u T H u < L ( θ ′ ) \Rightarrow L(\theta)≈L(\theta')+\frac{1}{2}u^THu <L(\theta') ⇒L(θ)≈L(θ′)+21uTHu<L(θ′)
即令 θ = θ ′ + u \theta=\theta'+u θ=θ′+u可以减小 L L L
也就是说,往 u u u的方向移动可以减小 L L L
(实际使用过程中通常不用 → \to →计算太复杂)
分组计算
- 将训练数据分为很多个小组,每计算完一组数据更新一次参数
大组合小组的对比
比较 | 小组 | 大组 |
---|---|---|
速度 | 一样 | 一样 |
一个周期的时长 | 慢 | 快 |
梯度 | 有噪音 | 稳定 |
优化性能 | 更好 | 更差 |
Generalization | 更好 | 更差 |
- 训练时,大、小组训练得一样好,但在测试时小组表现更好。via On Large-Batch Training for Deep Learning: Generalization Gap and Sharp Minima.
加入动量
- 梯度下降+动量:更新参数的方向改为梯度的反方向+上一次更新的方向(向量和)
θ 0 , m 0 = 0 ⇒ 计 算 g 0 ⇒ m 1 = λ m 0 − η g 0 \theta^0,m^0=0\Rightarrow 计算g^0\Rightarrow m^1=\lambda m^0-\eta g^0 θ0,m0=0⇒计算g0⇒m1=λm0−ηg0
⇒ θ 1 = θ 0 + m 1 ⇒ 计 算 g 1 ⇒ m 2 = λ m 1 − η g 1 \Rightarrow \theta^1=\theta^0+m^1\Rightarrow计算g^1\Rightarrow m^2=\lambda m^1-\eta g^1 ⇒θ1=θ0+m1⇒计算g1⇒m2=λm1−ηg1
… \dots …
m i = λ m i − 1 − η g i − 1 ⇒ θ i = θ i − 1 + m i m^i=\lambda m^{i-1}-\eta g^{i-1}\Rightarrow \theta^i=\theta^{i-1}+m^i mi=λmi−1−ηgi−1⇒θi=θi−1+mi
- 实质上: m i m^i mi是 g 0 , … g i − 1 g^0, \dots g^{i-1} g0,…gi−1的加权和
动态调参
特制 η \eta η
希望同参数同方向也可以动态调整 η ⇒ R M S P r o p \eta \Rightarrow RMSProp η⇒RMSProp
θ 1 = θ 0 − η σ 0 g 0 , σ 0 = ( g 0 ) 2 \theta^1=\theta^0-\frac{\eta}{\sigma^0}g^0, \sigma^0=\sqrt{(g^0)^2} θ1=θ0−σ0ηg0,σ0=(g0)2
θ 2 = θ 1 − η σ 1 g 1 , σ 1 = α ( σ 0 ) 2 + ( 1 − α ) ( g 1 ) 2 \theta^2=\theta^1-\frac{\eta}{\sigma^1}g^1, \sigma^1=\sqrt{\alpha(\sigma^0)^2+(1-\alpha)(g^1)^2} θ2=θ1−σ1ηg1,σ1=α(σ0)2+(1−α)(g1)2
… \dots …
θ t = θ t − 1 − η σ t g t , σ t = α ( σ t − 1 ) 2 + ( 1 − α ) ( g t ) 2 \theta^t=\theta^{t-1}-\frac{\eta}{\sigma^t}g^t, \sigma^t=\sqrt{\alpha(\sigma^{t-1})^2+(1-\alpha)(g^t)^2} θt=θt−1−σtηgt,σt=α(σt−1)2+(1−α)(gt)2
⋆ \star ⋆加入 α \alpha α衡量 g i g^i gi的重要性
其他工具:adam=RMSProop+动量,在pytorch中可以直接调用,一般不调预设参数
Learning Rate Scheduling
调整 θ t + 1 = θ t − η t σ t m t \theta^{t+1}=\theta^t-\frac{\eta ^t}{\sigma ^t}m^t θt+1=θt−σtηtmt 中的 η t \eta^t ηt
- Decay: η \eta η 随时间越来越小(越来越接近目标,所以减小步长以免在步长内跳过目标)
- Warm Up: η \eta η 先变大再变小
用回归做分类问题
使不同类别间距一致的方法
设为向量
c
l
a
s
s
1
:
[
1
0
0
]
class 1:\begin{bmatrix} 1\\0\\0 \end{bmatrix}
class1:⎣⎡100⎦⎤
c
l
a
s
s
2
:
[
0
1
0
]
c
l
a
s
s
3
:
[
0
0
1
]
\ class2:\begin{bmatrix} 0\\1\\0 \end{bmatrix} \ class3:\begin{bmatrix} 0\\0\\1 \end{bmatrix}
class2:⎣⎡010⎦⎤ class3:⎣⎡001⎦⎤
同时网络由单输入单输出变为多输入多输出
y
=
b
′
+
w
′
σ
(
b
+
w
x
)
⇒
y
′
=
s
o
f
t
m
a
x
(
y
)
⇔
y
^
y=b'+w'\sigma(b+wx)\Rightarrow y'=softmax(y)\Leftrightarrow\hat{y}
y=b′+w′σ(b+wx)⇒y′=softmax(y)⇔y^
softmax
将y映射为(0,1)的实数,并归一化使和为1。
y ′ = e y i ∑ i e y i ⇒ { 0 < y i < 1 , ∑ i y i ′ = 1 y'=\frac{e^{y_i}}{\sum_i e^{y_i}} \Rightarrow \left\{\begin{matrix}0<y_i<1,\\\sum_i y'_i=1 \end{matrix}\right. y′=∑ieyieyi⇒{0<yi<1,∑iyi′=1
会让差距大的值之间的差距更大
- 当只有2个类别时,直接取sigmoid效果和用softmax一样
计算损失
L = 1 N ∑ n e n L=\frac{1}{N}\sum_ne_n L=N1∑nen
e n e_n en有两种计算方法:
- 均方误差: e n = ∑ i ( y i ^ − y i ′ ) 2 e_n=\sum_i(\hat{y_i}-y_i')^2 en=∑i(yi^−yi′)2
- 交叉熵: e n = − ∑ i y i ^ l n y i ′ e_n=-\sum_i\hat{y_i}lny_i' en=−∑iyi^lnyi′
均方误差在损失大的地方可能会卡主,交叉熵更适合用于分类问题。
使交叉熵 m i n min min等价于使相似度 m a x max max。
分批次标准化
前情提要:特征缩放
- 如果使用sigmoid作为激活函数,则在sigmoid之前做特征缩放更好 ⇒ \Rightarrow ⇒在0附近有更大的梯度值
分批次标准化
要使均值不为0,加入新的参数进去:
在测试时,可能无法获得一个Batch的数据就要进行计算,解决方法:
对每一个batch的
μ
\mu
μ 和
σ
\sigma
σ 都拿来计算动态均值
μ
‾
=
p
μ
‾
+
(
1
−
p
)
μ
t
\overline{\mu}=p\overline{\mu}+(1-p)\mu^t
μ=pμ+(1−p)μt
σ
‾
=
p
σ
‾
+
(
1
−
p
)
σ
t
\overline{\sigma}=p\overline{\sigma}+(1-p)\sigma^t
σ=pσ+(1−p)σt
⇒ z ~ = z − μ ‾ σ ‾ \Rightarrow \tilde{z}=\frac{z-\overline{\mu}}{\overline{\sigma}} ⇒z~=σz−μ