当前位置: 首页 > article >正文

大语言模型之Qwen2技术报告阅读笔记

QWEN2 TECHNICAL REPORT——2024

核心内容

介绍了Qwen2 大模型系列:基于transformer架构的LLMs

通过以下四个部分来展开介绍:

  • Tokenizer & Model

    • 四个dense models,参数计数为 0.5 亿、15 亿、70 亿和 720 亿
    • 一个Mixture-of-Experts (MoE) 模型,具有 570 亿个参数
  • Pre-training

  • Post-training

  • Evaluation

模型架构

Tokenzier

跟之前的Qwen模型一样,Qwen2作者依然使用了字节级别字节对编码分词器

  • 为什么要使用字节对编码(BPE)分词器???

BPE编码效率高,相比于其他的分词技术具有更好的压缩率,能够促进 Qwen2 的多语言能力

字节级别字节对编码分词器也叫BBPE,Byte-level BPE(BBPE)和Byte-Pair Encoding (BPE)区别就是BPE是最小词汇是字符级别,而BBPE是字节级别的,通过UTF-8的编码方式这一个字节的256的范围,理论上可以表示这个世界上的所有字符


BPE 的基本思想是通过反复合并频率最高的字符或子词对,逐步构建出较长的单元,从而实现对文本的压缩和高效分词。

工作原理

  1. 初始化:将文本中的每个单词视为字符的序列。
  2. 统计频率:统计文本中每对相邻字符出现的频率。
  3. 合并频率最高的对:找到频率最高的字符对,并将其合并为一个新的子词。
  4. 重复:将合并后的子词重新加入文本,更新频率统计,并继续合并频率最高的字符对。
  5. 终止条件:重复上述过程,直到达到预定的合并次数或不再有字符对可以合并为止

优点

  • 处理未知词汇:BPE 能有效处理未知词汇,因为它将词分解为更小的子词,增加了模型处理新词的能力。
  • 减少词汇量:通过合并高频字符对,BPE 可以显著减少词汇表的大小,提高模型训练和推理的效率。
  • 灵活性:适用于多种语言和多种文本类型,特别是对粘着语和复合词丰富的语言表现出色。

除了BPE,Transformer中还有两种常用的分词方法:WordPiece 和 Unigram

WordPiece: 是一种子词的分词方法,bert用的就是这种分词方法。

它的核心思想是通过将单词拆分为更小的子词或字符块,从而减少词汇量,并处理未登记词(out-of-vocabulary, OOV)的问题。

与上述BPE只有在合并字词的时候方法不一样:WordPiece 使用了最大似然估计(Maximum Likelihood Estimation, MLE)来选择最优的子词合并。具体来说,WordPiece 通过计算每对相邻子词联合概率,并选择提升语言模型可能性的组合来进行合并。比如说 P(ed) 的概率比P(e) + P(d)单独出现的概率更大,可能比他们具有最大的互信息值,也就是说这个两子词在语言模型上具有较强的关联性,则将其合并

Unigram:

工作原理: Unigram分词算法是一种基于语言模型的分词方法。它从一个大的词汇表开始,该词汇表包含大量的子词候选,并通过迭代地移除概率最低的子词来优化词汇表

  1. 初始化:构建一个初始大词汇表,包含所有可能的子词(通常从单字母到整个单词的所有可能组合)
  2. 估计:计算每个子词的出现概率。这通常通过统计子词在训练数据中的频率来完成
  3. 优化:重复移除贡献最小的子词,即那些概率最低的子词,再重新估计剩余子词的概率
  4. 结束:当词汇表大小降至目标大小或满足其他终止条件时,停止优化

横向对比:

