“高效的隐私保护的张量分解方法研究”学习笔记(上)

这个笔记是学习张荣皓的"高效的隐私保护的张量分解方法研究"论文之后所写的笔记和个人理解,希望能用我自己的理解串联有关内容,站在不同的角度给大家展示不一样的理解。

我是一只正在不断学习、希望早日成为小白的小小白,有什么错误欢迎大家批评指正,喜欢的请点个赞哦!

张量理论基础

张量、张量的切片、张量的展开的相关概念前面有涉及,在此我就略过。
张量加减法运算:对参与运算的两个张量的 所有对应位置的元素做加减法运算。

张量与标量乘法运算:将张量中的每个 元素与标量做乘法运算。

以上两个都是比较好理解的,接下来会有一些看起来不怎么好理解的内容,千万不要被公式唬住,看不懂可以看看下面相应的解释内容,如果实在看不懂,后面有秘籍。
在这里插入图片描述

张量与向量单模乘运算:N 阶张量 X ∈ R I 1 × I 2 × ⋯ I n × ⋯ I N X \in R^{I_{1} \times I_{2} \times\cdots I_{n} \times \cdots I_{N}} XRI1×I2×In×IN与一个向量 v = R I n v=R^{I_{n}} v=RIn 做单模乘运算,可以得到一个 N-1 阶的张量 Y ∈ R I 1 × ⋯ × I n − 1 × I n + 1 × ⋯ I N Y \in R^{I_{1} \times \cdots \times I_{n-1} \times I_{n+1} \times \cdots I_{N}} YRI1××In1×In+1×IN
Y = X × n v Y=X \times_{n} v Y=X×nv

张量 Y 中的每个元素满足:
y i 1 , … , i n − 1 , i n + 1 , ⋯   , i N = ∑ i n = 1 I n ( x i 1 , ⋯   , i n , ⋯   , i N ) v i n y_{i_{1}, \ldots, i_{n-1}, i_{n+1}, \cdots, i_{N}}=\sum_{i_{n}=1}^{I_{n}}\left(x_{i_{1}, \cdots, i_{n}, \cdots, i_{N}}\right) v_{i_{n}} yi1,,in1,in+1,,iN=in=1In(xi1,,in,,iN)vin

解释:张量 X 中沿model-n方向的列向量与向量 v v v 求内积

张量与矩阵单模乘运算:N 阶张量 X ∈ R I 1 × I 2 × ⋯ I n × ⋯ I N X \in R^{I_{1} \times I_{2} \times\cdots I_{n} \times \cdots I_{N}} XRI1×I2×In×IN与一个矩阵 U ∈ R M × I n U \in R^{M \times I_{n}} URM×In 做单模乘运算,可以得到一个 N 阶的张量 Y ∈ R I 1 × ⋯ × I n − 1 × M × I n + 1 × ⋯ I N Y \in R^{I_{1} \times \cdots \times I_{n-1} \times M \times I_{n+1} \times \cdots I_{N}} YRI1××In1×M×In+1×IN

Y = X × n U Y=X \times_{n} U Y=X×nU

张量 Y 中的每个元素满足:
y i 1 , ⋯   , i n − 1 , m , i n + 1 , … , i N = ∑ i n = 1 I n ( x i 1 , … , i n , ⋯   , i N ) u m , i n y_{i_{1}, \cdots, i_{n-1}, m, i_{n+1}, \ldots, i_{N}}=\sum_{i_{n}=1}^{I_{n}}\left(x_{i_{1}, \ldots, i_{n}, \cdots, i_{N}}\right) u_{m, i_{n}} yi1,,in1,m,in+1,,iN=in=1In(xi1,,in,,iN)um,in

解释1:张量 X 中沿model-n方向的列向量与矩阵 U U U 中的行向量求内积
解释2:矩阵 U U U 与张量 X 中model-n展开矩阵做矩阵乘积

