2026/06/01

大模型知识学习

记录自己学习大模型相关知识的笔记

大模型学习求职

写在前面

学习方法

1、树立信心,战略上藐视

为什么有时候我们会觉得学不懂或者学习某个内容很难?

世界上没有“绝对困难”的内容,只有“简单但不完整”的内容。

所有的概念,本质上都是一个“逻辑链条”,一环接一环。

学习的本质是我们从已知出发,走向未知,而学习的难度正取决于已知与未知间的割裂程度:倘若已知与未知之间是通过一个个紧密相连的中间环节连接的,那每一步都可以轻易到达,最终通过多个简单步骤的叠加,到达未知;倘若已知与未知之间存在大量断裂的环节,我们则需要猜测或补足这些缺失的中间环节,困难就是在这个过程中出现的。

例如从 A 到 C 之间缺失的部分是 B,从 A 到 B 到 C 的逻辑不难,难的是修补 A 和 C 之间断裂的逻辑链条。

因此,所有的概念都是通过大量简单的概念形成“逻辑链条”得到的,我们学习的过程,其实就是不断填补缺失的逻辑链条的过程。所以在学习上受挫时,不要自我怀疑,也不要因此气馁,而应该去补足中间缺失的一个个简单的中间环节。

2、战术上重视

  1. 提升大脑提取、总结能力:如果是看视频,每 3-5 分钟就回顾总结刚才看的内容;如果是文档,每几页或每个小节就回去总结学的内容。

  2. 目标粉碎化,获取频繁正反馈:每一小段内容就进行回顾、总结,遇到不能顺利回顾、总结的部分,就倒回去重新学习。完成此过程后落盘为阶段性成果(可以是文档、公式推导、思维导图等),以获得正反馈,然后清空大脑,继续下一个任务。

  3. 三遍学习法:完整观看视频,抓住整体逻辑脉络,不纠结细节,遇到不懂的点先标记,而是建立全局认知;动手复现代码,培养独立解决问题的能力,目标是“跑通 + 理解每一行代码的作用”;闭卷复述(知识点,录音或白板手写)& 手撕(代码),从“学了”走向“学会了”

3. 学到了什么,远远大于学了什么

看的视频/文档,跟着做的笔记都是学了什么。而脱离视频和文档对所学内容的总结,独立画的思维导图,才是学到了什么。

学习纪律

  1. 代码必须动手写,动手跑
  2. 面试题当真题,最好对着镜子/录音,模拟面试状态
  3. 里程碑小结,每个模块结束后,写“模块小结”,回答:这个模块解决了什么问题?核心思想是什么?和上一个模块的关系是什么?
  4. 遇到问题自己先解决,培养独立解决问题能力(未来工作最重要竞争力之一)
  5. 日拱一卒,不要断档

每阶段通关要求

  1. 思维导图:闭卷复述
  2. 面试题:脱稿讲解
  3. 代码手撕:不借助任何工具

阶段一 大模型核心技术

第一讲 NLP 核心技术概念

1 大模型在 AI 中的地位

整个 AI 领域现有技术的关系大致如下:

  • ML 是 AI 下的一个大分支,其中 DL 又是目前 ML 的主流分支。
  • NLP 是一个历史悠久的问题,最早用 ML 和其他非 ML 的 AI 方法来解决,现在主流的解决方案为 DL 分支下提出的 LLM。
  • CV 又是另一个历史悠久的问题,最早也用 ML 和其他非 ML 的 AI 方法来解决,现在主流的解决方案为 DL 分支下提出的 NN 方案与 LLM 方案融合所成的 MLLM(多模态大语言模型)方案。