算法BPEWordPieceUnigram
训练方式从一个小词汇表开始,学习合并token的规则从一个小词汇表开始,学习合并token的规则从大量词汇开始(可以通过BPE获得),学习删除token的规则
是否使用语言模型
规则合并频次最高的token对,如有两个token对,(h,e)出现10次,(t, e)出现6次,则合并(h,e)计算token对的得分,合并得分最高的token对,得分为token对的频率除以两个token分别的频率(互信息) 如h 出现了100次,e出现了20次,he出现了5次,则得分为5/(100*20)=1/400在全部语料中计算删除该token时的损失,删除损失最少的token
学习结果合并规则及词表词表词表,每个token有对应的分数
使用将单词切分成单个字符,使用学到的合并规则从前往后对token进行合并从单词的起始位置开始,找到最长的且位于词表中的subword,重复该步骤。使用训练过程中学到的分数,找到最可能的切分结果。一般偏向将单词切分成尽可能少的token
优点简洁高效: BPE的算法相对简单,能够快速找到高频的子词组合,逐步合并字符或子词对,生成稳定的词汇表 ②处理未知词能力强: BPE可以较好地处理未登录词(OOV,Out-of-Vocabulary),通过将未知词拆分为已知的子词或字符,从而减少模型的OOV问题 ③ 可控的词汇表大小: BPE允许通过设置合并操作的次数来控制最终的词汇表大小,使得在存储和计算上更加灵活改进的子词选择: 相较于BPE,WordPiece在子词选择时不仅考虑频率,还考虑整体的词汇概率,生成的子词更符合语言习惯 ②处理未知词更精细: WordPiece分词相对更细腻,可以更好地捕捉低频词或复杂词的子词结构,进一步减少OOV的发生率全局优化: Unigram采用贝叶斯模型,通过概率分布来决定最优的子词集合,能够在全局范围内找到更好的分词结果,较少受到贪心策略的限制 ② 灵活性强: Unigram模型可以生成不同大小的词汇表,并且在不同的文本类型中表现较为稳健
缺点贪心算法: BPE使用贪心算法生成子词,对上下文无感知,可能导致一些不合理的分词结果 ②无法适应多语言需求训练速度较慢: 由于WordPiece不仅考虑频率,还需要计算子词概率,导致其训练速度比BPE慢一些 ②实现复杂性: WordPiece的实现比BPE稍微复杂一些,需要更精细的概率模型支持训练成本高: Unigram的训练过程需要多次迭代和概率调整,因此训练时间较长,计算资源消耗较大② 实现复杂性: Unigram的实现复杂性较高,需要进行多次的分词概率优化,且对模型的依赖更强

model architecture

Dense Model

模型由多个 Transformer 层构成,每个层都包含因果注意机制和前馈神经网络 (FFN)

与Qwen模型不同之处在于:

  • 组查询注意力代替了多头注意力

  • 实现了双块注意力(Dual Chunk Attention (DCA))来扩展 Qwen2 的上下文窗口,即将长序列分割成可管理长度的块,并且加入了YARN技术来调整注意力权重

1. 为什么使用组查询注意力(GQA)?

GQA通过分组共享键值头,减少了需要加载的数据量,降低内存带宽需求,从而加快了模型的解码速度,对于大型模型,GQA能够在保持与MQA相当的推理速度的同时,提供接近MHA的质量

