落地领域大模型应知必会 (1) :主要微调方法总览

在如今高速发展的人工智能领域,高效地利用大语言模型(LLMs)已经变得越来越重要。但是,利用大语言模型的方式太多了,如果你才刚刚开始接触它,可能会感到不知所措。

实质上,我们可以通过两种主要方式将预训练大语言模型用于新任务:上下文学习(in-context learning)以及微调(finetuning)

本文我们将简要介绍上下文学习(in-context learning)的含义,并介绍对LLMs进行微调的各种可行方式。

01 In-Context Learning和Indexing

自从GPT-2(Radford等人[1])和GPT-3(Brown等人[2])问世以来,我们发现,在通用文本语料库上进行预训练的生成式大语言模型(LLMs)可以进行上下文学习。这意味着,如果我们想要执行新的特定任务,我们无需对预训练的LLM进行进一步的训练或微调,可以通过输入Prompt直接提供一些目标任务的示例,如下面的例子所示。

图片

上下文学习的例子

如果我们不能直接访问模型(例如如果我们通过API使用模型),那么上下文学习就用处非常大。

与上下文学习相关的是hard prompt tuning,即试图通过修改输入改善输出,如下图所示。

图片

An illustration of (hard) prompt tuning顺便说一下,我们称这种方法为hard prompt tuning,因为在这种方法中,我们直接修改了输入的单词或tokens。稍后我们将讨论另外一种版本的方法,称为soft prompt tuning(或通常称为prompt tuning)。

刚刚提到的prompt tuning方法为参数微调(parameter finetuning)提供了一种替代方案(且这种方案更节省资源)。然而,它的性能通常不及微调(finetuning),因为这种方法不会针对特定任务更新模型的参数,这可能会限制它对不同特定任务间细微差别的适应能力。此外,prompt tuning可能需要进行大量工作,耗费大量人力财力,因为这种方法需要人工参与比较不同prompt的质量。

在我们更进一步地讨论微调之前,先来了解另一种利用纯粹的上下文学习的方法——indexing。在大语言模型领域中,indexing可以被视为一种上下文学习的变通方法,其使得LLMs能够转变为信息检索系统(information retrieval systems),从外部资源和网站中提取数据。在这个过程中,indexing模块将文档或网站分解成较小的片段,并将它们转换为可以存储在向量数据库中的向量(vectors) 。然后,当用户提交查询(query)时,indexing模块计算嵌入查询(embedded query)与数据库中每个向量之间的向量相似度(vector similarity)。最终,indexing模块检索出与查询最相似的前k个嵌入(embeddings),生成响应。

图片

An illustration of indexing.

02 常规的基于特征的方法和微调方法

如果我们无法直接访问大型语言模型(LLM),例如通过API或使用用户界面与LLM进行交互,那么上下文学习是一种有价值且用户友好的方法。

然而,如果我们可以直接接触到LLM,使用目标领域的数据对其进行调整(adapting)和微调(finetuning)通常会获得更好的结果。那么,如何使一个模型适应目标任务呢?下图概述了三种常见的方法:

图片

3种常规的基于特征的方法和微调的方法

下文中,我们将以对编码器类型(encoder-style)的大型语言模型(例如BERT)微调为例,解析具体的微调方式原理和示例代码。下述示例微调任务为分类器任务,在这个任务中,我们试图预测电影评论是正面情感还是负面情感。需要注意的是,除了对编码器类型(encoder-style)的LLM进行微调外,同样的方法也适用于类似GPT的解码器类型(decoder-style)的LLM。在后续的文章中,我将会举例说明这一点。

此外,我们还可以对解码器类型(decoder-style)的LLM进行微调,以生成对特定指令的多句子回答(multiple-sentence answers),而不仅仅是进行文本分类。关于这个问题,我会在未来的文章中提供实战案例,敬请期待。

2.1 基于特征的方法

在基于特征的方法(feature-based approach)中,我们需要加载一个预训练LLM,并将其应用于目标数据集。在这种方法中,我对生成训练集的输出嵌入(output embeddings)特别感兴趣,这些嵌入可以作为输入特征(input features)用于训练分类模型(classification model)。虽然这种方法在像BERT这样以嵌入为重点的模型中非常常见,但我们也可以从生成式的 GPT-style 模型中提取嵌入。

