Transformer推理结构简析(Decoder + MHA)

从FasterTransformer源码解读开始了解大模型(1.1)一个decoder-only的模型长啥样 对于一个没有接触过LLM的初学者来说,如果想要了解一个大模型的推理框架,首先应该知道大模型整个的工作原理是怎样的,知道transformers的结构是怎么生成词的,否则很容易会在读代码的过程中越读越迷糊,进入一种“我在哪里?我在看什么?这一段是做什么的”困惑状态,所以在此先推荐从来没有接触过相关知识的同学去读一下Attention is all you need的论文原文。 阅读详情

一、Transformer 基本结构

Transformer由encoder和decoder组成,其中:

  • encoder主要负责理解(understanding) The encoder’s role is to generate a rich representation (embedding) of the input sequence, which the decoder can use if needed

  • decoder主要负责生成(generation) The decoder outputs tokens one by one, where the current output depends on the previous tokens. This process is called auto-regressive generation

基本结构如下:

encoder结构和decoder结构基本一致(除了mask),所以主要看decoder即可:

每个核心的Block包含:

  • Layer Norm
  • Multi headed attention
  • A skip connection
  • Second layer Norm
  • Feed Forward network
  • Another skip connection

看下llama decoder部分代码,摘自transformers/models/llama/modeling_llama.py,整个forward过程和上图过程一模一样, 只是layer_norm换成了LlamaRMSNorm:

# 省略了一些不重要的code
class LlamaDecoderLayer(nn.Module):
    def __init__(self, config: LlamaConfig, layer_idx: int):
     ...
    def forward(
        self,
        hidden_states: torch.Tensor,
        attention_mask: Optional[torch.Tensor] = None,
        position_ids: Optional[torch.LongTensor] = None,
        past_key_value: Optional[Tuple[torch.Tensor]] = None,
        output_attentions: Optional[bool] = False,
        use_cache: Optional[bool] = False,
        cache_position: Optional[torch.LongTensor] = None,
        **kwargs,
    ) -> Tuple[torch.FloatTensor, Optional[Tuple[torch.FloatTensor, torch.FloatTensor]]]:

        # hidden_states [bsz, q_len, hidden_size]
        residual = hidden_states
        hidden_states = self.input_layernorm(hidden_states)

        # Self Attention 即MHA
        hidden_states, self_attn_weights, present_key_value = self.self_attn(
            hidden_states=hidden_states,
            attention_mask=attention_mask,
            position_ids=position_ids,
            past_key_value=past_key_value,
            output_attentions=output_attentions,
            use_cache=use_cache,
            cache_position=cache_position,
            **kwargs,
        )
        hidden_states = residual + hidden_states

        # Fully Connecte
        residual = hidden_states
        hidden_states = self.post_attention_layernorm(hidden_states)
        hidden_states = self.mlp(hidden_states)
        hidden_states = residual + hidden_states

        outputs = (hidden_states,)

        return outputs

上述代码展示的是标准的decoder过程,几个关键输入:

  • hidden_states [batch_size, seq_len, embed_dim] seq_len表示输入长度

  • attention mask的size为(batch_size, 1, query_sequence_length, key_sequence_length) 注意力掩码,实际使用的时候,PyTorch 会自动广播这个掩码到注意力权重矩阵的形状 [bsz, num_heads, q_len, kv_seq_len]。

  • position_ids or position_embeddings,位置id或者已经提前计算好的位置embedding

上述最核心的结构是其调用的self.self_attn,即是Multi-headed attention。


二、Multihead Attention

Multihead Attention,多头注意力,上述decoder过程中最核心的地方,同时也是算子优化发力的地方。要理解多头先从单头开始。

单个attention

即Scaled Dot-Product Attention,公式如下:

其中QKV的维度一致,比如这里都是(2,3):

那么QKV怎么得到的呢?通过输入embedding和WqWkWv相乘得到qkv,这里WqWkWv是可学习参数:

