【深度学习推荐系统】第3章 浪潮之巅——深度学习在推荐系统中的应用

  1. 与传统的机器学习模型相比,深度学习模型的表达能力更强,呢个给挖掘出更多数据中潜在的模式
  2. 深度学习的模型结构非常灵活,能够根据业务场景和数据特点,灵活调整模型结构,使模型与应用场景完美契合。

1、深度学习系统模型的演化关系图

  1. 以多层感知机(MLP)为核心,通过改变神经网络的结构,构建特点各异的深度学习推荐模型
    在这里插入图片描述
  • (1)改变神经网络的复杂程度
  • (2)改变特征交叉方式
    eg:改变了用户向量和物品向量互操作方式的NeuralCF;定义了多种特征向量交叉操作的PNN模型
  • (3)组合模型
  • (4)FM模型的深度学习演化版本
    eg:NFM主要使用神经网络提升FM二阶部分的特征交叉能力,AFM是引入了注意力机制的FM模型,FNN是利用FM的结果进行网络初始化。
  • (5)注意力机制与推荐模型的组合
  • (6)序列模型与推荐模型的组合
  • (7)强化学习与推荐模型的组合

2、AutoRec——单隐层神经网络推荐模型

  1. 基本原理:
    标准的自编码器,利用协调过滤中的共现矩阵,完成物品向量或者用户向量的自编码,再利用自编码的结果得到用户对物品的预估评分,进而进行推荐排序。
    ps. 什么是自编码?
    • 假设其数据向量为r,自编码器的作用是将向量r作为输入,通过自编码器后,得到的输出向量尽量接近其本身。假设自编码器的重建函数是 h ( r ; θ ) h(r;\theta) h(r;θ),那么自编码器的目标函数是
      m i n θ ∑ r ∈ S ∣ ∣ r − h ( r ; θ ) ∣ ∣ 2 2 min_\theta\sum_{r\in S}||r-h(r;\theta)||_2^2 minθrS∣∣rh(r;θ)22
      相当于在重建函数 h ( r ; θ ) h(r;\theta) h(r;θ)中存储了所有数据向量的“精华”。
      (1)一般来说重建函数的参数数量远小于输入向量的维度数量,因此自编码器相当于完成了数据压缩和降维的工作。
      (2)经过自编码器生成的输出向量,由于经过了自编码器的“泛化”过程,不会完全等同于输入向量,因此也具备了一定的缺失维度的预测能力。
  1. 模型结构
    在这里插入图片描述
  • 输入层:物品的评分向量r
  • 输出层:多分类层
    h ( r ; θ ) = f ( W ⋅ g ( V r + μ ) + b ) h(r;\theta)=f(W\cdot g(Vr+\mu)+b) h(r;θ)=f(Wg(Vr+μ)+b)
    其中, f ( ⋅ ) f(\cdot) f() g ( ⋅ ) g(\cdot) g()分别为输出层神经元和隐层神经元的激活函数。V表示输入层到隐层的参数矩阵,W表示隐层到输出层的参数矩阵。
    为了防止重构函数过拟合,加入L2正则化项,目标函数变为:
    m i n θ ∑ i = 1 n ∣ ∣ r ( i ) − h ( r ( i ) ; θ ) ∣ ∣ o 2 + λ 2 ( ∣ ∣ W ∣ ∣ F 2 + ∣ ∣ V ∣ ∣ F 2 ) min_\theta\sum_{i=1}^n||r^{(i)}-h(r^{(i)};\theta)||_o^2+\frac{\lambda}{2}(||W||_F^2+||V||_F^2) minθi=1n∣∣r(i)h(r(i);θ)o2+2λ(∣∣WF2+∣∣VF2)
  1. 推荐过程
    当输入物品i的评分向量为 r ( i ) r^{(i)} r(i)时,模型的输出向量 h ( r ( i ) ; θ ) h(r^{(i)};\theta) h(r(i);θ)就是所有用户对物品i的评分预测。那么,其中的第u维就是用户u对物品i的预测 R ^ u i \hat{R}_{ui} R^ui
    R ^ u i = ( h ( r ( i ) ; θ ^ ) ) u \hat{R}_{ui}=(h(r^{(i)};\hat{\theta}))_u R^ui=(h(r(i);θ^))u
    通过遍历输入物品向量就可以得到用户u对所有物品的评分预测,进而根据评分预测排序得到推荐列表。
    同样有基于物品的(I-AutoRec)和基于用户的(U-AutoRec).
  • I-AutoRec>U-AutoRec:用户向量的稀疏性可能会影响模型效果
  • I-AutoRec<U-AutoRec:仅需输入一次目标用户的用户向量,就可以重建用户对所有物品的评分向量。

