OpenKE-TransE代码阅读

OpenKE-TransE代码阅读

参考
TransE模型学习笔记
小黑笔记:transe模型
权值初始化
PyTorch权值初始化的十种方法

TransE伪代码
在这里插入图片描述

输入:训练集S={(h,l,t)},实体集L,关系集L,margin值y,嵌入向量维度k
在这里插入图片描述

γ \gamma γ:边距超参数。作用是,d[正三元组]-d[负三元组],会得到一个负数,margin是一个正数,使得整体式子是一个正数。随着loss的减小,d[正三元组]-d[负三元组]负数会越来越小,当其绝对值超过margin时,整个式子会变成负数。但是loss只取正数,当得到负数时,整个式子置为0,所以正负三元组最大距离为margin。

margin代表正负样本之间的最大距离,有了margin不会让负样本的d变得无限大

输入:relation2id.txt , entity2id.txt , train2id.txt
relation2id.txt:

/location/country/form_of_government 0
/tv/tv_program/regular_cast./tv/regular_tv_appearance/actor 1

entity2id.txt:

/m/027rn 0
/m/06cx9 1

train2id.txt:

0 1 0
2 3 1

代码逻辑
在这里插入图片描述

TrainDataLoader:数据采样,调用C++函数库方法

# 迭代器
def __iter__(self):
    if self.sampling_mode == "normal":
        return TrainDataSampler(self.nbatches, self.sampling)
    else:
        return TrainDataSampler(self.nbatches, self.cross_sampling)
# 调用sampling方法
def sampling(self):
    # 调用c++采样方法,传入的是地址
    self.lib.sampling(
        self.batch_h_addr,
        self.batch_t_addr,
        self.batch_r_addr,
        self.batch_y_addr,
        self.batch_size,
        self.negative_ent,
        self.negative_rel,
        0,
        self.filter,
        0,
        0
    )
    # 返回数据
    return {
   
        "batch_h": self.batch_h, 
        "batch_t": self.batch_t, 
        "batch_r": self.batch_r, 
        "batch_y": self.batch_y,
        "mode": "normal"
    }

sampling中调用c++库中的Base.cpp的方法

// 启动线程,调用了getBatch方法
extern "C"
void sampling(
    INT *batch_h, // 地址
    INT *batch_t, 
    INT *batch_r, 
    REAL *batch_y, 
    INT batchSize, 
    INT negRate = 1, 
    INT negRelRate = 0, 
    INT mode = 0,
    bool filter_flag = true,
    bool p = false, 
    bool val_loss = false
) {
    pthread_t *pt = (pthread_t *)malloc(workThreads * sizeof(pthread_t));
    Parameter *para = (Parameter *)malloc(workThreads * sizeof(Parameter));
    for (INT threads = 0; threads < workThreads; threads++) {
        para[threads].id = threads;
        //...设置参数
        ....
    }
    for (INT threads = 0; threads < workThreads; threads++)
        pthread_join(pt[threads], NULL);// 启动线程,调用了getBatch方法
    free(pt);
    free(para);
}

C++ getBatch方法,打乱三元组获得负样本

// sampling调用getBatch方法,打乱三元组
void* getBatch(void* con) {
    Parameter *para = (Parameter *)(con);
    INT id = para -> id;
    // 获取参数,省略
    bool p = para -> p;
    bool val_loss = para -> val_loss;
    INT mode = para -> mode;
    bool filter_flag = para -> filter_flag;
    INT lef, rig;
    if (batchSize % workThreads == 0) {
        le
对于transe模型,其代码实现可以分为以下几个步骤: 1. 数据准备:首先需要将实体和关系表示为向量形式,可以选择不同的方法,如one-hot encoding、TF-IDF、Word2Vec等。 2. 模型构建:利用PyTorch或者TensorFlow等深度学习框架,定义transe模型的结构,包括实体和关系的嵌入向量维度,L1或L2正则化等超参数。 3. 损失函数定义:transe模型使用的是负样本对比损失函数,其中正样本为头实体和尾实体以及它们之间的关系向量的和,我们需要从负样本中选出一个实体或关系向量与正样本进行对比,以最小化两者之间的距离(欧氏距离或马氏距离)。 4. 训练模型:通过反向传播算法最小化损失函数,更新嵌入向量,调整超参数以提高模型的表现。 5. 模型评估:利用测试集或者交叉验证等方法对transe模型的性能进行评估,包括准确率、召回率、F1-score等指标。 6. 预测实体关系:最后,利用训练好的transe模型对新的实体关系进行预测,输出概率值或者分类结果。 下面是一个简单的transe模型的PyTorch代码实现: ``` import torch import torch.nn as nn import torch.nn.functional as F class TransE(nn.Module): def __init__(self, num_entities, num_relations, embedding_dim, margin, norm=1): super(TransE, self).__init__() # 实体和关系数量 self.num_entities = num_entities self.num_relations= num_relations # 嵌入向量的维度 self.embedding_dim = embedding_dim # L1或L2正则化 self.norm = norm # 边界值 self.margin = margin # 实体和关系向量的初始化 self.entity_embeddings = nn.Embedding(num_entities, embedding_dim) self.relation_embeddings = nn.Embedding(num_relations, embedding_dim) nn.init.xavier_uniform_(self.entity_embeddings.weight.data) nn.init.xavier_uniform_(self.relation_embeddings.weight.data) # 正样本得分 def forward(self, heads, relations, tails): head_vectors = self.entity_embeddings(heads) relation_vectors = self.relation_embeddings(relations) tail_vectors = self.entity_embeddings(tails) scores = head_vectors + relation_vectors - tail_vectors return scores # 对比损失函数 def loss(self, pos_scores, neg_scores): if self.norm == 1: distance = F.pairwise_distance(pos_scores, neg_scores, p=self.norm).sum() else: distance = (pos_scores - neg_scores).norm(self.norm, dim=-1).sum() loss = self.margin + distance return loss ``` 该代码实现包括模型构建、损失函数定义、正样本得分计算和对比损失函数定义,但并未包括训练模型和模型评估的实现。需要根据具体需求进一步完善。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值