隐私保护的基于张量链的高效 Tucker 分解方法
隐私保护的基于张量链的高效 Tucker 分解方法是对基于梯度下降的 Tucker 分解算法的改进,同时保证在云端或雾端进行运算时不泄露用户的隐私数据。
隐私保护的基于张量链的高效 Tucker 分解方法包括系统初始化与用户数据加密、隐私保护的基于张量链的高效 Tucker 分解计算两部分。系统初始化与用户数据加密的流程同上篇博客,此处便不再赘述。
基于梯度下降的 Tucker 分解算法
三阶张量 T ‾ ∈ R I 1 × I 2 × I 3 \underline{T} \in R^{I_{1} \times I_{2} \times I_{3}} T∈RI1×I2×I3 的 Tucker 分解:
T ‾ = C ‾ × 1 U 1 × 2 U 2 × 3 U 3 \underline{T}=\underline{C} \times{ }_{1} U_{1} \times{ }_{2} U_{2} \times{ }_{3} U_{3} T=C×1U1×2U2×3U3
其中 U 1 ∈ R I 1 × R 1 , U 2 ∈ R I 2 × R 2 , U 3 ∈ R I 3 × R 3 U_{1} \in R^{I_{1} \times R_{1}}, \quad U_{2} \in R^{I_{2} \times R_{2}}, \quad U_{3} \in R^{I_{3} \times R_{3}} U1∈RI1×R1,U2∈RI2×R2,U3∈RI3×R3 为三个不同阶上的因子矩阵, C ‾ ∈ R R 1 × R 2 × R 3 \underline{C} \in R^{R_{1} \times R_{2} \times R_{3}} C∈RR1×R2×R3 为核心张量。
构造损失函数:
L ( U 1 , U 2 , U 3 , C ‾ ) = 1 2 ∥ T − C ‾ × 1 U 1 × 2 U 2 × 3 U 3 ∥ F 2 L\left(U_{1}, U_{2}, U_{3}, \underline{C}\right)=\frac{1}{2}\left\|T-\underline{C} \times{ }_{1} U_{1} \times{ }_{2} U_{2} \times{ }_{3} U_{3}\right\|_{F}^{2} L(U1,U2,U3,C)=21∥T−C×1U1×2U2×3U3∥F2
对每个变量求导可以得到:
这上面一大串是什么?看不懂啊!我也不会::>_<::
在我请教了实验室的师兄之后,嘻嘻,我弄明白啦o(@)o
先解释一下这些符号代表什么意思:
t
i
1
i
2
i
3
\boldsymbol{t}_{i_{1} i_{2} i_{3}}
ti1i2i3表示原张量
T
T
T 中的一个数,是已知的;
u
i
1
:
(
1
)
u_{i_{1}:}^{(1)}
ui1:(1) 中下标就
i
1
i_1
i1 是指某一阶,上标(1)是指因子矩阵
U
1
U_1
U1,它是为了避免后面进行伪代码说明时混淆因子矩阵而进行标记的,不参与计算实际的计算;
×
m
n
\boldsymbol\times_{m}^{n}
×mn 表示前面张量的第 n 阶和后面张量的第 m 阶做单模乘运算。
接下来就可以进行公式的解释了。已知损失函数
L
(
U
1
,
U
2
,
U
3
,
C
‾
)
=
1
2
∥
T
−
C
‾
×
1
U
1
×
2
U
2
×
3
U
3
∥
F
2
L\left(U_{1}, U_{2}, U_{3}, \underline{C}\right)=\frac{1}{2}\left\|T-\underline{C} \times{ }_{1} U_{1} \times{ }_{2} U_{2} \times{ }_{3} U_{3}\right\|_{F}^{2}
L(U1,U2,U3,C)=21∥T−C×1U1×2U2×3U3∥F2,利用我们高数里面学过的求偏导的方法对因子矩阵
U
1
U_1
U1 的
i
1
i_1
i1 维度求导:
同理,利用求偏导的方法对因子矩阵
U
2
U_2
U2 的
i
2
i_2
i2 维度、因子矩阵
U
3
U_3
U3 的
i
3
i_3
i3 维度求导:
利用求偏导的方法对核心张量求导:
在迭代过程中,不断最小化该损失函数,直至损失函数达到最小值时,我们认为 U 1 , U 2 , U 3 , C ‾ U_{1}, U_{2}, U_{3}, \underline{C} U1,U2,U3,C 满足公式 T ‾ ≈ C ‾ × 1 U 1 × 2 U 2 × 3 U 3 \underline{T} \approx \underline{C} \times{ }_{1} U_{1} \times{ }_{2} U_{2} \times{ }_{3} U_{3} T≈C×1U1×2U2×3U3
基于梯度下降的 Tucker 分解算法
输入:张量 T ‾ ∈ R I 1 × I 2 × I 3 \underline{T} \in R^{I_{1} \times I_{2} \times I_{3}} T∈RI1×I2×I3,误差阈值 ε \varepsilon ε,最大迭代次数 Iter max \text { Iter }_{\text {max }} Iter max
输出:核心张量
C
‾
∈
R
R
1
×
R
2
×
R
3
\underline{C} \in R^{R_{1} \times R_{2} \times R_{3}}
C∈RR1×R2×R3,低秩矩阵
U
1
∈
R
I
1
×
R
1
,
U
2
∈
R
I
2
×
R
2
,
U
3
∈
R
I
3
×
R
3
U_{1} \in R^{I_{1} \times R_{1}}, \quad U_{2} \in R^{I_{2} \times R_{2}}, \quad U_{3} \in R^{I_{3} \times R_{3}}
U1∈RI1×R1,U2∈RI2×R2,U3∈RI3×R3
基于梯度下降的 Tucker 分解算法可以较好地拟合 Tucker 分解结果,但在进行更新操作与求导操作时,算法需要遍历张量对象中的所有元素,这会消耗大量的计算时间。考虑对该部分进行优化,于是基于张量链的高效 Tucker 分解算法就被提出。
基于张量链的高效 Tucker 分解算法
通过对算法进行分析我们发现,由于张量对象通常含有大量元素,同时基于梯度下降的 Tucker 分解算法的内层迭代需要遍历张量中的所有元素,所以整个算法的运行时间较长,难以满足某些对时间要求较高的场景。
如何减少数据的存储量和计算过程中内层求导所需要遍历的元素个数?
我们知道,当张量以 TT 形式表示时,如果该张量的 TT 秩比较小,那么该张量的 TT 形 式比原始张量所占用的空间小很多,结合张量的 TT 表示形式,论文提出一个基于张量链的高效 Tucker 分解方法。
一个三阶张量 T ‾ ∈ R I 1 × I 2 × I 3 \underline{T} \in R^{I_{1} \times I_{2} \times I_{3}} T∈RI1×I2×I3 分解为核心张量 C ‾ ∈ R R 1 × R 2 × R 3 \underline{C} \in R^{R_{1} \times R_{2} \times R_{3}} C∈RR1×R2×R3 和三个因子矩阵 U 1 ∈ R I 1 × R 1 , U 2 ∈ R I 2 × R 2 , U 3 ∈ R I 3 × R 3 U_{1} \in R^{I_{1} \times R_{1}}, \quad U_{2} \in R^{I_{2} \times R_{2}}, \quad U_{3} \in R^{I_{3} \times R_{3}} U1∈RI1×R1,U2∈RI2×R2,U3∈RI3×R3,通常情况下 Tucker 分解后的结果存在 I 1 ≫ R 1 , I 2 ≫ R 2 , I 3 ≫ R 3 I_{1} \gg R_{1}, I_{2} \gg R_{2}, \quad I_{3} \gg R_{3} I1≫R1,I2≫R2,I3≫R3
因此,我们可以沿
I
1
,
I
2
和
I
3
I_{1}, I_{2} \text { 和 } I_{3}
I1,I2 和 I3 对传统的 Tucker 分解结果做降维升阶操作,得到:
T
=
C
×
1
1
U
‾
1
×
1
2
U
‾
2
×
1
3
U
‾
3
T=C \times_{1}^{1} \underline{U}_{1} \times{ }_{1}^{2} \underline{U}_{2} \times{ }_{1}^{3} \underline{U}_{3}
T=C×11U1×12U2×13U3
U ‾ 1 、 U ‾ 2 、 U ‾ 3 分别为矩阵 U 1 、 U 2 、 U 3 降维升阶后所对应的张量 \underline{U}_{1} 、 \underline{U}_{2} 、 \underline{U}_{3} \text { 分别为矩阵 } U_{1} \text { 、 } U_{2} \text { 、 } U_{3} \text { 降维升阶后所对应的张量 } U1、U2、U3 分别为矩阵 U1 、 U2 、 U3 降维升阶后所对应的张量
对降维升阶得到的张量 U 1 U_1 U1 、 U 2 U_2 U2 和 U 3 U_3 U3 分别做张量链分解操作:
U ˉ 1 = U 1 ( 1 ) × 1 U 1 ( 2 ) × 1 U 1 ( 3 ) × 1 U 1 ( 4 ) \bar{U}_{1}=U_{1}^{(1)} \times_{1} U_{1}^{(2)} \times_{1} U_{1}^{(3)} \times_{1} U_{1}^{(4)} Uˉ1=U1(1)×1U1(2)×1U1(3)×1U1(4)
U ˉ 2 = U 2 ( 1 ) × 1 U 2 ( 2 ) × 1 U 2 ( 3 ) × 1 U 2 ( 4 ) \bar{U}_{2}=U_{2}^{(1)} \times_{1} U_{2}^{(2)} \times_{1} U_{2}^{(3)} \times_{1} U_{2}^{(4)} Uˉ2=U2(1)×1U2(2)×1U2(3)×1U2(4)
U ˉ 3 = U 3 ( 1 ) × 1 U 3 ( 2 ) × 1 U 3 ( 3 ) × 1 U 3 ( 4 ) \bar{U}_{3}=U_{3}^{(1)} \times_{1} U_{3}^{(2)} \times_{1} U_{3}^{(3)} \times_{1} U_{3}^{(4)} Uˉ3=U3(1)×1U3(2)×1U3(3)×1U3(4)
其中, 公式中U i ( j ) 表示第 i 个张量链 U ˉ i 的第 j 个核 \text { 公式中U }_{i}^{(j)} \text { 表示第 } i \text { 个张量链 } \bar{U}_{i} \text { 的第 } j \text { 个核 } 公式中U i(j) 表示第 i 个张量链 Uˉi 的第 j 个核
过程如下图所示:
通过以上两个步骤,我们将传统的 Tucker 分解形式转化为新的基于张量链的 Tucker 分解形式,大大减少了分解形式中的元素个数。
对于下面即将出现的内容希望各位小伙伴不要被吓到(反正当时我被吓到了),耐住性子看下去。
基于张量链的高效 Tucker 分解算法构造出如下损失函数:
L
=
1
2
∥
T
−
C
‾
×
1
1
U
ˉ
1
×
1
2
U
ˉ
2
×
1
3
U
ˉ
3
∥
F
2
=
1
2
∥
T
−
C
‾
×
1
1
(
U
1
(
1
)
×
1
U
1
(
2
)
×
1
U
1
(
3
)
×
1
U
1
(
4
)
)
×
1
2
(
U
2
(
1
)
×
1
U
2
(
2
)
×
1
U
2
(
3
)
×
1
U
2
(
4
)
)
×
1
3
(
U
3
(
1
)
×
1
U
3
(
2
)
×
1
U
3
(
3
)
×
1
U
3
(
4
)
)
∥
F
2
\begin{aligned} L=& \frac{1}{2}\left\|T-\underline{C} \times{ }_{1}^{1} \bar{U}_{1} \times{ }_{1}^{2} \bar{U}_{2} \times{ }_{1}^{3} \bar{U}_{3}\right\|_{F}^{2} \\ =& \frac{1}{2} \| T-\underline{C} \times{ }_{1}^{1}\left(U_{1}^{(1)} \times{ }_{1} U_{1}^{(2)} \times{ }_{1} U_{1}^{(3)} \times{ }_{1} U_{1}^{(4)}\right)\times{ }_{1}^{2}\left(U_{2}^{(1)} \times{ }_{1} U_{2}^{(2)} \times{ }_{1} U_{2}^{(3)} \times{ }_{1} U_{2}^{(4)}\right)\times{ }_{1}^{3}\left(U_{3}^{(1)} \times{ }_{1} U_{3}^{(2)} \times{ }_{1} U_{3}^{(3)} \times{ }_{1} U_{3}^{(4)}\right) \|_{F}^{2} \end{aligned}
L==21∥∥T−C×11Uˉ1×12Uˉ2×13Uˉ3∥∥F221∥T−C×11(U1(1)×1U1(2)×1U1(3)×1U1(4))×12(U2(1)×1U2(2)×1U2(3)×1U2(4))×13(U3(1)×1U3(2)×1U3(3)×1U3(4))∥F2
对第一个张量各个核进行求导,可以得到导数:
同理可以对第二、三个张量各个核求导,可以得到导数:
对C进行求导:
其中
U
i
(
k
−
)
U_{i}^{(k-)}
Ui(k−) 表示第
i
i
i 个张量链
U
i
U_i
Ui 的前 k-1 个核做约减乘运算,
U
i
(
k
+
)
U_{i}^{(k+)}
Ui(k+) 表示第
i
i
i 个张量链
U
i
U_i
Ui 的第 k 个核之后做约减乘运算。
基于张量链的高效 Tucker 分解算法
输入:张量
T
‾
∈
R
I
1
×
I
2
×
⋯
×
I
N
\underline{T} \in R^{I_{1} \times I_{2}\times\dots \times I_{N}}
T∈RI1×I2×⋯×IN,误差阈值
ε
\varepsilon
ε,最大迭代次数
Iter
max
\text { Iter }_{\text {max }}
Iter max
核心张量
C
‾
\underline{C}
C的维度
R
1
,
R
2
,
⋯
,
R
N
R_{1}, R_{2}, \cdots, R_{N}
R1,R2,⋯,RN
张量链核的个数
c
1
,
c
2
,
⋯
,
c
N
c_{1}, c_{2}, \cdots, c_{N}
c1,c2,⋯,cN
s升阶后
T
‾
\underline{T}
T的维度
I
11
×
I
12
×
⋯
×
I
1
(
q
1
−
1
)
×
I
21
×
I
22
×
⋯
×
I
2
(
c
2
−
1
)
×
⋯
×
I
N
1
×
I
N
2
×
⋯
×
I
N
(
c
N
−
1
)
I_{11} \times I_{12} \times \cdots \times I_{1\left(q_{1}-1\right)} \times I_{21} \times I_{22} \times \cdots \times I_{2\left(c_{2}-1\right)} \times \cdots \times I_{N 1} \times I_{N 2} \times \cdots \times I_{N\left(c_{N}-1\right)}
I11×I12×⋯×I1(q1−1)×I21×I22×⋯×I2(c2−1)×⋯×IN1×IN2×⋯×IN(cN−1)
张量链核间秩
r
11
,
r
12
,
⋯
,
r
1
(
c
1
−
1
)
,
r
21
,
r
22
,
⋯
,
r
2
(
c
2
−
1
)
,
⋯
,
r
N
1
,
r
N
2
,
⋯
,
r
N
(
c
N
−
1
)
r_{11}, r_{12}, \cdots, r_{1\left(c_{1}-1\right)}, r_{21}, r_{22}, \cdots, r_{2\left(c_{2}-1\right)}, \cdots, r_{N 1}, r_{N 2}, \cdots, r_{N\left(c_{N}-1\right)}
r11,r12,⋯,r1(c1−1),r21,r22,⋯,r2(c2−1),⋯,rN1,rN2,⋯,rN(cN−1)
输出:核心张量
C
‾
∈
R
R
1
×
R
2
×
⋯
×
R
N
,
N
\underline{C} \in R^{R_{1} \times R_{2} \times \cdots \times R_{N}}, \quad \mathrm{N}
C∈RR1×R2×⋯×RN,N个低秩张量链
U
ˉ
1
,
U
ˉ
2
,
⋯
U
ˉ
N
\bar{U}_{1},\bar{U}_{2}, \cdots \bar{U}_{N}
Uˉ1,Uˉ2,⋯UˉN,其中每个张量链
U
ˉ
k
=
U
k
(
1
)
×
1
U
k
(
2
)
×
k
⋯
×
1
U
k
(
c
k
)
\bar{U}_{k}=U_{k}^{(1)} \times_{1} U_{k}^{(2)} \times_{k} \cdots \times_{1} U_{k}^{\left(c_{k}\right)}
Uˉk=Uk(1)×1Uk(2)×k⋯×1Uk(ck)
隐私保护的基于张量链的高效 Tucker 分解算法
同 PPHOBL 方案一样,隐私保护的基于张量链的高效 Tucker 分解算法的计算结果应该近似等于明文状态下基于张量链的高效 Tucker 分解算法的计 算结果。隐私保护的基于张量链的高效 Tucker 分解中的两个关键方法:
(1) 用户上传的加密张量与同态加密张量之间的相互转换;
(2)隐私保护的基于张量链的 高效 Tucker 分解。
其中用户上传的加密张量与同态加密张量之间的相互转换同上篇博客中所述方法一样,由云端与雾端节点协同配合完成,在此不再赘述。
隐私保护的基于张量链的高效 Tucker 分解算法
输入:张量
T
‾
∈
R
I
1
×
I
2
×
⋯
×
I
N
\underline{T} \in R^{I_{1} \times I_{2}\times\dots \times I_{N}}
T∈RI1×I2×⋯×IN,误差阈值
ε
\varepsilon
ε,最大迭代次数
Iter
max
\text { Iter }_{\text {max }}
Iter max
核心张量
C
‾
\underline{C}
C的维度
R
1
,
R
2
,
⋯
,
R
N
R_{1}, R_{2}, \cdots, R_{N}
R1,R2,⋯,RN
张量链核的个数
c
1
,
c
2
,
⋯
,
c
N
c_{1}, c_{2}, \cdots, c_{N}
c1,c2,⋯,cN
s升阶后
T
‾
\underline{T}
T的维度
I
11
×
I
12
×
⋯
×
I
1
(
q
1
−
1
)
×
I
21
×
I
22
×
⋯
×
I
2
(
c
2
−
1
)
×
⋯
×
I
N
1
×
I
N
2
×
⋯
×
I
N
(
c
N
−
1
)
I_{11} \times I_{12} \times \cdots \times I_{1\left(q_{1}-1\right)} \times I_{21} \times I_{22} \times \cdots \times I_{2\left(c_{2}-1\right)} \times \cdots \times I_{N 1} \times I_{N 2} \times \cdots \times I_{N\left(c_{N}-1\right)}
I11×I12×⋯×I1(q1−1)×I21×I22×⋯×I2(c2−1)×⋯×IN1×IN2×⋯×IN(cN−1)
张量链核间秩
r
11
,
r
12
,
⋯
,
r
1
(
c
1
−
1
)
,
r
21
,
r
22
,
⋯
,
r
2
(
c
2
−
1
)
,
⋯
,
r
N
1
,
r
N
2
,
⋯
,
r
N
(
c
N
−
1
)
r_{11}, r_{12}, \cdots, r_{1\left(c_{1}-1\right)}, r_{21}, r_{22}, \cdots, r_{2\left(c_{2}-1\right)}, \cdots, r_{N 1}, r_{N 2}, \cdots, r_{N\left(c_{N}-1\right)}
r11,r12,⋯,r1(c1−1),r21,r22,⋯,r2(c2−1),⋯,rN1,rN2,⋯,rN(cN−1)
输出:核心张量
[
∣
C
∣
]
‾
∈
R
R
1
×
R
2
×
⋯
×
R
N
,
N
\underline{[|C|]} \in R^{R_{1} \times R_{2} \times \cdots \times R_{N}}, \quad \mathrm{N}
[∣C∣]∈RR1×R2×⋯×RN,N个低秩张量链
[
∣
U
∣
]
ˉ
1
,
[
∣
U
∣
]
ˉ
2
,
⋯
[
∣
U
∣
]
ˉ
N
\bar{[|U|]}_{1},\bar{[|U|]}_{2}, \cdots \bar{[|U|]}_{N}
[∣U∣]ˉ1,[∣U∣]ˉ2,⋯[∣U∣]ˉN,其中每个张量链
[
∣
U
∣
]
ˉ
k
=
[
∣
U
∣
]
k
(
1
)
×
1
[
∣
U
∣
]
k
(
2
)
×
k
⋯
×
1
[
∣
U
∣
]
k
(
c
k
)
\bar{[|U|]}_{k}=[|U|]_{k}^{(1)} \times_{1} [|U|]_{k}^{(2)} \times_{k} \cdots \times_{1} [|U|]_{k}^{\left(c_{k}\right)}
[∣U∣]ˉk=[∣U∣]k(1)×1[∣U∣]k(2)×k⋯×1[∣U∣]k(ck)
“高效的隐私保护的张量分解方法研究”学习笔记到此主要内容已经介绍完毕,看看我这个小菜菜什么时候可以用代码复现吧!