Fork me on GitHub

Base LLM | 从 NLP 到 LLM 的算法全栈教程 - 学习笔记

第一章:NLP 简介

第一节:NLP 概述

学习内容

1. NLP 的定义与核心任务

自然语言处理(Natural Language Processing, NLP)是人工智能领域的重要组成部分,其目标是让计算机理解、解释、生成人类语言。课程用了一个生动的例子说明 NLP 的挑战:计算机需要理解"我今天很蓝"中的"蓝"并非颜色,而是情绪的表达——这正是 NLP 的核心挑战:弥合人类语言的模糊性与计算机精确指令系统之间的鸿沟。

NLP 在工程实践中分为两大能力:

  • 自然语言理解(NLU):输入语言,输出结构化信息。例如从"帮我订一张明天去上海的机票"中解析出"订票"意图和"上海""明天"等关键信息
  • 自然语言生成(NLG):输入结构化信息,输出语言。例如天气 APP 根据数据生成"北京今日晴,气温 25℃"的文本

思考与见解:

作为前端,我对"输入-处理-输出"的模式很熟悉。NLU 类似于"解析器"——将非结构化输入转换为结构化数据,这与前端解析用户输入、API 响应的逻辑相似。NLG 则类似于"模板渲染"——将数据转换为可展示的文本。但 NLP 的复杂性在于语言的歧义性和上下文依赖,这是前端工作中很少遇到的挑战。

2. NLP 的技术层次

课程将 NLP 技术体系比喻为金字塔,由浅入深分为四个层次:

层次

任务

示例

词法分析

分词、词性标注

"南京市长江大桥" → 南京市/长江大桥

句法分析

语法结构分析

分析"我爱北京天安门"的主谓宾结构

语义分析

词义消歧、关系抽取

判断"苹果"指水果还是公司

语用分析

语境意图理解

"房间里真冷"可能是请求关窗

思考与见解:

这让我联想到前端渲染的层次:DOM 结构解析(类似词法分析)、样式计算(类似句法分析)、语义化标签(类似语义分析)、用户交互意图(类似语用分析)。NLP 的层次结构让我理解了为什么简单的关键词匹配无法真正"理解"语言——真正的理解需要层层递进的深度分析。

3. NLP 发展历程

课程梳理了 NLP 从 1950s 到现在的四个发展阶段:

  • 萌芽期(1950s):图灵测试提出,早期机器翻译尝试,但严重低估了语言复杂性
  • 规则时代(1960s-1980s):语言学家主导,用逻辑规则描述语言,但规则难以穷尽,系统脆弱
  • 统计时代(1990s-2000s):范式转变——"让计算机从数据中学习规律",N-gram、HMM、CRF 成为主流
  • 深度学习时代(2010s-至今):Word2Vec(2013)、注意力机制(2014)、Transformer(2017)、BERT(2018)、GPT-3(2020)、ChatGPT(2022)

思考与见解:

这个发展历程让我深刻理解了"从规则到数据"的范式转变。我习惯于编写明确的规则(if-else、正则表达式),但 NLP 的发展表明:面对复杂问题,让模型从数据中自动学习规律,比人工设计规则更有效。这让我反思:在处理复杂业务逻辑时,是否也可以借鉴"数据驱动"而非"规则驱动"的思路?

课程特别强调了几个里程碑:

  • Word2Vec:将词语表示为稠密向量,发现 vector(国王) - vector(男人) + vector(女人) ≈ vector(女王) 的语义规律
  • Transformer:抛弃 RNN,完全基于注意力机制,实现并行计算,成为大模型基础
  • ChatGPT:通过 RLHF 对齐人类偏好,引爆全球 AI 浪潮

4. NLP 主要任务

课程列举了八大 NLP 任务,让我对应用场景有了清晰认识:

任务

描述

应用

文本分类

给文本分配标签

情感分析、垃圾邮件过滤