拆开合起来计算都是等价的,上述的X1和X2是拆开计算,但是组合起来为(2,4)维度,同样可以和WqWkWv进行矩阵乘

实际在decoder的计算中,会带入causal (or look-ahead) mask:

Causal mask 是为了确保模型在解码时不会关注未来的 token,这对于生成任务是必不可少的。通过这个掩码,模型只会依赖已经生成的 token,确保解码过程中是自回归的。

多个attention

实际中一般都是多个attention,和单个attention区别不大,下图右侧是多个attention的结构:

自注意力在多个头部之间并行应用,最后将结果连接在一起,我们输入(2,4)维度的X,分别和不同头的WqWkWv进行矩阵乘法得到每个头对应的QKV,然后QKV算出Z,再将所有Z合并和Wo相乘得到维度和X一致的Z:

实际中需要学习的权重为每个头的WqWkWv,同时也需要一个Wo,看一下llama中的实际计算过程:

class LlamaAttention(nn.Module):
    """Multi-headed attention from 'Attention Is All You Need' paper"""

    def __init__(self, config: LlamaConfig, layer_idx: Optional[int] = None):
        super().__init__()
        self.config = config
        self.layer_idx = layer_idx
        self.attention_dropout = config.attention_dropout
        self.hidden_size = config.hidden_size
        self.num_heads = config.num_attention_heads
        self.head_dim = self.hidden_size // self.num_heads
        self.num_key_value_heads = config.num_key_value_heads
        self.num_key_value_groups = self.num_heads // self.num_key_value_heads
        self.max_position_embeddings = config.max_position_embeddings
        self.rope_theta = config.rope_theta
        self.is_causal = True

        # 这行代码是一个检查条件,确保hidden_size能够被num_heads整除。
        # 在多头注意力(Multi-Head Attention, MHA)机制中,输入的hidden_size被分割成多个头,每个头处理输入的一个子集。
        # head_dim是每个头处理的维度大小,它由hidden_size除以num_heads得到。
        if (self.head_dim * self.num_heads) != self.hidden_size:
            raise ValueError(
                f"hidden_size must be divisible by num_heads (got `hidden_size`: {self.hidden_size}"
                f" and `num_heads`: {self.num_heads})."
            )

        # 需要学习更新的四个权重 WqWkWvWo
        self.q_proj = nn.Linear(self.hidden_size, self.num_heads * self.head_dim, bias=config.attention_bias)
        self.k_proj = nn.Linear(self.hidden_size, self.num_key_value_heads * self.head_dim, bias=config.attention_bias)
        self.v_proj = nn.Linear(self.hidden_size, self.num_key_value_heads * self.head_dim, bias=config.attention_bias)
        self.o_proj = nn.Linear(self.num_heads * self.head_dim, self.hidden_size, bias=config.attention_bias)
        self._init_rope()

    def forward(
        self,
        hidden_states: torch.Tensor,
        attention_mask: Optional[torch.Tensor] = None,
        position_ids: Optional[torch.LongTensor] = None,
        past_key_value: Optional[Cache] = None,
        output_attentions: bool = False,
        use_cache: bool = False,
        **kwargs,
    ) -> Tuple[torch.Tensor, Optional[torch.Tensor], Optional[Tuple[torch.Tensor]]]:

        bsz, q_len, _ = hidden_states.size()

        query_states = self.q_proj(hidden_states)
        key_states = self.k_proj(hidden_states)
        value_states = self.v_proj(hidden_states)

        query_states = query_states.view(bsz, q_len, self.num_heads, self.head_dim).transpose(1, 2)
        key_states = key_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2)
        value_states = value_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2)

        kv_seq_len = key_states.shape[-2]
        if past_key_value is not None:
            if self.layer_idx is None:
                raise ValueError(
                    f"The cache structure has changed since version v4.36. If you are using {self.__class__.__name__} "
                    "for auto-regressive decoding with k/v caching, please make sure to initialize the attention class "
                    "with a layer index."
                )
            kv_seq_len += past_key_value.get_usable_length(kv_seq_len, self.layer_idx)
        cos, sin = self.rotary_emb(value_states, seq_len=kv_seq_len)
        query_states, key_states = apply_rotary_pos_emb(query_states, key_states, cos, sin, position_ids)

        if past_key_value is not None:
            cache_kwargs = {"sin": sin, "cos": cos}  # Specific to RoPE models
            key_states, value_states = past_key_value.update(key_states, value_states, self.layer_idx, cache_kwargs)

        key_states = repeat_kv(key_states, self.num_key_value_groups)
        value_states = repeat_kv(value_states, self.num_key_value_groups)

        attn_weights = torch.matmul(query_states, key_states.transpose(2, 3)) / math.sqrt(self.head_dim)

        if attention_mask is not None:
            if attention_mask.size() != (bsz, 1, q_len, kv_seq_len):
                raise ValueError(
                    f"Attention mask should be of size {(bsz, 1, q_len, kv_seq_len)}, but is {attention_mask.size()}"
                )
            attn_weights = attn_weights + attention_mask

        # upcast attention to fp32
        attn_weights = nn.functional.softmax(attn_weights, dim=-1, dtype=torch.float32).to(query_states.dtype)
        attn_weights = nn.functional.dropout(attn_weights, p=self.attention_dropout, training=self.training)
        # (bsz, self.num_heads, q_len, self.head_dim)
        attn_output = torch.matmul(attn_weights, value_states)
        # (bsz, q_len, self.num_heads, self.head_dim)
        attn_output = attn_output.transpose(1, 2).contiguous()
        attn_output = attn_output.reshape(bsz, q_len, self.hidden_size)

        attn_output = self.o_proj(attn_output)

        return attn_output, attn_weights, past_key_value

