深度学习笔记之BERT(三)RoBERTa
深度学习笔记之RoBERTa
- 引言
- 回顾:BERT的预训练策略
- RoBERTa训练过程分析
- 静态掩码与动态掩码的比较
- 模型输入模式与下一句预测
- 使用大批量进行训练
- 使用Byte-pair Encoding作为子词词元化算法
- 更大的数据集和更多的训练步骤
- RoBERTa配置
引言
本节将介绍一种基于 BERT \text{BERT} BERT改进优化的预训练方法—— RoBERTa \text{RoBERTa} RoBERTa。
回顾:BERT的预训练策略
BERT \text{BERT} BERT的预训练策略包含两个:
-
掩码语言模型训练 ( Masked Language Model,MLM ) (\text{Masked Language Model,MLM}) (Masked Language Model,MLM):将句子中一部分词语进行掩码标记,即使用 [ MASK ] [\text{MASK}] [MASK]对被掩码的词语进行替换。并将掩码部分的长度控制在总句子长度的 15 15 15%。对于一个已被预期处理的示例句子:
[ [ CLS ] , P a r i s , i s , a , b e a u t i f u l , c i t y , [ SEP ] , I , l o v e , P a r i s ] [[\text{CLS}],Paris,is,a,beautiful,city,[\text{SEP}],I,love,Paris] [[CLS],Paris,is,a,beautiful,city,[SEP],I,love,Paris]
掩码标记后的结果示例为:
[ [ CLS ] , P a r i s , i s , a , [ MASK ] , c i t y , [ SEP ] , I , l o v e , [ MASK ] ] [[\text{CLS}],Paris,is,a,[\text{MASK}],city,[\text{SEP}],I,love,[\text{MASK}]] [[CLS],Paris,is,a,[MASK],city,[SEP],I,love,[MASK]]
即便在 BERT \text{BERT} BERT中使用80-10-10规则对 BERT \text{BERT} BERT的预训练进行泛化,但实际上它依然是静态掩码:这些工作均是在数据预处理部分执行的,在训练过程中,每个 [ MASK ] [\text{MASK}] [MASK]部分在句子中的位置是固定的。 -
下句预测 ( Next Sentence Prediction,NSP ) (\text{Next Sentence Prediction,NSP}) (Next Sentence Prediction,NSP):样本集是由两个连接的文档片段 Segment-1,Segment-2 \text{Segment-1,Segment-2} Segment-1,Segment-2组成,并以 50 50 50%的概率:
- 在同一文档中连续采样;
- 不同的文档中采样;
并对采样结果 Segment-1,Segment-2 \text{Segment-1,Segment-2} Segment-1,Segment-2对应的如下格式中:
[ [ CLS ] , Segment-1 , [SEP] , Segment-2 , [SEP] ] [[\text{CLS}],\text{Segment-1},\text{[SEP]},\text{Segment-2},\text{[SEP]}] [[CLS],Segment-1,[SEP],Segment-2,[SEP]]
[ CLS ] [\text{CLS}] [CLS]对应的 BERT \text{BERT} BERT输出 R [CLS] \mathcal R_{\text{[CLS]}} R[CLS]使用 Softmax \text{Softmax} Softmax进行二分类(有关联/无关联)任务。
RoBERTa训练过程分析
静态掩码与动态掩码的比较
对于 BERT \text{BERT} BERT这种现象, RoBERTa \text{RoBERTa} RoBERTa先采用复制数据的方法进行补救:
- 将一个句子复制 10 10 10份,并将 10 10 10个句子进行随机掩码标记:
S 1 : [ [ CLS ] , P a r i s , i s , a , [ MASK ] , c i t y , [ SEP ] , I , l o v e , [ MASK ] ] S 2 : [ [ CLS ] , P a r i s , [ MASK ] , a , b e a u t i f u l , c i t y , [ SEP ] , I , l o v e , P a r i s ] ⋮ S 10 : [ [ CLS ] , [ MASK ] , i s , a , b e a u t i f u l , [ MASK ] , [ SEP ] , I , l o v e , P a r i s ] \begin{aligned} & \mathcal S_1:[[\text{CLS}],Paris,is,a,[\text{MASK}],city,[\text{SEP}],I,love,[\text{MASK}]] \\ & \mathcal S_2:[[\text{CLS}],Paris,[\text{MASK}],a,beautiful,city,[\text{SEP}],I,love,Paris] \\ & \quad \vdots \\ & \mathcal S_{10}:[[\text{CLS}],[\text{MASK}],is,a,beautiful,[\text{MASK}],[\text{SEP}],I,love,Paris] \end{aligned} S1:[[CLS],Paris,is,a,[MASK],city,[SEP],I,love,[MASK]]S2:[[CLS],Paris,[MASK],a,beautiful,city,[SEP],I,love,Paris]⋮S10:[[CLS],[MASK],is,a,beautiful,[MASK],[SEP],I,love,Paris] - 对模型进行 40 Epoch \text{40 Epoch} 40 Epoch的全数据遍历训练,在每个 Epoch \text{Epoch} Epoch训练中,句子被掩盖标记都不同:
Epoch 1: S 1 Epoch 2: S 2 ⋮ Epoch 10: S 10 Epoch 11: S 1 Epoch 12: S 2 ⋮ Epoch 40: S 10 \begin{aligned} & \text{Epoch 1:} \quad \mathcal S_1 \\ & \text{Epoch 2:} \quad \mathcal S_2 \\ & \quad \vdots \\ & \text{Epoch 10:} \quad \mathcal S_{10} \\ & \text{Epoch 11:} \quad \mathcal S_{1} \\ & \text{Epoch 12:} \quad \mathcal S_{2} \\ & \quad \vdots \\ & \text{Epoch 40:} \quad \mathcal S_{10} \\ \end{aligned} Epoch 1:S1Epoch 2:S2⋮Epoch 10:S10Epoch 11:S1Epoch 12:S2⋮Epoch 40:S10
这相当于每一种 MASK \text{MASK} MASK模式被执行了 4 4 4次。虽然这种方法起到很好的泛化作用,但其本质上依然是静态掩码。
而动态掩码并没有在预处理阶段对数据进行 MASK \text{MASK} MASK,而是将数据导入模型过程中进行随机 MASK \text{MASK} MASK。这与上面复制数据的方法相比,它的泛化性更强。因为尤其在训练的 Epoch \text{Epoch} Epoch较大时,静态掩码由于会使同一份掩码结果训练多次,导致在训练过程中机械地记住这个规律。
下面是原文中静态掩码与动态掩码在同一任务中的对比情况。在一些任务中,动态掩码的效果略优于静态掩码。
模型输入模式与下一句预测
BERT \text{BERT} BERT中的 NSP \text{NSP} NSP任务旨在句子层面有更优秀的理解,因此 RoBERTa \text{RoBERTa} RoBERTa针对 NSP \text{NSP} NSP任务设计了几种训练格式,来验证 NSP \text{NSP} NSP策略是否有效:
- Segment-pair +NSP: \text{Segment-pair +NSP:} Segment-pair +NSP: 原始 BERT \text{BERT} BERT使用的模式,其中每个段落 ( Segment ) (\text{Segment}) (Segment)中可能包含多个句子 ( Sentence ) (\text{Sentence}) (Sentence),但 Token \text{Token} Token总长度小于 512 512 512。
- Sentence-pair + NSP: \text{Sentence-pair + NSP:} Sentence-pair + NSP: 将输入段落对改为句子对,正负样本的采样方式分别是从文档中连续采样和文档中单独采样。由于输入句子对 Token \text{Token} Token长度明显小于 512 512 512,因而通过增加 Batch size \text{Batch size} Batch size使 Token \text{Token} Token总量与 Segment-pair \text{Segment-pair} Segment-pair相似,并保留了 NSP \text{NSP} NSP策略。
- Full-sentence: \text{Full-sentence:} Full-sentence: 从一个/多个文档中采样出连续的完整句子, Token \text{Token} Token总长度不超过 512 512 512,并且允许超出文档边界。超出文档边界是指:当采样达到一个文档的末尾时,可以从下一个文档中继续进行采样作为该输入的一部分,但需要在文档之间加入一个额外分隔符,并且该实验删除了 NSP \text{NSP} NSP策略。
- Doc-sentence: \text{Doc-sentence:} Doc-sentence: 与 Full-sentence \text{Full-sentence} Full-sentence采样方式相似,但是不允许超出文档边界。相比于 Full-sentence \text{Full-sentence} Full-sentence,它的 Token \text{Token} Token长度有可能偏少,因此同样通过增加 Batch size \text{Batch size} Batch size使 Token \text{Token} Token总量与 Full-sentence \text{Full-sentence} Full-sentence相似,并同样删除了 NSP \text{NSP} NSP策略。
下面是原文对四种训练格式在若干任务中的效果:
- 比较使用 NSP \text{NSP} NSP策略的 Segment-pair \text{Segment-pair} Segment-pair和 Sentence-pair \text{Sentence-pair} Sentence-pair格式,发现使用 Segment \text{Segment} Segment效果明显由于 Sentence \text{Sentence} Sentence,原因可能是模型很难从单句中学习到长依赖关系。
- 对使用 NSP \text{NSP} NSP策略和未使用 NSP \text{NSP} NSP的角度进行比较,发现:删除 NSP \text{NSP} NSP策略能够略微提高下游任务的性能
- Doc-sentence \text{Doc-sentence} Doc-sentence略优于 Full-sentence \text{Full-sentence} Full-sentence。但由于 Doc-sentence \text{Doc-sentence} Doc-sentence长度不固定,导致 Batch size \text{Batch size} Batch size存在变化,因而后续实验均使用 Full-sentence \text{Full-sentence} Full-sentence格式进行比较。
使用大批量进行训练
原始 BERT \text{BERT} BERT使用 Batch size=256 \text{Batch size=256} Batch size=256进行训练,训练步骤数量为 1M \text{1M} 1M。在保持总计算量基本不变的情况下,将 Batch size \text{Batch size} Batch size由 256 256 256扩展至 2K,8K \text{2K,8K} 2K,8K;对应训练步骤缩减至 125K,31K \text{125K,31K} 125K,31K;并相应地调整学习率 ( lr ) (\text{lr}) (lr):
可以发现: Batch size \text{Batch size} Batch size为 2K \text{2K} 2K时表现效果最好。但考虑到并行更容易,作者均选择 8K \text{8K} 8K作为后续实验的 Batch size \text{Batch size} Batch size。
使用Byte-pair Encoding作为子词词元化算法
RoBERTa \text{RoBERTa} RoBERTa并没有使用 Unicode \text{Unicode} Unicode作为子词次元 ( Subword Unit ) (\text{Subword Unit}) (Subword Unit),而是使用 Bytes \text{Bytes} Bytes进行替代。这种方式可以编码任何输入文本,并且不会引入任何 Unknown \text{Unknown} Unknown标记,这会使 Vocab size \text{Vocab size} Vocab size变得更大,参数更多 ( 30 K ⇒ 50 K ) (30\text{K} \Rightarrow 50\text{K}) (30K⇒50K)。
以句子: It was a great day \text{It was a great day} It was a great day为例,对应 RoBERTa \text{RoBERTa} RoBERTa模型的标记结果如下:
[ it , G ˙ was , G ˙ a , G ˙ great , Gday ˙ ] [\text{it},\dot{\text{G}}\text{was},\dot{\text{G}}\text{a},\dot{\text{G}}\text{great},\dot{\text{G}\text{day}}] [it,G˙was,G˙a,G˙great,Gday˙]
其中 G ˙ \dot{\text{G}} G˙表示一个空格, RoBERTa \text{RoBERTa} RoBERTa词元分析其将所有空格替换为 G ˙ \dot{\text{G}} G˙字符。再以一个句子为例: I had a sudden epiphany \text{I had a sudden epiphany} I had a sudden epiphany(我灵光一闪):
[ I , G ˙ had , G ˙ a , G ˙ sudden , G ˙ ep , iphany ] [\text{I},\dot{\text{G}}\text{had},\dot{\text{G}}\text{a},\dot{\text{G}}\text{sudden},\dot{\text{G}}\text{ep},\text{iphany}] [I,G˙had,G˙a,G˙sudden,G˙ep,iphany]
这种标注结果是因为:未从词表中找到单词 epiphany \text{epiphany} epiphany,从而将其拆解未 ep \text{ep} ep和 iphany \text{iphany} iphany两部分。
更大的数据集和更多的训练步骤
RoBERTa \text{RoBERTa} RoBERTa延用了 BERT-large \text{BERT-large} BERT-large结构 ( L=24,A=16,H=1024 ) (\text{L=24,A=16,H=1024}) (L=24,A=16,H=1024),在 Batch size \text{Batch size} Batch size固定为 8K \text{8K} 8K的情况下,作者进行一系列对比实验:
有点降维打击的意思~数据量大意味着信息更丰富,效果好也在情理之中~
可以发现:
- 即便没有增加数据, RoBERTa \text{RoBERTa} RoBERTa依旧比 BERT-large \text{BERT-large} BERT-large结果优秀。当然总计算量增加了很多 ( Batch size=8K,steps:31K ⇒ 100 K ) (\text{Batch size=8K,steps:31K} \Rightarrow 100\text{K}) (Batch size=8K,steps:31K⇒100K),但这并没有带来过拟合的问题。
- 在训练数据基础上加上 additional Data \text{additional Data} additional Data效果进一步提升;
- 训练过程很稳定:即便 steps=500K \text{steps=500K} steps=500K,依然没有出现过拟合的现象。
RoBERTa配置
综合上面的比对结果,作者给出 RoBERTa \text{RoBERTa} RoBERTa的基本配置:
- 动态掩码;
- 策略: Full-sentence without NSP \text{Full-sentence without NSP} Full-sentence without NSP;
- 更大的 Batch size \text{Batch size} Batch size;
- 使用更大 Vocab size \text{Vocab size} Vocab size,字节级别的 Byte-pair Encoding \text{Byte-pair Encoding} Byte-pair Encoding进行训练
- 训练过程中使用更多的 steps \text{steps} steps和 additional Data \text{additional Data} additional Data;
在 GLUE,SQuAD,RACE \text{GLUE,SQuAD,RACE} GLUE,SQuAD,RACE等任务中的表现结果如下:
- GLUE \text{GLUE} GLUE
- SQuAD \text{SQuAD} SQuAD
- RACE \text{RACE} RACE
Reference \text{Reference} Reference:
论文链接
《BERT基础教程——Transformer大规模实战》
相关文章:
深度学习笔记之BERT(三)RoBERTa
深度学习笔记之RoBERTa 引言回顾:BERT的预训练策略RoBERTa训练过程分析静态掩码与动态掩码的比较模型输入模式与下一句预测使用大批量进行训练使用Byte-pair Encoding作为子词词元化算法更大的数据集和更多的训练步骤 RoBERTa配置 引言 本节将介绍一种基于 BERT \t…...
C++知识点总结(59):背包型动态规划
背包型动态规划 一、背包 dp1. 01 背包(限量)2. 完全背包(不限量)3. 口诀 二、例题1. 和是质数的子集数2. 黄金的太阳3. 负数子集和4. NASA的⻝物计划 一、背包 dp 1. 01 背包(限量) 假如有这几个物品&am…...
C++:反向迭代器的实现
反向迭代器的实现与 stack 、queue 相似,是通过适配器模式实现的。通过传入不同类型的迭代器来实现其反向迭代器。 正向迭代器中,begin() 指向第一个位置,end() 指向最后一个位置的下一个位置。 代码实现: template<class I…...
webGL入门教程_04vec3、vec4 和齐次坐标总结
vec3、vec4 和齐次坐标总结 1. vec3 和 vec4 1.1 什么是 vec3 和 vec4? vec3: GLSL 中的三维向量类型,包含 3 个浮点数:(x, y, z)。常用于表示三维坐标、RGB 颜色、法线、方向等。 vec4: GLSL 中的四维向量类型&…...
uniapp中父组件数组更新后与页面渲染数组不一致实战记录
简单描述一下业务场景方便理解: 商品设置功能,支持添加多组商品(点击添加按钮进行增加).可以对任意商品进行删除(点击减少按钮对选中的商品设置进行删除). 问题: 正常添加操作后,对已添加的任意商品删除后,控制台打印数组正常.但是与页面显示不一致.已上图为例,选中尾…...
优化 Conda 下载速度:详细的代理配置和网络管理策略
优化 Conda 下载速度:详细的代理配置和网络管理策略 为了彻底解决使用 Conda 下载 PyTorch 时遇到的速度问题,并确保下载过程稳定可靠,这需要一个详细、综合的技术方案。让我们更深入地分析问题原因,然后详尽地解释采取的解决策略…...
服务器遭受DDoS攻击后如何恢复运行?
当服务器遭受 DDoS(分布式拒绝服务)攻击 后,恢复运行需要快速采取应急措施来缓解攻击影响,并在恢复后加强防护以减少未来攻击的风险。以下是详细的分步指南: 一、应急处理步骤 1. 确认服务器是否正在遭受 DDoS 攻击 …...
MFC音视频播放器-支持电子放大等功能
前言 本播放器在VS2019下开发,使用ffmpegD3D实现视频播放渲染功能。同时本播放器支持录像功能、截图功能、音视频播放功能、码流信息显示、电子放大功能等。D3D的渲染同时支持surface和texture两种方式,电子放大功能是在D3D Texture方式下进行实现。以下…...
c语言编程1.17蓝桥杯历届试题-回文数字
题目描述 观察数字:12321,123321 都有一个共同的特征,无论从左到右读还是从右向左读,都是相同的。这样的数字叫做:回文数字。 本题要求你找到一些5位或6位的十进制数字。满足如下要求: 该数字的各个数位之…...
el-table 纵向 横向 多级表头
<el-table :data"tableData" class"diaTable":span-method"handleSpanMethod"border:header-cell-style"{background:#292929,color:#fff}"><!-- 纵向表头 --><el-table-column label"纵向表头" width"…...
uniapp开发微信小程序笔记8-uniapp使用vant框架
前言:其实用uni-app开发微信小程序的首选不应该是vant,因为vant没有专门给uni-app设置专栏,可以看到目前Vant 官方提供了 Vue 2 版本、Vue 3 版本和微信小程序版本,并由社区团队维护 React 版本和支付宝小程序版本。 但是vant的优…...
分布式项目使用Redis实现数据库对象自增主键ID
hello。大家好,我是灰小猿,一个超会写bug的程序猿! 在分布式项目中,数据表的主键ID一般可能存在于UUID或自增ID这两种形式,UUID好理解而且实现起来也最容易,但是缺点就是数据表中的主键ID是32位的字符串&a…...
npm-运行项目报错:A complete log of this run can be found .......npm-cache_logs\
1.问题 没有找到对应的某种依赖,node_modules出现问题。 2.解决 (1)查看对应依赖是否引入或者是由于合并分支错误 引入js或依赖不存在。谨慎删除依赖包 (2)查找对应引入依赖进行安装最后解决方法-删除依赖包清除缓存 npm cache clean --force (2)重新向同事引入…...
SolarCube: 高分辨率太阳辐照预测基准数据集
太阳能作为清洁能源在减缓气候变化中的作用日益凸显,其稳定的供应对电网管理至关重要。然而,太阳辐照受云层和天气变化的影响波动较大,给光伏电力的管理带来挑战,尤其是在调度、储能和备用系统管理方面。因此,精确的太…...
华为小米苹果三星移动设备访问windows共享文件夹windows11
如果移动设备和windows电脑都在同一个局域网内,可以用移动设备访问windows11的共享文件夹 1、设置共享文件夹 2、添加everyone用户即可 3、查看ip地址 4、在华为手机上点击文件管理,里面有个网上邻居 5、正常情况下,华为手机会扫描到同一局域…...
网络安全三防指南:只防病毒不安全
5月17日,瑞星全球反病毒监测网截获一个恶性病毒,由于该病毒的破坏能力和当年著名的CIH病毒几乎完全一样,因此瑞星将该病毒命名为“新CIH”病毒。被“新CIH”感染的电脑,主板和硬盘数据将被破坏,致使电脑无法启动&#…...
论文概览 |《Urban Analytics and City Science》2023.05 Vol.50 Issue.4
本次给大家整理的是《Environment and Planning B: Urban Analytics and City Science》杂志2023年5月第50卷第4期的论文的题目和摘要,一共包括19篇SCI论文! 论文1 Data analytics and sustainable urban development in global cities 全球城市的数据…...
【ROS2】ROS2 C++版本 与 Python版本比较
ROS 系列学习教程(总目录) ROS2 系列学习教程(总目录) 目录 一、功能包的构建方式二、功能包组织结构三、代码编写四、性能与效率五、兼容性六、应用场景 目前ROS开发主要使用 C 和 Python 语言,这里会分别实现并讲解。 相较于ROS1,ROS2的 C 和 Python …...
物联网射频识别和RFID开发(一):RFID基础—概念、应用
一、RFID的发展历史 二、RFID与物联网 (一)物联网与RFID的关系 物联网的基本思想是美国麻省理工学院在1999年提出的,其核心思想是为全球每个物品提供唯一的电子标识符。这种电子标识符就是现在经常提到的“电子产品编码(Electronic Product …...
JVM:即时编译器,C2 Compiler,堆外内存排查
1,即时编译器 1.1,基本概念 常见的编译型语言如C,通常会把代码直接编译成CPU所能理解的机器码来运行。而Java为了实现“一次编译,处处运行”的特性,把编译的过程分成两部分,首先它会先由javac编译成通用的…...
webpack5 的五大核心配置(二)
webpack主要构成部分: entry 入口output 出口loaders 转化器plugins 插件mode 模式devServer 开发服务器 webpack.config.js 配置文件基本格式 module.exports{//入口文件entry:{},//出口文件output:{},//module rules loadersmodule{};//插件plugins:[],//开发…...
【查询基础】.NET开源 ORM 框架 SqlSugar 系列
.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…...
git push使用
推送指定分支 将当前分支推送远程 git push origin HEAD:<branch-name> 这里的 HEAD 是一个特殊的指针,它指向当前分支的最新提交。这条命令会将当前分支的更改推送到远程的 master 分支。 示例 git push origin HEAD:main 当前分支是test,远…...
【iOS】多线程基础
【iOS】多线程基础 文章目录 【iOS】多线程基础前言进程与线程进程进程的状态进程的一个控制结构进程的上下文切换 线程为什么要用线程什么是线程线程和进程的关系线程的上下文切换 线程和进程的优缺点 小结 前言 笔者由于对于GCD不是很了解,导致了项目中网络请求哪…...
常用网站网址
目录 1.docker hub2.csdn 1.docker hub https://image.cgdcgd.cc/ 2.csdn https://www.csdn.net/ ...
go语言切片
切片 切片是一种数据结构,这种数据结构便于使用和管理数据集合。切片是围绕动态数组的概念构建的,可以按需自动增长和缩小。切片的动态增长是通过内置函数 append 来实现的。这个函数可以快速且高效地增长切片。还可以通过对切片再次切片来缩小一个切片的…...
鸿蒙NEXT元服务:利用App Linking实现无缝跳转与二维码拉起
【效果】 元服务链接格式(API>12适用):https://hoas.drcn.agconnect.link/ggMRM 【参考网址】 使用App Linking实现元服务跳转:文档中心 草料二维码:草料二维码生成器 【引言】 本文将详细介绍如何使用App Lin…...
网络药理学之薛定谔Schrödinge Maestro:6、分子对接(Glide、Ligand docking)和可视化
本人是win11,薛定谔版本是12.9。 官网:https://www.schrodinger.com/ 本篇文章的示例大分子蛋白PDB ID为4KNN,小分子配体的MOL ID为MOL004004。 本文部分图源来自知乎https://zhuanlan.zhihu.com/p/416698194,推荐为原作者贡献阅读…...
已解决ModuleNotFoundError: No module named ‘selenium‘
1. 错误提示 ModuleNotFoundError: No module named selenium,这意味着你试图导入一个名为 selenium 的模块,但Python找不到这个模块 2. 解决方案 安装缺失的模块: 如果你确定模块名称正确但仍然收到这个错误,那么可能是你没有安装这个模块…...
【Maven】依赖冲突如何解决?
准备工作 1、创建一个空工程 maven_dependency_conflict_demo,在 maven_dependency_conflict_demo 创建不同的 Maven 工程模块,用于演示本文的一些点。 什么是依赖冲突? 当引入同一个依赖的多个不同版本时,就会发生依赖冲突。…...
商城网站建设net2006/网站seo软件
Spring Cloud教程(非常详细) SpringCloud入门教程(全集) Spring Cloud 学习笔记(1 / 3) 狂神说SpringCloud学习笔记 史上最简单的 SpringCloud 教程 | 终章 史上最简单的 SpringCloud 教程 | 第一篇&a…...
东方热线宁波论坛/北京seo推广公司
子模块6 活动目录用户和计算机子模块6 活动目录用户和计算机 技能一 计算机账户的管理 任务一 建立计算机账户 任务二 查看修改计算机账户属性 任务三 停用和启用计算机账户 任务四 移动计算机账户 任务五 管理客户机 任务六 删除计算机账户 子模块6 活动目录用户和计算机 技能…...
中关村网站建设公司/网络优化培训
这里的电压环带宽,反应的是电压环响应指令能力。即输出电压跟踪指令电压的能力。 指令响应能力需要有一个指标来衡量,例如用输入阶跃指令来看输出的上升、超调等 或者用输入正弦指令看输出正弦分量与指令的幅度差和相位差,这就是我们说的带…...
绿色在线网站/服务营销的七个要素
...
淮安网站优化/东莞做网站哪个公司好
redis-cli - Command-line client to redis-server 2.1. Pub/Sub 订阅与发布 redis 提供基本的MQ 功能,下面我们做一个演示 开启第一个终端窗口,订阅first second $ redis-cli redis 127.0.0.1:6379> SUBSCRIBE first second Reading messages... (pr…...
ecshop网站建设方案书/引擎搜索大全
由于删除过程是只删除叶子节点,由于叶子节点删除后,非叶子节点可能会变为叶子节点,因此是一个后续遍历。 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* Tre…...