BERT算法学习1-嵌入层结构
BERT 将输入序列表示为位置嵌入position embedding、句子嵌入segment embedding和词嵌入token embedding的叠加。1.嵌入层1.1Token Embeddingimport 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_sizeBERT的中文字典大小约21128个字符 # hidden_size768维每个字符的语义向量维度 token_embedding nn.Embedding( num_embeddingsconfig.vocab_size, embedding_dimconfig.hidden_size # 输出768维语义向量 ) # 3. 测试输入文本→字符ID→Token Embedding text # 第一步分词把文本转成字符IDBERT的基础操作 inputs tokenizer(text, return_tensorspt) token_ids inputs[input_ids] # # 解释101是[CLS]句子开头102是[SEP]句子结尾12118024kV7552母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_embeddingsBERT支持的最大句子长度512 position_embedding nn.Embedding( num_embeddingsconfig.max_position_embeddings, # 输入位置ID0-511 embedding_dimconfig.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]1121304kV5母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_embeddingsconfig.type_vocab_size, # 输入句子类型ID0/1 embedding_dimconfig.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_tensorspt) 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.coloradmin.cn/o/2433997.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!