上述的计算过程可以总结为以下几个步骤,假设输入张量hidden_states的维度为[batch_size, seq_length, hidden_size]。

在这里插入图片描述
在这里插入图片描述

这个过程实现了将输入通过多个注意力"头"并行处理的能力,每个"头"关注输入的不同部分,最终的输出是所有"头"输出的拼接,再经过一个线性变换。这种机制增强了模型的表达能力,使其能够从多个子空间同时捕获信息。

因为不用GQA,q_len 就是 seq_length 就是 kv_seq_len


三、MHA计算

实际的多头计算代码如下,这里是通过torch.matmul实现的:

 attn_weights = torch.matmul(query_states, key_states.transpose(2, 3)) / math.sqrt(self.head_dim)
  if attention_mask is not None:  # no matter the length, we just slice it
      causal_mask = attention_mask[:, :, :, : key_states.shape[-2]]
      attn_weights = attn_weights + causal_mask
  position_ids: Optional[torch.LongTensor] = None,
  # upcast attention to fp32
  attn_weights = nn.functional.softmax(attn_weights, dim=-1, dtype=torch.float32).to(query_states.dtype)
  attn_weights = nn.functional.dropout(attn_weights, p=self.attention_dropout, training=self.training)
  attn_output = torch.matmul(attn_weights, value_states)

上述代码中query_states和key_states的形状分别为[bsz, num_heads, q_len, head_dim]和[bsz, num_heads, kv_seq_len, head_dim]。matmul操作会自动在最后两个维度上进行矩阵乘法,并在前两个维度上进行广播。

应用注意力掩码attn_weights = attn_weights + causal_mask,causal_mask的形状可能是[1, 1, q_len, kv_seq_len]。PyTorch会自动将其广播到attn_weights的形状[bsz, num_heads, q_len, kv_seq_len]。

应用softmax和dropout,然后最后计算attn_output = torch.matmul(attn_weights, value_states),其中attn_weights的形状为[bsz, num_heads, q_len, kv_seq_len],value_states的形状为[bsz, num_heads, kv_seq_len, head_dim]。matmul操作会在最后两个维度上进行矩阵乘法,并在前两个维度上进行广播。这里attn_output的维度为bsz, num_heads, q_len, self.head_dim。


