news 2026/8/2 10:24:38

图解Transformer:从自注意力机制到编码器-解码器架构的完整拆解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
图解Transformer:从自注意力机制到编码器-解码器架构的完整拆解

1. 项目概述:为什么我们需要“图解”Transformer?

如果你在2017年之后接触过自然语言处理,那么“Transformer”这个词一定像空气一样无处不在。从最初的机器翻译,到后来的BERT、GPT系列,再到如今多模态的CLIP、DALL-E,Transformer架构几乎重塑了整个AI领域。但说实话,我第一次读到那篇著名的论文《Attention Is All You Need》时,感觉就像在看天书。满篇的矩阵运算、多头注意力、前馈网络,公式一个接一个,虽然逻辑严密,但缺乏一种直观的“画面感”。

这正是我做这个“图解版”讲解的初衷。模型再复杂,其核心思想往往可以用清晰的图像和流程串联起来。我不打算重复论文里那些严谨的数学推导(网上已经有很多了),而是想扮演一个“拆解师”的角色,用大量精心绘制的示意图和类比,带你一步步“走进”Transformer的内部,看清楚数据究竟是如何流动的,每个模块到底在“想”什么。无论你是刚入门的新手,还是想巩固理解的从业者,我希望这篇超过5000字的详解,能成为你手边最直观的那份“电路图”。

简单来说,这篇内容能帮你解决几个核心问题:Transformer到底在解决什么之前模型的痛点?自注意力机制为什么是核心,它如何让模型“看懂”上下文?编码器和解码器这两个大部件,内部是如何精密协作的?以及,我们如何从零开始,在脑海中构建出这个模型的完整动态运行图景。准备好了吗?我们这就开始这场从宏观到微观的拆解之旅。

2. 核心思路拆解:从RNN的困境到“注意力”的革命

在Transformer出现之前,自然语言处理的主流是循环神经网络(RNN)及其变体LSTM和GRU。它们按顺序处理输入序列,上一个时间步的输出会作为下一个时间步的输入的一部分。这很像我们人类阅读,一个字一个字看下去,同时心里记着前面看过的内容。

2.1 RNN/LSTM的固有瓶颈

RNN系列模型有两个致命的弱点,正是Transformer着力解决的靶心。

第一个弱点是难以并行化。因为计算必须是顺序的,要算第10个词,必须先算完前9个词。这在GPU这种擅长并行计算的硬件上,无疑是巨大的效率浪费。训练一个长文本模型,时间成本极高。

第二个弱点是长距离依赖问题。尽管LSTM用“门”机制改善了短期记忆,但对于非常长的序列(比如一篇长文章),开头的信息在传递到末尾时,已经变得非常微弱,几乎被“遗忘”了。想象一下,让你读一篇5000字的文章,然后回答一个关于第一段细节的问题,如果没有刻意记忆,你也会感到困难。

注意:这里说的“并行”是指训练时模型计算的并行。RNN在推理(预测下一个词)时,由于其自回归特性,本质上仍是串行的,这一点Transformer的解码器也一样。但Transformer在训练时,编码器和解码器的注意力计算都可以完全并行,这是其速度优势的关键。

2.2 核心救星:自注意力机制

Transformer论文的标题“Attention Is All You Need”可谓霸气十足。它彻底抛弃了循环结构,完全依赖一种名为“自注意力”的机制来建立序列中所有元素两两之间的关系。

你可以把自注意力想象成一个高效的“信息聚会”。序列中的每个词(比如“苹果”)都化身为一个参与者。在聚会上,这个“苹果”会做三件事:

  1. 自我介绍(Query):大声说出自己的核心特征(“我是一种水果”)。
  2. 倾听他人(Key):认真听其他每个参与者(“公司”、“手机”、“吃”)的自我介绍(Key)。
  3. 收集信息(Value):根据自己(Query)和其他人(Key)的相似度,决定从每个人那里收集多少信息(Value)。和“公司”的相似度可能让它收集一些“品牌”信息,和“吃”的相似度让它收集“动作”信息。

