偏好对齐RLHF-OpenAI·DeepMind·Anthropic对比分析

OpenAI

  • paper: InstructGPT, Training language models to follow instructions with human feedback

  • paper: Learning to summarize from human feedback

  • Introducing ChatGPT

解密Prompt系列4介绍了InstructGPT指令微调的部分,这里只看偏好对齐的部分

样本构建

RL的数据来源有两块,一部分是用户在playground里面真实请求的数据,另一部分来自标注同学自己写的指令样本。标注指令样本包括3种形式:单一指令,few-shot指令,根据用户之前提交的使用场景编写的指令,量级分布如下

img

在标注偏好样本上,OpenAI基于3H原则,设计了详细的标注标准详见论文。需要注意的一点是在训练样本标注时Helpful比Harmless和honest更重要,但是在评估样本的标注上Harmless和honest更重要。这样区别标注是OpenAI发现Helpful和Harmless存在冲突,如果模型过度拟合无害性,会导致模型拒绝回答很多问题。OpenAI认为不同场景下风险的定义是不同的,应该把拒绝回答的能力放到下游场景中, 后面Anthropic也碰到了相似的问题,我个人更偏好Anthropic的方案。

在标注过程中,模型会生成4-7个回复,标注同学需要综合考虑有用性,无害性和真实性,对模型的每一个回复进行绝对打分后续用于评估,同时给出多个模型回复间的相对排序用于RM模型训练,标注界面如下:

img

img

ChatGPT对话训练部分未公开细节,从官网能获得细节是,ChatGPT的样本是人工写的对话样本+InstructGPT样本转换成对话格式的混合样本,更多基于对话形式的标注可以参考后面的DeepMind和Anthropic。

奖励模型

OpenAI使用了指令微调16个epoch的6B模型作为奖励模型的初始模型。训练方式是两两对比计算crossentropy,其中rθ是奖励函数对指令x和回复y的打分,如下

不过OpenAI发现如果对数据进行Shuffle,则训练一轮就会过拟合,但如果把针对1个指令模型的K个回复,K在4~9之间,得到的C2k2个pairwise对,放在一个batch里进行训练,会得到显著更高的准确率。这里一个batch包括64个指令生成的所有回复对,其中排名相同的样本对被剔除。

这里感觉和对比学习要用大batch_size进行拟合的思路有些相似,是为了保证对比的全面性和充分性,使用全面对比后计算的梯度对模型进行更新。另一个原因可能是不同标注人员之间的偏好差异,shuffle之后这种偏好差异带来的样本之间的冲突性更高。

之所以选择6B的模型,论文指出尽管175B的RM模型有更高的准确率和更小的验证集loss,但是训练过程并不稳定,以及太大的RM模型会导致RL部分的训练成本太高。

RLHF

  1. RL初始模型

OpenAI使用了SFT指令微调之后的模型作为RL的起点。RL初始模型的训练细节在附录C.3和E.8,基于GPT3的预训练模型,SFT微调2个epoch并混入10%的预训练数据进行训练得到。这里混入预训练是因为在RL微调的过程中发现加入预训练数据可以防止RL微调降低模型语言能力,因此在SFT微调过程中也做了相同的处理。这里我好奇的是,指令微调和预训练的核心差异其实只在指令输入的部分是否计算梯度,因此是否可以直接把指令微调和预训练混合变成一个步骤"文本+指令预训练",我们准备沿这个方向去尝试下~

  1. RL样本

OpenAI是完全基于在playground里用户真实提交的指令请求来进行训练,没有使用人工标注,为了完全面向用户使用进行偏好优化。

  1. RL训练

RL微调的部分,OpenAI使用了PPO算法,基于Reward模型的打分进行微调,微调了2个epoch。在此基础上加入了两个目标:

  • 微调模型和原始模型在token预测上的KL散度:避免模型过度拟合奖励函数偏离原始模型。后面也论证了KL的加入,可以加速RL收敛,核心是在相同的KL下最大化模型偏好的提升

  • 10%的预训练目标(PPO-PTX): 降低RL对模型语言能力的影响

img

且论文提到样本的收集和RL训练是多次迭代的,也就是使用RL微调后的模型上线收集更多的用户请求,重新训练RM,再更新模型。不停在优化后的模型上收集用户反馈,会让RM模型学习到更充分的高偏好样本,强者愈强。

  1. 效果

