DeepSeek - R1:模型架构深度解析

news2025/4/6 4:04:19

DeepSeek - R1:模型架构深度解析

引言

本文将深入探索DeepSeek - R1模型架构。将从输入到输出追踪DeepSeek - R1模型,找出架构中的新发展和关键部分。DeepSeek - R1基于DeepSeek - V3 - Base模型架构,本文旨在涵盖其设计的所有重要方面。

目录

  1. 输入上下文长度
  2. 总层数
  3. DeepSeek - R1的前3层
  4. DeepSeek - R1的第4到61层
  5. 多头潜在注意力(MLA)
  6. 混合专家(MoE)
  7. 多令牌预测(MTP)

一、输入上下文长度

DeepSeek - R1的输入上下文长度为128K。

它从其基础模型DeepSeek - V3 - Base继承了128K的上下文长度。最初,DeepSeek - V3以4K的上下文长度进行预训练,然后通过两阶段的上下文长度扩展,利用YaRN技术先将其增加到32K,再增加到128K。

YaRN(Yet another RoPE extensioN method)是一种旨在有效扩展使用旋转位置嵌入(RoPE)的大语言模型(LLM)上下文窗口的技术。RoPE使用旋转矩阵对位置信息进行编码,而YaRN修改了这些旋转频率的缩放方式。它不是简单地外推频率(这通常会导致性能下降),而是对这些频率进行平滑插值和调整,从而使模型在更长的上下文中具有更好的泛化能力。该技术计算效率高,无需大规模重新训练即可扩展模型的上下文长度。

二、总层数

DeepSeek - R1由一个嵌入层、61个Transformer层和输出阶段的多个预测头组成。

DeepSeek - R1在所有Transformer层中采用多头潜在注意力(MLA)层,而不是标准的多头注意力。前三个Transformer层与其余层不同,使用标准的前馈网络(FFN)层。从第4层到第61层,混合专家(MoE)层取代了FFN层。
在这里插入图片描述
在这里插入图片描述

DeepSeek - V3使用多令牌标记预测(MTP)技术,通过其最后两个预测头预测接下来的2个标记。第二个预测令牌标记的接受率在85%到90%之间,表明在各种生成主题上具有很高的可靠性。DeepSeek - R1(DeepSeek - V3)共有6710亿个参数,每个标记激活370亿个参数。

三、DeepSeek - R1的前3层

前3层由多头潜在注意力(MLA)和标准的FFN层组成。这些层通常被称为“密集LLM层”,因为FFN层没有被MoE层取代,相比之下,MoE层被认为更稀疏。
在这里插入图片描述

四、DeepSeek - R1的第4到61层

这些层由MLA和MoE层组成。接下来我们将了解MLA和MoE层是什么以及它们如何工作。
在这里插入图片描述

五、多头潜在注意力(MLA)

1. MLA的由来

MLA最早在DeepSeek - V2中引入,并延续到了DeepSeek - V3和DeepSeek - R1。传统的Transformer模型通常采用多头注意力(MHA),但在生成过程中,其庞大的键值(KV)缓存会成为限制推理效率的瓶颈。为了减少KV缓存,提出了多查询注意力(MQA)和分组查询注意力(GQA),它们所需的KV缓存量较小,但性能不如MHA。

对于DeepSeek - V2,设计了一种创新的注意力机制,即多头潜在注意力(MLA)。MLA配备了低秩键值联合压缩,其性能优于MHA,但所需的KV缓存量显著减少。
在这里插入图片描述

2. MLA如何减少KV缓存以实现更快推理

MLA对注意力键和值进行低秩联合压缩,以减少推理过程中的键值(KV)缓存。
在这里插入图片描述

步骤1:Q、K和V的下投影

在这里插入图片描述

MLA层的输入是 h t h_t ht,假设 h t h_t ht的形状为(输入序列长度×2000)。在传统的Transformer层中,使用权重矩阵将 h t h_t ht投影到查询(Q)、键(K)和值(V)表示,它们通常保留与输入相同的隐藏维度,即Q、K、V的形状为(输入序列长度×2000)。

