论文《CausalRec: Causal Inference for Visual Debiasing Visually-Aware Recommendation》阅读

论文概况

今天为大家带来的是 ACM MM 2021 上关于因果推荐的一篇论文《CausalRec: Causal Inference for Visual Debiasing Visually-Aware Recommendation》,论文主要聚焦在visually-based recommendation 这一主题,针对视觉特征造成的 visual bias, 基于因果推断,提出了基于因果干预的推荐模型 CausalRec。文章对于中介效应的介绍非常细致,值得学习。

论文由Queensland大学Ruihong Qiu(SBR 模型 FGNN 作者)完成

论文地址:https://dl.acm.org/doi/10.1145/3474085.3475266

代码地址:https://github.com/RuihongQiu/CausalRec

论文概述(Intro)

论文的动机来自于视觉bias,其实这里可以理解为clickbait,即处于视觉原因点击进入某个物体详情页,实际上用户对于该物品的prefence可能来自于其他原因(如品牌、价格、材质等)。

图1. Illustration

这里作者提出一个问题"If a user had seen other items with the same visual feature, would this user still interact with these items?"

这个问题也就引出了本文后续的反事实假设,这里所谓的the same visual feature,也就是因果干预(causal intervention),通过干预,使得物品的视觉信息相同(mean值处理或者null值处理)。

实际上个人认为,这里的假设其实是有点问题的,这部分内容后续进行详细解读。

Preliminaries

作者首先通过一个抽象的general的causal graph来解释 TE (Total Effect,总体效果)、 NDE (Natural Direct Effect)和 TIE (Total
Indirect Effect)。

图2. General Causal Graphs

作者这里通过一个泛化的因果图,来说明直接路径 (direct path)、间接路径 (indirect path)、中介(mediator)的概念和对因果图的影响。

对于上述图 2(a),存在路径 A → B A\rightarrow B AB A → C A\rightarrow C AC B → C B\rightarrow C BC,分别表示三条因果路径。对于路径 A → B A\rightarrow B AB, A A A B B B 的 cause,即, A A A 能够决定 B B B 的分布。其余路径解释类似,节点表示变量,边表示因果关系。

对于节点 C C C,即存在路径 A → B → C A \rightarrow B \rightarrow C ABC,又存在路径 A → C A \rightarrow C AC。如果研究对象是 A A A 对于 C C C 的影响,那么 A → B → C A \rightarrow B \rightarrow C ABC 就是一条间接路径, A → C A \rightarrow C AC 就是一条直接路径。 B B B 就是一个中介,或 中间者(mediator)。

  • 为调研不同路径对于结果 C C C 的影响,首先是不进行处理的因果图 2(a),那么得到的结果就是两条路径的总值,即 C a , B a C_{a, B_{a}} Ca,Ba。这里, B B B 的分布受到了 A A A 的影响,用贝叶斯公式来表示,即
    P ( C ∣ A ) = ∑ b P ( C ∣ A , b ) P ( b ∣ A ) . (1) P(C \mid A)=\sum_b P(C \mid A, b) P(b \mid A). \tag{1} P(CA)=bP(CA,b)P(bA).(1)

  • 图 2(b) 表示对节点 a a a 进行干预,对两条边都有影响,得到最终的结果 C a ∗ , B a ∗ C_{a^{*}, B_{a^{*}}} Ca,Ba。 这两部分的差值,就可以体现对节点 A A A 进行干预,得到的所有变化效果,即,
    T I E = C a , B a − C a ∗ , B a ∗ . (2) TIE = C_{a, B_{a}} - C_{a^{*}, B_{a^{*}}}. \tag{2} TIE=Ca,BaCa,Ba.(2)

  • 想要探究不同路径对于结果的影响,就对单独的路径进行干预。以 图2© 为例,对直接路径进行干预,将 A A A B B B 之间的路径切断,那么变量 B B B 就变成一个独立变量, A A A B B B 之间的关系也就被切断了。根据贝叶斯公式,得到概率计算公式如下:
    P ( C ∣ A ) = ∑ b P ( C ∣ A , b ) P ( b ) . (3) P(C \mid A)=\sum_b P(C \mid A, b) P(b). \tag{3} P(CA)=bP(CA,b)P(b).(3)

  • 图 2© 中,通过对直接路径进行干预,因此得到对变量 C C C 的直接影响 a ∗ a^{*} a。同时保留了原来的间接路径 A → B → C A \rightarrow B \rightarrow C ABC 的影响 B a B_{a} Ba,因此,对于结果变量 C C C,得到最终的计算结果为 C a ∗ , B a C_{a^{*}, B_{a}} Ca,Ba
    同理,对于图 2(d),得到 对间接路径的干预 结果 C a , B a ∗ C_{a, B_{a^{*}}} Ca,Ba

  • 由上引申,对于图 2(d),施加干预到间接路径,减去图 2(b) 的对源头节点 a ∗ a^{*} a 的 影响,就得到了最终的直接路径上的影响变化,即自然直接效果(Natural Direct Effect,NDE):
    N D E = C a , B a ∗ − C a ∗ , B a ∗ . (4) NDE = C_{a, B_{a^{*}}} - C_{a^{*}, B_{a^{*}}}. \tag{4} NDE=Ca,BaCa,Ba.(4)

  • 根据 TE 和 NDE,得到 全部间接效果(Total Indirect Effect, TIE)的计算结果:
    T I E = T E − N D E = C a , B a − C a , B a ∗ . (5) TIE = TE - NDE = C_{a, B_{a}} - C_{a, B_{a^{*}}}. \tag{5} TIE=TENDE=Ca,BaCa,Ba.(5)