MHAMQAGQA
特点① 并行计算: 多个注意力头并行工作,使模型能够关注不同的特征子空间,并捕捉输入序列中不同位置之间的依赖关系。②灵活性: 每个注意力头都有自己的查询(Query)、键(Key)、和值(Value)线性变换,因此它们可以学习到不同的表示。①共享键和值: 多个查询头共享相同的键和值,从而减少了计算量。②降低计算复杂度: 由于键和值只需计算一次,因此MQA在计算效率上优于MHA①分组策略: 通过将查询头分组,GQA在减少计算成本的同时保留了一部分MHA的灵活性。②权衡性能和效率: GQA试图在计算效率和注意力模式的多样性之间找到一个平衡点
优点①多样化注意力模式: 通过多个头,MHA能够捕捉到更丰富的语义关系,特别是在处理长距离依赖时。②适应性强: 由于每个头的变换是独立的,MHA能够适应多种不同类型的输入① 计算效率高: 通过共享键和值,MQA显著减少了计算和内存开销,这使得它更适合在大模型或资源受限的环境中使用。②保持多样性: 虽然键和值是共享的,但每个查询头依然可以关注输入的不同部分,保持了一定的多样性。① 更高效的计算: 相较于MHA,GQA的计算量减少了,因为部分头共享键和值。② 保留多样性: 与MQA相比,GQA通过分组策略保留了一定的注意力模式多样性,使其在某些情况下能够提供更好的性能
缺点计算成本高: 由于每个头都需要独立计算查询、键和值,MHA的计算量较大,尤其是在多头数量较多时注意力模式有限: 由于键和值是共享的,MQA的多样性不如MHA,可能在某些情况下表现稍弱实现复杂度稍高: 由于需要处理不同的分组和共享策略,GQA的实现复杂度比MQA高,虽然仍低于MHA

2. 为什么使用双块注意力???

DCA支持对 长序列分块,能够对有效地扩展模型的上下文窗口,同时保持对长距离依赖关系的捕捉能力,从而提高长上下文处理性能

Dual Chunk Attention (DCA)是论文《Training-Free Long-Context Scaling of Large Language Models》提出的方法。

主要解决:大型语言模型在处理长文本时,输入的token数量超出了模型的预训练长度其性能下降问题以及对这些大型模型进行微调以处理更长的序列成本非常高的问题。

DCA框架:是一种无需额外训练即可扩展LLMs上下文窗口的方法。DCA通过将长序列的注意力计算分解为基于块的模块,有效捕获同一块内(Intra-Chunk)和不同块间(Inter-Chunk)的相对位置信息。DCA由三个部分组成:(1) 块内注意力(Intra-Chunk Attention),用于处理同一小块内的token;(2) 块间注意力(Inter-Chunk Attention),用于处理不同小块之间的token;(3) 连续块注意力(Successive Chunk Attention),用于处理连续的不同小块内的token。

3. 为什么使用YARN技术???

YaRN提供了一种有效的方法来扩展大型语言模型的上下文窗口,同时保持了高性能和计算效率

YaRN(Yet another RoPE extensioN method)是一种用于高效扩展大型语言模型上下文窗口的方法,来自论文《YaRN: Efficient Context Window Extension of Large Language Models》

YaRN方法:

  • YaRN结合了注意力缩放(在softmax计算之前引入温度参数t)和"NTK-by-parts"插值方法。这种方法可以在不修改注意力机制代码的情况下,通过调整RoPE嵌入来改变注意力机制。
  • YaRN通过调整RoPE的频率,使得不同维度的嵌入能够适应更长的上下文长度。具体来说,对于波长小于上下文长度的维度,不进行插值;对于波长大于或等于上下文长度的维度,只进行插值以避免外推。
  • YaRN还引入了一个比例因子γ,用于在不同的隐藏维度之间平滑地分配插值压力

其他资料:

  • https://blog.csdn.net/qq_27590277/article/details/132750213

  • https://blog.csdn.net/Cyril_KI/article/details/139862002?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EYuanLiJiHua%7ECtr-3-139862002-blog-132750213.235%5Ev43%5Epc_blog_bottom_relevance_base6&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EYuanLiJiHua%7ECtr-3-139862002-blog-132750213.235%5Ev43%5Epc_blog_bottom_relevance_base6&utm_relevant_index=6

