大模型相关基础知识学习

大模型基础

大模型三要素

1.算法:模型结构,训练方法

2.数据:数据和模型效果之间的关系,token分词方法

3.算力:英伟达GPU,模型量化

基于大模型对话的系统框架

大模型需要数据的类型

算法并行

模型量化就是把整数变成浮点数的过程

大模型训练过程

1.预训练阶段通常需要数十到百亿Token的文本语料库,但训练目标只是简单的「下一个单词预测」( next word prediction )任务。

第一阶段:自监督预训练(无监督党习):让大模型从大规模数据中学习,不依赖人工标注完成认为训练/学习的标签(Label Data)是文本的后续单词,已经暗含在训练数据集中。

第二阶段:有监督的微调:程序会将指令文本作为大模型的输入(Prompt and/or Instruction ),并逐个Token输出,训练目标是与预期输出相同。

虽然Ⅰ阶段和2阶段都采用「next token prediction」训练方式,但SFT的数据集通常比预训练数据小得多,指令数据集需要提供标注结果(如RLHF ),所以无法大规模应用。

2.微调就是把任务相关的知识输入进去调整

3.对齐Alignment:RLHF机制,在于将大模型与人类的偏好、价值观进行对齐

RLHF步骤:Stepl∶预训练模型的有监督微调Supervised finetuning of the pretrained model.

Step 2∶创建奖励模型Creating a reward model

Step 3 : PPO进行微调Finetuning via proximal policy optimization

Tranformer

自注意力机制:自己能获取哪些词之间的联系更重要,而不是像RNN或者长短期记忆机制那样离得近的词才联系更强

位置编码:RNN按照顺序学习句子,Tranformer先对词语嵌入,生成向量(每个词语及其位置都会有向量),

左边一列是编码器 右边一列是解码器

  1. token化
Token大模型的分词

分词粒度:

  1. 单词分词法:英文(空格分词),中文(jieba分词or 分字)
  2. 单字分词法:英文(字母),中文(分字)
  3. 3.子词分词法:BPE,WordPiece,Unigram

什么是提示工程(Prompt Engineering)

提示工程也叫「指令工程」。

- Prompt 就是你发给大模型的指令,比如「讲个笑话」、「用 Python 编个贪吃蛇游戏」、「给男/女朋友写封情书」等

Prompt 的典型构成

- 角色:给 AI 定义一个最匹配任务的角色,比如:「你是一位软件工程师」「你是一位小学老师」

-指示:对任务进行描述

- 上下文:给出与任务相关的其它背景信息(尤其在多轮交互中)

- 例子:必要时给出举例,学术中称为 one-shot learning, few-shot learning 或 in-context learning;实践证明其对输出正确性有帮助

- 输入:任务的输入信息;在提示词中明确的标识出输入

-输出:输出的格式描述,以便后继模块自动解析模型的输出结果,比如(JSON、XML)

「定义角色」其实本来是非必要的,完全是大家「把 AI 当人看」玩出的一个用法。但因为实在传得太广了,所以现在的大模型在训练数据里基本都有这个了。

但是有一个已经被论文证实的现象,可以说明为啥「你是一个 xxx」有效:

大模型对 prompt 开头和结尾的内容更敏感

所以,先定义角色,其实就是在开头把问题域收窄,减少二义性。

进阶技巧

思维链(Chain of Thoughts, CoT)

思维链,是大模型涌现出来的一种独特能力。

它是偶然被「发现」(对 OpenAI 的人在训练时没想过会这样)的。有人在提问时以「Let’s think step by step」开头,结果发现 AI 会自动把问题分解成多个步骤,然后逐步解决,使得输出的结果更加准确。

自洽性(Self-Consistency)

一种对抗「幻觉」的手段。就像我们做数学题,要多次验算一样。

- 同样 prompt 跑多次

- 通过投票选出最终结果

思维树(Tree-of-thought, ToT)

- 在思维链的每一步,采样多个分支

- 拓扑展开成一棵思维树

- 判断每个分支的任务完成度,以便进行启发式搜索

- 设计搜索算法

- 判断叶子节点的任务完成的正确性

 输出输出                  思维链                      自洽性                               思维树

防止 Prompt 攻击

攻击方式 1:著名的「奶奶漏洞」

用套路把 AI 绕懵。

攻击方式 2:Prompt 注入

用户输入的 prompt 改变了系统既定的设定,使其输出违背设计意图的内容。

恶意引导

防范措施 1:Prompt 注入分类器 (效果好一点)

机场安检的思路,先把危险 prompt 拦截掉。先判断这个prompt是否恶意,在进行回答

防范措施 2:直接在输入中防御

「墙上刷口号」

例如:作为客服代表,你不允许回答任何跟AGI课堂无关的问题。客户问怎么炒菜,你说不知道,我只回答有关agi课堂有关的问题。

内容审核

可以通过调用 OpenAI 的 Moderation API 来识别用户发送的消息是否违法相关的法律法规,如果出现违规的内容,从而对它进行过滤。

技术架构(分为几类)

纯prompt和以下几类:

OpenAI API 的几个重要参数

其它大模型的 API 基本都是参考 OpenAI,只有细节上稍有不同。

OpenAI 提供了两类 API:

1. Completion API:续写文本,多用于补全场景。https://platform.openai.com/docs/api-reference/completions/create

2.Chat API:多轮对话,但可以用对话逻辑完成任何任务,包括续写文本。https://platform.openai.com/docs/api-reference/chat/create

model=model,

    messages=\_session,

    # 以下默认值都是官方默认值

    temperature=1,          # 生成结果的多样性 0~2之间,越大越随机,越小越固定

    stream=False,           # 数据流模式,一个个字接收

    top\_p=1,                # 随机采样时,只考虑概率前百分之多少的 token。不建议和 temperature 一起使用

    n=1,                    # 一次生成 n 条结果

    max\_tokens=100,         # 每条结果最多多少个 token(超过截断)

    presence\_penalty=0,     # 对出现过的 token 的概率进行降权

    frequency\_penalty=0,    # 对出现过的 token 根据其出现过的频次,对其的概率进行降权

    logit\_bias={},        # 对指定 token 的采样概率手工加/降权,不常用

