【NLP方向】【万时计划】65-71

SEQ2SEQ

Seq2seq是机器学习里用于自然语言处理的一个算法簇,主要应用于语言翻译,画像字幕,会话模型和文本摘要提取。起初是谷歌发明用于机器翻译的算法。2019年提出了用其求解符号数学的问题,包含函数微分,一阶常微分方程,二阶常微分方程等复杂问题。

目前主流的Seq2seq模型包括:

  • RNN, Recurrent Natural Network
  • LSTM, Long-Short Term Memory
  • GRU, Gated recurrent unit

Seq2seq模型的输入是一系列的单词,输出是被翻译过后的另外一系列单词。

该模型主要分为两部分:

在这里插入图片描述

  • 编码阶段:在编码阶段,Seq2seq模型的编码器(Encoder)将输入的序列编码为一个隐藏层向量。
  • 解码阶段:在解码阶段,解码器(Decoder)将隐藏层的向量解码为输出序列()一个英文句子
seq2seq中的RNN

在这里插入图片描述

将上图中的RNN cell进一步透明化,表示RNN模型中的一个神经元细胞。每个神经元细胞的输入包括两部分:input和hidden state #0;输出同样包含两部分:output和hidden state #2。对于RNN而言,每一个神经元的输入hidden #t,是上一个神经元t-1的输出。

当输入和输出都是不定长序列时,我们可以使用(encoder-decoder)模型。该模型中的两部分本质上都用到了循环神经网络,分别叫做编码器和解码器。编码器用来分析输入序列,解码器用来生成输出序列。这两个循环神经网络是共同训练的。

例:使⽤编码器—解码器将英语句子翻译成法语句子

在训练集中,我们可以在每个句子后附上特殊标点符号"“表示序列终止。编码器每个时间步的输入依次为英语句子中的单词、标点、特殊符号。下图使用了编码器在最终时间步的隐藏状态作为输入句子的表征或编码信息。解码器在各个时间步中使用输入句子的编码信息和上一个时间步的输入以及隐藏状态作为输入。我们希望解码器在各个时间步能正确依次输出翻译后的法语单词、标点和特殊符号;解码器在最初时间步的输入用到了一个表示序列的特殊符号”"

在这里插入图片描述

编码器的作用是把一个定长的输入序列变换成一个定长的背景变量c,并在该背景变量中编码输入序列信息。常用的编码器是循环神经网络。

考虑批量大小为1的时序数据样本。假设输入序列是 x 1 , . . . , x T {{x}_{1}},...,{{x}_{T}} x1,...,xT,例如 x i {{x}_{i}} xi是输入句子中的第i个词。在时间步t,循环神经网络将输入的特征向量 x t {{x}_{t}} xt和上个时间步的隐藏状态 h t − 1 {{h}_{t-1}} ht1变换为当前时间步的隐藏状态 h t {{h}_{t}} ht。我们可以用函数f表达循环神经网络隐藏层的变换:

h t = f ( x t , h t − 1 ) {{h}_{t}}=f({{x}_{t}},{{h}_{t-1}}) ht=f(xt,ht1)

接下来,编码器通过自定义函数q将各个时间步的隐藏状态变换为背景向量:

c = q ( h 1 , h 2 , . . . , h T ) c=q({{h}_{1}},{{h}_{2}},...,{{h}_{T}}) c=q(h1,h2,...,hT)

以上的编码器是一个单向的循环神经网络,每个时间步的隐藏状态只取决于该时间步及之前的输入子序列。我们也可使用双向循环神经网络构造编码器。编码器每个时间步的隐藏状态同时取决于该时间步之前和之后的子序列,并编码整个序列的信息。