其他组成部分与Qwen一样:

  • 激活函数:使用 SwiGLU
  • 位置嵌入:RoPE位置嵌入
  • 归一化:RMSNorm
  • QKV bias等
  1. 为什么要用RMSNorm归一化?
  1. 简化计算
    • 去掉均值计算:LayerNorm计算归一化时需要先计算输入的均值,然后减去均值再除以标准差。RMSNorm则直接使用输入的均方根(Root Mean Square, RMS),避免了计算均值的步骤。这使得RMSNorm的实现更加简洁,计算量也相对较低。
  2. 稳定训练
    • 减少均值漂移:在LayerNorm中,均值的变化可能会引入一定的训练不稳定性,特别是在大模型中。而RMSNorm通过直接使用RMS值,减少了均值漂移对模型训练的影响,提供了更稳定的归一化效果。
  3. 更好的缩放处理
    • 无需逐元素偏移:RMSNorm中没有逐元素的偏移(即没有减去均值的步骤),这减少了偏移对模型学习能力的影响。对于深度模型,特别是那些层数多、参数量大的模型,RMSNorm能够更稳定地处理特征缩放问题。
  4. 更适合大模型
    • 提升大模型的训练效率:随着模型规模的增大,LayerNorm中的均值和标准差的计算可能会引入更多的数值不稳定性。而RMSNorm由于其更直接的计算方式,能更好地应对这种不稳定性,提升大模型的训练效率和效果。
  1. RMSNorm跟其他的归一化方法比有什么优势
  • 对于layerNorm和RMSNorm,layerNorm包含缩放和平移两部分,RMSNorm去除了平移部分,只保留了缩放部分。这样做的依据是,有研究认为layerNorm取得成功的关键是缩放部分的缩放不变性,而不是平移部分的平移不变性。
  • RMSNorm相比一般的layerNorm,减少了计算均值和平移系数的部分,训练速度更快,效果基本相当,甚至有所提升
  1. 大模型中的归一化为什么放在MHA和FFN之前?
  • 在transformer的原始结构中,采用了PostLN结构,即在残差链接之后layerNorm。在LLM中训练过程中发现,PostLN的输出层附近的梯度过大会造成训练的不稳定性,需要结合warm up做一些学习率上的调整优化
  • PreLN将layerNorm放置在各模块之前。PreLN在每层的梯度范数近似相等,有利于提升训练稳定性。相比PostLN,使用PreLN的深层transforme的训练更稳定,但是性能有一定损伤。为了提升训练稳定性,很多大模型都采用了PreLN
  • 现在也有两个模型两种归一化都用,比如GLM-130B就采用PostLN与PreLN结合的方式

大模型归一化方法有哪些:https://zhuanlan.zhihu.com/p/689516256

RoPE位置嵌入:

RoPE的核心思想是利用旋转矩阵来编码词嵌入(word embeddings)的绝对位置信息。这种方法的关键在于,它不是简单地将位置信息作为额外的向量添加到词嵌入中,而是通过旋转操作将位置信息与词嵌入相结合

Mixture-of-Experts Model

什么是混合专家模型???

MoE 通过组合多个专家(子模型),并根据输入选择性地激活这些专家,从而优化计算资源的使用并提高模型的表现。

基本原理:

混合专家模型包含以下主要组件:

  1. 专家(Experts):多个独立的子模型,每个子模型称为一个专家。这些专家可以是不同的神经网络相同结构但不同参数的网络
  2. 门控网络(Gating Network):一个网络,用于根据输入数据选择最合适的专家。门控网络输出一组权重,这些权重表示每个专家的激活程度。
  3. 组合机制:根据门控网络的输出权重,组合各个专家的输出,形成最终的模型输出。

工作流程:

  1. 输入数据:将输入数据传递给门控网络和所有专家。
  2. 门控网络输出:门控网络根据输入数据计算一组权重,表示每个专家的重要性。这些权重通常通过 softmax 函数进行归一化。
  3. 专家激活:根据门控网络的输出权重,有选择地激活一部分专家进行计算,未被激活的专家不会参与计算,从而节省计算资源。
  4. 组合输出:将激活的专家的输出根据权重进行加权求和,得到最终的模型输出。

Qwen MoE 模型和dense model的关键结构区别在于 :MoE 层包含多个 FFN,每个 FFN 作为一个单独的专家

