【GPT入门】第61课 手把手教你增加模型正则层
概述
有的模型缺少正则层,如果需要用到这些模型,需要对该模型进行正则化,正则化后,对文本生成的向量的长度为1。在模型的modules中可以查看模型的结构
1.下载
modelscope download --model sungw111/text2vec-base-chinese-sentence --local_dir E:\modelscope_model\sungw111\text2vec-base-chinese-sentence

只有polling层,没有归一化层
2. 在模型层实现归一化

- 增加正则化层
import numpy as np
from sentence_transformers import SentenceTransformer, models
model_path = r'E:\modelscope_model\sungw111\text2vec-base-chinese-sentence'
bert = models.Transformer(model_path)
pooling = models.Pooling(bert.get_word_embedding_dimension(), pooling_mode='mean')
# 添加缺失的归一化层
normalize = models.Normalize()
# 组合完整模型
full_model = SentenceTransformer(modules=[bert, pooling, normalize])
print(full_model)
save_path = r'E:\modelscope_model\xxzh\text2vec-base-chinese-sentence'
full_model.save(save_path)
模型结构如下:
SentenceTransformer(
(0): Transformer({'max_seq_length': 2048, 'do_lower_case': False}) with Transformer model: ErnieModel
(1): Pooling({'word_embedding_dimension': 768, 'pooling_mode_cls_token': False, 'pooling_mode_mean_tokens': True, 'pooling_mode_max_tokens': False, 'pooling_mode_mean_sqrt_len_tokens': False, 'pooling_mode_weightedmean_tokens': False, 'pooling_mode_lasttoken': False, 'include_prompt': True})
(2): Normalize()
)
-
保存后,目录结构
多了 2_Normalize层

-
新旧模型对比

- 最后,模型中的modules.json 会显示新增的层
[
{
"idx": 0,
"name": "0",
"path": "",
"type": "sentence_transformers.models.Transformer"
},
{
"idx": 1,
"name": "1",
"path": "1_Pooling",
"type": "sentence_transformers.models.Pooling"
},
{
"idx": 2,
"name": "2",
"path": "2_Normalize",
"type": "sentence_transformers.models.Normalize"
}
]
3. 需要归一化的场景
在使用文本向量模型(如 HuggingFaceEmbedding)时,向量归一化(通常指 L2 归一化,即将将向量缩放至单位长度)的需求取决于具体场景和后续任务,主要需要考虑以下情况:
1. 当使用余弦相似度计算时,建议归一化
余弦相似度衡量的是两个向量的方向一致性,与向量的长度无关。但在实际计算中:
- 若向量已归一化(L2 范数为 1),余弦相似度等价于向量的点积(计算更高效)。
- 未归一化的向量可能因长度差异(如文本长度差异导致向量模长不同)影响相似度比较的稳定性。
典型场景: - 检索任务(如向量数据库中的近似最近邻搜索)
- 文本相似度匹配、聚类任务
- 用余弦相似度作为度量的任何场景
2. 当模型输出本身未归一化时,需要手动归一化
不同预训练模型的向量输出特性不同: - 部分模型(如 sentence-transformers 中的 all-MiniLM-L6-v2)在训练时已设计为输出归一化向量,无需额外处理。
- 另一些模型(如原始 BERT 的 [CLS] 向量)输出未归一化,向量模长可能差异较大,此时建议归一化。
判断方法:
可通过计算向量的 L2 范数(np.linalg.norm(embedding))验证,若结果接近 1 则已归一化。
3. 下游任务对向量长度敏感时,需要归一化
部分任务会直接受到向量模长影响: - 线性分类器:向量长度可能影响权重学习,归一化可让特征更稳定。
- 少样本学习 / 迁移学习:归一化有助于统一不同样本的特征尺度,提升泛化能力。
不需要归一化的情况 - 模型明确说明输出已归一化(如多数专用句向量模型)。
- 任务依赖向量的原始强度信息(如部分生成式任务中,向量模长可能隐含文本重要性)。
- 使用欧氏距离(L2 距离)作为度量时,归一化会改变原始距离特性(需谨慎)。
总结:归一化的核心目的是消除向量长度差异对任务的干扰,是否需要取决于模型特性和具体任务的相似度度量方式。检索、聚类等依赖余弦相似度的场景,通常建议归一化。

被折叠的 条评论
为什么被折叠?