接下来,我们可以使用逻辑回归模型(logistic regression model)、随机森林(random forest)或XGBoost等任何我们想要使用的模型作为分类模型。(然而,根据我的经验,在这种情况下,像逻辑回归(logistic regression)这样的线性分类器(linear classifiers)表现最佳

理论上,我们可以用下面这段代码来解释基于特征的方法:

python
复制代码
model = AutoModel.from_pretrained("distilbert-base-uncased")# ...
# tokenize dataset
# ...# generate embeddings
@torch.inference_mode()
def get_output_embeddings(batch):
output = model(
batch["input_ids"],
attention_mask=batch["attention_mask"]
).last_hidden_state[:, 0]
return {"features": output}dataset_features = dataset_tokenized.map(
get_output_embeddings, batched=True, batch_size=10)X_train = np.array(imdb_features["train"]["features"])
y_train = np.array(imdb_features["train"]["label"])X_val = np.array(imdb_features["validation"]["features"])
y_val = np.array(imdb_features["validation"]["label"])X_test = np.array(imdb_features["test"]["features"])
y_test = np.array(imdb_features["test"]["label"])# train classifier
from sklearn.linear_model import LogisticRegressionclf = LogisticRegression()
clf.fit(X_train, y_train)print("Training accuracy", clf.score(X_train, y_train))
print("Validation accuracy", clf.score(X_val, y_val))
print("test accuracy", clf.score(X_test, y_test))

(对此感兴趣的读者可以在此处[4]找到完整的代码)

2.2 微调方法 I —— 更新输出层(Output Layers)

有一种方法与上述基于特征的方法比较相关,叫做微调输出层(本文称之为微调方法 I)。与基于特征的方法类似,这种方法不改变预训练LLM的参数,只会训练新增加的输出层,类似于在嵌入特征(embedded features)上训练逻辑回归分类器(logistic regression classifier)或小型多层感知器(small multilayer perceptron)。

相关代码如下:

python
复制代码
model = AutoModelForSequenceClassification.from_pretrained("distilbert-base-uncased",num_labels=2
) # freeze all layers
for param in model.parameters():param.requires_grad = False# then unfreeze the two last layers (output layers)
for param in model.pre_classifier.parameters():param.requires_grad = Truefor param in model.classifier.parameters():param.requires_grad = True# finetune model
lightning_model = CustomLightningModule(model)trainer = L.Trainer(max_epochs=3,...
)trainer.fit(model=lightning_model,train_dataloaders=train_loader,val_dataloaders=val_loader)# evaluate model
trainer.test(lightning_model, dataloaders=test_loader)

(对此感兴趣的读者可以在此处[4]找到完整的代码)

从理论上讲,这种方法的建模性能和速度(modeling performance and speed)应该与基于特征的方法差不多,因为都会去冻结骨干模型(frozen backbone model)(译者注:通过冻结骨干模型,我们可以保持其模型权重不变,仅对任务模块进行训练。这样可以减少需要更新的参数数量,提高训练效率,并在一定程度上保留原始骨干模型的特征提取能力)。然而,由于基于特征的方法使得预计算(pre-compute)和存储训练数据集的嵌入特征(embedded features)稍微更容易一些,所以在具体场景中,基于特征的方法可能更加方便

2.3 微调方法 II - 更新所有层(All Layers)

虽然BERT那篇论文(Devlin等人)说过,仅微调输出层(output layer)可以实现与微调所有层相当的模型性能,但由于后者涉及的参数更多,所以成本要高得多。 例如,BERT基础模型约有1.1亿个参数。然而,用于二元分类的BERT基础模型最后一层仅包含1500个参数。此外,BERT基础模型的最后两层共有6万个参数,这仅占总模型大小的0.6%左右。

我们选择走哪条路径会根据目标任务和目标领域与模型预训练的数据集的相似程度而有所不同。但是在具体实践中,微调所有层几乎总是能获得更优的模型性能。

因此,在优化模型性能时,使用预训练LLM的黄金标准(the gold standard)是更新所有层(本文称之为微调方法 II)。从理论上讲,微调方法 II 与微调方法 I 非常相似。唯一的区别是方法II不会冻结预训练LLM的参数,而是对其进行微调

ini
复制代码
model = AutoModelForSequenceClassification.from_pretrained("distilbert-base-uncased",num_labels=2
) # freeze layers (which we don't do here)
# for param in model.parameters():
#    param.requires_grad = False# finetune model
lightning_model = LightningModel(model)trainer = L.Trainer(max_epochs=3,...
)trainer.fit(model=lightning_model,train_dataloaders=train_loader,val_dataloaders=val_loader)# evaluate model
trainer.test(lightning_model, dataloaders=test_loader)

(对此感兴趣的读者可以在此处[4]找到完整的代码)

上面的这段代码被用来训练一个基于DistilBERT基础模型的电影评论分类器(你可以去the code notebooks看一看[4])

1)基于特征的方法与逻辑回归:83%的测试准确率(accuracy);

