LR—GCCF: A Linear Residual GraphConvolutional Network Approa

一、论文

首先回忆下,之前的NGCF为什么会被优化成lightGCN

1、lightGCN认为非线性激活函数和特征转换对CF模型没有用,因为LightGCN的输入是user和item的ID,没有关于user和item的特征信息,因此非线性激活函数和线性特征转换是没有用武之地的

LR-GCCF移除非线性激活函数,原因在于LR-GCCF的初始embedding也是要通过训练生成的,不包含额外的特征信息

摘要:

 在本文中,从两个方面重新审视了基于 GCN 的 CF 模型。首先,凭经验表明,去除非线性会提高推荐性能,这与简单图卷积网络中的理论是一致的。其次,我们提出了一种专门为带有用户项交互建模的 CF 设计的残差网络结构,它缓解了使用稀疏用户项交互数据的图卷积聚合操作中的过度平滑问题。这就是这篇文章主要干的事情。

改进了信息聚合的方法。文章提出了残差的思想,但实际上和NGCF一模一样。

先上代码

    def __init__(self, user_num, item_num, factor_num,user_item_matrix,item_user_matrix,d_i_train,d_j_train):
        super(BPR, self).__init__()
        """
        user_num: number of users;
        item_num: number of items;
        factor_num: number of predictive factors.
        """     
        self.user_item_matrix = user_item_matrix
        self.item_user_matrix = item_user_matrix
        self.embed_user = nn.Embedding(user_num, factor_num)
        self.embed_item = nn.Embedding(item_num, factor_num) 

        for i in range(len(d_i_train)):
            d_i_train[i]=[d_i_train[i]]
        for i in range(len(d_j_train)):
            d_j_train[i]=[d_j_train[i]]

        self.d_i_train=torch.cuda.FloatTensor(d_i_train)
        self.d_j_train=torch.cuda.FloatTensor(d_j_train)
        self.d_i_train=self.d_i_train.expand(-1,factor_num)
        self.d_j_train=self.d_j_train.expand(-1,factor_num)

        nn.init.normal_(self.embed_user.weight, std=0.01)
        nn.init.normal_(self.embed_item.weight, std=0.01)  

    def forward(self, user, item_i, item_j):    

        users_embedding=self.embed_user.weight
        items_embedding=self.embed_item.weight  

        gcn1_users_embedding = (torch.sparse.mm(self.user_item_matrix, items_embedding) + users_embedding.mul(self.d_i_train))#*2. #+ users_embedding
        gcn1_items_embedding = (torch.sparse.mm(self.item_user_matrix, users_embedding) + items_embedding.mul(self.d_j_train))#*2. #+ items_embedding
   
        gcn2_users_embedding = (torch.sparse.mm(self.user_item_matrix, gcn1_items_embedding) + gcn1_users_embedding.mul(self.d_i_train))#*2. + users_embedding
        gcn2_items_embedding = (torch.sparse.mm(self.item_user_matrix, gcn1_users_embedding) + gcn1_items_embedding.mul(self.d_j_train))#*2. + items_embedding
          
        gcn3_users_embedding = (torch.sparse.mm(self.user_item_matrix, gcn2_items_embedding) + gcn2_users_embedding.mul(self.d_i_train))#*2. + gcn1_users_embedding
        gcn3_items_embedding = (torch.sparse.mm(self.item_user_matrix, gcn2_users_embedding) + gcn2_items_embedding.mul(self.d_j_train))#*2. + gcn1_items_embedding
        
        # gcn4_users_embedding = (torch.sparse.mm(self.user_item_matrix, gcn3_items_embedding) + gcn3_users_embedding.mul(self.d_i_train))#*2. + gcn1_users_embedding
        # gcn4_items_embedding = (torch.sparse.mm(self.item_user_matrix, gcn3_users_embedding) + gcn3_items_embedding.mul(self.d_j_train))#*2. + gcn1_items_embedding
        
        gcn_users_embedding= torch.cat((users_embedding,gcn1_users_embedding,gcn2_users_embedding,gcn3_users_embedding),-1)#+gcn4_users_embedding
        gcn_items_embedding= torch.cat((items_embedding,gcn1_items_embedding,gcn2_items_embedding,gcn3_items_embedding),-1)#+gcn4_items_embedding#
      
        
        user = F.embedding(user,gcn_users_embedding)
        item_i = F.embedding(item_i,gcn_items_embedding)
        item_j = F.embedding(item_j,gcn_items_embedding)  
        # # pdb.set_trace() 
        prediction_i = (user * item_i).sum(dim=-1)
        prediction_j = (user * item_j).sum(dim=-1) 
        # loss=-((rediction_i-prediction_j).sigmoid())**2#self.loss(prediction_i,prediction_j)#.sum()
        l2_regulization = 0.01*(user**2+item_i**2+item_j**2).sum(dim=-1)
        # l2_regulization = 0.01*((gcn1_users_embedding**2).sum(dim=-1).mean()+(gcn1_items_embedding**2).sum(dim=-1).mean())
      
        loss2= -((prediction_i - prediction_j).sigmoid().log().mean())
        # loss= loss2 + l2_regulization
        loss= -((prediction_i - prediction_j)).sigmoid().log().mean() +l2_regulization.mean()
        # pdb.set_trace()
        return prediction_i, prediction_j,loss,loss2
 