然而,在具有多头潜在注意力(MLA)的Transformer层中,权重矩阵生成的Q、K和V的维度明显小于输入。例如,如果输入 h t h_t ht的形状为(序列长度×2000),生成的Q、K和V的形状可能为(序列长度×100)。在实现过程中,为了提高GPU的计算和内存效率,Q、K和V的权重矩阵通常会进行融合,使用一个组合的权重矩阵来优化操作。
在这里插入图片描述

投影的输出是一个包含K和V的拼接表示,可以通过简单的切片机制轻松提取。得到的输出形状为(序列长度×200),其中前(序列长度×100)对应K,其余(序列长度×100)对应V。在推理过程中,压缩后的K和V输出会被缓存,显著减少了KV缓存的内存占用。同样,Q在MLA中也会被压缩,其形状为(序列长度×100)。
在这里插入图片描述

步骤2:Q、K和V的上投影

在这里插入图片描述

压缩后,Q、K和V会被上投影回更大的尺寸以进行注意力计算。这个更大的尺寸可以与原始输入 h t h_t ht匹配,也可以根据注意力头的配置进行设置。例如,上投影后的形状可以是(序列长度×2000),与输入大小匹配;或者是(序列长度×3200),其中3200是由64个注意力头和每个头50维得到的。
在这里插入图片描述
K和V向上投影
在这里插入图片描述
Q上投影

Q、K和V的上投影使用专用的权重矩阵进行: W U K W_{UK} WUK用于K的上投影, W U V W_{UV} WUV用于V的上投影, W U Q W_{UQ} WUQ用于Q的上投影。这里的“U”表示上投影,意味着将压缩后的表示扩展回更大的维度空间进行注意力计算。

需要注意的是,每个注意力头的输入维度会进行调整以适应旋转位置嵌入(RoPE)

步骤3:在Q和K中添加RoPE嵌入以编码位置信息

在这里插入图片描述

这一步是为了计算RoPE嵌入来编码位置信息。DeepSeek - V2(以及DeepSeek - V3和DeepSeek - R1)采用了解耦的RoPE方法来整合位置信息。这涉及创建专门用于携带位置信息的额外查询(Q)和键(K)向量,然后将这些增强了RoPE的Q和K向量与上投影后的Q和K向量拼接。

在传统的Transformer层中,RoPE操作直接应用于Q和K,不会改变Q和K的维度,但会改变Q和K中的语义表示(数值)以编码位置信息,因此得到的Q和K同时包含语义和位置信息。但在具有MLA的Transformer层中,RoPE应用于新生成的查询(Q)和键(K)嵌入,并与上投影后的Q和K拼接。
在这里插入图片描述

  • 生成Q的RoPE嵌入:传统上,RoPE(旋转位置嵌入)根据查询(Q)和键(K)向量在序列中的位置应用旋转矩阵,这种变换直接在Q和K中编码相对位置信息,无需像正弦或绝对编码那样的显式位置嵌入。但在MLA中,不是将RoPE应用于上投影后的Q( q t C q_{t_C} qtC),而是从 c t Q c_{t_Q} ctQ生成新的Q嵌入( q t R q_{t_R} qtR),并将RoPE应用于其上。

在这里插入图片描述

通过将 c t Q c_{t_Q} ctQ与权重矩阵 W Q R W_{QR} WQR相乘生成全新的查询嵌入,这些新的查询嵌入经过RoPE变换后得到位置编码的查询嵌入( q t R q_{t_R} qtR)。

在这里插入图片描述

q t R q_{t_R} qtR的生成方式使得它们可以与每个注意力头的输入查询嵌入拼接,以便每个注意力头都具有位置信息。

  • 生成K的RoPE嵌入:同样,不是将RoPE应用于上投影后的K,而是生成新的K嵌入并应用RoPE。

在这里插入图片描述

但与RoPE嵌入的 q t R q_{t_R} qtR有两个关键区别:

  • 新的K嵌入是从输入嵌入 h t h_t ht生成的,而不是从下投影后的K( c t K c_{t_K} ctK)生成;
  • 相同的RoPE嵌入的K(键)被拼接至每个注意力头的输入,分别计算RoPE嵌入的Q(查询)并拼接至每个注意力头。

