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

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 结果进行了处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值