AtmaHou / FewShotTagging

Code for ACL2020 paper: Few-shot Slot Tagging with Collapsed Dependency Transfer and Label-enhanced Task-adaptive Projection Network

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

好像有一个bug?

Wangpeiyi9979 opened this issue · comments

我好像发现了一个bug
image
这里好像不应该用一个transpose,因为SVD分解出来的vh=B x emb_dim x emb_dim,(_, s, vh = torch.svd(error_every_class, some=False), 每一个batch,其实它的列向量才是空间的基, 你这里好像把行向量作为空间的基了,这样求得的M,最后拿来投影error时(测试M能否把error投影到新空间中的0)
assert (torch.matmul(error_every_class, M) > 1E-6).sum().item() == 0时会报错,
如果把转置去掉就不会了

感谢您的细心指正。

(1)在TapNet原文中,采用的是cupy.linalg库中的svd,在该svd中,u * s * v = svd(A),返回的v其实是转置之后的结果,因此它的基向量是行向量。而在PyTorch库中的svd中,u * s * v^T = svd(A),其返回的仍是v,但是与cupy.linalg中svd返回的v不同,它未经过转置,因此它的列向量才是基向量。十分抱歉,未能察觉到这两个库实现的差异。

(2)在修正之后,我们进行了一个初步的实验。correct_svd的实验结果相比于当前会有所降低。虽然TapNet不是我们文章的核心贡献,但是这是一个有趣的现象,也是一个值得去探索的点。

(3)我们创建了一个correct_svd分支,并将修正后的代码同步到该分支里了,也欢迎您继续指正。

我在一些数据集上测试了TapNet, 比如FewRel,发现它并没有什么用,甚至会造成结果下降,而且个人感觉TapNet本身的**就有点奇怪。也许是自己认识不足吧。thx

commented

我在一些数据集上测试了TapNet, 比如FewRel,发现它并没有什么用,甚至会造成结果下降,而且个人感觉TapNet本身的**就有点奇怪。也许是自己认识不足吧。thx

我个人感觉你的个人感觉可能很有道理233
所以建议在别的数据集上使用的话,最好直接用我们的CDT模块、Pair-wise Trick和 Label Name Embedding,这几个tricks还是提升明显的~