DeepSeek - V2报告中解释了不从上投影后的K(即 k t C k_{t_C} ktC)生成的原因:如果对键 k C k_{C} kC应用RoPE, W U K W_{UK} WUK将与位置敏感的RoPE矩阵耦合。这样,在推理过程中, W U K W_{UK} WUK就不能再被吸收到 W Q W_{Q} WQ中,因为与当前生成的令牌相关的RoPE矩阵将位于 W Q W_{Q} WQ W U K W_{UK} WUK之间,而矩阵乘法不满足交换律。因此,为了提高推理效率,位置嵌入的K(键)嵌入是从输入嵌入 h t h_t ht生成的。
在这里插入图片描述

在这里插入图片描述

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

在这里插入图片描述

为了解决MLA中引入额外权重矩阵导致的内存和计算效率问题,DeepSeek - V2报告指出:在推理过程中,由于 W U K W_{UK} WUK可以被吸收到 W Q W_{Q} WQ中, W U V W_{UV} WUV可以被吸收到 W O W_{O} WO中,甚至不需要为注意力计算键和值。此外,为了减少训练过程中的激活内存,即使不能减少KV缓存,也对查询进行低秩压缩。

步骤4:计算注意力输出

在这里插入图片描述

拼接过程增加了Q和K向量的维度。为了处理这种增加的维度,模型可以采取以下两种方式之一:

  • 增加注意力头的数量,这将保持原始的每个头的维度,但需要更多的计算资源;
  • 调整每个头的维度,保持头的数量不变,但增加每个头的维度以适应拼接后的向量。

注意力输出使用标准的注意力方程计算:
在这里插入图片描述

O t i O_{t_i} Oti是注意力得分, u t u_t ut是注意力输出, W o W_o Wo表示输出投影权重矩阵。输出被投影回与输入相同的维度(例如,形状将是输入序列长度×2000)。

六、混合专家(MoE)

1. 什么是混合专家(MoE)

为了清楚理解MoE是什么,首先让我们看看它在Transformer中的确切使用位置以及其简要架构。标准Transformer层中的FFN被MoE所取代。
在这里插入图片描述

MoE的核心是遵循标准的Transformer设计,但通过引入多个并行的专家网络(FFN)而不是单个密集的FFN来修改前馈层。其工作方式如下:

  • 多个FFN而非一个:MoE使用多个并行训练的FFN层(专家),而不是单个共享的FFN。
  • 输入处理和标记路由:每个标记像往常一样通过Transformer自注意力层,然后不是由单个FFN处理,而是被发送到一个路由器,该路由器决定哪些专家应该处理它。
  • 通过路由器选择专家:一个小型的、可训练的路由器确定哪些专家子集(FFN)应该处理每个标记。通常,每个标记只选择1或2个专家以保持效率(例如,top - 1或top - 2门控)。DeepSeek - V3(DeepSeek - R1)使用9个专家,其中1个是共享专家,另外8个是路由专家。选择通常基于softmax评分机制,路由器为每个专家分配概率。具体来说,DeepSeek - V3(DeepSeek - R1)使用Sigmoid而不是softmax。
  • 专家的稀疏计算:只有被选中的专家处理标记,而其他专家保持不活跃。专家的输出通过加权求和组合,并传递到下一个Transformer层。在DeepSeek - V3/R1中,权重是归一化的Sigmoid输出。这种稀疏激活确保在任何时候只使用模型的一部分,使计算可控。

2. 为什么用MoE取代单个FFN

  • 可扩展性:MoE允许模型在不线性增加计算量的情况下增加更多参数。
  • 高效学习:专家专门处理数据的不同方面,提高了泛化能力。
  • 计算节省:由于每个标记只使用一部分专家,与相同大小的密集模型相比,MoE模型的运行成本更低。DeepSeek - V3/R1总共有6710亿个参数,每个标记激活370亿个参数。

3. MoE在DeepSeek - R1中如何工作

在这里插入图片描述

DeepSeek - V3技术报告中的以下方程展示了每个MoE层的计算过程。在DeepSeek系列模型中,MoE架构最早在DeepSeekMoE模型中引入,并在DeepSeek - V2、DeepSeek - V3和DeepSeek - R1中使用。

  • 路由器计算:在DeepSeek - V3、DeepSeek - R1和其他一些现代混合专家(MoE)模型中, e i e_i ei表示一个学习到的质心,有助于将输入路由到正确的专家。与传统的MoE架构不同,传统架构中基于FFN的路由器计算门控分数,这种方法预定义了一组可学习的向量 e i e_i ei,每个向量对应一个专家。每个专家 i i i都有一个关联的质心向量 e i e_i ei,不是将输入 u t u_t ut通过FFN来获得专家概率,而是通过点积计算 u t u_t ut与每个 e i e_i ei之间的相似度,