四、torch.matmul

多维矩阵乘法,支持多维和broadcast,比较复杂:

  • 如果两个输入张量都是一维张量,执行的是点积操作,返回一个标量
  • 如果两个输入张量都是二维张量,执行的是矩阵乘法,返回一个新的二维矩阵,这个操作就是常见的
  • 如果第一个张量是一维张量,第二个张量是二维张量,则会在第一张量的维度前面添加一个1(扩展为2维),然后进行矩阵乘法,计算完后会移除添加的维度
  • 如果第一个张量是二维张量,第二个张量是一维张量,则执行的是矩阵-向量乘法,返回一个一维张量
  • 当两个输入张量中有一个是多维的(N > 2),会执行批量矩阵乘法。在这种情况下,非矩阵的维度(批量维度)会被广播(broadcasted)。如果一个张量是一维,会对其进行维度扩展和移除

我们这里的多维数据 matmul() 乘法,可以认为该乘法使用使用两个参数的后两个维度来计算,其他的维度都可以认为是batch维度。

比如,输入张量的形状为 (j×1×n×n) 和 (k×n×n) 时,会输出形状为 (j×k×n×n) 的张量。

具体点,假设两个输入的维度分别是input (1000×500×99×11), other (500×11×99)那么我们可以认为torch.matmul(input, other, out=None) 乘法首先是进行后两位矩阵乘法得到(99×11)×(11×99)⇒(99×99) ,然后分析两个参数的batch size分别是 (1000×500)和 500, 可以广播成为 (1000×500), 因此最终输出的维度是(1000×500×99×99)。

计算QK点积的时候:

attn_weights = torch.matmul(query_states, key_states.transpose(2, 3)) / math.sqrt(self.head_dim)

query_states的形状为[bsz, num_heads, q_len, head_dim],key_states.transpose(2, 3)的形状为[bsz, num_heads, head_dim, kv_seq_len]。matmul操作会在最后两个维度上进行矩阵乘法,得到形状为[bsz, num_heads, q_len, kv_seq_len]的注意力权重。

计算注意力输出:

attn_output = torch.matmul(attn_weights, value_states)   

这里使用torch.matmul将注意力权重与值(value)相乘。attn_weights的形状为[bsz, num_heads, q_len, kv_seq_len],value_states的形状为[bsz, num_heads, kv_seq_len, head_dim]。matmul操作会在最后两个维度上进行矩阵乘法,得到形状为[bsz, num_heads, q_len, head_dim]的注意力输出。

因为我们不用GQA,q_len 就是 kv_seq_len


​

如何学习大模型

现在社会上大模型越来越普及了,已经有很多人都想往这里面扎,但是却找不到适合的方法去学习。

作为一名资深码农,初入大模型时也吃了很多亏,踩了无数坑。现在我想把我的经验和知识分享给你们,帮助你们学习AI大模型,能够解决你们学习中的困难。

我已将重要的AI大模型资料包括市面上AI大模型各大白皮书、AGI大模型系统学习路线、AI大模型视频教程、实战学习,等录播视频免费分享出来,需要的小伙伴可以扫取。

一、AGI大模型系统学习路线

很多人学习大模型的时候没有方向,东学一点西学一点,像只无头苍蝇乱撞,我下面分享的这个学习路线希望能够帮助到你们学习AI大模型。

在这里插入图片描述

二、AI大模型视频教程

在这里插入图片描述

三、AI大模型各大学习书籍

在这里插入图片描述

四、AI大模型各大场景实战案例

在这里插入图片描述

五、结束语

学习AI大模型是当前科技发展的趋势,它不仅能够为我们提供更多的机会和挑战,还能够让我们更好地理解和应用人工智能技术。通过学习AI大模型,我们可以深入了解深度学习、神经网络等核心概念,并将其应用于自然语言处理、计算机视觉、语音识别等领域。同时,掌握AI大模型还能够为我们的职业发展增添竞争力,成为未来技术领域的领导者。