3、Deep Crossing模型——经典的深度学习框架(微软)

  1. 特征
    在这里插入图片描述
  • (1)类别型特征:【one-hot或multi-hot】
    • 用户搜索词、广告关键词、广告标题、落地页、匹配类型
  • (2)数值型或计数型特征**【直接拼接近特征向量中】**
    • 点击率、预估点击率
  • (3)进一步处理的特征
  1. 网络结构
  • 问题1:离散型特征编码过于稀疏,需要将其稠密化
    embedding
  • 问题2:如何解决特征自动交叉组合的问题
    多层残差网络
  • 如何在输出层中达成问题设定的优化目标
    scoring层
    在这里插入图片描述
  • (1)embedding层:全连接
  • (2)Stacking层:把embedding们拼接起来
  • (3)Multiple Residual Units层:特征交叉
  • (4)Scoring层:对于二分类:逻辑回归;对于多分类:softmax

4、NeuralCF模型——CF与深度学习的结合

  1. 从深度学习的视角看待矩阵分解模型:
    矩阵分解层的用户隐向量和物品隐向量完全可以看作是一种Embedding方法。最终的scoring层就是将用户隐向量和物品隐向量进行内积操作后得到的“相似度”(评分的预测)。
    在这里插入图片描述
  2. 模型结构
    在这里插入图片描述
    使用“多层神经网络+输出层”的结构代替了矩阵分解模型中简单的内积操作。这样做的收益:
  • 让用户向量和物品向量做更充分的交叉,得到更多有价值的特征组合信息
  • 引入更多的非线性特征让模型的表达能力更强。
    在这里插入图片描述
    进一步整合了上面提出的模型GMF是广义矩阵分解模型(用户和物品向量的互操作层可以被任意的互操作形式所代替)
  1. 缺点:NeuralCF模型并没有引入更多其他类型的特征,这在实际应用中无疑浪费了其他有价值的信息。

5、PNN模型——加强特征交叉能力

  1. NeuralCF模型只提到了用户向量和物品向量两组特征向量,PNN模型给出了特征交互方式的几种设计思路。
  2. 网络架构
    在这里插入图片描述
  • PNN模型用乘积层(Product Layer)代替了Deep Crossing模型中的Stacking层。【不同特征的Embedding向量不再是简单拼接,而是用Product操作进行两两交互,更有针对性地获取特征之间的交叉信息】
  • 相比于NeuralCF,PNN模型的输入不仅包括用户和物品信息,还可以有更多不同形式、不同来源的特征,通过Embedding层的编码生成同样长度的稠密特征Embedding向量。针对特征的交叉方式,PNN给出了更多具体的互操作方式。
  1. Product层的多种特征交叉方式
    线性操作部分(z)【线性拼接】 和 乘积操作部分§ 组成。
    乘积特征交叉部分有两种
  • (1)内积操作——>IPNN
    向量内积计算。假设输入特征向量分别是 f i f_i fi, f j f_j fj,特征的内积互操作:
    g i n n e r ( f i , f j ) = < f i , f j > g_{inner}(f_i,f_j)=<f_i,f_j> ginner(fi,fj)=<fi,fj>
  • (2)外积操作——>OPNN
    对输入特征向量 f i f_i fi, f j f_j fj的各个维度进行两两交叉,生成特征交叉矩阵:
    g o u t e r ( f i , f j ) = f i f j T g_{outer}(f_i,f_j)=f_if_j^T gouter(fi,fj)=fifjT
    复杂度高,提出降维的方法:把所有两两特征Embedding向量外积互操作的结果叠加,形成一个叠加外积互操作矩阵p
    p = ∑ i = 1 N ∑ j = 1 N g o u t e r ( f i , f j ) = ∑ i = 1 N ∑ j = 1 N f i f j T = f Σ f Σ T , f Σ = ∑ i = 1 N f i p=\sum_{i=1}^N\sum_{j=1}^Ng_{outer}(f_i,f_j)=\sum_{i=1}^N\sum_{j=1}^N f_if_j^T=f_\Sigma f_\Sigma^T,f_\Sigma=\sum_{i=1}^Nf_i p=i=1Nj=1Ngouter(fi,fj)=i=1Nj=1NfifjT=fΣfΣT,fΣ=i=1Nfi