命名实体识别(NER)

找出关键实体

"马云""1999年""杭州"等识别

关系抽取

判断实体间关系

创始人(马云, 阿里巴巴)

机器翻译

语言间转换

Google 翻译

文本摘要

压缩长文本

新闻摘要、会议纪要

问答系统

针对问题给出答案

智能客服

文本生成

自动生成文本

AI 写作、代码生成

对话系统

多轮交互

ChatGPT

心得体会:

学习完 NLP 概述,我对 NLP 的全貌有了清晰认识。最深刻的感悟是:NLP 的发展史就是一部"从人工规则到自动学习"的历史。作为前端开发者,我习惯于编写明确的逻辑规则,但 NLP 告诉我:面对语言的复杂性,"让模型自己学"比"人工教模型"更有效。这不仅是技术路线的转变,更是思维方式的重构。


第二节:环境准备

学习内容

1. Anaconda 安装与配置

课程详细介绍了 Anaconda 的安装流程,包括:

  • Anaconda Distribution vs Miniconda 的选择(建议初学者选择 Anaconda Distribution)
  • Windows/macOS/Linux 各平台的安装步骤
  • 环境变量配置(Windows)
  • 国内镜像源配置(清华源加速)

2. 创建专用虚拟环境

课程强调为本项目创建独立的 base-llm 环境:

conda create -n base-llm python=3.10
conda activate base-llm

3. 安装依赖

基础库安装:

pip install numpy pandas matplotlib scikit-learn jupyter

PyTorch 安装(根据设备选择 CPU 或 GPU 版本):

# CPU 版本
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu

# GPU 版本需先查看 CUDA 版本(nvidia-smi),再选择对应 PyTorch 版本

思考与见解:

我对"环境隔离"的概念很熟悉——类似 npm 的 node_modules,但 Python 的虚拟环境管理更底层、更系统。课程强调"不要把 Anaconda 安装在中文或空格路径下",这与前端开发中"避免路径编码问题"的经验一致。

虚拟环境的重要性让我理解了 Python 项目的依赖管理哲学:每个项目独立环境,避免版本冲突。这与 npm 的 package.json 类似,但更彻底——连 Python 解释器都可以隔离。


第二章:文本表示与词向量

第一节:初级分词技术

学习内容

1. 分词的定义与重要性

分词是将连续文本序列切分成具有独立语义的基本单元(词或词元)。对于中文等无空格分隔的语言,分词是 NLP 的基础步骤。

课程用"南京市长江大桥"的经典例子说明分词错误的影响:

  • 正确切分:南京市 / 长江大桥
  • 错误切分:南京 / 市长 / 江大桥 → 搜索结果完全跑偏

这被称为"级联效应"(Cascading Effect):一个微小的分词错误会在后续处理链条中被不断放大。

思考与见解:

作为前端,我对"字符串处理"很熟悉,但大多是简单的 split、substring 操作。分词的复杂性让我意识到:看似简单的"切分字符串",在 NLP 中是一个需要精心设计的算法问题。错误分词的级联效应让我联想到前端中的"数据污染"——一个源头错误会层层传递,最终导致渲染错误。

2. jieba 分词原理

课程深入讲解了 jieba 的核心算法——基于词典与动态规划:

核心思想:

  1. 基于前缀词典(Trie 树)构建有向无环图(DAG),包含所有可能的词语组合
  2. 用动态规划寻找概率最大的路径作为分词结果

概率计算:

路径概率 = 各词概率的乘积:

$$P(w_1, w_2, ..., w_n) \approx P(w_1) \times P(w_2) \times ... \times P(w_n)$$

每个词的概率由其在词典中的频率估算。

工程技巧:Log 概率与动态规划

课程详细讲解了两个关键优化:

  • Log 概率:将概率乘积转换为 log 概率之和,避免浮点数下溢
  • 动态规划:从后向前递推计算最优路径,避免暴力枚举所有可能

