【Python】科研代码学习:六 ModelOutput,SpecificModel
Model Outputs
ModelOutput
HF官网API:ModelOutput 所有模型的输出都是 ModelOutput
的子类的实例 (All models have outputs that are instances of subclasses of ModelOutput) 了解 ModelOutput
与其子类,我们就可以获得许多有用的输出参数先来看如何获取模型的输出的一个例子: 我们加载 tokenizer, model
,获取输入和标签后,model(xxx)
的返回结果就是 outputs
了
from transformers import BertTokenizer, BertForSequenceClassification
import torch
tokenizer = BertTokenizer. from_pretrained( "google-bert/bert-base-uncased" )
model = BertForSequenceClassification. from_pretrained( "google-bert/bert-base-uncased" )
inputs = tokenizer( "Hello, my dog is cute" , return_tensors= "pt" )
labels = torch. tensor( [ 1 ] ) . unsqueeze( 0 )
outputs = model( ** inputs, labels= labels)
看一下源码: 首先,它头文件在 transformers.utils.ModelOutput
其次,它继承自 OrderedDict
,且重载了 __getitem__
,可以通过字符串 / 下标索引 可以使用 to_tuple()
获取转成tuple类型 ※ 另外需要注意的是,传参output_hidden_states=True 以及 output_attentions=True
等,我们才能从 outputs
中获取到更多的参数信息
BaseModelOutput
上面的 ModelOutput
只是定义了基础的格式和转换,接下来这个 BaseModelOutput
则是继承自上面的类,并且可以获得更多参数信息 可以看到,它存储了如下参数: last_hidden_state
:最终隐藏层状态的张量值 hidden_states
:每一层的状态的张量值 attentions
:每一层的注意力的张量值
CausalLMOutput
这个比较常用,是专门对因果LM输出用的 它还提供了 loss
损失 logits
:LM头的预测分数,在CausalLM中即为在词汇表vocab中,下一个token的预测分数,并且未经过最后softmax归一之前的分数。
其他 ModelOutput
其他还有很多,主要是关注 1)用的是 pt
还是 tf
还是 flax
2)用的是哪个具体任务 3)主要还是得对应哪个具体的 PretrainedModel
比如 BaseModelOutputWithCrossAttentions
就用了交叉注意力的 PretrainedModel
Seq2SeqModelOutput
给 s2s 模型的 MaskedLMOutput
给 maskedLM的 NextSentencePredictorOutput
给 NSP 任务的 MultipleChoiceModelOutput
给多选任务的… 你会发现,具体是哪一类,取决于你当时是用哪个 PretrainedModel
所以你需要查询具体我可以获得什么输出之前,就去看预训练模型的那个类型吧。
SpecificModel
之前讲过 PretrainedModel
是预训练模型的基类 AutoModel
可以自动根据输入的参数,选择最合适的模型 AutoModelForCausalLM
,可以自动根据输入的参数,选择最合适的因果LM模型 那问题来了,很多代码中貌似没有使用 AutoModel
呀,他们的导入头文件是从哪里来的呢? 其实从 HF官网的Doc
的最左下角找的: 首先进入 Docs
,找到 Transformers
库的 API,然后选择合适的版本号,用英文,左侧滚到底,就可以找到了 我这里是NLP任务,所以选择大类 TEXT MODELS
这里举一些常用的模型吧: ALBERT, BART, BERT, BLOOM, GPT, GPT2, LLaMA, Llama2, REALM, RoBERTa, T5 ……
我这里以 Llama2
为例子吧 步骤一:查看基本信息 比如,llama的模型需要你去官网注册一下,它才会发给你。另外它还告诉你了,原始模型没有 pad token, 要添加的话怎么加 步骤二:查看怎么导入 model
和 tokenizer
你就会发现,它通过它特殊的类加载了,这里是 LlamaForCausalLM, LlamaTokenizer
了 步骤三:查看对应的 config, tokenizer, model
的改动 由于不是原始的 PretrainedConfig, PretrainedTokenizer, PretrainedModel
嘛,它肯定自己加了些东西 你就进去浏览看下改动即可 比如 LlamaConfig
中,有如下参数,比较多,还是建议看文档,自己背出来的话也太大佬了 它这里 model 有三个,主要还是看你需要用它来做什么任务,就选择哪个即可。