两个模型共享部分参数,联合训练

本文介绍如何在Model1和Model2中共享entities_emb,以便在训练时同步更新。利用retain_graph=True进行梯度传递,实现在PyTorch中的联合训练方法。
部署运行你感兴趣的模型镜像

想将model1的entities_emb,也当作第model2的entities_emb,这样在更新model2参数的时候,能更新entities_emb。

首先在定义模型时,模型二的参数中加入model1.entities_emb

model1 = Model1(n1, n2, norm=distance_norm, dim=embedding_dim).cuda()
model2 = Model(n3, n4, device, model1.entities_emb, args).to(
        device) 

然后各自训练:

for epoch in range(epochs):
     optimizer1.zero_grad()
     loss1 = criterion()
     loss1.backward(retain_graph=True)
     optimizer1.step()

     optimizer2.zero_grad()
     loss2 = criterion()
     loss2.backward(retain_graph=True)
     optimizer2.step()

思路就是这样了,成功实现联合训练

您可能感兴趣的与本文相关的镜像

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

### 联合抽取中的共享参数联合解码模型 #### 共享参数联合抽取模型 共享参数联合抽取模型是一种通过多任务学习的方式,让不同的子任务(如实体识别和关系抽取)共享部分神经网络层的权重。这种设计能够使不同任务之间相互促进,从而提升整体性能[^1]。 具体实现方式通常包括以下几个方面: - **特征提取模块**:利用预训练的语言模型(如BERT、RoBERTa等)作为基础编码器,生成输入文本的上下文表示向量。 - **共享机制**:多个子任务共用同一个编码器输出的结果,减少计算资源消耗并增强泛化能力。 - **特定任务头结构**:尽管底层特征被共享,但对于每项具体的任务仍然会附加独立的任务头部网络来进行最终预测。 例如,在某些架构里可能会采用BiLSTM-CRF组合形式完成命名实体识别的同时也构建另外一套针对关系分类的操作流程[^3]。 ```python import torch.nn as nn class SharedParameterModel(nn.Module): def __init__(self, embedding_dim, hidden_size, num_classes_entity, num_classes_relation): super(SharedParameterModel, self).__init__() # 共享的基础编码器 self.shared_encoder = nn.LSTM(input_size=embedding_dim, hidden_size=hidden_size//2, bidirectional=True) # 针对实体识别的具体操作 self.entity_head = nn.Linear(hidden_size, num_classes_entity) # 关系抽取的部分则可能涉及步处理或者更复杂的设计模式 self.relation_head = nn.Sequential( nn.Linear(hidden_size * 2, hidden_size), nn.ReLU(), nn.Linear(hidden_size, num_classes_relation)) def forward(self, inputs): shared_output, _ = self.shared_encoder(inputs) entity_predictions = self.entity_head(shared_output) relation_features = ... # 这里的逻辑取决于实际需求定义如何获取关系特征 relation_predictions = self.relation_head(relation_features) return entity_predictions, relation_predictions ``` 上述代码片段展示了一个简单的框架示意,展示了怎样在一个统一模型内部既执行NER又进行RE的功能开发过程。 #### 联合解码的联合抽取模型 相比之下,联合解码的联合抽取模型更加注重整个推理过程中的一致性和全局最优性。这类方法试图一次性解决所有相关联的问题而不是分开考虑各个组成部分。TPLinker就是一个典型的例子[^2]。 它摒弃传统先检测主体再寻找对应客体及其关联属性的做法;转而把所有的实体以及它们之间的联系都看作节点间连接问题来对待。通过对令牌对链接状态矩阵建模达到同步确定目标位置及类别归属的目的。这种方法有效缓解了由于顺序决策带来的累积误差即所谓的“曝光偏差”。 以下是关于TPLinker核心思想的一个简化版本描述: 1. 构造三个二阶张量分别代表起始点指向终点、结束标志回溯起点还有者互相指代的情况; 2. 应用softmax函数得到概率分布进而选取最有可能成立的关系实例集合; 3. 后续可选步骤包含但不限于阈值裁剪冗余选项或是引入额外约束条件优化候选列表质量等等。 ```python def construct_linking_matrices(tokens_embeddings): batch_size, seq_len, dim = tokens_embeddings.size() start_to_end_matrix = ... end_to_start_matrix = ... head_tail_matrix = ... linking_scores = calculate_score(start_to_end_matrix, end_to_start_matrix, head_tail_matrix) predicted_links = apply_threshold_or_topk(linking_scores) entities_and_relations = decode_from_predicted_links(predicted_links) return entities_and_relations ``` 此伪代码仅用于说明基本原理,并未详尽列出全部细节。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值