Qwen2.5模型的理解

Qwen2.5模型的理解

flyfish

Qwen2.5: 0.5B、 1.5B、 3B、 7B、 14B、 32B 及 72B 模型
这里以1.5B作为例子理解
从 ModelScope 平台下载指定的 Qwen2.5-1.5B-Instruct 语言模型及其对应的分词器,并将它们加载到内存中,以便后续进行文本处理、生成等相关操作

# 从modelscope.hub.snapshot_download模块中导入snapshot_download函数
# 这个函数用于从ModelScope平台下载模型,并返回模型缓存的目录路径
from modelscope.hub.snapshot_download import snapshot_download

# 从modelscope库中导入AutoModelForCausalLM和AutoTokenizer类
# AutoModelForCausalLM用于加载预训练的因果语言模型
# AutoTokenizer用于加载与模型对应的分词器,以便对文本进行预处理
from modelscope import AutoModelForCausalLM, AutoTokenizer

# 定义要下载的模型名称
# 这里指定的是Qwen2.5-1.5B-Instruct模型,它是由阿里云推出的一种语言模型
model_name = "qwen/Qwen2.5-1.5B-Instruct"

# 使用snapshot_download函数下载指定名称的模型,并将返回的模型缓存目录路径赋值给cache_dir变量
# 这个函数会自动处理模型的下载过程,包括从远程仓库获取模型文件并存储到本地的缓存目录中
cache_dir = snapshot_download(model_name)
# 打印输出模型缓存目录的路径信息,方便用户了解模型文件在本地的存储位置
print(f"模型缓存目录: {cache_dir}")

# 使用AutoModelForCausalLM类的from_pretrained方法加载预训练的因果语言模型
# 参数model_name指定要加载的模型名称,这里就是前面定义的"qwen/Qwen2.5-1.5B-Instruct"
# torch_dtype="auto"表示自动推断模型的数据类型,根据模型本身的设置和当前运行环境来确定合适的数据类型
# device_map="auto"表示自动将模型的不同部分分配到合适的计算设备(如GPU、CPU等)上,以实现高效的计算
model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype="auto", device_map="auto")
# 打印输出加载后的模型对象信息,用户可以通过这个输出来查看模型是否成功加载以及一些基本的模型属性
print(model)

# 使用AutoTokenizer类的from_pretrained方法加载与前面指定模型对应的分词器
# 分词器的作用是将输入的文本按照一定的规则进行分割,转化为模型能够处理的格式(如词向量等)
tokenizer = AutoTokenizer.from_pretrained(model_name)
# 打印输出加载后的分词器对象信息,用户可以通过这个输出来查看分词器是否成功加载以及一些基本的分词器属性
print(tokenizer)

Qwen2ForCausalLM 模型结构


Qwen2ForCausalLM(
  (model): Qwen2Model(
    (embed_tokens): Embedding(151936, 1536)
    (layers): ModuleList(
      (0-27): 28 x Qwen2DecoderLayer(
        (self_attn): Qwen2SdpaAttention(
          (q_proj): Linear(in_features=1536, out_features=1536, bias=True)
          (k_proj): Linear(in_features=1536, out_features=256, bias=True)
          (v_proj): Linear(in_features=1536, out_features=256, bias=True)
          (o_proj): Linear(in_features=1536, out_features=1536, bias=False)
          (rotary_emb): Qwen2RotaryEmbedding()
        )
        (mlp): Qwen2MLP(
          (gate_proj): Linear(in_features=1536, out_features=8960, bias=False)
          (up_proj): Linear(in_features=1536, out_features=8960, bias=False)
          (down_proj): Linear(in_features=8960, out_features=1536, bias=False)
          (act_fn): SiLU()
        )
        (input_layernorm): Qwen2RMSNorm((1536,), eps=1e-06)
        (post_attention_layernorm): Qwen2RMSNorm((1536,), eps=1e-06)
      )
    )
    (norm): Qwen2RMSNorm((1536,), eps=1e-06)
    (rotary_emb): Qwen2RotaryEmbedding()
  )
  (lm_head): Linear(in_features=1536, out_features=151936, bias=False)
)
  • Qwen2Model: 作为模型
  • 的核心主体,通过多层自注意力机制和多层感知机的协同工作,对输入序列进行深度编码与特征提取,能够捕获复杂的语义信息,为后续的文本生成等任务奠定基础。
  • lm_head: 将经过 Qwen2Model 处理后的隐藏状态转换为词汇表大小的logits,用于生成下一个token,从而实现文本的逐步生成。整个 Qwen2ForCausalLM 模型通过这两个主要部分的紧密协作,完成了因果语言建模的任务,能够根据给定的前文内容准确地生成后续的文本序列。

