关于bert_sum中的总结(2)

上次主要总结了抽取式的收获,本次主要总结的是生成式的收获以及遇到的问题。

数据的处理部分,已经在上次总结过了。这次主要是围绕模型的部分、预测的细节部分进行总结。

一、模型部分

1、encoder 主要是对对话内容中得到的数据,进行语义转换。得到更高维的数字特征,进行计算。代码中采用的是bert的预训练模型。将对话内容分割后通过bert预训练模型,转换为对应的数字。(这里的数字为对应token的索引,和词向量中的语义特征相对应。)将对应的对话识别片段segment和掩码(数字不为0的标记1,为0的标记0)。通过bert模型,加入位置信息,通过self-attention机制、和feed_forward、残差网络组成的部分。得到最后一层的语义模型。(当然在这里也可以使用,残差rnn模型、cnn的模型进行语义的转换)。

2、decoder部分,根据我的理解作者这里采用了transformer的decoder部分。

<1>在训练阶段,将文本标签摘要的数据,根据标签数据中为0的部分标记为1,不为0的部分标记为1。生成target对应长度的mask值。因为在decoder计算self-attention阶段,预测当前的token时,之后位置的token是不能被看见的,这里引入了上三角型的mask值,然后将两部分的mask值相加。计算mask值是为了计算self-attention时的得分后,将当前位置之后的分数归为极小值,避免这部分值的影响。

decoder可以分为3个部分,第1部分为计算预测的token自身部分的Attention,第二阶段为融合了自身语义部分的token与来自encoder部分的token(对话内容的数据)计算得到包含对话内容信息的数据。第三阶段将得到的综合语义的信息,经过一个layernorm的残差神经网络,得到输出。如果decoder有多层,则多此进行上述的三个阶段。

<2>第一阶段,将标签部分的数据tgt,和对应的mask数据。tgt数据,经过word_embeding(这里采用的应该是随机初始化)得到对应的权重矩阵,然后加入对应的位置信息。

位置信息的构造,这里作者采用的是类似音频编码的方式,根据最大长度,和宽度,先确定一个初始化矩阵,然后在宽度的一半,通过公式,得到不同的位置数据,然后第一列和第二列的数据相同,区别是第一列用sin函数,第二列用cos函数。依次这样,直到最后一列。然后在每个token索引位置上加入位置变量信息。

计算多头注意力,将经过加入位置信息的标签内容的数据,最后一个维度的数据,分为多个段数据,对应的段数为多头。将字符长度和头的位置调换。转换为一个四维的数据。将经过包含位置信息的标签内容的数据经过线性变化得到query、key、value的数据。然后将这三个数据经过上述多头注意力维度的变化,得到新的query、key、value矩阵。将query和key(2、3维度交换)的矩阵相乘,得到每一个位置对应其它位置的分数。然后将分数矩阵经过mask值(此时的mask值为掩码的形式)。得到每一个到当前位置为止的分数信息,之后经过一个softmax变量。得到对应self-attention的位置概率。然后得到的概率值和value值相乘,得到对应到当前位置的各个维度的加和信息。

然后将得到的输出位置的数据和之前输入的数据进行加和,得到现在位置的数据。

计算mid位置的多头注意力,将刚才计算得到的矩阵经过线性变换得到的矩阵为query矩阵,将encoder部分最后一层输出的矩阵经过线性变换,得到key和value矩阵。然后经过多头矩阵的变换,将query和key相乘,得到每个位置的encoder部分和当前位置token的关系的分数信息。经过encoded的mask值,去掉该位置为mask的信息(其实是根据softmax关系转换后得到的概率为0)。然后经过softmax得到的概率。和value相乘得到每个位置对应每一维度的所有位置的加和信息。得到最后的输出。

然后将得到的输出位置的数据和之前输入的数据进行加和,得到现在位置的数据。

经过feed_forward计算,将上面的数据,经过layernorm变换,经过一次神经网络的变换和一次的线性变换,然后得到对应的结果。加当前的输出和变换之前的输出加和。得到最后的输出。

多头注意力、mid部分的多头注意力、feed_forward三者是decoder的一个子块。可以构建多个这样的子块。

<3>计算loss(训练部分)。将经过多个上述的子块循环的输出为output。作者在接下来的操作过程中用了一些小的策略,进行了运算上的优化。将现在的batch根据一个shard_size进行了分段,分割成为更小块的mini_batch。然后分别计算每个mini_batch的loss。

如何计算loss?