2)微调方法 I,更新最后两层:87%准确率(accuracy);

3)微调方法 II,更新所有层:92%准确率(accuracy)。

这些准确率结果符合预期,即微调更多层通常会获得更好的性能,但也需要花费更高的成本。

图片

本文3种方法的训练效率和模型性能权衡经验之谈

上述场景强调了微调的三种最不同或最极端的情况:即仅训练最后一层(或几层)与训练所有层。当然,具体效果可能会因模型和数据集而异,但在探索两者之间的各种情况也是值得的。 例如,有时候我们只需训练一半的模型,就能获得与训练完成的模型相同的性能(更多关于轻量化微调(parameter-efficient finetuning)的内容将在下一节介绍)。如果你是一个好奇宝宝,下图描述了在IMDB电影评论数据集(IMDB movie review dataset)的2万个训练实例上进行微调的DistilBERT模型的预测性能(predictive performances)和训练时间。

图片

在IMDB电影评论数据集上微调的预训练DistilBERT模型的性能。相关代码可以在GitHub上找到[5]

正如我们可以看到的,仅训练最后一层是最快速的,但模型性能也最差。 符合预期的是,训练更多层会提高模型性能,但也会增加计算成本。 有一件事情非常有趣,可以看到当训练两个全连接的输出层(fully connected output layers)和最后两个transformer blocks(从左边数起的第三个block)时,预测性能(predictive performance)就已经趋于饱和。因此,在这种特定情况下(即对于这个特定的模型和数据集组合),训练超过这些层(layers)似乎是一种计算资源的浪费。

03 轻量化微调(Parameter-Efficient Fine-Tuning)

轻量化微调让我们能够重复使用预训练的模型,同时最大限度地减少算力和资源的占用。总体来说,轻量化微调具有以下五个优点:

1. 能够降低计算成本(需要更少的GPU和GPU运行时间);

2. 拥有更快的训练时间(更快地完成训练);

3. 具备更低的硬件要求(适用于较小显存的GPU和较小的内存);

4. 具有更好的模型性能(降低过拟合);

5. 需要更少的存储空间(大部分weights可以在不同任务(tasks)之间共享)。

在之前的章节中,我们了解到微调更多的层通常会带来更好的结果。上面的实验是基于一个相对较小的DistilBERT模型。但是,如果我们想微调那些几乎无法容纳在GPU显存中的较大模型(例如最新的生成式LLM模型),我们该怎么办呢?当然,我们可以使用上述基于特征的方法或者微调方法I。但假设我们想要获得与微调方法II类似的模型质量呢?

这些年来,研究人员们开发了几种技术(Lialin等人[6])来微调LLM,使其只需要训练少量的参数,也能具有较高的模型性能。这些方法通常被称为参数高效微调技术(parameter-efficient finetuning techniques,PEFT,本文亦译作轻量化微调)。

一些目前最受欢迎的PEFT技术在下图中可见。

图片

最受欢迎的轻量化微调(PEFT)技术可选择项

那么,这些技术是如何工作的呢?简单来说,都涉及到引入少量额外的参数进行微调(而不是像我们在上面的微调方法 II中那样对所有层进行微调)。从某种意义上说,微调方法 I(只微调最后一层)也可以被认为是一种轻量化微调(PEFT)技术。然而,像前缀微调(prefix tuning)、adapters和Low-Rank Adaptation (LoRA,低秩自适应))等技术,它们都“修改”了多个层(layers),以极低的成本实现了更好的预测性能(predictive performance)。