对比175B指令微调的模型,1.3B的模型经过RLHF微调,在喜爱度上就能打过175B的SFT模型!2点Insights如下

  • RLHF对齐带来的模型有用性的提升,效率远超训练更大的模型

  • 使用PPO-PTX的RLHF微调没有产生很大的Alignment-Tax

img

DeepMind

  • paper: Teaching language models to support answers with verified quotes

  • paper: Sparrow, Improving alignment of dialogue agents via

DeepMind的Sparrow使用了基于Google搜索的事实性信息的引入,这部分我们放到Agent调用的章节一起说,这里只关注偏好对齐的部分。

样本构建

不考虑搜索调用的部分,DeepMind的偏好对齐部分只关注2H,有用性和无害性。样本标注的基础模型是Chinchilla-70B,和OpenAI的差异在于,DeepMind把人类偏好和违反2H原则拆成了两个标注任务

  • 人类偏好标注:基于进行中的对话,从模型多个回复中选择最喜欢的一条,这里对话中的人机问答都是由模型生成的

img

  • 对抗标注/钓鱼执法:基于随机分配的标注规则,标注同学需要刻意引导模型给出违反该规则的回答,和风控红蓝对抗的思路相似

img

奖励模型

基于以上两份样本,论文通过微调Chinchilla-70B,分别训练了两个模型PM和RM, 微调的方式都是固定前64层,只微调后16层。

img

  1. PM:Preference Reward Model

PM的数据是在以上每轮对话多选一的基础上,从其他对话中随机采样更多的负样本构成的多分类任务,这里补充负样本是为了惩罚off-topic的模型回复。因此损失函数是多分类的CrossEntropy,以及在此基础上加入了Bradley-Taley(Elo)和正则项,如下

其中ri是所有回复的模型打分,因此正则项是为了保证最终模型输出的打分是以0为中心的。而Elo部分是为了优化两两对比排序,更多细节>>Fitting the Bradley-Terry model to large and potentially sparse datasets

  1. RM:Rule Violation Model

RM模型是一个多标签任务,判断对话当前是否违反其中一条标注规则,输出违反该规则的条件概率。以上5档标签被分成两类,definitely break和probably break]是违反,probably follow和definitely follow是未违反,unsure样本被丢弃。这里DeepMind使用如下Hard Prompt Tunning来构建模型,其实就是引入一些前置语义信息,让模型在小样本上表现更好。更多细节>>解密Prompt系列2. 冻结Prompt微调LM

img

  1. 整体打分

基于以上两个模型,整体打分=偏好打分+所有规则的未违反概率之和+长度惩罚(保证回答简洁)+is_valid(模板检查)。其中模板检查包括要求Agent回复以\n\nSparrow:开始,以\n\nUser:结束,保证所有模型回复有相同的格式

img

个人感觉分开标注,以及引导式的标注没啥问题,但分开建模再直接打分融合可能不一定是最优的方案,因为两个模型的scale不同,很难对比违反部分规则,和偏好程度要如何balance才是最优的整体打分。

RLHF

  1. RL起点:和OpenAI相同,DeepMmind也使用监督微调模型作为初始模型。不过DeepMind直接使用了以上RM的标注数据中,多选一标注有用的回复,和未违反规则的回复来进行监督微调。

  2. RL样本

对比OpenAI使用纯人机对话的样本,DeepMind的RL的样本来源包括以下四个部分

  • 问题集:GopherCite的Eli5子集

  • 人机对话:以上RM和PM的人机对话的样本集

  • 对抗样本扩充:使用Prompt模板引导Sparrow生成有害问题,扩充有害对话样本

  • self-play:类似self-instruct,会采样已有对话作为上下文,让sparrow继续生成回复

  1. RL训练

DeepMind使用了Actor-Critic算法进行RL微调, RL算法我们会单独一章来讲,整体上A2C可能略弱于PPO。除了算法不同,DeepMind的RL微调也只微调Chinchilla模型的后16层。

都选择微调16层,其实是为了节省训练显存,这样PM,RM,初始SFT模型,和最终的RL微调模型都共享前64层,后16层通过不同head来实现,从而达到降低显存占用的目的。

img

  1. Insight:偏好和遵守规则的矛盾统一

人类偏好和遵守规则的要求存在一定冲突,只使用更偏好的数据训练会得到更高的规则违反率,只使用遵守规则的数据训练会降低模型回复的偏好率,混合样本的微调效果最好。

