【论文笔记】ZOO: Zeroth Order Optimization

论文(标题写不下了):
《ZOO: Zeroth Order Optimization Based Black-box Attacks to Deep Neural Networks without Training Substitute Models》

Abstract

深度神经网络(DNN)是当今时代最突出的技术之一,在许多机器学习任务中实现了最先进的性能,包括但不限于图像分类、文本挖掘、语音处理。
但人们越来越关注对抗性示例的鲁棒性,特别是对于自动驾驶的交通标志识别等关键任务。研究揭示了训练有素的DNN的脆弱性,展示了生成几乎无法察觉的对抗性图像的能力,导致错误分类。
研究表明,通过简单的训练和攻击基于目标模型构建的替代模型(DNN的黑盒攻击),这些对抗性图像具有高度可转移性。

与训练替代模型的设置类似,本文提出了一种有效的黑盒攻击,只能访问目标DNN的输入(图像)和输出(置信度分数),提出基于零阶优化(ZOO, Zeroth Order Optimization)的攻击直接估计目标DNN的梯度以生成对抗性示例。本文使用零阶随机坐标下降以及降维、分层攻击和重要性采样技术来有效地进行黑盒攻击。通过利用零阶优化,可以完成对目标DNN的改进攻击,从而无需训练替代模型并避免攻击可转移性的损失。

在MNIST、CIFAR10、ImageNet上的实验结果表明,所提出的ZOO攻击与最先进的白盒攻击一样有效,并且通过替代模型显著优于现有的黑盒攻击。

1 Introduction

DNN在AI领域中很强大,但很容易受到对抗性示例的影响。
关于DNN鲁棒性的初步研究集中在白盒:允许完全控制和访问目标DNN进行敏感性分析。通过授予执行反向传播的能力,该技术能够相对于目标DNN的输入进行输出的梯度计算。许多算法(如梯度下降)可以用来攻击DNN。
图像分类中,反向传播指定改变像素值对图像标签预测的置信度分数的影响。但白盒在现实世界中并不常用,很多模型并不公开。

本文考虑了黑盒攻击设置,人们可以访问DNN的输入和输出,但不能访问内部配置。我们特别关注这样的用例:目标是由CNN训练的图像分类器,它将图像作为输入并为每个类别生成置信度得分作为输出。由于应用程序的流行和安全隐患,基于CNN的图像分类是目前研究DNN鲁棒性的主要焦点和关键用例。

本文考虑了两种黑盒攻击(无针对性攻击、有针对性攻击)。攻击有效性如图1所示。

![[Pasted image 20231125130513.png]]
图1:对ImageNet采样图像进行黑盒攻击(ZOO)的直观图示,从左到右的列是具有正确标签的原始图像、攻击的附加噪声、具有错误分类标签的精心制作的对抗性图像。

本文提出的攻击成功误导了目标DNN,还欺骗了人类的感知。
在攻击者的立足点中,对抗性示例应尽可能与原始示例无法区分,以便欺骗目标DNN(有时也欺骗人类感知)。
然而,评估良性示例和相应的对抗性示例之间的相似性的最佳指标仍然是一个悬而未决的问题,并且在不同的上下文中可能会有不同。

1.1 Adversarial attacks and transferability

本文总结了为攻击DNN训练的图像分类儿开发的四种白盒攻击:FGSM、JSMA、DeepFool、C&W。还简单介绍了可转移性。

1.2 Black-box attacks and substitute models

相比白盒攻击,黑盒攻击更具有挑战性。
黑盒攻击只能获得良性图像与其类别标签,对目标DNN是完全未知的,攻击者在对抗攻击过程中完全无法查询任何目标分类器的信息。
在这种黑盒设置下,研究重点主要是从一个自训练的DNN到有针对性但是完全禁止访问的DNN的攻击的可转移性。

另外,一些情景中,攻击者可以访问DNN,获取一些有用的信息,如电脑的应用,允许攻击者放入任何图像并查询分类器的分类结果。攻击者可以根据这些信息构建更有效的攻击方法。此时,反向传播的梯度计算还是禁止的。这种黑盒攻击称为实用黑盒攻击(practical black-box attack)。

1.3 Defending adversarial attacks