张量与矩阵连续单模乘运算:N 阶张量 X ∈ R I 1 × I 2 × ⋯ I n × ⋯ I N X \in R^{I_{1} \times I_{2} \times\cdots I_{n} \times \cdots I_{N}} XRI1×I2×In×IN与 N 个矩阵 U 1 ∈ R M 1 × I 1 U_1 \in R^{M_1 \times I_{1}} U1RM1×I1 U 2 ∈ R M 2 × I 2 U_2 \in R^{M_2 \times I_{2}} U2RM2×I2 U n ∈ R M n × I n U_n \in R^{M_n \times I_{n}} UnRMn×In 做连续单模乘运算,可以得到一个 N 阶的张量 Y ∈ R M 1 × M 2 × ⋯ M N Y \in R^{M_1 \times M_{2} \times \cdots M_{N}} YRM1×M2×MN
Y = X × 1 U 1 × 2 U 2 × 1 ⋯ × N U N = [ X ; U 1 , U 2 , ⋯   , U N ] Y=X \times_{1} U_{1} \times{ }_{2} U_{2} \times{ }_{1} \cdots \times{ }_{N} U_{N}=\left[X ; U_{1}, U_{2}, \cdots, U_{N}\right] Y=X×1U1×2U2×1×NUN=[X;U1,U2,,UN]

张量与张量单模乘运算:一个 N 阶张量 X ∈ R I 1 × I 2 × ⋯ I n × ⋯ I N X \in R^{I_{1} \times I_{2} \times\cdots I_{n} \times \cdots I_{N}} XRI1×I2×In×IN与一个 M 阶张量 Y ∈ R J 1 × J 2 × ⋯ J m × ⋯ J M Y \in R^{J_{1} \times J_{2} \times\cdots J_{m} \times \cdots J_{M}} YRJ1×J2×Jm×JM做单模乘运算,当 I n = J m I_{n}=J_{m} In=Jm 可以得到一个 N+M-2 阶的张量 Z ∈ R I 1 × ⋯ × I n − 1 × I n + 1 X ⋯ × I N × J 1 × ⋯ J m − 1 × J m + 1 X ⋯ × J M Z \in R^{I_{1} \times \cdots \times I_{n-1} \times I_{n+1} X \cdots \times I_{N} \times J_{1} \times \cdots J_{m-1} \times J_{m+1} X \cdots \times J_{M}} ZRI1××In1×In+1X×IN×J1×Jm1×Jm+1X×JM
Z = X × m n Y Z=X \times_{m}^{n} Y Z=X×mnY

张量 Z 中的每个元素满足:

z i 1 , ⋯   , i n − 1 , i n + 1 , ⋯   , i N , j 1 , ⋯   , j m − 1 , j m + 1 , ⋯   , j M = ∑ k = 1 I n x i 1 , ⋯   , i n − 1 , k , i n + 1 , ⋯   , i N y j 1 , ⋯   , j m − 1 , k , j m + 1 , ⋯   , j M z_{i_{1}, \cdots, i_{n-1}, i_{n+1}, \cdots, i_{N}, j_{1}, \cdots, j_{m-1}, j_{m+1}, \cdots, j_{M}}=\sum_{k=1}^{I_{n}} x_{i_{1}, \cdots, i_{n-1}, k, i_{n+1}, \cdots, i_{N}} y_{j_{1}, \cdots, j_{m-1}, k, j_{m+1}, \cdots, j_{M}} zi1,,in1,in+1,,iN,j1,,jm1,jm+1,,jM=k=1Inxi1,,in1,k,in+1,,iNyj1,,jm1,k,jm+1,,jM

其中符号 × m n \times_{m}^{n} ×mn 表示张量X的第n阶与张量Y的第m阶做单模乘运算。

张量与张量多模乘运算:M+N 阶张量 X ∈ R I 1 × I 2 × ⋯ I n × ⋯ I N × J 1 × J 2 × ⋯ J m × ⋯ J M X \in R^{I_{1} \times I_{2} \times\cdots I_{n} \times \cdots I_{N}\times J_{1} \times J_{2} \times\cdots J_{m} \times \cdots J_{M}} XRI1×I2×In×IN×J1×J2×Jm×JM与一个 N+L 阶张量 Y ∈ R J 1 × J 2 × ⋯ J m × ⋯ J M × K 1 × K 2 × ⋯ K l × ⋯ K L Y \in R^{J_{1} \times J_{2} \times\cdots J_{m} \times \cdots J_{M}\times K_{1} \times K_{2} \times\cdots K_{l} \times \cdots K_{L}} YRJ1×J2×Jm×JM×K1×K2×Kl×KL做单模乘运算
Z = X ∗ N Y Z=X *_{N} Y Z=XNY

