CS236 Deep Generative Models (2)

概述

  • 本章符号多注意一下,有点小变化。
  • 本章都在描述如何对联合分布建模 p ( x , y ) p(x,y) p(x,y)的过程,即Representation的过程,以及如何评估evaluate这个建模分布,并没有提及怎么Learning建模过程中涉及的参数,这放在自回归模型-2中
  • 由于真正对联合分布建模的时候,x,y都是随机变量,故而只需讨论 p ( X ) = p ( x 1 , . . . , x n ) p(X)=p(x_1,...,x_n) p(X)=p(x1,...,xn)即可,毕竟只需要令 x n = y x_n=y xn=y即可。

一、Autoregressive Model

pic-1
我们有的是数据 x i ∼ P d a t a x_i\sim P_{data} xiPdata,需要对拟合真实分布 P d a t a P_{data} Pdata的模型分布 P θ P_\theta Pθ进行Representation.
具体学习过程:

  1. 从represent好的模型分布 P θ P_\theta Pθ进行Generation,得 x ^ \hat x x^;
  2. 度量分布距离 d ( P d a t a , P θ ) d(P_{data},P_\theta) d(Pdata,Pθ),或者度量采样的样本距离 d ( x d a t a , x ^ ) d(x_{data},\hat x) d(xdata,x^),进行Inference推断模型参数 θ \theta θ
  3. Learning,即通过何种方式进行参数更新,怎么learn的问题

给定一个具体的任务,如MNIST中的手写数字二值图分类,从Generative的角度进行Represent,并在Inference中Learning
pic-2
下面先介绍:

  • 描述如何对这个MINST任务建模 p ( X , Y ) p(X,Y) p(X,Y)(Representation)

1.1 对MNIST任务建模