Anthropic

  • paper: Red Teaming Language Models to Reduce Harms Methods,Scaling Behaviors and Lessons Learned

  • paper: A General Language Assistant as a Laboratory for Alignment

  • paper:Training a Helpful and Harmless Assistant with Reinforcement Learning from Human Feedback

  • 数据:https://huggingface.co/datasets/Anthropic/hh-rlhf

样本构建

从论文标题不难看出,Anthropic也只考虑了2H,有害性和有用性。并且着重研究了对抗有害样本的生成,受限于篇幅这里不展开。我个人也更偏好2H,因为我始终没太想明白Honesty如何能通过对齐实现。因为部分非事实性是来自预训练样本中的噪声,例如预训练样本中是"鲲之大一锅炖不下",如何通过对齐让模型学到"鲲之大,不知其几千里也"?部分非事实性来自训练样本的有限性,需要像Bing一样通过引入实时信息来解决,要是大家有不一样的观点也欢迎留言评论。

同样是拆分了2个标注任务,和DeepMind的差异是,Anthropic是把有害性和有用性分成了两个标注任务,针对开放的对话主题进行4轮左右的对话。

  • 有害性标注:和DeepMind相同使用了红蓝对抗的方案,目标是引导模型生成有害回复。每一轮模型会生成2个回答,选择更有害的一个

img

  • 有用性标注:同样是每轮2选一,选择更有帮助的一条回复,并不强制进行事实性检查

img

对抗/引导式的数据标注方式,对比OpenAI直接标注,可以更充分挖掘偏好中更有用和更有害的数据,对于解决模型安全性有更大的帮助,但感觉可能缺少中间部分偏好的样本,如果能和OpenAI直接标注的方案结合是否会更好?

除了2H的任务分开标注之外,每个标注同学进行对话的模型虽然都是52B的模型,但会随机来自3个不同版本的模型

  • HHH Context-Ditill:类似3Hprompt(helpful,harmless, honest)加持的基础模型,最初只有这个模型

  • Rejection Sampling(RS):使用3H模型生成16个回复,使用训练后的PM模型对结果排序,选择有害性最小的2个回复

  • RLHF微调后的模型:后续的数据收集会基于微调后多个版本的模型持续进行

奖励模型

Anthropic的奖励模型同样是基于样本排序进行训练的,有用得分高于无用,无害得分高于有害,并且更详细论证了相对排序模型的效果要好于二分类模型,要好于语言模型。

为了降低对微调数据的需求,Anthropic加入了Preference Model Pretraining(PMP)的继续预训练过程,使用Reddit, StackExchange等开源问答的数据让模型先部分学习什么是好的什么是坏的回答。

除此之外Anthropic还讨论了PM模型大小对模型稳健性的影响。通过把数据集一分为二,一半训练,一半验证,越稳健的PM模型应该在不同数据上有相似的打分分布。论文使用PM模型在两份数据上打分的KL散度来衡量稳定性,得到两个结论

  • PM模型越大,KL散度越低

  • PM模型打分在低分区一致性较高,在高分区一致性较低

第二个结论很符合直觉,因为有害内容的标注一致性更高更易识别,而优质回复的评价更模糊,另一个原因是模型当前的能力可能导致高分区的样本比较稀疏。

但第一个结论,感觉有可能是因为越大的模型预测的置信度越高,打分更容易聚集在一起,才导致的KL散度更低,这个置信度的差异似乎没有被考虑进去。

RLHF

  1. RL起点

Anthropic选择了3H Context Distillation的模型,通过在样本前加入3H指令词,引导模型生成更安全有用的回复,并记录模型生成的每个位置Top50的词和概率,把这个概率作为Teacher;然后去掉3H指令词,对预训练模型进行微调,微调目标就是去拟合之前有3H时Top50 Token的预测概率,其实就是Teacher-Student蒸馏的思路。

  1. RL样本

为了让模型在更大范围的指令样本上进行偏好学习,使用了Self-Instruct,随机采样10个已有的真实请求让模型来生成新的请求,最终是137K真实请求和369K模型生成请求混合作为训练样本

  1. RL训练:整体和openAI类似