其中符号 ∗ N *_{N} N表示 X 的后 N 阶与 Y 的前 N 阶做多模乘运算
张量 Z 中的每个元素满足:
z i 1 , i 2 , ⋯   , i M , k 1 , k 2 , ⋯   , k L = ∑ j 1 = 1 J 1 ∑ j 2 = 1 J 2 ⋯ ∑ j N = 1 J N x i 1 , i 2 , ⋯   , i M , j 1 , j 2 , ⋯   , j N y j 1 , j 2 , ⋯   , j N , k 1 , k 2 , ⋯   , k L z_{i_{1}, i_{2}, \cdots, i_{M}, k_{1}, k_{2}, \cdots, k_{L}}=\sum_{j_{1}=1}^{J_{1}} \sum_{j_{2}=1}^{J_{2}} \cdots \sum_{j_{N}=1}^{J_{N}} x_{i_{1}, i_{2}, \cdots, i_{M}, j_{1}, j_{2}, \cdots, j_{N}} y_{j_{1}, j_{2}, \cdots, j_{N}, k_{1}, k_{2}, \cdots, k_{L}} zi1,i2,,iM,k1,k2,,kL=j1=1J1j2=1J2jN=1JNxi1,i2,,iM,j1,j2,,jNyj1,j2,,jN,k1,k2,,kL
秘籍:虽然上面写了各种各样张量之间的模乘运算,如果上面的定义都无法理解的话,我们可以抛开这一切,从另外一个方面去进行理解张量模乘运算之间的本质。为什么我们要学习张量的切片和展开呢?就是为张量之间的各种运算做铺垫。可能张量之间的模乘运算不好理解,但是矩阵乘矩阵是很好理解的。我们可以利用张量的切片和展开将张量转化为矩阵,自然而然张量之间的运算也就变成了矩阵之间的运算了。

以上纯属个人理解,如有什么错误还望提出!

张量内积:张量内积作用于两个相同大小的张量间,其结果等于两个张量中所有对应元素乘积的和
⟨ X , Y ⟩ = ∑ i 1 = 1 I 1 ∑ i 2 = 1 I 2 ⋯ ∑ i N = 1 I N x i 1 , i 2 , ⋯   , i N y i 1 , i 2 , ⋯   , i N \langle X, Y\rangle=\sum_{i_{1}=1}^{I_{1}} \sum_{i_{2}=1}^{I_{2}} \cdots \sum_{i_{N}=1}^{I_{N}} x_{i_{1}, i_{2}, \cdots, i_{N}} y_{i_{1}, i_{2}, \cdots, i_{N}} X,Y=i1=1I1i2=1I2iN=1INxi1,i2,,iNyi1,i2,,iN

解释:想想看我们学的线段的长度不就是这么求的吗?

张量范数: X 与 X 的内积的开方,常用来在迭代过程中比较前后两次迭代结果的差值
∥ X ∥ F = ( ∑ i 1 = 1 I 1 ∑ i 2 = 1 I 2 ⋯ ∑ i N = 1 I N x i 1 , i 2 , ⋯   , i N 2 ) = ⟨ X , X ⟩ \|X\|_{F}=\sqrt{\left(\sum_{i_{1}=1}^{I_{1}} \sum_{i_{2}=1}^{I_{2}} \cdots \sum_{i_{N}=1}^{I_{N}} x_{i_{1}, i_{2}, \cdots, i_{N}}^{2}\right)}=\sqrt{\langle X, X\rangle} XF=(i1=1I1i2=1I2iN=1INxi1,i2,,iN2) =X,X

