万字长文深度剖析AIGC技术!(网络架构&自监督)

作者 | 派派星  编辑 | CVHub

点击下方卡片,关注“自动驾驶之心”公众号

ADAS巨卷干货,即可获取

点击进入→自动驾驶之心【全栈算法】技术交流群

前景回顾

Welcome to back! 在《万字长文带你解读AIGC入门篇》 一文中,我们详细为大家介绍了AIGC的相关概念、背景及其如此火爆的原因,接下来我们将进一步深入探讨AIGC背后的技术栈。

作为本系列的技术篇,将从多个角度来介绍AIGC的技术栈,其中包括了TransformerSSLVAEGANDiffusion等大家均耳熟能详的词汇,这些技术都是AIGC领域中必不可少且非常重要的一部分,对于理解AIGC的原理和实现方式都非常关键。下面开始吧?

3. AIGC 背后的基础技术

本文将 AIGC 视为一组使用人工智能方法生成内容的任务或应用程序。其中,生成技术是指使用机器学习模型生成新的内容,例如 GAN 和扩散模型。创作技术是指利用生成技术生成的内容进行进一步的创作和编辑,例如对生成的文本进行编辑和改进。

3.1 生成技术

AlexNet的惊人成功之后,深度学习引起了极大的关注,它有点成为了人工智能的代名词。与传统的基于规则的算法不同,深度学习是一种数据驱动的方法,通过随机梯度下降优化模型参数。深度学习在获取卓越的特征表示方面的成功,取决于更好的网络架构和更多的数据,这极大地加速了AIGC的发展。

3.1.1 网络架构

众所周知,深度学习的两个主流领域是自然语言处理(NLP)和计算机视觉(CV),它们的研究显著改进了骨干架构,并在其他领域启发了改进后骨干架构的各种应用,例如语音领域。在 NLP 领域,Transformer 架构已经取代了循环神经网络(RNN)成为事实上的标准骨干。而在 CV 领域,视觉 Transformer(ViT) 除了传统的卷积神经网络(CNN)外,也展示了其强大的性能。在这里,我们将简要介绍这些主流骨干架构的工作原理及其代表性的变种。

  • RNN & LSTM & GRU

RNN主要用于处理时间序列数据,例如语言音频。标准的RNN有三层:输入层隐藏层输出层RNN的信息流有两个方向,第一个方向是从输入到隐藏层再到输出的方向。而RNN中循环的本质在于其沿着时间方向的第二个信息流。除了当前的输入,当前时刻 𝑡 的隐藏状态还依赖于上一个时刻 𝑡−1 的隐藏状态。这种双向的设计很好地处理了序列顺序,但当序列变得很长时,会出现梯度消失梯度爆炸的问题。

为了缓解这个问题,引入了长短时记忆网络即LSTM,其“细胞”状态充当了一个“高速公路”,有助于信息在序列方向上的流动。LSTM是减轻梯度爆炸/消失问题最流行的方法之一,但是由于它有三种门,因此会导致较高的复杂度和更高的内存需求

接下来出场的便是门控循环单元(GRU),该技术通过将细胞状态和隐藏状态合并,并用所谓的更新状态替换遗忘门和输入门,简化了LSTM

最后,便是双向循环神经网络(Bidirectional RNN),通过在细胞中捕获过去和未来信息来改进基本的RNN,即时间 t 的状态是基于时间 t-1 和 t+1 计算的。根据任务不同,RNN 可以具有不同数量的输入和输出,例如一对一,多对一,一对多和多对多。其中多对多可以用于机器翻译,也称为序列到序列(seq2seq)模型。另一方面,注意力机制也被频繁引入,使得模型的解码器能够看到每个编码器标记,并根据其重要性动态更新权重。

407fe0c8cd98802762542ec5b13354c3.png
图3.1 Transformer
  • Transformer

与传统的Seq2seq模型相比,Transformer提出了自注意力机制,并将其成功应用于Encoder-Decoder模型中。Transformer 模型由编码器解码器两部分组成,采用了残差连接层归一化等技术,其中核心组件为多头注意力机制前馈神经网络。多头注意力机制通过自注意力实现,并采用了多头的设计,而前馈神经网络则是由两个全连接层组成。这种自注意力机制的定义采用了缩放点积的形式,能够更好地处理序列中的依赖关系。