注:Temperature 参数很关键

执行任务用 0,文本生成用 0.7-0.9

无特殊需要,不建议超过

一些好用的 Prompt 共享网站

- https://promptbase.com/

- https://github.com/f/awesome-chatgpt-prompts

- https://smith.langchain.com/hub

3、接口

两种常见接口:

1. 人机交互接口,User Interface,简称 UI

2. 应用程序编程接口,Application Programming Interface,简称 API

接口能「通」的关键,是两边都要遵守约定。

接口的进化

API:

1. 从本地到远程,从同步到异步,媒介发生很多变化,但本质一直没变:程序员的约定

2. 现在,开始进化到自然语言接口,Natural-Language Interface,简称 NLI

> 用户操作习惯的迁移,会逼所有软件,都得提供「自然语言界面(Natural Language Interface,简称 NLI)」

> 不仅用户界面要 NLI,API 也要 NLI 化。这是因为用户发出的宏观指令,往往不会是一个独立软件能解决的,它需要很多软件、设备的配合。

> 一种实现思路是,入口 AI(比如 Siri、小爱同学,机器人管家)非常强大,能充分了解所有软件和设备的能力,且能准确地把用户任务拆解和分发下去。这对入口 AI 的要求非常高。

> 另一种实现思路是,入口 AI 收到自然语言指令,把指令通过 NLI 广播出去(也可以基于某些规则做有选择的广播,保护用户隐私),由各个软件自主决策接不接这个指令,接了要怎么做,该和谁配合。

> 当 NLI 成为事实标准,那么互联网上软件、服务的互通性会大幅提升,不再受各种协议、接口的限制。

最自然的接口,就是自然语言接口:

Plugins和Actions是什么

学习plugin 之前,先要了解ChatGPT 及所有大模型都有两大缺陷:

两大缺陷:

1.没有最新信息。大模型的训练周期很长,且更新一次耗资巨大,所以它的知识都是过去的。GPT-3.5的知识截至2022年1月,GPT-4是2023年4月。

⒉没有「真逻辑」。它表现出的逻辑、推理,是训练文本的统计规律,而不是真正的逻辑。所以:大模型需要连接真实世界,并对接真逻辑系统。

比如算加法:

1.把100以内所有加法算式都训练给大模型,ta就能回答

100以内的加法算式

2.如果问ta更大数字的加法,就不一定对了

3.因为ta并不懂「加法」,只是记住了100以内的加法算式的统计规律4.Ta是用字面意义做数学

Plugin 能一定程度解决这两个问题。

演示:

1. 用天气插件查询天气

2. 用 Wolfram Alpha 插件做数学题

Plugins和Actions原理:

Plugins 歇菜了,主要原因:

1. 缺少「强 Agent」调度,只能手工选三个 plugin,使用成本太高。(解决此问题,相当于 App Store + Siri,可挑战手机操作系统地位)

2. 不在「场景」中,不能提供端到端一揽子服务。(解决此问题,就是全能私人助理了,人类唯一需要的软件)

3. 开销大。(至少两次 GPT-4 生成,和一次 Web API 调用)

3、Function Calling 的机制(函数调用)

「幻觉」仍然是存在的。如何尽量减少幻觉的影响,参考以下资料:

- 自然语言生成中关于幻觉研究的综述:https://arxiv.org/abs/2202.03629

- 语言模型出现的幻觉是如何滚雪球的:https://arxiv.org/abs/2305.13534

- ChatGPT 在推理、幻觉和交互性上的评估:https://arxiv.org/abs/2302.04023

- 对比学习减少对话中的幻觉:https://arxiv.org/abs/2212.10400

- 自洽性提高了语言模型的思维链推理能力:https://arxiv.org/abs/2203.11171

- 生成式大型语言模型的黑盒幻觉检测:https://arxiv.org/abs/2303.08896

补全式编程:GitHub Copilot

安装

1. 首先,需要有 GitHub 账号

2. 然后,到 https://github.com/settings/copilot 启用

3. 最后,安装 IDE 插件,比如

  • VSCode: https://marketplace.visualstudio.com/items?itemName=GitHub.copilot

  • PyCharm: https://plugins.jetbrains.com/plugin/17718-github-copilot

注意:要全局科学上网才能正常使用

迁移学习或微调范畴

用于调整已经训练好的深度学习模型以适应新的任务或数据集,而无需从头开始训练模型。

Prompt-Tuning、Instruction-Tuning和Chain-of-Thought

Prompt-tuning、instruction-tuning和chain-of-thought都是用于训练大型语言模型的方法,它们都有助于提高模型的生成能力和上下文理解能力,但是它们的方法和目的略有不同。

  • Prompt-tuning:Prompt-tuning是一种使用自然语言提示(prompt)的方法,以指导模型生成特定的输出。这种方法的目的是通过对模型进行定向训练,使其在特定任务上表现出更好的性能。与其他方法不同,Prompt-tuning的重点在于设计良好的提示,这些提示可以引导模型生成准确、上下文相关的响应。

  • Instruction-tuning:Instruction-tuning是一种通过为模型提供任务相关的指令来指导模型学习的方法。这种方法的目的是使模型更好地理解任务的要求,并提高其生成能力和上下文理解能力。Instruction-tuning通常需要较少的训练数据,并且可以提高模型的泛化性能。

  • Chain-of-thought:Chain-of-thought是一种通过分解训练过程为较小的相互关联的任务来训练模型的方法。这种方法的目的是使模型能够理解和维护文本中的思维链,从而生成连贯的、上下文相关的响应。与其他方法不同,Chain-of-thought的重点在于将训练过程分解为一系列逐步更复杂的任务,并使用注意机制来帮助模型集中于相关的部分。

总之,这些方法都有助于提高大型语言模型的生成能力和上下文理解能力,但是它们的方法和目的略有不同。Prompt-tuning和instruction-tuning通常用于特定任务的优化,而Chain-of-thought通常用于提高模型的生成能力和上下文理解能力。

基于 LoRA 的模型再训练技术

