深度学习 DAY3:NLP发展史

news/2025/2/1 9:13:24 标签: 深度学习, bert, 人工智能

NLP发展史

NLP发展脉络简要梳理如下:

(远古模型,上图没有但也可以算NLP)
1940 - BOW(无序统计模型)
1950 - n-gram(基于词序的模型)

(近代模型)
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(预训练语言模型)

1940 - 词袋模型(BOW)

首先解释一下什么是词袋模型:

词袋模型(Bag-of-Words, BOW) 是最早、最经典的文本表示方法之一(1940左右出现,甚至比n-gram还要早,我愿称之为原始祖师爷)。它将一段文本看作一个「袋子」:里面盛放了这个文本所含的所有单词,但忽略了单词的顺序、句法结构等信息,只关注单词是否出现以及出现次数(或频率)。这就好比把句子里的单词都抓出来扔进一个袋子,摇匀后再数一数这些单词都有什么、各出现几次。

              

1.1 典型示例

假设我们的词表是 "I","like","apples","banana",大小 V=4(指的就是一共有4个词)。
有两句话:

“I like apples”
“I like banana apples”
那么在词袋表示下:

对于 “I like apples”:

"I" 出现 1 次
"like" 出现 1 次
"apples"出现 1 次
"banana"出现 0 次
向量表示可写作 [1, 1, 1, 0]
对于 “I like banana apples”:

"I" 出现 1 次
"like" 出现 1 次
"apples"出现 1 次
"banana"出现 1 次
向量表示可写作 [1, 1, 1, 1]
可以看到,这种表示只管词的出现情况,不会去记录 “banana”是在“apples”前还是后出现,也不会记录它们之间的距离。这样就得到最纯粹的词袋表示。

1950 - N-Gram模型

n-gram算法的基本思想是将文本拆分成若干个连续的n个词的序列,并统计这些序列在文本中出现的频率。这里的n是一个正整数,表示词组中词的个数。

例如,在句子“我喜欢学习自然语言处理”中,

1-gram(unigram)是单个词,如“我”、“喜欢”等;
2-gram(bigram)是相邻的两个词组成的词组,如“我喜欢”、“喜欢学习”等;
3-gram(trigram)则是相邻的三个词组成的词组,如“我喜欢学习”等。
通过统计这些n-gram的频率,我们可以得到文本中各个词组的出现概率分布。这些概率信息对于后续的文本生成、语言模型构建、文本分类等任务具有重要的指导意义。

n-gram 的预测原理可以用一个 奶茶店点单预测 的类比来理解。我们通过实际场景拆解其核心机制:


一、基本原理:局部依赖的马尔可夫假设
1. 核心公式

                                

假设预测第n个词时,只需看前N-1个词(如同奶茶店员只需记住最近3位顾客的点单)

2. 实际案例

当顾客连续点单:

"珍珠奶茶" → "布丁奶茶" → "椰果奶茶"

使用 trigram(N=3) 预测时:

  • 新顾客点单序列:"珍珠奶茶" → "布丁奶茶" → ?

  • 预测逻辑:根据前两个饮品 "布丁奶茶" 预测下一个可能饮品

2001 - 神经语言模型(其实比这个更早的是n-gram和BOW,这两个是基于统计的方法)

第一个神经语言模型是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” 等。