思考与见解:

这部分数学推导让我有些吃力,但课程用具体例子帮助理解:

  • 路径 A:给/阿姨/倒/一杯/卡布奇诺
  • 路径 B:给/阿姨/倒/一/杯/卡布奇诺

如果"一杯"是高频词,P(一杯) >> P(一) × P(杯),则路径 A 的概率更大。

这让我理解了算法设计的精妙之处:看似简单的"选择切分路径",背后是概率论与动态规划的结合。作为前端开发者,我习惯于"确定性逻辑"(if-else),但分词算法让我看到了"概率性决策"的力量——选择"最可能正确的路径",而非"绝对正确的路径"。

3. jieba 实践

课程提供了清晰的代码示例:

import jieba

text = "我在梦里收到清华大学录取通知书"
seg_list = jieba.lcut(text, cut_all=False)  # 精确模式
print(seg_list)
# 输出:['我', '在', '梦里', '收到', '清华大学', '录取', '通知书']

自定义词典:

当遇到词典未收录的新词(如"奔波儿灞"),可通过自定义词典添加:

jieba.load_userdict("./user_dict.txt")

心得体会:

分词章节让我理解了 NLP 的"第一道门槛"。看似简单的"切分字符串",背后涉及 Trie 树、动态规划、概率计算等复杂算法。课程提到的"现代大模型更多采用子词(Subword)切分策略"让我意识到:传统分词方法正在演进,但理解其原理仍是学习 NLP 的必要基础。


第二节:词向量表示

学习内容

1. 为什么需要词向量?

课程用"国足爱吃海参"的情感分类任务说明核心问题:

  • 计算机无法直接理解"字符串"
  • 模型输入必须是数值形式(向量或矩阵)
  • 需要系统性地将符号转换为数字

词向量表示的目标:

不仅要唯一标识每个词,更要让向量蕴含语义信息——"国王"与"女王"的向量距离应小于"国王"与"香蕉"的距离。

思考与见解:

这让我联想到前端中的"数据编码"——将用户输入转换为程序可处理的数据。但词向量的要求更高:不仅要"编码",还要"保义"。这让我理解了 NLP 的核心挑战:如何在数学空间中保留语义信息?

2. 离散表示方法

课程介绍了三种经典方法:

(1)独热编码(One-Hot Encoding)

每个词用一个向量表示,向量长度等于词典大小,该词对应位置为 1,其余为 0。

示例(词典:["我", "先", "挣", "它", "一个", "亿"]):

"我"   -> [1, 0, 0, 0, 0, 0]
"先"   -> [0, 1, 0, 0, 0, 0]
...

优点:实现简单,清晰区分词语

缺点

  • 维度灾难:词典数万词 → 每个向量数万维,极其稀疏
  • 语义鸿沟:任意两词向量正交(点积为 0),无法表达相似性

思考与见解:

独热编码类似前端中的"枚举映射"——给每个选项分配一个唯一标识。但其致命缺陷在于"语义鸿沟":所有词被视为同等不相似。这让我理解了为什么需要更高级的表示方法。

(2)词袋模型(Bag-of-Words, BoW)

将文档视为"装满词的袋子",忽略词序,用词频统计表示文档。

示例:

  • 文档 1:"我 先 挣 一个 亿" → [1, 1, 1, 0, 1, 1]
  • 文档 2:"我 挣 它 一个 亿" → [1, 0, 1, 1, 1, 1]

余弦相似度计算:

$$\text{similarity} = \frac{A \cdot B}{||A|| \cdot ||B||}$$

课程详细演示了两个文档向量相似度的计算过程,结果为 0.8,表明高度相似。

优点:实现简单,文本分类效果不错

缺点

  • 丢失词序:"我 爱 你"与"你 爱 我"表示相同
  • 未考虑词重要性:"的""是"等停用词权重过高

思考与见解:

词袋模型让我联想到前端的"关键词搜索"——只关注"有什么词",不关注"词怎么排列"。这在某些场景有效(如搜索匹配),但对于需要理解语义的任务(如情感分析),丢失词序是致命缺陷。

(3)TF-IDF

课程介绍了 TF-IDF 的核心理念:

  • 词的重要性 = 在当前文档出现次数(TF) × 在其他文档中的罕见程度(IDF)
  • 一个词在当前文档常见、在其他文档罕见 → 权重高

思考与见解:

TF-IDF 是对词袋模型的改进,类似前端搜索中的"关键词权重"——常见词权重低,稀有词权重高。这让我理解了"区分度"的重要性:好的特征应该能区分文档,而非在所有文档中都出现。

心得体会:

词向量章节让我理解了 NLP 的"第二道门槛":如何将符号转换为数字。从独热编码到词袋模型再到 TF-IDF,我看到了方法的演进——从简单编码到考虑词频、权重。但这些方法都有一个共同缺陷:无法真正表达"语义相似性"。这为后续学习 Word2Vec 等稠密向量方法铺垫了动机。


第三章:循环神经网络

第一节:循环神经网络

学习内容

1. 序列信息处理的挑战

课程提出了核心问题:如何将词向量序列融合成一个代表整句含义的"文本向量"?

简单方法的局限性:

  • 求和/平均:忽略语序,"我爱你"与"你爱我"表示相同
  • 全连接网络:每个词孤立处理,无法理解上下文依赖
  • CNN:感受野固定,难以捕捉长距离依赖

思考与见解:

作为前端,我对"数组处理"很熟悉——map、reduce、filter 等操作。但这些操作大多是"逐元素独立处理",无法捕捉元素间的依赖关系。RNN 的核心创新在于引入"记忆"——处理当前元素时,能"记得"之前处理过什么。

2. RNN 结构与原理

课程详细讲解了 RNN 的核心机制:

核心思想:

在处理序列的每一步,网络不仅接收当前输入 $x_t$,还接收来自上一步的"记忆"(隐藏状态 $h_{t-1}$),将两者融合生成新的隐藏状态 $h_t$,传递给下一步。

公式:

$$h_t = \tanh(U x_t + W h_{t-1} + b)$$

关键特性:

  • 权重共享:所有时间步使用相同的 $U$ 和 $W$,大幅减少参数
  • 顺序计算:必须逐个处理,无法并行
  • 信息传递:隐藏状态携带历史信息

思考与见解:

RNN 的"隐藏状态"让我联想到 React 中的 state——保存了组件的历史状态,影响当前渲染。但 RNN 的 state 更强大:它不是简单的"状态存储",而是"信息压缩与传递"——将之前所有步的信息压缩成一个向量,传递给下一步。

课程用图示清晰展示了 RNN 单元的计算流程:输入 → 与前一状态融合 → 生成新状态 → 传递给下一步。这让我理解了"循环"的含义:信息在时间轴上循环传递。

3. RNN 的缺陷

课程指出了 RNN 的核心问题:

  • 梯度消失/爆炸:长序列中,梯度在反向传播时衰减或爆炸
  • 长距离依赖丢失:序列开头的信息难以传递到末尾

心得体会:

RNN 章节让我理解了"序列建模"的核心挑战。RNN 通过引入"记忆"解决了"上下文依赖"问题,但其顺序计算的限制和梯度消失问题,为后续 LSTM 和 Transformer 的学习铺垫了动机。

我对"顺序处理"很熟悉——Promise 链、async/await 都是顺序执行。但 RNN 的顺序计算是被迫的——因为每一步依赖前一步的结果,无法并行。这让我理解了为什么 Transformer 的"并行计算"是一个革命性突破。


第二节:LSTM 与 GRU

学习内容

1. LSTM 的设计哲学

课程指出 RNN 的核心缺陷:状态更新是"粗暴"的——新信息与旧信息无差别混合,导致梯度累乘、信号衰减。

