如何利用嵌入学习方法实现小样本学习?

嵌入学习方法,又称表示学习,嵌入即映射,与降维类似,核心思想是将样本嵌入到低维空间中将样本特征转化特征向量的形式保存在低维特征空间中减少假设空间的范围,通过较小的嵌入空间来进一步扩大嵌入样本间的区分度,使得同类样本联系更加紧密,而异类样本分布则更加分散,它的关键在于如何嵌入样本特征以及特征嵌入之后如何学习。

小样本场景中,嵌入学习方法的核心思想是训练优秀的特征嵌入函数来实现对样本的映射,旨在让样本在较小的样本特征嵌入空间具有更加清晰的区分度。 嵌入学习方法主要由嵌入模块和度量模块组成,嵌入模块的功能是利用CNN构建并训练特征嵌入函数,将样本以特征向量的形式映射到特征空间中;度量模块则选择合适的度量函数计算样本的相似度度量,完成对样本的分类。

通常,为了保证小样本学习的性能,嵌入学习方法采用Episodic Training的跨任务学习模式(借鉴元学习的思想),旨在将对整个目标任务样本集的学习转换为多个子任务的多次学习。

 

一般情况下,嵌入学习方法对特征嵌入函数的训练很大程度依赖于辅助数据,在辅助数据中学习的是通用特征信息,而在目标任务样本中学习的是特定特征信息。嵌入学习方法可以只利用辅助数据的外部先验知识或目标样本的内部先验知识来训练特征嵌入函数,也可以同时结合两种特征信息来获得特征嵌函数。因此,依据训练特征嵌入函数的过程中结合任务特征信息的方式,可以划分为单一嵌入模型和混合嵌入模型

单一嵌入模型

包括孪生网络

 

匹配网络

 

原型网络

 

关系网络

 

图神经网络

 

信息检索法

孪生学习网络

 

动态条件卷积网络

 

任务相关自适应度量

 

mbd.pub/o/GeBENHAGEN