在这里插入图片描述

这个分数决定了一个专家对于给定输入的相关性,只有具有最高 s i , t s_{i,t} si,t值的前K个专家被激活进行处理。
在这里插入图片描述

在Sigmoid输出中添加一个偏置项,以创建一个无辅助损失的MoE负载平衡。输出值使用选定的前K个值进行归一化。

在这里插入图片描述

使用所选的前k个值对输出值进行归一化。

在这里插入图片描述

  • 专家计算
    在这里插入图片描述

u t u_t ut是MoE层的输入,方程中的第二项表示输入与共享专家相乘。每个专家由一个FFN(前馈网络)组成,因此用“FFN”表示。在DeepSeek - R1中,只有1个共享专家,因此 N s = 1 N_s = 1 Ns=1。同样,方程中的第三项表示输入与活跃的单个专家相乘。在DeepSeek - R1中,总共有256个单个专家,但每个标记只有8个是活跃的,因此 N r = 8 N_r = 8 Nr=8。每个活跃的单个专家都有一个与之相关的 g i , t g_{i,t} gi,t,用于计算第三项。

  • 输出计算
    在这里插入图片描述

h t h_t ht表示MoE层的输出, u t u_t ut是MoE层的输入。专家计算结果与输入 u t u_t ut相加,得到MoE层的输出。

七、多令牌预测(MTP)

1. 什么是多令牌预测

多令牌预测是语言建模中的一种高级方法,在这种方法中,模型不是一次预测序列中的下一个单词,而是同时预测多个未来标记。这种方法通过使模型能够并行预测多个即将到来的单词,提高了学习效率并加速了文本生成。
在这里插入图片描述

Meta引入了一种多标记预测架构,该架构训练语言模型同时预测多个未来标记,从而提高了样本效率和推理速度。基于这一概念,DeepSeek - V3纳入了多标记预测(MTP)目标,允许模型一次预测多个标记。这种方法使训练信号更加密集,并能够更好地预先规划令牌表示,从而提高了在复杂基准测试中的性能。

2. DeepSeek - V3/R1与Meta的多标记预测的两个关键区别

与Meta Research不同,Meta Research使用独立的输出头并行预测 D D D个额外的标记,而DeepSeek - V3顺序预测额外的标记,并在每个预测深度保持完整的因果链。Meta的模型预测4个标记,而DeepSeek - V3预测2个标记。Meta模型中的预测头是独立的,而DeepSeek - V3的预测头是顺序连接的。

3. MTP在DeepSeek - R1中如何工作

在这里插入图片描述

在训练期间,输入标记(位于左下角)通过嵌入层,然后传播通过所有的Transformer块/层。

第一个预测头(包括输出头)直接连接到主模型的最后一个Transformer层。输出头通常是一个前馈网络(FFN),其输出维度与模型的词汇表大小匹配。这个头负责预测序列中的下一个标记。给定输入令牌 t 1 t_1 t1 t 2 t_2 t2 t 3 t_3 t3 t 4 t_4 t4,它预测 t 2 t_2 t2 t 3 t_3 t3 t 4 t_4 t4 t 5 t_5 t5。然而,在推理期间,只计算最终标记 t 5 t_5 t5

第二个预测头通过添加额外的可学习层扩展了这种方法。它获取主模型最后一个Transformer层的输出,应用RMSNorm进行归一化,并将其与输入嵌入拼接。这些输入嵌入是从主模型中使用的相同嵌入层获得的。与第一个预测头不同,这个头从 t 2 t_2 t2而不是 t 1 t_1 t1开始处理输入标记。拼接后的输出然后通过线性投影层投影到合适的嵌入大小,接着通过一个可学习的Transformer块/层进行进一步处理。在训练期间,这个头预测 t 3 t_3 t3 t 6 t_6 t6,但在推理期间,只计算 t 6 t_6 t6

同样,第三个预测头从第二个预测头的Transformer块/层以及相应的输入嵌入(现在从 t 3 t_3 t3 t 6 t_6 t6)获取输入。它遵循与前一个头相同的结构,在训练期间预测 t 4 t_4 t4 t 7 t_7 t7,但在推理期间只计算 t 7 t_7 t7