核心公式:
在这里插入图片描述

Qwen MoE 模型的关键设计:

1. Expert Granularity(粒度)

  • Qwen2不同之处在于采用了细粒度的专家表示,即创建了小规模专家,同时激活更多的专家
  • 细粒度专家能够提供更丰富的专家组合集,通过利用这些细粒度的专家,Qwen2 MoE 能够促进更多样化和动态的专家利用,从而提高了整体性能和适应性。

细粒度专家分割

  • 传统的MoE模型中,每个MoE层由多个专家组成,每个专家是一个前馈神经网络(Feed-Forward Network, FFN)。在这种设置下,每个token通常只被分配给一个或少数几个专家。
  • 细粒度专家分割策略是将每个专家进一步细分为更小的专家单元。这样做的目的是让每个细分后的专家可以专注于学习更具体的知识点,从而提高知识的专业化和精细化。
  • 例如,如果原本一个专家是一个完整的FFN,通过细粒度分割,这个FFN可以被拆分成多个更小的FFNs,每个小FFN成为一个独立的专家。这样,每个token可以被分配给更多的专家,从而实现更灵活的知识组合和更精确的知识学习。

2. Expert Routing

  • 在 MoE 层内集成共享和特定于路由的专家

这个概念在其他的论文里面也叫共享专家隔离

  • 在MoE模型中,不同的专家可能会学习到一些共同的知识,这会导致参数冗余,即多个专家在他们的参数中存储了相似的信息。
  • 共享专家隔离策略是将一部分专家设置为共享专家,这些专家始终被激活,并且负责捕获和整合跨不同上下文的通用知识。
  • 通过将通用知识压缩到这些共享专家中,可以减少其他路由专家(routed experts)之间的冗余,使得每个路由专家可以更加专注于学习独特的知识,从而提高模型的参数效率和专家的专业化。

Model Configuration

在这里插入图片描述

  • 较小的模型,特别是 Qwen2-0.5B 和 Qwen2-1.5B,旨在轻松部署在智能手机、耳机和智能眼镜等便携式设备上

  • 更大的模型迎合了跨不同尺度的 GPU 部署

Pre-training

预训练的主要改进:

  • 改进数据集

①使用 Qwen 模型过滤掉低质量的数据、合成高质量的预训练数据等

②收集了大量高质量的代码、数学和多语言数据,增强了模型在各自领域的能力,这个新数据集支持大约 30 种语言

相关尝试:基于这些增强,预训练数据从 Qwen1.5 中的 3 万亿token扩展到 7万亿token。尝试进一步放宽质量阈值会导致 12 万亿令牌数据集。然而,在这个数据集上训练的模型并没有显示出比 7万亿令牌模型显着的性能改进。怀疑增加数据量并不一定有利于模型预训练。

  • 研究有效处理扩展上下文长度的方法

① 为了提高 Qwen2 的长上下文能力,在预训练结束阶段将上下文长度从 4,096 个标记增加到 32,768 个标记。这种扩展补充了引入大量高质量、冗长的数据。

② 同时将 RoPE 的基本频率从 10,000 修改为 1,000,000,以优化长上下文场景的性能

③ 为了充分利用模型的长度外推潜力,采用了 YARN 机制 和双块注意机制 ,这些策略使模型能够在保持高性能的同时处理多达 11,072 个标记的序列

post-training

目的:

通过pre-training已经得到了一个包含多个领域知识的预训练模型,再通过post-training希望进一步增强模型在各领域的熟练程度,包括编码、数学、逻辑推理、指令跟随和多语言理解。同时,这样也能使模型的生成更加符合人类标准、更加有用。

作者提出了一个侧重于最小人工注释的可扩展对齐方法

人类反馈 (RLHF) 中获取用于监督微调 (SFT) 和强化学习的高质量演示和偏好数据,旨在最小化人工标记的需要,同时最大化数据的质量和可靠性。