下面举一个具体示例,帮助理解图中神经网络语言模型(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(让词向量变得更能表达单词的含义与语境),
    • 隐层/输出层的权重(让网络更好地捕捉上下文与下一词的依赖关系)。

6. 小结

综合起来,这个流程就是:

  1. 将离散单词索引 → 查表得到向量 (Embedding) → 隐层 → 输出层 (Softmax) → 获得概率分布
  2. 通过大量语料训练,让模型参数学到“在特定上下文时,下一个词更可能是什么”。

这个思路在当年是对传统 n-gram 语言模型的一次巨大改进,因为神经网络可以通过共享的词向量解决数据稀疏和泛化能力差的问题,并且在处理多样化的文本时效果更好。

语言建模通常是应用RNN时的第一步,是一种非监督学习形式。尽管它很简单,但却是本文后面讨论的许多技术发展的核心:

词嵌入:word2vec 的目标是简化语言建模。

sequence-to-sequence 模型:这种模型通过一次预测一个单词生成一个输出序列。

预训练语言模型:这些方法使用来自语言模型的表述进行迁移学习。

反过来讲,这意味着近年来 NLP 的许多重要进展都可以归结为某些形式的语言建模。为了“真正”理解自然语言,仅仅从文本的原始形式中学习是不够的。我们需要新的方法和模型。

2008- 多任务学习

多任务学习是在多个任务上训练的模型之间共享参数的一种通用方法。在神经网络中,可以通过给不同层施以不同的权重,来很容易地实现多任务学习。多任务学习的概念最初由Rich Caruana 在1993年提出,并被应用于道路跟踪和肺炎预测(Caruana,1998)。直观地说,多任务学习鼓励模型学习对许多任务有用的表述。这对于学习一般的、低级的表述形式、集中模型的注意力或在训练数据有限的环境中特别有用。

在2008年,Collobert 和 Weston 将多任务学习首次应用于 NLP 的神经网络。在他们的模型中,查询表(或单词嵌入矩阵)在两个接受不同任务训练的模型之间共享,如下面的图所示。 

2013- 词嵌入

用稀疏向量表示文本,即所谓的词袋模型在 NLP 有着悠久的历史。正如上文中介绍的,早在 2001年就开始使用密集向量表示词或词嵌入。Mikolov等人在2013年提出的创新技术是通过去除隐藏层,逼近目标,进而使这些单词嵌入的训练更加高效。虽然这些技术变更本质上很简单,但它们与高效的word2vec配合使用,便能使大规模的词嵌入训练成为可能。

Word2vec有两种风格,如下面的图所示:连续字袋 CBOW 和 skip-gram。不过他们的目标不同:一个是根据周围的单词预测中心单词,而另一个则相反。

        

虽然这些嵌入在概念上与使用前馈神经网络学习的嵌入在概念上没有区别,但是在一个非常大的语料库上训练之后,它们就能够捕获诸如性别、动词时态和国家-首都关系等单词之间的特定关系,如下图所示。

2014 - NLP 神经网络

2013 年和 2014 年是 NLP 问题开始引入神经网络模型的时期。使用最广泛的三种主要的神经网络是:循环神经网络、卷积神经网络和递归神经网络。

循环神经网络(RNNs) 循环神经网络是处理 NLP 中普遍存在的动态输入序列的一个最佳的技术方案。Vanilla RNNs (Elman,1990)很快被经典的长-短期记忆网络(Hochreiter & Schmidhuber,1997)所取代,它被证明对消失和爆炸梯度问题更有弹性。在 2013 年之前,RNN 仍被认为很难训练;Ilya Sutskever 的博士论文为改变这种现状提供了一个关键性的例子。下面的图对 LSTM 单元进行了可视化显示。双向 LSTM(Graves等,2013)通常用于处理左右两边的上下文。

卷积神经网络(CNNs) 卷积神经网络本来是广泛应用于计算机视觉领域的技术,现在也开始应用于语言(Kalchbrenner等,2014;Kim等,2014)。文本的卷积神经网络只在两个维度上工作,其中滤波器(卷积核)只需要沿着时间维度移动。下面的图显示了NLP中使用的典型 CNN。

卷积神经网络的一个优点是它们比 RNN 更可并行化,因为其在每个时间步长的状态只依赖于本地上下文(通过卷积运算),而不是像 RNN 那样依赖过去所有的状态。使用膨胀卷积,可以扩大 CNN 的感受野,使网络有能力捕获更长的上下文(Kalchbrenner等,2016)。CNN 和 LSTM 可以组合和叠加(Wang等,2016),卷积也可以用来加速 LSTM(Bradbury等, 2017)。

递归神经网络 RNN 和 CNN 都将语言视为一个序列。然而,从语言学的角度来看,语言本质上是层次化的:单词被组合成高阶短语和从句,这些短语和从句本身可以根据一组生产规则递归地组合。将句子视为树而不是序列的语言学启发思想产生了递归神经网络(Socher 等人, 2013),如下图所示

                

递归神经网络从下到上构建序列的表示,这一点不同于从左到右或从右到左处理句子的 RNN。在树的每个节点上,通过组合子节点的结果来计算新的结果。由于树也可以被视为在 RNN 上强加不同的处理顺序,所以 LSTM 自然地也被扩展到树上(Tai等,2015)。 

RNN 和 LSTM 可以扩展到使用层次结构。单词嵌入不仅可以在本地学习,还可以在语法语境中学习(Levy & Goldberg等,2014);语言模型可以基于句法堆栈生成单词(Dyer等,2016);图卷积神经网络可以基于树结构运行(Bastings等,2017)。 

2014-sequence-to-sequence 模型

2014 年,Sutskever 等人提出了 sequence-to-sequence 模型。这是一个使用神经网络将一个序列映射到另一个序列的通用框架。在该框架中,编码器神经网络逐符号处理一个句子,并将其压缩为一个向量表示;然后,一个解码器神经网络根据编码器状态逐符号输出预测值,并将之前预测的符号作为每一步的输入,如下图所示。

机器翻译是对这个框架比较成功的应用。2016 年,谷歌宣布将开始用神经 MT 模型取代基于单片短语的 MT 模型(Wu等,2016)。根据 Jeff Dean 的说法,这意味着用 500 行神经网络模型替换 50 万行基于短语的MT代码。

由于其灵活性,这个框架现在是自然语言生成任务的首选框架,其中不同的模型承担了编码器和解码器的角色。重要的是,解码器模型不仅可以解码一个序列,而且可以解码任意表征。例如,可以基于图像生成标题(Vinyals等,2015)(如下图所示)、基于表生成文本(Lebret等,2016)和基于应用程序中源代码更改描述(Loyola等,2017)。   

                         

sequence-to-sequence 学习甚至可以应用于 NLP 中输出具有特定结构的结构化预测任务。为了简单起见,输出被线性化,如下面的图所示,用于进行选区解析。神经网络已经证明了在有足够数量的训练数据进行选区分析(Vinyals等,2015)和命名实体识别(Gillick等, 2016)的情况下,直接学习可以产生这种线性化输出的能力。

2015- 注意力机制

注意力机制(Bahdanau 等,2015)是神经网络机器翻译(NMT)的核心创新之一,也是使 NMT模型胜过经典的基于短语的MT系统的关键思想。sequence-to-sequence模型的主要瓶颈是需要将源序列的全部内容压缩为一个固定大小的向量。注意力机制通过允许解码器回头查看源序列隐藏状态来缓解这一问题,然后将其加权平均作为额外输入提供给解码器,如下面的图所示 

                 

 注意力机制有很多不同的形式(Luong等,2015)。这里有一个简短的概述。注意力机制广泛适用于任何需要根据输入的特定部分做出决策的任务,并且效果不错。它已被应用于一致性解析(Vinyals等,2015)、阅读理解(Hermann等,2015)和一次性学习(Vinyals等,2016)等诸多领域。输入甚至不需要是一个序列,即可以包含其他表示,如图像字幕(Xu等,2015),如下图所示。注意力机制的一个额外的功能是,它提供了一种少见的功能,我们可以通过检查输入的哪些部分与基于注意力权重的特定输出相关来了解模型的内部工作方式。

 

2015 - 基于记忆的网络(已完全被transformer取代,甚至我都没怎么听过,可完全忽略)

注意力机制可以看作是模糊记忆的一种形式。记忆由模型的隐藏状态组成,模型选择从记忆中检索内容。研究者们提出了许多具有更明确记忆的模型。这些模型有不同的变体,如神经图灵机(Graves等,2014)、记忆网络(Weston等,2015)和端到端记忆网络(Sukhbaatar等,2015)、动态记忆网络(Kumar等,2015)、神经微分计算机(Graves等,2016)和循环实体网络(Henaff等,2017)。

记忆的访问通常基于与当前状态的相似度,类似于注意力,通常可以写入和读取。模型在如何实现和利用内存方面有所不同。例如,端到端记忆网络多次处理输入,并更新记忆以实现多个推理步骤。神经图灵机也有一个基于位置的寻址,这允许他们学习简单的计算机程序,如排序。基于记忆的模型通常应用于一些特定任务中,如语言建模和阅读理解。在这些任务中,长时间保存信息应该很有用。记忆的概念是非常通用的:知识库或表可以充当记忆,而记忆也可以根据整个输入或它的特定部分填充。

2018 - 预训练语言模型(这个和上面也是相似的,属于被Transformer 统治 NLP 之前的最后一波 LSTM 时代的辉煌,本质还是LSTM,可完全忽略)

预训练的词嵌入与上下文无关,仅用于初始化模型中的第一层。一系列监督型任务被用于神经网络的预训练。相反,语言模型只需要无标签的文本;因此,训练可以扩展到数十亿个tokens, new domains, new languages。预训练语言模型于 2015 年被首次提出(Dai & Le,2015);直到最近,它们才被证明在各种任务中效果还是不错的。语言模型嵌入可以作为目标模型中的特征(Peters等,2018),或者使用语言模型对目标任务数据进行微调(Ramachandranden等,2017; Howard & Ruder,2018)。添加语言模型嵌入可以在许多不同的任务中提供比最先进的技术更大的改进,如下面的图所示。

                    

预训练的语言模型已经被证明可以用更少的数据进行学习。由于语言模型只需要无标记的数据,因此对于标记数据稀缺的低资源语言尤其有用。

其他里程碑事件
其他一些技术发展没有上面提到的那样流行,但仍然有广泛的影响。

基于字符的表示
在字符上使用 CNN 或 LSTM 以获得基于字符的词表示的做法现在相当普遍,特别是对于形态信息重要或有许多未知单词的丰富的语言和任务,效果更加明显。据我所知,序列标签使用基于字符的表示(Lample 等人,2016;普兰克等人,2016),可以减轻在计算成本增加的情况下必须处理固定词汇表的需要,并支持完全基于字符的 NMT (Ling 等人, 2016;Lee 等人,2017)。

对抗学习
对抗学习方法已经在 ML 领域掀起了风暴,在 NLP 中也有不同形式的应用。对抗性的例子越来越被广泛使用,它不仅是作为一种工具来探究模型和理解它们的失败案例,而且也使自身更加鲁棒(Jia & Liang, 2017)。(虚拟)对抗性训练,即最坏情况扰动(Miyato 等人,2017)和领域对抗性损失(Ganin 等人, 2016;Kim 等人,2017),同样可以使模型更加鲁棒。生成对抗网络(GANs)对于自然语言生成还不是很有效(Semeniuta 等人, 2018),但在匹配分布时很有用(Conneau 等人, 2018)。

强化学习
强化学习已被证明对具有时间依赖性的任务有效,例如在训练期间选择数据(Fang 等人, 2017;Wu 等人, 2018)和建模对话(Liu 等人, 2018)。RL 对于直接优化不可微的末端度量(如 ROUGE 或 BLEU)也有效,反而在汇总中优化替代损失(如交叉熵)(Paulus 等人, 2018;Celikyilmaz 等人,2018)和机器翻译场景效果就不明显了(Ranzato 等人,2016)。类似地,逆向强化学习在过于复杂而无法指定数据的情况下也很有用,比看图说话任务(Wang 等人, 2018)。


http://www.niftyadmin.cn/n/5839245.html

相关文章

答疑解惑:如何监控EMC unity存储系统磁盘重构rebuild进度

近期有个朋友咨询的问题,这个其实很有代表性的,以前在VNX存储中,通过磁盘的属性是可以看到rebuild的进度的。到了unity年代,更换了一个磁盘,如何查询重构的进度,从图形界面好像没有找到合适的地方去查看。 …

python第八章处理异常

设置特定异常提示语: #单独作用 try:xint(input(enter the first:))yint(input(enter the second:))print(x/y) except ZeroDivisionError:print("the second number cant be zero")enter the first:12 enter the second:0 the second number cant be ze…

面试之SolrElasticsearch

优点: 1.Elasticsearch是分布式的。不需要其他组件,分发是实时的,被叫做”Push replication”。 2.Elasticsearch 完全支持 Apache Lucene 的接近实时的搜索。 3.处理多租户(multitenancy)不需要特殊配置&#xff0…

Vue 3 30天精进之旅:Day 10 - Vue Router

在现代单页面应用(SPA)中,路由管理是必不可少的一部分。Vue Router是Vue.js官方的路由管理库,它使得在Vue应用中实现路由变得简单而灵活。今天的学习将围绕以下几个方面展开: Vue Router概述安装和基本配置定义路由路…

项目练习:重写若依后端报错cannot be cast to com.xxx.model.LoginUser

文章目录 一、情景说明二、解决办法 一、情景说明 在重写若依后端服务的过程中 使用了Redis存放LoginUser对象数据 那么,有存就有取 在取值的时候,报错 二、解决办法 方法1、在TokenService中修改如下 getLoginUser 方法中:LoginUser u…

Kafka常见问题之 java.io.IOException: Disk error when trying to write to log

文章目录 Kafka常见问题之 java.io.IOException: Disk error when trying to write to log1. 问题概述2. 问题排查方向(1)磁盘空间不足(2)磁盘 I/O 故障(3)Kafka 日志文件损坏(4)Kaf…

Java设计模式:行为型模式→观察者模式

Java 观察者模式详解 1. 定义 观察者模式(Observer Pattern)是一种行为型设计模式,它定义了一种一对多的依赖关系,使得当一个对象的状态发生变化时,所有的依赖者(观察者)都会得到通知并自动更…

C++计算给定序列在多次修改前后满足特定条件的极大匹配方案的大小

给定长度为n的整数序列 a 1 , a 2 , . . . , a n a_1,a_2,...,a_n a1​,a2​,...,an​和长度为n的01序列 b 1 , b 2 , . . . , b n b_1,b_2,...,b_n b1​,b2​,...,bn​。 对于 1 ≤ i < j ≤ n 1\leq i<j\leq n 1≤i<j≤n&#xff0c;称二元组 ( i , j ) (i,j) (i,j)…