LoRA(Low-Rank Adaptation)是一种模型再训练技术,主要用于调整已经训练好的深度学习模型,以适应新的任务或数据集,而无需从头开始训练模型。LoRA 的核心思想是通过低秩矩阵分解来修改模型的权重,这种方式能够显著减少需要训练的参数数量,同时保持模型的性能。

在深度学习中,模型通常由多层网络组成,每一层都有自己的权重和偏置。在传统的迁移学习或微调方法中,通常需要调整大量的参数来适应新任务。与这些方法不同,LoRA 通过在原有权重基础上添加一小组额外的可训练参数来实现模型的适应。具体来说,LoRA 会在特定层的权重矩阵中引入两个低秩矩阵的乘积,通过训练这两个小矩阵而不是整个权重矩阵,从而实现对原模型的有效调整。

优势

效率高:通过只训练一小部分参数,LoRA 可以在计算和存储资源有限的情况下快速适应新任务。

灵活性强:LoRA 可以应用于各种类型的深度学习模型,包括但不限于自然语言处理(NLP)、计算机视觉和语音识别等领域。

泛化能力强:即使只修改了少量的参数,LoRA 也能够保持模型对新任务的高性能,有助于改善模型在未见数据上的泛化能力。

LoRA 是一种有效的模型适应技术,特别适用于那些希望在不牺牲模型性能的情况下,快速将预训练模型迁移到新任务上的场景。

微调(Fine-tuning)

这是最直接的一种方法,通常涉及在新的数据集上继续训练已经预训练好的模型的一部分或全部层。微调允许模型在保留先前学到的知识的同时,适应新的任务。

迁移学习(Transfer Learning)

迁移学习的核心思想是利用在一个任务上学到的知识,帮助解决在不同但相关的任务上的学习问题。通常,这意味着使用一个在大型数据集(如ImageNet)上预训练的模型,然后调整其结构或参数以适应一个新任务。

模型剪枝

原文链接:https://blog.csdn.net/Xiao_Ya__/article/details/139326851

1.1什么是模型剪枝?

深度学习网络模型从卷积层到全连接层存在着大量冗余的参数,大量神经元激活值趋近于0,将这些神经元去除后可以表现出同样的模型表达能力,这种情况被称为过参数化,而对应的技术则被称为模型剪枝。(删除权重小于一定阈值的连接或者神经元节点得到更加稀疏的网络。)

1.2Dropout和DropConnect

模型剪枝主要分为结构化剪枝和非结构化剪枝,非结构化剪枝去除不重要的神经元,相应地,被剪除的神经元和其他神经元之间的连接在计算时会被忽略。由于剪枝后的模型通常很稀疏,并且破坏了原有模型的结构,所以这类方法被称为非结构化剪枝。非结构化剪枝能极大降低模型的参数量和理论计算量,但是现有硬件架构的计 算方式无法对其进行加速,所以在实际运行速度上得不到提升,需要设计特定的硬件才可能加速。与非结构化剪枝相对应的是结构化剪枝,结构化剪枝通常以滤波器或者整个网络层为基本单位进行剪枝。一个滤波器被剪枝,那么其前一个特征图和下一个特征图都会发生相应的变化,但是模型的结构却没有被破坏,仍然能够通过 GPU 或其他硬件来加速,因此这类方法被称之为结构化剪枝。

  • Dropout 类似非结构化剪枝 剪去神经元
  • DropConnect 类似结构化剪枝 (剪去连接)
1.2.1权重的冗余性

我们之所以能够对模型进行剪枝,本质上还是网络中的一些参数是冗余的,我们删除一些并不会对网络造成很大的影响,所以才可以去剪枝。

1.3 剪枝的不同粒度

模型剪枝不仅仅只有对神经元的剪枝和对权重连接的剪枝,根据粒度的不同,至少可以粗分为4个粒度。

细粒度剪枝(fine-grained):即对连接或者神经元进行剪枝,它是粒度最小的剪枝。

向量剪枝(vector-level):它相对于细粒度剪枝粒度更大,属于对卷积核内部(intra-kernel)的剪枝。

核剪枝(kernel-level):即去除某个卷积核,它将丢弃对输入通道中对应计算通道的响应。

滤波器剪枝(Filter-level):对整个卷积核组进行剪枝,会造成推理过程中输出特征通道数的改变。

细粒度剪枝(fine-grained),向量剪枝(vector-level),核剪枝(kernel-level)方法在参数量与模型性能之间取得了一定的平衡,但是网络的拓扑结构本身发生了变化,需要专门的算法设计来支持这种稀疏的运算,被称之为非结构化剪枝。

而滤波器剪枝(Filter-level)只改变了网络中的滤波器组和特征通道数目,所获得的模型不需要专门的算法设计就能够运行,被称为结构化剪枝。除此之外还有对整个网络层的剪枝,它可以被看作是滤波器剪枝(Filter-level)的变种,即所有的滤波器都丢弃。

1.4 模型剪枝的必要性

既然冗余性是存在的,那么剪枝自然有它的必要性,下面以Google的研究来说明这个问题。Google在《To prune, or not to prune: exploring the efficacy of pruning for model compression》[1]中探讨了具有同等参数量的稀疏大模型和稠密小模型的性能对比,在图像和语音任务上表明稀疏大模型普遍有更好的性能。

它们对Inception V3模型进行了实验,在参数的稀疏性分别为0%,50%,75%,87.5%时,模型中非零参数分别是原始模型的1,0.5,0.25,0.128倍进行了实验。实验结果表明在稀疏性为50%时,Inception V3模型的性能几乎不变。稀疏性为87.5%时,在ImageNet上的分类指标下降为2%。

1.5非结构化剪枝
1.5.1基本方法

根据连接的重要性判断是否裁剪掉连接

  • 1.神经元重要性判别
  • 2.去除神经元
  • 3.微调
  • 4.继续剪枝(判断是否回到1)

重要性程度就是其 L1或者L2 范数。

1.6结构化剪枝(幅度)
1.6.1基于权重大小的通道裁剪

基于权重的范数剪掉卷积核

