这是下游的文字分类任务。
Bert的输入分为三部分:
- Token Embeddings:字的编码=input ids。linear(21128,768)
- Segment Embeddings:句子编码。linear(2,768)
- Position Embeddings:不需要给,自动有下标,只需要按照前后顺序编位置就可以了,最长长度不是句子长度,而是模型长度。编码长度lienar(512,768)
bert就是一个特征提取器,在上游进行MLM和NSP预训练,之后bert就可以从句子中提取特征,做分类任务。
分词器
对一句话进行处理,首先需要分词:使用tokenizer分词器进行处理
Tokenizer是一个用于向量化文本,将文本转换为序列的类。计算机在处理语言文字时,是无法理解文字含义的,通常会把一个词(中文单个字或者词)转化为一个正整数,将一个文本就变成了一个序列,然后再对序列进行向量化,向量化后的数据送入模型处理。
Tokenizer 允许使用两种方法向量化一个文本语料库: 将每个文本转化为一个整数序列(每个整数都是词典中标记的索引); 或者将其转化为一个向量,其中每个标记的系数可以是二进制值、词频、TF-IDF权重等。
分词器将一句话变为很多个字,每个字被转化为:
- input ids:字在语料库中的下标
- Mask:它是padding填充,告诉模型这句话有多长,规定需要考虑的长度
- Seq_ids:句子编码
计算Bert参数
bert的参数来自于Embedding层->bert layers,其中每一层都是self-attention->pooler output->classifier进行分类输出
bert = BertModel.from_pretrained("bert-base-chinese") #从预训练好的模型中加载出BertModel
计算bert参数量(简洁):
emb_num = 21128 * 768 + 2 * 768 + 512 * 768 # embedding层的所有参数,忽略了bias
self_att_num = 768 * 768 * 3 + 768 * 768 + 768 * 3072 + 3072 * 768 # self_attention层的所有参数
all_att_num = 12 * self_att_num
pool_num = 768*768
print(emb_num+ all_att_num + pool_num)
看bert参数:
for name, para in bert.named_parameters():
print(name, para.shape)
1033



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