模型结构概述

Qwen2ForCausalLM 是专门设计用于因果语言建模任务的模型,其核心目标是基于给定的前文内容准确地生成后续的文本序列。该模型整体架构主要由两大部分紧密协作构成:Qwen2Model 部分承担着对输入文本序列进行深度编码与特征提取的重任,以挖掘其中蕴含的复杂语义信息;而 lm_head 部分则负责将经过 Qwen2Model 处理后得到的隐藏状态进行转换,进而生成词汇表上各个单词对应的概率分布,以此来确定下一个最有可能生成的单词,实现文本的逐步生成。

1. Qwen2Model

Qwen2Model 作为模型的核心主体,在整个文本处理流程中发挥着至关重要的作用,它负责接收输入的文本序列,并通过一系列精细设计的子模块对其进行多维度的编码与转换,最终生成能够充分表征文本语义特征的隐藏状态表示。以下是对其各个子模块的详细剖析:

1.1 embed_tokens
  • 类型: Embedding(151936, 1536)

这一模块本质上是一个词嵌入层,它在整个模型的前端起着将离散的文本输入转换为连续向量表示的关键作用。其中,参数 151936 明确了该模型所使用的词汇表的大小,意味着模型能够处理的单词种类数量为151936个;而参数 1536 则指定了每个单词被映射到的嵌入向量的维度。

当输入文本以token(通常是单词或子词的编码形式)序列的形式进入模型时,embed_tokens 模块会依据预先训练好的映射关系,将每个token对应的唯一ID(整数标识)转换为一个维度为1536的向量。这种向量表示方式相较于原始的离散token,具有更强的语义表达能力,能够更好地捕捉单词之间潜在的语义相似性和关联性。例如,语义相近的单词在这个向量空间中可能会呈现出较为接近的向量位置关系,从而为后续模型基于这些向量进行复杂的语义运算奠定了基础。

1.2 layers
  • 类型: ModuleList 包含28个 Qwen2DecoderLayer

此部分由一系列的 Qwen2DecoderLayer 组成,这些解码层如同层层递进的过滤器,通过多次对输入序列进行变换,逐步挖掘和提炼出其中更为复杂和深层次的语义信息。每经过一层解码层的处理,输入序列的特征表示就会得到进一步的优化和丰富,经过多层的堆叠后,模型便能够捕捉到文本中极为复杂的语义结构和逻辑关系。

1.2.1 Qwen2DecoderLayer

每个 Qwen2DecoderLayer 又包含了多个精细设计的子模块,它们各司其职,协同工作,共同完成对输入序列的一次深度变换操作。

  • self_attn: 自注意力机制