再者,学习AI大模型也能为我们自己创造更多的价值,提供更多的岗位以及副业创收,让自己的生活更上一层楼。

因此,学习AI大模型是一项有前景且值得投入的时间和精力的重要选择。

Transformer工程实战:从模块组装到训练稳定与推理优化 Transformer并非仅是Self-Attention与Positional Encoding的理论组合,而是一个涉及结构耦合、数值稳定性、缓存机制与梯度流控制的系统性工程体系。其核心原理在于多头注意力建模长程依赖、LayerNorm与残差连接协同保障深层梯度传播、causal mask强制单向生成约束。技术价值体现在可复现性、训练鲁棒性与推理低延迟三重能力上,广泛应用于文本生成、机器翻译、代码补全等场景。本文聚焦真实落地中的模块堆叠逻辑、Decoder双注意力实现、KV缓存机制及Flash Atten 阅读详情

相关推荐

从零用 NumPy 实现单层 Transformer 解码器(Decoder-Only)

本文通过200行NumPy代码实现了一个单层Decoder-Only Transformer架构,涵盖了大语言模型的核心组件。主要内容包括:1)采用正弦位置编码和Pre-LN归一化;2)实现带因果掩码的多头自注意力机制,确保当前token无法看到未来信息;3)构建包含GELU激活的前馈网络;4)通过残差连接提升模型训练稳定性;5)最后通过词表投影预测下一个token。代码完整实现了从输入处理到自回归生成的全流程,为理解Transformer工作原理提供了简洁而实用的参考实现。

qq_47564006的博客 1422

大模型面试准备(五):图解 Transformer 最关键模块 MHA

节前,我们组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学,针对大模型技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何备战、面试常考点分享等热门话题进行了深入的讨论。合集在这里:《大模型面试宝典》(2024版) 正式发布!Transformer 原始论文中的模型结构如下图所示: 上一篇文章讲解了 Transformer 的关键模块 Positional Encoding(大家可以自行翻阅),本篇文章讲解一下 Transformer 的最重要模块 Multi-H

2201_75499313的博客 1830

大模型面经 | 春招、秋招算法面试常考八股文附答案(一)

大模型面经 | 春招、秋招算法面试常考八股文附答案(一),非常详细,建议收藏!!

皮先生的博客 1055

Transformer为什么要引入MHA?

通过 LSH 的方法近似的快速找到最大的 topk 的值。GQA 提供了 MHA 到 MQA 的自然过渡,当 g=h 时就是 MHA,g=1 时就是 MQA,当 1<g<h1< <ℎ,它只将 KV Cache 压缩到 g/h,压缩率不如 MQA,但同时也提供了更大的自由度,效果上更有保证。硬件层面上,比如现在已在使用的 HBM(高速带宽内存)提高读取速度,或者更彻底些,抛弃冯诺依曼架构,改变计算单元从内存读数据的方式,不再以计算单元为中心,而以存储为中心,做成计算和存储一体的“存内计算”。

具身机器人和通用AI 855

transformer各层的输入输出

层/组件输入形状输出形状核心功能[B, S][B, S, D]将离散token转为连续向量[B, S, D]注入位置信息[B, S, D]计算输入序列内部的上下文关系[B, S, D]非线性变换,特征加工[B, T, D]计算已生成输出序列的内部关系[B, T, D]让解码器关注编码器信息[B, T, D]非线性变换,特征加工[B, T, D][B, T, V]产生下一个词的概率分布关键记忆点维度守恒: 除了最开始的Embedding和最后的输出层,所有核心层的输入输出维度都是。信息流。

hliyuxin的专栏 783

Transformer-Attention优化:Multi-Query Attention(更高效的推理)

