籍贯是什么意思线翻译语短语-简历 模板
2023年4月5日发(作者:日本鬼片电影)
Seq2Seq那些事
1前⾔
本篇博客主要记录的是使⽤Tensorflow搭建Seq2Seq模型,主要包括3个部分的叙述:第⼀,Seq2Seq模型的训练过程及原理。第⼆,复
现基于SouGouS新闻语料库的⽂本摘要的应⽤。第三,Seq2Seq模型中存在的问题及相应的Trick。
本篇博客参考多篇博客完成,主要是作为⾃⼰的学习笔记使⽤,但最终还是掺杂⾃⼰的理解和⾃⼰的亲⾝实现过程。后⾯会给出参考博客的
链接。
2浅谈Seq2Seq
2.1Seq2Seq概要
⼀般来说,Seq2Seq模型主要是⽤来解决将⼀个序列X转化为另⼀个序列Y的⼀类问题,此处有点类似于隐马尔科夫模型,通过⼀系列随机变
量X,去预测另外⼀系列随机变量Y。但是不同的是,隐马尔科夫模型中的随机序列与随机变量系列⼀⼀对应⽽Seq2Seq模型则并不是指⼀
⼀对应的关系。Seq2Seq模型主要的应⽤包括机器翻译,⾃动摘要等⼀些端到端的⽣成应⽤。
⽬前来说,对于Seq2Seq⽣成模型来说,主要的思路是将该问题作为条件语⾔模型,在已知输⼊序列和前序⽣成序列的条件下,最⼤化
下⼀⽬标词的概率,⽽最终希望得到的是整个输出序列的⽣成出现的概率最⼤:
说明:1.其中T表⽰输出序列的时间序列⼤⼩,y表⽰输出序列的前t-1个时间点对应的输出,X为输⼊序列。通常情况下,训练模
型的时候y使⽤的是groundtruthtokens,然⽽在测试过程中,groundtruthtokens便不可知,需要使⽤前期预测到的y‘
来表⽰,这将会引发问题7ExposureBias,相应的解决的trick会在第4部分提出。
2.在预测输出序列的每个token时,采⽤的都是最⼤化下⼀⽬标词(token)的概率,来得到token,对于整个句⼦或者说序列来说,这
种解法是贪⼼策略,带来的是局部最佳。对于⼀个端到端的⽣成应⽤来说,将会追求整个序列的最佳,换句话说,希望最后的⽣成序
列的tokens顺序排列的联合概率最⼤,找到⼀个全局最优。
2.2Seq2Seq模型推导
Seq2Seq模型是基于输⼊序列,预测未知输出序列的模型。它有两个部分组成,对输⼊序列的Encoder编码阶段和⽣成输出序列的
Decoder解码阶段。定义输⼊序列[x,x,…,x],由m个固定长度为d的向量构成;输出序列为[y,y,…,y],由n个固定长度为d的向量构成;
上图中可以看出,Encoder使⽤RNN编码后形成语义向量C.再将C作为输出序列模型Decoder的输⼊。解码过程中每⼀个时间点t的输⼊是
上⼀个时刻隐层状态h和中间语义向量C和上⼀个时刻的预测输出y.之后将每个时刻的y相乘得到整个序列出现的概率。其中f是⾮线性
的激活函数。
最后Seq2Seq两个部分(Encoder和Decoder)联合训练的⽬标函数是最⼤化条件似然函数。其中为模型的参数,N为训练集的样本个数。
下图为⽹上某篇博客上的图,展⽰的是⼀个机器翻译的多层Seq2Seq的模型。
2.3Seq2Seq模型上的Attention注意⼒机制
尽管Seq2Seq中的Encoder可以将RNN替换成LSTM来增强最终语义向量C对长的输⼊序列的信息表上,但是由于传统的Seq2Seq模型对
输⼊序列进⾏编码输出的语义向量C是固定的,⼀个向量并不能很好的编码出输⼊序列所有包含的信息,⽽解码阶段则受限于该固定长度的
向量表⽰。因此,此篇论⽂中引⼊Attention机制。
1:t-1
1:t-11:t-
1
12m12n
t-1t-1t
论⽂中提出,将Encoder中的每⼀个时刻的隐藏状态都保存⾄⼀个列表中[h,h,…,h],在Decoder解码每⼀个时刻i的输出时,都需要
计算Encoder的每个时刻的隐藏状态h与Decoder的输出时刻的前⼀个时刻的关系s的关系,进⽽得到Encoder的每个时刻的隐藏状
态对Decoder该时刻的影响程度。如此,Decoder的每个时刻的输出都将获得不同的Encoder的序列隐藏状态对它的影响,从⽽得到
不同的语义向量C。
如上图,Decoder阶段的每个时刻的隐藏状态s,都会根据由Encoder阶段的隐藏状态序列对Decoder阶段上⼀个时刻(i-1)的隐藏状态
的影响也就是我们的语义向量C和上⼀时刻的的状态s,上⼀个时刻的输出y三者通过⼀个⾮线性函数得出。
其中,C是根据Encoder编码阶段的各个隐藏状态(向量)的权重和。
其中,每个时刻的权重a表⽰Encoder编码阶段的第j个隐藏状态对Decoder解码阶段的第i个隐藏状态的权重影响。
其中,e为Encoder编码阶段的第j个隐藏状态和Decoder解码阶段的第i-1个隐藏状态的联合前馈⽹络关系。
**整个计算C的过程为:**分别计算Encoder编码阶段的每个隐藏状态和Decoder解码阶段的第i-1个隐藏状态前馈关系,再进⾏
Softmax归⼀化处理计算出该Encoder编码阶段的隐藏状态的权重a,最后将所有的Encoder编码阶段的隐藏状态的进⾏权重加和。
3基于Seq2Seq模型的⽂本摘要应⽤复现
本次实践主要是采⽤SouGouS新闻语料库,基于Seq2Seq模型进⾏的⽂本摘要的代码实现,尽管⽹上已经有⼤神已经实现了的,但是⾃⼰
能跟着⼤神的代码⾛⼀遍,理解⼀遍,将会⽐只看不动⼿来的强。因为其中涉及到很多细节性的编码问题和细节性的模型处理问题。主要参
考⼤神的实现。python版本为2.7.X.
3.1SouGouS新闻语料库处理
数据集选择的是精简版下载。
step1提取出新闻内容和标题
cat./news_sohusite_|iconv-fgbk-tutf-8-c|grep\"
cat./news_sohusite_|iconv-fgbk-tutf-8-c|grep\"
step2选出了10万⾏数据样本
>corpus_
head-10000corpus_>corpus_title_
step3数据预处理
主要的⼯作为:⽂本的清洗⼯作,特征字符的删除,⽇期替换,数字替换。词汇表的建⽴,语句的分词⼯作,将语句的分词替换成词汇表的
词的id组成。.
#⽂本的预处理⼯作
#step1获取出⽂本内容
data_content,data_title=get_title_content(content_fp,title_fp)
ndexs=(len(data_content))
#step2⽂本清洗⼯作
forindex,content,titleinzip(indexs,data_content,data_title):
data_content[index]=remove_tag(content).encode(\'utf-8\')
data_title[index]=remove_tag(title).encode(\'utf-8\')
#step3划分数据,训练集,验证集,测试集
get_train_dev_sets(data_content,data_title,train_rate=0.7,dev_rate=0.1,
tr_con_path=src_train_path,tr_title_path=dest_train_path,
dev_con_path=src_dev_path,dev_title_path=dest_dev_path,
test_con_path=src_test_path,test_title_path=dest_test_path
)
#step4将各个样本的语句进⾏切分,并将各个语句中的词转换成词汇表中该词对应的id.
prepare_headline_data(root_path,vocabulary_size=80000,tokenizer=jieba_tokenizer)
3.2Seq2Seq+Attention模型搭建
12m
ii-1
i
i
ii-1i-1
i
ij
ij
i
ij
Tensorfol钱塘湖春行古诗文网 wGithub提供了⼀个基于Seq2Seq模型实现的可参考其做⼀定程度的修改。构建模型的⽂件是.
step1Encoder+Decoder+attention层的构建
tensorflow中提供了5个构造seq2seq函数,这⾥使⽤的是embedding_attention_seq2seq主要介绍内部详细实现。⽂件为
basic_rnn_seq2seq:最简单版本,输⼊和输出都是embedding的形式;最后⼀步的statevector作为decoder的initialstate;
encoder和decoder⽤相同的RNNcell,但不共享权值参数;
tied_rnn_seq2seq:同1,但是encoder和decoder共享权值参数
embedding_rnn_seq2seq:同1,但输⼊和输出改为id的形式,函数会在内部创建分别⽤于encoder和decoder的embedding
matrix
embedding_tied_rnn_seq2seq:同2,但输⼊和输出改为id形式,函数会在内部创建分别⽤于encoder和decoder的embedding
matrix
embedding_attention_seq2seq:同3,但多了attention机制.
#r编码器的构造,size为隐藏层单元数,num_layers为LSTM的层数
single_cell=l(size)
ifuse_lstm:
single_cell=STMCell(size,state_is_tuple=True)
cell=single_cell
ifnum_layers>1:
cell=NNCell([single_cell]*num_layers,state_is_tuple=True)
#1.1进⼊_ing_attention_seq2seq部分
#num_encoder_s最好看的韩国电影在线观看 ymbols为编码器部分的词汇表的⼤⼩,embedding_size为词向量的⼤⼩,encoder_outputs为输⼊的各个句⼦的各个词对应的ids
encoder_cell=core_rnn_ingWrapper(cell,
embedding_classes=num_encoder_symbols,embedding_size=embedding_size)
#encoder_outputs为编码器的输出,encoder_state为编码器的隐藏层的状态
encoder_outputs,encoder_state=core__rnn(encoder_cell,encoder_inputs,dtype=dtype)
#r解码器的构造+attention,output_projection为Decoder的输出参数元组(W,B)
#num_decoder_symbols为Decoder端的词汇表⼤⼩
ortarray_ops
output_size=None
ifoutput_projectionisNone:
decoder_cell=core_rnn_ProjectionWrapper(cell,num_decoder_symbols)
output_size=num_decoder_symbols
#2.1将编码器的输出进⾏concat操作,作为attention的输⼊
top_states=[array_e(e,[-1,1,_size])foreinencoder_outputs]
attention_states=array_(top_states,1)
#2.2embedding_attention_decoder函数是构造encoder和attention的计算关系
returnembedding_attention_decoder(
decoder_inputs,
encoder_state,
attention_states,
cell,
num_decoder_symbols,
embedding_size,
num_heads=送别诗名句 num_heads,
output_size=output_size,
output_projection=output_projection,
feed_previous=feed_previous,
initial_state_attention=initial_state_attention)
step2seq2seq的损失函数
#真实的labels,此处采⽤的loss函数为sampled_softmax_loss,后⾯会讲述到为什么是这个loss
labels=e(labels,[-1,1])
local_w_t=(w_t,32)
local_b=(b,32)
local_inputs=(inputs,32)
loss_op=(d_softmax_loss(
weights=local_w_t,
biases=local_b,
labels=labels,
inputs=local_inputs,
num_sampled=num_samples,
num_classes=_vocab_size),
32)
step3梯度计算和优化
#GradientsandSGDupdateoperationfortrainingthemodel.
#1.获取出tfsession中trainable=True的参数变量。
params=ble_variables()
#2.设置参数更新优化器
opt=ntDescentOptimizer(ng_rate)
#3.求参数的梯度值,其中[b]为⽬标值(代价函数的表达式)
gradients=nts([b],params)
#4.梯度修剪,修正梯度值,⽤于控制梯度爆炸的问题。梯度爆炸和梯度弥散的原因⼀样,
#都是因为链式法则求导的关系,导致梯度的指数级衰减。为了避免梯度爆炸,需要对梯度进⾏修剪。
clipped_gradients,norm=_by_global_norm(gradients,max_gradient_norm)
#5.求取更新参数的tensorflow的节点
(_gradients(zip(clipped_gradients,params),global_step=_step))
step4模型训练
#4.1根据随机选取的bucket_id,批量选出输⼊模型的三类feed数据,编码器的inputs和解码器的inputs,target_weights对encoder_inputs进⾏指⽰,为1表⽰已
经预测的,为0表⽰PAD部分。
encoder_inputs,decoder_inputs,target_weights=_batch(
train_set,bucket_id)
#4.2训练的Feed数据的构造
input_feed={}
forlinxrange(enc孝经感悟 oder_size):
input_feed[r_inputs[l].name]=encoder_inputs[l]
forlinxrange(decoder_size):
input_feed[r_inputs[l].name]=decoder_inputs[l]
input_feed[_weights[l].name]=target_weights[l]
#4.3由于⽬标词是由于Decoder左移⼀位了,所以需要再添加⼀位
last_target=r_inputs[decoder_size].name
input_feed[last_target]=([_size],dtype=32)
train_ops=[s[bucket_id],#UpdateOpthatdoesSGD.
nt_norms[bucket_id],#Gradientnorm.
[bucket_id]]#Lossforthisbatch.
outputs=(train_ops,input_feed)
4Seq2Seq模型中存在的问题及相应解决的trick
问题1:tensorflow中的seq2seq例⼦为什么需要bucket?
**问题描述:**在处理序列问题时,每个batch中的句⼦的长度其实是不⼀的,通常做法是取batch中语句最长的length作为序列的固
定的长度,不⾜的补PAD。如果batch⾥⾯存在⼀个⾮常长的句⼦,那么其他的句⼦的都需要按照这个作为输⼊序列的长度,训练模
型时这将造成不必要的计算浪费。
**加⼊bucket的trick:**相当于对序列的长度做⼀个分段,切分成多个固定长度的输⼊序列,⽐如说⼩于100为⼀个bucket,⼤于100
⼩于150为另⼀个bucket…。每⼀个bucket都是⼀个固定的computationgraph。这样⼀来,对于模型输⼊序列的固定长度将不再
单⼀,从⼀定程度上减少了计算资源的浪费。
问题2:SampledSoftmax
**问题描述:**Seq2Seq模型的代价函数的loss便是sampled_softmax_loss。为什么不是softmax_loss呢?我们都知道对于
Seq2Seq模型来说,输⼊和输出序列的class便是词汇表的⼤⼩,⽽对于训练集来说,输⼊和输出的词汇表的⼤⼩是⽐较⼤的。为了
减少计算每个词的softmax的时候的资源压⼒,通常会减少词汇表的⼤⼩,但是便会带来另外⼀个问题,由于词汇表的词量的减少,
语句的Embeding的id表⽰时容易⼤频率的出现未登录词‘UNK’。于是,希望寻找到⼀个能使seq2seq模型使⽤较⼤词汇表,但⼜
不怎么影响计算效率的解决办法。
trick:论⽂中提出了计算词汇表的softmax的时候,并不采⽤全部的词汇表中的词,⽽是进⾏⼀定⼿段的sampled的采样,从⽽近似
的表⽰词汇表的loss输出。sampled采样需要定义好候选分布Q。即按照什么分布去采样。
问题3:Encoder阶段丞相祠堂何处寻 的BeamSearch
**问题描述:**我们知道在Seq2Seq模型的最终⽬的是希望⽣成的序列发⽣的概率最⼤,也就是⽣成序列的联合概率最⼤。在实际预
测输出序列的每个token的时候,采⽤的都是最⼤化下⼀⽬标词(token)的概率,因为Decoder的当前时刻的输出是根据前⼀时刻的输
出,上⼀个时刻的隐藏状态和语义向量C.通过依次求每个时刻的条件概率最⼤来近似获得⽣成序列的发⽣最⼤的概率,这种做法属于
贪⼼思维的做法,获得是局部最优的⽣成序列。
trick:论⽂中提出Beam-Search来优化上述的局部最优化问题。Beam-Search属全局解码算法,Encoder解码的⽬的是要得到⽣成
序列的概率最⼤,可以把它看作是图上的⼀个最优路径问题:每⼀个时刻对应的节点⼤⼩为整个词汇表,路径长度为输出序列的长
度。可以由动态规划的思想求得⽣成序列发⽣的最⼤概率。假设词汇表的⼤⼩为v,输出序列的长度为n.设t时刻各个节点(各个词w)对应
的最优路径为d=[d,d,…,d].则下⼀个时刻(t+1)的各个节点对应的最优路径为d加上t时刻的各个节点(各个词w)到(t+1)的各个节点
(各个词w)的最短距离,算法的复杂度为o(nv^2).因为词汇表的⼤⼩v⽐较⼤,容易造成算法的复杂度⽐较⼤。为了降低算法的复杂度,
采⽤BeamSearch算法,每步t只保留K个最优解(之前是保留每个时刻的整个词汇诗人苏轼的简介 表各个节点的最优解),算法复杂度为o(nKv).
问题4:ExposureBias
**问题描述:**Seq2Seq模型训练的过程中,编码部分的下⼀个时刻的输出,是需要根据上⼀个时刻的输出和上⼀个时刻的隐藏状态
和语义变量C.此时上⼀个时刻的输出使⽤的是真实的token。⽽在验证Seq2Seq模型的时候,由于不知道上⼀个时刻的真实token,
上⼀个时刻的输出使⽤的是上上个时刻的预测的输出token。这将引发ExposureBias(曝光偏差问题)。
trick:使⽤BeamSearch的Encoder的⽅式也能⼀定程度上降低ExposureBias问题,因为其考虑了全局解码概率,⽽不仅仅依赖
与前⼀个词的输出,所以模型前⼀个预形容滂沱大雨的诗句 测错误⽽带来的误差传递的可能性就降低了。论⽂中提出了DAD的⽅法,论⽂中提到
ExposureBias的主要问题是训练过程中模型不曾接触过⾃⼰预测的结果,在测试过程中⼀旦预测出现错误,那么模型将进⼊⼀个训
练过程中从未见过的状态,从⽽导致误差传播。论⽂中提出了⼀个训练过程逐渐地迫使模型处理⾃⼰的错误,因为在测试过程中这是
必须经历的。DAD提出了⼀种退⽕算法来解决这个问题,在训练过程中引⼊⼀个概率值参数,每次以的概率选取真实的token作
为输⼊,1-的概率选取⾃⼰的prediction作为输⼊。逐渐降低,最终模型全都利⽤⾃⼰的prediction作为下⼀步的输⼊,和测试
过程⼀致。
问题5:OOV和低频词
**问题描述:**OOV表⽰的是词汇表外的未登录词,低频词则是词汇表中的出现次数较低的词。在Decoder阶段时预测的词来⾃于词
汇表,这就造成了未登录词难以⽣成,低频词也⽐较⼩的概率被预测⽣成。
**trick:**论⽂中使⽤Pointer-Generator机制来解决OOV和低频词问题。由于⽂本摘要的任务的特点,很多OOV或者不常见的的词
其实可以从输⼊序列中找到,因此⼀个很⾃然的想法就是去预测⼀个开关(switch)的概率P(s=1)=f(h,y,c),如果开关打开了,
就是正常地预测词表;如果开关关上了,就需要去原⽂中指向⼀个位置作为输出。
17年的论⽂使⽤Pointer-GeneratorNetworks)使⽤Pointer-GeneratorNetworks解决OOV问题,pointer-generatornetwork相
当于在每次摘要⽣成过程中,都会把原⽂中的词汇动态地加⼊到词表中去。
问题6:连续⽣成重复词的问题
i
t12vt
i
ii
ii
iii-1i
**问题描述:**在Seq2Seq的解码阶段,⽣成序列是很可能会⽣成连续的重复词。
**trick:**论⽂使⽤Pointer-GeneratorNetworks)中使⽤Coveragemechanism来缓解重复词的问题,模型中维护⼀个Coverage
向量,这个向量是过去所有预测步计算的attention分布的累加和,表⽰着该模型已经关注过原⽂的哪些词,并且让这个coverage向量
影响当前步的attention计算。其中c表⽰之前时刻的预测的attention分布和。
此外,该论⽂中添加了⼀个coverageloss⽤于惩罚对重复的attention。a表⽰当前时刻的attention,c表⽰之前时刻的预测计算的
attention分布的累加和。
5参考链接
i
ii
更多推荐
SEQ是什么意思在线翻译读音例句
发布评论