解码器输出的是北背景变量c编码了整个输入序列 x 1 , . . . , x T {{x}_{1}},...,{{x}_{T}} x1,...,xT的信息。给定训练样本中的输出序列 y 1 , y 2 . . . , y T ′ {{y}_{1}},{{y}_{2}}...,{{y}_{T'}} y1,y2...,yT,对每个时间步骤 t ′ t' t,解码器输出 y t ′ {{y}_{t'}} yt的条件概率将基于之前的输出序列 y 1 , y 2 . . . , y t ′ − 1 {{y}_{1}},{{y}_{2}}...,{{y}_{t'-1}} y1,y2...,yt1和背景变量c,即:

P ( y t ′ ∣ y 1 , y 2 . . . , y t ′ − 1 , c ) P({{y}_{t'}}|{{y}_{1}},{{y}_{2}}...,{{y}_{t'-1}},c) P(yty1,y2...,yt1,c)

为此,我们可以使用另一个循环神经网络作为解码器。在输出序列的时间步 t ′ t' t,解码器将上一时间步的输出 y t ′ − 1 {{y}_{t'-1}} yt1以及背景变量c作为输入,并将它们与上一时间步的隐藏状态 s t ′ − 1 {{s}_{t'-1}} st1变换为当前时间步的隐藏状态 s t ′ {{s}_{t'}} st。因此 ,我们可以用函数g表达解码器隐藏层的变换: s t ′ = g ( y t ′ − 1 , c , s t ′ − 1 ) {{s}_{t'}}=g({{y}_{t'-1}},c,{{s}_{t'-1}}) st=g(yt1,c,st1)

有了解码器的隐藏状态后,我们可以使用自定义的输出层和softmax函数来计算概率 P ( y t ′ ∣ y 1 , y 2 . . . , y t ′ − 1 , c ) P({{y}_{t'}}|{{y}_{1}},{{y}_{2}}...,{{y}_{t'-1}},c) P(yty1,y2...,yt1,c),例如,基于当前时间步的解码器隐藏状态 s t ′ {{s}_{t'}} st、上一时间步的输出 s t ′ − 1 {{s}_{t'-1}} st1以及背景变量c来计算当前时间步输出 y t ′ {{y}_{t'}} yt的概率分布。

训练模型

根据最大似然估计,我们可以最大化输出序列基于输入序列的条件概率:

KaTeX parse error: No such environment: align at position 7: \begin{̲a̲l̲i̲g̲n̲}̲ & P({{y}_{1}…

并得到该输出序列的损失:

− log ⁡ P ( y 1 , y 2 . . . , y t ′ − 1 ∣ x 1 , . . . , x T ) = − ∑ t ′ T ′ log ⁡ P ( y t ′ ∣ y 1 , y 2 . . . , y t ′ − 1 , c ) -\log P({{y}_{1}},{{y}_{2}}...,{{y}_{t'-1}}|{{x}_{1}},...,{{x}_{T}})=-\sum\nolimits_{{{t}^{'}}}^{{{T}^{'}}}{\log P(}{{y}_{t'}}|{{y}_{1}},{{y}_{2}}...,{{y}_{t'-1}},c) logP(y1,y2...,yt1x1,...,xT)=tTlogP(yty1,y2...,yt1,c)

在模型训练中,所有输出序列损失的均值通常作为 需要最小化的损失函数。在上述的模型预测中,我们需要将解码器再上一个时间步的输出作为当前时间步的输入。与此不同,在训练中我们也可以将标签序列再上一个时间步的标签作为解码器在当前时间步的输入。这叫做强制教学 teacher forcing

seq2seq模型预测

在准备训练数据集时,我们通常会在样本的输入序列和输出序列后面分别附上一个特殊符号"“表示序列的终止。假设解码器的输出是一段文本。设输出文本词典 Y Y Y的大小 ∣ Y ∣ |Y| Y,输出 序列的最大长度为 T ′ {{T}^{'}} T。所有可能的输出序列一共有 O ( ∣ y ∣ T ′ ) O(|y{{|}^{{{T}^{'}}}}) O(yT)种。这些输出序列中所有特殊符号”"后面的子序列将被舍弃。

贪婪搜索

对于输出序列任意时间步 t ′ t' t ,我们从 ∣ Y ∣ |Y| Y个词中搜索出条件概率最大的词:

y t ′ = arg ⁡ max ⁡ y ∈ Y P ( y ∣ y 1 , . . . , y t ′ − 1 , c ) {{y}_{t'}}=\arg {{\max }_{y\in Y}}P(y|{{y}_{1}},...,{{y}_{t'-1}},c) yt=argmaxyYP(yy1,...,yt1,c)作为输出。一旦搜索出""符号,或者输出序列长度已经达到了最大长度 T ′ {{T}^{'}} T,便完成输出。我们在描述解码器时提到,基于输入序列生成输出序列的条件概率是: ∏ t ′ = 1 T ′ P ( y t ′ ∣ y 1 , y 2 . . . , y t ′ − 1 , c ) \prod\nolimits_{t'=1}^{{{T}^{'}}}{P({{y}_{t'}}|{{y}_{1}},{{y}_{2}}...,{{y}_{t'-1}},c)} t=1TP(yty1,y2...,yt1,c)

我们将该条件概率最大的输出序列称为最优输出序列。而贪婪搜索的主要问题是不能保证得到最优输出序列。

例:

假设输出词典里有"A", “B”, “C"和”"这四个词。下图中每个时间步下的4个数字分别代表了该时间步生成以上四词的条件概率。在每个时间步,贪婪搜索选取条件概率最大的词。因此,下图该输出序列的条件概率是 0.5 × 0.4 × 0.4 × 0.6 = 0.048 0.5\times 0.4\times 0.4\times 0.6=0.048 0.5×0.4×0.4×0.6=0.048

在这里插入图片描述

接下来,与上图不同,在时间步2中选取了条件概率第二大的词"C"。由于时间步3所基于的时间步1和2的输出子序列由上图中"A"“B"变为了下图中的"A”“C”,下图中时间步3生成各个词的条件概率发生了变化。我们选取条件概率最大的词"B"。此时时间步4所基于的前三个时间步的输出子序列为"A"“C”“B”,与上图中的"A"“B”“C"不同。因此,下图中时间步4生成各个词的条件概率也与上图中的不同。我们发现,此时的输出序列"A”“C”“B”““的条件概率是 0.5 × 0.3 × 0.6 × 0.6 = 0.054 0.5\times 0.3\times 0.6\times 0.6=0.054 0.5×0.3×0.6×0.6=0.054大于贪婪搜索得到的输出序列的条件概率。因此,贪婪搜索得到的输出序列"A”“B”“C””"并非最优输出序列。

在这里插入图片描述

穷举搜索

如果目标是得到最优输出序列,我们可以考虑穷举搜索exhaustive search 穷举所有可能的输出序列,输出条件概率最大的序列。

虽然穷举搜索可以得到最优输出序列,但其计算开销 O ( ∣ y ∣ T ′ ) O(|y{{|}^{{{T}^{'}}}}) O(yT)很容易过大。例如,当|Y|=10000且 T ′ = 10 {{{T}^{'}}}=10 T=10时,我们评估 10000 10 = 10 40 {{10000}^{10}}={{10}^{40}} 1000010=1040个序列,这几乎不可能完成。而贪婪搜索的计算开销是 O ( ∣ y ∣ T ′ ) O(|y{{|}^{{{T}^{'}}}}) O(yT),通常显著小于穷举搜索的计算开销。例如,当|Y|=10000且 T ′ = 10 {{{T}^{'}}}=10 T=10时,我们只需评估 10000 ∗ 10 = 10 5 {{10000}*{10}}={{10}^{5}} 1000010=105个序列。

束搜索

束搜索beam search 是对贪婪搜索的一个改进算法,它有一个束宽超参数。我们将它设为k。当时间步1时,选取当前时间步概率最大的k个词,分别组成 k个候选输出序列的首词。在之后的每个时间步,基于上一时间步的k个候选输出序列,从 k ∣ Y ∣ k|Y| kY个可能的输出序列中选取条件概率最大的k个,作为该时间步的候选输出序列。最终,我们从各个时间步的候选中输出序列中筛选出包含特殊符号""的序列,并将它们中所有特殊符号后面的子序列舍弃,得到最终候选输出序列的集合。
在这里插入图片描述

当束宽为2,输出序列最大长度为3.候选输出序列有A,C,AB,CE,ABD,CED。我们将根据这六个序列得出最终候选输出序列的集合。在最终候选输出序列的集合中,我们取以下分数最高的序列作为输出序列:

1 L α log ⁡ P ( y 1 , . . . , y L ) = 1 L α ∑ t ′ = 1 T ′ log ⁡ P ( y t ′ ∣ y 1 , . . . , y t ′ − 1 , c ) \frac{1}{{{L}^{\alpha }}}\log P({{y}_{1}},...,{{y}_{L}})=\frac{1}{{{L}^{\alpha }}}\sum\nolimits_{{{t}^{'}}=1}^{{{T}^{'}}}{\log P({{y}_{{{t}^{'}}}}|{{y}_{1}},...,{{y}_{{{t}^{'}}-1}},c)} Lα1logP(y1,...,yL)=Lα1t=1TlogP(yty1,...,yt1,c)

其中 L L L为最终候选序列长度,$\alpha 一 般 可 选 为 0.75. 分 母 上 的 一般可选为0.75.分母上的 0.75.{{L}^{\alpha }} 是 为 了 惩 罚 较 长 序 列 在 以 上 分 数 中 较 多 的 对 数 相 加 项 。 分 析 可 知 , 束 搜 索 的 计 算 开 销 为 是为了惩罚较长序列在以上分数中较多的对数相加项。分析可知,束搜索的计算开销为 O(k|y{{|}{{{T}{'}}}})$。这介于贪婪搜索和穷举搜索的计算开销之间。此外,贪婪搜索可看作是束宽为1的束搜索。束搜索通过灵活的束宽k来权衡计算开销和搜索质量。

分析可知,束搜索的计算开销为 O ( k ∣ y ∣ T ′ ) O(k|y{{|}^{{{T}^{'}}}}) O(kyT)。这介于贪婪搜索和穷举搜索的计算开销之间。此外,贪婪搜索可看作是束宽为1的束搜索。束搜索通过灵活的束宽k来权衡计算开销和搜索质量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 自然语言处理(Natural Language Processing,简称NLP)是计算机科学与人工智能领域的一个重要研究方向,目的是让计算机能够理解、处理和生成人类的自然语言。NLP-100例是一份经典的NLP问题集合,包含了各种与自然语言处理相关的问题和挑战。 这份NLP-100例涵盖了从基础的文本处理到更高级的自然语言理解和生成的问题。例如,其中包括了文本预处理、词频统计、语法分析、词性标注、实体识别、情感分析、机器翻译等任务。 NLP-100例的目的是帮助研究者和开发者更好地理解NLP领域的核心问题和技术,同时提供一些典型的案例和数据集供实践和研究使用。通过完成这些例题,可以锻炼自己在NLP领域的能力和技术,提高对自然语言的处理和理解能力。 此外,NLP-100例也为研究者提供了一个可以与其他人交流和探讨的平台。研究者可以使用相同的数据集和问题进行实验和评估,从而更好地了解NLP技术的优劣和进展。 总之,NLP-100例是一个对NLP进行实践和研究的重要资源。通过解决这些例题,可以深入理解自然语言处理的基础和技术,掌握各种NLP任务的方法和技巧。同时,它也是一个促进交流和合作的平台,为NLP研究者提供了一个共同的基础和语言。 ### 回答2: 自然语言处理(Natural Language Processing,简称NLP)是研究计算机与人类自然语言之间的交互的一门学科。NLP-100例指的是日本的一个NLP入门教程,包含了100个常见的NLP问题和对应的解答。 NLP-100例涵盖了从文本处理到语义理解等多个方面的问题。其中,一些例子包括:文本的分词、词性标注、句法分析、语义角色标注和文本分类等。 以分词为例,分词是将一段连续的文本分割成词语的过程。在NLP-100例中,可以通过使用Python中的分词工具NLTK(Natural Language Toolkit)来实现分词功能。 另外,对于文本的词性标注,NLP-100例提供了使用POS(Part-Of-Speech)标记对文本中的每个词进行词性标注的方法。可以使用NLTK提供的POS标注工具来实现。 此外,NLP-100例还包括了语义角色标注的问题,语义角色标注是为了确定句子中的谓语动词所承担的语义角色,如施事者、受事者、时间等。可以使用Stanford CoreNLP工具包来实现语义角色标注。 最后,NLP-100例还介绍了文本分类的问题,文本分类是将文本划分到预定义的类别中。可以使用机器学习算法,如朴素贝叶斯或支持向量机(SVM)等来进行文本分类。 通过学习NLP-100例,我们可以了解到自然语言处理的基本方法和技术,并且可以利用这些技术来解决相关的自然语言处理问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值