NLP-transformer学习:(4)transformer 的 model

`基于 NLP-transformer学习:(2和3),这里对transformer 更近一步,学习尝试使用其中的model,并对模型进行微调
文章目录
提示:以下是本篇文章正文内容,下面案例可供参考
1 Model 简介
1.1 transformer 基本结构简介
transformer 的结构为编码器(encoder) + 解码器(decoder)。
encoder 接收输入,decoder 接收encoder 的输出。
这里祭出transformer 经典结构

其中的Multi-Head 就是著名的多头注意力机制,这个主力机制可以根据上下文有选择性的选择内容。对transformer 的讲解很多,我这里就不多赘述,不过笔者也会写一篇关于论文的阅读博文。
1.2 模型类型:
1 编码器模型:自编码模型,拥有双向注意力机制,计算每个词时都可以看到完整的上下文,每个token都是互相可见的。

例如:ALBERT,BERT,DistillBERT,ROBERTa。
用途:文本分类,命名实体识别,阅读文本理解,其实现在文本理解很多模型都可以。(很难完成文本生成)
2 解码器模型:自回归模型,拥有单向注意力机制,计算每个词的特征时都孩子能看到上文,无法看到下文。
例如:GPT,GPT-2,Bloom,LLaMA。
用途:用于文本生成

3 解码器+编码器模型:序列到序列模型,使用encoder+decoder,encoder部分使用双向注意力,decoder部分使用单向注意力。

例如:BART,T5,Marian,mBART,GLM(清华的那个)。
用途:文本摘要,机器翻译。
1.2 model HEAD:
在Transformer模型中,“model head”(模型头)指的是附加在模型后的层一般是一个或者多个全链接层。如果模型叫xxxmodel只是模型本身,如果是模型的后缀是一个ForCausalLM,那就是会有结果。
1 分类头(Classification Head):
用于分类任务,如文本分类或情感分析。通常是一个或多个全连接层,最后接一个softmax层,以输出类别概率。
2 回归头(Regression Head):
用于回归任务,如预测连续值。通常是一个或多个全连接层,最后接一个线性激活函数,以输出一个实数值。
3 语言建模头(Language Modeling Head):
用于语言模型任务,如BERT的掩码语言模型(Masked Language Model, MLM)和GPT的自回归语言模型。通常是一个全连接层,用于预测词汇表中每个词的概率。
4 序列标注头(Sequence Labeling Head):
用于序列标注任务,如命名实体识别(NER)或词性标注(POS tagging)。通常是一个全连接层,针对序列中每个位置输出一个标签。
5 序列到序列头(Seq2Seq Head):
用于序列到序列任务,如机器翻译或摘要生成。通常包括一个解码器部分,生成目标序列。每种模型头的选择和设计都依赖于具体的任务需求。模型头可以看作是对Transformer主体生成的特征进一步处理,以输出适合任务的最终结果。
例如,在BERT模型中,掩码语言模型头和下一句预测头是附加在Transformer编码器上的两个模型头,分别用于词预测和句子关系判断。
2 代码实践
2.1 模型下载
代码如下(示例):
代码:
# down load model
model = AutoModel.from_pretrained("hfl/rbt3")
print(model.config)
运行结果:

将rbt3下载到本地:
git lfs clone "https://huggingface.co/hfl/rbt3" --include="*.bin"
运行结果:

后续我们都用本地的
2.2 参数修改
我们在下载时会有这些函数可以对上图内容进行修改
其中,在调用这个AutoModel.from_pretrained(“hfl/rbt3”)时,我们可以看到

比如forche_download就是每次加载时都是从网上下载下来的,而不是从下载到本地默认环境中的:
如果我们要对模型参数继续你给你修改,那么可以看下AutoConfig的类方法

其中有官方写好的示例:

2.3 运行模型
代码:
# create a input by token
text = "我爱吃羊肉泡馍和肉夹馍!"
tokenizer = AutoTokenizer.from_pretrained("hfl/rbt3")
inputs = tokenizer(text, return_tensors="pt")
#print(inputs)
# model inference
model = AutoModel.from_pretrained("hfl/rbt3", output_attentions=True)
output1 = model(**inputs)
print("model inference:")
print(output1)
# get the tensor
print(output1.last_hidden_state.size())
# model head inference
from transformers import AutoModelForSequenceClassification
clz_model = AutoModelForSequenceClassification.from_pretrained("hfl/rbt3", num_labels=10)
output2 = clz_model(**inputs)
print("model head inference:")
print(output2)
运行结果:
可以看到model的输出结果是一堆向量:


而model head 输出结果是分类结果:

然后loss 和 logits 是我们需要的
2.4 output结构
注意这里:
from transformers import AutoModelForSequenceClassification
这里的根本任务其实就是Bert ,所以我们把BertForSequenceClassification 加入进来

from transformers import AutoModelForSequenceClassification, BertForSequenceClassification
然后我们跳转到 BertForSequenceClassification
可以看到 这个类一进去首先有个num_labels——多分类,然后是config,也就是这个分类可以做到多分类。
然后这个模型是一BertModel 为基础,再经过一个Dropout,在经过一个线性分类(全链接,也就是开头说的model head)。最终得到output。
所以我们看下这个BertForSequenceClassification的 forward 函数如何推理:

这里可以看到也是首先经过bert,抽取pooled_output 结果,然后如果没有传入labels 那么就是我们在上面看到的结果
也说明了model head 就是 model 结果进行了处理。
transformer 的 model&spm=1001.2101.3001.5002&articleId=140112376&d=1&t=3&u=7a9cea1cabe84a398c85ec2a36f71be7)
2万+

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



