鱼C论坛

 找回密码
 立即注册
查看: 156|回复: 5

deberta训练模型

[复制链接]
发表于 2024-11-2 21:41:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#定义训练模型
class LLMModel(nn.Module):
    def __init__(self, cfg, config_path=None, pretrained=False):
        super().__init__()
        self.cfg = cfg
        if config_path is None:
            self.config = AutoConfig.from_pretrained(cfg.model, output_hidden_states=True)#
            self.config.hidden_dropout = 0.
            self.config.hidden_dropout_prob = 0.
            self.config.attention_dropout = 0.
            self.config.attention_probs_dropout_prob = 0.
            self.config.add_pooling_layer = False 
        else:
            self.config = torch.load(config_path)
        if pretrained:
            self.model = AutoModel.from_pretrained(cfg.model, config=self.config)
        else:
            self.model = AutoModel.from_config(self.config)
        
        self.model.resize_token_embeddings(len(tokenizer))#
        if self.cfg.gradient_checkpointing:#使用梯度检查点技术时,模型不会保存前向传播计算的中间结果,减少占用内存
            self.model.gradient_checkpointing_enable()
        self.fc = nn.Linear(self.config.hidden_size, self.cfg.num_labels)
        self._init_weights(self.fc)
        
    def _init_weights(self, module):
        if isinstance(module, nn.Linear):
            module.weight.data.normal_(mean=0.0, std=self.config.initializer_range)
            if module.bias is not None:
                module.bias.data.zero_()
        elif isinstance(module, nn.Embedding):
            module.weight.data.normal_(mean=0.0, std=self.config.initializer_range)
            if module.padding_idx is not None:
                module.weight.data[module.padding_idx].zero_()
        elif isinstance(module, nn.LayerNorm):
            module.bias.data.zero_()
            module.weight.data.fill_(1.0)
        
    def feature(self, input_ids, attention_mask, token_type_ids):
        outputs = self.model( input_ids, attention_mask, token_type_ids)
        last_hidden_states = outputs[0] #encoder最后一个隐藏状态的输出传递给decoder做cross attention
        feature = last_hidden_states[:, 0, :] ## CLS token
        return feature

    def forward(self,  input_ids, attention_mask, token_type_ids):#attention_mask避免用注意力机制的时候关注到填充符
        feature = self.feature( input_ids, attention_mask, token_type_ids)
        output = self.fc(feature)
        return output.squeeze(-1)

其中,
    def feature(self, input_ids, attention_mask, token_type_ids):
        outputs = self.model( input_ids, attention_mask, token_type_ids)
        last_hidden_states = outputs[0] #encoder最后一个隐藏状态的输出传递给decoder做cross attention
        feature = last_hidden_states[:, 0, :] ## CLS token
        return feature

    def forward(self,  input_ids, attention_mask, token_type_ids):#attention_mask避免用注意力机制的时候关注到填充符
        feature = self.feature( input_ids, attention_mask, token_type_ids)
        output = self.fc(feature)
        return output.squeeze(-1)

feature函数最终返回的是什么形状的张量?然后将其作为最后输出全连接层的输入
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-11-2 21:42:01 | 显示全部楼层
在您的代码中,`feature`函数返回的是`self.model`的输出,即`last_hidden_states`。根据Hugging Face的Transformers库,`AutoModel`的输出通常是一个包含多个元素的元组,其中第一个元素是最后一个隐藏层的输出。

假设`self.model`是一个标准的BERT或类似的Transformer模型,`last_hidden_states`的形状通常是`(batch_size, sequence_length, hidden_size)`。这里:

- `batch_size`是输入批次的大小。
- `sequence_length`是输入序列的长度。
- `hidden_size`是模型的隐藏层大小。

在`forward`函数中,这个`feature`被传递给全连接层`self.fc`。如果`self.fc`的输入是`(batch_size, sequence_length, hidden_size)`,那么它会对每个序列位置的特征进行线性变换,输出的形状将是`(batch_size, sequence_length, num_labels)`。最后,`output.squeeze(-1)`会移除最后一个维度,假设`num_labels`为1,最终输出的形状将是`(batch_size, sequence_length)`。

如果`self.fc`的输入是`(batch_size, hidden_size)`,那么您可能需要在`feature`中选择特定的token(例如CLS token)来进行分类。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-11-2 22:15:46 | 显示全部楼层
FishC 发表于 2024-11-2 21:42
在您的代码中,`feature`函数返回的是`self.model`的输出,即`last_hidden_states`。根据Hugging Face的Tra ...

上述模型的decoder部分体现在哪里
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-11-2 22:27:31 | 显示全部楼层
Terence888 发表于 2024-11-02 22:15
上述模型的decoder部分体现在哪里


在您提供的代码中,并没有明确的decoder部分。这个模型主要是一个encoder模型,通常用于特征提取或分类任务。以下是相关代码行:
startLine: 2
endLine: 50

在Transformer架构中,decoder通常用于生成任务(如翻译、文本生成等),而encoder用于理解任务(如分类、特征提取等)。在您的代码中,`feature`函数提取了encoder的最后一个隐藏状态,但没有涉及到decoder的实现。

如果您需要实现一个完整的encoder-decoder模型,通常需要在`feature`函数之后添加一个decoder模块,并将encoder的输出传递给decoder。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-11-2 22:43:58 | 显示全部楼层
FishC 发表于 2024-11-2 22:27
在您提供的代码中,并没有明确的decoder部分。这个模型主要是一个encoder模型,通常用于特征提取或分类 ...
self.model.resize_token_embeddings(len(tokenizer))
这句代码如何解释
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-11-2 22:44:10 | 显示全部楼层
Terence888 发表于 2024-11-02 22:43
self.model.resize_token_embeddings(len(tokenizer)) ...


这行代码的作用是调整模型的词嵌入矩阵的大小,以适应新的词汇表大小。具体来说:

- `self.model` 是一个预训练的Transformer模型。
- `resize_token_embeddings` 是一个方法,用于调整模型的词嵌入层的大小。
- `len(tokenizer)` 返回当前使用的`tokenizer`的词汇表大小。

通过调用 `resize_token_embeddings(len(tokenizer))`,您可以确保模型的词嵌入层与当前词汇表的大小匹配。这在您对词汇表进行了修改(例如,添加了新的词汇或特殊标记)时特别有用。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 11:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表