最终,“苹果”这个词的表征,不再是它孤立的词向量,而是融合了聚会中所有相关信息的、全新的、上下文相关的表征。关键是,这个聚会中所有参与者的“自我介绍、倾听、收集”这三个动作,都可以通过矩阵运算同时完成,完美解决了RNN的并行化问题。并且,无论“苹果”和序列中哪个词距离多远,计算相似度的代价都是一样的,彻底解决了长距离依赖问题。

2.3 Transformer的总体蓝图

理解了自注意力这个核心发动机后,我们来看整台“机器”的蓝图。Transformer采用经典的编码器-解码器架构,但内部全部由自注意力和前馈网络堆叠而成。

  • 编码器:负责阅读理解输入序列(比如一句英文)。它由N个(原论文N=6)完全相同的层堆叠而成。每一层都包含一个多头自注意力子层和一个前馈神经网络子层,每个子层外面都包裹着“残差连接”和“层归一化”。编码器的目标是提取输入序列丰富、双向的上下文信息,为每个输入词输出一个“深知上下文”的编码。
  • 解码器:负责根据编码器的输出和已生成的部分结果,自回归地生成目标序列(比如对应的中文)。它同样由N个相同的层堆叠。每一层包含三个子层:第一个是掩码多头自注意力子层(只关注已生成的词),第二个是多头交叉注意力子层(关注编码器的输出),第三个是前馈网络子层。同样,每个子层都有残差和归一化。解码器的目标是像“填空”一样,一步步生成合理的下一个词。

输入输出还需要嵌入层将词转为向量,以及位置编码来注入序列的顺序信息。下面,我们就深入每个核心部件,用图解的方式看个究竟。

3. 核心部件深度图解与原理剖析

这一部分,我们将把Transformer大卸八块,对每个核心部件进行“静态解剖”,理解其结构和数学原理。这是理解后续动态数据流的基础。

3.1 输入处理:词嵌入与位置编码

Transformer本身没有循环或卷积结构,因此它天生无法感知词的顺序。“我爱AI”和“AI爱我”的词袋表示是一样的。为了注入顺序信息,必须显式地告诉模型每个词的位置。

词嵌入:和所有深度学习NLP模型一样,首先通过一个查找表,将每个输入词(如“love”)映射为一个高维向量(比如512维)。这个向量通常是在大规模语料上预训练好的,包含了丰富的语义信息。

位置编码:这是Transformer的一个精巧设计。它为序列中的每个位置(第1个词,第2个词...)也计算一个唯一的、与词嵌入同维度的向量。然后,将这个位置向量直接加到词嵌入向量上,作为编码器的实际输入。

原论文使用了一组正弦和余弦函数来生成位置编码:PE(pos, 2i) = sin(pos / 10000^(2i/d_model))PE(pos, 2i+1) = cos(pos / 10000^(2i/d_model))其中,pos是位置,i是维度索引,d_model是模型维度(如512)。

为什么用三角函数?因为它有一个美妙的性质:对于固定的偏移量k,PE(pos+k)可以表示为PE(pos)的线性函数。这意味着模型可以相对容易地学习到“位置之间的相对关系”,比如“隔了5个词”这种模式。在示意图中,我们会将位置编码描绘成一组叠加在词向量上的、带有不同频率波纹的“条形码”。

实操心得:现在许多模型(如BERT)也使用可学习的位置编码,即把位置编码也作为模型参数进行训练。正弦编码的优点是理论上有更好的外推性(处理比训练时更长的序列),而可学习编码在训练数据长度内可能更灵活。对于大多数应用,直接使用框架(如Hugging Face Transformers)提供的默认方式即可,无需纠结。

3.2 心脏部件:缩放点积注意力机制图解

这是所有“注意力”的基石。我们以单头注意力为例,用图解其计算流程。

第一步:创建Q, K, V矩阵。假设输入序列是“Thinking Machines”,经过嵌入和位置编码后,我们得到两个向量x1(Thinking)和x2(Machines)。对于自注意力,输入是什么,我们就用它来生成Q、K、V。通过三个不同的线性变换矩阵W^QW^KW^V,我们分别计算:q1 = x1 * W^Q,k1 = x1 * W^K,v1 = x1 * W^Vq2 = x2 * W^K,k2 = x2 * W^K,v2 = x2 * W^V这样,每个词都得到了自己的Query、Key、Value向量。我们可以将整个序列的向量堆叠成矩阵QKV

