- 教程
- 人工智能
- 机器学习
- 深度学习
【免费下载链接】AI-For-Beginners
12 Weeks, 24 Lessons, AI for All!
本指南基于 AI-For-Beginners 课程 lessons/5-NLP/README.md 展开,系统梳理该课程第 5 大节《自然语言处理》的全部核心技术脉络:文本如何表示为张量、词嵌入与 Word2Vec、语言建模、RNN/LSTM、生成式网络以及 Transformer 与 BERT。读完本文,你将掌握本仓库 NLP 模块的知识框架、环境配置与 GPU 使用注意事项,并明确每条学习路径对应的 Notebook 与实验作业,可直接在本地或 GPU 环境复现课程中的全部实践。
引言:为什么需要专门处理文本的神经网络
在之前的课程中,我们已经学习了如何用神经网络处理表格数据与图像。文本与这两类数据最大的区别在于:文本是长度可变的序列,而图像的输入尺寸是预先已知的。虽然卷积网络可以从输入数据中抽取局部模式,但文本中的模式更为复杂——例如否定词可以与主语相隔任意多个词(我不喜欢橙子与我不喜欢那些又大又彩色又好吃的橙子),两者仍应被解释为同一个模式。因此,处理语言需要引入全新的网络结构,即**循环神经网络(RNN)**与Transformer。
在本节中,我们聚焦于用神经网络解决各类NLP 任务,主要包括:
| 任务 | 类型与说明 |
|---|---|
| 文本分类(Text Classification) | 典型的序列分类问题,如将邮件分为垃圾/非垃圾,将文章按体育、商业、政治等归类;开发聊天机器人时需识别用户意图,即意图分类(intent classification),通常涉及大量类别 |
| 情感分析(Sentiment Analysis) | 典型的回归问题,为句子给出一个表示积极/消极程度的数值;进阶版本为基于方面的情感分析(ABSA),对句子不同部分(方面)分别赋予情感,例如在这家餐厅我喜欢菜品,但氛围很糟糕 |
| 命名实体识别(NER) | 从文本中抽取特定实体,如从I need to fly to Paris tomorrow中识别出tomorrow是 DATE、Paris是 LOCATION |
| 关键词抽取(Keyword Extraction) | 与 NER 类似,但无需针对特定实体类型预训练,自动抽取对句意重要的词 |
| 文本聚类(Text Clustering) | 将相似句子分组,如把技术支持对话中的相似请求归为一类 |
| 问答(Question Answering) | 模型接收文本段落与问题,返回问题答案所在位置,或直接生成答案文本 |
| 文本生成(Text Generation) | 根据text prompt预测下一个字母/单词,本质上可视为分类任务;GPT-3 等高级模型还能通过 prompt programming 或 prompt engineering 技术解决分类等其他 NLP 任务 |
| 文本摘要(Text Summarization) | 让计算机“阅读”长文本并浓缩成几句话 |
| 机器翻译(Machine Translation) | 可视为一种语言上的文本理解与另一种语言上的文本生成的组合 |
早期 NLP 任务大多依赖传统方法(如语法规则)。以机器翻译为例:先用解析器把原始句子转换为句法树,再抽取更高层的语义结构来表示句意,最后基于该语义与目标语言的语法生成结果。如今,许多 NLP 任务已能通过神经网络更高效地解决。
许多经典 NLP 方法实现在 Python 库 NLTK(Natural Language Processing Toolkit) 中,配套的 NLTK Book 是一本优秀的在线书籍。本课程主要以神经网络完成 NLP 任务,并在必要时使用 NLTK。
环境配置:安装 NLP 依赖库
如果你使用本地 Python 环境运行本课程,需要用以下命令安装 NLP 所需的全部依赖库:
PyTorch 版本
pip install -r requirements-pytorch.txtTensorFlow 版本
pip install -r requirements-tf.txt两份依赖清单都位于 lessons/5-NLP/ 目录下:
- requirements-pytorch.txt 锁定了
torch==2.12.1、torchtext==0.9.1、torchvision==0.9.1、nltk==3.10.0、numpy==1.22.0、gensim>=4.3.0,<5、transformers==5.5.0、scikit-learn、matplotlib、scipy、opencv-python、Pillow等。 - requirements-tf.txt 则包含
TensorFlow、TensorFlow_datasets、TensorFlow_text、gensim==3.8.3、transformers==5.5.0及前述通用库。
两份清单共同覆盖了本模块 Notebook 中用到的分词、词向量(gensim)、预训练模型(transformers)与深度学习框架。可参考 lessons/0-course-setup/setup.md 了解课程级环境准备。
GPU 使用警告与内存优化
本节的若干示例会训练相当大的模型,运行前请留意以下 GPU 相关要点:
- 使用支持 GPU 的计算机:建议在带 GPU 的机器上运行 Notebook,以缩短大模型的等待时间。
- GPU 内存约束:训练大模型时可能耗尽 GPU 显存。
- 显存消耗因素:训练期间消耗的显存量取决于多种因素,包括小批量(minibatch)大小。
- 减小小批量大小:若遇到显存不足,优先考虑在代码中调小 minibatch 大小。
- TensorFlow 显存释放问题:旧版 TensorFlow 在同一 Python kernel 中训练多个模型时可能无法正确释放 GPU 内存。可将 TensorFlow 配置为仅按需增长显存分配。
- 启用按需分配代码:在 Notebook 中加入以下代码:
physical_devices = tf.config.list_physical_devices('GPU') if len(physical_devices)>0: tf.config.experimental.set_memory_growth(physical_devices[0], True)从仓库源码看,PyTorch 侧的工具模块也会自动选择可用设备:例如 lessons/5-NLP/16-RNN/torchnlp.py 开头的device = torch.device("cuda" if torch.cuda.is_available() else "cpu"),在训练循环中特征与标签统一.to(device)迁移,从而在 GPU/CPU 间无缝切换。
第 1 站:把文本表示为张量(13-TextRep)
文本分类与 AG News 数据集
本节前半部分聚焦文本分类任务,使用 AG News 数据集,其中的新闻条目形如:
- 类别:Sci/Tech
- 标题:Ky. Company Wins Grant to Study Peptides (AP)
- 正文:AP - A company founded by a chemistry researcher at the University of Louisville won a grant to develop...
目标是根据文本把新闻归入若干类别之一。仓库工具代码 lessons/5-NLP/14-Embeddings/torchnlp.py 与 lessons/5-NLP/16-RNN/torchnlp.py 中的load_dataset即直接通过torchtext.datasets.AG_NEWS(root='./data')加载该数据集,并将类别固定为['World', 'Sports', 'Business', 'Sci/Tech'](标签在送入模型前会做-1偏移以对齐索引)。
文本表示的两类方案
计算机本就用 ASCII 或 UTF-8 编码把字符映射为数字,但计算机并不理解字母的含义,神经网络的语义理解完全来自训练过程。表示文本可以有两种基本思路:
- 字符级表示:把每个字符当作一个数字。若语料共有C个不同字符,单词Hello将被表示为 5×C的张量,每个字母对应 one-hot 编码的一列。
- 词级表示:为文本中所有词建立词表(vocabulary),再用 one-hot 编码表示单词。由于单个字母本身意义有限,用更高层的语义概念(词)能简化神经网络的任务;但大词表会带来高维稀疏张量的问题。
无论采用哪种表示,第一步都是把文本转换为token 序列(一个 token 可以是字符、单词,甚至词的一部分),再借助词表把 token 映射为数字,最后以 one-hot 编码送入神经网络。
N-Gram:把上下文带进词表
自然语言中,词义只有在上下文中才能确定,例如neural network(神经网络)与fishing network(渔网)含义截然不同。一种解决思路是基于词对建模,把词对当作独立的词表 token。句子I like to go fishing会被表示成I like、like to、to go、go fishing。其代价是词表规模显著膨胀,且go fishing与go shopping成为完全没有语义相似性的不同 token。有时也会使用三词组合(tri-grams),这类方法统称n-grams。在字符级表示中,n-gram 大致对应不同的音节。
Bag-of-Words 与 TF/IDF
做文本分类时,需要把文本表示成一个固定大小的向量作为最终稠密分类器的输入。最简单的方式是把所有词的表示叠加(求和):将每个词的 one-hot 编码相加后得到一个频率向量,即词袋(bag of words, BoW)。
BoW 本质上刻画了“文本里出现了哪些词、各出现多少次”。例如政治新闻很可能出现president、country,而科学论文会出现collider、discovered等词,因此词频在很多时候能很好地反映文本内容。
BoW 的问题在于and、is这类常见词在大多数文本中出现频率最高,掩盖了真正重要的词。为此可引入文档集合中的词频来降低这类词的权重,这就是TF/IDF方法的核心思想,其细节在本节附带的 Notebook 中有更完整的实现。
但无论 BoW 还是 TF/IDF,都无法充分捕捉文本的语义,这需要更强大的神经网络模型,将在后续小节讨论。
动手练习与作业
- Notebook 练习:Text Representation with PyTorch、Text Representation with TensorFlow
- 挑战:尝试用词袋与不同数据模型做更多练习,可参考 Kaggle 上的词向量 NLP 教程竞赛
- 作业:Notebooks 作业
正如语言学家 J. R. Firth 1935 年所言:"The complete meaning of a word is always contextual, and no study of meaning apart from context can be taken seriously."(一个词的完整意义总是上下文的,脱离上下文研究意义是不严肃的。)本节技术无法表示词序与语义,我们将在语言建模部分学习如何从文本中捕捉上下文信息。
第 2 站:词嵌入(14-Embeddings)
从 one-hot 到稠密向量
基于 BoW/TF-IDF 的分类器操作的是长度为vocab_size的高维稀疏向量,且每个词彼此独立,one-hot 向量不表达词间的语义相似度。嵌入(embedding)的思想是用低维稠密向量表示词,从而反映词的语义。本节暂时把嵌入视为“降低词向量维数”的手段,后续再讨论如何训练出有意义的嵌入。
嵌入层以词为输入,输出指定embedding_size的向量。它类似Linear层,但可直接接收词编号而非 one-hot 向量,从而避免构造庞大的 one-hot 向量。把嵌入层作为分类器网络的第一层,就能从词袋模型切换到embedding bag模型:先把文本中每个词转换为对应嵌入,再对所有嵌入做聚合(sum、average或max)。
从仓库代码看,lessons/5-NLP/14-Embeddings/torchnlp.py 中的padify(按 mini-batch 最大序列长度做零填充)与offsetify(将定长序列压缩为拼接张量并累积 offsets,供EmbeddingBag使用)分别对应两种常见的批量编码方式,train_epoch_emb则演示了net(text, off)式的训练调用,这正是 PyTorchnn.EmbeddingBag的标准输入形态。
语义嵌入:Word2Vec
我们希望学到的向量表示能让相似词或同义词在向量距离(如欧氏距离)上彼此接近。为此需要在大量文本上以特定方式预训练嵌入模型。经典的 Word2Vec 基于两种主要架构生成词的分布式表示:
- Continuous bag-of-words(CBoW):用上下文预测中间词。给定 n-gram $(W_{-2},W_{-1},W_0,W_1,W_2)$,模型的目标是从 $(W_{-2},W_{-1},W_1,W_2)$ 预测出 $W_0$。
- Continuous skip-gram:与 CBoW 相反,用当前词预测周围的上下文词。
CBoW 更快,而 skip-gram 较慢但对不常见词的表示效果更好。
Word2Vec 预训练嵌入(以及 GloVe 等类似模型)可以替代神经网络中的嵌入层使用。但需要注意词表匹配问题:预训练模型使用的词表很可能与我们的语料词表不一致,如何解决这一问题,可参考本节 Notebook。仓库工具encode()(见 lessons/5-NLP/14-Embeddings/torchnlp.py)对此做了兼容处理:同时支持具备get_stoi()方法的 vocab 对象与具备stoi属性的 GloVe 对象,未登录词统一映射到unk=0。
上下文嵌入与一词多义
传统预训练嵌入(如 Word2Vec)的一个关键局限是词义消歧问题:一个词的所有可能含义被编码进同一个嵌入向量。例如play在下面两个句子中含义完全不同:
- I went to aplayat the theatre.(我去剧院看了一场戏。)
- John wants toplaywith his friends.(约翰想和朋友一起玩。)
上述预训练嵌入把play的两种含义表示成同一个向量。要克服这一局限,需要基于语言模型构建嵌入——该模型在大规模语料上训练,知道词在不同上下文中的组合方式。上下文嵌入的详细讨论超出本节范围,课程将在语言模型部分回归这一主题。
练习与作业
- Notebook:Embeddings with PyTorch、Embeddings TensorFlow
- 挑战:Word2Vec 已被用于生成歌词与诗歌等有趣应用。可将这些技术应用到自己的语料上(例如从 Kaggle 获取数据)。
- 自研阅读:Efficient Estimation of Word Representations in Vector Space(Word2Vec 原论文)
- 作业:Notebooks 作业
第 3 站:语言建模(15-LanguageModeling)
Word2Vec、GloVe 这类语义嵌入,其实只是迈向语言建模的第一步——即创建某种程度“理解”(或“表示”)语言本质的模型。
语言建模的核心思想是在无标注数据集上以无监督方式训练。这一点很重要:无标注文本的规模巨大,而有标注文本的数量总是受限于我们能投入的标注工作量。最常见的方法是构建能预测缺失词的语言模型——随机遮盖文本中的一个词作为训练样本,非常容易构造。
三种训练嵌入的思路
- N-Gram 语言建模:根据前 N 个 token 预测下一个 token。
- Continuous Bag-of-Words(CBoW):在 token 序列 $W_{-N},\dots,W_N$ 中预测中间词 $W_0$。
- Skip-gram:从中间词 $W_0$ 预测邻居 token 集合 ${W_{-N},\dots,W_{-1},W_1,\dots,W_N}$。
动手练习:训练 CBoW 模型
- Training CBoW Word2Vec with TensorFlow
- Training CBoW Word2Vec with PyTorch
结论:训练词嵌入并非复杂任务,如有需要,我们完全可以为领域特定文本训练自己的词嵌入。
挑战实验:训练 Skip-Gram 模型
在 实验说明 中,课程挑战你修改本节代码,把 CBoW 换成 skip-gram 模型进行训练。
第 4 站:循环神经网络(16-RNN)
为什么需要 RNN
此前我们一直使用丰富的文本语义表示 + 嵌入之上的简单线性分类器。这类架构捕捉的是句子中词义的聚合信息,却不考虑词序——因为嵌入上的聚合操作抹掉了原始文本中的顺序信息。无法建模词序的模型,自然无法解决文本生成、问答这类更复杂或更含歧义的任务。
循环神经网络(RNN)逐个符号地把句子送入网络,网络产生某个状态(state),该状态随下一个符号再次传入网络。
给定输入 token 序列 X0,…,Xn,RNN 创建一串共享权重的网络块,并用一次反向传播端到端训练:每个块接收 (Xi,Si) 并产出 Si+1,最终状态 Sn(或输出 Yn)送入线性分类器产生结果。由于状态向量 S0,…,Sn在网络中传递,网络可以学习词间的顺序依赖。例如当序列中出现not时,网络可以学会对状态向量中的某些元素取反,从而实现否定语义。
✅ 上图中所有 RNN 块的权重是共享的,因此同一张图也可以表示成右侧单个带循环反馈回路的块——把输出状态再传回输入。
RNN 单元解剖
简单 RNN 单元接收前一个状态 Si-1与当前符号 Xi,产出状态 Si(有时也产出其他输出 Yi,如生成式网络的情形)。单元内部有两份权重矩阵:一份变换输入符号(记为 W),另一份变换输入状态(记为 H)。输出计算为 σ(W×Xi+ H×Si-1+ b),其中 σ 是激活函数,b 是偏置。
多数情况下,输入 token 在进入 RNN 前先经过嵌入层以降低维度。若输入向量维度为emb_size、状态向量维度为hid_size,则 W 的尺寸为emb_size×hid_size,H 的尺寸为hid_size×hid_size。
LSTM 与梯度消失问题
经典 RNN 的主要问题之一是梯度消失(vanishing gradients)。由于 RNN 在一次反向传播中端到端训练,误差很难传播到网络的前几层,网络无法学习相距较远的 token 之间的关系。解决思路之一是引入显式状态管理,即使用所谓的门(gate)。两种著名架构是LSTM(Long Short Term Memory)与GRU(Gated Relay Unit)。
LSTM 的结构与 RNN 类似,但每层之间传递两种状态:实际状态 C 与隐藏向量 H。每个单元中,隐藏向量 Hi与输入 Xi拼接后,通过门控制状态 C 的变化。每个门都是带 sigmoid 激活(输出范围 [0,1])的神经网络,与状态向量相乘时相当于逐位掩码:
- 遗忘门(forget gate):根据隐藏向量决定状态 C 中哪些分量需要遗忘、哪些放行。
- 输入门(input gate):从输入与隐藏向量提取信息,写入状态。
- 输出门(output gate):先用带tanh激活的线性层变换状态,再用隐藏向量 Hi选择其中部分分量,产出新状态 Ci+1。
状态 C 的分量可看作可开关的“标志位”。例如序列中出现名字Alice时,可以在状态中打开“句子含女性名词”标志;继续读到and Tom时,再打开“名词为复数”标志。通过操纵状态,网络得以追踪句子成分的语法属性。
✅ 理解 LSTM 内部机制的优秀资源是 Christopher Olah 的文章 Understanding LSTM Networks。
双向与多层 RNN
前面讨论的 RNN 从序列开头向末尾单向运行。这看起来自然,因为它类似我们阅读和听语音的方式。但许多实际场景中我们对输入序列可随机访问,因此可以双向运行循环计算,即双向 RNN,此时需要两个隐藏状态向量,每个方向一个。
与卷积网络类似,可以在第一层之上再叠加循环层,以捕捉更高层的模式——这就是多层 RNN:由两个或更多循环网络组成,前一层输出作为后一层输入。多层结构图与更多讨论可参见 16-RNN 课程。
练习与作业
- Notebook:RNNs with PyTorch、RNNs with TensorFlow
- 挑战:阅读 LSTM 相关文献并思考应用场景,如 Grid Long Short-Term Memory、Show, Attend and Tell: Neural Image Caption Generation with Visual Attention
- 作业:Notebooks 作业
第 5 站:生成式网络(17-GenerativeNetworks)
RNN 及其门控变体(LSTM、GRU)为语言建模提供了机制:它们能学习词序并预测序列中的下一个词,因此可被用于生成式任务,如普通文本生成、机器翻译,甚至图像字幕生成。
✅ 想一想你在输入时享受过的文本补全体验,研究一下你喜欢的应用是否用到了 RNN。
上一单元的 RNN 每个单元只输出下一个隐藏状态。实际上我们可以为每个循环单元再增加一个输出,从而输出一条与原序列等长的序列;也可以使用不接收每步输入、只取初始状态向量的 RNN 单元,直接生成一串输出。由此衍生出几种常见的循环网络模式(图见 unreasonable-effectiveness-of-rnn.jpg,源自 Karpathy 的博客 The Unreasonable Effectiveness of Recurrent Neural Networks):
- One-to-one:传统的一输入一输出神经网络。
- One-to-many:生成式架构,接收一个输入值并生成一串输出。例如训练**图像字幕(image captioning)**网络时,把图片作为输入,经 CNN 得到隐藏状态,再由循环链逐词生成描述。
- Many-to-one:对应上一单元的 RNN 架构,如文本分类。
- Many-to-many(序列到序列,sequence-to-sequence):对应机器翻译等任务,第一个 RNN 把输入序列的全部信息收进隐藏状态,第二个 RNN 链把这个状态展开成输出序列。
本单元聚焦简单的文本生成模型,为简化起见使用字符级token 化。训练时每一步取长度为nchars的字符序列,让网络为每个输入字符预测下一个输出字符。推理(生成)时,从一个prompt开始,把它送入 RNN 单元得到中间状态,然后逐字符生成:每生成一个字符,就把状态与新字符一起送入下一个 RNN 单元,直到生成足够多的字符。
软文本生成与温度(temperature)
每个 RNN 单元的输出是字符的概率分布。如果总是取概率最高的字符作为下一个字符,生成文本往往会在相同的字符序列间“循环”,例如:
today of the second the company and a second the company ...但观察下一个字符的概率分布会发现,最高几个概率的差距往往不大,例如一个字符概率 0.2、另一个 0.19。比如序列play之后,下一个字符既可能是空格,也可能是e(如player)。因此,只选最高概率字符并不总是“公平”的——选次高概率仍可能产生有意义的文本。更明智的做法是从网络输出的概率分布中采样,并引入参数temperature:想要更多随机性就把分布“拉平”,想要更贴近最高概率字符就把分布“变陡”。软生成的实现细节见上面链接的 Notebook。
结论与作业
文本生成本身很有价值,但更大的收益来自用 RNN 从初始特征向量生成文本的能力。例如机器翻译(序列到序列,此时encoder的状态向量用于生成/解码译文),或生成图像的文本描述(此时特征向量来自 CNN 提取器)。
- 挑战:在 Microsoft Learn 上学习文本生成(PyTorch/TensorFlow)
- 扩展阅读:用 Markov Chain、LSTM 与 GPT-2 实现文本生成的不同方法;Keras 文档中的字符级文本生成示例
- 作业:Word-Level 文本生成实验——课程已演示逐字符生成,实验将探索词级文本生成。
第 6 站:注意力机制与 Transformer(18-Transformers)
从 RNN 翻译到注意力机制
NLP 领域最重要的问题之一是机器翻译,它是 Google Translate 等工具的基础。本节聚焦机器翻译,更广义地说是任何sequence-to-sequence(也称sentence transduction)任务。
用 RNN 实现序列到序列,需要两个循环网络:编码器(encoder)把输入序列压缩为隐藏状态,解码器(decoder)把隐藏状态展开成翻译结果。这种方法有两个问题:
- 编码器的最终状态很难记住句子开头的信息,导致长句翻译质量差;
- 序列中所有词对结果的影响相同,而实际上输入序列中的特定词往往对某个输出影响更大。
注意力机制(Attention)为 RNN 的每个输出预测加权各输入向量的上下文影响:在输入 RNN 与输出 RNN 的中间状态之间建立“捷径”,生成输出符号 yt时,用不同权重系数 αt,i综合所有输入隐藏状态 hi。架构示意见 encoder-decoder-attention.png(Bahdanau et al., 2015)。注意力矩阵 {αi,j} 表示输入词对输出序列中某个词的生成所起作用的程度,bahdanau-fig3.png 给出了 RNNsearch-50 的对齐矩阵示例。
注意力机制是当下 NLP 取得先进成果的重要推手,但引入注意力会显著增加模型参数量,给 RNN 带来扩展性问题:RNN 的循环本质使其难以批量化和并行化训练——序列每个元素必须按顺序处理,无法轻易并行。这一约束加上注意力机制的流行,催生了如今被广泛使用的 Transformer 模型(从 BERT 到 OpenGPT-3)。
Transformer 的两大核心思想
Transformer 的主要思想之一是摆脱 RNN 的顺序性,创建训练时可并行的模型,通过两个设计实现:
- 位置编码(positional encoding)
- 用自注意力(self-attention)机制取代 RNN(或 CNN)来捕捉模式——这正是提出 Transformer 的论文名为Attention is all you need的原因。
位置编码/嵌入
- 使用 RNN 时,token 的相对位置由步数隐式表示,无需显式建模。
- 一旦改用注意力,就必须知道序列中 token 的相对位置。
- 做法是把 token 序列与位置序列(即 0,1,… 的序号)结合。
- 把位置(整数)转换为向量,有两种方案:
- 可训练的嵌入(本节采用):对 token 与位置分别施加嵌入层,得到同维向量后相加;
- 固定位置编码函数:按原论文提出的方式固定计算。
位置嵌入的结果同时编码了原始 token 与其在序列中的位置(图见 pos-embedding.png)。
多头自注意力
接下来需要捕捉序列中的模式。Transformer 使用自注意力——本质上是把注意力应用于同一序列(输入即输出)。自注意力能纳入句内上下文,看到哪些词相互关联,例如识别it这类指代词被哪些词指代(图见 CoreferenceResolution.png,来自 Google Blog)。
Transformer 使用多头注意力(Multi-Head Attention),使网络能同时捕捉多种不同类型的依赖关系,如长程与短程词关系、指代关系等。Transformer 层的更多实现细节见 TransformersTF.ipynb。
编码器-解码器注意力
Transformer 中注意力出现在两处:
- 用自注意力捕捉输入文本内的模式;
- 执行序列翻译——编码器与解码器之间的注意力层。
编码器-解码器注意力与本节开头介绍的 RNN 注意力机制非常相似,动画图解见 transformer-animated-explanation.gif。由于每个输入位置独立映射到每个输出位置,Transformer 比 RNN 更容易并行化,从而支撑更大、更具表达力的语言模型;每个注意力头可学习词间的不同关系,提升下游 NLP 任务表现。
BERT 与迁移学习
BERT(Bidirectional Encoder Representations from Transformers)是大型多层 Transformer 网络:BERT-base有 12 层,BERT-large有 24 层。模型先在大型文本语料(WikiPedia + 书籍)上用无监督训练(预测句子中被遮盖的词)预训练,吸收大量语言理解能力,再通过微调(fine tuning)结合其他数据集复用,这一过程称为迁移学习(transfer learning)。掩码语言建模示意见 jalammarBERT-language-modeling-masked-lm.png。
练习与作业
- Notebook:Transformers in PyTorch、Transformers in TensorFlow
- 扩展阅读:解释经典 Attention is all you need 论文的博客文章,以及一系列图文详解 Transformer 架构的博文
- 作业:Transformers 作业
Transformer 架构还有很多变体,如 BERT、DistilBERT、BigBird、OpenGPT-3 等,均可微调使用。HuggingFace 工具包 提供了用 PyTorch 与 TensorFlow 训练其中许多架构的仓库。
本模块学习路径总览
课程 lessons/5-NLP/README.md 明确了本节的六步学习路线,每步均配有独立的课程说明、Notebook 练习与作业:
- 把文本表示为张量
- 词嵌入(Word Embeddings)
- 语言建模
- 循环神经网络
- 生成式网络
- Transformer
整个模块的编排逻辑清晰递进:先用 BoW/TF-IDF 建立“文本→固定向量”的直觉,再引入稠密嵌入解决稀疏与语义相似度问题,接着用无监督语言建模训练出真正有语义的嵌入,然后以 RNN/LSTM 建模序列与词序,用生成式网络实现逐字符文本生成,最终过渡到并行化、可扩展的注意力与 Transformer(BERT)时代。若对经典机器学习视角下的 NLP 感兴趣,可参考 lessons/5-NLP/README.md 中提到的 ML-For-Beginners 系列 6-NLP 课程。
实践建议与注意事项
- 按顺序学习:文本表示 → 嵌入 → 语言建模 → RNN → 生成网络 → Transformer,每一步都为下一步铺垫核心概念。
- 框架二选一:PyTorch 与 TensorFlow 两个版本 Notebook 内容等价,按你熟悉的框架选择即可;工具代码集中在各课的
torchnlp.py,可直接复用其load_dataset、encode、padify、offsetify、train_epoch等函数。 - 数据自动下载:
torchtext.datasets.AG_NEWS会在./data目录自动获取 AG News 数据集,仓库根目录的 data/ 中已包含课程早期用到的mnist.pkl.gz,运行本模块前请确保网络可用。 - GPU 显存管理:训练大模型前先按上文启用 TensorFlow 按需显存分配,或调小 minibatch 大小;PyTorch 侧
device检测已内置于工具模块。 - 预训练词表对齐:使用 Word2Vec/GloVe 预训练嵌入时,注意其词表与自身语料词表不一致的问题,参考 Notebook 与工具模块中
encode()的兼容处理方式。
- 教程
- 人工智能
- 机器学习
- 深度学习
【免费下载链接】AI-For-Beginners
12 Weeks, 24 Lessons, AI for All!
相关推荐
AI-For-Beginners 课程之自然语言处理(NLP)学习路线:从文本表示到大型语言模型
AI For Beginners 课程之自然语言处理(NLP)学习路线:从文本表示到大型语言模型 导读 :本文是 lessons/5 NLP/README.md
教程人工智能机器学习深度学习AI-For-Beginners 课程 NLP 章节全景:用神经网络攻克自然语言处理的 9 类核心任务
AI For Beginners 课程 NLP 章节全景:用神经网络攻克自然语言处理的 9 类核心任务 本节内容源自 AI For Beginners http
教程人工智能机器学习深度学习终极指南:如何用TRIBE v2进行多模态脑成像数据分析
终极指南:如何用TRIBE v2进行多模态脑成像数据分析 想要准确预测大脑对自然刺激的响应吗?TRIBE v2作为一款革命性的深度多模态脑编码模型,为神经科学研
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考