和OpenAI相同,Anthropic也提到了online iter训练,但论文的出发点是前面提到的PM模型在高分部分不稳定的问题。因为微调后的模型生成的回复会更好,在更优的模型中持续收集样本,可以持续补充高分样本。注意这里的online和常规意义的online不同,这里每次训练会混合多个snapshot模型收集的偏好数据和最初的偏好样本,重头训练PM,并重新微调RLHF。

  1. Insight:有用性和无害性的矛盾统一

和OpenAI相似,Anthropic也举报了有用性和无害性的标注矛盾。在RLHF微调过程中,只要用户的请求有轻微不满,模型就让用户去看医生哈哈哈哈~其实我们在不充分微调的ChatGLM中也发现了类似的现象。经过分析模型是过度拟合了有害性,而对有用性欠拟合,导致模型虽然无害但也没啥用

论文给出了的解决思路是遇到有害性请求,模型只学到拒绝回答是很简单的,这就是无用但无害,但是如果模型能学到在拒绝回答的同时,给到拒绝的原因,并劝说用户不要有类似的有害的请求的话,就是有用且无害了。这部分标注数据当前是缺失的。 个人感觉这个思路比OpenAI适配场景去拒绝请求,似乎可行性更高一些。不过论文没有重新标样本,而是选择了折中的方案,加入更大比例Helpful样本来提升模型有用性

对比总结

  • paper: Scaling Laws for Reward Model Over optimization

  • paper: WebGPT: Browser-assisted question-answering with human feedback

  • Measuring Goodhart’s law

粗略看完以上3家超长无比的系列RLHF论文,结合OpenAI对RM模型的一些观点。我们来讨论下文首问题,感悟很玄学!!不一定靠谱!!仅提供一种思路~

RLHF究竟学了啥?

  • 可类比拒绝采样(Best-of-N):让模型随机采样生成N个回复,选择RM打分最高的回复

在WebGPT中OpenAI就把Best-of-N和RL进行了对比,best-of-64的效果甚至超过RLHF,而DeepMind在RL微调后加入best-of-n效果会有进一步提升。感觉RLHF和Best-of-N的差异就是前者把排序择优放在了微调阶段训练耗时,后者放在了推理阶段推理耗时。本质上二者是相似的,都是让模型在相似文本打分的文本序列中,挑选偏好打分更高的序列

那再想一步,Best-of-N的本质是啥?是Rejection-Sampling。啥是拒绝采样?简单说,就是针对无法直接采样的分布F,可以从G采样,例如G服从正态分布, 再通过特定的拒绝策略,拒绝不符合F分布的样本,则得到的样本可以近似F分布。对应到RLHF中,G其实就是RL初始模型生成的回复,拒绝策略是拒绝RM打分低的回复,则得到的就是符合人类偏好F的回复。

偏好对齐使用RL和SFT的差异?

  • 优化整个文本序列 vs 优化token级别的偏好:类似序列标注任务中CrossEntropy对比CRF

同样使用偏好标注数据来进行微调,RL微调是针对整个文本序列的RM打分进行优化,而SFT是对每个token的预测概率进行优化。SFT在偏好优化场景上有几个问题

  • 每个token在损失函数中的权重是相同的

  • 没有考虑文本整体对偏好的影响

  • 针对很多开放问题,最优答案是不固定的,只对1条回答做token级别的拟合,可能会影响泛化

综合以上3点RL似乎更合适,但是针对有标准答案的场景,例如所有非开放生成的NLP任务,摘要,分类,抽取等等,用SFT来拟合偏好似乎也没啥毛病,就像序列标注任务用CrossEntropy效果也不会比CRF差太多。

除此之外RL的另一个优点是可以部分降低人工标注,因为训练的RM模型后续可用于偏好打分,而SFT的每一个偏好样本都需要人工标注。

什么模型适合作为RLHF的初始模型?

  • 从拒绝采样的本质出发,RL的初始模型需要有能够生成人类偏好回答的能力

拒绝采样的前提假设是F分布的集合是G分布集合的子集,因为拒绝采样只是拒绝G采样的部分样本来得到F分布。对应到RLHF其实就是RL的初始模型要有能够生成人类偏好回复的能力,因此通过指令微调来解锁指令理解能力,似乎是RL初始模型的必须条件,毕竟纯续写模型是无法生成人类偏好的回复的。