第二步:计算注意力分数。注意力分数衡量的是词与词之间的相关性。计算方法是QK的点积:分数 = Q * K^T。 在我们的例子中,会得到一个2x2的分数矩阵:

  • 第1行第1列:q1k1的点积(Thinking对自身的关注度)
  • 第1行第2列:q1k2的点积(Thinking对Machines的关注度)
  • 第2行第1列:q2k1的点积(Machines对Thinking的关注度)
  • 第2行第2列:q2k2的点积(Machines对自身的关注度)

第三步:缩放与Softmax。点积的结果可能会随着向量维度d_k的增大而变得非常大,将Softmax函数推向梯度极小的区域。因此,将分数除以sqrt(d_k)进行缩放,稳定梯度。然后,对每一行应用Softmax函数,使得该行所有分数之和为1,转化为概率分布形式的“注意力权重”。此时,每一行表示一个词(Query)对所有词(Key)的关注程度。

第四步:加权求和输出。将上一步得到的注意力权重矩阵,与V矩阵相乘:输出 = Softmax(QK^T / sqrt(d_k)) * V。 对于“Thinking”这个词(第一行),其最终的输出向量z1= (Thinking对自身的权重 *v1) + (Thinking对Machines的权重 *v2)。这个z1不再是原始的“Thinking”向量,而是融入了“Machines”信息的、新的上下文向量。

整个过程的图解可以清晰地展示数据从XQ/K/V,再到分数矩阵、权重矩阵,最后汇聚成输出Z的流动路径。关键要理解,输出Z的每一行,都是V的加权和,权重由对应的Query和所有Key的相似度动态决定。

3.3 多头注意力:并行化的“专家委员会”

只用一套W^Q, W^K, W^V矩阵做一次注意力,称为一个“头”。这就像只从一个角度(比如语法)去理解词之间的关系。Transformer采用了“多头”机制,即同时使用多套不同的W^Q, W^K, W^V矩阵(原论文是8个头),将模型维度d_model(如512)分割成h份(8份,每份64维)。

操作流程如下:

  1. 线性投影到低维:输入的X分别经过8套不同的线性层,得到8组Q_i, K_i, V_i,每组维度是d_model/h
  2. 并行计算缩放点积注意力:8组(Q_i, K_i, V_i)独立进行上一节描述的注意力计算,得到8个输出head_i,每个维度是d_model/h
  3. 拼接:将8个head_i在特征维度上拼接起来,得到一个d_model维的长向量。
  4. 线性投影:最后通过一个可学习的线性层W^O,将拼接后的向量映射回d_model维度,作为多头注意力的最终输出。

为什么需要多头?类比一个专家委员会。每个注意力头可以学习到不同类型的依赖关系。比如在翻译“The animal didn't cross the street because it was too tired”时,一个头可能专门学习“it”和“animal”之间的指代关系(语义),另一个头可能学习“didn't”和“cross”之间的否定修饰关系(语法)。多头机制让模型能够在不同的表示子空间里共同关注来自不同位置的信息,极大地增强了模型的表征能力。图解时,我们会画出并行的多个“注意力头”计算流,最后汇聚到一条主线上。

3.4 前馈网络与残差连接:稳定训练的基石

注意力层负责聚合信息,而前馈网络则负责对聚合后的信息进行非线性变换和加工。它是一个简单的两层全连接网络,中间有一个ReLU激活函数:FFN(x) = max(0, xW1 + b1)W2 + b2值得注意的是,这个FFN对序列中的每个位置是独立、相同地应用的。你可以把它理解为对每个词的“个人深度思考”,在注意力交互之后,进一步提炼特征。

残差连接与层归一化是让如此深的网络(如12层、24层)能够成功训练的关键技术。它们被应用在每一个子层(自注意力、FFN)周围。

  • 残差连接:将子层的输入x直接加到子层的输出F(x)上,即输出 = LayerNorm(x + F(x))。这创建了一条从输入直达输出的“高速公路”,使得梯度在反向传播时可以直接流过,有效缓解了深层网络的梯度消失问题。
  • 层归一化:对每个样本的所有特征维度进行归一化(与批归一化对整个批次进行归一化不同)。它稳定了每层的输入分布,加速训练收敛。在Transformer中,归一化发生在残差相加之后。

