Foundations of Machine Learning 2nd——第四章Model Selection(二)

交叉验证 Cross Validation(CV)

上节内容请看这里~

交叉验证是另一种用来确定映射集的方法(更具体的可以理解成确定模型超参的方法),在本节我们会介绍交叉验证的具体内容,他的有效性,以及交叉验证和SRM(上一节提到的)两种方法的对比。

交叉验证的步骤

和上一节的一样, ( H k ) k ≥ 1 (H_k)_{k\geq1} (Hk)k1是一个可数的映射集序列,他们的复杂度是逐渐上升的。设 S S S是一个独立同分布的大小为 m m m的有标签数据集。首先将 S S S分成大小为 ( 1 − α ) m (1-\alpha)m (1α)m S 1 S_1 S1 α m \alpha m αm S 2 S_2 S2两个子集,这里的 α \alpha α是一个非常小的数,因此 S 1 S_1 S1的基数是比 S 2 S_2 S2大的多的。然后 S 1 S_1 S1作为训练集, S 2 S_2 S2作为验证集。对于 k ∈ N k\in\Bbb{N} kN h S 1 , k E R M h_{S_1,k}^{ERM} hS1,kERM表示使用映射集 H k H_k Hk(我们可以理解为固定超参的,含有很多待学习参数的模型)在 S 1 S_1 S1上学习到的映射, h S C V h_S^{CV} hSCV表示交叉验证返回的映射,它其实是:在验证集 S 2 S_2 S2上表现最好的 h S 1 , k E R M h_{S_1,k}^{ERM} hS1,kERM:
h s C V = arg min ⁡ h ∈ { h S 1 , k E R M : k ≥ 1 } R ^ S 2 ( h ) h_s^{CV}=\argmin_{h\in\{h_{S_1,k}^{ERM}:k\geq1\}}\hat{R}_{S_2}(h) hsCV=h{hS1,kERM:k1}argminR^S2(h)
通常在实践中,我们就是根据验证集的性能来调整模型的超参,来找到最优(通常是局部最优)的超参值。

交叉验证有效性的保证(guarantee)

定理 4.3

对于任意 α > 0 \alpha>0 α>0,和任意 m ≥ 1 m\geq1 m1,下面的不等式都是成立的:
P [ sup ⁡ k ≥ 1 ∣ R ( h S 1 , k E R M ) − R ^ S 2 ( h S 1 , k E R M ) ∣ > ϵ + log ⁡ k α m ] ≤ 4 e − 2 α m ϵ 2 \Bbb{P}[\sup_{k\geq1}|R(h_{S_1,k}^{ERM})-\hat{R}_{S_2}(h_{S_1,k}^{ERM})|>\epsilon+\sqrt{\frac{\log k}{\alpha m}}]\leq4e^{-2\alpha m\epsilon^2} P[k1supR(hS1,kERM)R^S2(hS1,kERM)>ϵ+αmlogk ]4e2αmϵ2

(具体证明略,详细推导请看原著)

也就是说, h S 1 , k S R M h_{S_1,k}^{SRM} hS1,kSRM的generalization error和他在 S 2 S_2 S2上的经验损失距离大概率是很近的,而且 m m m值越大,距离越近的概率就越大,也就是说我们可以用 h S 1 , k S R M h_{S_1,k}^{SRM} hS1,kSRM S 2 S_2 S2上的经验损失来近似他的generalization error,这说明了交叉验证的有效性

定理4.4 CV(Cross-validation) VS SRM

对于任意的 δ > 0 \delta>0 δ>0,至少 1 − δ 1-\delta 1δ的概率下式成立:
R ( h S C V ) − R ( h S 1 S R M ) ≤ 2 log ⁡ max ⁡ ( k ( h S C V ) , k ( h S 1 S R M ) ) α m + 2 log ⁡ 4 δ 2 α m R(h_S^{CV})-R(h_{S_1}^{SRM})\leq2\sqrt{\frac{\log\max(k(h_S^{CV}),k(h_{S_1}^{SRM}))}{\alpha m}}+2\sqrt{\frac{\log\frac{4}{\delta}}{2\alpha m}} R(hSCV)R(hS1SRM)2αmlogmax(k(hSCV),k(hS1SRM)) +22αmlogδ4

