920232796 / bert_seq2seq

pytorch实现 Bert 做seq2seq任务,使用unilm方案,现在也可以做自动摘要,文本分类,情感分析,NER,词性标注等任务,支持t5模型,支持GPT2进行文章续写。

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

seq2seq的loss计算问题

fengxin619 opened this issue · comments

seq2seq_model.py 108行
需要构建特殊的输出mask,屏蔽掉句子a的影响
预测的值不用取最后sep符号的结果 因此是到-1
predictions = predictions[:, :-1].contiguous()
target_mask = token_type_id[:, 1:].contiguous()

为什么target_mask是丢掉了[CLS]位,而predictions是丢掉[SEP]位,这在计算Loss的时候不是错位了么?

没有错位,你再仔细考虑考虑,predictions最后是sep,这个sep对应的输出是没有意义的。

没有错位,你再仔细考虑考虑,predictions最后是sep,这个sep对应的输出是没有意义的。

哇,这么快回复。 但是target_mask是丢掉了首位?是[CLS]对应的位置?

对,如果句子是 [cls, 1, 2, sep, 3, 4, sep] 那么prediction输出则是看[sep, 3, 4] 这几个 token的结果,因此屏蔽掉[cls, 1, 2],就是利用了target_mask。这个句子对应的token_type_id=[0, 0, 0, 0, 1, 1, 1],从第二位开始取,就是[0, 0, 0, 1, 1, 1],prediction输出是[cls, 1, 2, sep, 3, 4]对应的结果,你对应一下,不就刚好把前三个token 的输出屏蔽掉了吗。

0, 0, 0, 0, 1, 1

厉害了大佬...脑筋急转弯我学会了!

对,如果句子是 [cls, 1, 2, sep, 3, 4, sep] 那么prediction输出则是看[sep, 3, 4] 这几个 token的结果,因此屏蔽掉[cls, 1, 2],就是利用了target_mask。这个句子对应的token_type_id=[0, 0, 0, 0, 1, 1, 1],从第二位开始取,就是[0, 0, 0, 1, 1, 1],prediction输出是[cls, 1, 2, sep, 3, 4]对应的结果,你对应一下,不就刚好把前三个token 的输出屏蔽掉了吗。

但是写诗_train.py 127行
target_ids_padded = token_ids_padded[:, 1:].contiguous()
target_id为什么要从第一位开始取呢?

你觉得应该怎么取呢?

你觉得应该怎么取呢?
target_ids_padded = token_ids_padded[:, :-1].contiguous()
这样?.....求拍醒。

不对 这是目标 怎么可能有第一个token? 应该是从第二个token开始,一直到最后一个token。

对,如果句子是 [cls, 1, 2, sep, 3, 4, sep] 那么prediction输出则是看[sep, 3, 4] 这几个 token的结果,因此屏蔽掉[cls, 1, 2],就是利用了target_mask。这个句子对应的token_type_id=[0, 0, 0, 0, 1, 1, 1],从第二位开始取,就是[0, 0, 0, 1, 1, 1],prediction输出是[cls, 1, 2, sep, 3, 4]对应的结果,你对应一下,不就刚好把前三个token 的输出屏蔽掉了吗。

像这个例子里面,目标应该是 [cls, 1, 2, sep, 3, 4, sep] ,然后prediction输出是[cls, 1, 2, sep, 3, 4]对应的结果。 那目标不应该从第一位开始取么,然后丢掉最后一位

你再想想。

那我再想想..