计算卷积核的绝对值和,进行排序,剪掉和最小的kernel以及对应的特征图Xi​, Xi +1 和Xi+2​ 都是特征图。Kernel matrix 的共有n i ∗ n i + 1 个元素,每个元素是一个卷积核,Xi​通道数是n i ,X i + 1 通道数是ni+1​。

同时裁剪多个卷积核与通道

重叠部分分别考虑即可

2.模型量化

2.1什么是模型量化

为了保证较高的精度,大部分的科学运算都是采用浮点型进行计算,常见的是32位浮点型和64位浮点型,即float32和double64。

对于深度学习模型来说,乘加计算量是非常大的,往往需要GPU等专用的计算平台才能实现实时运算,这对于端上产品来说是不可接受的,而模型量化是一个有效降低计算量的方法。

量化,即将网络的权值,激活值等从高精度转化成低精度的操作过程,例如将32位浮点数转化成8位整型数int8,同时我们期望转换后的模型准确率与转化前相近。

2.2模型量化的优势
模型量化可以带来几方面的优势,如下。

(1) 更小的模型尺寸。以8bit量化为例,与32bit浮点数相比,我们可以将模型的体积降低为原来的四分之一,这对于模型的存储和更新来说都更有优势。

(2) 更低的功耗。移动8bit数据与移动32bit浮点型数据相比,前者比后者高4倍的效率,而在一定程度上内存的使用量与功耗是成正比的。

(3) 更快的计算速度。相对于浮点数,大多数处理器都支持8bit数据的更快处理,如果是二值量化,则更有优势。

上图展示的是一个二值权重和激活值矩阵的运算,卷积过程中的乘加都可以转换为异或操作,并行程度更高,运算速度因此也更快。

3.知识蒸馏(Knowledge Distillation)
3.1什么是知识蒸馏

知识蒸馏是一种压缩模型的技术,其中一个大型、复杂的模型(教师模型)的知识被转移到一个更小、更简单的模型(学生模型)中。这种方法可以用于将大型模型的性能部分转移到更适合部署的小型模型中。

一般地,大模型往往是单个复杂网络或者是若干网络的集合,拥有良好的性能和泛化能力,而小模型因为网络规模较小,表达能力有限。利用大模型学习到的知识去指导小模型训练,使得小模型具有与大模型相当的性能,但是参数数量大幅降低,从而可以实现模型压缩与加速,就是知识蒸馏与迁移学习在模型优化中的应用。

Hinton等人最早在文章“Distilling the knowledge in a neural network”中提出了知识蒸馏这个概念,其核心思想是一旦复杂网络模型训练完成,便可以用另一种训练方法从复杂模型中提取出来更小的模型,因此知识蒸馏框架通常包含了一个大模型(被称为teacher模型),和一个小模型(被称为student模型)。

知识蒸馏(KD):该方法将知识从一个较大的深度神经网络中提取到一个较小的网络中

3.2知识(Knowledge)

在知识蒸馏中,知识类型、蒸馏策略和师生架构对学生模型的学习起着至关重要的作用。原始知识蒸馏使用大深度模型的对数作为教师知识(Hinton 2015),中间层的激活、神经元或特征也可以作为指导学生模型学习的知识,不同的激活、神经元或成对样本之间的关系包含了教师模型所学习到的丰富信息.此外,教师模型的参数(或层与层之间的联系)也包含了另一种知识,本节主要讨论以下几种类型的知识:基于响应的知识(response-based knowledge),基于特征的知识( feature-based knowledge), 基于关系的知识(relation-based knowledge),下图为教师模型中不同知识类别的直观示例。

3.3蒸馏机制(Distillation Schemes)

根据教师模型是否与学生模型同时更新,知识蒸馏的学习方案可分为离线(offline distillation)蒸馏、在线(online distillation)蒸馏、自蒸馏(self-distillation)。

3.3.1离线蒸馏(offline distillation)

​​​ ​ 大多数之前的知识蒸馏方法都是离线的。最初的知识蒸馏中,知识从预训练的教师模型转移到学生模型中,整个训练过程包括两个阶段:

(1)大型教师模型蒸馏前在训练样本训练;

(2)教师模型以logits或中间特征的形式提取知识,将其在蒸馏过程中指导学生模型的训练。教师的结构是预定义的,很少关注教师模型的结构及其与学生模型的关系。因此,离线方法主要关注知识迁移的不同部分,包括知识设计、特征匹配或分布匹配的loss函数。离线方法的优点是简单、易于实现。
​​​ ​ 离线蒸馏方法通常采用单向的知识迁移和两阶段的训练程序。然而,训练时间长的、复杂的、高容量教师模型却无法避免,而在教师模型的指导下,离线蒸馏中的学生模型的训练通常是有效的。此外,教师与学生之间的能力差距始终存在,而且学生往往对教师有极大依赖。

3.3.2在线蒸馏(online distillation)

​​​ ​ 为了克服离线蒸馏的局限性,提出了在线蒸馏来进一步提高学生模型的性能,特别是在没有大容量高性能教师模型的情况下。在线蒸馏时,教师模型和学生模型同步更新,而整个知识蒸馏框架都是端到端可训练的。
​ ​​​ ​ 在线蒸馏是一种具有高效并行计算的单阶段端到端训练方案。然而,现有的在线方法(如相互学习)通常无法解决在线环境中的高容量教师,这使进一步探索在线环境中教师和学生模式之间的关系成为一个有趣的话题。

3.3.3自蒸馏(self-distillation)

在自蒸馏中,教师和学生模型使用相同的网络,这可以看作是在线蒸馏的一个特例。例如论文(Zhang, L., Song, J., Gao, A., Chen, J., Bao, C. & Ma, K. (2019b).Be your own teacher: Improve the performance of convolutional eural networks via self distillation. In ICCV.)将网络深层的知识蒸馏到浅层部分。
​ ​ 从人类师生学习的角度也可以直观地理解离线、在线和自蒸馏。离线蒸馏是指知识渊博的教师教授学生知识;在线蒸馏是指教师和学生一起学习;自我蒸馏是指学生自己学习知识。而且,就像人类学习的方式一样,这三种蒸馏由于其自身的优点,可以相互补充。

3.4教师-学生结构(Teacher-Student Architecture)