着重介绍一下 MLLM,这是以前没有接触过的概念:

  • 可以理解为:LLM + 图像/音频/视频等其他模态输入能力。其中模态是指信息的表现形式,常见模态有:文本、图像、音频、视频、传感器数据。
  • 传统的 LLM(如 GPT)最早属于:单模态模型(Text-only),只能处理文字。而 MLLM 则可以处理多种模态的数据。
  • 所以 MLLM 和 LLM 的主要区别在于:
    LLM         MLLM
    
                图片
                音频
                视频
    文字         文字 等
    ↓           ↓
    LLM         MLLM
    ↓           ↓
    文字         文字
                图片
                语音 等
  • MLLM 的核心结构可简化为
    图片
    
    Vision Encoder: 负责看图,常见的有 ViT、CLIP、SigLIP,作用是将图片转换为数字特征
    
    特征向量
    
    Adapter/Projector:将视觉特征翻译成 LLM 能理解的 Token
    
    LLM
    
    文字输出

上述技术整体关系图如下图所示

大模型在AI中的地位

2 什么是语言模型

语言模型是这样一个模型:对于任意的词序列,它能够计算出这个序列是一句话的概率。最早应用于语音识别问题,语音识别算法在将语音转换为文字时会给出多个候选序列,这个时候就需要用语言模型对候选序列做排序。

所以从概率论的角度来看,语言模型的任务是估计: P(w1,w2,...,wn), 其中 wi 为词 P(w_1,w_2,...,w_n),\space 其中\space w_i \space 为词一个词序列出现的概率。也可写成条件概率: P(w1,w2,...,wn)=i=1nP(wiw1,w2,...,wi1)P(w_1,w_2,...,w_n) = \prod_{i=1}^nP(w_i | w_1, w_2, ..., w_{i-1}) 意思为根据前面的词预测下一个词

那其中的每一个条件概率如何计算呢?根据计算方式的不同,便分为了统计语言模型神经网络语言模型两大类,以 P(w3w1,w2)P(w_3 |w_1, w_2) 的计算为例,展示两种语言模型的区别:

统计语言模型

  1. 对于统计语言模型,上述概率计算过程为 P(w3w1,w2)=count(w1,w2,w3)count(w1,w2)P(w_3 |w_1, w_2) = \frac{count(w_1, w_2, w_3)}{count(w_1, w_2)}

    • 如何体现统计性:在具有代表性的大语料库(如维基百科)上进行统计,统计出来的结果可代表真实人类语言;
    • w3w_3(即候选词)的来源:从上述语料库中收集整理所有不重复的词,做成词表(大小几万至几十万不等),词表中的词即可作为候选词;
    • 如此计算的依据:核心思想为根据大数定律,当语料库足够大时,可以用词出现频次来估计词出现概率。用L|L|表示语料库长度,所以有 P(w3w1,w2)=P(w1,w2,w3)P(w1,w2)=count(w1,w2,w3)L2count(w1,w2)L1,L很大时,L1L2近似相等=count(w1,w2,w3)count(w1,w2)\begin{align} P(w_3|w_1, w_2) &= \frac{P(w_1, w_2, w_3)}{P(w_1, w_2)} \\ &= \frac{\frac{count(w_1,w_2,w_3)}{|L|-2}}{\frac{count(w_1,w_2)}{|L|-1}}, 当|L|很大时,|L|-1与|L|-2近似相等 \\ &= \frac{count(w_1,w_2,w_3)}{count(w_1,w_2)} \\ \end{align}
  2. 为了简化条件概率链式法则中长历史条件概率的,统计语言模型通常采用 N-gram 假设,即认为当前词仅与最近 N-1 个词有关。但由于强马尔可夫假设,会直接导致长距离依赖被忽略,即 N-gram 无法建模长距离语义依赖。

  3. 同时该方法有个明显的问题为数据稀疏导致的零概率问题:若某一合理词序列未在语料库中出现过(即频次为 0),导致概率为 0。为此提出平滑方法以解决该缺点,以拉普拉斯平滑为例,分子频次 + 1,分母频次 + |V|(词表大小)。

  4. 总的来说,统计语言模型有如下几个难以克服的问题存在:

    1. 长距离依赖被忽略
    2. 高阶 N-gram 的参数量呈指数级爆炸增长O(VN)O(V^N),组合空间爆炸,绝大多数词组合从未出现,导致数据极度稀疏,进而导致的零概率问题
    3. 由于指数级爆炸增长的参数量,进而导致存储和计算复杂度极高
    4. 容易出现过拟合,如 w1,w2w_1, w_2w1,w2,w3w_1, w_2, w_3 均只在语料库中出现过一次,则 P(w3w1,w2)=1P(w_3|w_1, w_2) = 1,将偶然事件当作必然事件,无法输出其他有意义的词序列
    5. 泛化能力差,完全基于“记忆”,没有理解,强烈依赖于训练语料库
    6. 无法处理未登录词(OOV 问题)
    7. 没有参数共享

