列一下本周的计划:
- 项目:完成SynFue模型的Encoder部分的编写(主要包含BERT+LAGCN)
- 理论部分:GCN的原理(论文)推导【最低要求:起码看懂和会调用】
这个任务应该还算比较轻,时间多的话看看能不能顺便看一下双仿射的机制的实现😃
——————10.25————————
贴一下BERT的一个小Demo,周末结合模型来填一下理论的坑
遇到一个公式对不上的问题【得仔细看一下论文了,好像是细节没搞明白】
class LabelAwareGCN(nn.Module):
"""
Simple GCN layer
"""
def __init__(self,dep_dim,in_features,out_features,pos_dim=None,bias=True):
super(LabelAwareGCN,self).__init__()
self.dep_dim = dep_dim
self.pos_dim = pos_dim
self.in_features = in_features
self.out_features = out_features
self.dep_attn=nn.Linear(dep_dim+pos_dim+in_features,out_features)#依赖边的局部注意力机制
self.dep_fc=nn.Linear(dep_dim,out_features)#对依赖边建模
self.pos_fc=nn.Linear(pos_dim,out_features)#对于标签的建模
def forward(self,text,adj,dep_embed,pos_embed=None):
"""
text:[batch_size,seq_len,feat_dim]
adj:[batch_size,seq_len,seq_len]
dep_embed:[batch_size,seq_len,seq_len,dep_type_dim]
pos_embed:[batch_size,seq_len,pos_dim]
return:[batch_size,seq_len,feat_dim]
"""
batch_size,seq_len,feat_dim=text.shape
val_us=text.unsqueeze(dim=2)
val_us=val_us.repeat(1,1,seq_len,1)
# [batch size, seq_len, seq_len, feat_dim]
pos_us=pos_embed.unsqueeze(dim=2).repeat(1,1,seq_len,1)
# [batch size, seq_len, seq_len, feat_dim+pos_dim+dep_dim]
"""(5)"""
val_sum=torch.cat([val_us,pos_us,dep_embed])#TODO:公式(5)
r=self.dep_attn(val_sum)#TODO:公式(5)
"""公式?"""
p=torch.sum(r,dim=-1)
mask=(adj==0).float()*(-1e30)# 没有依赖边关系的mask掉
p=p+mask
p=torch.softmax(p,dim=2)
p_us=p.unsqueeze(3).repeat(1,1,1,feat_dim)
output=val_us+self.pos_fc(pos_us)
output=torch.mul(p_us,output)
output_sum=torch.sum(output,dim=2)
return r,output_sum,p
——————10.26————————
因为想休息一下补一下最近落下来的理论课,所以研训今天宣告暂停一天🕊
——————10.27————————
还是没有解决公式与代码的对应问题,而且原文中的一些表示太混乱了
完成了GCN模块的编写,但是公式对应很有问题
果然还是应该抽一整块的时间,零碎的时间复现太不现实了呜呜
————————10.31——————————————————————
就是……这个代码写得很不方便复现的,路径啥的自己跑完还得自己改
因为租用服务器好贵的问题,存一下每次需更改的路径
data/models/towe_16res/config.json