在知识蒸馏中,师生架构是形成知识转移的一般载体。换句话说,师生结构决定了学生模型提取教师模型中知识的质量,用人类学习过程来描述,就是我们希望学生获得一个不错的老师来获取知识。因此,在知识的提炼过程中,如何选择或设计合适的师生结构,是一个重要而又困难的问题。最近,在蒸馏过程中,教师和学生的模型设置几乎是固定不变的大小和结构,从而容易造成模型容量缺口。然而,如何特别设计教师和学生的体系结构,以及为什么他们的体系结构由这些模型设置决定,几乎是缺失的。两者之间模型的设置主要有以下关系:

3.5蒸馏算法

一个简单但有效的知识迁移方法是直接匹配基于响应的、基于特征的或教师模型和学生模型之间的特征空间中的表示分布。许多不同的算法已经被提出,以改善在更复杂的环境中传递知识的过程。

3.5.1对抗性蒸馏(Adversarial Distillation)

在知识蒸馏中,教师模型很难学习到真实数据分布,同时,学生模型容量小,不能准确模仿教师模型。近年来,对抗训练在生成网络中取得了成功,生成对抗网络(GAN)中的鉴别器估计样本来自训练数据分布的概率,而生成器试图使用生成的数据样本欺骗鉴别器的概率预测。受此启发,许多对抗知识蒸馏方法被提出,以使教师和学生网络更好地了解真实的数据分布,如下图所示,对抗训练在知识蒸馏中的应用可以刚被分为三类。

a)训练一个对抗性生成器生成合成的数据,将其直接作为训练集或用于增强训练集。

其中,Ft(.)和Fs(.)分别是教师模型和学生模型的输出;G(z)表示给定随机输入向量z的生成器G生成的训练样本;LG是蒸馏损失,以迫使预测的概率分布与真实概率分布之间匹配,蒸馏损失函数通常采用交叉熵或KL散度。

b)使用鉴别器,利用logits或特征来分辨样本来自教师或是学生模型。
​ 代表性方法如论文(Wang, Y., Xu, C., Xu, C. & Tao, D. (2018f). Adversarial learning of portable student networks. In AAAI.),其loss可以表示为:

​ 其中,G是一个学生网络,LGAN是生成对抗网络使用的损失函数,使学生和教师之间的输出尽可能相似。

c)在线方式进行,在每次迭代中,教师和学生共同进行优化。
​ 利用知识蒸馏压缩GAN,小GAN学生网络通过知识迁移模仿大GAN教师网络。从上述对抗性蒸馏方法中,可以得出三个主要结论:

(1)GAN是通过教师知识迁移来提高学生学习能力的有效工具;

(2)联合GAN和知识蒸馏可以为知识蒸馏的性能生成有价值的数据,克服了不可用和不可访问的数据的限制;

(3)知识蒸馏可以用来压缩GAN。

3.5.2多教师蒸馏(Multi-teacher Distillation)

不同的教师架构可以为学生网络提供他们自己有用的知识。在训练一个教师网络期间,多个教师网络可以单独或整体地用于蒸馏。在一个典型的师生框架中,教师通常是一个大的模型或一个大的模型的集合。要迁移来自多个教师的知识,最简单的方法是使用来自所有教师的平均响应作为监督信息。多教师蒸馏的一般框架如下图所示:

多个教师网络通常使用logits和特征表示作为知识。除了来自所有教师的平均logits,还有其他的变体。文献(Chen, X., Su, J., & Zhang, J. (2019b). A two-teacher tramework for knowledge distillation. In ISNN.)使用了两个教师网络,其中一名教师将基于响应的知识迁移给学生,另一名将基于特征的知识迁移给学生。文献(Fukuda, T., Suzuki, M., Kurata, G., Thomas, S., Cui, J. & Ramabhadran,B. (2017). Effificient knowledge distillation from an ensemble of teachers. In Interspeech.))在每次迭代中从教师网络池中随机选择一名教师。一般来说,多教师知识蒸馏可以提供丰富的知识,并能针对不同教师知识的多样性量身定制一个全方位的学生模型。然而,如何有效地整合来自多名教师的不同类型的知识,还需要进一步研究。

3.5.3跨模态蒸馏(Cross-Modal Distillation)

在训练或测试时一些模态的数据或标签可能不可用,因此需要在不同模态间知识迁移。在教师模型预先训练的一种模态(如RGB图像)上,有大量注释良好的数据样本,(Gupta, S., Hoffman, J. & Malik, J. (2016). Cross modal distillation for supervision transfer. In CVPR.)将知识从教师模型迁移到学生模型,使用新的未标记输入模态,如深度图像(depth image)和光流(optical flow)。具体来说,所提出的方法依赖于涉及两种模态的未标记成对样本,即RGB和深度图像。然后将教师从RGB图像中获得的特征用于对学生的监督训练。成对样本背后的思想是通过成对样本迁移标注(annotation)或标签信息,并已广泛应用于跨模态应用。成对样本的示例还有:

(1)在人类动作识别模型中,RGB视频和骨骼序列;

(2)在视觉问题回答方法中,将图像-问题-回答作为输入的三线性交互教师模型中的知识迁移到将图像-问题作为输入的双线性输入学生模型中。

跨模态蒸馏的框架如下:

3.5.4基于图的蒸馏(Graph-Based Distillation)

大多数知识蒸馏算法侧重于将个体实例知识从教师传递给学生,而最近提出了一些方法使用图来探索数据内关系。这些基于图的蒸馏方法的主要思想是:

(1)使用图作为教师知识的载体;

(2)使用图来控制教师知识的传递。基于图的知识可以归类为基于关系的知识。基于图的知识蒸馏如下图所示:

1)使用图作为教师知识的载体
​ 文献(Zhang, C. & Peng, Y. (2018). Better and faster: knowledge transfer from multiple self-supervised learning tasks via graph distillation for video classifification. In IJCAI)中,每个顶点表示一个自监督的教师,利用logits和中间特征构造两个图,将多个自监督的教师的知识转移给学校。