神经网络语言模型

  1. 对于神经网络语言模型,依旧采用 N-gram 假设,但不再采用统计的方法,而是将构建好的模型在语料库上进行训练,此后向模型输入上下文 context,模型输出所有候选词的出现概率。
  2. 神经网络语言模型训练集的构建:以 N-gram 模型为例,将语料库按长度为 N 的滑动窗口进行切分,每个滑动窗口中前 N-1 个词为模型输入,第 N 个词为模型输出(即标签),据此构建神经网络语言模型的训练集。
  3. 神经网络语言模型接受输入的方式为:依据输入词 id 在共享词表 C 中进行 look-up,将每个词转换为模型能够处理的词向量。
  4. 总的来说,神经网络语言模型的整体结构为:输入层、隐藏层、输出层。

3 面试题

一、如何评价一个语言模型好坏?

为评价一个语言模型的好坏,最直接的方式是将其放在应用场景中进行判断,但该方法与应用场景高度绑定,不具有泛化性,且耗时,所以人们设计出一种与应用场景无关的、客观的评价指标:困惑度(Perplexity)

设有一长度为 NN 的词序列 WW

PPL(W)=P(W)1N=(iNP(wiw1,w2,,wi1))1NP(W)越大,PPL(W)越小\begin{align} PPL(W) &= P(W)^{-\frac{1}{N}} \\ &= (\prod_i^N P(w_i|w_1,w_2,\dots,w_{i-1}))^{-\frac{1}{N}} \\ \end{align} \\ 故 P(W) 越大,PPL(W) 越小