在流程图中,我们会清晰地画出“输入 -> 子层计算 -> 与输入相加 -> 层归一化 -> 输出”这条数据通路,这是Transformer层级间稳定的核心。

4. 编码器与解码器的动态协作流程

理解了静态部件后,我们现在把时间线拉上,看编码器和解码器在训练和推理时,数据是如何动态流动的。这是将图解从“零件图”升级到“装配图”和“运行图”的关键。

4.1 编码器堆栈的完整前向传播

假设我们的输入序列是“I love NLP”。经过嵌入和位置编码后,我们得到一个序列矩阵X,形状为[序列长度, d_model]

第一层编码器接收X

  1. 进入多头自注意力子层X自己生成Q, K, V,计算自注意力。对于“love”这个词,它的输出向量z_love会包含来自“I”和“NLP”的信息。比如,它可能从“I”那里获得了“主语执行动作”的信息,从“NLP”那里获得了“动作对象”的信息。
  2. 经过残差连接和层归一化,输出更稳定的特征。
  3. 进入前馈网络子层,对每个位置的特征进行独立变换,可能进一步强化“love”作为动词的核心语义。
  4. 再次经过残差连接和层归一化,输出第一层的最终结果,我们记为E1

E1作为输入,送入第二层编码器,重复上述过程。经过6层(假设N=6)这样的处理,我们得到编码器的最终输出EE的每一行(对应一个输入词)都是一个深度融合了整个输入序列所有词信息的、强大的上下文表征。E将被送给解码器的每一层使用。

4.2 解码器堆栈的生成过程(以推理为例)

解码器的工作是自回归的,即一个一个词地生成。假设我们要将“I love NLP”翻译成中文“我 热爱 自然语言处理”。在推理时,解码器一开始只看到起始符<s>

第一步:生成第一个词“我”。

  1. 解码器输入目前只有<s>(经过嵌入和位置编码)。进入第一层解码器。
  2. 掩码多头自注意力子层:这里使用掩码。因为当前序列只有<s>,我们不允许它“看到”未来的词(未来词还没生成)。掩码通常是一个上三角矩阵,将未来位置的注意力分数设置为负无穷,这样Softmax后权重就为0。<s>的注意力只在自己身上。
  3. 残差连接和层归一化。
  4. 多头交叉注意力子层:这是解码器独有的。它的Q来自上一步的输出(即<s>的表征),而KV来自编码器的最终输出E。这意味着,解码器在思考如何生成第一个词时,会主动去“询问”编码器:“根据整个英文句子‘I love NLP’,第一个中文词应该是什么?”注意力机制会计算<s>的Query与编码器输出E中每个Key(对应“I”,“love”,“NLP”)的相似度,然后加权求和E的Value,得到一个融合了源语言信息的上下文向量。
  5. 残差连接和层归一化。
  6. 经过前馈网络子层和最后的残差连接与归一化,得到第一层解码器的输出。这个输出经过6层解码器处理后,会通过一个线性层(词表大小)和Softmax,得到下一个词的概率分布。我们选择概率最高的“我”作为输出。

第二步:生成第二个词“热爱”。

  1. 解码器输入变为<s> 我
  2. 掩码自注意力中,“我”可以关注<s>和它自己,但不能关注未来的词。
  3. 交叉注意力中,“我”的Query会再次结合编码器输出E,思考“在已经生成了‘我’的情况下,根据源句子,下一个词是什么?”
  4. 最终输出概率分布,选出“热爱”。

第三步及之后:重复此过程,将已生成的序列(<s> 我 热爱)作为输入,生成下一个词,直到生成结束符</s>

这个动态过程清晰地展示了信息流:源序列信息通过编码器浓缩到E中;解码器在生成每个词时,先通过掩码自注意力整合已生成目标序列的内部信息,再通过交叉注意力从E中精准提取相关的源语言信息,二者结合,做出最佳预测。

4.3 训练与推理的关键差异

理解动态流程,必须分清训练和推理,它们的数据流有本质不同。