2)使用图来控制知识迁移
文献(Luo, Z., Hsieh, J. T., Jiang, L., Carlos Niebles, J.& Fei-Fei, L. (2018).Graph distillation for action detection with privileged http://modalities.In ECCV.)将模态差异纳入来自源领域的特权信息,特权信息。引入了一种有向图来探讨不同模态之间的关系。每个顶点表示一个模态,边表示一个模态和另一个模态之间的连接强度。

3.5.5基于注意力的蒸馏(Attention-Based Distillation)

注意力机制能够很好地反映神经网络中神经元的激活情况,因此在知识蒸馏中引入了注意力机制,提高了学生模型的性能。基于注意力机制的知识迁移的核心是定义注意力图,将特征嵌入神经网络的各个层次。也就是说,利用注意力图函数转移特征嵌入知识。

3.5.6无数据的蒸馏(Data-Free Distillation)
无数据蒸馏的方法提出的背景是克服由于隐私性、合法性、安全性和保密问题导致的数据缺失。“data free”表明并没有训练数据,数据是新生成或综合产生的。新生的数据可以利用GAN来产生。合成数据通常由预先训练过的教师模型的特征表示生成。

3.5.7量化蒸馏(Quantized Distillation)

网络量化通过将高精度网络(如32位浮点)转换为低精度网络(如2位和8位),降低了神经网络的计算复杂度。同时,知识蒸馏的目标是训练小模型,使其具有与复杂模型相当的性能。在师生框架下,利用量化过程提出了一些KD方法,如下图所示:

3.5.8终身蒸馏(Lifelong Distillation)

终身学习包括持续学习、持续学习和元学习,旨在以与人相似的方式学习。它积累了以前学到的知识,并将所学到的知识转化为未来的学习,知识蒸馏提供了一种有效的方法来保存和转移学习到的知识,而不会造成灾难性的遗忘。最近,越来越多的KD变体被开发出来,它们是基于终身学习的。

3.5.9基于神经架构搜索的蒸馏(NAS-Based Distillation)

神经架构搜索(NAS),它是最流行的自动机器学习(或AutoML)之一,旨在自动识别深度神经模型和自适应学习合适的深度神经结构。在知识蒸馏中,知识转移的成功不仅取决于教师的知识,还取决于学生的架构。然而,大教师模式和小学生模式之间可能存在能力差距,使得学生很难从老师那里学得好。为了解决这一问题,采用神经结构搜索寻找合适的学生结构。

3.6蒸馏流程

step1:训练Teacher模型。
step2:利用高温T产生Soft-target,.用T=1产生Hard-target.
step3:利用{高温T,Soft-target}和T=1,Hard-target)同时训练Student模型。
step4:设置T=1,Student模型线上做推理。

适应性网络(Adaptive Networks)

这些网络通过引入可以调整的模块或层来适应新任务,例如可调整的注意力机制或自适应层,从而使模型能够更灵活地适应新的数据分布或任务需求。

零射学习(Zero-shot Learning)和少射学习(Few-shot Learning)

这些技术旨在让模型能够在几乎没有(零射)或只有很少样本(少射)的情况下适应新任务。这些方法通常依赖于强大的特征提取能力和先验知识,以实现对新任务的快速适应。

参数效率的迁移学习

除了LoRA,还有其他参数效率的方法,如Adapter模块,它们在预训练模型的特定层中插入可训练的小模块,以适应新任务,同时保持其他参数不变。

知识图谱

知识图谱,是结构化的语义知识库,用于迅速描述物理世界中的概念及其相互关系,通过知识图谱能够将Web上的信息、数据以及链接关系聚集为知识,使信息资源更易于计算、理解以及评价,并能实现知识的快速响应和推理。

当下知识图谱已在工业领域得到了广泛应用,如搜索领域的Google搜索、百度搜索,社交领域的领英经济图谱,企业信息领域的天眼查企业图谱,电商领域的淘宝商品图谱,O2O领域的美团知识大脑,医疗领域的丁香园知识图谱,以及工业制造业知识图谱等。

知识图谱的原始数据类型一般来说有三类(也是互联网上的三类原始数据):

结构化数据(Structed Data),结构化数据是指按照固定格式存储的数据,通常存储在关系数据库中。这类数据易于搜索和组织,因为它们遵循一定的模式(如表格形式),每个数据项都有清晰定义的字段和数据类型。如:关系数据库、链接数据、股票市场数据、客户信息数据库

  • 半结构化数据(Semi-Structured Data),半结构化数据介于结构化数据和非结构化数据之间,它不符合关系数据库的严格结构,但包含可识别的模式使数据组织成一定的层次或标记,便于数据的存储、查询和分析。如:XML文档(标记语言定义的数据,用于描述数据的结构和语义,如HTML文档。)、JSON文件:(轻量级的数据交换格式,常用于Web应用程序中,以键值对的形式存储数据。)电子邮件:(包含一定格式的头信息(如发件人、收件人、日期等),而邮件正文则可能是非结构化的文本或其他媒体内容。)

非结构化数据(Unstructured Data),非结构化数据是指没有预定义数据模型的数据,不能以表格形式展现。这类数据包括文本、图片、视频和音频等多种格式,它们的内容和格式多种多样,不遵循固定的格式。如:图片、音频、视频、科研论文****、新闻文章、****社交媒体帖子

了解知识图谱,它可以在单个数据库中存储结构化、半结构化和非结构化信息。节点和关系用于描述知识图中的数据。通常,节点用于表示实体或概念,例如人员、组织和位置。在微服务图示例中,节点描述人员、团队、微服务和任务。另一方面,关系用于定义这些实体之间的连接,例如微服务或任务所有者之间的依赖关系。

检索增强的生成模型(RAG)

(Retrieval Augmented Generation - RAG) RAG 的核心是一个混合框架,它集成了检索模型和生成模型,生成的文本不仅上下文准确,而且信息丰富。

类比:你可以把这个过程想象成开卷考试。让 LLM 先翻书,再回答问题。

RAG 框架有两个主要组件:检索模型和生成模型。