由于本文的篇幅目前已经很长了,而且这些都是超级有趣的技术,我将在未来单独介绍这些技术。

04 基于人类反馈的强化学习(Reinforcement Learning with Human Feedback)

在基于人类反馈的强化学习(Reinforcement Learning with Human Feedback,RLHF)中,使用一种结合了监督学习(supervised learning)和强化学习(reinforcement learning)的方法对预训练模型进行微调——这一方法被 ChatGPT 使用而得到大力推广,而 ChatGPT 又是基于InstructGPT(Ouyang等人[7])的。

在RLHF中,通过让人类对不同的模型输出进行排序或评分来收集人类反馈,从而提供奖励信号(reward signal) 。收集到的奖励标签(reward labels) 可以用来训练奖励模型(reward model) ,进而反过来指导LLM(Language Model)适应人类的喜好。

奖励模型本身是通过监督学习(supervised learning)来学习的(通常使用预训练的LLM作为基础模型)。接下来,使用奖励模型来更新预训练的LLM,使其适应人类偏好——训练过程使用一种被称为近端策略优化(proximal policy optimization,Schulman等人[8])的强化学习方法。

图片

InstructGPT相关论文的截图,概述了RLHF的过程

为什么要使用奖励模型而不是直接在人类反馈的基础上训练预训练模型?这是因为让人类参与模型的学习过程会产生瓶颈(bottleneck),因为我们无法实时获取反馈。

这篇文章的篇幅已经很长了,所以我把更详细的解释推迟到以后的文章中,敬请期待!

05 总结

对预训练LLM的所有层(layers)进行微调仍然是适应新目标任务(new target tasks)的黄金标准(the gold standard),但是对于预训练的Transformer模型,有几种有效的替代方法。诸如基于特征的方法、上下文学习和轻量化微调等这些方法能够有效地将LLM应用于新的任务,同时还能最大限度地减少计算成本和计算资源

此外,基于人类反馈的强化学习(RLHF)作为监督微调(supervised finetuning,SFT)的一种替代方法,可以提升模型性能。

如何系统的去学习大模型LLM ?

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。

但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的 AI大模型资料 包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来

😝有需要的小伙伴,可以V扫描下方二维码免费领取🆓

在这里插入图片描述

AI大模型系统学习路线图

在这里插入图片描述

阶段1:AI大模型时代的基础理解

  • 目标:了解AI大模型的基本概念、发展历程和核心原理。
  • 内容
    • L1.1 人工智能简述与大模型起源
    • L1.2 大模型与通用人工智能
    • L1.3 GPT模型的发展历程
    • L1.4 模型工程
      - L1.4.1 知识大模型
      - L1.4.2 生产大模型
      - L1.4.3 模型工程方法论
      - L1.4.4 模型工程实践
    • L1.5 GPT应用案例

阶段2:AI大模型API应用开发工程

  • 目标:掌握AI大模型API的使用和开发,以及相关的编程技能。
  • 内容
    • L2.1 API接口
      - L2.1.1 OpenAI API接口
      - L2.1.2 Python接口接入
      - L2.1.3 BOT工具类框架
      - L2.1.4 代码示例
    • L2.2 Prompt框架
      - L2.2.1 什么是Prompt
      - L2.2.2 Prompt框架应用现状
      - L2.2.3 基于GPTAS的Prompt框架
      - L2.2.4 Prompt框架与Thought
      - L2.2.5 Prompt框架与提示词
    • L2.3 流水线工程
      - L2.3.1 流水线工程的概念
      - L2.3.2 流水线工程的优点
      - L2.3.3 流水线工程的应用
    • L2.4 总结与展望