训练阶段(Teacher Forcing)

  • 编码器:接收完整的源语言序列(如“I love NLP”)。
  • 解码器:接收完整的目标语言序列,但会做右移掩码。例如,输入是<s> 我 热爱 自然语言处理,期望输出是我 热爱 自然语言处理 </s>。在计算第t个位置的损失时,解码器只能看到<s>到第t-1个词(通过掩码实现),然后预测第t个词。这样,所有位置的预测都可以并行计算,因为“标准答案”(完整目标序列)是已知的。交叉注意力的K, V来自编码器对完整源句的输出。

推理阶段(自回归)

  • 如4.2节所述,解码器只能串行工作。生成第t个词时,输入是<s>和已生成的前t-1个词。每一步都需要重新运行解码器。
  • 为了加速,通常会使用**缓存(KV Cache)**技术。因为对于已经生成的词,其对应的KeyValue向量在每一层的计算中是固定的。在生成新词时,可以将之前所有词的K, V缓存起来,新词只需要计算自己的Q与缓存的所有K计算注意力,从而避免大量重复计算。

实操心得:理解“Teacher Forcing”是理解Transformer训练效率的关键。它通过提供完整目标序列和掩码,在训练时“欺骗”解码器,使其能够并行计算所有位置的输出,极大提升训练速度。而在推理时,模型必须面对真实的、只有历史信息的序列,这就是自回归生成。

5. 关键问题、实战技巧与扩展思考

掌握了核心原理和流程,我们还需要面对实际应用中的具体问题。这部分分享一些从实践中来的经验和思考。

5.1 位置编码外推与长度限制问题

Transformer的一个实际限制是处理序列的长度。训练时模型只见过固定长度(如512)的位置编码,当推理时遇到更长的文本,直接使用训练好的模型效果会下降。

常见解决方案:

  1. 滑动窗口/分块处理:将长文本切分成多个不超过模型最大长度的块,分别处理。但这会破坏块之间的长距离依赖。
  2. 层次化处理:先对句子或段落编码,再对这些句/段编码进行整合。
  3. 改进的位置编码
    • 相对位置编码:不再给每个绝对位置一个编码,而是建模词与词之间的相对距离(如距离为k时有一个可学习的嵌入)。这在T5、DeBERTa等模型中广泛应用,外推性更好。
    • 旋转位置编码:通过旋转矩阵将相对位置信息融入注意力计算,是LLaMA、GPT-NeoX等模型的选择,在长文本上表现优异。
    • 线性插值/外推:对训练好的位置编码进行数学上的拉伸,以适应更长的序列,是一种简单的后处理技巧。

注意事项:当你使用预训练模型(如BERT)处理长文档时,首先要查阅其文档,明确其训练时的最大长度。盲目输入超长文本会导致性能不可预测的下降。对于需要长文本理解的任务,选择使用了更好位置编码方案(如RoPE)的模型是更根本的解决办法。

5.2 注意力计算复杂度与优化

自注意力机制计算QK^T的复杂度是O(n^2),其中n是序列长度。当处理非常长的序列(如数千甚至数万token)时,计算和内存开销会变得巨大。

优化方法概览:

方法核心思想优点缺点/局限
稀疏注意力并非所有词对都需要计算注意力。只让每个词关注一个局部窗口或一些全局关键词。显著降低计算量,可处理极长序列。需要精心设计稀疏模式,可能损失一些全局信息。
线性注意力通过核函数近似,将QK^T的计算顺序改写,使复杂度降为O(n)理论复杂度低,适合长序列。核函数选择影响效果,有时精度有损失。
分块/局部注意力将序列分块,块内计算精细注意力,块间计算粗略注意力或池化后交互。实现相对简单,是许多长文本模型的默认选择。块边界可能割裂重要依赖关系。
记忆压缩引入可学习的“记忆”向量,让Query主要与这些记忆向量交互,再映射回序列。将序列长度n压缩为固定大小的记忆单元数m记忆容量有限,可能丢失细节。

在实际项目中,除非你要处理书籍级别的文本,否则标准的全注意力在GPU上处理512或1024的长度是完全可以接受的。当序列长度成为瓶颈时,可以优先考虑使用已经实现了高效注意力机制的现成模型库,如Hugging Face的transformers库中对LongformerBigBird等模型的支持。

5.3 从零理解Transformer的思维导图