与逐个输入句子信息以建立位置信息的 RNN 不同,Transformer 通过构建全局依赖关系获得强大的建模能力,但也因此失去了带有归纳偏差的信息。因此,需要使用位置编码使模型能够感知输入信号的位置信息。有两种类型的位置编码。固定位置编码用不同频率的正弦和余弦表示。可学习的位置编码由一组可学习参数组成。不可否认的是,Transformer 已俨然成为 CV 和 NLP 任务的标杆之作,由其衍生的门派数不胜数。

  • CNN

在 CV 领域,CNN 有着不可撼动的地位。CNN 的核心在于卷积层。卷积层中的卷积核(也称为滤波器)是一组共享的权重参数,用于对图像进行操作,其灵感来源于生物视觉皮层细胞。卷积核在图像上滑动并与像素值进行相关操作,最终得到特征映射并实现图像的特征提取。例如:

  1. GoogleNet 的 Inception 模块允许在每个块中选择多个卷积核大小,增加了卷积核的多样性,因此提高了CNN的性能;

  2. ResNet 是 CNN 的一个里程碑,引入残差连接,稳定了训练,使模型能够通过更深的建模获得更好的性能。此后,它成为CNN中不可或缺的一部分;

  3. 为了扩展 ResNet 的工作,DenseNet 在所有先前层和后续层之间建立密集连接,从而使模型具有更好的建模能力;

  4. EfficientNet 使用一种称为缩放方法的技术,使用一组固定的缩放系数来统一缩放卷积神经网络架构的宽度,深度和分辨率,从而使模型更加高效。

  5. 而与 NLP 领域中的 Transformer 相似,ViT 则是最近几年才在 CV 领域中引入的新的变体。ViT 使用 transformer 模块来处理图像,并在 Vision Transformer Encoder 中使用自注意力机制,而不是传统的卷积神经网络。ViT 将输入的图像分成一些小块,然后将这些小块变换成一系列的向量,这些向量将被送入 transformer 编码器。通过这种方式,ViT 可以利用 transformer 强大的建模能力来处理图像,并在许多计算机视觉任务中达到了与 CNN 相当的性能。

8ec52f3d2d0f087f89c786ca1029ec76.png
图3.2 ViT
  • ViT

Transformer 在 NLP 领域的成功启发了许多学者将其应用到 CV 领域,其中 ViT 是第一种采用 Transformer 的 CV 模型。ViT 将图像平铺为一系列二维块,并在序列的开头插入一个类别标记以提取分类信息。在嵌入位置编码之后,标记嵌入被输入到一个标准 Transformer 模型中。

ViT 的这种简单有效的实现使其高度可扩展。例如:

  1. Swin是通过在更深层次上合并图像块来构建分层特征映射,以高效地处理图像分类和密集识别任务,由于它仅在每个局部窗口内计算自注意力,因此减少了计算复杂度;

  2. DeiT采用教师-学生训练策略,通过引入蒸馏标记,减少了 Transformer 模型对大量数据的依赖性;

  3. CaiT引入了类别注意力机制以有效增加模型深度。

  4. T2T通过 Token Fusion 有效地定位模型,并通过递归地聚合相邻 Token 来引入 CNN 先验的层次化深而窄的结构。

通过置换等变性,Transformer 从其翻译不变性中解放了 CNN,允许更长距离的依赖关系和更少的归纳偏差,使它们成为更强大的建模工具,并比 CNN 更适合于下游任务。在当前大模型和大数据集的范式下,Transformer 逐渐取代 CNN 成为计算机视觉领域的主流模型。

3.1.2 自监督学习

不可否认的是,深度学习能够从更好的骨干结构中获益,但自监督学习同样重要,该技术可以利用更大的无标签训练数据集。在这里,我们总结了最相关的自监督预训练技术,并根据训练数据类型(例如语言、视觉和联合预训练)对它们进行分类。

af0bf3c705996402b81418a39521abab.png
图3.3 BERT
  • Language pretraining

语言预训练方法主要有三种主流的方法。第一种方法是使用掩码对编码器进行预训练,代表作是BERT。具体来说,BERT 从未掩码的语言标记预测掩码的语言标记。然而,掩码-预测任务和下游任务之间存在显着差异,因此像BERT这样的掩码语言建模在没有微调的情况下很少用于文本生成。