困惑度计算公式如此设计的原因如下,

  1. 首先明确语言模型在做什么:

    一句话 WW 可以写成:

    W=(w1,w2,,wN)W = (w_1, w_2, \dots, w_N)

    语言模型会给整个句子一个概率:

    P(W)=P(w1,w2,,wN)=iNP(wiw1,w2,,wN)P(W) = P(w_1, w_2, \dots, w_N) = \prod_i^N P(w_i|w_1,w_2, \dots, w_N)

    也就是说: 整句话的概率 = 每一步预测正确词的概率连乘

  2. 那为什么不能直接用 P(W)P(W) 来评价模型?

    因为句子越长,概率连乘越多,而每个概率均小于等于 1,故 P(W)P(W) 天然越小,所以直接比较 P(W)P(W) 不公平,需要将其变成:平均到每个词上的预测难度,所以公式里会有一个 1N\frac{1}{N}

  3. 为什么是 PPL(W)=P(W)1NPPL(W) = P(W)^{-\frac{1}{N}} 呢?

    这需要拆成两个部分来理解:

    1. NN 次方根 P(W)1NP(W)^{\frac{1}{N}}

      这表示每个词的平均预测正确概率,因为P(W)=P(w1,w2,,wN)=iNP(wiw1,w2,,wN)P(W) = P(w_1, w_2, \dots, w_N) = \prod_i^N P(w_i|w_1,w_2, \dots, w_N),所以P(W)1N=(iNP(wiw1,w2,,wN))1NP(W)^{\frac{1}{N}}=(\prod_i^N P(w_i|w_1,w_2, \dots, w_N))^{\frac{1}{N}},这是所有条件概率的几何平均数

      这里为什么用几何平均数,以及几何平均数所代表的含义,可以用这样一个小例子来说明:

      首先,因为这里是概率的连乘,所以应该用几何平均,而非算数平均;

      假设一句话有 3 个词,每一步预测正确真实词的概率分别为 0.5,0.2,0.10.5, 0.2, 0.1,则整句话的概率为 P(W)=0.5×0.2×0.1=0.01P(W) = 0.5 \times 0.2 \times 0.1 = 0.01

      现在我们想找一个“平均概率” pp,使其满足 p×p×p=0.01p \times p \times p = 0.01,即 p3=0.01p^3=0.01,所以 p=0.0113=(0.5×0.2×0.1)13p = 0.01^{\frac{1}{3}}=(0.5 \times 0.2 \times 0.1)^{\frac{1}{3}}

      由该例子可以看到,取 P(W)P(W)NN 次方根,可以将整句正确预测的概率平均到正确预测每个词上,使得比较与句子长度无关。

    2. 取倒数

      正确预测概率越大时,模型越好;但我们希望困惑度指标越小越好,所以我们取倒数。同时 PPL=1P(W)1NPPL = \frac{1}{P(W)^{\frac{1}{N}}} 表示模型平均每一步大概在几个词之间困惑。所以平均正确预测概率越高,困惑度越低;平均正确预测概率越低,困惑度越高,其本质上是 PPL(W)=1每个词的平均正确预测概率PPL(W) = \frac{1}{每个词的平均正确预测概率}

  4. 困惑度和交叉熵的关系

    困惑度也可以写作:

    PPL(W)=exp(1NiNlogP(wiw1,w2,,wi1))PPL(W) = exp(-\frac{1}{N}\sum_i^NlogP(w_i|w_1,w_2,\dots,w_{i-1}))

    其中 exp 中的部分就是平均负对数似然,也就是语言模型常用的交叉熵损失,所以:

    PPL=exp(CrossEntropy)PPL = exp(Cross Entropy)

具体操作方法为:人为构建一个由代表性词序列组成的测试集,语言模型在该测试集上的困惑度越低,则代表性词序列概率越高,语言模型效果越好

二、如果神经网络语言模型的词表 V 很大,如何加速训练,避免直接用全量 softmax?

  1. 首先明确 softmax 操作是将模型原始输出的 logits 转换为和为 1 的概率分布,其具体操作为:

    P(wicontext)=ezij=1NezjP(w_i|context) = \frac{e^{z_i}}{\sum_{j=1}^Ne^{z_j}}

    其中:

    • ziz_i为第 i 个候选词的原始分数;
    • ezje^{z_j}分数变为正数,确保没有负概率出现;同时放大分数差距,如 e5e3e1e^5 \gg e^3 \gg e^{-1},使原始得分高的词获得明显更大的概率
    • j=1Nezj\sum_{j=1}^Ne^{z_j}为归一化项
    • P(wicontext)P(w_i|context)为第 i 个词被选中的概率

    由此可见:每训练一个样本,都要计算整个词表所有词分数的指数和归一化项,复杂度大约是 O(V)O(|V|),词表越大,训练越慢。

  2. 这个问题有两种主要解决方法

    1. 负采样

      • 核心思想为:不再让模型从整个词表中选择正确词,而是让模型判断“这个词是不是当前上下文的真实目标词”。即将原来的 |V| 类分类问题,变成多个二分类问题

      • 举一个直观的例子

        假设模型输入为:

        我 爱 自然 语言

        正确的输出是:

        处理

        全量 sotfmax 会问:

        在整个词表里,下一个词是哪个?

        它要比较:

        处理、学习、苹果、…

        整个词表全部都要算。

        负采样则只问:

        “处理”是不是正确词?

        “学习”是不是正确词?

        “苹果”是不是正确词?

        训练目标是:

        让真实词得分高,让负样本得分低

      • 负采样训练的数学形式

    2. Hierarchical Softmax

      首先根据语料库收集每个词的词频,再用词频和词构建一个叶子结点个数为 V 的哈夫曼树