参考《关于中介效应的备忘》 一文,感谢 Jebda

P.S. 另外,对于论文中的 treatment 和 no-treatment,不用刻意区分,这个表达目前没有在其他论文中见到过,按照因果推论中的期待值和目标值进行区分就行。即 A A A 只正常分布,未进行干预。 d o ( A = a ∗ ) do(A= a^{*}) do(A=a),即文中的no-treatment,只切断节点 A A A 的父节点,使之分布按照平均分布进行,不再受到父亲节点分布的影响。
可能作者这里重点强调treatment是赋值为某一特殊值,no-treatment是指去掉其特殊性,做均值或null值处理。

Visual Bias in Mainstream Visually-aware Recommendation

作者在这一部分介绍了主流的视觉推荐模型中的visual bias的情况,通过对不同模型(包括矩阵分解MF、VBPR、DeepStyle、AMR、DVBPR)进行对应到因果图的分析,对其bias进行了分析。

图3. Causal Graphs for Visually-aware Recommenders

1. MF(UAI 2009)

y u , i = α + β u + β i + γ u ⊤ γ i . (6) y_{u,i} = \alpha + \beta_u + \beta_i + \boldsymbol{\gamma}_u^\top\boldsymbol{\gamma}_i. \tag{6} yu,i=α+βu+βi+γuγi.(6)

对应因果图如 3(a), M M M 表示用户与物品之间的Match,即协同过滤关系,又同时通过bias term β u \beta_u βu β i \beta_i βi y u , i y_{u,i} yu,i 加入了因果关系。

2. VBPR(AAAI 2016)

y i , v , u = α + β u + β i + γ u ⊤ γ i + θ u ⊤ ( E ϕ ( V i ) ) . (7) y_{i,v,u} = \alpha + \beta_u + \beta_i + \boldsymbol{\gamma}_u^\top \boldsymbol{\gamma}_i+\boldsymbol{\theta}_u^\top \left(\mathbf{E} \phi(\mathbf{V}_i)\right). \tag{7} yi,v,u=α+βu+βi+γuγi+θu(Eϕ(Vi)).(7)

如图 3(b) 所示,在MF基础上,加入了视觉信息, θ u ⊤ ( E ϕ ( V i ) ) \boldsymbol{\theta}_u^\top \left(\mathbf{E} \phi(\mathbf{V}_i)\right) θu(Eϕ(Vi)) ϕ ( ⋅ ) \phi(\cdot) ϕ() 表示visual embedding 预训练模型(如ResNet, ViT, VGG等),代表了 I → V I \rightarrow V IV 的因果关系; E \mathbf{E} E 是 一个可训练矩阵; θ u \boldsymbol{\theta}_u θu 表示用户embedding。

3. Deepstyle (SIGIR 2017) & AMR (TKDE 2020):