安全相关研究发展的一个普遍现象是:攻防往往是齐头并进的,一方的进步取决于另一方的进步。同样,在DNN的稳健性的背景下,更有效的对抗性攻击通常是由改进的防御驱动的,反之亦然。
本节介绍了基于检测的防御、渐变和表示掩蔽(Gradient and representation masking)、对抗训练。

1.4 Black-box attack using zeroth order optimization: benefits and challenges

零阶方法是无导数优化的方法,优化过程中只需要zeroth order oracle(零阶预言,任意 x x x处的目标函数值 f ( x ) f(x) f(x))。 h h h较小的情况下,通过评估两个非常接近的点处的目标函数值 f ( x + h v ) , f ( x − h v ) f(x+hv),f(x-hv) f(x+hv),f(xhv),可以估计沿方向向量 v v v的适当梯度。然后可以使用估计的梯度应用梯度下降或坐标下降等经典优化算法。
这些零阶方法的收敛性已经得到证明,并且在mild assumptions(温和的假设,可以理解为相对一般的条件)下,它们可以收敛到具有与梯度估计和相关的额外误差项的驻点,当 h → 0 h\rightarrow 0 h0时消失。

第3节中提出的对DNN 的黑盒攻击被视为优化问题。它利用零阶优化技术,因此无需训练替代模型来部署对抗性攻击,尽管使用零阶方法来攻击黑盒DNN模型很直观,但天真地应用它对于大型模型来说可能是不切实际的。(每次迭代对向量的每一维都要进行评估,迭代多次时间代价太大)

在攻击黑盒DNN的场景中,特别是当图像尺寸很大时(要优化的变量有大量坐标),单步梯度下降可能非常慢且效率低下。
可以通过在几次梯度评估后有效地更新坐标来加速攻击过程。这使我们能够通过使用精心设计的采样策略首先优化重要像素来进一步提高算法的效率。(具体见第3节)

1.5 Contributions

提出了使用ZOO进行黑盒攻击的方法。

  • 证明了只使用零阶预言(没有梯度信息)的基于坐标下降的方法可以有效攻击黑盒DNN。与基于替代模型的黑盒攻击相比,我们的方法显著提高了对抗攻击成功率,并获得了与最先进的白盒攻击相当的性能。
  • 为了加快计算时间,减少对大规模DNN的黑盒攻击的查询数量,我们提出了多种技术,包括攻击空间降维,分层攻击和重要性采样。
  • 演示了黑盒攻击对于大型DNN的适用性,能在合理时间内制作出成功的对抗性图像,而基于替代模型的黑盒攻击仅在MNIST上训练的小型网络中取得了成功,很难扩展到ImageNet的情况。

3 ZOO: A Black-Box Attack Without Training Substitude Models

3.1 Notation for deep neural networks

考虑黑盒攻击设置,允许来自目标DNN的自由查询,同时禁止访问内部状态(例如反向传播),因此使用符号 F ( x ) F(x) F(x)足以表示目标DNN。
具体来说,DNN F ( x ) F(x) F(x)将图像 x ∈ R p x∈\mathbb{R}^p xRp(一个 p p p维列向量)作为输入,并输出每个类别的置信度分数向量 F ( x ) ∈ [ 0 , 1 ] K F(x)∈[0,1]^K F(x)[0,1]K,其中 K K K是类别数量。第 k k k个类别 [ F ( x ) ] k ∈ [ 0 , 1 ] [F(x)]_k∈[0,1] [F(x)]k[0,1]指定将 x x x分类为第 k k k类的概率,且 ∑ k = 1 K [ F ( x ) ] k = 1 \sum_{k=1}^K [F(x)]_k=1 k=1K[F(x)]k=1

原则上,我们提出的通过零阶优化(ZOO)的黑盒攻击可以应用于允许相同输入和输出关系的非DNN分类器。然而,由于DNN在许多图像任务中实现了最先进的分类精度,因此在本文中,重点关注对DNN黑盒对抗攻击的能力。

3.2 Formulation of C&W attack

