VisualJoyce/ChengyuBERT

The network structure Questions

Closed this issue · 18 comments

你好,预先感谢您的热情回答。

有几个问题关于框架的细节想咨询您。

第一个问题是,下图两个embedding是否是随机初始化的,只初始化一次还是说每次取batch的时候也初始化呢?

image

第二个问题是,对于右边的embedding,无法对应每一个成语的embedding,因为每次取一条数据只有7个选项,并且这7个选项每次都在变化。(左边的我能理解是对应了每个成语的embedding在修正,因为范围是3848,但右边范围似乎只有局部的7选项范围),我不知道这么理解是否正确?您方便指教一下吗?

image

选项的embedding其实是和词表一致的,这里计算的时候用了

cond_logits = torch.gather(over_logits, dim=1, index=option_ids)

相当于计算一次对全词表的logits,然后拿出对应option的logits就是选项上面的结果。

明白了,一个是针对全局选项的embedding,一个是只拿出局部七个选项的embedding进行计算。
但是后者使用交叉熵的话,交叉熵不应该是针对类别所对应的意义不变的情况进行损失计算的吗?如果是局部七个选项,那交叉熵所分类的七个选项所代表的意思不是一直在变化吗?左边的交叉熵我可以理解,每个类别都是有固定一个成语的含义,但是右边的交叉熵,七个类别所代表的含义是一直都在变的哦。
是否是我理解错误了呢?

选项是变化的,但是我们计算根据的是每个选项对应的embedding,不是根据选项处于的位置,即打乱选项不会影响结果。

好的,另外这两个embedding是否是随机初始化的(第一个问题)?需要被学习的?

如上,其实只有一个词表embedding,一般情况下随机初始化,如果加载stage1的模型,使用模型的进行初始化。

非常感谢你的耐心回答,如果加载stage1的模型,使用模型的进行初始化。
这句话的含义是,embedding会加载stage1里面的那个embedding是吗?如图。
image

是的,这时候权重就是学习过的了。

谢谢你!明白很多了。
所以pretrain的embedding是随机初始化的,然后训练大语料调整embedding以及bert权重,fine-turning的时候是加载使用pretrain里的bert和embedding对吧?

是的,没错。

选项是变化的,但是我们计算根据的是每个选项对应的embedding,不是根据选项处于的位置,即打乱选项不会影响结果。

非常感谢感谢你的耐心回答!!!!♥
最后一个问题,我该怎么验证这7个选项交叉熵损失它能更新每个选项所对应的embedding呢?我对这个存在一点疑问,因为之前所接触的计算交叉熵时,所对应的分类类别代表的含义应该都是固定的,这打破了我之前的刻板印象。

多项选择,不是固定类别的分类问题。

这里还有其他的做法,就是每个选项做成二分类。

此文里面使用的是计算与目标选项的距离,如果看后向,梯度最终还是回到了对应的词向量。

两者对比我还没做过。

十分感谢,Pytorch支持这种部分小的embedding提取出来,然后计算损失后,可以反向传播更新到原大的embedding里面?Amazing!我以为是不可以这么做的。

都是独立张量,没问题的

应该是共享空间才能更新吧?如果相互独立不是更新不到嘛?

我们应该说的是不同方面,每个词向量都是单独存在的,但是它们是嵌入在同一空间的。

在内存中也是存放在同一个地方的吧?如果是不同地方应该无法反向传播到原始的大表embedding里的7个选项对应的地方。

好的,非常感谢您,学到很多,你的工作贡献很棒,祝生活愉快!

Embedding 可以看成一种包装好的接口,我认为每个词向量是可以单独操作的,参与计算的条目会累积梯度。

不客气,共同进步!