当前的RL其实还存在很多问题。首先人类偏好本身就是存在噪声的,标注的一致率不到80%;其次奖励模型是对标注偏好的进一步抽象,又受到一步准确率的限制;而使用不完美的奖励模型进一步微调模型,则可能带来更进一步的拟合问题。这些问题还有待进一步解决,这一章我们就先说这么多啦

这一章我们聊聊有哪些方案可以不用微调直接让大模型支持超长文本输入,注意这里主要针对无限输入场景。之前在BERT系列中我们就介绍过稀疏注意力和片段递归的一些长文本建模方案长文本建模 BigBird & Longformer & Reformer & Performer,不过以上方案无一例外都需要在训练阶段引入。针对当前大模型微调成本高的问题,更多研究放到如何在模型外部支持长文本输入。先讨论下为啥当前的大模型会在推理时存在输入长度的限制,主要有以下几点原因

  1. Attention矩阵计算复杂度:在不引入稀疏注意力的条件下,Attention矩阵的内存和计算复杂度是O(序列长度2)�(序列长度2),文本长度的上升会带来显存的指数增长。

  2. 训练耗时:训练阶段的文本长度会显著影响训练速度, 因此2048一般是当前预训练常见的最大长度。

img

  1. 位置编码的外推性: 这里的外推性是指推理长度超过训练长度。包括推理会出现没训练过的位置编码,以及注意力机制需要处理比训练更长的输入。已有的旋转位置编码等相对位置编码已经具有了外推性,既推理长度可以超过训练长度,但在ALibi位置编码的测试中,这种外推性是以大幅性能损失为代价的。

img

针对以上问题本章介绍4种方案:显式搜索的知识库外挂方案,隐式搜索的Unlimiformer, 并行输入的pcw和并行解码NBCE。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

竞赛保研 基于机器学习与大数据的糖尿病预测

文章目录 1 前言1 课题背景2 数据导入处理3 数据可视化分析4 特征选择4.1 通过相关性进行筛选4.2 多重共线性4.3 RFE(递归特征消除法)4.4 正则化 5 机器学习模型建立与评价5.1 评价方式的选择5.2 模型的建立与评价5.3 模型参数调优5.4 将调参过后的模型重…

12.21自动售货机,单物品,多物品