张量外积:M 阶张量 X ∈ R I 1 × I 2 × ⋯ X M X \in R^{I_{1} \times I_{2} \times \cdots X_{M}} XRI1×I2×XM 与阶张量 Y ∈ R J 1 × J 2 × ⋯ X N Y \in R^{J_{1} \times J_{2} \times \cdots X_{N}} YRJ1×J2×XN求外积, 可以得到一个 M+N 阶张量 Z ∈ R I 1 × I 2 × ⋯ × I M × J 1 × J 2 × ⋯ × J N Z \in R^{I_{1} \times I_{2} \times \cdots \times I_{M} \times J_{1} \times J_{2} \times \cdots \times J_{N}} ZRI1×I2××IM×J1×J2××JN
Z = X ∘ Y Z=X \circ Y Z=XY

张量 Z 中的每个元素满足:
Z i 1 , i 2 , ⋯   , i M , j 1 , j 2 , ⋯   , j N = X i 1 , i 2 , ⋯   , i M Y i 1 , i 2 , ⋯   , i N Z_{i_{1}, i_{2}, \cdots, i_{M}, j_{1}, j_{2}, \cdots, j_{N}}=\mathcal{X}_{i_{1}, i_{2}, \cdots, i_{M}} \mathcal{Y}_{i_{1}, i_{2}, \cdots, i_{N}} Zi1,i2,,iM,j1,j2,,jN=Xi1,i2,,iMYi1,i2,,iN

张量分解

CP分解

CP分解可以将张量 X 近似分解为若干个秩一张量的和,如下图:
在这里插入图片描述
这里秩一张量是指该 张量可以表示为 N(N 为张量 X 的阶数)个向量做外积的形式。但秩一张量的个数 R 的求解是一个 NP 难问题,通常需要依据经验给出假定或者猜测,甚至在某些情况下可能无法计算出对应的 CP 分解形式,所以大多数情况下我们不用CP分解对张量进行分解。

TUCKER分解

TUCKER分解将张量 X 近似分解为一个核心张量 C 与多个因子矩阵 U 1 , U 2 , ⋯   , U N U_{1}, U_{2}, \cdots, U_{N} U1,U2,,UN,其中核心张量与因子矩阵之间以连续单模乘的形式连接,如下图:
在这里插入图片描述
当每个 X ( n ) X_{(n)} X(n)的秩恰好都大于等于因子矩阵 U n U_{n} Un的列向量的数量时,我们认为Tucker 分解所表示的近似张量和原始张量是等价的,误差非常小。

TUCKER分解中的HOOI算法以 HOSVD 分解得到的结果为初始输入,然后利用交替最小二乘 ALS 迭代计算得到 Tucker 分解,因此该算法克服了 HOSVD 分解“不一定得到最优解”的弊端,还可以基于梯度下降的思想来求解 Tucker 分解,根据当前所处位置的梯度迭代更新核心张量 C 与因子矩阵 U 1 , U 2 , ⋯   , U N U_{1}, U_{2}, \cdots, U_{N} U1,U2,,UN,最终也可以得到稳定的分解结果。

如何加速 HOSVD 分解的计算和在基于梯度下降思想求解 Tucker 分解时如何加快每次迭代的计算速度是这篇论文所研究的。

Bi-Lanczos 算法

Lanczos 算法主要包括对称 Lanczos 算法和非对称 Lanczos 算法两种。 Bi-Lanczos 是非对称 Lanczos 算法的一种特殊形态,它可以将矩阵转化为双对角矩阵,该论文主要针对 Bi-Lanczos 算法进行研究,这个算法具体内容是什么呢?怎么去运用呢?这就是我们后面要去阐述的问题。

对于一个给定的矩阵 M ∈ R m × n , M \in R^{m \times n}, \quad MRm×n, Bi-Lanczos 可以快速的将该矩阵分解为一个下双对角矩阵 L L L 和两个正交矩阵 U U U V V V, 使其满足公式 M = U L V T M=U L V^{T} M=ULVT ,其中 U = [ u 1 , u 2 , … , u m ] U=\left[u_{1}, u_{2}, \ldots, u_{m}\right] U=[u1,u2,,um] V = [ v 1 , v 2 , … , v n ] , V=\left[v_{1}, v_{2}, \ldots, v_{n}\right], \quad V=[v1,v2,,vn], 下双对角矩阵 L L L 如下所示 :
L = [ α 1 β 2 α 2 ⋱ ⋱ β k α k ] L=\left[\begin{array}{ccccc} \alpha_{1} & & & & \\ \beta_{2} & \alpha_{2} & & & \\ & \ddots & \ddots & \\ & & \beta_{k} & \alpha_{k} \end{array}\right] L=α1β2α2βkαk