训练数据的构建包含下述两个过程:

(1)数据处理:目的是获取广泛多样的高质量指令

  • 自动本体提取:用于从大规模指令数据集中提取底层本体(从大量指令或命令数据中抽象出的概念、类别、属性及其关系的系统性结构),随后的人工细化确保了提取的本体的准确性

  • 指令选择:每条带有注释标签的指令都针对标签多样性、语义丰富度、复杂性和意图完整性进行评估。基于这些标准,选择一组具有代表性的指令

  • 指令演化:为了丰富指令数据集,采用了自进化策略,促使 Qwen 模型对现有指令添加约束或要求,从而提高它们的复杂性并确保数据集内不同的难度级别

  • 人工注释:使用不同的生成策略和 不同尺度的Qwen 模型获得对指令的多个响应,人工标记者根据他们的偏好对这些响应进行排名,确保最佳响应符合既定标准,同时产生演示和偏好数据

(2)使用对齐策略合并数据:目的是保证数据的质量

  • Rejection Sampling:对于具有明确最终答案的数学或类似任务,应用Rejection Sampling来提高解决方案的质量

  • Execution Feedback:对于编码任务,LLM 用于生成解决方案和相关测试用例。这些解决方案的有效性是通过编译和执行测试用例来评估的,从而创建演示和偏好数据。对于每个有约束的指令,例如长度限制,LLM的任务是生成一个Python验证函数,以确保响应与指令要求保持一致

  • Data Repurposing:在文学写作任务中创建熟练的响应对于没有专门训练的注释者来说具有挑战性。为了解决这个问题,作者从公共领域聚合高质量的文学作品,并使用 LLM 开发具有不同细节级别的说明。这些指令与原始作品配对,作为演示数据。例如,为了编译具有生动和吸引人的响应的角色播放数据,作者从维基百科等知识库源详细的字符配置文件,并指示 LLM 生成相应的指令和响应,这个过程类似于阅读理解任务,确保保持字符配置文件的完整性

  • Constitutional Feedback:为了确保遵守安全和价值观等指南,编制了一个宪法数据集。该数据集描述了要遵循的原则和要避免的原则。它用于指示 LLM 产生与这些指南对齐或偏离的响应,作为演示和偏好数据的参考

RLHF训练:

RLHF的训练机制包括两个顺序阶段:离线和在线训练。

  • 在离线训练阶段,使用预编译的偏好数据集 P 来最大化 y+i 和 y-i 与直接偏好优化的可能性差异。
  • 在在线训练阶段,该模型实时迭代地改进其性能,利用奖励模型进行即时反馈。具体来说,从当前策略模型中采样多个响应,奖励模型选择最偏好和最不喜欢的响应,形成每一集用于 DPO 的偏好对。此外,使用在线合并优化器来减轻对齐税,即与将模型生成与人类偏好对齐相关的性能下降。

DPO 的核心思想是使用偏好数据(即相对比较而非绝对评分)来直接指导模型优化。

在线合并优化器的核心优势在于它能够在训练过程中动态地调整模型的更新方向,以实现更好的对齐性能,同时减少因过度追求人类偏好而可能带来的基本能力损失

对齐税(Alignment Tax)是指在使用强化学习从人类反馈(RLHF)来训练大型语言模型(LLMs)时出现的一种现象。具体来说,当模型被优化以更好地符合人类的偏好和期望时,可能会不自觉地损失或“遗忘”它们在预训练和监督式微调(SFT)阶段学到的某些能力。这种能力损失可以体现为在某些公共语言基准测试上的性能下降,或基本语言技能的丧失

Evaluation

