loss function in GNNs

1. **交叉熵损失(Cross-Entropy Loss)**:
对于分类任务,尤其是节点分类或图分类,交叉熵损失是最常见的选择。在多类分类中,通常使用softmax函数来将GNN的输出转换为概率分布,然后使用交叉熵损失来比较预测的概率分布与真实的标签。

L_{CE} = -\frac{1}{N}\sum_{i=1}^{N}\sum_{c=1}^{M}y_{ic}\log(p_{ic})

其中,M 是类别的数量,y 是一个二元指示器(0或1),表示样本i是否属于类别c,而p_ic 是模型预测样本i属于类别c的概率
import torch.nn as nn
import torch

output = torch.tensor([[1.0, 2.0, 0.1], [0.1, 1.0, 2.9]])  # Example logits
labels = torch.tensor([1, 2])
loss_fn = nn.CrossEntropyLoss()
loss = loss_fn(output, labels)
2. **均方误差损失(Mean Squared Error, MSE Loss)**:
在回归任务中,如节点回归或图回归,均方误差损失是标准的选择。它测量的是预测值与真实值之间差的平方的平均值。

L_{MSE} = \frac{1}{N}\sum_{i=1}^{N}(y_i - \hat{y}_i)^2

import torch
import torch.nn as nn

predictions = torch.tensor([2.5, 0.0, 2.1])
true_values = torch.tensor([3.0, 0.0, 1.8])
loss_fn = nn.MSELoss()
loss = loss_fn(predictions, true_values)
3. **对比损失(Contrastive Loss)**:
对于图嵌入或节点嵌入的任务,对比损失可以用来训练GNN,使得相似的节点在嵌入空间中更接近,不相似的节点更远离。

L_{contrastive} = (1 - Y)\frac{1}{2}(D_w)^2 + Y\frac{1}{2}\left\{\max(0, m - D_w)\right\}^2

其中,Y 是一个二元标签,表示两个样本是否相似,D_w 是样本之间的距离,m 是一个边界值,用于分隔相似和不相似的样本。
import torch
import torch.nn as nn


embedding1 = torch.randn(10, 128)  # Example embeddings
embedding2 = torch.randn(10, 128)  # Example embeddings
labels = torch.randint(0, 2, (10,))  # 0 or 1 indicating dissimilar or similar

margin = 1.0
loss_fn = nn.CosineEmbeddingLoss(margin=margin)
loss = loss_fn(embedding1, embedding2, labels)
4. **Ranking Loss**:
在图链接预测任务中,ranking loss如pairwise ranking loss或triplet loss经常被用来优化模型,以确保正样本的得分高于负样本的得分。

L_{ranking} = \max(0, m + S_{neg} - S_{pos})

其中,S_pos 是正样本的得分,S_neg 是负样本的得分,m 是边界值。
import torch
import torch.nn as nn

pos_scores = torch.tensor([2.5, 3.1, 4.0])
neg_scores = torch.tensor([1.0, 2.2, 3.3])


loss_fn = nn.MarginRankingLoss(margin=1.0)
target = torch.ones_like(pos_scores)  # Target should be 1 indicating pos_score should be higher
loss = loss_fn(pos_scores, neg_scores, target)
5. **二元交叉熵损失(Binary Cross-Entropy Loss)**:
当处理边的二元分类问题,如链接预测,即预测两个节点之间是否存在边,通常使用二元交叉熵损失。

L_{BCE} = -\frac{1}{N}\sum_{i=1}^{N}y_i\log(p_i) + (1 - y_i)\log(1 - p_i)

import torch
import torch.nn as nn

logits = torch.tensor([0.2, 2.5, -1.0])
labels = torch.tensor([0, 1, 0], dtype=torch.float32)

loss_fn = nn.BCEWithLogitsLoss()
loss = loss_fn(logits, labels)
6. **多任务损失(Multi-Task Loss)**:
在多任务学习场景中,可能需要同时优化多个损失函数,比如结合交叉熵损失和均方误差损失来同时进行分类和回归。

import torch
import torch.nn as nn

classification_logits = torch.tensor([[2.0, 1.5]])
regression_predictions = torch.tensor([0.3])
classification_labels = torch.tensor([1])
regression_labels = torch.tensor([0.5])

classification_loss_fn = nn.CrossEntropyLoss()
regression_loss_fn = nn.MSELoss()

classification_loss = classification_loss_fn(classification_logits, classification_labels)
regression_loss = regression_loss_fn(regression_predictions, regression_labels)

# Combine losses, can be a weighted sum if necessary
loss = classification_loss + regression_loss
7. **负采样损失(Negative Sampling Loss)**:
对于大规模图数据,负采样损失可以用于高效训练,通过从负样本中采样少量代表性样本来减少计算量。

其中, 是sigmoid函数,x_i 是正样本,z 是从噪声分布 P_{noise}中抽取的负样本,k 是每个正样本采样的负样本数量
logits = torch.tensor([2.0, -1.5, 0.3])
labels = torch.tensor([1, 0, 0], dtype=torch.float32)  # 1 for positive sample, 0 for negative samples

loss = -torch.mean(labels * F.logsigmoid(logits) + (1 - labels) * F.logsigmoid(-logits))

8. **KL散度(KL Divergence)**:
如果任务涉及图的概率分布,比如在图生成模型中,KL散度可以用来衡量预测分布与目标分布之间的差异。

D_{KL}(P||Q) = \sum_{x}P(x)\log\left(\frac{P(x)}{Q(x)}\right)

其中,P 和 Q 是两个概率分布
import torch
import torch.nn as nn
import torch.nn.functional as F

p = F.softmax(torch.tensor([0.1, 2.0, 0.7]), dim=0)
q = F.softmax(torch.tensor([0.1, 1.0, 1.9]), dim=0)

loss_fn = nn.KLDivLoss(reduction='batchmean')
loss = loss_fn(F.log_softmax(p, dim=0), q)

(以上内容由chatgpt生成)

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值