自动售货机 if朴素方法 一种思路是用寄存器cnt记录已有的最小单位货币量,这里就是0.5 当d1时,cnt1;d2时,cnt2;d3时,cnt4; timescale 1ns/1ns module seller1(input wire clk ,input wire rst ,input wire d1 ,input wire d2 …

苹果CMS超级播放器专业版无授权全开源,附带安装教程

源码介绍 超级播放器专业版v1.0.8,内置六大主流播放器,支持各种格式的视频播放,支持主要功能在每一个播放器内核中都相同效果。 搭建教程 1.不兼容IE浏览器 2.php版本推荐7.4 支持7.1~7.4 3.框架引入不支持同时引入多个播放器 json对接教…

mfc100u.dll文件丢失了要怎么解决?修复mfc100u.dll详细指南

mfc100u.dll文件丢失了要怎么解决?首先让我们扒一扒什么是 mfc100u.dll。这玩意儿是 Microsoft Visual Studio 2010 的一部分,它就像一款程序生活中不可或缺的零件,没了它,程序肯定跑不起来。想想看,没有一个重要的零件&#xff…

【UE5蓝图】读取本地json文件修改窗口大小

效果 插件 蓝图 1.判断文件存在 2.1文件不存在,生成文件 {"ResolutionX":540, "ResolutionY":960} 2.2文件存在,直接读取 3.设置窗口大小 遇到的坑 1.分辨率太大,导致效果不理想,建议先往小填写。 2.选对…

Java核心知识点1-java和c++区别、隐式和显示类型转换

java和c区别 java通过虚拟机实现跨平台特性,但c依赖于特定的平台。java没有指针,它的引用可以理解为安全指针,而c和c一样具有指针。java支持自动垃圾回收,而c需要手动回收。java不支持多重继承,只能通过实现多个接口来…

TCP/IP的五层网络模型

目录 封装(打包快递) 6.1应用层 6.2传输层 6.3网络层 6.4数据链路层 6.5物理层 分用(拆快递) 6.5物理层 6.4数据链路层 6.3网络层 6.2传输层 6.1应用层 封装(打包快递) 6.1应用层 此时做的数据…

程序的编译、链接

目录 前言: 前置知识回顾 宏 宏定义常量 宏定义语句 宏定义函数 条件编译 应用场景 编译过程概览 预编译阶段 编译阶段 汇编阶段 链接阶段 前言: 在ANSI C的任何一种实现中,存在两种不同的环境,第1种是翻译环境&#x…

12.30 二叉树中等题

236. 二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff…

yolov8实战第四天——yolov8图像分类 ResNet50图像分类(保姆式教程)

yolov8实战第一天——yolov8部署并训练自己的数据集(保姆式教程)_yolov8训练自己的数据集-CSDN博客在前几天,我们使用yolov8进行了部署,并在目标检测方向上进行自己数据集的训练与测试,今天我们训练下yolov8的图像分类…

【滑动窗口】C++算法:K 个不同整数的子数组

作者推荐 动态规划 多源路径 字典树 LeetCode2977:转换字符串的最小成本 本题涉及知识点 滑动窗口 LeetCoe992 K 个不同整数的子数组 给定一个正整数数组 nums和一个整数 k,返回 nums 中 「好子数组」 的数目。 如果 nums 的某个子数组中不同整数的个数恰好为 …

【AI导师】利用Coding Agent完成AIGC编程

利用Coding Agent完成AIGC编程 一、前言二、Coding Agent三、1024code四、AI导师README项目初版功能定义代码结构设计方案函数方法设计方案迭代记录 一、前言 AI产品的发展确实在过去两年年中取得了显著进展,尤其是在编程领域。一开始,ChatGPT和类似的语…

前后端分离架构的特点以及优缺点

文章目录 一、前后端不分离架构(传统单体结构)1.1 什么是前后端不分离1.2 工作原理1.3 前后端不分离的优缺点1.4 应用场景 二、前后端分离架构2.1 为什么要前后端分离2.2 什么是前后端分离2.3 工作原理2.4 前后端分离的优缺点 参考资料 一、前后端不分离架构(传统单体结构) 首…

阿里后端实习二面

阿里后端实习二面 记录面试题目,希望可以帮助到大家 类加载的流程? 类加载分为三个部分:加载、连接、初始化 加载 类的加载主要的职责为将.class文件的二进制字节流读入内存(JDK1.7及之前为JVM内存,JDK1.8及之后为本地内存)&…

EBU7140 Security and Authentication(一)常见加密算法

前言 主要根据 EBU7140 课程内容整理,比较偏向应试~ Block1:介绍课程,传统加密方式。 Block2:公钥加密的原理和应用。 Block3:一些特定安全协议技术(如防火墙 Kerberos身份验证协议等)。 B…

【教学类-43-03】20231229 N宫格数独3.0(n=1、2、3、4、6、8、9) (ChatGPT AI对话大师生成 回溯算法)

作品展示: 背景需求: 大4班20号说:我不会做这种(九宫格),我做的是小格子的, 他把手工纸翻过来,在反面自己画了矩阵格子。向我展示:“我会做这种!” 原来他会…

《PCI Express体系结构导读》随记 —— 第I篇 第1章 PCI总线的基本知识(15)

接前一篇文章:《PCI Express体系结构导读》随记 —— 第I篇 第1章 PCI总线的基本知识(14) 1.3 PCI总线的存储器读写总线事务 1.3.4 PCI读写主存储器 前文已提到,由于本节内容较长,因此将后一部分内容放在本文中。 为…

Java多线程技术五——单例模式与多线程

1 概述 本章的知识点非常重要。在单例模式与多线程技术相结合的过程中,我们能发现很多以前从未考虑过的问题。这些不良的程序设计如果应用在商业项目中将会带来非常大的麻烦。本章的案例也充分说明,线程与某些技术相结合中,我们要考虑的事情会…

java注解和反射

java注解和反射 内置注解 Override 重写生命 Deprecated 已过时的方法,不推荐使用,可以使用 SuppressWarning 镇压警告,懂的都懂 元注解 作用:负责注解其他的注解 Target 描述注解的使用范围 Retention 描述注解的生命周期 Docu…

从座舱到跨域融合,老牌汽车零部件厂商如何破局数字化变革

当前,整个汽车供应链正在经历深层次的重构,传统零部件厂商必须加速“自我革新”。 在汽车“新四化”的巨变下,大量传统零部件濒临消失或者减少了需求,传统汽车零部件企业的相关业务开始日益萎缩,生存空间遭受不同程度…