相比之下,自回归语言预训练方法适用于少样本或零样本文本生成。其中最流行的是GPT家族,采用的是解码器而不是编码器。具体来说,GPT-1是第一种采用解码器的模型,GPT-2GPT-3进一步研究了大规模数据和大型模型在转移能力中的作用。

基于GPT-3ChatGPT的前所未有的成功近来引起了广泛关注。此外,一些语言模型采用了原始Transformer的编码器和解码器。BART使用各种类型的噪声扰动输入,预测原始干净的输入,类似于去噪自编码器。MASSPropheNet采用了类似于BERT的方法,将掩码序列作为编码器的输入,解码器以自回归的方式预测掩码标记。

2eca550d2ddc59c7bdf9a2e13946ae21.png
图3.4 MAE
  • Visual pretraining

视觉预训练主要包含两种类型,第一种类型是基于掩码学习的无监督自编码器,它们旨在学习良好的图像表征MAE。第二种类型是基于自监督的预测模型,最流行的是ImageNet中学到的视觉特征(ImageNet-pretraining)和自监督学习方法,如RotNetMoCo等等。这些方法先前采用的自监督任务包括但不仅限于图像旋转预测图像补丁重建等。

14a52b7cd175ad4f5b5fe4d8758f7a9c.png
图3.5 CLIP
  • Joint pretraining

最后一种预训练方式是联合学习方法,它使用多模态输入进行联合预训练。通过从互联网上收集大量的图像和文本配对数据集,多模态学习取得了前所未有的进展,其中交叉模态匹配是关键技术。对比预训练被广泛应用于在同一表示空间中匹配图像嵌入和文本编码。其中,CLIP是最流行的一个,由OpenAI提出,它使用文本图像作为联合输入,通过学习一个共同的嵌入空间来进行分类任务。

此外,SimCLRDALL·E都是联合学习的成功应用,前者使用自监督任务对图像进行增强,后者是一个生成模型,可以根据文字描述生成图像。ALIGN则扩展了 CLIP,使用嘈杂的文本监督,使得文本-图像数据集不需要清洗,可以扩展到更大的规模。Florence 进一步扩展了跨模态共享表示,从粗略场景到细粒度物体,从静态图像到动态视频等,因此,学习到的共享表示更加通用,表现出卓越的性能。

3.2 创作技术

深度生成模型(DGMs)是一组使用神经网络生成样本的概率模型,大体可分为两大类:基于似然的和基于能量的。基于似然的概率模型,如自回归模型和流模型,具有可追踪的似然,这为优化模型权重提供了一种直接的方法,即针对观察到(训练)数据的对数似然进行优化。变分自编码器(VAEs)中的似然则不完全可追踪,但可以优化可追踪的下限,因此,VAE也被认为属于基于似然的组,其指定了一个归一化的概率。相反,能量模型以未归一化概率即能量函数为特点。在没有对标准化常数可追踪性的限制下,能量模型在参数化方面更加灵活,但难以训练。此外,GAN和 扩散模型 虽然是从不同的时期发展而来,但与能量模型均密切相关。接下来,我们将介绍每一类基于似然的模型以及如何训练基于能量的模型以及 GAN 和扩散模型的机制。

3.2.1 Likelihood-based models
  • Autoregressive models

自回归模型是一种可以用来预测序列数据的模型,它能够学习序列数据的联合分布,并且使用先前时间步的变量作为输入来预测每个变量在序列中的取值。这种模型假设序列数据的联合分布可以被分解成一系列条件分布的乘积,这也就是所说的“条件概率分解”。

ee1832164a1dc934bd8909ce7c629f35.png
公式3.1

上面我们简单跟大家聊到过RNN,本质上自回归模型和RNN都需要使用前面的时间步来预测当前时间步的值,但是它们的实现方式略有不同。在自回归模型中,前面的时间步直接作为输入提供给模型,而在 RNN 中,前面的时间步通过隐藏状态传递给模型。因此,可以将自回归模型看作是一个前馈神经网络,它接收前面所有时间步的变量作为输入。

