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 的核心算法——基于词典与动态规划:
核心思想:
- 基于前缀词典(Trie 树)构建有向无环图(DAG),包含所有可能的词语组合
- 用动态规划寻找概率最大的路径作为分词结果
概率计算:
路径概率 = 各词概率的乘积:
$$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$ 个词时:
- 用上一时刻状态 $h'_{t-1}$ 与编码器所有状态 $h_j$ 计算相似度
- Softmax 归一化得到注意力权重 $\alpha_{tj}$
- 加权求和生成动态上下文向量 $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 的演进脉络有了清晰认识:
- NLP 概述:理解了 NLP 的定义、技术层次、发展历程,认识到"从规则到数据"的范式转变
- 文本表示与词向量:理解了分词的重要性、词向量的演进(独热编码 → 词袋模型 → TF-IDF),认识到离散表示的语义鸿沟
- 循环神经网络:理解了 RNN 的"记忆"机制、顺序计算的限制、梯度消失问题,认识到 LSTM 门控机制的创新
- 注意力机制与 Transformer:理解了注意力的"动态加权"思想、自注意力的"全局审视"设计、Transformer 的并行计算优势
思维转变
作为前端开发者,学习这门课程带来了深刻的思维转变:
- 从确定性到概率性:前端习惯于 if-else 的确定性逻辑,NLP 更多是概率性决策(选择"最可能的"而非"绝对正确的")
- 从规则驱动到数据驱动:NLP 的发展史表明,面对复杂问题,让模型从数据中学习比人工设计规则更有效
- 从顺序处理到并行计算:RNN 的顺序计算限制与 Transformer 的并行计算优势,让我理解了"并行思维"的力量
- 从静态表示到动态表示:词向量从静态编码到动态注意力,让我理解了"上下文感知"的重要性
作者:PC.aaron
出处:http://www.cnblogs.com/aaron-pan/
GitHub:https://github.com/PCAaron/PCAaron.github.io,欢迎star,获取最新内容

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。


浙公网安备 33010602011771号