L L L 中的元素 α i \alpha_{i} αi β i \beta_{i} βi以及矩阵 U U U 中的向量 u i u_{i} ui 与矩阵 V V V 中的向量 v i v_{i} vi由下面的算法求得:

Bi-Lanczos 算法
输入: 矩阵 M ∈ R m × n M \in R^{m \times n} MRm×n, 整数 0 < k < min ⁡ ( m , n ) 0<k<\min (m, n) 0<k<min(m,n)
输出: 双对角矩阵 L ∈ R k × k L \in R^{k \times k} LRk×k, 秩为 k k k 的正交矩阵 U ∈ R m × k 、 V ∈ R k × n U \in R^{m \times k} 、 V \in R^{k \times n} URm×kVRk×n
在这里插入图片描述
其中 α i = ∥ v i ∥ \alpha_{i}=\left\|v_{i}\right\| αi=vi代表的是向量的长度。

张量链分解

张量链可以用更少的参数来表达高阶近似张量,避免参数随阶数的指数级增长,其完全基于一连串的矩阵的 QR 分解和 SVD 分解,不需要任何递归。

张量链分解是指将一个张量 X ∈ R I 1 × I 2 × ⋯ × I N X \in R^{I_{1} \times I_{2} \times \cdots \times I_{N}} XRI1×I2××IN分解为一组低阶张量核 G 1 X , G 2 X , ⋯   , G N X G_{1}^{X}, G_{2}^{X}, \cdots, G_{N}^{X} G1X,G2X,,GNX约减乘的形式:
X ≈ G 1 X × 1 G 2 X × 1 ⋯ × 1 G N X X \approx G_{1}^{X} \times_{1} G_{2}^{X} \times_{1} \cdots \times_{1} G_{N}^{X} XG1X×1G2X×1×1GNX

在这里插入图片描述

其中 G n X ∈ R R n − 1 × I n × R n ( n = 1 , 2 , ⋯   , N ) G_{n}^{X} \in R^{R_{n-1} \times I_{n} \times R_{n}}(n=1,2, \cdots, N) GnXRRn1×In×Rn(n=1,2,,N)表示张量链中的一个张量和, R n R_{n} Rn表示分解后张量链的第n个秩,原始张量 X 中的每一个元素,都可以表示为张量链中所有核的对应切片的乘积:
x i 1 , i 2 ⋯ i N = G 1 X ( i 1 ) G 2 X ( i 2 ) ⋯ G N X ( i N ) x_{i_{1}, i_{2} \cdots i_{N}}=G_{1}^{X}\left(i_{1}\right) G_{2}^{X}\left(i_{2}\right) \cdots G_{N}^{X}\left(i_{N}\right) xi1,i2iN=G1X(i1)G2X(i2)GNX(iN)

在这里插入图片描述

同态加密相关基础

同态加密是一种支持在加密数据上直接进行计算操作、同时保证解密后的计算结果与明文状态下计算结果一致的公钥加密体制。

基于 ring-LWE 的同态加密算法涉及几个重要的参数:
在这里插入图片描述
注释: Z q [ x ] \mathbb{Z}_{q}[x] Zq[x]代表整数域的多项式全体, χ = D Z n , σ \chi=D_{{\mathrm{Z}}^{n}, \sigma} χ=DZn,σ中的 D D D代表区域,其下标误差系数 σ \sigma σ就是高斯函数中的方差,至于数学期望就取标准值, Z n {Z}^{n} Zn 代表具有n阶的向量,至于为什么要用Z而不是R呢?因为是离散的高斯误差分布函数!

接下来我们会用 SH.Gen,SH.Enc,SH.Dec 分别表示该同态加密方案中的密钥生成 算法、加密算法与解密算法。