在早期的工作中,自回归模型主要用于建模离散数据。其中,Fully Visible Sigmoid Belief Network, FVSBN使用逻辑回归函数来估计条件分布,而Neural Autoregressive Distribution Estimation, NADE则使用单隐藏层的神经网络。随着研究的发展,自回归模型的应用逐渐扩展到连续变量的建模。自回归模型已经在多个领域得到了广泛应用,包括计算机视觉如PixelCNNPixelCNN++、音频生成WaveNet和自然语言处理Transformer等等。这些应用中,自回归模型被用来生成图像、音频、文本等序列数据。

  • VAE

自编码器是一类相似的模型,它们通过编码器Encoder将输入数据映射到低维的潜在表示空间,然后再通过解码器Decoder将这个低维表示还原回原始数据。整个编码-解码的过程旨在学习输入数据的潜在结构,以便于重建数据和生成新的样本。

变分自编码器VAE则是自编码器的一种变体,它使用了贝叶斯定理,通过学习潜在变量Latent variable的分布,从而学习原始数据的分布。为了训练 VAE,需要最大化一个较复杂的目标函数,它由一个最大化数据似然的项和一个正则化项组成。正则化项通常使用KL散度来度量潜在变量的分布和标准正态分布之间的差异。

关于AEVAE的介绍,请移步至微信公众号 CVHub 上点击 《万字长文带你入门变分自编码器》 自行查阅。

3.2.2  Energy-based models

由于自回归模型和流模型都具有可计算的似然函数即tractable likelihood,因此可以直接通过最大化数据对数似然来优化模型的参数。然而,这种优化方法也限制了模型的形式。例如,自回归模型必须分解为一系列条件概率的乘积形式,而流模型必须采用可逆的转换。这些限制可能会使模型的表达能力受到一定的限制,但也有助于使模型更加可解释和可控。例如,自回归模型可以方便地计算条件概率分布,因此更适用于生成序列数据,而流模型则可以实现精确的概率密度估计,因此更适用于密度估计和采样等任务。

能量模型则是一类非标准化概率模型,其概率可以表示为一个未知归一化常数的指数函数。假设能量模型只涉及单个变量 ,则它的能量函数可以表示为 ,对应的概率密度可以通过下面的公式计算得到:

ed7af4c9430ab976f35e2ab151f74973.png
公式3.2

其中  是未知的归一化常数,保证概率密度函数的积分等于 1。因为能量模型的概率密度函数没有直接给出归一化常数,所以它也被称为非标准化概率模型。

  • MCMC & NCE

早期优化能量模型的方法采用了基于MCMC即马尔可夫链蒙特卡罗的方法来估计对数似然的梯度,但这需要进行繁琐的随机样本抽取。因此,一些工作旨在改善 MCMC 的效率,代表性的工作是Langevin MCMC。尽管如此,通过 MCMC 获取所需梯度需要大量的计算,而对比散度contrastive divergence, CD成为一种流行的方法,通过各种变体的近似来减少计算量,包括持久 CD ,平均场 CD 和多网格 CD 。

另一条研究路线是通过噪声对比估计Notice Contrastive Estimation, NCE来优化能量模型,该方法将概率模型与另一个噪声分布进行对比。具体来说,它优化以下损失函数:

4b31f7407ee37bde0153c2db006e320e.png
公式3.3
  • Score matchingScore matching

得分匹配是一种用于优化基于能量的模型的无 MCMC 方法,旨在最小化模型和观察到的数据之间的对数概率密度的导数。但是,通常无法获得数据得分函数,而去噪得分匹配是一种代表性方法,它使用带噪声的样本来近似数据得分,通过迭代去除噪声,从而生成干净的样本。

3.2.3 from GAN to diffusion model

当涉及到深度生成模型时,您首先想到什么?答案取决于您的背景,但是 GAN 无疑是最常提到的模型之一。GAN 代表生成对抗网络,是由 Goodfellow 及其团队于 2014 年首次提出的,并于 2016 年被图灵奖 Yann Lecun 评为“机器学习领域过去10年中最有趣的想法”。

最近,一种称为扩散模型(diffusion model)的新型深度生成模型家族挑战了 GAN 长期以来的统治地位。扩散模型在图像合成方面取得了压倒性的成功,并扩展到其他形式,如视频、音频、文本、图形等。考虑到它们对生成AI的发展的支配性影响,因此本文将集中围绕 GAN 和扩散模型进行讲解。

