DeepSeek 的核心代码不超过 1000 行,但它背后的设计思想,值得每个 AI 从业者真正弄懂一次。


📌 先说结论:大模型本质是在做选择题

在看任何技术细节之前,先记住这个关键事实:

大语言模型的输出,看似在"生成"语言,本质上是在做选择题。

每次输出一个词,都是在词汇表里"选"出概率最高的那个。整个复杂的神经网络,都在为这一次"选择"服务。

明白了这一点,后面所有的技术细节就都有了落脚点。


🗺️ 三大阶段总览

ChatGPT、DeepSeek 等主流大模型都采用 Transformer 架构,工作流程分为三大阶段:

┌─────────────────────────────────────────────────────┐│                                                       ││  阶段一:输入处理          人类语言 → 数字矩阵         ││       ↓                                               ││  阶段二:Transformer 层    数字矩阵 → 语义理解         ││       ↓                                               ││  阶段三:输出处理          语义理解 → 下一个词         ││                                                       │└─────────────────────────────────────────────────────┘

阶段一:输入处理——让计算机读懂人话

1.1 Token:语言的最小单位

模型不认识"汉字",只认识"Token"。

模型基于大量语料,统计出常见的词、词根和符号,构建出一张词汇表。词汇表里的每个条目就叫做 Token,是模型理解和生成语言的最小单位。

> 比如"用苹果手机拍苹果"这句话,会被切分为 5 个 Token

原始句子:用苹果手机拍苹果切分结果:[用] [苹果] [手机] [拍] [苹果]          ↓     ↓      ↓    ↓    ↓         编号  编号   编号  编号  编号(在词汇表中的索引)

1.2 词嵌入:把词语变成向量

有了编号还不够,计算机需要的是可以做数学运算的数字

模型用一个高维向量(词嵌入向量)来表示每个 Token,每个维度代表某种抽象的语义特征。这些数值不是人工设定的,而是通过海量训练自动学到的。

语义相似的词,在高维空间里距离更近:

高维语义空间示意(用三维简化表示):        猫 ●  ● 狗            ↗       (语义相近,距离近)国王 ● ──── 女王 ●  ↕              ↕男人 ● ──── 女人 ●国王 - 男人 + 女人 ≈ 女王  (向量运算可以体现语义关系)

为便于说明,我们把词嵌入向量简化为 4 维,每个 Token 得到一个 4 维向量:

[用]   → [0.2, -0.1, 0.8, 0.3][苹果] → [0.5,  0.7, 0.1, 0.9][手机] → [0.6,  0.4, 0.2, 0.7][拍]   → [0.1, -0.3, 0.9, 0.4][苹果] → [0.5,  0.7, 0.1, 0.9]  ← 暂时和上面那个苹果一样

1.3 位置编码:告诉模型"谁在哪儿"

Transformer 是并行处理所有 Token 的,不像传统模型一个一个顺序处理。好处是速度快,但带来一个问题:模型不知道词语的顺序

同样的词,在不同位置含义不同:

“我爱你” ≠ “你爱我” ↑           ↑位置不同,含义完全不同

为此,Transformer 引入了位置编码,为每个 Token 叠加一个"位置标签"。

传统方法用正弦/余弦函数计算位置编码,每个位置的编码组合都是唯一的:

词嵌入向量  +  位置编码  =  输入向量[苹果]位置1:[0.5, 0.7, 0.1, 0.9] + [PE₁] = [新向量A][苹果]位置5:[0.5, 0.7, 0.1, 0.9] + [PE₅] = [新向量B]A ≠ B  → 模型能区分两个位置不同的“苹果”了!

至此,输入处理完成。人类语言被转化成了一个 Token数量 × 向量维度 的数字矩阵,可以开始计算了。


阶段二:Transformer 计算层——真正的"理解"发生在这里

每个 Transformer Block 包含以下几个关键步骤:

输入矩阵    ↓[层归一化]    ↓[自注意力机制]  ← 核心!让每个词理解上下文    ↓[残差连接]    ↓[层归一化]    ↓[前馈神经网络]  ← 提取更高阶特征    ↓[残差连接]    ↓输出矩阵(传入下一个 Block)

2.1 层归一化:先稳定一下数据

在计算之前,模型会对数据做"归一化"处理:

  1. 减去均值

    :让数据中心化

  2. 除以标准差

    :消除不同维度的尺度差异

  3. 加上可训练参数(γ 和 β)

    :保留模型的灵活性

> 举个例子:原始向量是 [3万, 10万, 50],数值差距巨大,后续的指数计算会被极端值主导。归一化后,各特征处于相对平衡的范围,模型学得更稳。

2.2 自注意力机制:让每个词"环顾四周"

这是 Transformer 最核心的设计,核心思想是:让每个 Token 根据上下文,动态调整自己的含义

以"手机"这个词为例:

初始语义:手机(基础含义)    ↓结合上下文"用"→ 被使用的对象结合上下文"苹果"→ 很可能是苹果品牌结合上下文"拍"→ 暗示拍照功能、高端属性    ↓更新语义:苹果牌手机,用于拍摄,隐含高端、拍照好等属性

如何实现这个过程?引入三个矩阵:

矩阵

名称

含义

Q

(Query)

查询矩阵

当前 Token 想了解什么?它的"提问方向"

K