每个预测头使用交叉熵计算损失,然后这些损失通过一个因子 λ \lambda λ加权,并取平均值作为最终损失值。
在这里插入图片描述
在这里插入图片描述

在DeepSeek - V3和R1中,MTP仅在训练期间使用,在推理期间不使用。
在这里插入图片描述

迈向AGI的星辰大海

在这片由代码与算法编织的星空下,DeepSeek-R1以其创新的GRPO、MLA、MoE和MTP技术,向我们展示了通向通用人工智能(AGI)的璀璨航路。每一个压缩的KV缓存、每一个动态激活的专家网络、每一次多标记的预见性推演,都是人类智慧在数字宇宙中刻下的星轨。这些突破不仅是算力的跃升,更是认知边界的拓展——它们让我们离真正理解语言、推理与创造的本质又近了一步。

AGI的曙光已在地平线上若隐若现,但这注定是一场需要全人类智慧共同奔赴的远征。正如DeepSeek-R1通过混合专家协同工作实现超越,我们每个人都是这场进化中不可或缺的"专家模块"。无论你是研究者、工程师,还是满怀好奇的学习者,此刻握在你手中的代码与论文,都可能成为点亮AGI火种的燧石。让我们以开放的心态拥抱变革,用持续的学习突破认知茧房,在Transformer的矩阵运算中寻找生命的逻辑,在神经网络的权重更新里见证文明的跃迁。未来已来,唯勇进者胜;星河浩瀚,唯探索者达。让我们携手前行,共同书写属于智能时代的《人类群星闪耀时》!

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

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

相关文章

火绒终端安全管理系统V2.0【系统防御功能】

火绒企业版V2.0系统防御功能包含系统加固、应用加固、软件安装拦截、摄像头保护和浏览器保护。火绒终端安全管理软件V2.0守护企业用户终端安全。 系统防御 1. 系统加固 系统加固功能根据火绒提供的安全加固策略,当程序对特定系统资源操作时提醒用户可能存在的安…

Word中接入大模型教程

前言 为什么要在word中接入大模型呢? 个人觉得最大的意义就是不用来回切换与复制粘贴了吧。 今天分享一下昨天实践的在word中接入大模型的教程。 在word中接入大模型最简单的方式就是使用vba。 vba代码要做的事,拆分一下就是: 获取用户…

【git-hub项目:YOLOs-CPP】本地实现04:项目简化

项目跑通之后,我们常常还需要对我们没有用到的任何内容进行删除,以简化项目体积,也便于我们阅读和后续部署。如何实现呢?本篇博客教会大家实现! 项目一键下载【⬇️⬇️⬇️】: 精简后:【GitHub跑通项目:YOLOs-CPP】+【计算机视觉】+【YOLOv11模型】+【windows+Cpp+ONN…

CTF 代码学习日记 PHP