本文的黑盒攻击受到C&W攻击的启发,C&W是最强白盒对抗攻击之一。给定图像 x 0 x_0 x0 x 0 x_0 x0 x x x的对抗性示例。C&W攻击通过解决以下优化问题来找到对抗性示例 x x x(Eq.1):
minimize x ∣ ∣ x − x 0 ∣ ∣ 2 2 + c ⋅ f ( x , t ) , subject to  x ∈ [ 0 , 1 ] p (1) \begin{aligned} & \text{minimize}_x ||x-x_0||_2^2+c\cdot f(x,t), \\& \text{subject} \ \text{to} \ x∈[0,1]^p\tag{1} \end{aligned} minimizex∣∣xx022+cf(x,t),subject to x[0,1]p(1)
其中 ∣ ∣ v ∣ ∣ 2 = ∑ i = 1 p v i 2 ||v||_2=\sqrt{\sum_{i=1}^p v_i^2} ∣∣v2=i=1pvi2 表示向量 v = [ v 1 , v 2 , ⋯   , v p ] T v=[v_1,v_2,\cdots,v_p]^T v=[v1,v2,,vp]T L 2 L_2 L2范式, c > 0 c>0 c>0表示正则化参数。
Eq.1中 ∣ ∣ x − x 0 ∣ ∣ 2 2 ||x-x_0||_2^2 ∣∣xx022是正则化,用于强制对抗性示例 x x x和图像 x 0 x_0 x0在欧几里得距离的相似性; c ⋅ f ( x , t ) c\cdot f(x,t) cf(x,t)是反映不成功的对抗性攻击程度的损失函数, t t t是目标类别。C&W比较了 f ( x , t ) f(x,t) f(x,t)的几个候选者,并提出了以下形式进行有效的定向攻击(Eq.2):
f ( x , t ) = max ⁡ { max ⁡ i ≠ t [ Z ( x ) ] i − [ Z ( x ) ] t , − κ } (2) f(x,t)=\max \{\max_{i\ne t} [Z(x)]_i-[Z(x)]_t,-\kappa\}\tag{2} f(x,t)=max{i=tmax[Z(x)]i[Z(x)]t,κ}(2)
其中 Z ( x ) ∈ R K Z(x)∈\mathbb{R}^K Z(x)RK是DNN中 x x x的logit表示,其中 [ Z ( x ) ] k [Z(x)]_k [Z(x)]k表示 x ∈ k x∈k xk的概率, κ > 0 \kappa>0 κ>0是攻击可转移性的调整参数。
C&W设置 κ = 0 \kappa=0 κ=0来攻击目标DNN,并建议在执行转移攻击时使用较大的 κ \kappa κ。Eq.2中使用损失函数的基本原理可以通过基于logit层表示的softmax分类规则来解释;DNN F ( x ) F(x) F(x)的输出(置信度得分)由softmax函数确定(Eq.3):
[ F ( x ) ] k = exp ⁡ ( [ Z ( x ) ] k ) ∑ i = 1 k exp ⁡ ( [ Z ( x ) ] i ) , ∀ k ∈ { 1 , ⋯   , K } (3) [F(x)]_k=\frac{\exp([Z(x)]_k)}{\sum_{i=1}^k \exp([Z(x)]_i)}, \forall k∈\{1,\cdots,K\}\tag{3} [F(x)]k=i=1kexp([Z(x)]i)exp([Z(x)]k),k{1,,K}(3)
因此,根据Eq.3中的softmax决策规则, max ⁡ i ≠ t [ Z ( x ) ] i − [ Z ( x ) ] t ≤ 0 \max_{i\ne t} [Z(x)]_i-[Z(x)]_t\leq 0 maxi=t[Z(x)]i[Z(x)]t0意味着对抗性示例 x x x获得了类别 t t t的最高置信度分数,因此针对性攻击成功,否则不成功。 κ \kappa κ确保了 [ Z ( x ) ] t [Z(x)]_t [Z(x)]t max ⁡ i ≠ t [ Z ( x ) ] i \max_{i\ne t} [Z(x)]_i maxi=t[Z(x)]i之间的恒定差距,这解释了为什么设置大的 κ \kappa κ在转移攻击中是有效的。

