当前位置: 首页 > news >正文

BERT算法学习1-嵌入层结构

BERT 将输入序列表示为位置嵌入(position embedding)、句子嵌入(segment embedding)和词嵌入(token embedding)的叠加。

1.嵌入层


1.1Token Embedding

import torch import torch.nn as nn from transformers import BertTokenizer, BertConfig # 1. 加载BERT配置和分词器(用bert-base-chinese为例) config = BertConfig.from_pretrained("bert-base-chinese") tokenizer = BertTokenizer.from_pretrained("bert-base-chinese") # 2. 定义Token Embedding层(核心:vocab_size→hidden_size) # vocab_size:BERT的中文字典大小(约21128个字符) # hidden_size:768维,每个字符的语义向量维度 token_embedding = nn.Embedding( num_embeddings=config.vocab_size, embedding_dim=config.hidden_size # 输出:768维语义向量 ) # 3. 测试:输入文本→字符ID→Token Embedding text = "" # 第一步:分词(把文本转成字符ID,BERT的基础操作) inputs = tokenizer(text, return_tensors="pt") token_ids = inputs["input_ids"] # # 解释:101是[CLS](句子开头),102是[SEP](句子结尾),121=1,8024=kV,7552=母,7746=线 # 第二步:Token Embedding(字符ID→768维语义向量) token_emb = token_embedding(token_ids) print("Token Embedding维度:", token_emb.shape) # torch.Size([1, 8, 768])

将句子使用tokenizer分词,然后嵌入为[1,seqlens,hidden_size]

1.2 Position Emdedding

# 1. 定义Position Embedding层(核心:max_position_embeddings→hidden_size) # max_position_embeddings:BERT支持的最大句子长度(512) position_embedding = nn.Embedding( num_embeddings=config.max_position_embeddings, # 输入:位置ID(0-511) embedding_dim=config.hidden_size # 输出:768维位置向量 ) # 2. 生成位置ID(每个字符对应一个位置,从0开始) position_ids = torch.arange(token_ids.shape[1]).unsqueeze(0) # tensor([[0,1,2,3,4,5,6,7]]) # 解释:0=[CLS],1=1,2=1,3=0,4=kV,5=母,6=线,7=[SEP] # 3. Position Embedding(位置ID→768维位置向量) pos_emb = position_embedding(position_ids) print("Position Embedding维度:", pos_emb.shape) # torch.Size([1, 8, 768])

1.3 Segment Embedding

仅用于成对句子任务(比如问答、文本匹配),表征字符属于第一个句子还是第二个句子;单句任务(比如你的实体识别)中,所有字符的 Segment ID 都是 0,因此这个嵌入是全 0 向量,对结果无影响。

# 1. 定义Segment Embedding层(核心:type_vocab_size→hidden_size) # type_vocab_size:句子类型数(BERT默认2,对应句子1/句子2) segment_embedding = nn.Embedding( num_embeddings=config.type_vocab_size, # 输入:句子类型ID(0/1) embedding_dim=config.hidden_size # 输出:768维句子向量 ) # 2. 生成Segment ID(单句任务:全0;成对句子:0/1区分) # 场景1:单句(你的实体识别场景) segment_ids_single = torch.zeros_like(token_ids) # tensor([[0,0,0,0,0,0,0,0]]) seg_emb_single = segment_embedding(segment_ids_single) print("单句Segment Embedding前5维:", seg_emb_single[0, 1, :5]) # 全0 # 场景2:成对句子(比如“问题:110kV母线是什么? 回答:电力设备”) text1 = "110kV母线是什么?" text2 = "电力设备" inputs_pair = tokenizer(text1, text2, return_tensors="pt") segment_ids_pair = inputs_pair["token_type_ids"] # tensor([[0,0,0,0,0,0,0,1,1,1,1]]) # 解释:0=属于第一个句子,1=属于第二个句子 seg_emb_pair = segment_embedding(segment_ids_pair)

然后将三个向量concat表示每个维度既包含词义、位置信息还有所属句信息

http://www.jsqmd.com/news/512772/

相关文章:

  • 用MATLAB复刻经典电话通信:手把手教你实现PCM编码与双机文件传输
  • Vue前端与.Net后端SM2加密通信实战:从sm-crypto到BouncyCastle的完整流程
  • 四种轻松无损去除 Gemini 水印的方法
  • 聊聊国产6.6kW OBC硬核设计
  • Gemini认证:下一代安全验证技术革新
  • 函数调用寄存器规则
  • 美妆品牌,快速搭建小程序商城
  • 基于单片机无线防丢报警器设计 [单片机]-计算机毕业设计源码+LW文档
  • 佳维视工控一体机在水质检测仪中的应用
  • 如何在ESP32上构建你的AI伙伴:Xiaozhi-ESP32开源项目深度探索
  • Git误操作急救手册:拯救代码必备
  • 写代码 vs 拖模块:1949AI拆一个自动化流程的两种实现
  • 桌面温湿度天气时钟 原理图设计 (SchDoc)
  • 如何备份红米手机短信(6 种行之有效的方法)
  • 2013-2024年各省级数字经济指数数据+Stata代码
  • [特殊字符] 重磅!智慧港口评级落地!AI硬核技术,助力港口冲击一级(引领型)标杆!
  • A 股 Level-2 行情数据 API 实战指南
  • 告别Appium!用Python+facebook-wda搞定iOS自动化测试(保姆级环境搭建与实战)
  • 【Keepalived】主备模式MASTER/BACKUP的vrrp实例配置详解
  • 新能源汽车电池壳体孔深光学3D轮廓测量-激光频率梳3D轮廓技术
  • OSI七层模型实战解析:从理论到网络通信的完美落地
  • 3月必看!防雨布行业内口碑好的品牌分析情况,市场防雨布企业推荐优质品牌选购指南 - 品牌推荐师
  • 单例模式(懒汉式)
  • C语言学习与未来规划
  • 高效HR的AI工具箱:21个精准提示词,重塑核心工作流(即拿即用版)
  • RDMA-InfiniBand和RoCEv2
  • 电动船舶在线监测管理系统方案
  • 3.21小测
  • 告别模型部署踩坑!Transformers 权威验证模型完整性全流程(通用版)
  • CSS进阶指南:深入解析选择器优先级与继承机制