文章目录
- 引
- 主要内容
- 证明
- 定理1的证明
- Claim 1 的证明
- Kronecker product (克罗内克积)
- ( A 1 ⊙ A 2 ) ( B 1 ⊙ B 2 ) = ( A 1 B 1 ) ⊙ ( A 2 B 2 ) (A_1 \odot A_2)(B_1 \odot B_2) = (A_1 B_1) \odot (A_2B_2) (A1⊙A2)(B1⊙B2)=(A1B1)⊙(A2B2)
- ( A ⊙ B ) T = A T ⊙ B T (A \odot B)^T=A^T \odot B^T (A⊙B)T=AT⊙BT
- A T = A − 1 , B T = B − 1 ⇒ ( A ⊙ B ) T = ( A ⊙ B ) − 1 A^T=A^{-1},B^T=B^{-1} \Rightarrow (A \odot B)^T = (A \odot B)^{-1} AT=A−1,BT=B−1⇒(A⊙B)T=(A⊙B)−1
- Theorem 2 的证明
- 代码
引
我很喜欢这一篇文章,因为证明用到的知识并不难,但是却用的很巧,数学真是太牛了,这些人的嗅觉怎么这么好呢?
这篇文章,归根结底就是想说明一个问题,就是和一般的认知不同,随着神经网络的加深,参数更新的收敛速度并不会下降,感觉也有很多论文论述了深度depth的重要性.
不过,这篇文章,是在线性神经网络上做的一个分析,另外,标题中的Acceleration并没有很好的理论支撑,作者给出了几个特例和一些实验论据。我想作者肯定尝试过,但是想要证明想想就不易,至少得弄出个 O ( T ? ) O(T^?) O(T?)之类的.
虽然理论支撑不够,但是我感觉还是很厉害了.
主要内容
首先,为了排除一些干扰因素,就是Acceleration来自于俩个网络的表达能力不同,神经网络
N
1
,
N
2
N_1,N_2
N1,N2, 如果二者的收敛速度不同,原因可能是
N
1
N_1
N1和
N
2
N_2
N2能让损失下降的程度不同. 而在线性网络中,层数增加并不会改变网络的表达能力.
L
(
W
)
L(W)
L(W)是关于
W
∈
R
k
×
d
W\in \R^{k\times d}
W∈Rk×d的损失函数,这个网络的表达能力和
L
(
W
N
W
N
−
1
⋯
W
1
)
L(W_NW_{N-1}\cdots W_1)
L(WNWN−1⋯W1)的表达能力是相同的,如果
W
N
W
N
−
1
⋯
W
1
∈
R
k
×
d
W_NW_{N-1}\cdots W_1\in \R^{k \times d}
WNWN−1⋯W1∈Rk×d.
对上面的结论,有一点点存疑,假设后者的最优为 ( W N ∗ , W N − 1 ∗ , … , W 1 ∗ ) (W_N^*, W_{N-1}^*,\ldots,W_1^*) (WN∗,WN−1∗,…,W1∗),那么只要让 W = W N ∗ W N − 1 ∗ ⋯ W 1 ∗ W=W_N^* W_{N-1}^*\cdots W_1^* W=WN∗WN−1∗⋯W1∗即可,所以 L ( W ∗ ) ≤ L ( W N ∗ W N − 1 ∗ ⋯ W 1 ∗ ) L(W^*)\le L(W_N^* W_{N-1}^*\cdots W_1^*) L(W∗)≤L(WN∗WN−1∗⋯W1∗).
反过来似乎不一定,假设 N = 2 N=2 N=2, W 2 ∈ R k × 1 , W 1 ∈ R 1 × d W_2 \in \R^{k \times 1}, W_1 \in \R^{1 \times d} W2∈Rk×1,W1∈R1×d, 但是利用here的结果,只要 W i ∈ R d i × d i − 1 W_i\in \R^{d_i \times d_{i-1}} Wi∈Rdi×di−1, 满足 d i ≥ min { k , d } d_i \ge \min \{k, d\} di≥min{k,d}且 L L L关于 W W W为凸函数,就能说明等价. 居然还用上了之前看过的结果.
符号可能有点多,尽可能简化点吧.
x
∈
R
d
x \in \R^d
x∈Rd为样本,
y
∈
R
k
y\in R^k
y∈Rk为输出,
Φ
N
:
=
{
x
→
W
N
W
N
−
1
⋯
W
1
x
∣
W
j
∈
R
n
j
×
n
j
−
1
,
j
=
1
,
⋯
,
N
}
,
\Phi^N := \{ x \rightarrow W_NW_{N-1}\cdots W_1 x|W_j \in \R^{n_j \times n_{j-1}}, j=1,\cdots,N\},
ΦN:={x→WNWN−1⋯W1x∣Wj∈Rnj×nj−1,j=1,⋯,N},
显然
n
N
=
k
,
n
0
=
d
n_N=k,n_0=d
nN=k,n0=d. 假设
L
N
(
⋅
)
L^N(\cdot)
LN(⋅)是关于
(
W
N
,
W
N
−
1
,
⋯
,
W
1
)
(W_N,W_{N-1},\cdots, W_1)
(WN,WN−1,⋯,W1)的函数, 可得
L
N
(
W
N
,
W
N
−
1
,
…
,
W
1
)
=
L
1
(
W
N
W
N
−
1
⋯
W
1
)
,
L^N(W_{N}, W_{N-1}, \ldots, W_1)=L^1(W_NW_{N-1}\cdots W_1),
LN(WN,WN−1,…,W1)=L1(WNWN−1⋯W1),
不要觉得这么做多此一举,不然后面证明的时候会弄乱的.
梯度下降采用了类似momentum的感觉,但是又有点不一样:
W
j
(
t
+
1
)
←
(
1
−
η
λ
)
W
j
(
t
)
−
η
∂
L
N
∂
W
j
(
W
1
(
t
)
,
…
,
W
N
(
t
)
)
,
j
=
1
…
N
.
W_j^{(t+1)} \leftarrow (1-\eta \lambda)W_j^{(t)} - \eta \frac{\partial L^N}{\partial W_j}(W_1^{(t)},\ldots,W_N^{(t)}), \: j=1\ldots N.
Wj(t+1)←(1−ηλ)Wj(t)−η∂Wj∂LN(W1(t),…,WN(t)),j=1…N.
η
>
0
\eta>0
η>0的学习率,
λ
≥
0
\lambda \ge 0
λ≥0是权重的递减系数.
定义
W
e
=
W
N
W
N
−
1
⋯
W
1
,
W_e = W_NW_{N-1}\cdots W_1,
We=WNWN−1⋯W1,
故
L
N
(
W
N
,
…
,
W
1
)
=
L
1
(
W
e
)
L^N(W_N,\ldots,W_1)=L^1(W_e)
LN(WN,…,W1)=L1(We).
作者假设
η
\eta
η,也就是学习率是一个小量,所以上面的式子可以从微分方程的角度去看
W
˙
j
(
t
)
=
−
η
λ
W
j
(
t
)
−
η
∂
L
N
∂
W
j
(
W
1
(
t
)
,
…
,
W
N
(
t
)
)
.
\dot{W}_j(t) = -\eta \lambda W_j(t) - \eta \frac{\partial L^N}{\partial W_j}(W_1^{(t)},\ldots,W_N^{(t)}).
W˙j(t)=−ηλWj(t)−η∂Wj∂LN(W1(t),…,WN(t)).
怎么说呢,这个所以,我的理解是
η
\eta
η很小的时候,
W
j
(
t
)
W_j(t)
Wj(t)很平缓,所以可以认为导数和
Δ
t
=
1
\Delta t=1
Δt=1的时候是一样的?
看了之前有一篇类似的Oja’rule也用了这种方法,感觉作者的意思应该是如果:
W
˙
j
(
t
)
=
−
λ
W
j
(
t
)
−
∂
L
N
∂
W
j
(
W
1
(
t
)
,
…
,
W
N
(
t
)
)
,
\dot{W}_j(t) = -\lambda W_j(t) - \frac{\partial L^N}{\partial W_j}(W_1^{(t)},\ldots,W_N^{(t)}),
W˙j(t)=−λWj(t)−∂Wj∂LN(W1(t),…,WN(t)),
此时,
W
j
(
t
+
η
)
=
W
(
t
)
−
[
λ
W
j
(
t
)
+
∂
L
N
∂
W
j
(
W
1
(
t
)
,
…
,
W
N
(
t
)
)
]
η
+
O
(
η
2
)
≈
(
1
−
η
λ
)
W
j
(
t
)
−
η
∂
L
N
∂
W
j
(
W
1
(
t
)
,
…
,
W
N
(
t
)
)
.
\begin{array}{ll} {W}_j(t+\eta) &= W(t)-[\lambda W_j(t) + \frac{\partial L^N}{\partial W_j}(W_1^{(t)},\ldots,W_N^{(t)})]\eta+O(\eta^2)\\ &\approx(1-\eta \lambda)W_j^{(t)} - \eta \frac{\partial L^N}{\partial W_j}(W_1^{(t)},\ldots,W_N^{(t)}). \end{array}
Wj(t+η)=W(t)−[λWj(t)+∂Wj∂LN(W1(t),…,WN(t))]η+O(η2)≈(1−ηλ)Wj(t)−η∂Wj∂LN(W1(t),…,WN(t)).
我觉得应该是这个样子的,不过对于最后的结果没有影响.
定理1
定理1 假设权重矩阵
W
1
,
…
W
N
W_1, \ldots W_N
W1,…WN满足微分方程:
W
˙
j
(
t
)
=
−
η
λ
W
j
(
t
)
−
η
∂
L
N
∂
W
j
(
W
1
(
t
)
,
…
,
W
N
(
t
)
)
,
j
=
1
,
…
,
N
,
\dot{W}_j(t) = -\eta \lambda W_j(t) - \eta \frac{\partial L^N}{\partial W_j}(W_1^{(t)},\ldots,W_N^{(t)}), j=1,\ldots,N,
W˙j(t)=−ηλWj(t)−η∂Wj∂LN(W1(t),…,WN(t)),j=1,…,N,
且
W
j
+
1
T
(
t
0
)
W
j
+
1
(
t
0
)
=
W
j
(
t
0
)
W
j
T
(
t
0
)
,
j
=
1
,
…
,
N
−
1.
W_{j+1}^T(t_0)W_{j+1}(t_0)=W_j(t_0)W_j^T(t_0), \: j=1,\ldots, N-1.
Wj+1T(t0)Wj+1(t0)=Wj(t0)WjT(t0),j=1,…,N−1.
则权重矩阵
W
e
W_e
We的变化满足下列微分方程:
W
e
˙
(
t
)
=
η
λ
N
⋅
W
e
(
t
)
−
η
∑
j
=
1
N
[
W
e
(
t
)
W
e
T
(
t
)
]
j
−
1
N
⋅
d
L
1
d
W
(
W
e
(
t
)
)
⋅
[
W
e
T
(
t
)
W
e
(
t
)
]
N
−
j
N
.
\begin{array}{ll} \dot{W_e}(t) = & \eta \lambda N \cdot W_e(t) \\ & - \eta \sum_{j=1}^N [W_e(t) W_e^T(t)]^{\frac{j-1}{N}} \cdot \\ & \quad \frac{\mathrm{d}L^1}{\mathrm{d}W}(W_e(t))\cdot [W_e^T(t)W_e(t)]^{\frac{N-j}{N}}. \end{array}
We˙(t)=ηλN⋅We(t)−η∑j=1N[We(t)WeT(t)]Nj−1⋅dWdL1(We(t))⋅[WeT(t)We(t)]NN−j.
其中
[
⋅
]
q
p
[\cdot]^{\frac{q}{p}}
[⋅]pq是关于半正定矩阵的一个定义,假如:
A
=
V
D
V
T
,
A
q
p
=
V
D
q
p
V
T
,
A = VDV^T, A^{\frac{q}{p}}=VD^{\frac{q}{p}}V^T,
A=VDVT,Apq=VDpqVT,
对角矩阵
D
q
p
D^{\frac{q}{p}}
Dpq是让对角线元素的
D
i
i
q
p
D_{ii}^{\frac{q}{p}}
Diipq.
所以,权重
W
e
W_e
We的更新变换近似于:
W
e
(
t
+
1
)
=
(
1
−
η
λ
N
)
⋅
W
e
(
t
)
−
η
∑
j
=
1
N
[
W
e
(
t
)
W
e
T
(
t
)
]
j
−
1
N
⋅
d
L
1
d
W
(
W
e
(
t
)
)
⋅
[
W
e
T
(
t
)
W
e
(
t
)
]
N
−
j
N
.
\begin{array}{ll} {W_e}(t+1) = & (1-\eta \lambda N) \cdot W_e(t) \\ & - \eta \sum_{j=1}^N [W_e(t) W_e^T(t)]^{\frac{j-1}{N}} \cdot \\ & \quad \frac{\mathrm{d}L^1}{\mathrm{d}W}(W_e(t))\cdot [W_e^T(t)W_e(t)]^{\frac{N-j}{N}}. \end{array}
We(t+1)=(1−ηλN)⋅We(t)−η∑j=1N[We(t)WeT(t)]Nj−1⋅dWdL1(We(t))⋅[WeT(t)We(t)]NN−j.
Claim 1
上面的更新实际上让人看不出一个所以然来,所以作者给出了一个向量形式的更新方式,可以更加直观地展现其中地奥秘.
Claim 1 对于任意矩阵
A
A
A, 定义
v
e
c
(
A
)
vec(A)
vec(A)为由矩阵
A
A
A按列重排后的向量形式. 于是,
其中
P
W
e
(
t
)
P_{W_e^{(t)}}
PWe(t)是一个半正定矩阵,依赖于
W
e
W_e
We, 假设
W
e
(
t
)
=
U
D
V
T
,
W_e^{(t)}=UDV^T,
We(t)=UDVT,
其中
U
=
[
u
1
,
u
2
,
…
,
u
k
]
∈
R
k
×
k
,
V
=
[
v
1
,
v
2
,
…
,
v
d
]
∈
R
d
×
d
U = [u_1,u_2, \ldots,u_k]\in \R^{k \times k}, V=[v_1,v_2,\ldots,v_d] \in \R^{d \times d}
U=[u1,u2,…,uk]∈Rk×k,V=[v1,v2,…,vd]∈Rd×d,
D
D
D的对角线元素,即
W
e
(
t
)
W_e^{(t)}
We(t)的奇异值从大到小为
σ
1
,
σ
2
,
…
,
σ
max
{
k
,
d
}
\sigma_1,\sigma_2,\ldots, \sigma_{\max \{k, d\}}
σ1,σ2,…,σmax{k,d}, 则
P
W
e
(
t
)
P_{W_e^{(t)}}
PWe(t)的特征向量和对应的特征值为:
这说明了什么呢?也就是overparameterization后的更新, W e ( t + 1 ) W_e^{(t+1)} We(t+1)的更新,也就是 v e c ( W e ( t + 1 ) ) vec(W_e ^{(t+1)}) vec(We(t+1))的更新倾向于 v e c ( u 1 v 1 T ) vec(u_1v_1^{T}) vec(u1v1T), 感觉这一点就和一些梯度下降方法的思想有点类似了,借用之前的成果. 而且,这个借用,会有一种坐标之间的互相沟通,一般的下降方法是不具备这一点的.
Claim 2
定理2
定理2 假设
d
L
1
d
W
\frac{\mathrm{d}L^1}{\mathrm{d}W}
dWdL1在
W
=
0
W=0
W=0处有定义,
W
=
0
W=0
W=0的某个邻域内连续,那么对于给定的
N
∈
N
,
N
>
2
N \in \N, N > 2
N∈N,N>2, 定义:
那么,不存在关于
W
W
W的一个函数,其梯度场为
F
F
F.
定理2的意义在于,它告诉我们,overparameterization的方法是不能通过添加正则项来实现的,因为
F
(
W
)
F(W)
F(W)不存在原函数,所以诸如
L
(
W
)
+
λ
∥
W
∥
L(W)+\lambda \|W\|
L(W)+λ∥W∥
的操作是不可能实现overparametrization的更新变化的.
证明思路是,构造一个封闭曲线,证明 F ( W ) F(W) F(W)在其上的线积分不为0. (太帅了…)
证明
定理1的证明
首先是一些符号:
∏
a
j
=
b
W
j
:
=
W
b
W
b
−
1
⋯
W
a
∏
j
=
a
b
W
j
T
:
=
W
a
T
W
a
+
1
T
⋯
W
b
T
\prod_a^{j=b} W_j := W_b W_{b-1} \cdots W_a \\ \prod_{j=a}^b W_j^T := W_a^TW_{a+1}^T \cdots W_b^T
a∏j=bWj:=WbWb−1⋯Waj=a∏bWjT:=WaTWa+1T⋯WbT
用
表示块对角矩阵.
容易证明(其实费了一番功夫,但是不想写下来,因为每次都会忘,如果下次忘了,就再推一次当惩罚):
于是
第
j
j
j个等式俩边右乘
W
j
T
(
t
)
W_j^T(t)
WjT(t), 第
j
+
1
j+1
j+1个等式俩边左乘
W
j
+
1
T
(
t
)
W_{j+1}^T(t)
Wj+1T(t)可得:
俩边乘以2
令
C
j
(
t
)
:
=
W
j
(
t
)
W
j
T
(
t
)
,
C
j
′
(
t
)
:
=
W
j
T
(
t
)
W
j
(
t
)
C_j(t):=W_j(t)W_j^T(t), C_j'(t):=W_j^T(t)W_j(t)
Cj(t):=Wj(t)WjT(t),Cj′(t):=WjT(t)Wj(t), 则
注意,我们将上面的等式改写以下,等价于
(
C
j
+
1
′
−
C
j
)
˙
(
t
)
=
−
2
η
λ
(
C
j
+
1
′
−
C
j
)
(
t
)
,
\dot{(C'_{j+1}-C_j)}(t) = -2\eta \lambda (C'_{j+1}-C_j)(t),
(Cj+1′−Cj)˙(t)=−2ηλ(Cj+1′−Cj)(t),
用
y
(
t
)
:
=
(
C
j
+
1
′
−
C
j
)
(
t
)
y(t):=(C'_{j+1}-C_j)(t)
y(t):=(Cj+1′−Cj)(t), 则
y
˙
(
t
)
=
−
2
η
λ
y
,
\dot{y}(t)=-2\eta \lambda y,
y˙(t)=−2ηλy,
另外有初值条件
y
(
t
0
)
=
0
y(t_0)=0
y(t0)=0(这是题设的条件).
容易知道,上面的微分方程的解为
y
≡
0
y\equiv0
y≡0.
所以
C
j
+
1
′
(
t
)
=
C
j
(
t
)
,
j
=
1
,
…
,
N
−
1.
C'_{j+1}(t)=C_j(t), j=1,\ldots, N-1.
Cj+1′(t)=Cj(t),j=1,…,N−1.
假设
W
j
(
t
)
W_j(t)
Wj(t)的奇异值分解为
W
j
(
t
)
=
U
j
Σ
j
V
j
T
.
W_j(t)=U_j \Sigma_jV_j^T.
Wj(t)=UjΣjVjT.
且假设
Σ
j
\Sigma_j
Σj的对角线元素,即奇异值是从大到小排列的.
则可得
显然
Σ
j
+
1
T
Σ
j
+
1
=
Σ
j
Σ
j
T
\Sigma_{j+1}^T\Sigma_{j+1}=\Sigma_j \Sigma_j^T
Σj+1TΣj+1=ΣjΣjT, 这是因为一个矩阵的特征值是固定的(如果顺序固定的话),特征向量是不一定的,因为可能有多个相同的特征值,那么对于一个特征值的子空间的任意正交基都可以作为特征向量,也就是说
其中 I d r ∈ R d r × d r I_{d_r} \in \R^{d_r \times d_r} Idr∈Rdr×dr是单位矩阵, O j , r ∈ R d r × d r O_{j,r} \in \R^{d_r \times d_r} Oj,r∈Rdr×dr是正交矩阵.
所以对于
j
=
1
…
N
−
1
j=1\ldots N-1
j=1…N−1, 成立
j
=
N
j=N
j=N有
故
注意,上面的推导需要用到:
(
d
i
a
g
(
O
j
,
1
,
…
,
O
j
,
m
)
)
T
d
i
a
g
(
(
ρ
1
)
c
I
d
1
,
…
,
(
ρ
,
)
j
I
d
m
)
(
d
i
a
g
(
O
j
,
1
,
…
,
O
j
,
m
)
)
=
d
i
a
g
(
(
ρ
1
)
c
I
d
1
,
…
,
(
ρ
,
)
j
I
d
m
)
(diag(O_{j,1},\ldots, O_{j,m}))^T diag((\rho_1)^c I_{d_1},\ldots, (\rho_,)^j I_{d_m})(diag(O_{j,1},\ldots, O_{j,m})) = diag((\rho_1)^c I_{d_1},\ldots, (\rho_,)^j I_{d_m})
(diag(Oj,1,…,Oj,m))Tdiag((ρ1)cId1,…,(ρ,)jIdm)(diag(Oj,1,…,Oj,m))=diag((ρ1)cId1,…,(ρ,)jIdm)
既然
那么
上式左端为
W
˙
e
(
t
)
\dot{W}_e(t)
W˙e(t), 于是
再利用(23)(24)的结论
Claim 1 的证明
Kronecker product (克罗内克积)
网上似乎都用
⊗
\otimes
⊗, 不过这里还是遵循论文的使用规范吧, 用
⊙
\odot
⊙来表示Kronecker product:
A
⊙
B
:
=
[
a
11
⋅
B
⋯
a
1
n
a
⋅
B
⋮
⋱
⋮
a
m
a
1
⋅
B
⋯
a
m
a
n
a
⋅
B
]
∈
R
m
a
m
b
×
n
a
n
b
,
A \odot B := \left [ \begin{array}{ccc} a_{11} \cdot B & \cdots & a_{1n_{a}} \cdot B \\ \vdots & \ddots & \vdots \\ a_{m_a1} \cdot B & \cdots & a_{m_a n_a} \cdot B \end{array} \right ] \in \R^{m_am_b \times n_an_b},
A⊙B:=⎣⎢⎡a11⋅B⋮ama1⋅B⋯⋱⋯a1na⋅B⋮amana⋅B⎦⎥⎤∈Rmamb×nanb,
其中
A
∈
R
m
a
×
n
a
,
B
∈
R
m
b
×
n
b
A \in \R^{m_a \times n_a}, B \in \R^{m_b \times n_b}
A∈Rma×na,B∈Rmb×nb.
容易证明
A
⊙
B
A \odot B
A⊙B的第
r
n
b
+
s
,
r
=
0
,
1
,
…
,
n
a
−
1
,
s
=
0
,
1
,
…
,
n
b
−
1
rn_b + s, r = 0, 1, \ldots, n_a-1, s = 0, 1, \ldots, n_b-1
rnb+s,r=0,1,…,na−1,s=0,1,…,nb−1列为:
v
e
c
(
B
∗
s
+
1
A
∗
r
+
1
T
)
,
vec(B_{*s+1}A_{*r+1}^T),
vec(B∗s+1A∗r+1T),
其中
B
∗
j
B_{*j}
B∗j表示
B
B
B的第
j
j
j列, 沿用
v
e
c
(
A
)
vec(A)
vec(A)为
A
A
A的列展开. 相应的,
A
⊙
B
A \odot B
A⊙B的第
p
m
b
+
q
,
p
=
0
,
1
,
…
,
m
a
−
1
,
q
=
0
,
1
,
…
,
m
b
−
1
pm_b+q, p=0,1,\ldots,m_a-1,q=0, 1, \ldots, m_b-1
pmb+q,p=0,1,…,ma−1,q=0,1,…,mb−1行为:
v
e
c
(
B
q
+
1
∗
T
A
p
+
1
∗
)
T
,
vec(B_{q+1*}^TA_{p+1*})^T,
vec(Bq+1∗TAp+1∗)T,
其中
A
i
∗
A_{i*}
Ai∗表示
A
A
A的第
i
i
i行.
用
[
A
⊙
B
]
(
p
,
q
,
r
,
s
)
[A\odot B]_{(p,q,r,s)}
[A⊙B](p,q,r,s)表示
[
A
⊙
B
]
[A \odot B]
[A⊙B]的第
r
n
b
+
s
rn_b+s
rnb+s列
p
m
b
+
q
pm_b+q
pmb+q行的元素, 则
[
A
⊙
B
]
(
p
,
q
,
r
,
s
)
=
a
p
+
1
,
r
+
1
b
q
+
1
,
s
+
1
[A\odot B]_{(p,q,r,s)} = a_{p+1,r+1}b_{q+1,s+1}
[A⊙B](p,q,r,s)=ap+1,r+1bq+1,s+1
另外 I d 1 ⊙ I d 2 = I d 1 d 2 I_{d_1} \odot I_{d_2} = I_{d_1d_2} Id1⊙Id2=Id1d2.
下面再证明几个重要的性质:
( A 1 ⊙ A 2 ) ( B 1 ⊙ B 2 ) = ( A 1 B 1 ) ⊙ ( A 2 B 2 ) (A_1 \odot A_2)(B_1 \odot B_2) = (A_1 B_1) \odot (A_2B_2) (A1⊙A2)(B1⊙B2)=(A1B1)⊙(A2B2)
假设
A
1
∈
R
m
1
×
l
1
,
B
1
∈
R
l
1
×
n
1
,
A
2
∈
R
m
2
×
l
2
,
B
2
∈
R
l
2
×
n
2
A_1 \in \R^{m_1 \times l_1}, B_1 \in \R^{l_1 \times n_1}, A_2 \in \R^{m_2 \times l_2}, B_2 \in \R^{l_2 \times n_2}
A1∈Rm1×l1,B1∈Rl1×n1,A2∈Rm2×l2,B2∈Rl2×n2, 则
(
A
1
⊙
A
2
)
(
B
1
⊙
B
2
)
=
(
A
1
B
1
)
⊙
(
A
2
B
2
)
(A_1 \odot A_2)(B_1 \odot B_2) = (A_1 B_1) \odot (A_2B_2)
(A1⊙A2)(B1⊙B2)=(A1B1)⊙(A2B2)
考察俩边矩阵的
(
p
m
2
+
q
,
r
n
2
+
s
)
(pm_2+q,rn_2+s)
(pm2+q,rn2+s)的元素,
[
(
A
1
⊙
A
2
)
(
B
1
⊙
B
2
)
]
(
p
,
q
,
r
,
s
)
=
(
A
1
⊙
A
2
)
p
m
2
+
q
∗
(
B
1
⊙
B
2
)
∗
r
n
2
+
s
=
v
e
c
(
A
2
q
+
1
∗
T
A
1
p
+
1
∗
)
T
v
e
c
(
B
2
∗
s
+
1
B
1
∗
r
+
1
)
=
t
r
(
A
1
p
+
1
∗
T
A
2
q
+
1
∗
B
2
∗
s
+
1
B
1
∗
r
+
1
T
)
=
(
A
1
p
+
1
∗
B
1
∗
r
+
1
)
(
A
2
q
+
1
∗
B
2
∗
s
+
1
)
=
(
A
1
B
1
)
p
+
1
,
r
+
1
(
A
2
B
2
)
q
+
1
,
s
+
1
=
[
(
A
1
B
1
)
⊙
(
A
2
B
2
)
]
(
p
,
q
,
r
,
s
)
.
\begin{array}{ll} [(A_1 \odot A_2)(B_1 \odot B_2)]_{(p,q,r,s)} &= (A_1 \odot A_2)_{pm_2+q*} (B_1 \odot B_2)_{*rn_2+s} \\ &= vec({A_2}_{q+1*}^T{A_1}_{p+1*})^T vec({B_2}_{*s+1}{B_1}_{*r+1}) \\ & = tr({A_1}_{p+1*}^T{A_2}_{q+1*}{B_2}_{*s+1}{B_1}_{*r+1}^T) \\ & = ({A_1}_{p+1*}{B_1}_{*r+1}) ({A_2}_{q+1*}{B_2}_{*s+1}) \\ & = (A_1B_1)_{p+1,r+1} (A_2B_2)_{q+1,s+1} \\ & = [(A_1 B_1) \odot (A_2B_2)]_{(p,q,r,s)}. \end{array}
[(A1⊙A2)(B1⊙B2)](p,q,r,s)=(A1⊙A2)pm2+q∗(B1⊙B2)∗rn2+s=vec(A2q+1∗TA1p+1∗)Tvec(B2∗s+1B1∗r+1)=tr(A1p+1∗TA2q+1∗B2∗s+1B1∗r+1T)=(A1p+1∗B1∗r+1)(A2q+1∗B2∗s+1)=(A1B1)p+1,r+1(A2B2)q+1,s+1=[(A1B1)⊙(A2B2)](p,q,r,s).
得证. 注意,倒数第四个等式到倒数第三个用到了迹的可交换性.
( A ⊙ B ) T = A T ⊙ B T (A \odot B)^T=A^T \odot B^T (A⊙B)T=AT⊙BT
[ ( A ⊙ B ) T ] ( p , q , r , s ) = [ A ⊙ B ] ( r , s , p , q ) = a r + 1 , p + 1 b s + 1 , q + 1 = a p + 1 , r + 1 T b q + 1 , s + 1 T = [ A T ⊙ B T ] ( p , q , r , s ) . \begin{array}{ll} [(A \odot B)^T]_{(p, q, r, s)} &= [A \odot B]_{(r, s, p, q)} = a_{r+1,p+1}b_{s+1,q+1} \\ & = a^T_{p+1,r+1}b^T_{q+1,s+1}=[A^T \odot B^T]_{(p,q,r,s)}. \end{array} [(A⊙B)T](p,q,r,s)=[A⊙B](r,s,p,q)=ar+1,p+1bs+1,q+1=ap+1,r+1Tbq+1,s+1T=[AT⊙BT](p,q,r,s).
A T = A − 1 , B T = B − 1 ⇒ ( A ⊙ B ) T = ( A ⊙ B ) − 1 A^T=A^{-1},B^T=B^{-1} \Rightarrow (A \odot B)^T = (A \odot B)^{-1} AT=A−1,BT=B−1⇒(A⊙B)T=(A⊙B)−1
(
A
⊙
B
)
T
(
A
⊙
B
)
=
(
A
T
⊙
B
T
)
(
A
⊙
B
)
=
(
A
T
A
)
⊙
(
B
T
B
)
=
I
n
a
⊙
I
n
b
=
I
n
a
n
b
,
\begin{array}{ll} (A \odot B)^T(A \odot B) & = (A^T \odot B^T)(A \odot B) \\ &= (A^TA) \odot (B^TB) \\ &= I_{n_a} \odot I_{n_b} \\ & = I_{n_a n_b}, \end{array}
(A⊙B)T(A⊙B)=(AT⊙BT)(A⊙B)=(ATA)⊙(BTB)=Ina⊙Inb=Inanb,
所以
(
A
⊙
B
)
T
=
(
A
⊙
B
)
−
1
(A \odot B)^T = (A \odot B)^{-1}
(A⊙B)T=(A⊙B)−1.
回到Claim 1 的证明上来,容易证明
于是
第二个等式用到了
(
A
1
⊙
A
2
)
(
B
1
⊙
B
2
)
=
(
A
1
B
1
)
⊙
(
A
2
B
2
)
(A_1 \odot A_2)(B_1 \odot B_2) = (A_1 B_1) \odot (A_2B_2)
(A1⊙A2)(B1⊙B2)=(A1B1)⊙(A2B2).
只需要证明:
等价于
P
W
e
P_{W_e}
PWe. 令
W
e
=
U
D
V
T
,
W_e = UDV^T,
We=UDVT,
其中
U
∈
R
k
×
k
,
V
∈
R
d
×
d
U \in \R^{k \times k}, V \in \R^{d \times d}
U∈Rk×k,V∈Rd×d.
所以
第三个等式用了俩次 ( A 1 ⊙ A 2 ) ( B 1 ⊙ B 2 ) = ( A 1 B 1 ) ⊙ ( A 2 B 2 ) (A_1 \odot A_2)(B_1 \odot B_2) = (A_1 B_1) \odot (A_2B_2) (A1⊙A2)(B1⊙B2)=(A1B1)⊙(A2B2).
定义:
则
Q
=
O
Λ
O
T
.
Q = O \Lambda O^T.
Q=OΛOT.
剩下的,关于
O
O
O的列
Λ
\Lambda
Λ的对角元素:
只是一些简单的推导罢了.
Theorem 2 的证明
这个证明我不想贴在这里,因为这个证明我只能看懂,所以想知道就直接看原文吧.
代码
虽然只是用了一个很简单的例子做实验,但是感觉,这个迭代算法很吃初始值. 就像Claim 1 所解释的那样,这个下降方法,会更倾向于之前的方向,也就是之前的错了,后面也会错?
y1设置为100, y2设置为1, lr=0.005, 会出现(也有可能是收敛不到0):
这种下降的方式是蛮恐怖的啊,但是感觉实在是不稳定. 当然,也有可能是程序写的太烂了.
"""
On the Optimization of Deep
Net works: Implicit Acceleration by
Overparameterization
"""
import numpy as np
import torch
import torch.nn as nn
from torch.optim.optimizer import Optimizer, required
class Net(nn.Module):
def __init__(self, d, k):
"""
:param k: 输出维度
:param d: 输入维度
"""
super(Net, self).__init__()
self.d = d
self.dense = nn.Sequential(
nn.Linear(d, k)
)
def forward(self, input):
x = input.view(-1, self.d)
output = self.dense(x)
return output
class Overparameter(Optimizer):
def __init__(self, params, N, lr=required, weight_decay=1.):
defaults = dict(lr=lr)
super(Overparameter, self).__init__(params, defaults)
self.N = N
self.weight_decay = weight_decay
def __setstate__(self, state):
super(Overparameter, self).__setstate__(state)
print("????")
print(state)
print("????")
def step(self, colsure=None):
def calc_part2(W, dw, N):
dw = dw.detach().numpy()
w = W.detach().numpy()
norm = np.linalg.norm(w, 2)
part2 = norm ** (2-2/N) * (
dw +
(N - 1) * (w @ dw.T) * w / (norm ** 2 + 1e-5)
)
return torch.from_numpy(part2)
p = self.param_groups[0]['params'][0]
if p.grad is None:
return 0
d_p = p.grad.data
part1 = (self.weight_decay * p.data).float()
part2 = (calc_part2(p, d_p, self.N)).float()
p.data -= self.param_groups[0]['lr'] * (part1+part2)
return 1
class L4Loss(nn.Module):
def __init__(self):
super(L4Loss, self).__init__()
def forward(self, x, y):
return torch.norm(x-y, 4)
x1 = torch.tensor([1., 0])
y1 = torch.tensor(10.)
x2 = torch.tensor([0, 1.])
y2 = torch.tensor(2.)
net = Net(2, 1)
criterion = L4Loss()
opti = Overparameter(net.parameters(), 4, lr=0.01)
loss_store = []
for epoch in range(500):
running_loss = 0.0
out1 = net(x1)
loss1 = criterion(out1, y1)
opti.zero_grad()
loss1.backward()
opti.step()
running_loss += loss1.item()
out2 = net(x2)
loss2 = criterion(out2, y2)
opti.zero_grad()
loss2.backward()
opti.step()
running_loss += loss2.item()
#print(running_loss)
loss_store.append(running_loss)
net = Net(2, 1)
criterion = nn.MSELoss()
opti = torch.optim.SGD(net.parameters(), lr=0.01)
loss_store2 = []
for epoch in range(500):
running_loss = 0.0
out1 = net(x1)
loss1 = criterion(out1, y1)
opti.zero_grad()
loss1.backward()
opti.step()
running_loss += loss1.item()
out2 = net(x2)
loss2 = criterion(out2, y2)
opti.zero_grad()
loss2.backward()
opti.step()
running_loss += loss2.item()
#print(running_loss)
loss_store2.append(running_loss)
import matplotlib.pyplot as plt
plt.plot(range(len(loss_store)), loss_store, color="red", label="Over")
plt.plot(range(len(loss_store2)), loss_store2, color="blue", label="normal")
plt.legend()
plt.show()