unike.module.loss.SigmoidLoss 源代码
# coding:utf-8
#
# unike/module/loss/SigmoidLoss.py
#
# git pull from OpenKE-PyTorch by LuYF-Lemon-love <luyanfeng_nlp@qq.com> on May 7, 2023
# updated by LuYF-Lemon-love <luyanfeng_nlp@qq.com> on Jan 11, 2023
#
# 该脚本定义了 regularized logistic loss 损失函数.
"""
SigmoidLoss - 损失函数类,RotatE 原论文应用这种损失函数完成模型学习。
"""
import torch
import numpy as np
import torch.nn as nn
from typing import Any
import torch.nn.functional as F
from .Loss import Loss
[文档]class SigmoidLoss(Loss):
"""
``RotatE`` :cite:`RotatE` 原论文中应用这种损失函数完成模型训练。
.. Note:: :py:meth:`forward` 中的正样本评分函数的得分应大于负样本评分函数的得分。
例子::
from unike.module.loss import SigmoidLoss
from unike.module.strategy import NegativeSampling
# define the loss function
model = NegativeSampling(
model = rotate,
loss = SigmoidLoss(adv_temperature = 2),
batch_size = train_dataloader.get_batch_size(),
regul_rate = 0.0
)
"""
[文档] def __init__(
self,
adv_temperature: float | None = None):
"""创建 SigmoidLoss 对象。
:param adv_temperature: RotatE 提出的自我对抗负采样中的温度。
:type adv_temperature: float
"""
super(SigmoidLoss, self).__init__()
#: 逻辑函数,类型为 :py:class:`torch.nn.LogSigmoid`。
self.criterion: torch.nn.LogSigmoid = nn.LogSigmoid()
if adv_temperature != None:
#: RotatE 提出的自我对抗负采样中的温度。
self.adv_temperature: torch.nn.parameter.Parameter = nn.Parameter(torch.Tensor([adv_temperature]))
self.adv_temperature.requires_grad = False
#: 是否启用 RotatE 提出的自我对抗负采样。
self.adv_flag: bool = True
else:
self.adv_flag: bool = False
[文档] def get_weights(
self,
n_score: torch.Tensor) -> torch.Tensor:
"""计算 RotatE 提出的自我对抗负采样中的负样本的分布概率。
:param n_score: 负样本评分函数的得分。
:type n_score: torch.Tensor
:returns: 自我对抗负采样中的负样本的分布概率
:rtype: torch.Tensor
"""
return F.softmax(n_score * self.adv_temperature, dim = -1).detach()
[文档] def forward(
self,
p_score: torch.Tensor,
n_score: torch.Tensor) -> torch.Tensor:
"""计算 SigmoidLoss 损失函数。定义每次调用时执行的计算。
:py:class:`torch.nn.Module` 子类必须重写 :py:meth:`torch.nn.Module.forward`。
:param p_score: 正样本评分函数的得分。
:type p_score: torch.Tensor
:param n_score: 负样本评分函数的得分。
:type n_score: torch.Tensor
:returns: 损失值
:rtype: torch.Tensor
"""
if self.adv_flag:
return -(self.criterion(p_score).mean() + (self.get_weights(n_score) * self.criterion(-n_score)).sum(dim = -1).mean()) / 2
else:
return -(self.criterion(p_score).mean() + self.criterion(-n_score).mean()) / 2
[文档] def predict(
self,
p_score: torch.Tensor,
n_score: torch.Tensor) -> np.ndarray:
"""SigmoidLoss 的推理方法。
:param p_score: 正样本评分函数的得分。
:type p_score: torch.Tensor
:param n_score: 负样本评分函数的得分。
:type n_score: torch.Tensor
:returns: 损失值
:rtype: numpy.ndarray
"""
score = self.forward(p_score, n_score)
return score.cpu().data.numpy()
[文档]def get_sigmoid_loss_hpo_config() -> dict[str, dict[str, Any]]:
"""返回 :py:class:`SigmoidLoss` 的默认超参数优化配置。
默认配置为::
parameters_dict = {
'loss': {
'value': 'SigmoidLoss'
},
'adv_temperature': {
'values': [1.0, 3.0, 6.0]
}
}
:returns: :py:class:`SigmoidLoss` 的默认超参数优化配置
:rtype: dict[str, dict[str, typing.Any]]
"""
parameters_dict = {
'loss': {
'value': 'SigmoidLoss'
},
'adv_temperature': {
'values': [1.0, 3.0, 6.0]
}
}
return parameters_dict