db0e576c751d9aaa5a1e276c0e236885.png
图3.6 GAN
  • GAN

GAN 的架构如上图所示,它分别由两个网络组件组成,即鉴别器(D)和生成器(G)。其中,D 将真实图像与 G 生成的图像区分开来,而 G 的目标是欺骗 D。给定一个潜变量 ,G 的输出是 ,构成一个概率分布 。GAN 的目标是使  逼近观察数据分布 。通过对抗学习来实现这个目标,可以将其解释为一种最小-最大博弈:

8331c30cfd66b7cdfe89db8d4920f5e7.png
公式3.4

GAN 的训练过程是通过鉴别器和生成器之间的博弈来实现的,最终的结果是一个鉴别器可以正确地将真实数据和生成数据区分开来,而生成器可以生成与真实数据相似的数据。另一方面,GAN 的不稳定性和生成样本缺乏多样性是其存在的缺陷,这是因为 GAN 的训练过程是通过对抗性的学习实现的。GAN 和自回归模型的基本区别在于 GAN 学习隐式数据分布,而后者学习的是受模型结构强制的显式分布。

3df576dc262dca1ab899216162a6d08d.png
图3.7 diffusion model
  • Diffusion model

过去几年中,使用扩散模型(一种特殊的分层VAE)的应用已经爆炸性增长。扩散模型,也被称为去噪扩散概率模型DDPMs或基于score的生成模型,其可以生成与训练数据相似的新数据。受非平衡热力学的启发,DDPM 可以被定义为参数化马尔可夫链,通过扩散步骤慢慢添加随机噪声到训练数据,并学习反向扩散过程以从纯噪声中构建所需的数据样本。下面我们以最简短的语言详细的看一下大致的原理。

在正向扩散过程中,DDPM 通过连续添加高斯噪声来破坏训练数据。给定数据分布 ,DDPM 通过逐渐扰动输入数据,将训练数据映射到噪声。这通常通过一个简单的随机过程来实现,该过程从数据样本开始,迭代生成更嘈杂的样本 ,使用简单的高斯扩散核 :

83787a43ca7c4fb3650e5f8467799eb0.png
公式3.5

通过上述第一行公式的迭代过程,我们可以获得任意步数  下的加噪图像,其中  和  是超参数,为扰动过程的步数和每一步扰动的幅度。为了简化讨论,我们这里只考虑使用高斯噪声作为转移核的情况,用  表示。经过一定的转换,我们得到任意步数  下的加噪图像,如下式所示:

8760e50b445a273d5a9a7a0f1a344dde.png
公式3.6

在反向去噪过程中,DDPM 通过执行迭代去噪来学习恢复数据,即通过撤销正向扩散来生成数据。这个过程代表了数据合成,DDPM 通过将随机噪声转化为真实数据来进行训练。它也被形式化定义为一个随机过程,从  开始迭代去噪输入数据,并生成可以遵循真实数据分布  的 。因此,该模型的优化目标如下:

15568d3f4891318ac46f3fb8332a8feb.png
公式3.7

在 DDPM 中,正向扩散过程和反向去噪过程通常都需要使用数千个步骤来逐步注入噪声,以及在生成过程中进行去噪。因此,这会导致整个生成过程非常耗时,也是它一直被大家诟病的问题。不过,虽然技术的不断迭代,现如今越来越多快速 DDPM 的方法呈井喷式涌现出来,未来可期!

写在最后

关于《万字长文带你解读AIGC》系列之技术篇就先讲到这里,后续我们将围绕下列内容继续介绍:

  • 《万字长文带你解读AIGC》系列之入门篇,主要介绍AIGC的相关概念并深入洞察分析其为什么会如此火爆的原因等;

  • 《万字长文带你解读AIGC》系列之技术篇,主要介绍AIGC背后的底层技术栈,如TransforemrSSLVAEGANDiffusion等;

  • 《万字长文带你解读AIGC》系列之任务篇,主要介绍与AIGC相关的任务,如ChatGPT、图生文、文生图、多模态等;

  • 《万字长文带你解读AIGC》系列之应用篇,主要介绍AIGC产业的实际应用,如电影、音乐、代码、广告、游戏等;

  • 《万字长文带你解读AIGC》系列之总结篇,该篇章主要对上述内容进行一个全面的总结,集中讨论目前面临的挑战,并对生成式AI在不久的将来可能的发展进行相关的展望。