这个定理说明对于样本集大小为 m m m的CV的结果映射的generalization error和大小为 ( 1 − α ) m (1-\alpha)m (1α)m S 1 S_1 S1上的SRM结果映射十分接近。且我们前面说过 α \alpha α十分小,因此也可以认为这个定理保证了CV的结果和SRM的结果是十分类似的。不过有时候可能运气比较倒霉,分出来的 ( 1 − α ) m (1-\alpha)m (1α)m个样本用SRM学习到的映射跟在 S S S上学习到的差距很大,这时候这个定理就没用了,所以为了避免这个情况,稍后会将到n折交叉验证(n-fold cross validation),来解决这一个问题。

n折交叉验证

在实际实验中,可能存在训练集/验证集/测试集划分不当(数据分布差距特别大)使得模型效果不好的情况,尤其是在我们能够得到的有标签数据集数量非常少的时候,出现这种问题的概率更高。所以,n折交叉验证就是用来解决这个问题滴。

n折交叉验证的步骤

θ \theta θ表示算法的超参们。 对于一组固定的 θ \theta θ,首先我们先随机将大小为 m m m的样本集 S S S分成 n n n个子集,第 i i i个子集表示为 ( ( x i 1 , y i , 1 ) , . . . , , , ( x i m i , y i m i ) ) ((x_{i1},y_{i,1}),...,,,(x_{im_i},y_{im_i})) ((xi1,yi,1),...,,,(ximi,yimi)) m i m_i mi表示第 i i i个子集的大小。对任意的 i ∈ [ n ] i\in[n] i[n],算法会在除了第 i i i个子集的所有其他子集构成的集合上训练学习,将学习出来的映射 h i h_i hi在第 i i i个子集上验证。下图比较形象的表示了n折交叉验证的过程:
在这里插入图片描述超参 θ \theta θ的性能是根据 h i h_i hi们的平均损失来衡量的,称为“交叉验证损失”,用 R ^ C V ( θ ) \hat{R}_{CV}(\theta) R^CV(θ)
R ^ C V ( θ ) = 1 n ∑ i = 1 n 1 m i ∑ j = 1 m i L ( h i ( x i j ) , y i j ) \hat{R}_{CV}(\theta) = \frac{1}{n}\sum_{i=1}^{n}\frac{1}{m_i}\sum_{j=1}^{m_i}L(h_i(x_{ij}),y_{ij}) R^CV(θ)=n1i=1nmi1j=1miL(hi(xij),yij)

通常我们会平均分配 n n n个子集,也就是每个子集的大小都是 ( 1 − 1 / n ) m (1-1/n)m (11/n)m,那么这个n怎么选择?又是一个要trade-off的问题。

当n过大的时候,说明每个验证集的size都比较小,也就是训练集和原始 S S S更相似,这时候交叉验证损失的偏差(bias)就会比较小(毕竟训练集更多),但是因为每个验证集的数量就很小,因此验证集之间的分布差距可能很大,所以交叉验证的方差(variance)会比较大。
n n n比较小的时候,分出来的训练集的size比 m m m小太多了,所以导致bias比较大,variance比较小。

通常 n n n经常是5或者10。在模型选择应用交叉验证的完整步骤是,对于所有的有标签数据,先将其分成训练集和测试集,然后在大小为 m m m的训练集上做n折交叉验证:先固定一组超参 θ 0 \theta_0 θ0,计算 R ^ C V ( θ 0 ) \hat{R}_{CV}(\theta_0) R^CV(θ0),下次更新 θ 1 \theta_1 θ1再次计算 R ^ C V ( θ 1 ) \hat{R}_{CV}(\theta_1) R^CV(θ1),找到最小的 R ^ C V \hat{R}_{CV} R^CV对应的 θ \theta θ作为固定的超参,然后在整体训练集上训练。测试集是用来验证学习到的模型的性能的。

留一交叉验证leave-one-out cross-validation

n = m n=m n=m时,称为留一交叉验证,因为这时的验证集大小为1,第五章会说到,留一损失是一个算法的平均损失的无偏估计,可以用来导出对一些算法的简单的guarantee。不过通常计算留一损失十分costly,因为要做m次训练。

n折交叉验证用来评估模型性能

