LeeSureman / Flat-Lattice-Transformer

code for ACL 2020 paper: FLAT: Chinese NER Using Flat-Lattice Transformer
1k stars 178 forks source link

有关transformer实现代码的疑问 #88

Open tomatowithpotato opened 3 years ago

tomatowithpotato commented 3 years ago

关于modules.py文件里的class MultiHead_Attention_Lattice_rel_save_gpumm(nn.Module)这个部分,我没看懂 我在这段代码里看到了self.u, self.v A_C, B_D等变量,这里计算注意力似乎不是直接q乘k 我在原版transformer并没有这些过程,我很不解,是因为相对位置编码的原因加的步骤吗? 有人能解释吗?

slb9712 commented 3 years ago

我也有一点不懂得地方,论文用transformer-XL的相对位置编码方式,qk相乘,公式的完全展开为xiWqWkXj + xiWqWkRij + uWqWkxj + vWqWkRij (忽略了转置)AC对应的第一第三项,BD对应第二第四项。不理解这里的query key value 比如query是已经Xi*Wq后的吗,不然怎么和u相加乘key,还有后面的rel_pos_embedding_for_b在这个模块中只转换了维度,那它是已经和Wk乘过了吗,哪位能解释一下 吗,或者大家可以加我qq讨论一下代码问题:2859161972

tomatowithpotato commented 3 years ago

我也有一点不懂得地方,论文用transformer-XL的相对位置编码方式,qk相乘,公式的完全展开为xiWqWkXj + xiWqWkRij + uWqWkxj + vWqWkRij (忽略了转置)AC对应的第一第三项,BD对应第二第四项。不理解这里的query key value 比如query是已经Xi*Wq后的吗,不然怎么和u相加乘key,还有后面的rel_pos_embedding_for_b在这个模块中只转换了维度,那它是已经和Wk乘过了吗,哪位能解释一下 吗,或者大家可以加我qq讨论一下代码问题:2859161972

感谢老哥的回复,我这才看了论文,搞懂了这是在干啥 函数里有query = self.w_q(query)和rel_pos_embedding = self.w_r(rel_pos_embedding), 所以query确实是已经Xi*Wq后的结果,rel_pos_embedding_for_b也是相乘后的结果

但我又产生了新的疑问:

  1. 论文里的W_(k,E)是对应的哪个矩阵呢?下标k,E是代表什么意思?
  2. 根据代码, A_C = torch.matmul(query_and_u_for_c, key), B_D = torch.matmul(query_for_b_and_v_for_d, rel_pos_embedding_for_b).squeeze(-2) 对应到论文,那么key就是Exj Wk,E才对,但我找不到Exj,而且由于k_proj为false,因此key = self.w_k(key)这步不执行 所以key就是ExjWk,E吗?Exj和Wk,E分别对应着谁呢?
slb9712 commented 3 years ago

我也有一点不懂得地方,论文用transformer-XL的相对位置编码方式,qk相乘,公式的完全展开为xiWqWkXj + xiWqWkRij + uWqWkxj + vWqWkRij (忽略了转置)AC对应的第一第三项,BD对应第二第四项。不理解这里的query key value 比如query是已经Xi*Wq后的吗,不然怎么和u相加乘key,还有后面的rel_pos_embedding_for_b在这个模块中只转换了维度,那它是已经和Wk乘过了吗,哪位能解释一下 吗,或者大家可以加我qq讨论一下代码问题:2859161972

感谢老哥的回复,我这才看了论文,搞懂了这是在干啥 函数里有query = self.w_q(query)和rel_pos_embedding = self.w_r(rel_pos_embedding), 所以query确实是已经Xi*Wq后的结果,rel_pos_embedding_for_b也是相乘后的结果

但我又产生了新的疑问:

  1. 论文里的W_(k,E)是对应的哪个矩阵呢?下标k,E是代表什么意思?
  2. 根据代码, A_C = torch.matmul(query_and_u_for_c, key), B_D = torch.matmul(query_for_b_and_v_for_d, rel_pos_embedding_for_b).squeeze(-2) 对应到论文,那么key就是Exj Wk,E才对,但我找不到Exj,而且由于k_proj为false,因此key = self.w_k(key)这步不执行 所以key就是ExjWk,E吗?Exj和Wk,E分别对应着谁呢?

其实就是key和query,是经过线性变换后的

slb9712 commented 3 years ago

朋友你找到ontonote的数据集了吗,如果你有的话希望能给我发一份,我找了好久都没找到,谢谢你啦

slb9712

@. | 签名由网易邮箱大师定制 在2021年6月2日 @.> 写道:

我也有一点不懂得地方,论文用transformer-XL的相对位置编码方式,qk相乘,公式的完全展开为xiWqWkXj + xiWqWkRij + uWqWkxj + vWqWkRij (忽略了转置)AC对应的第一第三项,BD对应第二第四项。不理解这里的query key value 比如query是已经Xi*Wq后的吗,不然怎么和u相加乘key,还有后面的rel_pos_embedding_for_b在这个模块中只转换了维度,那它是已经和Wk乘过了吗,哪位能解释一下 吗,或者大家可以加我qq讨论一下代码问题:2859161972

感谢老哥的回复,我这才看了论文,搞懂了这是在干啥 函数里有query = self.w_q(query)和rel_pos_embedding = self.w_r(rel_pos_embedding), 所以query确实是已经Xi*Wq后的结果,rel_pos_embedding_for_b也是相乘后的结果

但我又产生了新的疑问:

论文里的W_(k,E)是对应的哪个矩阵呢?下标k,E是代表什么意思? 根据代码, A_C=torch.matmul(query_and_u_for_c, key), B_D = torch.matmul(query_for_b_and_v_for_d, rel_pos_embedding_for_b).squeeze(-2) 对应到论文,那么key就是ExjWk,E才对,但我找不到Exj,而且由于k_proj为false,因此key = self.w_k(key)这步不执行 所以key就是ExjWk,E吗?Exj和Wk,E分别对应着谁呢?

— You are receiving this because you commented. Reply to this email directly, view it on GitHub, or unsubscribe.

slb9712 commented 3 years ago

很多地方参数初始化不一样,好像也没设置种子,只设了dataset的seed, 每次运行结果都不同怎么办

tomatowithpotato commented 3 years ago

我只跑了weibo数据集的,跟论文结果基本一致