基于对话数据关于seq_seq模型的总结

1.数据介绍:

数据是来自汽车的数据集,是车主和技师的对话数据,主要内容是关于车遇到故障或其它问题的对话内容。我个人理解的任务是,车主的车遇到了问题,然后根据车主和技师之间的对话内容,从中得到摘要内容。也就是最后的摘要答案。

数据处理的时候,需要把所有的问题和对话内容还genju 有一些车的型号,都根据分词后,放到一段文字当中去形成一句话,每个样本都这样去做。对应的样本标签也这样去做。

在处理文本的时候,根据实际情况,将无用的词(比如和实际应用规定的词不相关的词去掉)还有停用词去掉。将不在词表中的词用unk表示。在开头用<start>符号标注,在结尾用<stop>的符号标注。然后将所有样本集合,找到长度最大的那个样本作为最长的句子。然后将所有样本,不足的句子,的结尾用<Pad>补齐。答案标签部分,也是按照这样的处理方法进行。

然后,将所有的样本,根据词向量的索引,转化为对应的数字。之后将样本转化为tensor向量的形式,方便应用于之后的框架运算。

2.模型介绍

encoder部分:将训练的词向量结果,在上面接一个rnn类型的模型,得到最后的输出,一个是隐藏状态(往往可以代表该句的信息),一个是最后的输出(代表的是每个句子中,每个token的语义信息)。

注意力的计算,这里采用的是加性的注意力计算,将decoder的隐藏状态和对应的权重相乘,得到的值。与encoder部分与对应的权重相乘,得到的值进行相加。然后再通过一定的维度变换,将每个样本每个Token上面的分值权重,然后通过softmax转换为概率的形式,将每个token的分值,和对应的编码部分的最终输出,得到encoder和decoder的综合信息。在这里称为context_vector.

decoder部分:使用的也是rnn模型,采用的是一个token预测一个token的方式,进行文本内容 的生成。首先也是经过embedding将索引,得到对应的词向量,然后输出。首次通过编码部分得到最后的隐藏状态,作为decoder部分的第一时间步的隐藏状态。将通过注意力计算后得到的context_vector与经过embedding输出得到的部分,相加作为特征的再次融合。然后经过rnn得到最后的输出,再在上面接一个线性变换层,转换到vocab_size的维度。最后将维度上的值,转换为概率。

03 训练部分:

train部分,先将batch个样本通过encoder部分,得到对应的语义信息,然后通过teacher教学的方法(每次用标准时间步对应的答案标签,作为每一次新的token的输入)。第一次是定义了起始的token用特殊符号<start>表示,然后通过计算注意力,得到对应的分值,在通过对应的decoder部分,得到对应的分值。当所有的时间步完成之后,将所有的预测值进行stack,通过第一维度,得到输出,最后与标准的标签,计算得到对应的输出。然后将预测的部分和对应的标签部分,通过crossentropy计算损失,在这里有一点注意的是损失位置部分为pad部分,一定要设置为0。所以将标签部分进行mask处理,保证pad部分值为0.最后得到对应的损失。

04 预测

预测的时候,可以通过2种方式。一种是greedy方法,一种是beam search的方法。

greedy方法:每次选择概率最大的那个token,作为预测token。

将分为batch部分的数据,decode从第一个token开始预测,起始token用<start>表示,将编码输出的隐藏层,作为第一次decode的隐藏层。将隐藏层和编码层的最后一层输出,根据注意力机制,计算得到融合编码层语义信息的新的contextvector。然后和decode的最后维度相加。通过rnn,以及最后的线性预测,得到预测维度为词表的概率。从中选择每个样本的概率最大的token,作为预测的token。根据teach force方法,将当前预测出的token作为第二时间步的输入,将隐藏的输出,作为新的输出,之后依次进行预测,直到达到max_len的最大长度结束。然后从中看是否<stop>字符,如果有则选取该字符之前的值。最后将所有生成的数据集集合起来和参考标签计算rouge值。

beam_search方法:指的是每次选择当前样本,然后进行复制到beam_size个。然后按照encoder、decoder的方式进行预测后,得到预测值,从中选则top_k的个数,通过其概率值进行排序,最后将设置值为前几位的token相关的部分,作为假设部分。基于此继续进行预测。每次预测的新的token。得到的概率和之前已经计算过的概率进行加和。每次按照这个流程重复进行,直到达到满足的条件。如达到最大生成长度,或者设定的最大的结果数,则停止。最后从中选择概率最大的那个生成的句子,作为最好的那个句子。

首先将每个样本中的数据,复制为多份(beam_size份),且beam_size==batch的个数。然后计算encoder的值。得到最后的输出和隐藏层的输出。复制beam_size个数的<start>值,作为decode部分的第一次输入,然后根据模型计算注意力和最后的生成的token概率输出。从概率中选择规定前几的token。重新设置新的假设。依次进行直到达到了想要的结果个数或者是最大的生成长度,停止。(还要注意的是,每次的token对用自身的hideen state一定要对应上)。然后从中选择最优的结果作为当前样本的最优生成结果进行返回。所有的样本都生成之后,和对应的标签,计算rounge值。并记录生成的样本到文本中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值