检索增强的生成模型(Retrieval-Augmented Generation Model,简称 RAG)是一种结合了检索(retrieval)和生成(generation)能力的深度学习模型。RAG 通过将传统的序列到序列(seq2seq)模型与一个检索组件结合起来,能够在生成文本时利用外部信息,这样的信息通常来自一个大型的、结构化的知识库,例如维基百科。

在RAG模型中,当模型需要生成答案或文本时,会先进行一个检索步骤,寻找相关的文档或信息片段,然后基于这些检索到的信息来生成答案。这允许RAG模型在生成答案时,能够利用检索到的文档中的知识,从而生成更加丰富和准确的内容。

好处

RAG 确保你的模型可以访问最新的事实和相关信息,因为它可以定期更新其外部参考。 这确保了它生成的响应包含可能与进行查询的用户相关的最新信息。 你还可以实施文档级安全性来控制对数据流中数据的访问并限制对特定文档的安全权限。

RAG 是一种更具成本效益的选择,因为它需要更少的计算和存储,这意味着你不必拥有自己的 LLM 或花费时间和金钱来微调你的模型。

声称准确性是一回事,但实际证明它是另一回事。 RAG 可以引用其外部来源并将其提供给用户以支持他们的响应。 如果他们选择这样做,用户就可以评估来源以确认他们收到的响应是准确的。

虽然 LLM 支持的聊天机器人可以制作比以前的脚本响应更加个性化的答案,但 RAG 可以更加定制其答案。 这是因为它能够在通过衡量意图综合答案时使用搜索检索方法(通常是语义搜索)来引用一系列上下文信息点。

当面对未经训练的复杂查询时, LLM 有时会 “产生幻觉”,提供不准确的答案。 通过将其响应与相关数据源的附加参考结合起来,RAG 可以更准确地响应模糊的查询。

RAG 模型用途广泛,可应用于一系列自然语言处理任务,包括对话系统、内容生成和信息检索。

偏见可能是任何人造人工智能中的一个问题。 通过依靠经过审查的外部来源,RAG 可以帮助减少其反应中的偏见。

适用于

文字摘要:如前所述,RAG 的杰出应用之一是文本摘要。 想象一下一个人工智能驱动的新闻聚合平台,它不仅可以获取最新新闻,还可以将复杂的文章总结为易于理解的片段。 通过利用 RAG,该平台可以生成简洁、连贯且与上下文相关的摘要,从而提供丰富的用户体验。

问答系统:RAG 在问答系统方面表现出了非凡的能力。 传统上,当查询需要深入了解多个文档或数据集时,QA 模型可能会失败。 然而,RAG 可以扫描广泛的语料库来检索最相关的信息并制定详细、准确的答案。 这使其成为为客户服务应用程序构建智能聊天机器人不可或缺的工具。

内容生成;在内容生成领域,RAG 提供了前所未有的灵活性。 无论是自动生成电子邮件、制作社交媒体帖子,甚至编写代码,RAG 的检索和生成双重方法都确保输出不仅语法正确,而且具有丰富的上下文和相关性。

RAG模型有两种变体:RAG-Sequence和RAG-Token。RAG-Sequence在每个生成步骤之前都会执行一次检索,适用于整体一致性更为重要的任务;而RAG-Token则在生成序列的每个token之前都可能执行检索,适用于需要密切结合检索内容进行生成的任务。

这种模型特别适合于问答任务、事实检查和内容创建等需要结合大量外部信息的应用。通过检索,RAG可以在生成文本时考虑到最新的信息,这是传统的生成模型做不到的。

这幅图描述的是一个使用大型语言模型(Large Language Model)的信息检索和回应生成流程。以下是该流程的各个步骤:

用户(User):用户提出一个查询(Query)。

查询矢量化与搜索(Vectorize & Search):用户的查询被矢量化(转换成数值向量形式),以便在数据库中进行搜索

索引(Indexing):

文档(Documents):有一系列待查询的文档。

分块(Chunking):文档被分割成更小的块(Document chunks),这样做可以提高搜索的效率。

矢量化与存储(Vectorize & Store):文档块被矢量化并存储在向量数据库(Vector Database)中。

检索(Retrieve):基于用户的查询,系统从向量数据库中检索相关的信息或文档。

增强(Augment):

提示(Prompt):检索到的信息可能被用作生成回应的提示。

相关上下文(Relevant Contexts):这个提示包含了生成回应时需要考虑的相关上下文信息。

查询(Query):这个上下文或提示再次被用作查询,可能用于进一步的信息检索或直接用于生成回应。

生成(Generate):大型语言模型利用用户的原始查询和/或增强的提示来生成回应(Response)。

回应(Response):生成的回应被发送回用户。

RAG 的潜在挑战和局限性

虽然 RAG 具有显着的优势,但它也面临着一些挑战和限制:

上下文长度限制。LLM一次性输入的长度限制有时会让我们不得不截断一些语料,致使在一次问答中能为LLM提供的事实资料是有限的,这可能会影响到生成结果的质量。

RAG 依赖于外部知识。 如果检索到的信息不正确,它可能会产生不准确的结果。

RAG 的检索组件涉及搜索大型知识库或网络,这可能在计算上昂贵且缓慢 - 尽管仍然比微调更快且更便宜。

无缝集成检索和生成组件需要仔细的设计和优化,这可能会导致训练和部署方面的潜在困难。

在处理敏感数据时,从外部来源检索信息可能会引起隐私问题。 遵守隐私和合规性要求也可能会限制 RAG 可以访问的来源。 但是,这可以通过文档级访问来解决,你可以在其中向特定角色授予访问和安全权限。

RAG 基于事实准确性。 它可能难以生成富有想象力或虚构的内容,这限制了其在创意内容生成中的使用。

检索增强生成与微调

由于 RAG 可以访问外部资源,因此当任务需要合并来自 Web 或企业知识库的实时或动态信息以生成明智的响应时,RAG 特别有用。 微调具有不同的优势:如果手头的任务定义明确并且目标是单独优化该任务的性能,则微调可能非常有效。 这两种技术的优点是不必为每项任务从头开始培训 LLM。

混合检索

RAG 检索环节中的主流方法是向量检索,即语义相关度匹配的方式。技术原理是通过将外部知识库的文档先拆分为语义完整的段落或句子,并将其转换(Embedding)为计算机能够理解的一串数字表达(多维向量),同时对用户问题进行同样的转换操作。