叠加矩阵p的最终形式类似于让所有特征embedding向量通过一个平均池化层,再进行外积互操作。【但是平均池化操作只针对不同特征的对应维度有类似含义】,所以在适应外积池化操作需要谨慎。

事实上,PNN在进入L1之前在乘积层内部又进行了局部全连接层的转换,分别讲线性部分z,乘积部分p映射成了 D 1 D_1 D1维的输入向量 l z l_z lz和¥ L p L_p Lp D 1 D_1 D1 L 1 L_1 L1隐层的神经元数量),再将 l z l_z lz l p l_p lp叠加,输入 L 2 L_2 L2隐层。这部分不具有创新,可以被其他转换操作完全替代,因此不再详细介绍。

  1. PNN模型的优势和局限性
  • 优点:强调了特征Embedding向量之间的交叉方式是多样化的,相比于简单的交由全连接层进行无差别化的处理,PNN模型定义的内积和外积操作显然更有针对性地强调了不同特征之间的交互
  • 却待你:对所有特征进行无差别的交叉,在一定程度上忽略了原始特征向量中包含的有价值信息。

6、Wide&Deep模型——记忆能力和泛化能力的综合

由单层的Wide部分和多层的Deep部分组成的混合模型。

  • Wide部分:是让模型具有较强的“记忆能力”
  • Deep部分:是让模型具有“泛化能力”
    让模型兼具了逻辑回归和深度神经网络的优点:能够快速处理并记忆大量历史行为特征,并且具有强大的表达能力。
  1. 模型的记忆能力和泛化能力
  • 记忆能力:模型直接学习并利用历史数据中物品或者特征的“共现频率”的能力。
  • 泛化能力:模型传递特征的相关性,以及挖掘稀疏甚至从未出现过的稀有特征与最终标签相关性的能力
  1. Wide&Deep模型的结构
    简单模型“记忆力”强,深度神经网络的“泛化能力”强。
    在这里插入图片描述
  • 单层的Wide部分善于处理大量稀疏的id类特征;Deep部分利用神经网络表达能力强的特点,进行深层的特征交叉,挖掘在特征背后的数据模式。

7、Wide&Deep模型的进化——Deep&Cross模型

在这里插入图片描述
使用Cross网络代替原来的Wide部分,Deep部分的设计思路没有本质改变。

设计Cross网络的目的是增加特征之间的交互力度,使用多层交叉层对输入向量进行特征交叉。假设第l层交叉层的输出向量为 x l x_l xl,那么第 l + 1 l+1 l+1层的输出向量:
x l + 1 = x 0 x l T W l + b l + x l x_{l+1}=x_0x_l^TW_l+b_l+x_l xl+1=x0xlTWl+bl+xl
在PNN模型的外积操作基础上,增加了外积操作的权重向量 w l w_l wl,以及原输入向量 x l x_l xl和偏置向量 b l b_l bl

  • DeepFM、NFM等都可以看成Wide&Deep模型等延伸。

8、FM与深度学习模型的结合

1、FNN——用FM的隐向量完成Embedding层初始化

在这里插入图片描述
embedding层的改进!

PS:为什么Embedding层的收敛速度往往很慢?

Embedding层的作用是将稀疏输入向量转换成稠密向量

  • embedding层的参数数量巨大
  • 由于输入向量过于稀疏,在随机梯度下降的过程中,只有与非零特征相连的Embedding层权重会被更新,进一步降低了Embedding层的收敛速度。