基础 2字符串连接可以使用点号(.) 3.$_:在 PHP 中,以$_开头的变量(如$_GET、$_POST、$_COOKIE等)是超级全局变量。超级全局变量的特点是它们在 PHP 脚本的任何地方(包括函数内部、类内部等&am…

观察者模式说明(C语言版本)

观察者模式主要是为了实现一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。下面使用C语言实现了一个具体的应用示例,有需要的可以参考…

【从0做项目】Java搜索引擎(6) 正则表达式鲨疯了优化正文解析

阿华代码,不是逆风,就是我疯 你们的点赞收藏是我前进最大的动力!! 希望本文内容能够帮助到你!! 目录 文章导读 零:项目结果展示 一:导读&知识点回顾 二:遗留问题 …

【论文技巧】Mermaid VSCode插件制作流程图保存方法

插流程图快点 利用Mermaid Preview插件自带功能 如果你的VSCode安装了支持导出图片的Mermaid预览插件(如 Mermaid Markdown Syntax Highlighting 等),可以按以下步骤进行: 打开Mermaid代码文件:在VSCode中打开包含M…

【DeepSeek】如何将DeepSeek部署到本地?如何给本地 LLM 提供UI界面?CherryStudio 的使用

注:如果下面的所有操作,需要访问到 Github,可以先看这篇文章,了解如何流畅连接 Github 【Github】如何流畅链接Github.com-CSDN博客 一、下载 Ollama 1、访问网址 Ollama,点击下载 Ollama 到本地 选择自己计算机的系统…

mac开发环境配置笔记

1. 终端配置 参考: Mac终端配置笔记-CSDN博客 2. 下载JDK 到 oracle官网 下载jdk: oracle官网 :Java Downloads | Oraclemac的芯片为Intel系列下载 x64版本的jdk;为Apple Mx系列使用 Arm64版本;oracle官网下载时报错:400 Bad R…

交换机基本命令

目录 一、华为交换机基本命令 1、VRP视图层 2、命令帮助 3、配置设备名称 4、命令等级(一般生产过程没有下面的详细) 5、用户界面 6、配置Console认证 控制台接口(Console) 配置步骤示例 7、配置VTY登录(本文…

PHP图书借阅小程序源码

📚 图书借阅小程序:一键开启智慧阅读新篇章 🌟 这是一款由ThinkPHP与UniApp两大技术巨擘强强联手精心打造的图书借阅微信小程序,它犹如一座随身携带的移动图书馆,让您无论身处何地都能轻松畅游知识的海洋。创新的多书…

UE 播放视频

一.UI播放视频 1.导入视频文件至工程文件夹 2.文件夹内右健选择Media -> File Meida Source创建testFileMeidaSource文件。 编辑FilePath为当前视频 3.右键->Media->Media Player 创建testMediaPlayer文件 4.右键创建testMediaTexture。编辑MediaPlayer设置testMedia…

拦截器VS过滤器:Spring Boot中请求处理的艺术!

目录 一、拦截器(Interceptor)和过滤器(Filter):都是“守门员”!二、如何实现拦截器和过滤器?三、拦截器和过滤器的区别四、执行顺序五、真实的应用场景六、总结 🌟如果喜欢作者的讲…

react实例与总结(二)

目录 一、脚手架基础语法(16~17) 1.1、hello react 1.2、组件样式隔离(样式模块化) 1.3、react插件 二、React Router v5 2.1、react-router-dom相关API 2.1.1、内置组件 2.1.1.1、BrowserRouter 2.1.1.2、HashRouter 2.1.1.3、Route 2.1.1.4、Redirect 2.1.1.5、L…

巧用GitHub的CICD功能免费打包部署前端项目

近年来,随着前端技术的发展,前端项目的构建和打包过程变得越来越复杂,占用的资源也越来越多。我有一台云服务器,原本打算使用Docker进行部署,以简化操作流程。然而,只要执行sudo docker-compose -f deploy/…

使用 DeepSeek 生成商城流程图

步骤 1.下载 mermaid 2.使用 DeepSeek 生成 mermaid 格式 3.复制内容到 4.保存备用。 结束。

VSCode自定义快捷键和添加自定义快捷键按键到状态栏

VSCode自定义快捷键和添加自定义快捷键按键到状态栏 📄在VSCode中想实现快捷键方式执行某些指令操作,可以通过配置组合式的键盘按键映射来实现,另外一种方式就是将执行某些特定的指令嵌入在面板菜单上,在想要执行的时候&#xff0…

Ubuntu22.04 - gflags的安装和使用

目录 gflags 介绍gflags 安装gflags 使用 gflags 介绍 gflags 是Google 开发的一个开源库,用于 C应用程序中命令行参数的声明、定义和解析。gflags 库提供了一种简单的方式来添加、解析和文档化命令行标志(flags),使得程序可以根据不同的运行时配置进行调整。 它具…

java | MyBatis-plus映射和golang映射对比

文章目录 Java实体类和数据库的映射1.默认驼峰命名规则2.自定义字段映射3.关闭驼峰命名规则4.JSON序列化映射 Golang1. 结构体与表的映射2. 字段与列的映射3. 关联关系映射4. 其他映射相关标签 这篇也是做数据库映射方面的对比: Java 实体类和数据库的映射 1.默认…

正则表达式–断言

原文地址:正则表达式–断言 – 无敌牛 欢迎参观我的个人博客:正则表达式特殊字符 – 无敌牛 断言assertions 1、(?...):正向预查(positive lookahead),表示某个字符串后面应该跟着什么。但这个字符串本身…