DeepStyle:
y i , v , u = γ u ⊤ ( E ϕ ( V i ) − c i + γ i ) . (8) y_{i,v,u} = \boldsymbol{\gamma}_u^\top \left(\mathbf{E} \phi(\mathbf{V}_i) - \mathbf{c}_i + \boldsymbol{\gamma}_i \right). \tag{8} yi,v,u=γu(Eϕ(Vi)ci+γi).(8)

AMR:
y i , v , u = γ u ⊤ ( E ϕ ( V i ) + Δ i + γ i ) . (9) y_{i,v,u} = \boldsymbol{\gamma}_u^\top \left(\mathbf{E} \phi(\mathbf{V}_i) + \boldsymbol{\Delta}_i + \boldsymbol{\gamma}_i \right). \tag{9} yi,v,u=γu(Eϕ(Vi)+Δi+γi).(9)

区别不大,总之 γ i \boldsymbol{\gamma}_i γi c i \boldsymbol{c}_i ci Δ i \boldsymbol{\Delta}_i Δi 都是物品 i i i 的embedding,在因果图中表示同一节点 I I I

我们对公式(8)、公式(9)统一解释一下,就不再介绍后面的因果图了。以DeepStyle为例,

y i , v , u = γ u ⊤ ( E ϕ ( V i ) − c i + γ i ) = γ u ⊤ E ϕ ( V i ) + γ u ⊤ ( γ i − c i ) , (10) \begin{equation}\begin{aligned}y_{i,v,u} &= \boldsymbol{\gamma}_u^\top \left(\mathbf{E} \phi(\mathbf{V}_i) - \mathbf{c}_i + \boldsymbol{\gamma}_i \right) \\ &= \boldsymbol{\gamma}_u^\top \mathbf{E} \phi(\mathbf{V}_i) + \boldsymbol{\gamma}_u^\top (\boldsymbol{\gamma}_i - \mathbf{c}_i), \end{aligned}\end{equation}\tag{10} yi,v,u=γu(Eϕ(Vi)ci+γi)=γuEϕ(Vi)+γu(γici),(10)
其中的三项内容对应的因果路径分别如下,(1) γ u ⊤ E ϕ ( V i ) \boldsymbol{\gamma}_u^\top \mathbf{E} \phi(\mathbf{V}_i) γuEϕ(Vi) 表示 I → V → N ← U I \rightarrow V \rightarrow N \leftarrow U IVNU;(2) γ u ⊤ ( γ i − c i ) \boldsymbol{\gamma}_u^\top (\boldsymbol{\gamma}_i - \mathbf{c}_i) γu(γici) 表示路径 U → M ← I U \rightarrow M \leftarrow I UMI
(3)最后,两项进行加和,代表路径 N → Y ← M N \rightarrow Y \leftarrow M NYM

4. DVBPR (ICDM 2017)

预测函数如下:
y i , v , u = α + β u + θ u ⊤ E ϕ ( V i ) . (11) y_{i,v,u} = \alpha + \beta_{u} + \boldsymbol{\theta}_u^{\top} \mathbf{E} \phi\left( \mathbf{V}_i \right) \tag{11}. yi,v,u=α+βu+θuEϕ(Vi).(11)

对应因果图如图 3(d) 所示。

至此,关于几个visual recommendation模型的因果图介绍就基本完成,后面介绍几个visual推荐模型的去偏(debias)过程。

Visual Debiasing

根据上述内容介绍所示,visual信息引起的bias主要集中在visual对交互的直接路径上,所以去偏的过程也就是要减去visual information对交互的直接影响(在预测过程中使用TIE完成预测)。

这一部分主要就是针对visual recommendation模型的intervention之后inference该怎么算。

这里为方便介绍,把上面的图3 右半部分的内容挪到这里,为什么不引起混淆,取名叫图3.1如下。

图3.1. Intervention for Mainstream Visual Recommendation Models

图 3.1(e) 和 图 3.1(f) 分别表示对 VBPR 和 DeepStyle/AMR 进行干预。

如公式 (4)、公式(5) 所示,应该对间接路径进行干预,然后计算得到 TIE。

因为对于这两个因果图来说,都是包含直接路径( I → V → N → Y I \rightarrow V \rightarrow N \rightarrow Y IVNY)和间接路径( I → M → Y I \rightarrow M \rightarrow Y IMY),因此处理方法相同。对于间接路径进行处理,即处理路径 I → M → Y I \rightarrow M \rightarrow Y IMY 如 图3.1 所示。
具体来说,有