针对Embedding层收敛速度的难题,FFN模型的解决思路是用FM模型训练好各特征隐向量初始化Embedding层的参数,相当于在初始化神经网络参数时,已经引入了有价值的先验信息【Embedding预训练】。也就是说,神经网络训练的起点更解决与最优点。
FM的数学形式:
y F M ( x ) : = s i g m o i d ( w 0 + ∑ i = 1 N w i x i + ∑ i = 1 N ∑ j = i + 1 N < v i , v j > x i x j ) y_{FM}(x):=sigmoid(w_0+\sum_{i=1}^Nw_ix_i+\sum_{i=1}^N\sum_{j=i+1}^N<v_i,v_j>x_ix_j) yFM(x):=sigmoid(w0+i=1Nwixi+i=1Nj=i+1N<vi,vj>xixj)
其中的参数主要包括常数偏置 w 0 w_0 w0,一阶参数部分 w i w_i wi和二阶隐向量部分 v i v_i vi

在这里插入图片描述

  • 在训练FM的过程中,并没有对特征域进行区分,但在FNN模型中,特征被分成了不同特征域,因此每个特征域具有对应的Embedding层,并且每个特征域Embedding的维度都应与FM隐向量维度保持一致。

DeepFM——用FM代替Wide部分

FNN把FM的训练结果作为初始化权重,并没有对神经网络的结构进行调整。
在这里插入图片描述
DeepFM对Wide&Deep模型的改进之处在于,它用FM替换了原来的Wide部分,加强了浅层网络部分特征组合的能力,主要是针对Wide&Deep模型的Wide部分不具备自动的特征组合能力的缺陷进行的。这里的改进动机与Deep&Cross模型的完全一致,唯一不同就在于Deep&Cross模型利用多层Cross进行特征组合,而DeepFM模型利用FM进行特征组合。

NFM——FM的神经网络化尝试

无论是FM还是其改进模型FFM,归根结底是一个二阶特征交叉的模型,受到组合爆炸问题的困扰,FM几乎不可能扩展到三阶以上,这就不可避免地限制了FM模型的表达能力。想要利用深度神经网络更强的表达能力改进FM模型。
NFM模型的主要思路是:用一个表达能力更强的函数替代原FM中二阶隐向量的部分【改进如下】:
y ^ F M ( x ) = w 0 + ∑ i = 1 N w i x i + ∑ i = 1 N ∑ j = i + 1 N v i T v j ⋅ x i x j \hat{y}_{FM}(x)=w_0+\sum_{i=1}^Nw_ix_i+\sum_{i=1}^N\sum_{j=i+1}^Nv_i^Tv_j\cdot x_ix_j y^FM(x)=w0+i=1Nwixi+i=1Nj=i+1NviTvjxixj
y ^ N F M ( x ) = w 0 + ∑ i = 1 N w i x i + f ( x ) \hat{y}_{NFM}(x)=w_0+\sum_{i=1}^Nw_ix_i+f(x) y^NFM(x)=w0+i=1Nwixi+f(x)

在这里插入图片描述
在embedding层和多层神经网络之间加入特征交叉池化层。假设 V x V_x Vx是所有特征域的Embedding集合,那么特征交叉池化层的具体操作是
f B I ( V x ) = ∑ i = 1 n ∑ j = i + 1 n ( x i v i ) ⊙ ( x j v j ) f_{BI}(V_x)=\sum_{i=1}^n\sum_{j=i+1}^n(x_iv_i)\odot (x_jv_j) fBI(Vx)=i=1nj=i+1n(xivi)(xjvj)
其中, ⊙ \odot 代表两个向量的元素积操作,即两个长度相同的向量对应维相乘的到元素积向量,其中第k维的操作:
( v i ⊙ v j ) k = v i k v j k (v_i\odot v_j)_k=v_{ik}v_{jk} (vivj)k=vikvjk
在进行两两Embedding向量的元素积操作后,对交叉特征向量取和,得到池化层的输出向量;再把该向量输入上层的多层全连接神经网络,进一步的交叉。

  • 相比于Wide&Deep模型,NFM模型对其Deep部分加入了特征交叉池化层,加强了特征交叉。

4、基于FM的深度学习模型的优点和局限性

在经典多层神经网络的基础上加入有针对性的特征交叉操作,让模型具备更强的非线性表达能力。但特征工程的思路走到这里几乎已经穷尽啦可能的尝试,模型进一步提升的空间非常小,这也是这类模型的局限性所在。
在这之后,越开越多的深度学习推荐模型开始探索更多“结构”上的尝试,诸如注意力机制、序列模型、强化学习等在其他领域大放异彩的模型结构。

8、注意力机制在推荐模型中的应用