作者进行了全面的评估:

  1. 基础语言模型的核心能力评估(Core Capabilities):
    • 使用了一些标准的基准数据集来评估模型在自然语言理解、通用问题回答、编码、数学、科学知识、推理等方面的表现。这些数据集包括 MMLU、MMLU-Pro、GPQA、Theorem QA、BBH、HellaSwag、Winogrande、ARC-C、TruthfulQA 等。
  2. 指令调整型模型的评估(Instruction-tuned Model):
    • 除了基础能力评估外,还包括了对人类偏好对齐和指令跟随能力的评估。使用了 MT-Bench、Arena-Hard、AlignBench、MixEval 和 IFEval 等基准来评估这些能力。
  3. 多语言评估(Multilingual Evaluation):
    • 设计了多种语言的测试案例,邀请了专业语言评估员对模型的响应进行评分,以评估模型的多语言能力。
  4. 安全性与责任评估(Safety & Responsibility):
    • 对模型在不同语言中的安全性进行了评估,包括对非法行为、欺诈、色情和隐私等主题的评估。
  5. 长文本能力评估(Long Context Capabilities):
    • 使用了 Needle in a Haystack (NIAH)、NeedleBench 和 LV-Eval 等方法来评估模型处理长文本的能力。
  6. 内部自动评估(In-house Automatic Evaluation):
    • 创建了一系列内部数据集来评估模型的不同能力,如知识理解、文本生成、编码等。
  7. 长文本处理性能
    • 评估了模型在处理长文本时检索信息的能力,特别是在大量文本中定位特定事实的能力。
  8. 人类评估
    • 对模型生成的响应进行人工评估,以确定它们是否符合预期的标准和偏好。

总结

相较于之前的Qwen版本:

  • Qwen2 包括更广泛的语言数据,提高了代码和数学内容的数量和质量
  • 所有模型都经过监督微调和直接偏好优化 ,通过学习人类反馈将它们与人类偏好对齐

优势:

  • 超越了大多数先前的开放权重模型,包括它的前身 Qwen1.5
  • 在语言理解、生成、多语言熟练程度、编码、数学和推理的不同基准上相对于专有模型表现出具有竞争力的性能
  • Qwen2 展示了强大的多语言能力,精通大约 30 种语言
  • 特别是Qwen2-72B在多个评估指标上展示了显着的性能

http://www.kler.cn/a/287491.html

相关文章:

  • 基于多模板配准的心腔分割算法
  • Macmini中普通鼠标与TrackPad联动问题解决
  • ATmaga8单片机Pt100温度计源程序+Proteus仿真设计
  • 【汇编语言】数据处理的两个基本问题(二) —— 解密汇编语言:数据长度与寻址方式的综合应用
  • 2024年11月16日 星期六 重新整理Go技术
  • 【Golang】——Gin 框架中的模板渲染详解
  • boot跳转APP,概率性串口失效问题。
  • 【Spring Boot-IDEA创建spring boot项目方法】
  • 微积分复习笔记 Calculus Volume 1 - 1.3Trigonometric Functions
  • 基于yolov5的煤矿传送带异物检测系统python源码+onnx模型+评估指标曲线+精美GUI界面
  • free命令
  • Leetcode-有效的数独
  • 《软件工程导论》(第6版)第5章 总体设计 复习笔记
  • 【论文阅读】Single-Stage Visual Query Localization in Egocentric Videos
  • 【云原生】Mysql 集群技术
  • 【王树森】Few-Shot Learning (2/3): Siamese Network 孪生网络(个人向笔记)
  • 软件功能测试的重要性简析,好用的功能测试工具有哪些?
  • 衡石科技产品手册-指标分析
  • SprinBoot+Vue超市管理系统的设计与实现
  • Java-List分批多线程执行
  • 计算机毕业设计 | SpringBoot+vue移动端音乐网站 音乐播放器(附源码)
  • 【0320】Postgres内核之 vacuum heap relation (15)
  • 实训day41(9.2)
  • Flask-RESTFul 之 RESTFul 在蓝图中的使用
  • Android12 添加设置控制导航栏显示和状态栏下拉
  • 【实用干货】5大自动化测试的Python框架!