未进行干预的预测函数 Y i , v , u Y_{i, v, u} Yi,v,u
Y i , v , u = Y ( I = i , V = v , U = u ) = Y M i , u , N v , u (12) Y_{i, v, u}=Y(I=i, V=v, U=u)=Y_{M_{i, u}, N_{v, u}} \tag{12} Yi,v,u=Y(I=i,V=v,U=u)=YMi,u,Nv,u(12)

对 节点 I 进行干预,得到 TE如下:
T E = Y i , v , u − Y i ∗ , v ∗ , u = Y M i , u , N v , u − Y M i ∗ , u , N v ∗ , u . (13) TE=Y_{i, v, u}-Y_{i^*, v^*, u}=Y_{M_{i, u}, N_{v, u}}-Y_{M_{i^*, u}, N_{v^*, u}}.\tag{13} TE=Yi,v,uYi,v,u=YMi,u,Nv,uYMi,u,Nv,u.(13)

直接路径 I → V → N → Y I \rightarrow V \rightarrow N \rightarrow Y IVNY 和 间接路径 I → M → Y I \rightarrow M \rightarrow Y IMY ,对间接路径进行干预,得到 Y i ∗ , v , u Y_{i^*, v, u} Yi,v,u

Y i ∗ , v , u = Y M i ∗ , u , N v , u . (16) Y_{i^*, v, u}=Y_{M_{i *, u}, N_{v, u}}. \tag{16} Yi,v,u=YMi,u,Nv,u.(16)

根据 NDE 和 TIE 的计算公式,得到如下 inference计算方法:

N D E = Y i ∗ , v , u − Y i ∗ , v ∗ , u = Y M i ∗ , u , , N v , u − Y M i ∗ , u , N v ∗ , u . (17) NDE=Y_{i^*, v, u}-Y_{i^*, v^*, u}=Y_{M_{i^*, u,}, N_{v, u}}-Y_{M_{i^*, u}, N_{v^*, u}} .\tag{17} NDE=Yi,v,uYi,v,u=YMi,u,,Nv,uYMi,u,Nv,u.(17)
T I E = T E − N D E = Y i , v , u − Y i ∗ , v , u = Y M i , u , N v , u − Y M i ∗ , u , N v , u . (18) TIE=TE-NDE=Y_{i, v, u}-Y_{i^*, v, u}=Y_{M_{i, u}, N_{v, u}}-Y_{M_{i^*, u}, N_{v, u}} .\tag{18} TIE=TENDE=Yi,v,uYi,v,u=YMi,u,Nv,uYMi,u,Nv,u.(18)

根据上述计算过程,得到了以VBPR为代表的所有visual recommendation模型的去偏推算目标如下:
y ^ i , v , u = ( α + β u + β i + γ u ⊤ γ i + θ u ⊤ ( E ϕ ( V i ) ) ) − ( α + β u + β i ∗ + γ u ⊤ γ i ∗ + θ u ⊤ ( E ϕ ( V i ∗ ) ) ) = β i − β i ∗ + γ u ⊤ ( γ i − γ i ∗ ) . (19) \begin{aligned}\hat{y}_{i, v, u} &= \left( \alpha + \beta_u + \beta_i + \boldsymbol{\gamma}_u^\top \boldsymbol{\gamma}_i+\boldsymbol{\theta}_u^\top \left(\mathbf{E} \phi(\mathbf{V}_i)\right) \right) \\ &- \left( \alpha + \beta_u + \beta_{i^{*}} + \boldsymbol{\gamma}_u^\top \boldsymbol{\gamma}_{i^{*}}+\boldsymbol{\theta}_u^\top \left(\mathbf{E} \phi(\mathbf{V}_{i^{*}})\right) \right) \\ &=\beta_i-\beta_{i^*}+\boldsymbol{\gamma}_u^\top\left(\boldsymbol{\gamma}_i-\boldsymbol{\gamma}_{i^*}\right) . \end{aligned} \tag{19} y^i,v,u=(α+βu+βi+γuγi+θu(Eϕ(Vi)))(α+βu+βi+γuγi+θu(Eϕ(Vi)))=βiβi+γu(γiγi).(19)
这里的 ϕ ( V i ∗ ) \phi(\mathbf{V}_{i^{*}}) ϕ(Vi) 等同于 ϕ ( V i ) \phi(\mathbf{V}_{i}) ϕ(Vi),文中没有进行符号专门区别,我们这里不做特殊处理,等同处理。

