Transformer warning: [encoder.embed_tokens.weight] is newly initialized

T5EncoderModel加载预训练权重时的警告解析
在使用Transformer加载T5Encoder预训练权重时可能会遇到关于encoder.embed_tokens.weight未初始化的警告,但文章指出这不影响模型性能,可以忽略。要消除警告,建议更新Transformer库至最新版本。

在使用transformer 加载预训练的T5 encoder参数的时候, 经常会出现:

Some weights of T5EncoderModel were not initialized from the model checkpoint 
at t5-large and are newly initialized: ['encoder.embed_tokens.weight']

这个['encoder.embed_tokens.weight']参数,顾名思义,就是encoder的embedding weight。

很多人在看到这个warning的时候会担心,embedding随机初始化,会不会影响到模型性能。

经过笔者多方查证,这个['encoder.embed_tokens.weight']的初始化对于模型性能是没有任何影响的,可以忽视。

在这里插入图片描述
如果想要没有这个报错,就升级transformer到最新版本。

具体详见:Warning when loading T5 encoders

### 解决 PyTorch Transformer Checkpoint 模型加载时缺失 keys 的问题 当遇到 `state_dict` 和模型结构之间的 key 不匹配或缺少某些 key 时,通常是因为预训练模型和当前定义的模型之间存在架构差异。对于 Transformer 类型的模型来说,常见的问题是嵌入层和其他特定模块(如编码器、解码器)中的参数不一致。 #### 方法一:手动调整状态字典 如果已知哪些键是必需但不存在于 checkpoint 中,则可以直接创建这些键并初始化其对应的张量: ```python import torch.nn as nn def adjust_checkpoint(checkpoint, vocab_size, embed_dim=512): # 创建新的权重矩阵用于填充 new_embeddings = nn.Embedding(vocab_size, embed_dim).weight.data # 将新创建的embedding加入到checkpointcheckpoint['encoder.embed_tokens.weight'] = new_embeddings.clone() checkpoint['decoder.embed_tokens.weight'] = new_embeddings.clone() # 对于lm_head部分,假设它是一个线性变换 lm_head_weight = nn.Linear(embed_dim, vocab_size).weight.data checkpoint['lm_head.weight'] = lm_head_weight.clone() return checkpoint ``` 这种方法适用于知道具体词汇表大小以及嵌入维度的情况[^1]。 #### 方法二:自适应扩展现有权重 另一种更灵活的方式是在保持原有权重不变的情况下对其进行适当扩展,特别是针对像词嵌入这样的组件。这可以通过复制现有的权值来完成,并为新增加的部分随机初始化: ```python from collections import OrderedDict def expand_embedding_weights(checkpoint, target_vocab_size): original_embeddings = checkpoint.get('encoder.embed_tokens.weight') if original_embeddings is None or len(original_embeddings.shape) != 2: raise ValueError("Invalid embeddings shape") current_vocab_size, embed_dim = original_embeddings.size(0), original_embeddings.size(1) if current_vocab_size >= target_vocab_size: print(f"Current vocabulary size {current_vocab_size} already meets the requirement.") return checkpoint expanded_embeddings = torch.cat([ original_embeddings, torch.randn(target_vocab_size - current_vocab_size, embed_dim) ], dim=0) updated_checkpoint = OrderedDict([(k,v) for k,v in checkpoint.items()]) updated_checkpoint['encoder.embed_tokens.weight'] = expanded_embeddings updated_checkpoint['decoder.embed_tokens.weight'] = expanded_embeddings.clone() # 假设两者相同 # 如果有其他依赖项也需要相应更新 if 'lm_head.weight' not in checkpoint: updated_checkpoint['lm_head.weight'] = expanded_embeddings[:target_vocab_size].clone().transpose(0, 1) return updated_checkpoint ``` 这段代码会检查是否存在指定的关键字,并根据需要扩大它们的尺寸[^4]。 #### 方法三:利用模型类自动处理 一些高级框架提供了内置的支持来自动生成缺失的参数。例如,在 Hugging Face Transformers 库中,可以使用 `AutoModelForSeq2SeqLM.from_pretrained()` 函数加载模型,并允许传递额外配置选项以覆盖默认行为。这种方式简化了许多细节上的操作,但对于定制化需求可能不够灵活[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值