显存占用和推理耗时减小是显而易见的,因为参数量减少了。至于效果变化得很小,只能说多头attention机制中的多头其实并不是一定,之前的bert模型有人探索了改变head头数目,也会保持效果变化不大。在大模型这,可能只需要有不同的head采用不同的query向量,kv一样来保证每个头提取到不同的特征就够了。什么时候使用MQA有效呢?1、采用attention的模型,模型规模越大,那么收益就约明显。

u013250861的博客 722

大模型中的注意力机制——MHA、GQA、MQA

GQA(Grouped-Query Attention,GQA: Training Generalized Multi-Query Transformer Models from Multi-Head Checkpoints)是分组查询注意力,GQA将查询头分成G组,每个组共享一个Key 和 Value 矩阵。与MHA不同的,MQA 让所有的头之间共享同一份 Key 和 Value 矩阵,每个头只单独保留了一份 Query 参数,从而大大减少 Key 和 Value 矩阵的参数量。

qq_42714262的博客 1万+

1.28寸圆屏LCD驱动开发:GC9A01与RT-Thread嵌入式实现

圆形TFT-LCD是一种面向可穿戴、IoT终端的紧凑型人机交互显示技术,其核心在于SPI/QSPI接口时序控制与GRAM内存映射原理。通过驱动芯片(如GC9A01)完成电源管理、伽马校正和MADCTL方向配置,可实现低功耗、高刷新率的图形渲染。该技术显著提升嵌入式设备的UI表现力与空间利用率,在智能手环、传感器节点、微型HMI等资源受限场景中具备突出工程价值。本文围绕1.28寸圆屏LCD模块,详解硬件接口规范、RT-Thread下QSPI驱动架构及Bresenham算法优化实践。

weixin_42599908的博客 161

大模型 | Transformer推理结构简析(Decoder + MHA)

AI大模型作为人工智能领域的重要技术突破,正成为推动各行各业创新和转型的关键力量。抓住AI大模型的风口,掌握AI大模型的知识和技能将变得越来越重要。学习AI大模型是一个系统的过程,需要从基础开始,逐步深入到更高级的技术。这里给大家精心整理了一份全面的AI大模型学习资源,包括:AI大模型全套学习路线图(从入门到实战)、精品AI大模型学习书籍手册、视频教程、实战学习、面试题等,资料免费分享!

老皮的博客 2339

VoIP概述

VoIP统一通信与VoIPVoIP与传统电话比较VoIP各项产品设备的类型及应用 统一通信与VoIP 统一通信指的是把计算机与传统通信技术统一成一体的新通信模式,融合计算机网络与传统通信网络在一个网络平台上,实现电话、传真、数据传输、音视频会议、呼叫中心、即时通信等众多应用服务 VoIP又称IP电话或IP网络电话,是Voice Over IP的缩写,这种技术通过对语音信号进行编码数字化,压缩处理成压缩帧,然后转换成为IP数据包在TCP/IP网络上进行传输,从而达到了在IP网络上进行语音通信目的 VoIP与传

kaminao的博客 4366

关于获取CISP-PTE一些避坑经历

考场内是不允许携带外设键盘的,现场会至少有一个360安全专业人员监考.所有人电脑都会提前装一个奇安信的一个考试exe,刚开始的时候会让你连接一个WIFI,我们将会通过WIFI进行做题,做题期间你的电脑将被全程监控并且一些退出快捷键也是全部锁死(有点像勒索病毒那种界面),想要重启必须直接拔电源。中途可以上厕所,需要监考官陪同

6323

大模型 Transformer推理结构简析(Decoder + MHA)_transformer推理过程

AI大模型作为人工智能领域的重要技术突破,正成为推动各行各业创新和转型的关键力量。抓住AI大模型的风口,掌握AI大模型的知识和技能将变得越来越重要。可能大家都想学习AI大模型技术,也想通过这项技能真正达到升职加薪,就业或是副业的目的,但是不知道该如何开始学习_,因为网上的资料太多太杂乱了,如果不能系统的学习就相当于是白学。为了帮助大家打破壁垒,快速了解大模型核心技术原理,学习相关大模型技术。从原理出发真正入局大模型。在这里我和MoPaaS魔泊云联合梳理打造了系统大模型学习脉络,这份LLM大模型资料。