同理,可以得到 DeepStyle 和 AMR 模型的 interaction 去偏计算方式:

y ^ i , v , u = γ u T ( γ i − γ i ∗ ) . (20) \hat{y}_{i, v, u}=\boldsymbol{\gamma}_u^T\left(\boldsymbol{\gamma}_i-\boldsymbol{\gamma}_{i^*}\right) . \tag{20} y^i,v,u=γuT(γiγi).(20)

这部分不再赘述。

可惜的是,作者没有对去偏的这类visual recommendation方法进行实验,显得这部分内容有点不知所云。也让这个论文篇幅有点头重脚轻。不过这部分的写作和公式推导还是相当工整的。

CausalRec

实际上,到现在为止,文章的方法论部分才算正式开始(微笑)。当然前面的内容为这部分奠定了很好的基础,使得这部分内容可以快速理解。

Debiasing for Mainstream Visually-aware Recommendation

作者根据因果图,将针对交互的预测分成两部分,i.e., M M M N N N
具体来说, 作者这里对上述visual recommender模型进行了重新组织,即 M i , u M_{i, u} Mi,u N v , u N_{v, u} Nv,u 分别负责用户与物品的协同过滤部分 和 visual和用户的互相作用:
Y i , v , u = F ( M i , u , N v , u ) , (21) Y_{i, v, u}=\mathcal{F}\left(M_{i, u}, N_{v, u}\right), \tag{21} Yi,v,u=F(Mi,u,Nv,u),(21)
M i , u = γ u T γ i , (22) M_{i, u}=\gamma_u^T \gamma_i, \tag{22} Mi,u=γuTγi,(22)
N v , u = θ u T E ϕ ( V i ) , (23) N_{v, u}=\theta_u^T E \phi\left(V_i\right), \tag{23} Nv,u=θuT(Vi),(23)
这里的融合函数 F ( ⋅ , ⋅ ) \mathcal{F}\left(\cdot, \cdot\right) F(,) 用于将 M M M N N N 进行融合,对于上述的visual recommendation 来说,使用 + + + 完成。

CausalRec Architecture

对于CausalRec的模型设计来说,为强调 visual 信息对间接路径的影响,作者在 CausalRec 的设计中加入了 V → M V \rightarrow M VM 的路径,如 图4 所示。

图4. CausalRec

具体来说,对于交互结果的影响被分为三部分, M i , u M_{i, u} Mi,u M i , v , u M_{i, v, u} Mi,v,u,及 N v , u N_{v, u} Nv,u
设计分别如下:
M i , u = σ ( γ u ⊤ γ i ) , (24) M_{i, u}=\sigma\left(\boldsymbol{\gamma}_u^\top \boldsymbol{\gamma}_i\right), \tag{24} Mi,u=σ(γuγi),(24)

M i , v , u = σ ( γ u ⊤ ( γ i ∘ E ϕ ( V i ) ) ) , (25) M_{i, v, u}=\sigma\left(\boldsymbol{\boldsymbol{\gamma}}_u^\top\left(\boldsymbol{\boldsymbol{\gamma}}_i \circ \mathbf{E}\phi\left(V_i\right)\right)\right), \tag{25} Mi,v,u=σ(γu(γiEϕ(Vi))),(25)

N v , u = σ ( θ u ⊤ E ϕ ( V i ) ) , (26) N_{v, u}=\sigma\left(\boldsymbol{\theta}_u^\top \mathbf{E} \phi\left( V_i \right) \right), \tag{26} Nv,u=σ(θuEϕ(Vi)),(26)

融合部分设计通过乘法完成,对于把对于交互结果的预测进行拆分计算,最后进行融合的方式被称为late fusion,如下所示:

Y i , v , u = F ( M i , u , M i , v , u , N v , u ) = M i , u ⋅ M i , v , u ⋅ N v , u , (27) Y_{i, v, u}=\mathcal{F}\left(M_{i, u}, M_{i, v, u}, N_{v, u}\right) = M_{i, u} \cdot M_{i, v, u} \cdot N_{v, u}, \tag{27} Yi,v,u=F(Mi,u,Mi,v,u,Nv,u)=Mi,uMi,v,uNv,u,(27)