最后,框约束 x ∈ [ 0 , 1 ] p x∈[0,1]^p x[0,1]p代表对抗性示例必须从有效的图像空间生成。实际上,每个图像都可以通过将每个像素值除以最大可获得像素值(如255)来满足此框架约束。C&W采用 1 + tanh ⁡ w 2 \frac{1+\tanh w}{2} 21+tanhw代替 x x x来消除框约束,其中 w ∈ R p w∈\mathbb{R}^p wRp。通过使用这种变量变化,Eq.1中的优化问题变成了以 w w w作为优化器的无约束最小化问题,并且可以应用DNN的典型优化工具(反向传播)来求解最优 w w w并获得对应的对抗性例子 x x x

3.3 Proposed black-box attack via zeroth order stochastic coordinate descent

Eq.1-2的攻击公式是以白盒为基础的,因为logit层是DNN内部的状态信息,求解Eq.1也需要DNN的反向传播。我们通过提出以下方法来修改对黑盒设置的攻击:

  1. 修改Eq.1中的损失函数 f ( x , t ) f(x,t) f(x,t),使其仅取决于DNN的输出 F F F和所需的类别标签 t t t
  2. 使用有限差分法(finite difference method)而不是目标DNN上的实际反向传播来计算近似梯度,并通过零阶优化来解决优化问题。

3.3.1 Loss function f(x, t) based on F

受到Eq.2的启发,提出了基于DNN输出F的新的铰链式的损失函数,定义为Eq.4:
f ( x , t ) = max ⁡ { max ⁡ i ≠ t log ⁡ [ F ( x ) ] i − log ⁡ [ F ( x ) ] t , − κ } (4) f(x,t)=\max\{\max_{i\ne t} \log[F(x)]_i-\log [F(x)]_t,-\kappa\}\tag{4} f(x,t)=max{i=tmaxlog[F(x)]ilog[F(x)]t,κ}(4)
其中 κ ≥ 0 \kappa\geq 0 κ0 log ⁡ 0 \log 0 log0定义为 − ∞ -\infty log ⁡ ( ⋅ ) \log(\cdot) log()是一个单调函数, max ⁡ i ≠ t log ⁡ [ F ( x ) ] i − log ⁡ [ F ( x ) ] t ≤ 0 \max_{i\ne t} \log[F(x)]_i-\log [F(x)]_t \leq 0 maxi=tlog[F(x)]ilog[F(x)]t0意味着 x x x获得类别 t t t的最高置信度分数。
对数算子对于黑盒攻击至关重要,因为训练好的DNN通常会在其输出 F ( x ) F(x) F(x)上产生倾斜的概率分布,使得一个类的置信度分数显著主导另一类的置信度分数。使用对数运算符可以减少显性效应,同时由于单调性而保留置信度分数的顺序。
和Eq.2相似,Eq.4中 κ \kappa κ确保了 log ⁡ [ F ( x ) ] t \log[F(x)]_t log[F(x)]t max ⁡ i ≠ t log ⁡ [ F ( x ) ] i \max_{i\ne t} \log[F(x)]_i maxi=tlog[F(x)]i之间的恒定差距。

对于无目标攻击,当 x x x被分类为除原始类标签 t 0 t_0 t0之外的任何类时,对抗性攻击就会成功,可以使用类似的损失函数Eq.5:
f ( x ) = max ⁡ { log ⁡ [ F ( x ) ] t 0 − max ⁡ i ≠ t 0 log ⁡ [ F ( x ) ] i , − κ } (5) f(x)=\max\{\log[F(x)]_{t_0}-\max_{i\ne t_0}\log[F(x)]_i,-\kappa\}\tag{5} f(x)=max{log[F(x)]t0i=t0maxlog[F(x)]i,κ}(5)
其中 t 0 t_0 t0 x x x的原始类别, max ⁡ i ≠ t 0 log ⁡ [ F ( x ) ] i \max_{i\ne t_0} \log[F(x)]_i maxi=t0log[F(x)]i代表除了 t 0 t_0 t0以外最可能的预测类别。

3.3.2 ZOO on the loss function