首先将mini_batch中的out_put,根据线性维度的变换,得到词表大小的维度,然后进行softmax变换,经过log化,得到对应的log_prob,将log_prob转换为二维的模式,相当于每个token,对应自己词表维度大小的概率值,依次排列。对于参考标准答案的处理方式,作者先建立一个词表大小维度的一维tensor,将label_smoothing的值填入。然后增加一个维度,然后在0维添加一个维度,将维度扩展到tgt大小的维度(此时的tgt的维度已经是转换为1维时的状态)。然后在第0维上不断复制已填入label_smothing的这一行的数值。然后根据tensor._scatter的方法。将tgt词表的索引信息作为index,在dim=1的,将每一个token对应位置填入对应的置信值,得到最终的target。然后将log_prob和target根据相对散度计算对应的loss值。然后反向传播,根据作者的代码理解到,等所有的minibatch计算完之后,将梯度都累加到此时,才进行参数的更新。

二、在测试部分,作者采用beam_size的方法,预测生成的文本内容

1、首先将src经过bert预训练得到最后一层src_memory。根据beam_size的值,在第一维度,将原先的batch复制为对应的batch*beam_size个。src也经过这样的变换。将多有的cls_id复制给同样长度的tgt。此时tgt的维度变为(batch*beam_size)。相当于所有的初始token都为cls_id。给定最大的max_len的循环次数,每次循环记为一次step。

2、将tgt经过embeding层,得到对应位置的维度特征。然后和对应当前位置的step对应的位置变量相加得到input,令all_input=input、将对应的all_input输入muti_attention的计算类中。第一次计算多头注意力,mask值很重要。分别乘以对应的linear矩阵,得到q、k、v。进行多头维度的变换,设置一个标志符self将k和v对应的值存入字典中。然后计算q和k的attention得到每个位置的得分。经过mask值,限定只能到当前token为止的得分可以计算,之后的token都给予赋一个极小值,让之后的soft_max处理后,保证mask的地方的得分概率为0.然后得到的分值和对应的v相乘,将每一个维度信息都进行概率加和,得到当前的输出output。将当前的output和之前的input相加,经过一个layer_norm的作用。作为新的input。将src进行维度变换,得到batch*tgt_len*src_len的mask_src,将经过src_memory作为k和v,新的input为query分别乘以对应的线性变换。根据多头注意力,将k和v存入以context为标志的字典中。然后算query和k的得分,经过mask_src,之后soft_max的计算和v相乘,得到当前输入和encoder输出层之间的语义关系。得到新的output和input加和,经过layer_norm。然后得到的output经过feed_forward层,得到对应的特征,作为新的output。最后经过self、context、feedfard多个部分的循环,得到最后的输出。

根据最后的输出,经过词汇维度的变换,以及计算概率后得到概率值。设置初始的log_prob,保证每个beam_size之间第一个是0,其它的给一个负无穷小的值。将维度更新为之前的batch*-1维度的个数。然后获取每个token对应的前5高的概率值和索引。将索引用一定的方法可以获得真实对应的索引。以及对应的div的beam_size间隔,这个地方不是很懂。将div的beam_size间隔和对用的索引id重新分别转换为1维的形状,进行concat。得到dev的矩阵。在获取最大beam_size个数的时候,当当前的token小于最低个数的时候,会将end_pos对应索引位置的概率,赋值一个极小值。让其概率变小,暂时不能得到。当大于最低个数的时候,当遇到end_pos的索引时,该段的token就停止了。或者是满足了设置的最大max_size量的时候,也会停止,取出当前的分支来。当不满足以上停止条件时,将继续下一步的程序。根据dev的第一列的索引得到对应下一步的输入input和src和src_memory。此次注意的是step对应的是第二位置的变量,还有在计算多头注意力的时候,当遇到self将对应的k和v,和上一step的k和v,concat来计算self-attention。在计算mid的时候,分菊context标志,直接计算用之前计算过的k和v即可。然后得到最后的输出后,以及得到对应vocab_size的维度概率后。和上一step计算得到保存的概率加和,得到此step的综合概率。在更新top_size的id。将计算得到的索引值对应之前step的token和当前top的seam_size的id结合起来。得到新的token。然后在查看是否满足停止条件。

3、满足停止条件后,遇到当前的样本需要停止的,选择当前样本中为True的索引,然后将当前beam_size对应的score和文本放入列表中。然后选择该beam_size中分数最高的一组文本,作为最优预测文本。直到该batch循环结束。然后将剩余为0的位置的索引,为继续需要进行文本内容的样本。然后进行模型生成新的内容,直到该batch所有样本都达到停止条件为止。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值