1. **交叉熵损失(Cross-Entropy Loss)**: 对于分类任务,尤其是节点分类或图分类,交叉熵损失是最常见的选择。在多类分类中,通常使用softmax函数来将GNN的输出转换为概率分布,然后使用交叉熵损失来比较预测的概率分布与真实的标签。
其中,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)**: 在回归任务中,如节点回归或图回归,均方误差损失是标准的选择。它测量的是预测值与真实值之间差的平方的平均值。
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,使得相似的节点在嵌入空间中更接近,不相似的节点更远离。
其中,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经常被用来优化模型,以确保正样本的得分高于负样本的得分。
其中,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)**: 当处理边的二元分类问题,如链接预测,即预测两个节点之间是否存在边,通常使用二元交叉熵损失。
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散度可以用来衡量预测分布与目标分布之间的差异。
其中,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生成)