NOAI 2024 复赛第3题 | 让机器读新闻——自然语言处理的入门链路

NOAI 2024 复赛第3题 | 让机器读新闻——自然语言处理的入门链路

本文核心观点
NOAI 2024 复赛第 3 题知识拆解:用新闻文本分类,讲清自然语言处理的入门链路——分词、词向量、LSTM、softmax。

NOAI 2024 复赛第3题 | 让机器读新闻——自然语言处理的入门链路

自然语言处理 LSTM

用NOAI复赛真题,构建孩子的AI知识图谱

每个知识点后续都会单独展开讲解,欢迎先关注收藏

这道题在做什么

1,000条英文新闻,每条有一个类别标签(体育、政治、科技等)。你要训练一个模型,读完一条新闻后判断它属于哪个类别。

约束很现实:只能用CPU,训练+测试总共10分钟。

知识全景

2024年第1题处理数值坐标,第2题处理图像,这道题进入了AI的另一个重要领域:自然语言处理(NLP)。机器怎么"读懂"文字?

阶段 知识点
把文字变成数字 ① 分词   ② 词表   ③ 词嵌入(Embedding)
理解上下文 ④ 序列模型   ⑤ 循环神经网络(RNN)   ⑥ LSTM
输出分类 ⑦ 多分类与Softmax   ⑧ 评价指标:F1-Score
工程约束 ⑨ 计算资源管理

① 分词

人类阅读时自然地把句子拆成一个个词。机器也需要这一步——把一整段文字切成最小的处理单位,叫做分词(Tokenization)

英文分词相对简单:按空格拆。"The cat sat on the mat"拆成6个词。

但有一些细节需要处理:

"Don't"是一个词还是两个词("Do"和"n't")?

标点符号算不算独立的token?

大写"The"和小写"the"是同一个词吗?

对中文来说分词更难——中文没有空格,"在中国科学院工作"既可以切成"在/中国/科学院/工作",也可以切成"在/中国科学院/工作"。中文分词本身就是一个AI课题。

这道题的数据是英文新闻,按空格切就能用。但要记住统一大小写、处理标点——这些看似琐碎的预处理,直接影响模型效果。

② 词表

分完词,下一步是给每个词分配一个编号。所有编号的集合叫词表(Vocabulary)

比如训练集里一共出现了8,000个不同的词,你可以把出现频率最高的5,000个词编号为1到5,000,剩下的统一标记为一个特殊符号<UNK>(unknown)。

为什么不把所有词都收进来?

低频词出现次数太少,模型学不到有意义的表示

词表越大,Embedding层的参数越多,计算越慢

很多低频词是拼写错误、专有名词,去掉不影响分类

词表还需要一个<PAD>符号:因为不同新闻的长度不同,较短的句子需要用<PAD>补齐到统一长度,才能组成batch进行训练。

词表的质量直接决定了模型的输入质量。垃圾进,垃圾出——分词粗糙、词表过大或过小,后面的模型再强也救不回来。

③ 词嵌入(Embedding)

词有了编号,但编号只是个ID,不携带语义信息。"猫"编号为42,"狗"编号为1087——从数字上看不出它们是相似的概念。

词嵌入把每个词从一个编号变成一个向量(一组数字)。比如把每个词表示成128维的向量。这个向量不是人为设计的,而是在训练过程中学出来的。

训练之后,有趣的事情发生了:语义相近的词,向量也相近。"猫"和"狗"的向量距离很近,而"猫"和"经济"的向量距离很远。

更神奇的是,向量之间的关系能反映语义关系。经典的例子:

"国王" - "男人" + "女人" ≈ "女王"

这说明Embedding不只是在"记住"每个词的意思,而是学到了词与词之间的关系结构。

在这道题中,Embedding层是模型的第一层,它把输入的词序列转换成向量序列,供后面的LSTM处理。

④ 序列模型

一句话的意思不只取决于里面有哪些词,还取决于词的顺序。"狗咬了人"和"人咬了狗"用的词一模一样,意思完全不同。

MLPCNN都不天然处理"顺序"问题。MLP把所有输入一视同仁;CNN的卷积核关注局部区域,但不擅长捕捉长距离的依赖关系(比如一句话的开头和结尾的关联)。

处理有顺序的数据——时间序列、语音、文字——需要序列模型。这类模型的核心能力是:处理当前元素时,能参考之前看到的元素。它有"记忆"。