LSTM 的解决思路:引入"门控机制",让模型学会有选择地让信息通过、遗忘旧信息或输出信息。

思考与见解:

"门控"概念让我联想到前端中的"条件渲染"——根据条件决定是否显示某些内容。但 LSTM 的门控更精妙:它不是简单的"开关",而是"权重调节"——决定多少信息通过、多少信息保留。

2. LSTM 的双轨状态

LSTM 引入两个独立状态:

  • 细胞状态(Cell State, $c_t$):"信息高速公路",负责传递长期记忆,无矩阵连乘,缓解梯度消失
  • 隐藏状态(Hidden State, $h_t$):短期记忆,用于输出

思考与见解:

双轨状态的设计让我印象深刻。细胞状态类似"长期存储",隐藏状态类似"工作记忆"。这让我联想到前端中的"数据库"与"组件 state"——前者存储持久数据,后者处理当前交互。LSTM 通过分离这两种状态,巧妙解决了长期记忆传递的问题。

3. LSTM 的三个门

课程详细讲解了三个门的功能:

功能

公式

遗忘门

决定从细胞状态丢弃什么

$f_t = \sigma(W_f \cdot [h_{t-1}, x_t] + b_f)$

输入门

决定写入什么新信息

$i_t = \sigma(W_i \cdot [h_{t-1}, x_t] + b_i)$

输出门

决定输出什么信息

$o_t = \sigma(W_o \cdot [h_{t-1}, x_t] + b_o)$

每个门都是 Sigmoid 层,输出 0-1 之间的值,用于按元素乘法控制信息流动。

思考与见解:

三个门的设计让我理解了"选择性"的重要性:

  • 遗忘门:清理旧记忆,避免信息过载
  • 输入门:筛选新信息,只写入有用的
  • 输出门:决定输出,保护其他单元不受无关信息干扰

这让我联想到"信息管理"的最佳实践:定期清理(遗忘)、筛选录入(输入)、按需输出(输出)。LSTM 的设计哲学不仅是技术创新,更是对"信息处理"本质的深刻理解。

心得体会:

LSTM 章节让我理解了"门控机制"的精妙设计。通过引入三个门和双轨状态,LSTM 有效解决了 RNN 的梯度消失和长距离依赖问题。课程提到 GRU 是 LSTM 的简化版本,将三个门简化为两个,计算效率更高。

作为前端开发者,我对"状态管理"有深刻体会——Redux 的 reducer、React 的 useState 都是状态管理的实践。LSTM 的门控机制让我看到了更高级的状态管理:不仅有"存储",还有"筛选""清理""输出"的完整流程。


第四章:注意力机制与 Transformer

第一节:注意力机制

学习内容

1. Seq2Seq 的信息瓶颈

课程指出标准 Seq2Seq 架构的核心缺陷:编码器将源序列所有信息压缩成一个固定长度的上下文向量 $C$,解码器生成每个词时都依赖同一个 $C$。

用对联任务举例:

  • 上联:"两个黄鹂鸣翠柳"
  • 期望:生成"一行"时关注"两个",生成"白鹭"时关注"黄鹂"
  • 实际:生成每个词都依赖同一个 $C$,无法动态关注

思考与见解:

"信息瓶颈"问题让我联想到前端的"数据压缩"——将大量数据压缩成单一对象,会丢失细节信息。Seq2Seq 的瓶颈在于:无论源序列多长,都压缩成固定向量,导致细节丢失、无法动态关注。

2. 注意力机制的设计原理

课程用生动的类比解释注意力机制:

  • 从"一言以蔽之"到"择其要者而观之"
  • 人类阅读时,注意力会自然聚焦到相关部分
  • 注意力机制模拟这种认知行为:解码每个词时,动态分配注意力权重

核心机制:

解码器生成第 $t$ 个词时:

  1. 用上一时刻状态 $h'_{t-1}$ 与编码器所有状态 $h_j$ 计算相似度
  2. Softmax 归一化得到注意力权重 $\alpha_{tj}$
  3. 加权求和生成动态上下文向量 $C_t$

$$C_t = \sum_{j=1}^{T_x} \alpha_{tj} h_j$$

思考与见解:

注意力机制的"动态加权"让我联想到前端的"动态渲染"——根据数据状态动态决定渲染内容。但注意力更精妙:它不是简单的"条件判断",而是"权重分配"——为每个输入位置分配不同的关注程度。

3. 注意力计算三部曲

课程详细讲解了注意力计算的三个步骤:

步骤 1:计算相似度

$$e_{tj} = \text{score}(h'_{t-1}, h_j)$$

步骤 2:Softmax 归一化

$$\alpha_{tj} = \frac{\exp(e_{tj})}{\sum_{i=1}^{T_x} \exp(e_{ti})}$$

步骤 3:加权求和

$$C_t = \sum_{j=1}^{T_x} \alpha_{tj} h_j$$

思考与见解:

三部曲的设计让我理解了注意力机制的完整流程:

  • 相似度计算:衡量"相关性"
  • Softmax 归一化:转换为"概率分布"
  • 加权求和:生成"上下文向量"

这让我联想到前端的"数据聚合"——从多个数据源提取信息,聚合成一个对象。但注意力的聚合是"智能的"——根据相关性动态决定权重。

4. QKV 范式

课程介绍了注意力机制的 Query-Key-Value 范式:

  • Query(Q):代表查询意图(解码器状态)
  • Key(K):代表被查询的索引(编码器状态)
  • Value(V):代表实际信息(编码器状态)

公式:

$$\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V$$

思考与见解:

QKV 范式让我印象深刻。课程用"图书馆查资料"类比:

  • Q:要问的问题
  • K:书的索引标签
  • V:书的具体内容

这让我理解了为什么是三个而非两个或四个:Q-K 配对解决"如何定位",V 提供"应该提取什么"。三元组结构在功能上完备且高效。

心得体会:

注意力机制章节让我理解了 NLP 的革命性突破。从 Seq2Seq 的"固定压缩"到注意力的"动态关注",这不仅是技术改进,更是设计哲学的转变:从"一刀切"到"按需分配"。

作为前端,我对"动态更新"很熟悉——React 的虚拟 DOM、Vue 的响应式都是动态更新的实践。但注意力的"动态"更深层:它不是简单的"状态驱动更新",而是"内容驱动权重"——根据内容相关性决定信息流动。


第二节:深入解析 Transformer

学习内容

1. Transformer 的划时代意义

课程指出 Transformer 的核心创新:

  • 抛弃 RNN 和 CNN,完全基于注意力机制
  • 并行计算,极大提升训练效率
  • 有效捕捉长距离依赖
  • 成为 BERT、GPT 等大模型的基础架构

思考与见解:

Transformer 的"抛弃 RNN"让我联想到前端框架的演进——从 jQuery 的 DOM 操作到 React 的虚拟 DOM,是范式的彻底重构。Transformer 不是对 RNN 的改进,而是全新的设计哲学:放弃顺序计算,拥抱并行处理。

2. 自注意力机制

课程详细讲解了自注意力的核心概念:

定义:

输入序列"自己对自己进行注意力计算",每个词元审视所有其他词元,动态计算上下文表示。

与交叉注意力的区别:

类型

Q 来源

K, V 来源

目的

交叉注意力

解码器

编码器

对齐两个序列

自注意力

输入序列

输入序列

捕捉序列内部依赖

思考与见解:

自注意力的概念让我印象深刻。传统方法(RNN)通过"顺序传递"整合信息,自注意力通过"全局审视"整合信息。这让我联想到"会议讨论"的两种模式:

  • RNN:轮流发言,信息逐个传递
  • 自注意力:所有人同时交流,每个参与者都能看到所有人的观点

自注意力的并行性是其核心优势:所有词元同时计算,无需等待。

3. 自注意力的计算过程

课程详细讲解了计算步骤:

步骤 1:生成 Q, K, V

$$q_i = x_i W^Q, \quad k_i = x_i W^K, \quad v_i = x_i W^V$$

步骤 2:计算注意力分数

$$\text{score}(i, j) = q_i \cdot k_j$$

步骤 3:缩放与归一化

$$\alpha_{ij} = \text{softmax}\left(\frac{q_i \cdot k_j}{\sqrt{d_k}}\right)$$

步骤 4:加权求和

$$z_i = \sum_j \alpha_{ij} v_j$$

思考与见解:

课程用生动的类比解释 Q, K, V 的作用:

  • Q:要问的问题(查询意图)
  • K:书的索引标签(被动匹配)
  • V:书的具体内容(信息提供)

这让我理解了为什么需要三个独立的权重矩阵:同一个输入 $x_i$,通过不同投影 $W^Q, W^K, W^V$,扮演三种不同角色。这类似前端中的"多视图渲染"——同一数据,不同视角呈现不同内容。

4. 矩阵运算与并行化

课程强调了自注意力的并行计算能力:

矩阵形式:

$$Z = \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V$$

一次矩阵乘法完成所有词元的相关性计算,这是 Transformer 效率的核心。

思考与见解:

矩阵运算的并行化让我联想到 GPU 渲染——并行处理大量像素。Transformer 的并行计算是其革命性优势:RNN 必须逐个处理,Transformer 可以一次处理所有词元。这让我理解了为什么 Transformer 能训练大规模模型——并行计算极大提升了效率。

心得体会:

Transformer 章节是本课程的核心。自注意力机制的"全局审视"设计,彻底改变了序列建模的范式。从 RNN 的"顺序传递"到 Transformer 的"并行计算",这不仅是效率提升,更是思维方式的转变。

作为前端开发者,我对"并行处理"有体会——Web Worker、Promise.all 都是并行处理的实践。但 Transformer 的并行更底层:它不是"任务并行",而是"计算并行"——整个序列的计算可以一次完成。

课程还提到了多头注意力、位置编码、编码器-解码器结构等内容,这些是 Transformer 的完整架构。虽然内容较多,但核心思想清晰:自注意力是基础,其他组件是增强和补充。


总结与展望

核心收获

通过学习前四章内容,我对 NLP 到 LLM 的演进脉络有了清晰认识:

  1. NLP 概述:理解了 NLP 的定义、技术层次、发展历程,认识到"从规则到数据"的范式转变
  2. 文本表示与词向量:理解了分词的重要性、词向量的演进(独热编码 → 词袋模型 → TF-IDF),认识到离散表示的语义鸿沟
  3. 循环神经网络:理解了 RNN 的"记忆"机制、顺序计算的限制、梯度消失问题,认识到 LSTM 门控机制的创新
  4. 注意力机制与 Transformer:理解了注意力的"动态加权"思想、自注意力的"全局审视"设计、Transformer 的并行计算优势

思维转变

作为前端开发者,学习这门课程带来了深刻的思维转变:

  • 从确定性到概率性:前端习惯于 if-else 的确定性逻辑,NLP 更多是概率性决策(选择"最可能的"而非"绝对正确的")
  • 从规则驱动到数据驱动:NLP 的发展史表明,面对复杂问题,让模型从数据中学习比人工设计规则更有效
  • 从顺序处理到并行计算:RNN 的顺序计算限制与 Transformer 的并行计算优势,让我理解了"并行思维"的力量
  • 从静态表示到动态表示:词向量从静态编码到动态注意力,让我理解了"上下文感知"的重要性
posted @ 2026-04-16 00:37  PC.aaron  阅读(31)  评论(0)    收藏  举报