自注意力机制是现代深度学习语言模型中的核心组件之一,它能够让模型在处理输入序列时,动态地关注序列中的不同部分,根据当前处理的内容重点聚焦于与之相关度更高的元素,从而更好地捕捉序列内的语义关系。在 Qwen2DecoderLayer 中,自注意力机制由以下几个子模块构成:

  • q_proj: 查询投影(Linear(in_features=1536, out_features=1536, bias=True)

查询投影层负责将输入向量从原始的维度空间(这里是1536维)投影到查询向量(Query)的空间中,其输出特征维度同样为1536维,并且设置了偏差(bias=True)。在自注意力机制的运作过程中,查询向量起着关键作用,它将与后续生成的键向量(Key)进行交互运算,以确定模型对输入序列不同部分的关注程度。具体而言,当模型处理一个输入序列时,每个位置的输入向量经过 q_proj 层的投影操作后得到对应的查询向量,这些查询向量会在后续步骤中与键向量进行匹配计算,从而找出与当前位置最为相关的其他位置的信息。

  • k_proj: 键投影(Linear(in_features=1536, out_features=256, bias=True)

键投影层的作用是将输入向量投影到键向量(Key)的空间中,其输入特征维度为1536维,输出特征维度为256维,同样带有偏差(bias=True)。键向量与查询向量紧密配合,共同构成了自注意力机制中的关键要素。在实际运算中,键向量会与查询向量进行点积等运算,以生成表示不同位置之间相关性的得分,这些得分将用于后续确定每个位置对其他位置的关注权重。

  • v_proj: 值投影(Linear(in_features=1536, out_features=256, bias=True)

值投影层负责将输入向量投影到值向量(Value)的空间中,输入特征维度为1536维,输出特征维度为256维,也带有偏差(bias=True)。值向量在自注意力机制中扮演着重要角色,在经过与查询向量和键向量相关的运算得到关注权重后,这些权重会被应用于值向量,通过加权求和的方式将不同位置的值向量组合起来,从而得到自注意力机制的输出,该输出能够反映出模型基于当前输入序列各个位置的相关性而重新组合后的信息。

  • o_proj: 输出投影(Linear(in_features=1536, out_features=1536, bias=False)

输出投影层将经过自注意力机制处理后的向量再投影回原始输入向量的维度空间(1536维),但在此处偏差设置为False。这一投影操作的目的在于将自注意力机制的输出调整到合适的维度,使其能够与后续的处理环节(如多层感知机等)进行无缝衔接,确保整个模型的处理流程能够顺畅进行。

  • rotary_emb: 旋转位置嵌入(Qwen2RotaryEmbedding()

旋转位置嵌入是一种为模型提供位置信息的创新机制。在处理序列数据时,位置信息至关重要,因为不同位置的单词在语义表达上往往具有不同的含义和作用。rotary_emb 模块通过特定的数学变换,为自注意力机制中的查询向量、键向量和值向量添加了位置相关的信息,使得模型能够更好地理解输入序列的位置关系,并且在处理长序列数据时能够更有效地利用这些位置信息,避免出现因序列过长而导致的信息丢失或处理效果不佳等问题。

  • mlp: 多层感知机

多层感知机(MLP)是一种经典的神经网络结构,在 Qwen2DecoderLayer 中,它作为自注意力机制的补充,进一步对输入进行非线性变换,以挖掘出更多的语义信息。它由以下几个子模块构成:

  • gate_proj: 门控投影(Linear(in_features=1536, out_features=8960, bias=False)

门控投影层将输入向量从原始的维度空间(1536维)投影到一个中间维度(8960维)的空间中,此操作的目的在于为后续的非线性变换提供一个更广阔的空间,并且在此处偏差设置为False。通过这种投影方式,能够在一定程度上改变输入向量的特征表示,为后续的非线性处理做好准备。

  • up_proj: 上投影(Linear(in_features=1536, out_features=8960, bias=False)

上投影层同样将输入向量投影到中间维度(8960维)的空间中,偏差也为False。它与 gate_proj 层的作用类似,都是为了将输入向量转换到一个更有利于进行非线性变换的空间中,通过这两个投影层的协同作用,能够更充分地挖掘输入向量的潜在特征。

  • down_proj: 下投影(Linear(inatures=8960, out_features=1536, bias=False)

下投影层的作用是将经过非线性变换后的中间维度向量再投影回原始输入向量的维度(1536维),偏差为False。这一操作是为了将经过MLP处理后的向量调整到合适的维度,使其能够与自注意力机制的输出以及后续的处理环节(如层归一化等)进行无缝衔接,确保整个模型的处理流程能够顺畅进行。

  • act_fn: 激活函数(SiLU()

激活函数 SiLU()(Sigmoid Linear Unit)是一种非线性激活函数,它在多层感知机中起着引入非线性因素的重要作用。在数学表达式上,SiLU(x) = x * sigmoid(x),它通过将输入向量乘以一个经过sigmoid函数处理后的结果,实现了对输入向量的非线性变换。这种非线性变换使得模型能够处理更加复杂的函数关系,而不仅仅局限于线性变换,从而能够更好地挖掘出输入向量中的潜在语义信息。

  • input_layernorm: 输入层归一化(Qwen2RMSNorm((1536,), eps=1e-06)

输入层归一化是一种在神经网络训练过程中广泛应用的技术,其目的在于稳定训练过程,提高训练效率和模型性能。在 Qwen2DecoderLayer 中,input_layernorm 模块对输入到该层的向量进行层归一化处理。具体而言,它针对输入向量的每一个维度进行归一化操作,参数维度为(1536,), 并且设置了一个很小的epsilon值(eps=1e-06),用于防止在归一化过程中出现除零等异常情况。通过层归一化,能够使输入向量的各维度在训练过程中保持相对稳定的分布,从而减少因数据波动而导致的训练不稳定性,提高模型的训练效果。

  • post_attention_layernorm: 注意力后层归一化(Qwen2RMSNorm((1536,), eps=1e-06)

与输入层归一化类似,注意力后层归一化也是为了稳定训练过程。在经过自注意力机制处理之后,对向量再次进行层归一化处理,同样参数维度为(1536,), eps=1e-06。这一步骤有助于进一步稳定模型在处理过程中的表现,使得后续的处理环节能够在更稳定的基础上进行,从而提高整个模型的训练效率和性能。

1.3 norm
  • 类型: Qwen2RMSNorm((1536,), eps=1e-06)

这一模块在整个 Qwen2Model 的输出端发挥作用,对经过多层解码层处理后得到的隐藏状态进行层归一化处理,参数维度为(1536,), eps=1e-06。通过这种归一化操作,能够使输出的隐藏状态更加稳定,便于后续与 lm_head 等其他部分进行衔接和处理。在神经网络训练过程中,输出的稳定性对于模型的性能和训练效果至关重要,通过 norm 模块的处理,可以避免因输出波动过大而导致的训练困难和模型性能下降等问题。

1.4 rotary_emb
  • 类型: Qwen2RotaryEmbedding()

这一模块与在 Qwen2DecoderLayer 中的 rotary_emb 作用类似,都是为自注意力机制提供位置信息,帮助模型理解输入序列的位置关系。不过,这里的 rotary_emb 是为整个 Qwen2Model 提供位置信息,而不仅仅是针对某一个解码层。通过在整个模型层面上提供旋转位置嵌入,能够更加全面地为模型提供位置信息,使得模型在处理序列数据时能够更好地利用位置信息,提高对序列先后顺序关系的处理能力。

2. lm_head

  • 类型: Linear(in_features=1536, out_features=151936, bias=False)

lm_head 模块作为 Qwen2ForCausalLM 模型的最后一环,承担着将经过 Qwen2Model 处理后得到的最后一层隐藏状态转换为词汇表大小的logits的重要任务。其输入特征维度为1536维,这是经过 Qwen2Model 处理后隐藏状态的维度;输出特征维度为151936维,这与模型所使用的词汇表的大小相对应。偏差设置为False,通过这一线性层的转换,能够将隐藏状态向量转换为词汇表上各个单词对应的logits,这些logits可以被理解为每个单词在当前情况下的相对得分,用于生成下一个token的概率分布。在文本生成等任务中,模型会根据这些概率分布,通过采样或选择概率最高的单词等方式,来确定下一个要生成的单词,从而实现文本的逐步生成。

分词器的配置情况

分词器的配置情况,包括词汇表大小、处理文本的最大长度、特殊词元的设置以及添加词元的详细属性等

Qwen2TokenizerFast(name_or_path='C:\Users\Administrator\.cache\modelscope\hub\qwen\Qwen2___5-1___5B-Instruct', vocab_size=151643, model_max_length=131072, is_fast=True, padding_side='right', truncation_side='right', special_tokens={'eos_token': '<|im_end|>', 'pad_token': '<|endoftext|>', 'additional_special_tokens': ['<|im_start|>', '<|im_end|>', '<|object_ref_start|>', '<|object_ref_end|>', '<|box_start|>', '<|box_end|>', '<|quad_start|>', '<|quad_end|>', '<|vision_start|>', '<|vision_end|>', '<|vision_pad|>', '<|image_pad|>', '<|video_pad|>']}, clean_up_tokenization_spaces=False),  added_tokens_decoder={
        151643: AddedToken("<|endoftext|>", rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),
        151644: AddedToken("<|im_start|>", rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),
        151645: AddedToken("<|im_end|>", rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),
        151646: AddedToken("<|object_ref_start|>", rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),
        151647: AddedToken("<|object_ref_end|>", rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),
        151648: AddedToken("<|box_start|>", rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),
        151649: AddedToken("<|box_end|>", rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),
        151650: AddedToken("<|quad_start|>", rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),
        151651: AddedToken("<|quad_end|>", rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),
        151652: AddedToken("<|vision_start|>", rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),
        151653: AddedToken("<|vision_end|>", rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),
        151654: AddedToken("<|vision_pad|>", rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),
        151655: AddedToken("<|image_pad|>", rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),
        151656: AddedToken("<|video_pad|>", rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),
        151657: AddedToken("<tool_call>", rstrip=False, lstrip=False, single_word=False, normalized=False, special=False),
        151658: AddedToken("</tool_call>", rstrip=False, lstrip=False, single_word=False, normalized=False, special=False),
        151659: AddedToken("<|fim_prefix|>", rstrip=False, lstrip=False, single_word=False, normalized=False, special=False),
        151660: AddedToken("<|fim_middle|>", rstrip=False, lstrip=False, single_word=False, normalized=False, special=False),
        151661: AddedToken("<|fim_suffix|>", rstrip=False, lstrip=False, single_word=False, normalized=False, special=False),
        151662: AddedToken("<|fim_pad|>", rstrip=False, lstrip=False, single_word=False, normalized=False, special=False),
        151663: AddedToken("<|repo_name|>", rstrip=False, lstrip=False, single_word=False, normalized=False, special=False),
        151664: AddedToken("<|file_sep|>", rstrip=False, lstrip=False, single_word=False, normalized=False, special=False),
}

解释

整体概述

打印出的 Qwen2TokenizerFast 对象是一个用于对文本进行分词处理的工具,它是基于特定的预训练模型(这里是 qwen/Qwen2.5-1.5B-Instruct)配置而来的。其主要作用是将输入的文本按照一定规则分解成一个个的“词元”(tokens),以便后续模型能够更好地理解和处理文本内容。

具体属性解释

1. 初始化参数
  • name_or_path='C:\Users\Administrator\.cache\modelscope\hub\qwen\Qwen2___5-1___5B-Instruct'
    • 这指定了分词器所对应的预训练模型的名称或路径。在这里,它指向了本地缓存目录(.cache\modelscope\hub\qwen\Qwen2___5-1___5B-Instruct)下的相关模型文件,说明该分词器是根据这个特定位置的模型配置来进行分词操作的。
  • vocab_size=151643
    • 表示分词器所使用的词汇表大小为151643个词元。词汇表是分词器能够识别和处理的所有“词元”的集合,不同的词元对应着不同的文本片段(可以是单词、字符、子词等形式),模型通过对这些词元的组合和处理来理解文本的含义。
  • model_max_length=131072
    • 设定了模型能够处理的文本的最大长度。当输入文本超过这个长度时,通常需要进行截断等处理操作,以适应模型的输入要求。这里表明该模型最多能处理长度为131072个词元的文本。
  • is_fast=True
    • 说明这个分词器采用了快速分词的实现方式。快速分词通常会使用一些优化算法和数据结构,能够在保证分词质量的同时,更高效地对文本进行分词处理,提高处理速度。
  • padding_side='right'truncation_side='right'
    • 这两个参数分别指定了在对文本进行填充(padding)和截断(truncation)操作时的方向。这里都设置为 right,意味着当需要对文本进行填充以使长度达到模型要求时,会在文本的右侧添加相应的填充词元;而当文本长度超过模型最大长度需要截断时,也会从文本的右侧开始截断。
2. 特殊词元(special_tokens
  • 'eos_token': '<|im_end|>'
    • eos_token 即 “End of Sentence Token”,表示句子结束的标记。在这里,当分词器处理到文本中的句子结束位置时,会用 <|im_end|> 这个特殊词元来标记。
  • 'pad_token': '<|endoftext|>'
    • pad_token 是用于填充的词元。当文本长度不足模型最大长度时,会在文本的右侧(根据前面的 padding_side 设置)添加 <|endoftext|> 这个词元来补齐长度。
  • 'additional_special_tokens'
    • 这是一个包含多个特殊词元的列表,其中每个特殊词元都有其特定的用途:
      • <|im_start|><|im_end|>:与某种特定的文本处理模式或任务相关,比如在处理一些具有特定格式或结构的文本(如包含图像相关描述等)时,用于标记特定内容的开始和结束位置。
      • <|object_ref_start|><|object_ref_end|><|box_start|><|box_end|><|quad_start|><|quad_end|><|vision_start|><|vision_end|><|vision_pad|><|image_pad|><|video_pad|>:这些特殊词元大概率与涉及视觉相关内容(如处理图像、视频描述等)的文本处理任务有关,用于标记与视觉元素相关的各种起始、结束、填充等情况。
3. 添加词元解码器(added_tokens_decoder
  • 这个部分是一个字典,用于将添加的特殊词元(通过其在词汇表中的索引)映射回对应的 AddedToken 对象,以便更详细地了解每个添加词元的属性:
    • 对于每个索引(如151643、151644等),对应的 AddedToken 对象包含了以下属性:
      • rstrip=Falselstrip=False:表示在对包含该词元的文本进行处理时,是否需要去除词元左侧或右侧的空白字符,这里都设置为 False,说明不需要进行这样的操作。
      • single_word=False:表明该词元不一定被视为单个单词,可能是一个由多个字符组成的特殊标记等情况。
      • normalized=False:意味着该词元在使用时不需要进行归一化处理(归一化通常是指将词元转换为某种标准形式,如统一大小写等)。
      • special=True(部分词元):对于一些特殊词元(如前面提到的各种用于标记特定情况的词元),这里设置为 True,表示它们具有特殊的用途和属性,区别于普通的词汇表词元。

q_proj、k_proj、v_proj和o_proj

  1. 自注意力机制(Self - Attention)背景

    • 在Transformer架构(Qwen2模型结构部分)中,自注意力机制是一个关键部分。它的目的是计算输入序列中每个位置与其他位置的相关性,然后根据这些相关性来聚合信息。在这个过程中,q_projk_projv_projo_proj发挥着关键作用。
  2. 计算步骤和公式

    • 查询(Query)、键(Key)和值(Value)向量的生成
      • 首先,对于输入序列中的每个位置 i i i(假设输入序列经过词嵌入等操作后维度为 d m o d e l = 1536 d_{model}=1536 dmodel=1536),通过线性投影(也就是q_projk_projv_proj)来生成查询向量 q i q_i qi、键向量 k i k_i ki和值向量 v i v_i vi
        • 对于查询向量 q i q_i qi q i = q p r o j ( x i ) q_i = q_{proj}(x_i) qi=qproj(xi),其中 x i x_i xi是输入序列中第 i i i个位置的向量, q p r o j q_{proj} qprojq_proj对应的线性变换,也就是 q i = W q x i + b q q_i = W_qx_i + b_q qi=Wqxi+bq W q W_q Wq是权重矩阵,维度为 1536 × 1536 1536\times1536 1536×1536 b q b_q bq是偏差向量,因为q_projbias=True)。
        • 对于键向量 k i k_i ki k i = k p r o j ( x i ) = W k x i + b k k_i = k_{proj}(x_i)=W_kx_i + b_k ki=kproj(xi)=Wkxi+bk,其中 W k W_k Wk是权重矩阵,维度为 1536 × 256 1536\times256 1536×256 b k b_k bk是偏差向量,这里k_projbias=True
        • 对于值向量 v i v_i vi v i = v p r o j ( x i ) = W v x i + b v v_i = v_{proj}(x_i)=W_vx_i + b_v vi=vproj(xi)=Wvxi+bv,其中 W v W_v Wv是权重矩阵,维度为 1536 × 256 1536\times256 1536×256 b v b_v bv是偏差向量,这里v_projbias=True
    • 注意力分数(Attention Scores)的计算
      • 计算第 i i i个位置的查询向量 q i q_i qi与所有位置的键向量 k j k_j kj j j j表示序列中的所有位置)的点积来得到注意力分数 s c o r e s i j scores_{ij} scoresij。公式为 s c o r e s i j = q i ⋅ k j scores_{ij}=q_i\cdot k_j scoresij=qikj(点积操作)。
      • 通常,为了使分数的分布更合适,会对其进行缩放,常见的是除以 d k \sqrt{d_k} dk ,这里 d k = 256 d_k = 256 dk=256(键向量的维度),即 s c o r e s i j = q i ⋅ k j d k scores_{ij}=\frac{q_i\cdot k_j}{\sqrt{d_k}} scoresij=dk qikj
    • 注意力权重(Attention Weights)的计算
      • 通过对注意力分数 s c o r e s i j scores_{ij} scoresij应用Softmax函数来得到注意力权重 α i j \alpha_{ij} αij。公式为 α i j = e s c o r e s i j ∑ j e s c o r e s i j \alpha_{ij}=\frac{e^{scores_{ij}}}{\sum_{j}e^{scores_{ij}}} αij=jescoresijescoresij。这些权重表示每个位置对于位置 i i i的相对重要性。
    • 输出向量的计算
      • 最后,通过将注意力权重 α i j \alpha_{ij} αij与对应的所有位置的值向量 v j v_j vj进行加权求和来得到输出向量 z i z_i zi。公式为 z i = ∑ j α i j v j z_i=\sum_{j}\alpha_{ij}v_j zi=jαijvj
      • 这个输出向量 z i z_i zi还会经过o_proj进行线性变换(因为o_projbias=False),得到最终的输出向量 y i = o p r o j ( z i ) = W o z i y_i = o_{proj}(z_i)=W_oz_i yi=oproj(zi)=Wozi,其中 W o W_o Wo是权重矩阵,维度为 1536 × 1536 1536\times1536 1536×1536
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二分掌柜的

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值