⑤ 循环神经网络(RNN)

RNN是最基础的序列模型。它的思路很简单:每读到一个词,就更新一次内部状态(称为"隐藏状态")。这个隐藏状态是对"到目前为止读到的所有内容"的一个压缩总结。

读到第1个词 → 更新隐藏状态 h₁
读到第2个词 + h₁ → 更新隐藏状态 h₂
读到第3个词 + h₂ → 更新隐藏状态 h₃
...
读到最后一个词 + hₙ₋₁ → 最终隐藏状态 hₙ

最终的隐藏状态 hₙ 包含了整个句子的信息,可以送进线性层做分类。

RNN的问题是:当句子很长时,早期的信息在不断更新中逐渐被"遗忘"。读到第100个词时,第1个词的影响已经几乎消失了。这叫长期依赖问题

⑥ LSTM

LSTM(长短期记忆网络)是为了解决RNN遗忘问题而发明的。

LSTM在RNN的基础上加了一组"门"机制:

遗忘门:决定之前的记忆中哪些要丢弃

输入门:决定当前新信息中哪些要记住

输出门:决定当前记忆中哪些要输出

这三个门都是可学习的——模型自己决定什么该记、什么该忘、什么该输出。

直觉上,LSTM就像一个人在做阅读理解:读到每个句子时,主动判断"这个信息重要吗?要不要记下来?之前记的笔记还有用吗?"

LSTM的一个重要变体是双向LSTM(BiLSTM):从前往后读一遍,从后往前再读一遍,把两个方向的结果拼起来。这样每个位置都同时有"前面的上下文"和"后面的上下文"。

这道题建议使用Embedding + LSTM,这是NLP任务中最经典的组合之一。

⑦ 多分类与Softmax

2024年第1题是二分类(命中/未命中),这道题是多分类——新闻有多个类别。

多分类的输出层有N个神经元(N=类别数),每个神经元输出一个数字。这些数字大小不一,可能是正的也可能是负的。怎么把它们变成"每个类别的概率"?

Softmax函数。Softmax做两件事:

把所有数字变成正数(通过取指数)

让它们的总和等于1

变换后的结果就可以解释为概率:每个类别被选中的概率是多少。最终预测结果是概率最高的那个类别。

多分类的损失函数通常用交叉熵损失(Cross-Entropy Loss)——它衡量模型输出的概率分布与真实标签之间的差距。在PyTorch中,nn.CrossEntropyLoss已经内置了Softmax,不需要手动加。

⑧ 评价指标:F1-Score

这道题不用Accuracy(准确率),用F1-Score。为什么?

假设10个类别中有一个"军事"类只有30条样本,其余类各有100多条。一个什么都没学的模型只要把所有样本都预测成最大的类,就能拿到90%以上的Accuracy。但"军事"类的F1是0分。

F1-Score考虑了两个维度:

精确率(Precision):模型预测为A类的样本中,有多少真的是A类

召回率(Recall):所有A类的样本中,有多少被模型正确找出来了

F1是精确率和召回率的调和平均——两个都高F1才高,任何一个为0则F1为0。

这道题要求计算每个类别的F1,然后取平均。这意味着每个类别都同等重要,不管它有多少样本。

面对类别不均衡的数据,常见的应对方式是:在损失函数中给样本少的类别更高的权重,让模型多关注容易被忽略的小类。

⑨ 计算资源管理

这道题有一个非常现实的约束:CPU,10分钟

LSTM在CPU上训练比GPU慢得多。训练集虽然只有1,000条,但如果每条新闻很长(200个词),每个epoch也需要不少时间。

这不是一个纯技术问题,而是工程决策

Embedding维度设128还是256?越大模型越强,但训练越慢

用单向LSTM还是双向?双向效果好但慢一倍

跑20个epoch还是50个?

最大长度截断到200还是100?

正确做法是:先跑1个epoch看耗时,推算总预算内能跑几个epoch,然后在"模型容量"和"训练时间"之间找到最优平衡点。

这种在有限资源下做最优决策的能力,在实际的AI工程中比"会不会搭模型"更重要。

这道题打开了自然语言处理的大门。从文字到数字(分词→词表→嵌入),从数字到语义(RNN→LSTM),从语义到决策(Softmax→分类)——这条链路是机器"读懂"人类语言的基本路径。

微信二维码

扫码备注【NOAI】加交流群