除了能够实现复杂语义的文本查找,向量检索还有其他的优势:

相近语义理解(如老鼠/捕鼠器/奶酪,谷歌/必应/搜索引擎)

多语言理解(跨语言理解,如输入中文匹配英文)

多模态理解(支持文本、图像、音视频等的相似匹配)

容错性(处理拼写错误、模糊的描述)

虽然向量检索在以上情景中具有明显优势,但有某些情况效果不佳。比如:

搜索一个人或物体的名字(例如,马斯克,iPhone 15)

搜索缩写词或短语(例如,RAG,RLHF)

搜索 ID(例如, gpt-3.5-turbo , titan-xlarge-v1.01 )

而上面这些的缺点恰恰都是传统关键词搜索的优势所在,传统关键词搜索擅长:

精确匹配(如产品名称、姓名、产品编号)

少量字符的匹配(通过少量字符进行向量检索时效果非常不好,但很多用户恰恰习惯只输入几个关键词)

倾向低频词汇的匹配(低频词汇往往承载了语言中的重要意义,比如“你想跟我去喝咖啡吗?”这句话中的分词,“喝”“咖啡”会比“你”“想”“吗”在句子中承载更重要的含义)

不同的检索系统各自擅长寻找文本(段落、语句、词汇)之间不同的细微联系,这包括了精确关系、语义关系、主题关系、结构关系、实体关系、时间关系、事件关系等。可以说没有任何一种检索模式能够适用全部的情景。混合检索通过多个检索系统的组合,实现了多个检索技术之间的互补。

向量检索,通过生成查询嵌入并查询与其向量表示最相似的文本分段。

全文检索,索引文档中的所有词汇,从而允许用户查询任意词汇,并返回包含这些词汇的文本片段。

混合检索,同时执行全文检索和向量检索,并应用重排序步骤,从两类查询结果中选择匹配用户问题的最佳结果,需配置 Rerank 模型 API。

重排序Rerank

混合检索能够结合不同检索技术的优势获得更好的召回结果,但在不同检索模式下的查询结果需要进行合并和归一化(将数据转换为统一的标准范围或分布,以便更好地进行比较、分析和处理),然后再一起提供给大模型。这时候我们需要引入一个评分系统:重排序模型

重排序模型通过将候选文档列表与用户问题语义匹配度进行重新排序,从而改进语义排序的结果。

在大多数情况下,在重排序之前会有一次前置检索,这是由于计算查询与数百万个文档之间的相关性得分将会非常低效。所以,重排序一般都放在搜索流程的最后阶段,非常适合用于合并和排序来自不同检索系统的结果。

重排序可以基于多种不同的方法和算法,包括但不限于传统的排序算法、机器学习模型,以及近似最近邻(Approximate Nearest Neighbor, ANN)搜索的思想

Elasticsearch

Elasticsearch 本身并不是专门的“混合搜索”引擎,但它可以被用来实现混合搜索的功能。

Elasticsearch 是一个非常灵活的搜索引擎,它支持各种类型的搜索,包括但不限于:

全文搜索:这是Elasticsearch的基础功能,能够在文档中找到匹配关键词的结果。

结构化搜索:可以根据文档中的结构化数据(例如日期、数字等)进行搜索。

向量搜索:近期版本的Elasticsearch通过新增的向量字段和脚本评分功能,可以支持简单的向量搜索。

Elasticsearch 是一个开源的搜索和分析引擎,用于处理大规模的数据(通常被称为“大数据”)。它基于 Apache Lucene 构建,提供了一个分布式的多用户能力的全文搜索引擎,具有HTTP web接口和无模式的JSON文档。Elasticsearch是用Java开发的,并作为Apache许可证下的自由软件发布。

主要特点包括:

全文搜索:Elasticsearch 允许你进行复杂的查询,并能返回文本数据中相关的结果,支持各种复杂的搜索模式。

分布式实时分析:作为一个分布式系统,Elasticsearch 可以扩展到数百(甚至数千)个服务器上,并对大量数据进行实时分析。

高可用性和扩展性:它的分布式特性使得扩展和故障转移能够非常简单,有助于提供高可用性。

多租户:可以在同一个Elasticsearch集群中服务多个客户端和应用,它们的数据可以安全地隔离。

文档导向:Elasticsearch中,数据是以文档(JSON格式)的形式存储和索引的,无需提前定义模式。

Elasticsearch 具有重排序(re-ranking)的功能

单次检索增强生成

最常见的选择是直接使用用户输入作为检索查询并立即生成完整答案

主动检索增强生成

可以通过生成过程主动决定何时检索以及检索什么内容,

向量数据库 vector DB

向量类型:图像向量、文本向量、语音向量

                                                                           7维变2维的过程

向量维度越低,嵌入空间embeeding space中的特征表示就越紧凑,可能会影响下有任务或模型的训练质量

向量是神经网络的输入

与传统数据库区别

混合搜索

混合搜索系统:cross-encoder 交叉编码器 用来重排序

区块链与数据库的对比

读者福利:如果大家对大模型感兴趣,这套大模型学习资料一定对你有用

对于0基础小白入门:

如果你是零基础小白,想快速入门大模型是可以考虑的。

一方面是学习时间相对较短,学习内容更全面更集中。
二方面是可以根据这些资料规划好学习计划和方向。

包括:大模型学习线路汇总、学习阶段,大模型实战案例,大模型学习视频,人工智能、机器学习、大模型书籍PDF。带你从零基础系统性的学好大模型!

😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

👉AI大模型学习路线汇总👈

大模型学习路线图,整体分为7个大的阶段:(全套教程文末领取哈)

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

👉大模型实战案例👈

光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

👉大模型视频和PDF合集👈

观看零基础学习书籍和视频,看书籍和视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
在这里插入图片描述
在这里插入图片描述

👉学会后的收获:👈

• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

👉获取方式:

😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

本文转自 https://blog.csdn.net/xiangxueerfei/article/details/141830964?spm=1001.2014.3001.5501,如有侵权,请联系删除。

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值