对于late fusion,可以参考论文《Clicks can be Cheating: Counterfactual Recommendation for Mitigating Clickbait Issue》。

CausalRec Training

模型训练也使用多任务学习方式,被拆分成了多个部分,每一部分的优化采用 BPR 损失完成,具体如下:

ℓ = ℓ r e c ( Y i , v , u ) + ℓ r e c ( N v , u ) + ℓ ^ r e c ( M i , u M i , v , u ) , (28) \ell=\ell_{\mathrm{rec}}\left(Y_{i, v, u}\right)+\ell_{\mathrm{rec}}\left(N_{v, u}\right)+\hat{\ell}_{\mathrm{rec}}\left(M_{i, u} M_{i, v, u}\right), \tag{28} =rec(Yi,v,u)+rec(Nv,u)+^rec(Mi,uMi,v,u),(28)
针对每一部分的BPR损失,具体如下:
ℓ r e c ( Y ⋅ ^ ) ∑ ( u , i , j ) ∈ O − ln ⁡ σ ( y ^ u i − y ^ u j ) + λ 1 ∥ Θ ∥ 2 2 . (29) \ell_{\mathrm{rec}}\left(\hat{Y_{\cdot}}\right) \sum_{(u, i, j) \in O}-\ln \sigma\left(\hat{y}_{u i}-\hat{y}_{u j}\right)+\lambda_1\|\Theta\|_2^2. \tag{29} rec(Y^)(u,i,j)Olnσ(y^uiy^uj)+λ1∥Θ22.(29)

CausalRec Inference

完成训练后,别忘了在推理阶段也让CausalRec适应TIE,具体如下:

Y i , v , u = Y M i , u , M i , v , u , N v , u . (30) Y_{i, v, u}=Y_{M_{i, u}, M_{i, v, u}, N_{v, u}}. \tag{30} Yi,v,u=YMi,u,Mi,v,u,Nv,u.(30)
Y i ∗ , v ∗ , u = Y M i ∗ , u , M i ∗ , v ∗ , u , N v , u . (31) Y_{i^*, v^*, u}=Y_{M_{i^*, u}, M_{i^*, v^*, u}, N_{v, u}}.\tag{31} Yi,v,u=YMi,u,Mi,v,u,Nv,u.(31)
T I E = Y M i , u , M i , v , u , N v , u − Y M i ∗ , u , M i ∗ , v ∗ , u , N v , u . (32) TIE=Y_{M_{i, u}, M_{i, v, u}, N_{v, u}} - Y_{M_{i^*, u}, M_{i^*, v^*, u}, N_{v, u}}.\tag{32} TIE=YMi,u,Mi,v,u,Nv,uYMi,u,Mi,v,u,Nv,u.(32)
y ^ i , v , u = M i , u ⋅ M i , v , u ⋅ N v , u − λ 2 ⋅ M i ∗ , u ⋅ M i ∗ , v ∗ , u ⋅ N v , u . (33) \hat{y}_{i, v, u}=M_{i, u} \cdot M_{i, v, u} \cdot N_{v, u}-\lambda_2 \cdot M_{i^*, u} \cdot M_{i^*, v^*, u} \cdot N_{v, u}.\tag{33} y^i,v,u=Mi,uMi,v,uNv,uλ2Mi,uMi,v,uNv,u.(33)

这里作者采用了一个比较取巧的做法,即引入了衰减因子 λ 2 \lambda_{2} λ2,使得对于因果效应的去处处于可控范围之内,这对于模型调参应该是相对更友好的。

P.S. 原文这里应该有个公式写错了,对应原文公式(26),应改为本文中公式 (31),即 N v ∗ , u N_{v^{*}, u} Nv,u 改为 N v , u N_{v, u} Nv,u。毕竟 N N N 是没有进行干预的。

Experiments

这里贴一个Overall Experiment Comparison结果,其余内容不再赘述。

图5. Overall Experiment Comparison

总结

本文提出了一个针对多模态推荐(视觉推荐)方向的因果推断模型CausalRec,论文本身写作非常工整,对于主流方法的讨论也是非常充分且必要的,对于初入因果推断的友友们值得大力推荐!!!

  • 13
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值