【GPT入门】第61课 手把手教你增加模型归一化层

【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 距离)作为度量时,归一化会改变原始距离特性(需谨慎)。

总结归一化的核心目的是消除向量长度差异对任务的干扰,是否需要取决于模型特性和具体任务的相似度度量方式。检索、聚类等依赖余弦相似度的场景,通常建议归一化。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值