(Key)

键矩阵

每个 Token 的"内容标签",能回答哪些问题

V

(Value)

值矩阵

每个 Token 携带的具体信息

计算流程如下:

Step 1:用 Q 和 K 计算“关注度”(点积)        注意力得分 = Q × KᵀStep 2:缩放(防止数值波动)        缩放后得分 = 注意力得分 / √dkStep 3:Softmax → 得到注意力权重(归一化为概率分布)Step 4:用注意力权重对 V 加权求和 → 得到更新后的表示向量

因果掩码:训练时不能"偷看答案"

模型训练时,要预测"下一个词"。如果让当前词看到未来的词,就等于提前知道答案,训练就没意义了。

解决方案是因果掩码:把注意力矩阵的上三角部分设为 -∞,经过 Softmax 后变为 0,保证每个 Token 只能看到它之前的内容。

注意力矩阵(上三角 = -∞):     用   苹果  手机   拍   苹果用  [ a   -∞   -∞    -∞   -∞  ]苹果[ b    c   -∞    -∞   -∞  ]手机[ d    e    f    -∞   -∞  ]拍  [ g    h    i     j   -∞  ]苹果[ k    l    m     n    o  ]每一行只能看到当前位置和之前的 Token ✓

2.3 多头注意力:从多个角度同时理解

单头注意力只能从一个角度理解上下文。多头注意力相当于同时从多个维度分析:

                输入               /  |  \  \           头1  头2  头3  头4     ← 每个头独立学习不同的语义关系            |    |    |    |        (语法结构、指代关系、语义相似…)           拼接所有头的输出               ↓           线性变换矩阵 Wₒ               ↓           整合后的输出

2.4 前馈神经网络:提取更高阶特征

自注意力关注的是 Token 之间的关系,前馈网络则对每个 Token 自身做非线性变换,提取更抽象的特征。

结构是两层全连接网络 + ReLU 激活函数:

FFN(x) = ReLU(x·W₁ + b₁)·W₂ + b₂                 ↑           ReLU:小于0输出0,大于等于0保持不变           (引入非线性,让模型能拟合复杂模式)

2.5 残差连接:别忘了你从哪里来

多层计算后,原始信息容易被扭曲甚至丢失。残差连接直接把输入加回输出:

Y = X + F(X)↑       ↑原始输入  子层的计算结果主干始终是最初传入的数据,各层计算只是“添加新信息”

阶段三:输出处理——从向量到词语

经过多个 Transformer Block 处理后,模型拿到最后一个隐藏状态向量,开始预测下一个 Token:

最后一层隐藏状态      ↓[层归一化]      ↓[线性投影到词汇表大小]  ← 计算与所有 Token 的相似度      ↓得到 Logits 向量(每个 Token 的原始得分)      ↓[Softmax + 温度系数]  → 概率分布      ↓[采样策略]  → 选出下一个 Token      ↓查词汇表  → 输出对应的词

温度系数:控制输出的"随机性"

温度系数 T 是个调节旋钮:

温度 T

效果

适用场景

T < 1

概率分布更尖锐,输出更确定

代码生成、事实问答

T = 1

正常概率分布

通用对话

T > 1

概率分布更平坦,输出更随机

创意写作、头脑风暴

采样策略:怎么从概率分布里选词

  • 贪心采样

    :每次直接选概率最高的词,结果稳定但可能重复

  • 随机采样

    :按概率分布随机选,输出更多样,但可能不够准确


📊 完整流程一览

人类输入文字    ↓[Tokenization]  文字 → Token 序列    ↓[词嵌入查表]  Token → 高维向量    ↓[位置编码叠加]  向量 + 位置信息    ↓┌─────────────────────────────┐│     Transformer Block × N   ││  层归一化 → 多头自注意力    ││  → 残差连接 → 层归一化     ││  → 前馈神经网络 → 残差连接  │└─────────────────────────────┘    ↓[层归一化]    ↓[线性投影 + Softmax]  → 概率分布    ↓[采样]  → 下一个 Token    ↓输出词语,追加到序列,重复上述过程

💡 一句话总结大模型的本质

> 大语言模型,本质上是通过算力拆解语义,拟合人类认知世界的方式,最终呈现出"智能"的样子。

它做的事情并不神秘:把语言变成数字,用注意力机制理解上下文关系,再从词汇表里挑出最合适的下一个词。一遍又一遍,直到说完整句话。

像 DeepSeek-V3 这样的顶级模型,核心代码也不超过 1000 行。复杂的是参数量和训练数据,而不是流程本身。


🔍 关键概念速查表

概念

一句话解释

Token

模型处理语言的最小单位,相当于"词"

词嵌入

把词语映射到高维向量空间的表示方式

位置编码

给每个 Token 加上位置标签,让模型知道顺序

自注意力

让每个 Token 根据上下文动态调整自身含义

Q/K/V

查询/键/值矩阵,自注意力的三个核心组件

因果掩码

训练时防止"偷看答案"的机制

多头注意力

从多个角度同时理解上下文

前馈网络

对每个 Token 独立提取高阶特征

残差连接

把原始输入叠加回输出,防止信息丢失

温度系数

控制输出随机性的调节旋钮

Logits

Softmax 之前的原始得分向量


🔔 下次有人问你"大模型到底怎么运行的",把这篇发给他。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