视频课程来了!

自动驾驶之心为大家汇集了毫米波雷达视觉融合、高精地图、BEV感知、传感器标定、传感器部署、自动驾驶协同感知、语义分割、自动驾驶仿真、L4感知、决策规划、轨迹预测等多个方向学习视频,欢迎大家自取(扫码进入学习)

b63d3379f16b2d27827db46fe220d550.png

(扫码学习最新视频)

国内首个自动驾驶学习社区

近1000人的交流社区,和20+自动驾驶技术栈学习路线,想要了解更多自动驾驶感知(分类、检测、分割、关键点、车道线、3D目标检测、Occpuancy、多传感器融合、目标跟踪、光流估计、轨迹预测)、自动驾驶定位建图(SLAM、高精地图)、自动驾驶规划控制、领域技术方案、AI模型部署落地实战、行业动态、岗位发布,欢迎扫描下方二维码,加入自动驾驶之心知识星球,这是一个真正有干货的地方,与领域大佬交流入门、学习、工作、跳槽上的各类难题,日常分享论文+代码+视频,期待交流!

c10d5e8982298ba5aa2193543529ae00.jpeg

自动驾驶之心】全栈技术交流群

自动驾驶之心是首个自动驾驶开发者社区,聚焦目标检测、语义分割、全景分割、实例分割、关键点检测、车道线、目标跟踪、3D目标检测、BEV感知、多传感器融合、SLAM、光流估计、深度估计、轨迹预测、高精地图、NeRF、规划控制、模型部署落地、自动驾驶仿真测试、产品经理、硬件配置、AI求职交流等方向;

cede7db8d4dc343734be836a6c3248c6.jpeg

添加汽车人助理微信邀请入群

备注:学校/公司+方向+昵称

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL多数据源是指在一个应用程序中同时使用多个不同的MySQL数据库来存储和管理数据的技术。它可以帮助开发人员更灵活地处理各种数据库操作,提高程序的性能和可扩展性。下面是一个完整的MySQL多数据源教程。 一、设置数据库连接信息 1. 在应用程序的配置件中,创建多个数据库连接的配置项。例如,可以为每个数据源创建一个配置项,分别命名为db1、db2等。 2. 在配置项中,设置每个数据源的连接信息,包括数据库地址、用户名、密码等。 二、创建数据源管理器 1. 创建一个数据源管理器类,用于管理多个数据源。该类需要实现数据源的动态切换和获取。 2. 使用Java的线程安全的数据结构,如ConcurrentHashMap来存储数据源信息。将配置件中的数据库连接信息加载到数据结构中。 3. 实现方法来切换不同的数据源,通过传入数据源的名称来切换到对应的数据库。 三、实现数据源切换 1. 在应用程序中,根据业务需求选择需要使用的数据源。可以通过调用数据源管理器的方法来切换数据源。 2. 在DAO层的代码中,根据当前使用的数据源名称,选择对应的数据源进行数据库操作。 四、使用多数据源进行数据库操作 1. 在DAO层的代码中,区分不同的数据源,并将数据库操作的代码包装在对应的数据源中。 2. 在业务层的代码中,调用DAO层的方法来进行数据库操作。不同的数据源会自动切换。 五、处理事务 1. 如果需要在一个事务中操作多个数据源,可以使用分布式事务的方式来处理。 2. 可以使用开源的分布式事务框架,如Atomikos、Bitronix等来实现多数据源的事务管理。 六、监控和维护 1. 使用监控工具来监控多个数据源的使用情况,包括连接数、查询次数等。 2. 定期对数据库进行维护,包括索引优化、数据清理等工作,以保证数据库的性能和稳定性。 通过以上步骤,我们可以实现MySQL多数据源的配置和使用。使用多数据源可以更好地管理和处理不同的数据库操作,在提高程序性能和可扩展性的同时,也提供了更灵活的数据操作方式。同时,需要注意合理选择和配置数据源,以及监控和维护数据库,以保证系统的运行效率和数据的安全性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值