除了用来模型选择,n折交叉验证也可以用来评估模型性能。这时,我们已经确定了超参 θ \theta θ的选择,需要做的是模型性能的评估,如果只划分出训练集和测试集,还是有可能出现数据集划分不合理导致结果评估不可靠的情况。n折交叉验证能够比较好的解决这个问题,步骤大概如下:

所有有标签数据被随机分成 n n n折,也是做n次训练,不过剩下的子集是作为测试集存在的,这样可以得到所有样本上的n折交叉验证损失(或是其他评价指标的均值),以此评估模型性能。同时我们也可以得到损失的标准差,当标准差过大的时候说明我们模型在这个数据集上无法表现出稳定的性能,可能数据集不合适或者数量有待扩充。

基于正则化的算法

由SRM算法启发,基于正则化的算法也逐渐发展起来。他通常用来解决对于一个非常复杂的映射集 H H H,且这个映射集是无数个嵌套映射集 H γ H_{\gamma} Hγ的联合: ∪ γ > 0 H γ \cup_{\gamma>0}H_\gamma γ>0Hγ。比如, H H H可能是一个高维空间的所有线性映射的集合, H γ = { x → w ⋅ Φ ( x ) : ∣ ∣ w ∣ ∣ < γ } H_\gamma=\{x\rightarrow w\cdot\Phi(x):||w||<\gamma\} Hγ={xwΦ(x):w<γ} Φ ( x ) \Phi(x) Φ(x)是将x映射到高维空间的函数。

对于有标签数据集 S S S,当处理的是无数个嵌套映射集的集合 H H H的时候,SRM的优化问题可以扩展如下:
arg min ⁡ γ > 0 , h ∈ H γ R ^ S ( h ) + R m ( H γ ) + log ⁡ γ m \argmin_{\gamma>0,h\in H_\gamma}\hat{R}_S(h)+R_m(H_\gamma)+\sqrt{\frac{\log\gamma}{m}} γ>0,hHγargminR^S(h)+Rm(Hγ)+mlogγ
后面的惩罚项也可以用其他的关于 γ , m \gamma,m γ,m的函数 p e n ( γ , m ) pen(\gamma,m) pen(γ,m)替代。其实,通常存在一个映射 R : H → R R:H\rightarrow\R R:HR,使得对于任意 γ > 0 \gamma>0 γ>0,被约束的优化 arg min ⁡ γ > 0 , h ∈ H γ R ^ S ( h ) + p e n ( γ , m ) \argmin\limits_{\gamma>0,h\in H_\gamma}\hat{R}_S(h)+pen(\gamma,m) γ>0,hHγargminR^S(h)+pen(γ,m)可以转换成无约束的优化项:
arg min ⁡ h ∈ H R ^ S ( h ) + γ R ( h ) \argmin_{h\in H}\hat{R}_S(h)+\gamma R(h) hHargminR^S(h)+γR(h)
这个 R ( h ) R(h) R(h)就是我们常说的正则化项, γ > 0 \gamma>0 γ>0是一个超参数,通常称为正则化参数,可以用交叉验证来学习。大部分情况, R ( h ) R(h) R(h)是一个正比于 ∣ ∣ h ∣ ∣ ||h|| h的公式。

γ \gamma γ越大,对于复杂映射的惩罚力度就会越大。当 γ \gamma γ很小,接近于0的时候,正则化项不起作用,该算法退化为ERM。

当正则化项是 ∣ ∣ h ∣ ∣ p , p ≥ 1 ||h||_p,p\geq1 hp,p1,这是一个关于 h h h的凸函数。如果损失函数选的是0-1损失( R ^ S = 1 m ∑ i = 1 m 1 f ( x i ) ≠ y i \hat{R}_S=\frac{1}{m}\sum_{i=1}^m\Bbb{1}_{f(x_i)\neq y_i} R^S=m1i=1m1f(xi)=yi),该目标函数的第一项就不是一个凸函数,这就使得问题变的很复杂,所以通常实践中,我们会选择0-1函数的凸上界作为损失函数,这样整个目标函数就是一个凸函数,学习起来比SRM简单多了。

用来替代0-1函数的凸上界损失函数

我们前面提到的解决模型选择的方法:ERM,SRM等都是基于ERM的,我们也说过,ERM的求解是NP-hard,因为0-1函数不是一个凸函数。所以通常我们会选择0-1函数的凸上界函数来作为损失函数,简化优化问题。这一章介绍的是对于这样的替代函数在损失方面的有效性保证。