对于一张pixel为 28 × 28 28\times28 28×28大小的图片,令 x 1 x_1 x1表示第一个pixel的随机变量, x 1 ∈ { 0 , 1 } x_1\in\{0,1\} x1{0,1},需明确:

  • 任务目标:学习一个模型分布 p ( x 1 , . . . , x 784 ) , x ∈ { 0 , 1 } p(x_1,...,x_{784}),x\in\{0,1\} p(x1,...,x784),x{0,1},使采样时 x ∼ p θ ( X ) x\sim p_\theta(X) xpθ(X),x是一个logits数字的概率高(还没分类呢

  • 模型假设
    p ( x 1 , . . . , x 784 ) = p C P T ( x 1 ; α 1 ) p l o g i t ( x 2 ∣ x 1 ; α 2 ) ⋯ p l o g i t ( x n ∣ x 1 , . . . x n − 1 ; α n ) p(x_1,...,x_{784})=p_{CPT}(x_1;\alpha^1)p_{logit}(x_2|x_1;\alpha^2)\cdots p_{logit}(x_n|x_1,...x_{n-1};\alpha^n) p(x1,...,x784)=pCPT(x1;α1)plogit(x2x1;α2)plogit(xnx1,...xn1;αn)

  1. 先利用参数 α 1 \alpha_1 α1参数化 p C P T ( x 1 ; α 1 ) p_{CPT}(x_1;\alpha^1) pCPT(x1;α1),如 p C P T ( X 1 = 1 ; α 1 ) = α 1 p_{CPT}(X_1=1;\alpha^1)=\alpha^1 pCPT(X1=1;α1)=α1, p C P T ( X 1 = 0 ; α 1 ) = 1 − α 1 p_{CPT}(X_1=0;\alpha^1)=1-\alpha^1 pCPT(X1=0;α1)=1α1

  2. 基于前面的变量 x 1 x_1 x1,利用参数 α 2 \alpha_2 α2参数化 p l o g i t ( x 2 ∣ x 1 ; α 2 ) p_{logit}(x_2|x_1;\alpha^2) plogit(x2x1;α2),如 p l o g i t ( X 2 = 1 ∣ x 1 ; α 2 ) = σ ( α 0 2 + α 1 2 x 1 ) p_{logit}(X_2=1|x_1;\alpha^2)=\sigma(\alpha^2_0+\alpha_1^2x_1) plogit(X2=1x1;α2)=σ(α02+α12x1)

  3. 基于前面的变量 x 1 , x 2 x_1,x_2 x1,x2,利用参数 α 3 \alpha_3 α3参数化 p l o g i t ( x 3 ∣ x 1 , x 2 ; α 3 ) p_{logit}(x_3|x_1,x_2;\alpha^3) plogit(x3x1,x2;α3),如 p l o g i t ( X 3 = 1 ∣ x 1 , x 2 ; α 3 ) = σ ( α 0 3 + α 1 3 x 1 + α 2 3 x 2 ) p_{logit}(X_3=1|x_1,x_2;\alpha^3)=\sigma(\alpha^3_0+\alpha^3_1x_1+\alpha^3_2x_2) plogit(X3=1x1,x2;α3)=σ(α03+α13x1+α23x2)

    以此类推,第 i i i个pixel取决于前 i − 1 i-1 i1个pixel,这种特性称作AutoRegressive,自回归即
    x ^ i = p ( X i = 1 ∣ x 1 , . . . , x i − 1 ; α i ) = σ ( α 0 i + ∑ j = 1 i − 1 α j i x j ) \hat x_i=p(X_i=1|x_1,...,x_{i-1};\alpha^i)=\sigma(\alpha_0^i+\sum_{j=1}^{i-1}\alpha_j^ix_j) x^i=p(Xi=1x1,...,xi1;αi)=σ(α0i+j=1i1αjixj)

    这样建模的参数量有 1 + 2 + ⋯ + n ≈ n 2 2 1+2+\cdots+n\approx \frac{n^2}{2} 1+2++n2n2

  • 模型分布

评估(Evaluate)模型分布:
p ( X 1 = 0 , X 2 = 1 , X 3 = 1 ) = ( 1 − x ^ 1 ) × x ^ 2 × x ^ 3 p(X_1=0,X_2=1,X_3=1)=(1-\hat x_1)\times\hat x_2\times\hat x_3 p(X1=0,X2=1,X3=1)=(1x^1)×x^2×x^3

从模型分布采样:
x ˉ 1 ∼ p ( x 1 ) x ˉ 2 ∼ p ( x 2 ∣ x 1 = x ˉ 1 ) x ˉ 3 ∼ p ( x 3 ∣ x 1 = x ˉ 1 , x 2 = x ˉ 2 ) ⋯ \bar x_1\sim p(x_1)\\ \bar x_2\sim p(x_2|x_1=\bar x_1)\\ \bar x_3\sim p(x_3|x_1=\bar x_1,x_2=\bar x_2)\cdots xˉ1p(x1)xˉ2p(x2x1=xˉ1)xˉ3p(x3x1=xˉ1,x2=xˉ2)

目前基于这种模型假设形成的representation,称作FVSBN(Fully Visible Sigmoid Belief Network),图大致如下:
pic-3

1.2 FVSBN模型扩展NADE

上述的FVSBN, x ^ i \hat x_i x^i是分布 p ( X i = 1 ∣ x 1 , . . . , x i − 1 ; α i ) p(X_i=1|x_1,...,x_{i-1};\alpha^i) p(Xi=1x1,...,xi1;αi)的观测值,即由随机变量直接生成,完全可观测Fully Visible,Sigmoid则是对线性化随机变量 σ ( α 0 i + ∑ j = 1 i − 1 α j i x j ) \sigma(\alpha_0^i+\sum_{j=1}^{i-1}\alpha_j^ix_j) σ(α0i+j=1i1αjixj)的激活函数。
对FVSBN,进行隐层hidden layer扩展,称为NADE(Neural Autoregressive Density Estimation),图如下:
pic-4
x ^ i = p ( x i ∣ x 1 , … , x i − 1 ) = σ ( α i h i + b i ) h i = σ ( W x < i + c i ) x ^ i = σ ( α i σ ( W x < i + c i ) + b i ) \hat x_i=p(x_i|x_1,\dots,x_{i-1})=\sigma(\alpha_ih_i+b_i)\\ h_i=\sigma(Wx_{<i}+c_i)\\ \hat x_i=\sigma(\alpha_i\sigma(Wx_{<i}+c_i)+b_i) x^i=p(xix1,,xi1)=σ(αihi+bi)hi=σ(Wx<i+ci)x^i=σ(αiσ(Wx<i+ci)+bi)

其中 α i , b i , c i , W \alpha_i,b_i,c_i,W αi,bi,ci,W均为参数,具体看下图:
pic-5
h i ∈ R d , 则 α i , b i ∈ R d , c i ∈ R d , W ∈ R d × n h_i\in R^d,则\alpha_i,b_i\in R^d,c_i\in R^d,W\in R^{d\times n} hiRdαi,biRd,ciRd,WRd×n,因此evaluation p ( x 1 , . . . , x n ) p(x_1,...,x_n) p(x1,...,xn)的复杂度为 O ( n d ) O(nd) O(nd).

1.3 任务复杂度扩展RNADE(Random NADE)

上述NADE的任务背景是每个pixel均为二值变量 x i ∈ { 0 , 1 } x_i\in\{0,1\} xi{0,1},现在先扩展到256个值的变量 x i ∈ { 0 , 1 , . . . , 255 } x_i\in\{0,1,...,255\} xi{0,1,...,255},再扩展到连续变量如 x i ∼ N ( u i , σ i ) x_i \sim N(u_i,\sigma_i) xiN(ui,σi).

  • 多项式分布
    先看看256个值的变量 x i x_i xi,自然想到用多项式分布categorical distribution,即 x i ∼ C a t ( p i 1 , . . . , p i 256 ) x_i\sim Cat(p_i^1,...,p_i^{256}) xiCat(pi1,...,pi256),对于第 i i i个随机变量服从一个多项分布 C a t Cat Cat,其参数为 p i k , k = 1 , . . . , 256 p_i^k,k=1,...,256 pik,k=1,...,256
    在NADE中有:
    x ^ i = p ( x i ∣ x 1 , … , x i − 1 ) = σ ( α i h i + b i ) h i = σ ( W x < i + c i ) x ^ i = σ ( α i σ ( W x < i + c i ) + b i ) \hat x_i=p(x_i|x_1,\dots,x_{i-1})=\sigma(\alpha_ih_i+b_i)\\ h_i=\sigma(Wx_{<i}+c_i)\\ \hat x_i=\sigma(\alpha_i\sigma(Wx_{<i}+c_i)+b_i) x^i=p(xix1,,xi1)=σ(αihi+bi)hi=σ(Wx<i+ci)x^i=σ(αiσ(Wx<i+ci)+bi)
    因此RNADE有:
    p ( x i ∣ x 1 , … , x i − 1 ) = C a t ( p i 1 , . . . , p i 256 ) ( 1 ) x ^ i = ( p i 1 , . . . , p i 256 ) = s o f t m a x ( X i h i + b i ) ( 2 ) h i = σ ( W x < i + c i ) ( 3 ) p(x_i|x_1,\dots,x_{i-1})=Cat(p_i^1,...,p_i^{256})\quad (1)\\ \hat x_i=(p_i^1,...,p_i^{256})=softmax(X_ih_i+b_i)\quad (2)\\ h_i=\sigma(Wx_{<i}+c_i)\quad (3) p(xix1,,xi1)=Cat(pi1,...,pi256)(1)x^i=(pi1,...,pi256)=softmax(Xihi+bi)(2)hi=σ(Wx<i+ci)(3)

解释一下:
( 1 ) (1) (1):利用Autoregressive来建模联合分布,第 i i i个随机变量的分布condition on前 i − 1 i-1 i1个随机变量的值,并服从一个多项式分布 C a t Cat Cat(离散情况下的数量)
( 2 ) (2) (2):一个观测值 x ^ i \hat x_i x^i多项式分布参数 p i 1 , . . . , p i 256 p_i^1,...,p_i^{256} pi1,...,pi256自隐层输出 X i h i + b i X_ih_i+b_i Xihi+bi的softmax
( 3 ) (3) (3):一个隐层的输入 h i h_i hi与前面 i − 1 i-1 i1个随机变量有关

(最想说的还是,该建模过程,通过假设分布,模型最后的输出拟合的是分布参数,采样观测值的分布,而并不是观测值本身)
pic-4

  • 高斯分布
    连续变量的情况下,最容易想到的就是高斯分布了。根据上面的流程,看看建模过程是怎样的representation
    p ( x i ∣ x 1 , … , x i − 1 ) = ∑ j = 1 K 1 K N ( x i ; u i j , σ i j ) ( 1 ) x ^ i = ( u i 1 . . . , u i K , σ i 1 , . . . , σ i K ) = f ( h i ) ( 2 ) h i = σ ( W x < i + c i ) ( 3 ) p(x_i|x_1,\dots,x_{i-1})=\sum_{j=1}^K\frac{1}{K}N(x_i;u_i^j,\sigma_i^j)\quad (1)\\ \hat x_i=(u_i^1...,u_i^K,\sigma_i^1,...,\sigma_i^K)=f(h_i)\quad (2)\\ h_i=\sigma(Wx_{<i}+c_i)\quad (3) p(xix1,,xi1)=j=1KK1N(xi;uij,σij)(1)x^i=(ui1...,uiK,σi1,...,σiK)=f(hi)(2)hi=σ(Wx<i+ci)(3)

解释一下:
( 1 ) (1) (1):利用Autoregressive来建模联合分布,第 i i i个随机变量的分布condition on前 i − 1 i-1 i1个随机变量的值,并服从由K个高斯分布组成的混合高斯分布
( 2 ) (2) (2):一个观测值 x ^ i \hat x_i x^i混合高斯分布参数 ( u i 1 . . . , u i K , σ i 1 , . . . , σ i K ) (u_i^1...,u_i^K,\sigma_i^1,...,\sigma_i^K) (ui1...,uiK,σi1,...,σiK)自经过函数 f f f映射的隐层输出 X i h i + b i X_ih_i+b_i Xihi+bi
( 3 ) (3) (3):一个隐层的输入 h i h_i hi与前面 i − 1 i-1 i1个随机变量有关

二、 以Autoregressive看Autoencoder与RNN

2.1 Autoregressive 的Autoencoder

上述提到的FVSBN、NADE、RNADE在建模联合分布时,都假设了第 i i i个随机变量的分布condition on前 i − 1 i-1 i1个随机变量的值,并服从一个假设分布。
实际上自回归Autoregressive的意思,是指这堆随机变量之间组成一个DAG图,即在Deep Generative Model (1)中提过,随机变量之间存在条件独立性的约束,并不存在环(那存在环咋办,后续再说?)
我们看看Autoencoder的图,与RNADE想比,随机变量 x 1 , x 2 , x 3 x_1,x_2,x_3 x1,x2,x3之间并无条件独立性假设,而且值输入一次,1个pass,就可以得到三个观测值 x ^ 1 , x ^ 2 , x ^ 3 \hat x_1,\hat x_2,\hat x_3 x^1,x^2,x^3,但是RNADE的 n n n个观测值 x ^ 1 , x ^ 2 . . . x ^ n \hat x_1,\hat x_2...\hat x_n x^1,x^2...x^n,需要值输入n次,n个pass,因为第 i i i个观测值取决于前 i − 1 i-1 i1个随机变量 x 1 , x 2 , . . . , x i − 1 x_1,x_2,...,x_{i-1} x1,x2,...,xi1的值。
pic-6
下面简要介绍一下Autoregressive的AutoEncoder,最主要的就是在随机变量之间施加条件独立性假设,具体做法就是通过Masks,如下图:
在这里插入图片描述
通过固定一个Mask来实现输入层随机变量与隐层之间的条件独立性假设,从而使得输出层的分布参数形成的分布如 p ( x 3 ∣ x 2 ) p(x_3|x_2) p(x3x2)带有了Autoregressive的特性。具体可参见这篇文章。
MADE: Masked Autoencoder for Distribution Estimation 2015 jmlr

2.2 带有Autoregressive特性的RNN

在上面的模型FVSBN,NADE,RNADE中,建模时有一个问题,即 p ( x t ∣ x 1 : t − 1 ; α t ) p(x_t|x_{1:t-1};\alpha^t) p(xtx1:t1;αt)随着变量个数或者序列长度t的增多,Hitory即 x 1 : t − 1 x_{1:t-1} x1:t1一直在变长,造成计算量剧增。
Idea:解决这个histroy随序列变长的问题,就是从一开始就存储一个对History信息进行浓缩的Summary,并且每一次变长都更新这个Summary,就不需要每次都计算一遍历史信息了。
pic-7

  1. Summary update: h t + 1 = t a n h ( W h h h t + W x h x t + 1 ) h_{t+1}=tanh(W_{hh}h_t+W_{xh}x_{t+1}) ht+1=tanh(Whhht+Wxhxt+1)
  2. Prediction: o t + 1 = W h y h t + 1 o_{t+1}=W_{hy}h_{t+1} ot+1=Whyht+1
  3. Summary Initalization: h 0 = b 0 h_0=b_0 h0=b0

解释一下:
4. 第t+1时刻的Summary = tanh(第t时刻的Summary+第t+1时刻的输入)
5. 第t+1时刻的观测值observation = 第t+1时刻的Summary的变换
6. 初始化Summary

一个为什么RNN自带Autoregressive的例子:
pic-8

  • 假设随机变量 x i ∈ { h , e , l , o } x_i\in\{h,e,l,o\} xi{h,e,l,o},使用one-hot编码
  • Autoregressive: p ( X ) = p ( X 1 = h , X 2 = e , X 3 = l , X 4 = l , X 5 = o ) = p ( x 1 = h ) p ( x 2 = e ∣ x 1 = h ) … p ( X 5 = o ∣ X 1 = h , X 2 = e , X 3 = l , X 4 = l ) p(X)=p(X_1=h,X_2=e,X_3=l,X_4=l,X_5=o)=p(x_1=h)p(x_2=e|x_1=h)\dots p(X_5=o|X_1=h,X_2=e,X_3=l,X_4=l) p(X)=p(X1=h,X2=e,X3=l,X4=l,X5=o)=p(x1=h)p(x2=ex1=h)p(X5=oX1=h,X2=e,X3=l,X4=l)

当然除此以外,随机变量 x i x_i xi的取值可以是word,bi word,也是character,在图像中则为pixel,于是有Pixel RNN,Pixel CNN这样的模型,采用AutoRegressive建模的方式与上述差异不大。

三、 Pixel RNN与Pixel CNN

主要对Image的pixel进行Autoregressive的角度,看看Pixel RNN与Pixel CNN的大致原理,顺便回顾下Autoregressive的Generative Model对一个问题的建模过程。

3.1 Pixel RNN

pic-9
对于一张彩色的图片,假设随机变量条件独立性的顺序ordering,如 x 1 , x 2 , . . . x n 2 x_1,x_2,...x_{n^2} x1,x2,...xn2。Autoregressive总有一个ordering,毕竟条件独立性嘛~

  • 先研究变量 x i x_i xi的取值,因为是彩色图片,所以一个pixel的 x i x_i xi除了离散的256个灰度值,还有三个通道(R,G,B),所以 x i ∈ { 0 , 1 , . . . , 255 , R , G , B } x_i\in \{0,1,...,255,R,G,B\} xi{0,1,...,255,R,G,B}
  • 联合分布有 p ( x 1 , . . . , x n 2 ) = p ( x 1 ; α 1 ) p ( x 2 ∣ x 1 ; α 2 ) ⋯ p ( x n 2 ∣ x 1 , . . . , x n 2 − 1 ; α n 2 ) p(x_1,...,x_{n^2})=p(x_1;\alpha^1)p(x_2|x_1;\alpha^2)\cdots p(x_{n^2}|x_1,...,x_{n^2-1};\alpha^{n^2}) p(x1,...,xn2)=p(x1;α1)p(x2x1;α2)p(xn2x1,...,xn21;αn2)
  • 对其建模
    p ( x t ∣ x 1 , . . . , x t − 1 ; α t ) = p ( x t R ∣ x 1 : t − 1 ) p ( x t G ∣ x 1 : t − 1 , x t R ) p ( x t B ∣ x 1 : t − 1 , x t R , x t G ) p(x_t|x_1,...,x_{t-1};\alpha^t)=p(x_t^R|x_{1:t-1})p(x_t^G|x_{1:t-1},x_t^R)p(x_t^B|x_{1:t-1},x_t^R,x_t^G) p(xtx1,...,xt1;αt)=p(xtRx1:t1)p(xtGx1:t1,xtR)p(xtBx1:t1,xtR,xtG)其中 p ( x t R ∣ x 1 : t − 1 ) , p ( x t G ∣ x 1 : t − 1 , x t R ) , p ( x t B ∣ x 1 : t − 1 , x t R , x t G ) p(x_t^R|x_{1:t-1}),p(x_t^G|x_{1:t-1},x_t^R),p(x_t^B|x_{1:t-1},x_t^R,x_t^G) p(xtRx1:t1),p(xtGx1:t1,xtR),p(xtBx1:t1,xtR,xtG)均服从一个多项式分布,即 C a t ( p R , G , B 1 , . . . , p R , G , B 256 ) Cat(p_{R,G,B}^1,...,p_{R,G,B}^{256}) Cat(pR,G,B1,...,pR,G,B256)
  • 对于历史信息 x 1 : t − 1 x_{1:t-1} x1:t1的处理采用RNN的形式,大致原理如下图所示
    pic-10
    解释一下大意:
  • 最底层的context即 x 1 : t − 1 x_{1:t-1} x1:t1的历史信息值,作为conditon
  • 中间层的R condition on x 1 : t − 1 x_{1:t-1} x1:t1,即 p ( x t R ∣ x 1 : t − 1 ) p(x_t^R|x_{1:t-1}) p(xtRx1:t1)
  • 中间层与顶层的G condition on x 1 : t − 1 , x t R x_{1:t-1},x_t^R x1:t1xtR p ( x t G ∣ x 1 : t − 1 , x t R ) p(x_t^G|x_{1:t-1},x_t^R) p(xtGx1:t1,xtR)

这三层的意思,是因为使用RNN来避免重复计算历史信息,即进行Summray的update。而Mask的作用在于,限制层间信息传输是服从条件独立性的,区别于Fully Connected。

3.2 Pixel CNN

pic-11

  • Pixel CNN与Pixel RNN的区别
  1. Pixel RNN对联合分布的条件独立性假设是 p ( x t ∣ x 1 , . . . , x t − 1 ; α t ) p(x_t|x_1,...,x_{t-1};\alpha^t) p(xtx1,...,xt1;αt)
    Pixel CNN对联合分布的条件独立性假设是 p ( x t ∣ x n e i g h b o r h o o d ; α t ) p(x_t|x_{neighborhood};\alpha^t) p(xtxneighborhood;αt)
  2. 如上图所示,对第 i i i个pixel的预测,condition on 邻居pixel时,是Pixel CNN;condition on 历史信息 x 1 : i − 1 x_{1:i-1} x1:i1的pixels时,是Pixel RNN;
  3. Pixel CNN与Pixel RNN比效果相当,但计算速度更快。
  • 两者共同点
  1. 共同的地方就是把随机变量的取值 { 0 , 1 , . . . , 255 , R , G , B } \{0,1,...,255,R,G,B\} {0,1,...,255,R,G,B}分为 { 0 , 1 , . . . , 255 } \{0,1,...,255\} {0,1,...,255} { R , G , B } \{R,G,B\} {R,G,B}两个部分进行处理
  2. 对conditon on通道 { R , G , B } \{R,G,B\} {R,G,B} { 0 , 1 , . . . , 255 } \{0,1,...,255\} {0,1,...,255}采用的都是多项式分布建模,对通道建模处理相同,即
    p ( x t ∣ x 1 , . . . , x t − 1 ; α t ) = p ( x t R ∣ x 1 : t − 1 ) p ( x t G ∣ x 1 : t − 1 , x t R ) p ( x t B ∣ x 1 : t − 1 , x t R , x t G ) p(x_t|x_1,...,x_{t-1};\alpha^t)=p(x_t^R|x_{1:t-1})p(x_t^G|x_{1:t-1},x_t^R)p(x_t^B|x_{1:t-1},x_t^R,x_t^G) p(xtx1,...,xt1;αt)=p(xtRx1:t1)p(xtGx1:t1,xtR)p(xtBx1:t1,xtR,xtG)
  3. 实现条件独立性的顺序即condition on的做法,都是采用固定的mask进行,对于Pixel CNN选neighborhood的操作,如下图:
    pic-12

具体细节可参见
Pixel RNN 2016 CVPR

四、小总结

Autoregressive Model还有在Adversarial Attacks和Anomaly Detect中的应用如2018年的PixelDefend,对抗样本和异常样本输入到训练好的模型分布 p θ ( x ) p_\theta(x) pθ(x)中对的概率是非常低的,因此可以检测出来。
偷个懒(逃~
pic-13
详情可见CS236

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值