阶段3:AI大模型应用架构实践

  • 目标:深入理解AI大模型的应用架构,并能够进行私有化部署。
  • 内容
    • L3.1 Agent模型框架
      - L3.1.1 Agent模型框架的设计理念
      - L3.1.2 Agent模型框架的核心组件
      - L3.1.3 Agent模型框架的实现细节
    • L3.2 MetaGPT
      - L3.2.1 MetaGPT的基本概念
      - L3.2.2 MetaGPT的工作原理
      - L3.2.3 MetaGPT的应用场景
    • L3.3 ChatGLM
      - L3.3.1 ChatGLM的特点
      - L3.3.2 ChatGLM的开发环境
      - L3.3.3 ChatGLM的使用示例
    • L3.4 LLAMA
      - L3.4.1 LLAMA的特点
      - L3.4.2 LLAMA的开发环境
      - L3.4.3 LLAMA的使用示例
    • L3.5 其他大模型介绍

阶段4:AI大模型私有化部署

  • 目标:掌握多种AI大模型的私有化部署,包括多模态和特定领域模型。
  • 内容
    • L4.1 模型私有化部署概述
    • L4.2 模型私有化部署的关键技术
    • L4.3 模型私有化部署的实施步骤
    • L4.4 模型私有化部署的应用场景

辅助学习书籍PDF资源:

在这里插入图片描述
在这里插入图片描述

学习计划:

  • 阶段1:1-2个月,建立AI大模型的基础知识体系。
  • 阶段2:2-3个月,专注于API应用开发能力的提升。
  • 阶段3:3-4个月,深入实践AI大模型的应用架构和私有化部署。
  • 阶段4:4-5个月,专注于高级模型的应用和部署。
    请根据您的个人进度和时间安排,适当调整学习计划。记得在学习过程中,理论与实践相结合,不断进行项目实践和反思,以加深理解和技能的掌握。

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

😝有需要的小伙伴,可以Vx扫描下方二维码免费领取🆓

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/11284.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Github 2024-05-09 Go开源项目日报 Top10