为了帮助你从宏观上建立知识体系,下面提供一个核心概念的思维导图式梳理:

核心目标:解决RNN的并行化与长程依赖问题。核心机制:自注意力(Scaled Dot-Product Attention)。基本架构:编码器-解码器堆栈。编码器层:多头自注意力 + 前馈网络, 外围残差连接 & 层归一化。解码器层:掩码多头自注意力 + 交叉注意力 + 前馈网络, 外围残差连接 & 层归一化。关键输入:词嵌入 + 位置编码(正弦/可学习)。核心输出:编码器输出上下文向量;解码器自回归生成序列。训练技巧:Teacher Forcing(并行)、标签平滑、梯度裁剪。推理特性:自回归生成、使用KV Cache加速。主要变体:仅编码器(BERT)、仅解码器(GPT)、编码器-解码器(原始Transformer, T5)。应用领域:机器翻译、文本生成、文本分类、问答系统、多模态学习等。

把这个框架印在脑子里,无论遇到哪种Transformer变体,你都能快速定位其在这个蓝图中的位置。

5.4 实战中的调试与经验

最后,分享几点在训练和调试Transformer模型时的心得:

  1. 学习率与预热:Transformer模型对学习率非常敏感。使用学习率预热至关重要。通常在前几千个训练步中,将学习率从0线性或余弦增加到预设值,然后再缓慢下降。这有助于模型在训练初期稳定参数。
  2. 梯度裁剪:由于层数深,尽管有残差连接,梯度爆炸的风险依然存在。设置一个梯度范数阈值(如1.0或5.0),在反向传播时对梯度进行裁剪,是保证训练稳定的标准操作。
  3. 标签平滑:在计算交叉熵损失时,不使用硬标签(如[0, 0, 1, 0]),而是使用软标签(如[0.01, 0.01, 0.97, 0.01])。这可以防止模型对训练数据过度自信,起到正则化作用,通常能提升模型的泛化能力和校准度。
  4. 可视化注意力权重:在调试模型,特别是分析其是否“关注”了正确的部分时,可视化注意力权重是非常有用的工具。你可以看到在生成某个词时,模型到底更关注源序列的哪些词,这有助于诊断翻译或问答模型中的错误。
  5. 从预训练模型开始:除非你有海量的数据和算力,否则不要从头开始训练一个Transformer。利用BERT、GPT、T5等预训练模型进行微调,是解决下游任务最高效、最有效的方式。你需要理解的是如何根据你的任务(分类、生成、序列标注)来修改模型头部,并设计合适的输入输出格式。

Transformer的优雅在于其统一的架构。一旦你透彻理解了这套机制,你就掌握了一把打开现代深度学习,尤其是大语言模型世界的钥匙。它不再是一个黑箱,而是一个你可以清晰描绘其数据流动、并能有方向地进行改进的精密系统。希望这份“图解版”的拆解,能帮你建立起这幅清晰的内景图。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/2 10:23:51

DDR电路设计实战:从原理图到PCB布局布线的完整指南

1. 项目概述&#xff1a;DDR电路设计的核心挑战与价值 在高速数字电路设计的版图上&#xff0c;DDR内存接口的设计与实现&#xff0c;无疑是衡量一个硬件工程师功力的关键标尺。它不像简单的GPIO或低速串口&#xff0c;接上拉个电阻、连根线就能跑起来。DDR&#xff0c;特别是发…

作者头像 李华
网站建设 2026/8/2 10:23:18

3个强力优化技巧:让魔兽争霸3在现代电脑上重获新生

3个强力优化技巧&#xff1a;让魔兽争霸3在现代电脑上重获新生 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 魔兽争霸3作为一款经典的即时战略游戏&…

作者头像 李华
网站建设 2026/8/2 10:22:25

基于STM32MP157C SOM的工业边缘计算网关:双核架构与软硬件开发实战

1. 项目概述&#xff1a;为什么选择Seeed Studio的STM32MP157C SOM&#xff1f; 最近在为一个工业边缘计算网关项目选型&#xff0c;核心需求是既要满足一定的实时控制能力&#xff0c;又要能流畅运行Linux系统来处理网络协议和图形界面。在评估了树莓派CM4、NXP的i.MX系列以及…

作者头像 李华