密钥生成算法 SH.Gen:取样一个环上元素 s ← χ s \leftarrow \chi sχ,利用公式 s k ≜ s s k \triangleq s sks 生成密钥。再取样一个均匀随机的环上元素 a 1 ← R q a_{1} \leftarrow R_{q} a1Rq 和一个误差 e ← χ e \leftarrow \chi eχ,利用公式 p k = ( a 0 , a 1 ) ≜ ( a 0 = − ( a 1 s + t e ) , a 1 ) p k=\left(a_{0}, a_{1}\right) \triangleq\left(a_{0}=-\left(a_{1} s+t e\right), a_{1}\right) pk=(a0,a1)(a0=(a1s+te),a1) 计算公钥。

加密算法 SH.Enc:给定公钥 p k = ( a 0 , a 1 ) p k=\left(a_{0}, a_{1}\right) pk=(a0,a1)和一个明文 m ∈ R t m \in R_{t} mRt,加密算法从 χ \chi χ中取样 u ← χ 、 f , g ← χ u \leftarrow \chi_{、} f, g \leftarrow \chi uχf,gχ,通过公式 c t = ( c 0 , c 1 ) ≜ ( a 0 u + tg ⁡ + m , a 1 u + t f ) c t=\left(c_{0}, c_{1}\right) \triangleq\left(a_{0} u+\operatorname{tg}+m, a_{1} u+t f\right) ct=(c0,c1)(a0u+tg+m,a1u+tf)计算密文。

解密算法SH.Dec:解密密文 c t = ( c 0 , c 1 , ⋯   , c δ ) c t=\left(c_{0}, c_{1}, \cdots, c_{\delta}\right) ct=(c0,c1,,cδ)时,通过公式 m ~ = ∑ i = 0 δ c i s i \widetilde{m}=\sum_{i=0}^{\delta} c_{i} s^{i} m =i=0δcisi计算 m ~ \widetilde{m} m ,然后将 m ~ \widetilde{m} m t t t取余得到明文结果。

基于 ring-LWE 的同态加密算法支持有限次的加法同态操作和乘法同态操作。
加法同态:假设有两个密文 c t = ( c 0 , c 1 , ⋯   , c δ ) c t=\left(c_{0}, c_{1}, \cdots, c_{\delta}\right) ct=(c0,c1,,cδ) c t ′ = ( c 0 ′ , c 1 ′ , ⋯   , c δ ′ ) c t^{\prime}=\left(c_{0}^{\prime}, c_{1}^{\prime}, \cdots, c_{\delta}^{\prime}\right) ct=(c0,c1,,cδ),两个密文相加后的结果解密后等于对应明文状态相加的结果:
SH.Dec ⁡ ( c t ⊕ c t ′ ) = SH.Dec ⁡ ( c t ) + SH.Dec ⁡ ( c t ′ ) \operatorname{SH.Dec}\left(c t \oplus c t^{\prime}\right)=\operatorname{SH.Dec}(c t)+\operatorname{SH.Dec}\left(c t^{\prime}\right) SH.Dec(ctct)=SH.Dec(ct)+SH.Dec(ct)

乘法同态:假设有两个密文 c t = ( c 0 , c 1 , ⋯   , c δ ) c t=\left(c_{0}, c_{1}, \cdots, c_{\delta}\right) ct=(c0,c1,,cδ) c t ′ = ( c 0 ′ , c 1 ′ , ⋯   , c δ ′ ) c t^{\prime}=\left(c_{0}^{\prime}, c_{1}^{\prime}, \cdots, c_{\delta}^{\prime}\right) ct=(c0,c1,,cδ),两个密文相乘后的结果解密后等于对应明文状态相乘的结果:
SH.Dec ⁡ ( c t ⊗ c t ′ ) = SH.Dec ⁡ ( c t ) × SH.Dec ⁡ ( c t ′ ) \operatorname{SH.Dec}\left(c t \otimes c t^{\prime}\right)=\operatorname{SH.Dec}(c t) \times \operatorname{SH.Dec}\left(c t^{\prime}\right) SH.Dec(ctct)=SH.Dec(ct)×SH.Dec(ct)

基础知识就铺垫到这里了,下篇博客正式进入隐私保护的高阶 Bi-Lanczos 方法 研究。

我是一只正在不断学习、希望早日成为小白的小小白,有什么错误欢迎大家批评指正,喜欢的请点个赞哦!

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值