1、AFM——引入注意力机制的FM【浙大】

在NFM模型中,不同域的特征Embedding向量经过特征交叉池化层的交叉,将各交叉特征向量进行“加和”,输入最后由多层神经网络组成的输出层。问题的关键在于 加和池化(Sum Pooling)操作,它相当于“一视同仁”地对待所有交叉特征,不考虑不同特征对结果的影响程度,事实上消解了大量有价值的信息。
具体地说,AFM模型引入注意力机制是通过在特征交叉层和最终的输出层之间加入注意力网络实现的。
在这里插入图片描述
同NFM,AFM的特征交叉过程同样采用了元素积操作:
f P I ( ε ) = { ( v ⊙ v j ) x i x j } ( i , j ) ∈ R x f_{PI}(\varepsilon)=\{(v\odot v_j)x_ix_j\}_{(i,j)\in R_x} fPI(ε)={(vvj)xixj}(i,j)Rx
AFM加入注意力得分后的池化过程:
f A t t ( f P I ( ε ) ) = ∑ ( i , j ) ∈ R x a i j ( v i ⊙ v j ) x i x j f_{Att}(f_{PI}(\varepsilon))=\sum_{(i,j)\in R_x}a_{ij}(v_i\odot v_j)x_ix_j fAtt(fPI(ε))=(i,j)Rxaij(vivj)xixj
其中 a i j a_{ij} aij:
a i j ′ = h T R e L U ( W ( v i ⊙ v j ) ) x i x j + b a_{ij}^{'}=h^TReLU(W(v_i\odot v_j))x_ix_j+b aij=hTReLU(W(vivj))xixj+b
a i j = e x p ( a i j ′ ) ∑ ( i , j ) ∈ R x e x p ( a i j ′ ) a_{ij}=\frac{exp(a_{ij}^{'})}{\sum_{(i,j)\in R_x}exp(a_{ij}^{'})} aij=(i,j)Rxexp(aij)exp(aij)

DIN——引入注意力机制的深度学习网络

在这里插入图片描述
V u = f ( V a ) = ∑ i = 1 N w i ⋅ V i = ∑ i = 1 N g ( V i , V a ) ⋅ V i V_u=f(V_a)=\sum_{i=1}^Nw_i\cdot V_i=\sum_{i=1}^N g(V_i,V_a)\cdot V_i Vu=f(Va)=i=1NwiVi=i=1Ng(Vi,Va)Vi
其中 V u V_u Vu是用户的Embedding向量, V a V_a Va是候选广告商品的Embedding向量, V i V_i Vi是用户u的第I次行为的Embedding向量。其中 g ( V i , V a ) g(V_i,V_a) g(Vi,Va)使用一个注意力激活单元来生成注意力得分:激活单元的输入层是两个Embedding向量,经过元素减操作后,与原Embedding向量一同连接后形成全连接层的输入,最后通过单神经元输出层生成注意力得分。

3、注意力机制对推荐系统的启发

从“注意力机制”开始,越来越多对深度学习模型结构的改进是基于对用户行为的深刻观察而得出的。

9、DIEN——序列模型与推荐系统的结合【非常重要!!!!】

1、DIEN的“进化”动机

无论是电商购买行为,还是视频网站的观看行为,或是新闻应用的阅读行为,特定用户的历史行为都是一个随时间排序的序列。既然是时间相关的序列,就一定存在或深或浅的前后依赖关系,这样的序列信息对推荐过程无疑是有价值的。
用户兴趣迁移非常快,例如,上周一位用户在挑选一双篮球鞋,这位用户上周的行为序列都会集中在篮球鞋这个品类的商品上,但在他购买完成后,本周他的购物兴趣可能变成买一个机械键盘。序列信息的重要性在于:

  • 它加强了最近行为对下次行为预测的影响。在这个例子中,用户近期购买机械键盘的概率会明显高于再买一双篮球鞋或购买其他商品的概率。
  • 序列模型能够学习到购买趋势的信息。在这个例子中,序列模型能够在一定程度上建立“篮球鞋”到“机械键盘”的转移概率。
    如果放弃序列信息,推荐模型就仍然是基于用户所有购买历史的综合推荐,而不是针对“下一次购买”推荐。

2、DIEN模型的架构

“输入层+Embedding层+连接层+多层全连接神经网络+输出层”
DIEN的创新点在于如何构建“兴趣进化网络”
在这里插入图片描述
兴趣进化网络分成3层,从下至上依次是:

  • 行为序列层(浅绿色部分):其主要作用是把原始的id类行为序列转换成Embedding行为序列
  • 兴趣抽取层(米黄色部分):其主要作用是通过模拟用户兴趣迁移过程,抽取用户兴趣。【关键】
    • 基本结构是GRU(门循环单元),相比传统的序列模型RNN(循环神经网络)和LSTM(长短期记忆网络),GRU解决了RNN的梯度消失问题。与LSTM相比,GRU的参数数量更少。
    • 每个GRU的具体形式是:
      u t = σ ( W u i t + U u h t − 1 + b u ) u_t=\sigma(W^ui_t+U^uh_{t-1}+b^u) ut=σ(Wuit+Uuht1+bu)
      r t = σ ( W r i t + U r h t − 1 + b r ) r_t=\sigma(W^ri_t+U^rh_{t-1}+b^r) rt=σ(Writ+Urht1+br)
      h t ~ = t a n h ( W h i t + r t ∘ U h h t − 1 + b h ) \tilde{h_t}=tanh(W^hi_t+r_t\circ U^hh_{t-1}+b^h) ht~=tanh(Whit+rtUhht1+bh)
      h t = ( 1 − u t ) ∘ h t − 1 + u t ∘ h t ~ h_t=(1-u_t)\circ h_{t-1}+u_t\circ \tilde{h_t} ht=(1ut)ht1+utht~
      其中, σ \sigma σ是Sigmoid激活函数, ∘ \circ 是元素积操作, i t i_t it是输入状态向量,也就是行为序列层的各行为Embedding向量 b ( t ) b(t) b(t) h t h_t ht是GRU网络中第t个隐状态向量。
  • 兴趣进化层:其主要作用是通过在兴趣抽取层基础上加入注意力机制,模拟与当前目标广告相关的兴趣进化过程。【关键】
    • 引入AUGRU结构,AUGRU在原GRU的更新门的结构上加入了注意力得分:
      u t ′ ~ = a t ⋅ u t ′ \tilde{u_t^{'}}=a_t\cdot u_t^{'} ut~=atut
      h t ′ = ( 1 − u t ′ ~ ) ⋅ h t − 1 ′ + u t ~ ′ ⋅ h t ′ ~ h_t^{'}=(1-\tilde{u_t^{'}})\cdot h_{t-1}^{'}+\tilde{u_t}^{'}\cdot\tilde{h_t^{'}} ht=(1ut~)ht1+ut~ht~

10、强化学习与推荐系统的结合

  1. 强化学习:针对智能体(Agent)在不断变化的环境中决策和学习的过程进行建模。在智能体的学习过程中,会完成收集外部反馈(Reward),改变自身状态(State),再根据自身状态对下一步的行动(Action)进行决策,在行动之后持续收集反馈的循环,简称为“行动-反馈-状态更新”的循环。
  2. 推荐领域的强化学习模型——eg:DRN

1、深度强化学习推荐系统框架

在这里插入图片描述

  • 智能体:推荐系统本身,它包括基于深度学习的推荐模型、探索、策略,以及相关的数据存储
  • 环境:由新闻网站或App、用户组成的整个推荐系统外部环境。在环境中,用户接收推荐的结果并做出相应反馈。
  • 行动:对一个新闻推荐系统来说,“行动”指的就是推荐进行新闻排序后推送给用户的动作。
  • 反馈:用户收到推荐结果后,进行正向的或者负向的反馈。
  • 状态:状态指的是对环境及自身当前所处情况的刻画。在新闻推荐里:状态=已收到所有行动和反馈+用户和新闻的所有相关信息的特征向量表示;在传统机器学习角度:状态=已收到的、可用于训练的所有数据的集合。
  • 学习过程:
    • (1)初始化推荐系统(智能体)
    • (2)推荐系统基于当前已收集的数据(状态)进行新闻排序(行动),并推送到网站或App(环境)中。
    • (3)用户收到推荐列表,点击或忽略(反馈)某推荐结果
    • (4)推荐系统收到反馈,更新当前状态或通过模型训练更新模型。
    • (5)重复第2步。

2、深度强化学习推荐模型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值