FEATURED · 精选文章

吴恩达NLP专项课程全解析:从词向量到Transformer的实战笔记

发布时间 / 2026/9/1 4:15:57
来源 / 创域科博编辑部
栏目 / 资讯中心
吴恩达NLP专项课程全解析:从词向量到Transformer的实战笔记 吴恩达在 DeepLearning.AI 推出的《Natural Language Processing Specialization》是一套被大量初学者作为 NLP 入门主线的系列课程。它覆盖了从文本分类、词向量、语言模型、序列模型到注意力机制和 Transformer 的主要知识模块。网上常以“自然语言处理NLP系列课程从入门到进阶”为标题传播这门课的双语字幕版本观看重点通常不是视频本身而是如何把课程里的知识点落到真实代码项目中。这篇内容将会围绕课程结构展开讲解每部分解决什么问题、学习时要注意哪些原理、如何搭建本地学习环境、如何完成典型作业并给出从课程作业过渡到真实中文 NLP 项目时的工程建议。如果你正在通过这套课程入门 NLP可以把它当作一份配套学习笔记来用。1. 先看清吴恩达 NLP 课程的主线它到底带你做什么这套课程标题里的关键词是“自然语言处理”和“入门到进阶”。很多人误以为它是一套讲大模型的课程实际上它更偏向 NLP 的核心基础用传统机器学习和深度学习模型解决文本问题同时为理解 Transformer 和预训练模型做铺垫。1.1 课程想解决的核心问题NLP 要处理的是非结构化文本评论、邮件、搜索词、新闻、聊天记录。机器不能直接理解文字所以第一步要把文字变成数值再让模型从数值里学习规律。吴恩达这套课程的核心问题可以拆成四层如何把文本表示成向量或数值特征。如何用概率模型处理语言顺序信息。如何用循环神经网络处理任意长度文本。如何用注意力机制解决长距离依赖和并行计算问题。整个课程就是围绕这四层展开。每门课讨论一个层次最终到达注意力模型和 Transformer 基础。1.2 课程模块与典型作业内容这套专项课程通常分为四到五门子课程每一门都对应一组典型作业。下表概括了常见模块和训练重点课程模块核心内容典型作业方向文本分类与向量空间逻辑回归、朴素贝叶斯、词向量、PCA情感分析、词向量计算、相似度查询概率模型隐马尔可夫模型、词性标注、N-gram词性标注、自动补全句子序列模型RNN、LSTM、GRU、Siamese Network命名实体识别、情感分类、词嵌入推断注意力模型Attention、Transformer、语音识别文本摘要、问答系统、翻译模型大模型时代衍生模块提示词工程、Agent 协作格式化输出、多步推理、工具调用这套课程的设计思路是“算法原理 NumPy 手写实现 TensorFlow/Keras 项目实践”所以它不只是一门理论课也是一门代码课。1.3 学完之后的真实能力边界学完这套课程后你的能力边界会更接近“理解 NLP 主流模型是怎么工作的”而不是“能立刻训练一个生产级大模型”。具体来说你能用 NumPy 实现词频特征、朴素贝叶斯和逻辑回归的文本分类。你能理解词向量的训练目标并动手训练一个简单的 Word2Vec 模型。你能写出 RNN、LSTM 的网络结构并用 Keras 跑通文本分类或命名实体识别。你能解释注意力机制中 Q、K、V 的矩阵运算过程并搭建一个小型 Transformer 模块。你能把课程里的方法迁移到中文文本的预处理、特征构造和模型训练流程中。如果你原来看论文总觉得公式抽象这门课最大的价值是让你把公式变成代码再跑一遍观察每一步输出变化。这种“从原理到实现”的路径是它区别于直接看 Hugging Face 文档的最大优势。2. 学习环境准备不是打开视频就能直接写作业这门课不能只靠“看”。每个模块都有编码作业作业环境是否顺畅直接决定学习体验。这里按学习环境和生产环境分别说明。2.1 本地环境的推荐依赖组合NLP 课程作业大量使用 NumPy、TensorFlow、Keras 和 Scikit-learn。建议本地新建一个虚拟环境避免版本互相污染。python -m venv nlp_env source nlp_env/bin/activatepip install --upgrade pip pip install numpy1.24.4 pip install pandas pip install scikit-learn pip install matplotlib pip install tensorflow2.13.0 pip install jupyter这里要注意版本匹配。不同操作系统、不同 Python 版本下 TensorFlow 的可用版本不一样。Python 3.11 和 3.12 对旧版 TensorFlow 兼容性较差建议优先使用 Python 3.8 到 3.10。注意如果你的显卡是 NVIDIA 且想用 GPU 训练还需要额外安装 CUDA 和 cuDNN。TensorFlow 对 CUDA 版本有严格要求别直接在 GPU 机器上装最新 CUDA先确认当前 TensorFlow 版本支持哪个 CUDA 版本。2.2 创建并启动 Jupyter Notebook作业通常以 Jupyter Notebook 形式存在。安装完成后启动jupyter notebook如果使用 VS Code直接在终端执行code .后打开.ipynb文件选择已经创建的nlp_env内核即可。2.3 验证环境是否可用新建一个 notebook运行下面的代码import numpy as np import tensorflow as tf print(numpy版本:, np.__version__) print(tensorflow版本:, tf.__version__) print(GPU是否可用:, tf.config.list_physical_devices(GPU))输出示例numpy版本: 1.24.4 tensorflow版本: 2.13.0 GPU是否可用: []如果GPU是否可用为空列表说明当前环境没有使用 GPU此时模型训练会慢一些但运行课程作业基本够用。2.4 常见环境坑问题现象常见原因解决方式No module named tensorflow未激活虚拟环境或安装失败检查pip list确认是nlp_env环境Keras 和 TensorFlow 版本冲突分别安装导致版本不匹配统一通过tensorflow包引入 Keras中文注释乱码Jupyter 默认编码问题在代码文件顶部加# -*- coding: utf-8 -*-import 报错DLL load failed缺少 Microsoft Visual C 运行库Windows 安装对应 VC Redistributable3. 从文本到向量分类、词频和词嵌入是后续所有内容的地基课程第一阶段会从“文本分类”入手你会在这一阶段见到两种文本表示方式一种是基于词频的向量一种是基于词共现关系的嵌入向量。3.1 词频向量法先解决“文本怎么变成矩阵”把文本变成向量的最朴素方式是对每个词出现次数进行统计。比如两个句子我 喜欢 自然 语言 处理 我 喜欢 机器 学习可以构造词汇表再用每个词出现的次数表示句子。以下是常见实现过程from sklearn.feature_extraction.text import CountVectorizer corpus [ 我 喜欢 自然 语言 处理, 我 喜欢 机器 学习 ] vectorizer CountVectorizer(token_patternr\S) X vectorizer.fit_transform(corpus) print(vectorizer.get_feature_names_out()) print(X.toarray())输出示例[我 学习 喜欢 处理 机器 自然 语言] [[1 0 1 1 0 1 1] [1 1 1 0 1 0 0]]这种向量的问题在于没有包含语义信息。“喜欢”和“爱”明明意思接近在向量空间里却完全不同。这就是为什么要引入词向量。3.2 词向量让相似词的表示距离更近词向量的核心思想是一个词的含义由它周围的词决定。如果两个词经常出现在相似上下文里它们的向量应该接近。课程中关于 Word2Vec 的理解重点不是直接调用现成库而是理解训练目标给定中心词预测上下文词或给定上下文词预测中心词。简单示例可以用 Gensim 加载预训练词向量import gensim.downloader as api model api.load(glove-twitter-25) print(model.most_similar(computer, topn5))输出示例[(computers, 0.86), (software, 0.80), (technology, 0.77), (machine, 0.76)]这里要注意glove-twitter-25是英文语料训练的词向量中文文本不能直接使用。中文需要加载腾讯词向量或使用自己的语料训练。3.3 课程作业中常见操作用 PCA 可视化词向量课程作业里常出现把高维词向量降维到二维进行可视化的操作用 Sklearn 的 PCA 就能完成from sklearn.decomposition import PCA import matplotlib.pyplot as plt vectors [model[king], model[queen], model[man], model[woman]] labels [king, queen, man, woman] pca PCA(n_components2) result pca.fit_transform(vectors) for i, label in enumerate(labels): plt.scatter(result[i, 0], result[i, 1]) plt.annotate(label, (result[i, 0], result[i, 1])) plt.show()这个操作看起来简单却能直观验证一个关键结论词向量在空间中的相对方向和位置确实编码了部分语义关系。3.4 这一阶段的常见坑错误操作出错原因推荐做法直接用英文词向量处理中文文本词表不匹配分词方式不一致中文文本先分词再加载中文词向量不处理停用词高频无意义词影响特征表达在统计词频前按任务需要过滤停用词把 PCA 结果解释为“绝对语义”降维后信息有损失只把 PCA 当作可视化辅助不用于模型特征用全部语料一次性训练词向量训练时间过长内存占用过高先用小规模语料跑通流程再决定是否全量训练4. 概率模型与序列信息N-gram 和 HMM 为什么不能跳过很多初学者觉得概率模型章节和深度学习无关选择直接跳过。这里要说清楚语言天然拥有顺序信息N-gram 和隐马尔可夫模型是理解 RNN 的必要前提。4.1 N-gram 模型用有限历史预测下一个词N-gram 的基本假设是“一个词的出现概率只与前面 N-1 个词相关”。假设二元模型P(处理 | 语言) count(语言 处理) / count(语言)它的作用是评估一句话是否通顺也用于文本生成。课程中经常要求实现一个简单的文本补全。以下是一个二元模型频率统计示例from collections import defaultdict import re text 我喜欢自然语言处理 自然语言处理很有趣 我喜欢机器学习 tokens re.findall(r\S, text) bigrams defaultdict(int) for i in range(len(tokens) - 1): bigrams[(tokens[i], tokens[i 1])] 1 def predict_next_word(prev_word): candidates {k[1]: v for k, v in bigrams.items() if k[0] prev_word} if not candidates: return None return max(candidates, keycandidates.get) print(predict_next_word(喜欢))输出示例自然因为语料里“喜欢自然语言处理”和“喜欢机器学习”都出现了而“自然”的计数是 1“机器”也是 1所以最终取决于字典遍历顺序。真实项目里会加入平滑策略解决这种零概率问题。4.2 从 N-gram 到 HMM加入隐藏状态N-gram 只关注词本身的共现但很多任务需要推断“隐藏状态”。比如词性标注一个词是名词、动词还是形容词不能直接从词本身完全确定需要结合上下文推断。隐马尔可夫模型解决这个问题的方式是给定观测序列文本找到最可能的隐藏状态序列词性标签。课程作业里通常用维特比算法完成这个过程。这里不要求每个人都能手写完整维特比但必须理解它的核心公式dp[i][state] max(dp[i-1][prev_state] * transition_prob[prev_state][state] * emission_prob[state][obs_i])这个公式会在 RNN 章节以不同形式再次出现。提前理解“用前一步状态推断当前状态”的思想后面理解 LSTM 的隐藏状态传递会轻松很多。4.3 概率模型阶段的学习策略不要停留在跑通代码建议做三件事把 N-gram 模型改成三元模型观察生成文本和统计量的变化。手动实现一个简单的维特比算法数据结构用(时间步, 状态)的二维数组。找一段中文文本先分词再做词性统计理解中文分词的粒度对概率模型的影响。4.4 阶段常见坑错误操作出错原因推荐做法不处理语料中出现一次的词稀疏问题会劣化概率估计使用加一平滑或回退平滑在未分词的中文文本上统计 N-gram中文没有天然空格词边界不明确先用 jieba 分词再统计用训练集概率评估生成效果模型会偏好重复高频片段生成时引入采样温度或概率截断5. 从 RNN 到注意力机制理解序列模型的升级逻辑课程进入深度学习的核心部分后RNN、LSTM、GRU 到 Attention 的演进是一条很清晰的逻辑线。这里重点要掌握“为什么每一步模型要这样改”。5.1 RNN 为什么能处理文本RNN 引入循环结构让每一时间步的输出依赖上一步的隐藏状态import numpy as np def rnn_step_forward(prev_hidden, x, Wx, Wh, b): hidden np.tanh(np.dot(Wx, x) np.dot(Wh, prev_hidden) b) return hidden prev_hidden np.zeros((4, 1)) x np.array([[0.5], [0.2], [0.1]]) Wx np.random.randn(4, 3) * 0.1 Wh np.random.randn(4, 4) * 0.1 b np.zeros((4, 1)) hidden rnn_step_forward(prev_hidden, x, Wx, Wh, b) print(hidden.shape)输出示例(4, 1)隐藏状态会携带前文信息传递给下一个词这就是 RNN 能建模语言序列的原因。5.2 梯度消失问题和 LSTM 的应对思路RNN 的问题是句子太长时早期信息在反向传播中梯度越来越小最终无法影响模型更新。LSTM 的解决方式是引入“细胞状态”让信息可以选择性通过。课程作业要求比较高的是理解 LSTM 内部四个门遗忘门、输入门、候选门、输出门。以下是一个简化实现import numpy as np def lstm_cell_forward(xt, a_prev, c_prev, parameters): Wf, bf parameters[Wf], parameters[bf] Wi, bi parameters[Wi], parameters[bi] Wc, bc parameters[Wc], parameters[bc] Wo, bo parameters[Wo], parameters[bo] Wy, by parameters[Wy], parameters[by] n_x, m xt.shape n_y, n_a Wy.shape ft 1 / (1 np.exp(-(np.dot(Wf, xt) np.dot(Wf, a_prev) bf))) it 1 / (1 np.exp(-(np.dot(Wi, xt) np.dot(Wi, a_prev) bi))) cct np.tanh(np.dot(Wc, xt) np.dot(Wc, a_prev) bc) c_next ft * c_prev it * cct ot 1 / (1 np.exp(-(np.dot(Wo, xt) np.dot(Wo, a_prev) bo))) a_next ot * np.tanh(c_next) yt_pred softmax(np.dot(Wy, a_next) by) return a_next, c_next, yt_pred这个示例里 Wf 同一矩阵被同时用于输入和上一隐藏状态实际实现会更复杂但核心结构已经能说明 LSTM 是怎么防止信息被快速覆盖的。5.3 注意力机制解决“一个向量记不住整句话”的问题即使使用 LSTM模型仍然要把整句话编码成一个固定长度向量。句子太长时信息瓶颈很明显。注意力机制让模型在每一步解码时都能回头查看输入序列中每个位置的信息并给不同位置分配权重。注意力分数简化的理解方式score query 与 key 的点积 weight softmax(score) context weight 与 value 加权求和下面是一个最小示例模拟两个输入位置对一个查询的注意力计算import numpy as np def softmax(x): e_x np.exp(x - np.max(x)) return e_x / e_x.sum() keys np.array([[1, 0], [0, 1]]) values np.array([[2, 3], [4, 1]]) query np.array([0.8, 0.2]) scores np.dot(keys, query) weights softmax(scores) context np.dot(weights, values) print(scores:, scores) print(weights:, weights) print(context:, context)输出示例scores: [0.8 0.2] weights: [0.64565631 0.35434369] context: [2.70868738 2.29034369]注意力机制之后Transformer 将这种结构扩展到多头并去掉循环结构用位置编码保留顺序信息。课程在这一层已经把学习者带到了现代 NLP 模型的入口。5.4 序列模型阶段的常见坑错误操作出错原因推荐做法输入序列长度不一致RNN 需要固定 batch 内的序列长度使用 padding 和 mask不使用 mask 计算损失填充部分参与 loss干扰训练在Embedding层之后设置mask_zeroTrue或传入 mask训练数据和验证数据 token 不一致验证集出现训练集未见过词映射失败统一使用训练集词表未知词映射为UNK自己实现 LSTM 时维度不匹配batch size、时间步、特征维度没理清先用随机输入测试前向输出 shape再训练6. 从课程作业到中文 NLP 项目构建高质量中文语料库的完整流程学完课程后最容易遇到的问题就是课程作业都能跑通但换到中文业务数据就不知道如何下手。中文 NLP 的第一道门槛不是模型而是数据。6.1 中文语料库构建的基本链路构建一个可用于模型训练的中文语料库通常要经过采集、清洗、去重、分词、标注、划分等过程。import re import jieba def clean_text(text): # 去除 URL、邮箱、昵称等噪声 text re.sub(rhttps?://\S, , text) text re.sub(rwww\.\S, , text) text re.sub(r[\w.-][\w.-]\.\w, , text) # 去除 HTML 标签 text re.sub(r[^], , text) # 保留中文字符和常见标点 text re.sub(r[^\u4e00-\u9fa5。、\\\s], , text) return text def tokenize_text(text): # 使用 jieba 分词按空格拼接 return .join(jieba.cut(text))6.2 数据去重不要用相似文本污染训练集中文网络语料经常出现大量重复或近似重复内容直接训练会让模型记住模板而不是理解语义。去重通常从两个层次做精确去重计算文本 MD5 或通过集合结构去重。近似去重使用 SimHash 或 MinHash对长文本计算指纹再比较汉明距离。from simhash import Simhash def is_duplicate(text_a, text_b, threshold3): distance Simhash(text_a).distance(Simhash(text_b)) return distance threshold6.3 中文分词的不同选择课程作业中的英文文本按空格和标点切分即可中文不同。常见分词方案有分词工具特点适用场景jieba轻量、易用、速度一般学习项目、快速原型HanLP功能丰富支持词性标注和依存分析需要语言学特征的任务LTP哈工大语言技术平台支持多任务学术研究、复杂语言学任务深度学习分词基于 BERT 等模型效果更好资源消耗大生产级高质量语料构建在构建大规模中文语料时建议先用 jieba 快速验证整体流程再根据任务精度要求决定是否换用更强方案。6.4 从清洗到模型训练的最小闭环import pandas as pd from sklearn.model_selection import train_test_split from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.naive_bayes import MultinomialNB from sklearn.metrics import accuracy_score # 1. 标注数据来源示例中仅说明流程 df pd.DataFrame({ text: [这个电影很好看, 这个电影太差了, 服务态度很好, 快递太慢了], label: [1, 0, 1, 0] }) # 2. 清洗与分词 df[clean_text] df[text].apply(clean_text) df[tokenized] df[clean_text].apply(tokenize_text) # 3. 特征提取 vectorizer TfidfVectorizer() X vectorizer.fit_transform(df[tokenized]) y df[label] # 4. 划分训练集和测试集 X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42 ) # 5. 训练模型 model MultinomialNB() model.fit(X_train, y_train) # 6. 验证 y_pred model.predict(X_test) print(准确率:, accuracy_score(y_test, y_pred))输出示例准确率: 1.0这个示例数据量极小准确率没有参考价值但它完整演示了“清洗 - 分词 - 向量化 - 训练 - 评估”的最小闭环。替换成语料后只调整数据读取、清洗规则和模型参数即可。6.5 语料库建设中的常见坑问题现象常见原因处理建议模型 loss 下降但生成内容重复语料领域单一模板化内容过多增加数据多样性提高采样温度分词结果出现大量无意义片段未处理特殊符号或英文混排先统一全半角再清洗再分词训练集与测试集时间跨度过大数据分布变化导致评估失真按时间划分不用随机划分标注样本类别不均衡正负样本比例差距大使用加权损失、过采样或欠采样7. 常见作业报错和排查路径课程作业是学习过程的重要部分。作业报错时按下面顺序排查比盲目搜报错信息更高效。7.1 第 1 优先级检查张量形状深度学习作业里 80% 的报错都来自维度不匹配。看到Cannot reshape array、incompatible shapes、dimension mismatch时不要立刻改代码。先打印每一步的 shapeprint(x shape:, x.shape) print(weights shape:, W.shape) print(hidden shape:, hidden.shape)课程作业中常见维度规则场景常见 shape单个 batch 输入(batch_size, sequence_length)Embedding 后(batch_size, sequence_length, embedding_dim)RNN 隐藏状态(batch_size, hidden_size)或(num_layers, batch_size, hidden_size)输出 logits(batch_size, num_classes)7.2 第 2 优先级检查词表映射中文文本或自定义数据集里常出现IndexError: index out of range。这类报错往往是某个词不在词表里。解决方式在构建词表时保留一个UNK位置所有未知词映射到UNK。word_to_id {word: idx for idx, word in enumerate(vocab)} unk_id word_to_id.get(UNK, len(word_to_id)) def tokens_to_ids(tokens): return [word_to_id.get(token, unk_id) for token in tokens]7.3 第 3 优先级检查损失函数和标签类型Keras 训练时如果标签类型不对会报Shape mismatch或loss: nan。分类任务标签是整数用SparseCategoricalCrossentropy。标签是 one-hot用CategoricalCrossentropy。回归任务用MeanSquaredError。7.4 第 4 优先级检查训练速度异常如果模型训练速度极慢先看是否在用 CPU 训练深度学习模型。课程早期作业用 CPU 没问题但 Transformer 或大规模词向量训练最好切到 GPU。查看 GPU 使用情况nvidia-smi如果显示进程里有 Python但显存占用很低可能是 TensorFlow 没有把操作放到 GPU 上。检查是否安装的是 CPU 版 TensorFlowprint(tf.test.is_built_with_cuda())输出False说明当前是 CPU 版需要安装tensorflow-gpu或重新安装正确版本。7.5 综合排查表现象可能原因检查方式解决方式loss 为 nan学习率过大、数据包含 nan打印输入数据和梯度降低学习率检查数据训练准确率不升特征未归一化或数据标签错误查看部分 batch 数据和标签数据可视化手工检查样本模型预测全是同一类类别不均衡或模型容量不足查看训练集类别分布使用类别权重调整模型结构中文乱码或编码报错文件编码不一致查看文件编码统一使用 UTF-8指定encodingutf-88. 从课程学习到真实项目的最佳实践课程本身是一套好的入门教练但它不等于工程能力。完成课程后需要按下面方向强化。8.1 用“三遍原则”消化每门课第一遍完整看视频不做作业只建立知识地图。第二遍只看关键视频完成作业遇到不理解的知识点回看视频。第三遍不打开代码模板独立完成作业中的核心模块并尝试用不同方法改进。学习周期建议阶段目标建议时间第一门课理解文本分类和词向量2 到 3 周第二门课掌握概率模型和序列序列基础知识2 到 3 周第三门课掌握 RNN/LSTM 的代码实现3 到 4 周第四门课掌握注意力机制和 Transformer 基础3 到 4 周综合项目把至少 3 个模块组合到实际任务2 周以上8.2 学习环境与生产环境的差异必须提前知道维度学习环境生产环境数据规模小规模样例百万级以上文本预处理简化清洗完整清洗、去重、数据版本管理模型训练单机单卡或 CPU分布式训练、混合精度评估方式准确率或 loss按业务指标评估如 F1、召回率、业务收益上线要求跑通即可需要模型服务化、监控、回滚、日志版本管理笔记本即可代码、数据、模型、实验记录全部版本化8.3 课程之后的学习方向完成课程后可以根据工作需要选择下一阶段方向预训练模型方向学习 Hugging Face Transformers 库掌握微调 BERT、RoBERTa、T5。中文 NLP 专项掌握 jieba、HanLP、LTP了解中文分词难点。大模型应用方向学习基于大模型的 RAG、向量检索、Agent 编排。语音和图像交叉方向把注意力机制扩展到语音识别、OCR、跨模态任务。8.4 给新手最重要的练习建议不要急着研究最新论文或复现大模型。先把课程最终模块里的“从零写一个带注意力的编码器-解码器”完整实现一遍。这个过程会让你把文本表示、序列建模、注意力机制、损失计算和训练流程串起来写完之后再进入预训练模型理解和 Debug 能力都会明显提升。课程里学到的 RNN、LSTM、注意力机制和 Transformer 不是过时知识而是理解当代大模型的基础元件。越往后学越会发现所有复杂模型都在解决同一类问题如何让机器更准确地理解文本中的结构、语义和意图。把基础单元的输入输出和梯度流转吃透比盲目堆模型重要得多。
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