讨论用于攻击的任何通用函数 f f f的优化技术(Eq.1中的正则化项可以作为 f f f的一部分)。使用对称差商(symmetric difference quotient)估计梯度Eq.6:
g ^ i : = ∂ f ( x ) ∂ x i ≈ f ( x + h e i ) − f ( x − h e i ) 2 h (6) \hat{g}_i := \frac{\partial f(x)}{\partial x_i}\approx \frac{f(x+he_i)-f(x-he_i)}{2h}\tag{6} g^i:=xif(x)2hf(x+hei)f(xhei)(6)
其中 h h h是一个很小的常数,实验中均设置为 h = 0.0001 h=0.0001 h=0.0001 e i e_i ei为只有第 i i i个元素是1,其他均为0的单位向量。估计误差是 O ( h 2 ) O(h^2) O(h2)量级的(?),成功进行对抗攻击并不必须要准确估计梯度。实验表明,就算没有准确估计,ZOO依旧有很好的攻击效果。

对于任何 x ∈ R p x\in \mathbb{R}^p xRp,我们需要评估目标函数 2 p 2p 2p次来估计全部 p p p个坐标轴。有趣的是,只对目标函数做一次变换,就可以得到与坐标有关的Hessian估计(定义为 h ^ i \hat{h}_i h^i):
h ^ i : = ∂ 2 f ( x ) ∂ x i i 2 ≈ f ( x + h e i ) − 2 f ( x ) + f ( x − h e i ) h 2 (7) \hat{h}_i:=\frac{\partial^2f(x)}{\partial x_{ii}^2}\approx \frac{f(x+he_i)-2f(x)+f(x-he_i)}{h^2}\tag{7} h^i:=xii22f(x)h2f(x+hei)2f(x)+f(xhei)(7)
由于 f ( x ) f(x) f(x)只需要对各个坐标进行一次评估,因此无需其他的评估函数即可获得Hessian估计。

由于黑盒设置,网络结构不明,梯度反向传播被禁止,一个初步的想法是用Eq.6来估计梯度,这需要 2 p 2p 2p次函数估计。但是这个方法实现起来代价很大。

3.3.3 Stochastic coordinate descent

坐标下降方法(Coordinate descent methods)被广泛使用在优化研究中。
每次迭代中,随机选择一个坐标,沿着这个坐标通过近似最小化目标函数 f ( x + δ e i ) f(x+\delta e_i) f(x+δei)更新 δ \delta δ
![[Pasted image 20240110221608.png]]

最难的一步就是Algorithm 1中的第3步,计算最优坐标更新。
估计完 x i x_i xi的梯度和Hessian后,可以使用一阶或二阶方法近似求解最优的 δ \delta δ

一阶的方法中,ADAM明显更优,所以本文使用零阶坐标ADAM:
![[Pasted image 20240110223102.png]]

注:每次迭代更新只更新一个坐标。
实践中为了达到GPU的最高效率,通常会逐批量评估目标,估计一个批量的 g ^ i \hat{g}_i g^i h ^ i \hat{h}_i h^i。一个批量估计128个像素的 g ^ i \hat{g}_i g^i h ^ i \hat{h}_i h^i,然后一次迭代更新128个坐标。

3.4 Attack-space dimension reduction

定义 Δ x = x − x 0 \Delta x=x-x_0 Δx=xx0 Δ x ∈ R p \Delta x\in\mathbb{R}^p ΔxRp是加在 x 0 x_0 x0上的噪声。起初 Δ x = 0 \Delta x=0 Δx=0,由于网络输入的 p p p很大,使用零阶方法会比较慢,因为估计时要计算大量的梯度。
这里介绍一种减少维度的转换 D ( y ) D(y) D(y)来代替直接优化 Δ x ∈ R p \Delta x\in\mathbb{R}^p ΔxRp的做法,其中 y ∈ R m y\in \mathbb{R}^m yRm range ( D ) ∈ R p \text{range}(D)\in\mathbb{R}^p range(D)Rp m < p m<p m<p。这种转换可以是线性的,可以是非线性的。然后可以用 D ( y ) D(y) D(y)来代替Eq.1中的 Δ x = x − x 0 \Delta x=x-x_0 Δx=xx0
minimize y ∣ ∣ D ( y ) ∣ ∣ 2 2 + c ⋅ f ( x 0 + D ( y ) , t ) , subject to  x ∈ [ 0 , 1 ] p (8) \begin{aligned} & \text{minimize}_y ||D(y)||_2^2+c\cdot f(x_0+D(y),t), \\& \text{subject} \ \text{to} \ x∈[0,1]^p\tag{8} \end{aligned} minimizey∣∣D(y)22+cf(x0+D(y),t),subject to x[0,1]p(8)
D ( y ) D(y) D(y)的使用有效地将攻击空间从 p p p降到了 m m m,并不修改输入图像的维度,只是减少对抗性噪声的允许维度。
一种简单的变换是将 D ( y ) D(y) D(y)变换为放大操作,将 y y y调整为大小为 p p p的图像,如双线性插值法。
在Inception-v3网络中, y y y可以是 m = 32 × 32 × 3 m=32\times 32\times 3 m=32×32×3维度的小噪声图像,原图是 p = 299 × 299 × 3 p=299\times 299\times 3 p=299×299×3的原石图像。