对于每个用户和物品,传播的矩阵形式:

 模型的输出是

 看到最后就会发现,和NGCF是一样的了

这篇文章,暂时也结束了

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: matlab中的gccphat函数是一种基于广义互相关(Generalized Cross Correlation,GCC)的信号处理算法。该函数用于估计信号中的时延差异或时间延迟。 gccphat函数的输入参数是两个信号x和y,这两个信号可以是时间序列或者音频信号。函数首先对这两个信号进行时域互相关运算,然后对互相关结果进行幅度归一化,以得到广义互相关函数(Generalized Cross Correlation Function,GCCF)。 GCCF是通过计算两个信号之间时延差异的一种方法。它在单通道话音信号的时间延迟估计中具有较高的精度。 gccphat函数返回的结果是时延估计值,它可以用于很多应用,如声源定位、音频增强、语音识别等。 在函数的实现过程中,可以调节一些参数来优化时延估计的精度,如采样窗长、互相关函数的正则化参数等。 总结来说,gccphat函数是matlab中用于计算信号中时延差异的一种算法。它可以用于多种音频处理和信号处理任务中,提供了较高的精度和灵活性。 ### 回答2: GCC-PHAT函数是一种信号处理算法,用于计算音频信号的相互延迟。它是MATLAB中的一个函数,用于估计两个信号之间的时间延迟。 GCC-PHAT算法的核心思想是通过测量信号的相位差来估计其传播延迟。它基于相干积累技术,通过计算两个信号之间的互相关函数来获得延迟的估计值。这个估计是通过对频带上的信号进行相位差的计算得到的。 MATLAB中的GCC-PHAT函数实现了这个算法,并提供了一个简单易用的接口。函数接受两个输入参数,即要求交叉相关的两个信号。它返回一个估计的延迟值,该值表示第二个信号与第一个信号之间的时间延迟。 此外,GCC-PHAT函数还可以对信号进行预处理,以提高对延迟的估计精度。它可以通过在计算之前对信号进行滤波、降采样和归一化等操作来减小估计误差。 总的来说,GCC-PHAT函数是MATLAB中一个用于计算音频信号延迟的工具。它基于信号的相位差来估计延迟,并提供了一种简单易用的方法来获得估计的延迟值。它在许多领域,如声源定位和语音识别中有着广泛的应用。 ### 回答3: matlab中的gccphat函数是一种用于声音信号处理的算法。gccphat代表广义互相关相位法,用于在多个麦克风接收到的信号中估计声源的到达时间差(TDOA)。在这个算法中,两个麦克风之间的延迟是通过计算广义互相关函数(GCC)的相位谱来估计的。 广义互相关函数是用来测量两个信号之间的相关性的一种方法。在GCC-PHAT算法中,首先计算两个信号的互相关函数,然后通过对其进行归一化以消除幅度谱对延迟估计的影响。最终,通过在归一化的相位谱上找到最大峰值并计算相应的延迟得到声源的TDOA。 使用matlab中的gccphat函数,我们可以通过提供两个接收到的音频信号作为输入来计算声源的到达时间差。该函数返回一个时间差向量,其中包含了麦克风对之间的每个延迟估计。可以通过在时间差向量中找到最大峰值来得到最佳的延迟估计。 在实际应用中,GCC-PHAT算法通常用于声源定位、声源跟踪和语音增强等领域。它在多麦克风阵列和语音信号处理系统中具有广泛的应用。通过使用matlab提供的gccphat函数,我们可以很方便地实现这些应用并获得准确的延迟估计结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值