论文实现以SVD的分解形式进行深度神经网络的训练(PyTorch)
Posted 囚生CY
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了论文实现以SVD的分解形式进行深度神经网络的训练(PyTorch)相关的知识,希望对你有一定的参考价值。
序言
本文是针对笔者前一阵子写的博客【数值分析×机器学习】以SVD的分解形式进行深度神经网络的训练基于 P y T o r c h \\rm PyTorch PyTorch的一个实现流程,以及对在实现过程中存在的问题与解决做一个记录。大致的思想是将深度神经网络中各个网络层(主要指全连接层与卷积层)对应的权重矩阵进行低秩分解,以简化模型复杂度以及提升模型优化的收敛速度,有兴趣地可以去看一下链接中对应的论文,笔者阅读后受益匪浅:
- 英文标题:Learning Low-rank Deep Neural Networks via Singular Vector Orthogonality Regularization and Singular Value Sparsification
- 中文标题:学习低秩深度神经网络通过奇异向量正交正则化与奇异值稀疏化
- 论文下载链接:arxiv@1906.06925
具体而言,
SVD
\\text{SVD}
SVD指对于权重矩阵
W
∈
R
m
×
n
W\\in\\R^{m\\times n}
W∈Rm×n,可以分解为
U
∈
R
m
×
r
,
V
∈
R
n
×
r
,
s
∈
R
s
U\\in\\R^{m\\times r},V\\in\\R^{n\\times r},s\\in\\R^{s}
U∈Rm×r,V∈Rn×r,s∈Rs三部分,其中
U
U
U与
V
V
V是正交矩阵(即奇异向量矩阵),在满秩的情况下,即
r
=
min
(
m
,
n
)
r=\\min(m,n)
r=min(m,n),
W
W
W可以精确地被重构成
W
=
U
diag
(
s
)
V
⊤
W=U\\text{diag}(s)V^\\top
W=Udiag(s)V⊤,问题在于这种分解方法是极为耗时的,如果在模型训练的每一次迭代中都去对深度神经网络中的每一个权重矩阵
W
W
W进行
SVD
\\text{SVD}
SVD,那么这个代价相比于模型的简化与优化速度的提升显然是很划不来的,因此一个想法是在损失函数中添加正则项,来促进奇异向量矩阵
U
,
V
U,V
U,V能够逼近正交矩阵,且
s
s
s尽可能的稀疏,通过阅读上述论文可以知道损失函数具有如下的形式:
L
(
U
,
s
,
V
)
=
L
T
(
diag
(
∣
s
∣
)
V
⊤
,
U
diag
(
∣
s
∣
)
)
+
λ
o
∑
l
=
1
D
L
o
(
U
l
,
V
l
)
+
λ
s
∑
l
=
1
D
L
s
(
s
l
)
(1)
L(U,s,V)=L_T\\left(\\text{diag}\\left(\\sqrt{|s|}\\right)V^\\top,U\\text{diag}\\left(\\sqrt{|s|}\\right)\\right)+\\lambda_o\\sum_{l=1}^DL_o(U_l,V_l)+\\lambda_s\\sum_{l=1}^DL_s(s_l)\\tag{1}
L(U,s,V)=LT(diag(∣s∣)V⊤,Udiag(∣s∣))+λol=1∑DLo(Ul,Vl)+λsl=1∑DLs(sl)(1)
其中:
-
L T L_T LT是在分解的网络层上的训练损失;
-
L o L_o Lo是正交正则项:
L o ( U , V ) = 1 r 2 ( ∥ U ⊤ U − I ∥ F 2 − ∥ V ⊤ V − I ∥ F 2 ) (2) L_o(U,V)=\\frac1{r^2}\\left(\\left\\|U^\\top U-I\\right\\|_F^2-\\left\\|V^\\top V-I\\right\\|_F^2\\right)\\tag{2} Lo(U,V)=r21(∥∥U⊤U−I∥∥F2−∥∥V⊤V−I∥∥F2)(2)
目的是为了使得奇异向量矩阵 U , V U,V U,V逼近正交矩阵; -
U l , V l , s l U_l,V_l,s_l Ul,Vl,sl是网络层 l l l的奇异向量矩阵与奇异值向量, D D D即为总的网络层数;
-
L s L_s Ls是稀疏导出正则化的损失,这里对比了 L s = L H L_s=L^H Ls=LH以及 L s = L 1 L_s=L^1 Ls=L1的性能:
L H ( s ) = ∥ s ∥ 1 ∥ s ∥ 2 = ∑ i ∣ s i ∣ ∑ i s i 2 L 1 ( s ) = ∥ s ∥ 1 (3) L^H(s)=\\frac{\\|s\\|_1}{\\|s\\|_2}=\\frac{\\sum_i|s_i|}{\\sqrt{\\sum_{i}s_i^2}}\\\\ L^1(s)=\\|s\\|_1\\tag{3} LH(s)=∥s∥2∥s∥1=∑isi2∑i∣si∣L1(s)=数值分析×机器学习以SVD的分解形式进行深度神经网络的训练(逐渐熟练)数值分析×机器学习以SVD的分解形式进行深度神经网络的训练(逐渐熟练)