擅长现代信号处理(改进小波分析系列,改进变分模态分解,改进经验小波变换,改进辛几何模态分解等等),改进机器学习,改进深度学习,机械故障诊断,改进时间序列分析(金融信号,心电信号,振动信号等)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是基于 PyTorch 实现的 TransH 算法,可以将 Neo4j 的知识图谱转换成嵌入向量: ```python import torch import torch.nn as nn import torch.nn.functional as F import numpy as np from torch.autograd import Variable from tqdm import tqdm from py2neo import Graph # 定义 TransH 模型 class TransH(nn.Module): def __init__(self, entity_num, relation_num, dim, margin=1.0): super(TransH, self).__init__() self.entity_num = entity_num self.relation_num = relation_num self.dim = dim self.margin = margin # 定义实体、关系、映射矩阵 self.entity_embeddings = nn.Embedding(entity_num, dim) self.relation_embeddings = nn.Embedding(relation_num, dim) self.projection_matrix = nn.Embedding(relation_num, dim * dim) def forward(self, head, relation, tail): # 获取实体、关系、映射矩阵的向量表示 head_emb = self.entity_embeddings(head) relation_emb = self.relation_embeddings(relation) tail_emb = self.entity_embeddings(tail) proj_mat = self.projection_matrix(relation) # 将向量表示转换成矩阵表示 head_mat = head_emb.view(-1, 1, self.dim) tail_mat = tail_emb.view(-1, 1, self.dim) proj_mat = proj_mat.view(-1, self.dim, self.dim) # 计算 TransH 中的映射向量 head_proj_mat = torch.matmul(head_mat, proj_mat) tail_proj_mat = torch.matmul(tail_mat, proj_mat) head_proj_vec = head_proj_mat.view(-1, self.dim) tail_proj_vec = tail_proj_mat.view(-1, self.dim) # 计算 TransH 中的距离函数 dist = torch.norm(head_proj_vec + relation_emb - tail_proj_vec, p=2, dim=1) return dist # 定义 TransH 中的 margin loss def margin_loss(self, pos_dist, neg_dist): loss = torch.sum(torch.max(pos_dist - neg_dist + self.margin, torch.zeros_like(pos_dist))) return loss # 定义训练函数 def train(model, train_data, optimizer, batch_size, margin): # 将数据集分成若干个 batch batch_num = (len(train_data) - 1) // batch_size + 1 np.random.shuffle(train_data) total_loss = 0.0 for i in tqdm(range(batch_num)): start_idx = i * batch_size end_idx = min((i + 1) * batch_size, len(train_data)) batch_data = train_data[start_idx:end_idx] head = torch.LongTensor(batch_data[:, 0]) relation = torch.LongTensor(batch_data[:, 1]) tail = torch.LongTensor(batch_data[:, 2]) neg_head = torch.LongTensor(batch_data[:, 3]) neg_tail = torch.LongTensor(batch_data[:, 4]) # 将数据转移到 GPU 上 if torch.cuda.is_available(): model.cuda() head = head.cuda() relation = relation.cuda() tail = tail.cuda() neg_head = neg_head.cuda() neg_tail = neg_tail.cuda() # 计算正样本和负样本的距离 pos_dist = model(head, relation, tail) neg_dist = model(neg_head, relation, neg_tail) # 计算 margin loss 并进行反向传播 loss = model.margin_loss(pos_dist, neg_dist) optimizer.zero_grad() loss.backward() optimizer.step() total_loss += loss.data.cpu().numpy() return total_loss / batch_num # 定义 TransH 算法的训练过程 def transh_train(entity_list, relation_list, triple_list, dim, lr=0.001, margin=1.0, batch_size=1024, epoch=100): # 初始化模型和优化器 entity2id = {entity: idx for idx, entity in enumerate(entity_list)} relation2id = {relation: idx for idx, relation in enumerate(relation_list)} model = TransH(len(entity2id), len(relation2id), dim, margin=margin) optimizer = torch.optim.Adam(model.parameters(), lr=lr) # 将三元组转换成训练数据 train_data = [] for head, relation, tail in triple_list: if head not in entity2id or tail not in entity2id or relation not in relation2id: continue head_id = entity2id[head] tail_id = entity2id[tail] relation_id = relation2id[relation] train_data.append([head_id, relation_id, tail_id]) # 开始训练 for i in range(epoch): loss = train(model, train_data, optimizer, batch_size, margin) print("Epoch %d: loss=%.4f" % (i + 1, loss)) # 返回实体的嵌入向量 entity_embeddings = model.entity_embeddings.weight.data.cpu().numpy() return entity_embeddings # 连接 Neo4j 数据库并查询数据 graph = Graph(host="localhost", http_port=7474, user="neo4j", password="password") result = graph.run("MATCH (n)-[r]->(m) RETURN n.name, r.name, m.name").data() # 提取实体、关系和三元组列表 entity_list = list(set([item['n.name'] for item in result] + [item['m.name'] for item in result])) relation_list = list(set([item['r.name'] for item in result])) triple_list = [[item['n.name'], item['r.name'], item['m.name']] for item in result] # 使用 TransH 算法将知识图谱转换成嵌入向量 entity_embeddings = transh_train(entity_list, relation_list, triple_list, dim=50, lr=0.01, margin=1.0, batch_size=1024, epoch=100) # 保存实体嵌入向量 np.savetxt("entity_embeddings.txt", entity_embeddings, delimiter=",") ``` 其中,`TransH` 类定义了 TransH 模型,包括实体嵌入矩阵、关系嵌入矩阵和映射矩阵,并实现了前向传播和 margin loss 函数。`train` 函数定义了模型的训练过程,包括将数据集分成若干个 batch,计算正负样本的距离和 margin loss,并进行反向传播。`transh_train` 函数定义了 TransH 算法的训练过程,包括将三元组转换成训练数据,初始化模型和优化器,并开始训练。最后将实体嵌入矩阵保存到文件中。 你需要根据自己的数据集和需求,修改代码中的参数和超参数,例如嵌入维度、学习率、margin、batch_size 和 epoch 等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值