python123456_的博客 1238

避坑指南:Docker部署PaddleOCR-VL服务时,关于flash-attn安装、端口映射和模型加载的那些坑

本文详细记录了Docker部署PaddleOCR-VL服务时遇到的常见问题及解决方案,包括flash-attn安装、GPU兼容性检查、容器生命周期管理、模型加载优化等关键环节。特别针对不同GPU架构提供了flash-attn的安装策略,并分享了端口映射、配置文件处理等实用技巧,帮助开发者高效避坑。

weixin_33686714的博客 464

Transformer详解,从输入到输出,从训练到推理一一解读

输入训练:Decoder 输入真实前缀(Teacher Forcing)。推理:Decoder 输入上一步自己预测的结果(自回归)。并行性训练:整句目标已知,可用mask并行计算所有位置。推理:必须逐步生成,通常是顺序计算。

zrlblution的博客 1609

自动驾驶控制算法——MPC控制算法

自动驾驶MPC控制算法摘要 模型预测控制(MPC)是一种基于系统预测模型的先进控制算法,通过滚动优化方式求解最优控制输入。其核心流程包括:1)使用数学模型预测未来系统状态;2)定义优化目标函数衡量预测误差;3)求解满足约束的最优控制序列;4)仅执行第一步控制并重复该过程。 相比传统PID控制,MPC具有预测未来、多步优化、显式处理约束等优势,特别适合自动驾驶中对安全性要求高的场景,如轨迹跟踪、车道保持、联合纵横向控制、自动泊车和动态避障等。MPC通过状态空间模型预测系统行为,在每个控制周期计算未来N步的控制

swaggytiger的博客 7926

树莓派4B网线直连Windows全流程:从IP查询到SSH登录避坑指南

本文提供了一份详细的树莓派4B通过网线直连Windows电脑的实战指南。核心步骤包括配置Windows网络共享、查询树莓派IP地址以及通过SSH进行安全登录与初始配置。文章深入解析了直连的网络原理,并重点分享了使用CMD命令和工具定位IP、避免常见错误的避坑技巧,帮助用户在没有显示器或路由器的环境下快速完成树莓派初始化。

grape的博客 1081

一文彻底搞懂Transformer模型的Decoder结构与计算流程

Transformer模型的Decoder部分采用自回归方式生成输出序列,其核心结构由多个Decoder Block堆叠而成。每个Block包含三个关键子层:掩码自注意力层(仅关注历史Token)、交叉注意力层(融合Encoder语义信息)和前馈神经网络。Decoder接收两个输入:已生成Token序列(用于掩码自注意力)和Encoder输出的语义向量(用于交叉注意力)。通过线性层和Softmax将最终输出转换为词表概率分布,实现逐Token预测。特别地,训练时采用三角掩码矩阵确保模型仅依赖历史信息,而推理

2401_85725028的博客 486

YOLOv11改进 | 模型知识蒸馏篇 | 利用模型蒸馏改进YOLOv11进行无损涨点 | 离线蒸馏(附代码 + 完整文件 + 解析教程)

这篇文章给大家带来的最新改进是模型的蒸馏,利用教师模型指导学生模型从而进行模型的涨点,本文的内容不仅可以用于论文中,在目前的绝大多数的工作中模型蒸馏是一项非常重要的技术,所以大家可以仔细学习一下本文的内容,本文从YOLOv8的项目文件为例,进行详细的修改教程,文章内包括完整的修改教程,针对小白我出了视频修改教程,如果你还不会我提供了修改后的文件大家直接运行即可,所以说不用担心不会适用!模型蒸馏真正的无损涨点,蒸馏你只看这一篇文章就足够了!欢迎大家订阅我的专栏一起学习YOLO!