首先明确一下各种符号:
我们考虑的是实值函数 h : X → R h:\mathcal{X}\rightarrow\R h:XR h h h的符号函数可以作为二分类器 f h : X → { − 1 , + 1 } f_h:\mathcal{X}\rightarrow\{-1,+1\} fh:X{1,+1}
f h ( x ) = { + 1 , i f h ( x ) ≥ 0 − 1 , i f h ( x ) < 0 f_h(x) = \left\{ \begin{aligned} +1, \quad &if\quad h(x)\geq0\\ -1, \quad& if\quad h(x)<0\\ \end{aligned} \right. fh(x)={+1,1,ifh(x)0ifh(x)<0
h h h ( x , y ) ∈ X × + 1 , − 1 (x,y)\in \mathcal{X}\times{+1,-1} (x,y)X×+1,1上的损失是基于 f h f_h fh的二分类损失定义的:
1 f h ( x ) ≠ y = 1 y f h ( x ) < 0 + 1 h ( x ) = 0 ∧ y = − 1 ≤ 1 y f h ( x ) ≤ 0 1_{f_h(x)\neq y}=1_{yf_h(x)<0}+1_{h(x)=0\land y=-1}\leq1_{yf_h(x)\leq0} 1fh(x)=y=1yfh(x)<0+1h(x)=0y=11yfh(x)0
R ( h ) R(h) R(h)表示 h h h的期望损失: R ( h ) = E ( x , y ) ∼ D [ 1 f h ( x ) ≠ y ] R(h)=\Bbb{E}_{(x,y)\sim D}[1_{f_h(x)\neq y}] R(h)=E(x,y)D[1fh(x)=y]
η ( x ) = P [ y = + 1 ∣ x ] \eta(x)=\Bbb{P}[y=+1|x] η(x)=P[y=+1x]
D X D_\mathcal{X} DX表示 X \mathcal{X} X的边缘分布。
对于任意 h h h
R ( h ) = E ( x , y ) ∼ D X [ η ( x ) 1 h ( x ) < 0 + ( 1 − η ( x ) ) 1 h ( x ) > 0 + ( 1 − η ( x ) ) 1 h ( x ) = 0 ] = E ( x , y ) ∼ D X [ η ( x ) 1 h ( x ) < 0 + ( 1 − η ( x ) ) 1 h ( x ) ≥ 0 ] \begin{aligned} R(h) & =\Bbb{E}_{(x,y)\sim D_\mathcal{X}}[\eta(x)1_{h(x)<0}+(1-\eta(x))1_{h(x)>0}+(1-\eta(x))1_{h(x)=0}]\\ & = \Bbb{E}_{(x,y)\sim D_\mathcal{X}}[\eta(x)1_{h(x)<0}+(1-\eta(x))1_{h(x)\geq0}]\\ \end{aligned} R(h)=E(x,y)DX[η(x)1h(x)<0+(1η(x))1h(x)>0+(1η(x))1h(x)=0]=E(x,y)DX[η(x)1h(x)<0+(1η(x))1h(x)0]

由此可以看出,贝叶斯分类器 h ∗ h^* h可以定义为:预测 η ( x ) ≥ 1 2 \eta(x)\geq\frac{1}{2} η(x)21 x x x的标签为 1 1 1的函数:
h ∗ = η ( x ) − 1 2 h^*=\eta(x)-\frac{1}{2} h=η(x)21

R ∗ = R ( h ∗ ) R^*=R(h^*) R=R(h)是贝叶斯分类器 h ∗ h^* h的generalization error

定理 4.5

h h h的excess error可以如下表示:
R ( h ) − R ∗ = 2 E x ∼ D X [ ∣ h ∗ ( x ) ∣ 1 h ( x ) h ∗ ( x ) ≤ 0 ] R(h)-R^*=2\Bbb{E}_{x\sim D_\mathcal{X}}[|h^*(x)|1_{h(x)h^*(x)\leq0}] R(h)R=2ExDX[h(x)1h(x)h(x)0]
证明略

Φ : R → R \Phi:\R\rightarrow\R Φ:RR是一个凸的不减函数,且对于任意 u ∈ R , 1 u ≤ 0 ≤ Φ ( − u ) u\in\R,1_{u\leq0}\leq\Phi(-u) uR,1u0Φ(u) h h h ( x , y ) (x,y) (x,y)上的基于 Φ \Phi Φ的损失函数可以定义为 Φ ( − y h ( x ) ) \Phi(-yh(x)) Φ(yh(x)),它的期望损失:
L Φ ( h ) = E ( x , y ) ∼ D [ Φ ( − y h ( x ) ) ] = E x ∼ D X [ η ( x ) Φ ( − h ( x ) ) + ( 1 − η ( x ) ) Φ ( h ( x ) ) ] \begin{aligned} \mathcal{L}_{\Phi}(h)&=\Bbb{E}_{(x,y)\sim D}[\Phi(-yh(x))]\\ &=\Bbb{E}_{x\sim D_\mathcal{X}}[\eta(x)\Phi(-h(x))+(1-\eta(x))\Phi(h(x))] \end{aligned} LΦ(h)=E(x,y)D[Φ(yh(x))]=ExDX[η(x)Φ(h(x))+(1η(x))Φ(h(x))]

因为对于任意 u ∈ R , 1 u ≤ 0 ≤ Φ ( − u ) u\in\R,1_{u\leq0}\leq\Phi(-u) uR,1u0Φ(u) R ( h ) ≤ L Φ ( h ) R(h)\leq\mathcal{L}_\Phi(h) R(h)LΦ(h)
对于任意 x ∈ X x\in\mathcal{X} xX,设 u → L Φ ( x , u ) u\rightarrow L_\Phi(x,u) uLΦ(x,u)如下:
L Φ ( x , u ) = η ( x ) Φ ( − u ) + ( 1 − η ( x ) ) Φ ( u ) L_{\Phi}(x,u)=\eta(x)\Phi(-u)+(1-\eta(x))\Phi(u) LΦ(x,u)=η(x)Φ(u)+(1η(x))Φ(u)
这样 L Φ ( h ) = E x ∼ D X [ L Φ ( x , h ( x ) ) ] \mathcal{L}_\Phi(h)=\Bbb{E}_{x\sim D_{\mathcal{X}}}[L_\Phi(x,h(x))] LΦ(h)=ExDX[LΦ(x,h(x))]。因为 Φ ( x ) \Phi(x) Φ(x)是凸函数, L Φ ( x , u ) L_\Phi(x,u) LΦ(x,u)是凸函数的线性组合,所以也是凸函数。
h Φ ∗ : X → [ − ∞ , + ∞ ] h^*_{\Phi}:\mathcal{X}\rightarrow[-\infty,+\infty] hΦ:X[,+]为损失函数 L Φ L_\Phi LΦ的贝叶斯解,也就是说,对于任意 x x x, h Φ ∗ ( x ) h_\Phi^*(x) hΦ(x)是下列凸优化问题的解:
h Φ ∗ ( x ) = arg min ⁡ u ∈ [ − ∞ , + ∞ ] L Φ ( x , u ) = arg min ⁡ u ∈ [ − ∞ , + ∞ ] η ( x ) Φ ( − u ) + ( 1 − η ( x ) ) Φ ( u ) \begin{aligned} h^*_\Phi(x)&=\argmin_{u\in[-\infty,+\infty]}L_\Phi(x,u)\\ &=\argmin_{u\in[-\infty,+\infty]}\eta(x)\Phi(-u)+(1-\eta(x))\Phi(u) \end{aligned} hΦ(x)=u[,+]argminLΦ(x,u)=u[,+]argminη(x)Φ(u)+(1η(x))Φ(u)

h Φ ∗ ( x ) h^*_\Phi(x) hΦ(x)的损失 L Φ ∗ = E ( x , y ) ∼ D [ Φ ( − y h Φ ∗ ( x ) ) ] \mathcal{L}_\Phi^*=\Bbb{E}_{(x,y)\sim D}[\Phi(-yh^*_\Phi(x))] LΦ=E(x,y)D[Φ(yhΦ(x))]

定理4.6

Φ \Phi Φ表示一个凸的非减函数,并且在0出可导,导数 Φ ′ ( 0 ) > 0 \Phi'(0)>0 Φ(0)>0。那么,当且仅当 h ∗ ( x ) > 0 h^*(x)>0 h(x)>0 h Φ ∗ ( x ) > 0 h^*_\Phi(x)>0 hΦ(x)>0,当且仅当 h ∗ ( x ) = 0 h^*(x)=0 h(x)=0 h Φ ∗ ( x ) = 0 h^*_\Phi(x)=0 hΦ(x)=0。也就是说, L Φ ∗ = R ∗ \mathcal{L}^*_\Phi=R^* LΦ=R

说明 L Φ \mathcal{L}_\Phi LΦ R R R的优化目标(贝叶斯解)是一致的。

证明略

定理4.7

Φ \Phi Φ是一个凸的,且非减函数,假设存在 s ≥ 1 s\geq1 s1 c > 0 c>0 c>0使得下式对于所有的 x ∈ X x\in\mathcal{X} xX成立:
∣ h ∗ ( x ) ∣ s = ∣ η ( x ) − 1 2 ∣ s ≤ c s [ L Φ ( x , 0 ) − L Φ ( x , h Φ ∗ ( x ) ) ] |h^*(x)|^s=|\eta(x)-\frac{1}{2}|^s\leq c^s[L_{\Phi}(x,0)-L_\Phi(x,h^*_\Phi(x))] h(x)s=η(x)21scs[LΦ(x,0)LΦ(x,hΦ(x))]
那么,对于任意映射 h h h,excess error都可以被下式限制(bounded):
R ( h ) − R ∗ ≤ 2 c [ L Φ ( h ) − L Φ ∗ ] 1 s R(h)-R^*\leq2c[\mathcal{L}_\Phi(h)-\mathcal{L}_\Phi^*]^{\frac{1}{s}} R(h)R2c[LΦ(h)LΦ]s1

该定理说明优化 h h h的关于 Φ \Phi Φ的excess error等价于优化 h h h,说明了用凸上界函数代替0-1函数的有效性

能够满足定理4.7的前提假设的常用凸函数有以下几个:

  • 铰链损失(Hinge loss): Φ ( u ) = max ⁡ ( 0 , 1 + u ) , s = 1 , c = 1 / 2 \Phi(u)=\max(0,1+u), s=1,c=1/2 Φ(u)=max(0,1+u),s=1,c=1/2
  • 指数损失(exponential loss): Φ ( u ) = exp ⁡ ( u ) , s = 2 , c = 1 2 \Phi(u)=\exp(u),s=2,c=\frac{1}{\sqrt{2}} Φ(u)=exp(u),s=2,c=2 1
  • 逻辑斯蒂损失(Logistic loss): Φ ( u ) = log ⁡ 2 ( 1 + c u ) , s = 2 , c = 1 2 \Phi(u)=\log_2(1+c^u),s=2,c=\frac{1}{\sqrt{2}} Φ(u)=log2(1+cu),s=2,c=2 1

第四章 Over

有不对的地方欢迎指正交流~

机器学习是计算机科学中的一个重要分支,旨在通过设计和分析算法,使计算机系统能够从数据中自动学习和提高,并对未见过的数据提出准确的预测。在机器学习中,数据是关键。该领域利用计算方法对大量数据进行处理和分析,以发现数据中的模式和趋势。通过对这些数据模式进行建模和预测,机器学习使计算机系统能够自动地改进自己的决策和表现。 “基础机器学习”(Foundations of Machine Learning)是机器学习领域中的一个重要概念。它涵盖了机器学习的基本原理和算法,包括如何构建、评估和优化机器学习模型。这些基础理论和方法对于开发和使用先进的机器学习系统至关重要。 在基础机器学习中,重要的概念包括监督学习、无监督学习、半监督学习和强化学习。监督学习是一种从已知的训练数据中构建模型的方法,用于对新数据进行预测。无监督学习是一种从未标记的数据中挖掘模式的方法,而半监督学习则是两者的结合。强化学习则是一种通过与环境交互来学习的方法,根据奖励信号调整模型。 此外,基础机器学习还包括模型评估和选择、特征选择和提取、优化方法等。这些技术和方法使机器学习更加健壮和可靠,并为开发新的机器学习算法提供基础。 总的来说,基础机器学习机器学习领域的核心概念之一,对于发展高级机器学习和人工智能系统至关重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值