根据Github Trendings的统计,今日(2024-05-09统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目10Gin Web框架:高性能的Go HTTP框架 创建周期:3496 天开发语言:Go协议类型:MIT LicenseStar数量:73548 个Fork数量:7831 次关注人数…

信创应用软件之国产邮箱

信创应用软件之国产邮箱 文章目录 信创应用软件之国产邮箱采用信创邮箱的必要性信创邮箱采购需求国产邮箱业务形态国产邮箱代表性品牌CoremailRichmail安宁eyouUMail拓波 邮件安全的发展阶段 采用信创邮箱的必要性 邮箱是天然的数据存储空间,党政和央国企客户在使用…

软件3班20240513

java.util.PropertyResourceBundle4554617c package com.yanyu;import java.sql.*; import java.util.ResourceBundle;public class JDBCTest01 {public static void main(String[] args) throws SQLException { // 获取属性配置文件ResourceBundle bundle Res…

高效文件管理:一键批量修改文件名,并统一转换为大写扩展名

在现代社会中,无论是个人还是企业,我们都需要处理大量的文件。有效的文件管理不仅能提高我们的工作效率,还能确保数据的完整性和安全性。其中,批量修改文件名和扩展名是一种常用的文件管理方式,本文将详细介绍云炫文件…

[已解决]Linux挂载新硬盘到已有目录下(CentOS7)

首先总结下用到的命令: fdisk -l mount / unmountdf -hT / df -lhmkfs -t ext4 / mkfs -t ext3cp -amv aaa bbb 具体步骤: 挂载物理硬盘/虚拟硬盘到linux主机或者linux虚拟主机上;fdisk -l查看是否成功挂载; fdisk /dev/sdc 初…

【Qt】之【CMake】Error : The source.. does not match the soused

QT中cmak编译出现CMake Error: The source… does not match the soused 分析 前提是该项目是从另一个路径的项目复制过来的,编写代码时发现无论怎样修改代码,运行后都没有任何变化,以为是qtbug,重构重启都没用,最后…

websevere服务器从零搭建到上线(三)|IO多路复用小总结和服务器的基础框架

文章目录 epollselect和poll的优缺点epoll的原理以及优势epoll 好的网络服务器设计Reactor模型图解Reactor muduo库的Multiple Reactors模型 epoll select和poll的优缺点 1、单个进程能够监视的文件描述符的数量存在最大限制,通常是1024,当然可以更改数…

Spring底层入门(十一)

1、条件装配 在上一篇中,我们介绍了Spring,Spring MVC常见类的自动装配,在源码中可见许多以Conditional...开头的注解: Conditional 注解是Spring 框架提供的一种条件化装配的机制,它可以根据特定的条件来控制 Bean 的…

什么是分库分表

读写分离主要应对的是数据库读并发,没有解决数据库存储问题。试想一下:如果 MySQL 一张表的数据量过大怎么办? 答案当然是分库分表 什么是分库? 分库 就是将数据库中的数据分散到不同的数据库上,可以垂直分库,也可…

windows通过sftp对Linux服务器进行上传下载

前言 通过简单高效的方式可以在没有远程连接软件的情况下对服务器进行上传下载。 方法 Windows下打开cmd命令行,输入sftp 用户名IP 上传下载命令 #上传文件,如果需要上传文件夹则 put -r 文件路径 上传到路径 sftp> put E:\clash-verge_1.6.2_a…

把3D模型加载到网页上需要什么技术?

要将3D模型加载到网页上并实现交互展示需求(比如点击模型弹出一个窗口或控制模型的材质等),可以使用以下几种技术: 1、Three.js:这是一个非常流行的JavaScript库,用于在网页上渲染和显示3D图形。它支持多种…

基于svm的水果识别

1、程序界面介绍 该程序GUI界面包括待检测水果图片加载、检测结果输出、清空可视化框等。其中包括训练模型、加载图片、重置、识别检测按钮。 程序GUI界面 识别玉米识别西瓜 分类器识别水果基本原理: 由于每种水果的外形存在很大差异,比如西瓜与玉米&…

Hive-表设计优化

Hive-表设计优化 1.Hive查询基本原理 Hive的设计思想是通过元数据解析描述将HDFS上的文件映射成表。 基本的查询原理是当用户通过HQL语句对Hive中的表进行复杂数据处理和计算时,默认将其转换为分布式计算MapReduce程序对HDFS中的数据进行读取处理的过程。 当执行…

软件设计师笔记(二)-零碎要点

本文内容来自笔者学习zst 留下的笔记,都是零碎的要点,查缺补漏,若有错误请大家提出,希望大家都能通过,记得加上免费的关注!谢谢! 文章编辑于:2024-5-13 13:42:56 目录 1. 算法 [广…

【什么是范数】L1、L2范数介绍

一、 什么是范数 范数(Norm)是数学中用于衡量向量大小(或距离)的一种概念。在几何和代数中,范数可以提供一个向量长度或大小的量度。更正式地说,范数是一个函数,它将向量的集合映射到非负实数,满足以下性质…

社交媒体数据恢复:陌陌

确保你的手机已经进行了备份。备份可以提高数据恢复的成功率。 在电脑上下载并安装数据恢复软件。在使用软件进行恢复之前,请确保你的安卓手机已经在开发者选项中开启了USB调试模式。 使用USB数据线将手机连接至电脑。打开数据恢复软件,选择“陌陌聊天…

毕业论文写作神器:使用Latex写论文 安装texlive+texstudio 并添加IEEE模板

听说Latex写论文方便,更改格式方便,而且颜值高 LexLive2024安装 清华镜像网址:Index of /CTAN/systems/texlive/Images/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 下载完双击打开texlive2024.iso,然后点击 修改路径&#xf…

面试宝典(2)——缓存篇(Redis)

面试宝典(2)——缓存篇(Redis) 1.Redis的主要用途有哪些? 缓存分布式锁:setnx,redisson消息队列,延迟队列 2.什么是缓存穿透? 查询一个不存在的数据,数据…

C++入门指南(中)

目录 ​编辑 一、C关键字(C98) 二、命名空间 2.1 域 2.2 命名空间域 2.1 命名空间定义 2.2 命名空间使用 三、C输入&输出 四、缺省参数 4.1 缺省参数概念 4.2 缺省参数分类 五、函数重载 5.1 函数重载概念 5.2 C支持函数重载的原理--名字修饰(name Mangling)…

告别黑板粉笔 高新技术进课堂 未来教室会成什么

现在,全国许多院校都经过引进信息化技能,完成智慧校园建造,推进教育均衡展开。一些校园的小学教室的信息化配备投入经费已达50万元/每间,初中是70万元,高中是90万元。这些新技能的投入运用有用的共享教育内容、精准地分…