Snu77的博客 4328

Transformer 22. Gemma 1 架构详解:Decoder-only、GeGLU、RoPE 与每一步计算

Gemma 1模型架构解析 Gemma 1是基于Decoder Only Transformer架构的开源语言模型,采用现代LLM设计范式,包括RMSNorm、RoPE位置编码和GeGLU前馈网络等关键技术。模型提供2B和7B两种规模,主要区别在于: 2B版本使用MQA(多头查询注意力)以提升推理效率 7B版本采用标准MHA(多头注意力) 均使用GeGLU替代传统FFN中的ReLU激活 核心流程: 输入文本通过SentencePiece分词为子词序列(词表大小256128) 经过嵌入层和RoPE位置编码后输

破浪会有时的博客 600

高频网络协议与编程IO相关面试基本问题和知识点整理

网络IO相关基本高频面试基本问题和知识点整合

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 173万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Encoder-Decoder架构详解

本文详细解析了Encoder-Decoder架构,这是Transformer的核心框架和序列到序列任务的标准模型。该架构由编码器和解码器两部分组成:编码器将输入序列转换为连续表示,解码器基于该表示生成输出序列。文章通过Python代码示例展示了Encoder层的实现细节,包括多头自注意力机制和前馈神经网络等关键组件,并配以架构流程图说明数据流向。典型应用场景涵盖机器翻译、文本摘要、对话系统等多种任务,具有输入输出长度可变、支持并行训练等特点。

海绵宝宝de派小星的博客 10万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

6.1 大模型结构:从 Transformer 到 MoE

每次前向推理会激活全部参数。典型的 Transformer 就是 Dense:每层的注意力与 FFN 都对所有 token 执行同样的计算路径。

qq_68188306的博客 976

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

收藏 | 轻松入门:一文读懂 MHA 多头注意力机制,大模型必备基础能力!

MHA 的本质,是让模型从多个子空间并行建模上下文关系。在训练阶段,MHA 是 Transformer 表达能力的关键来源之一。在推理阶段,MHA 同时也是 KV Cache、显存占用和访存瓶颈的核心来源。所以,理解 MHA,不只是理解一个公式,而是在理解大模型为什么能“看懂上下文”,以及它为什么会在长序列推理时变慢。

m0_48891301的博客 1152

Transformer 大模型架构深度解析(6)Attention 和 FFN 模型结构的核心优化方向概览

也就是说,围绕该矩阵的计算量和显存占用量(Scaled、Masked、Softmax、乘 V 加权融合计算等等),会随 n 呈平方级增长,例如:如果 seq_len 变成原来的 2 倍,显存占用量就是原来的 4 倍,计算时间也是原来的 4 倍。但实际上,Child 等人(2019)的研究发现,在训练好的 Transformer 模型中,注意力矩阵往往是稀疏的,这意味着并不是每个 token 都需要关注其他所有 token,每个 token 只关注非常有限个其他 token。利用分页技术减少显存碎片化问题。

烟云的计算 407

【模型架构篇04】Transformer架构精讲:Encoder-Decoder全拆解

本文深入解析Transformer架构的发展与演变,重点比较了Encoder-Decoder、Encoder-only和Decoder-only三种主流架构变体。文章指出,2026年Decoder-only架构已成为主导范式(如GPT、LLaMA等),因其具备缩放效率高、生成即理解、统一任务接口和工程友好等优势。原始Transformer的Encoder-Decoder设计虽然开创性,但逐渐被更简洁的Decoder-only替代。Encoder-only架构(如BERT)仍在小众领域(如文本理解)发挥作用。

weixin_54908067的博客 652
上一篇: g1:基于 Llama,用提示工程实现类似 o1 的深度推理
下一篇: Phi3.5和Llama3.1在构建知识图谱应用中哪个更好用
爱喝白开水a
博客等级 码龄3年 6793粉丝 763原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值