NLP发展史
NLP发展脉络简要梳理如下:
2001 - Neural language models(神经语言模型)
2008 - Multi-task learning(多任务学习)
2013 - Word embeddings(词嵌入)
2013 - Neural networks for NLP(NLP神经网络)
2014 - Sequence-to-sequence models
2015 - Attention(注意力机制)
2015 - Memory-based networks(基于记忆的网络)
2018 - Pretrained language models(预训练语言模型)
2001 - 神经语言模型
第一个神经语言模型是Bengio等人在2001年提出的前馈神经网络,如图所示:
这个模型将从表C中查找到的n个单词作为输入向量表征。这种向量被现在的学者们称做“词嵌入”。这些词嵌入级联后被输入到一个隐藏层中,该隐藏层的输出又被输入到softmax。
场景示例:预测下一个词
假设我们有一句话的前几个词:
“I like to eat …”
我们的目标是:用神经网络根据已有的上下文I like to eat
来预测下一个词(比如 “apples”, “rice”, “pizza” 等)。
1. 准备输入(词索引)
- 首先,我们给词表(vocabulary)中的每个单词都分配一个 索引 (index)。在最底层,模型看到的输入并不是 “I, like, to, eat” 的字符,而是它们在词表中的索引编号。
- 比如:
- “I” → index = 101
- “like” → index = 532
- “to” → index = 7
- “eat” → index = 85
- 在图中,这些索引就对应 “index for wt−3”、“index for wt−2” 等。
Thought about neural language model explanation,持续 12 秒
下面给你举一个具体示例,帮助理解图中神经网络语言模型(Neural Language Model)是如何工作的。
场景示例:预测下一个词
假设我们有一句话的前几个词:
“I like to eat …”
我们的目标是:用神经网络根据已有的上下文I like to eat
来预测下一个词(比如 “apples”, “rice”, “pizza” 等)。
1. 准备输入(词索引)
- 首先,我们给词表(vocabulary)中的每个单词都分配一个 索引 (index)。在最底层,模型看到的输入并不是 “I, like, to, eat” 的字符,而是它们在词表中的索引编号。
- 比如:
- “I” → index = 101
- “like” → index = 532
- “to” → index = 7
- “eat” → index = 85
- 在图中,这些索引就对应 “index for wt−3w_{t-3}wt−3”、“index for wt−2w_{t-2}wt−2” 等。
2. 从词嵌入矩阵 C
中查询 Embedding
- 模型里有一个嵌入矩阵(Embedding Matrix),通常记作
C
。它是一个「表」,用来将「词索引」映射成「向量表示」。 - 举例,如果词表的大小是
V=10000
,而我们的词向量维度设为d=300
,那么C
的大小就是10000 x 300
。每一行对应一个单词的 300 维向量。 - 当输入是索引
[101, 532, 7, 85]
(表示 “I like to eat”)时,模型会分别去C
的第 101 行、第 532 行、第 7 行、第 85 行,把那几行向量取出来:- C("I") = 一个 300 维向量
- C("like") = 一个 300 维向量
- C("to") = 一个 300 维向量
- C("eat") = 一个 300 维向量
- 这几条向量就如同图中那几个蓝色小方框,里面放着红色小圆点(表示向量维度的数值)。
3. 将若干个词向量组合输入到隐层
- 拿到这四个词向量后,通常会拼接 (concatenate) 或者做其他操作(例如平均、加和等),形成一个长的向量,作为神经网络的输入。
- 随后,这个长向量会通过一个(或多个)隐层 (hidden layer)。
- 图中用 “tanh” 表示可能存在一个全连接层 + 激活函数(如 tanh 或 ReLU)。
- 模型会将输入向量映射到一个新的表示空间,学习到“这些词组合在一起时,它们所包含的上下文信息”。
4. 输出层(Softmax)得到下一词概率分布
- 随后,隐层的输出会传递给输出层 (output layer),这里通常是一个大小为
V
(词表大小)的全连接层,再接一个 Softmax。 - Softmax 会将网络输出变成一个概率分布,即对词表中每个可能的词(1 到 V)给出一个概率:
- 这就意味着模型会输出类似:
- “apples” → 0.28
- “rice” → 0.15
- “pizza” → 0.10
- “is” → 0.05
- “and” → 0.01
- …(其他词)
- 这些值相加等于 1,表示在给定 “I like to eat” 这个上下文时,模型认为下一个词是 “apples” 的概率最高,其次是 “rice”,再然后是 “pizza”,依此类推。
5. 训练 & 参数更新
- 在训练过程中,我们会有大量的句子样本(真实文本)。模型会对每个句子中的每个位置尝试预测下一个词,然后与真实词做对比,计算交叉熵损失或负对数似然等。
- 通过反向传播 (backpropagation),模型会不断更新:
- Embedding Matrix
C
(让词向量变得更能表达单词的含义与语境), - 隐层/输出层的权重(让网络更好地捕捉上下文与下一词的依赖关系)。
- Embedding Matrix
6. 小结
综合起来,这个流程就是:
- 将离散单词索引 → 查表得到向量 (Embedding) → 隐层 → 输出层 (Softmax) → 获得概率分布。
- 通过大量语料训练,让模型参数学到“在特定上下文时,下一个词更可能是什么”。
这个思路在当年是对传统 n-gram
语言模型的一次巨大改进,因为神经网络可以通过共享的词向量解决数据稀疏和泛化能力差的问题,并且在处理多样化的文本时效果更好。
语言建模通常是应用RNN时的第一步,是一种非监督学习形式。尽管它很简单,但却是本文后面讨论的许多技术发展的核心:
词嵌入:word2vec 的目标是简化语言建模。
sequence-to-sequence 模型:这种模型通过一次预测一个单词生成一个输出序列。
预训练语言模型:这些方法使用来自语言模型的表述进行迁移学习。
反过来讲,这意味着近年来 NLP 的许多重要进展都可以归结为某些形式的语言建模。为了“真正”理解自然语言,仅仅从文本的原始形式中学习是不够的。我们需要新的方法和模型。
2008- 多任务学习
多任务学习是在多个任务上训练的模型之间共享参数的一种通用方法。在神经网络中,可以通过给不同层施以不同的权重,来很容易地实现多任务学习。多任务学习的概念最初由Rich Caruana 在1993年提出,并被应用于道路跟踪和肺炎预测(Caruana,1998)。直观地说,多任务学习鼓励模型学习对许多任务有用的表述。这对于学习一般的、低级的表述形式、集中模型的注意力或在训练数据有限的环境中特别有用。
在2008年,Collobert 和 Weston 将多任务学习首次应用于 NLP 的神经网络。在他们的模型中,查询表(或单词嵌入矩阵)在两个接受不同任务训练的模型之间共享,如下面的图所示。