第一章 NLP
NLP 是什么
- 自然语言处理(NLP):让计算机理解、解释和生成人类语言的技术
- 融合了计算机科学、人工智能、语言学等多学科
- 核心目标:打破人类语言和计算机语言之间的障碍
NLP 核心任务
| 任务 | 说明 | 示例 |
|---|---|---|
| 中文分词 | 把连续中文切成词序列 | “今天天气真好” → [“今天”,”天气”,”真”,”好”] |
| 子词切分 | 把词进一步拆成更小的子词 | “unhappiness” → [“un”,”happi”,”ness”] |
| 词性标注 | 给每个词标注词性 | “She/代词 is/动词 playing/动词…” |
| 文本分类 | 把文本归入预定义类别 | NBA新闻 → “体育” |
| 实体识别 | 识别文本中的人名、地名等 | “李雷” → 人名,”上海” → 地名 |
| 关系抽取 | 识别实体之间的语义关系 | “比尔·盖茨”—创始人—“微软” |
| 文本摘要 | 生成简洁摘要(抽取式/生成式) | 长新闻 → 一句话概括 |
| 机器翻译 | 源语言 → 目标语言 | “今天天气很好” → “The weather is nice today” |
| 自动问答 | 理解问题并自动给出答案 | 检索式 / 知识库 / 社区问答 |
词向量
计算机只认数字,不认文字,所以第一步是:把文字变成数字。
在完成分词等工作后,就需要找到这些词汇对应的词向量,以进行下一步操作
假设我们用 4 维向量表示:
1 | [动物性, 大小, 可爱度, 能飞] ///计算机内部不会是这些人类能读懂的语言 |
这就是词向量的核心价值:语义相近的词,向量在空间中距离就近。
这个存储词向量的表就是嵌入矩阵.
那这个嵌入矩阵是怎么产生的呢?
Word2Vec 和 ELMo 都是词向量(word embedding)方法:
Word2Vec(静态)
- 静态词向量:为每个词学习一个固定的向量表示
- 预训练方式:通过 CBOW 或 Skip-gram 在大规模语料上训练
- 特点:同一个词无论出现在什么上下文中,向量都是一样的
- 可以看作是对”嵌入词表”的预处理训练,训练完成后得到一张固定的词-向量查找表
总结:word2vec最终的产物就是这样一个嵌入词表,他是静态的,只能从表中取词向量,无法处理一词多义问题.
1 | 比如针对苹果这个词: |
Word2Vec 的处理方式:
训练完成后,产出的嵌入词表长这样(简化为3维):
1 | <TEXT> |
处理句子 A「我今天吃了一个苹果」:
- 查表 →
[0.3, 0.7, 0.2]
处理句子 B「苹果发布了新款iPhone」:
- 查表 →
[0.3, 0.7, 0.2]
结果完全一样。 它不管上下文是水果还是公司,”苹果”永远是同一个向量。这个向量大概是两种含义的某种混合平均,两边都沾点,两边都不精确。
ELMo (动态)
- 动态/上下文相关词向量:同一个词在不同上下文中会有不同的向量
- 预训练方式:通过双向 LSTM 语言模型在大规模语料上训练
- 特点:不是简单的查找表,而是需要把整个句子输入模型后才能得到每个词的表示
- 严格来说不是对嵌入词表的预处理,而是一个预训练的特征提取器
总结:相比于word2vec的静态处理方式,elmo的产出物是一个模型,他会有像word2vec中的静态嵌入矩阵,但是他的模型能力会根据矩阵以及上下文生成一个动态的词向量,成功解决了一词多义问题.
还是刚刚的那个例子:
ELMo 的处理方式
ELMo 有两部分:
第一部分:底层词表(类似 Word2Vec)
1 | <TEXT> |
第二部分:双向 LSTM 模型(关键区别在这里)
处理句子 A「我今天吃了一个苹果」:
1 | <TEXT> |
处理句子 B「苹果发布了新款iPhone」:
1 | <TEXT> |
同一个词,不同上下文,产出不同向量。
两种方式对比:
| Word2Vec | ELMo | |
|---|---|---|
| 产出物 | 一张词表 | 词表 + LSTM模型 |
| 使用时 | 查表,O(1) | 查表 + 模型前向推理 |
| 同一个词不同句子 | 向量相同 | 向量不同 |
| 类比 | 字典:查”苹果”永远是同一个解释 | 人:看到上下文后判断”苹果”在这里是什么意思 |
Word2Vec 是字典,ELMo 是一个会阅读理解的模型。
总结:
输入一句话:”我喜欢cat”
第一步:分词(Tokenization)
1 | <TEXT> |
注意:token 不一定是一个完整的词
1 | <TEXT> |
第二步:查嵌入矩阵
1 | <TEXT> |
查完之后
1 | <TEXT> |
第三步:送进 Transformer 层
1 | <TEXT> |
然后经过:
1 | 第1层 Transformer:矩阵乘法 → 注意力 → 矩阵乘法 → 输出新的3个向量 |
这就是注意力机制在做的事
第四步:预测下一个词
1 | <TEXT> |
总结整个流程
1 | <TEXT> |
这就是大模型干的全部事情:一个超大的、把文字变成数字再反复做矩阵运算的预测机器。
关于token的消耗:
你以为你只发了一句话:
“请用Python写一个冒泡排序” ← 7个token但实际发给模型的是这些东西拼在一起:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 >┌─────────────────────────────────────────────┐
>│ 系统提示词(system prompt) │
>│ "你是一个有用的AI助手,你需要..." │
>│ → 约 200 token │
>├────────────────────────────── ──────────────┤
>│ 历史对话(之前聊过的所有内容) │
>│ 用户:你好 │
>│ AI:你好!有什么可以帮你的? │
>│ 用户:我想学Python │
>│ AI:好的,Python是一门很棒的语言... │
>│ → 假设之前聊了 3 轮,约 500 token │
>├─────────────────────────────────────────────┤
>│ 你这次的提问 │
>│ "请用Python写一个冒泡排序" │
>│ → 7 token │
>└─────────────────────────────────────────────┘实际输入 = 200 + 500 + 7 = 707 个 token
这就是为什么聊得越久越费 token
因为每次都要把之前所有对话重新发一遍给模型