3.5 Hierarchical attack

压缩搜索空间可以提升计算效率,但由于空间的缩小会导致找不到一个较优的结果。如果使用一个较大的 m m m,可以搜到较好的结果,但会花费很长的时间。
因此对于大图像和困难的攻击,本文提出了分层攻击(hierarchical attack),使用一系列转换 D 1 , D 2 , ⋯ D_1,D_2,\cdots D1,D2,转换 m 1 , m 2 , ⋯ m_1,m_2,\cdots m1,m2,,在优化过程中逐步增加 m m m。换句话说,在特定的迭代 j j j中,设置 y j = D i − 1 ( D i − 1 ( y j − 1 ) ) y_j=D_i^{-1}(D_{i-1}(y_{j-1})) yj=Di1(Di1(yj1)),将 y y y的维度从 m i − 1 m_{i-1} mi1增加到 m i m_i mi D − 1 D^{-1} D1 D D D的逆操作)。
举例说明:使用 D 1 D_1 D1放大将维度 m 1 m_1 m1 32 × 32 × 3 32\times 32\times 3 32×32×3变为 299 × 299 × 3 299\times 299\times 3 299×299×3 D 2 D_2 D2放大将维度 m 2 m_2 m2将维度 64 × 64 × 3 64\times 64\times 3 64×64×3变为 299 × 299 × 3 299\times 299\times 3 299×299×3
我们从 m 1 = 32 × 32 × 3 m_1=32\times 32\times 3 m1=32×32×3开始优化,使用 D 1 D_1 D1作为变换,然后经过一定数量的迭代后(损失函数下降趋势很小后),将 y y y 32 × 32 × 3 32\times 32\times 3 32×32×3放大到 64 × 64 × 3 64\times 64\times 3 64×64×3,然后在接下来的几轮迭代中使用 D 2 D_2 D2

![[Pasted image 20240111115525.png]]

图3:
第一行:RGB通道中,被攻击图像在关键的地方中有明显的变化,其中R通道的变化显著大于其他通道。此处攻击空间为 32 × 32 × 3 32\times 32\times 3 32×32×3,即使这个空间的攻击会失败,其噪声也会提供关于像素重要性的关键线索。在提升至更大维度的攻击空间后,使用原来小的攻击空间中的噪声去采样重要的像素。
第二行: 64 × 64 × 3 64\times 64\times 3 64×64×3攻击空间中的重要性可能分布采样。这个重要性是通过像素值变化的绝对值计算的,对每个通道进行 4 × 4 4\times 4 4×4的最大值池化,上采样到 64 × 64 × 3 64\times 64\times 3 64×64×3的维度,然后对所有值进行标准化。

3.6 Optimize the important pixels first

使用坐标下降方法的好处是我们可以主动选择更新的坐标。
在黑盒设置下估计每个像素的梯度和Hessian计算代价很大,于是提出可以有选择性地更新重要的像素(通过重要性采样选择)。
举例来说,对于一次成功的攻击,图像边界的像素通常没什么用,中心的像素通常至关重要。所以在攻击中,对靠近对抗噪声指示的更多像素进行采样。
本文提出将图像划分为 8 × 8 8\times 8 8×8的区域,根据区域内像素的变化绝对值分配采样概率。首先对每个区域的绝对值变化进行最大值池化,上采样成期望的维度,然后将所有的值标准化,使其和加起来为1。每几次迭代,根据近几次发生的变化重新更新采样频率。

当攻击空间较小时(如 32 × 32 × 3 32\times 32\times 3 32×32×3),不会为了提高搜索效率而进行重要性采样。随着维度的不断提升,重要性采样会变得越来越重要。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值