我正在从 Huggingface 运行 Llama2 70B,并使用 Transformers 中的 output_attentions=True 参数来获取注意力权重。它应该输出一个元组(层、批量大小、注意力头、输入大小、输入大小),但我得到一个大小的元组(7、80、1、64、输入大小、输入大小)。 7 的额外维度应该是多少?另外,我认为因果模型应该具有下三角注意力矩阵,但输出不是下三角。这是为什么?
这是我使用的代码
from transformers import AutoTokenizer, AutoModelForCausalLM
model_name = "meta-llama/Llama-2-70b-chat-hf"
model = AutoModelForCausalLM.from_pretrained(model_name, device_map='auto')
tokenizer = AutoTokenizer.from_pretrained(model_name)
input_ids = tokenizer([input_prompt], return_tensors="pt")
outputs= model.generate(
input_ids['input_ids'],
do_sample=False,
temperature=None,
top_p=None,
top_k=None,
max_new_tokens=7,
sequence_bias=sequence_bias,
return_dict_in_generate=True,
output_attentions=True
)
attention = outputs.attentions
部分答案:
元组outputs.attentions的长度为7,因为这是您正在生成的新令牌的数量。您生成的第一个新令牌基于输出的最后一个令牌。这里的注意力权重将具有形状(层、批量大小、注意力头、输入大小、输入大小)。您生成的下一个令牌的注意力权重将具有形状(层数、批量大小、注意力头、1、输入大小 + 1),因为仅计算新令牌和先前令牌之间的注意力。
但是,我不知道为什么第一个矩阵不是下三角矩阵。我很想认识自己!