为什么transformer的时间复杂度是N的平方,具体是里面的哪一个计算流程最占用时间

ops/2024/11/23 8:32:22/

Transformer的时间复杂度为 O(N2),其中 NN 是输入序列的长度。这一复杂度主要来源于自注意力机制(self-attention mechanism)的计算过程。

在Transformer模型中,自注意力机制的核心步骤是计算查询(Query)、键(Key)和值(Value)矩阵之间的点积。具体来说,假设输入序列长度为 N,每个元素的维度为 dd,则需要计算三个矩阵:QQ、KK 和 VV,每个矩阵的大小都是 [N,d][N,d]。计算自注意力时,首先将输入向量通过不同的线性变换得到这三个矩阵,然后计算 Q 和 K的转置矩阵的点积,即 QK⊤,其大小为 [N,N][N,N]。这个点积操作的时间复杂度为 O(N2)O(N2),因为需要对每个输入元素进行 NN 次乘法和 NN 次加法操作。

此外,自注意力机制还需要对点积结果进行归一化处理,通常使用softmax函数来计算注意力权重,这一步骤的时间复杂度也为 O(N2)O(N2)。因此,自注意力机制的整体时间复杂度为 O(N2)O(N2),这是Transformer模型中最主要的时间消耗部分。

总结来说,Transformer的时间复杂度为 O(N2)O(N2),主要是由于自注意力机制中计算 QK⊤QK⊤ 矩阵乘法的操作,这一操作的时间复杂度为 O(N2)O(N2),是整个模型中最占用时间的部分.

为什么Transformer中,要计算Q 和 K的转置矩阵的点积,这样做的意义是什么,为什么是Q乘以K的转置,为什么又要转置。整个的意义是什么

4o-Latest

Poe

在 Transformer 模型中,计算 Q(Query)K(Key) 矩阵的点积是核心步骤之一,这涉及到自注意力(Self-Attention)机制的实现。下面从概念和数学的角度详细解释为什么要进行这个操作,以及它的意义。


1. 自注意力机制的目标

自注意力机制的核心目标是根据输入序列中的每个单词对其他单词的相关性(关系),动态地分配权重,从而捕捉序列中的依赖关系。这种机制可以帮助模型理解:

  • 某个单词与其他单词的关系(如语法语义)。
  • 长距离的上下文依赖关系,而非仅仅依赖固定窗口的上下文。

为了实现这一点,模型需要为每个输入位置计算它与其他位置的相关性,这就是 Q 和 K 的点积 的意义。


2. Q 和 K 的定义

在 Transformer 中,输入序列的每个单词通过嵌入(Embedding)后,会被映射到三个向量:

  • Q(Query):表示查询向量,它询问“我想关注哪些其他单词?”
  • K(Key):表示键向量,它提供“能被关注的内容”。
  • V(Value):表示值向量,即实际的内容信息(用于后续加权求和)。

Q 和 K 的点积反映了 Query 和 Key 之间的相似性或匹配程度,也就是一个单词对其他单词的注意力权重。


3. 为什么是 Q × K 的转置?

对于一个长度为 n 的输入序列,每个单词的 Query 和 Key 向量维度为 d_k因此,假设:

  • Q 的维度是 (n, d_k),表示每个单词的查询向量。
  • K 的维度是 (n, d_k),表示每个单词的键向量。
转置的作用
  1. 如果直接计算 Q 和 K 的点积(Q × K),会得到一个 (n, d_k) × (n, d_k) 的矩阵,结果无法反映单词之间的权重关系。
  2. 通过对 K 进行转置,K^T 的维度变为 (d_k, n),从而 Q × K^T 的结果是一个 (n, n) 的矩阵

这个 (n, n) 矩阵的每个元素 a[i][j] 表示第 i 个单词的 Query 向量与第 j 个单词的 Key 向量的点积。换句话说:

  • a[i][j] 表示第 i 个单词对第 j 个单词的相关性(或注意力得分)。
数学意义

Q × K^T 的核心作用是计算注意力得分矩阵。这个矩阵的每一行表示一个单词对所有其他单词的相关性分布。


4. 为什么要点积?

点积是一种简单而有效的方式来衡量两个向量的相似性。数学上,点积的值越大,两个向量的方向越接近,表示它们越相似。在自注意力机制中:

  • 如果一个 Query 向量和某个 Key 向量的点积值较大,说明该 Query 更应该关注对应的 Key(即该单词对另一个单词的相关性更强)。
  • 通过点积计算,我们得到了一个原始的注意力得分矩阵

5. 为什么需要相关性分布?

注意力得分矩阵中的值是点积的结果,可能是任意的正负值。但我们需要将这些值转换成概率分布,以便对 Value 向量进行加权求和。这通过以下步骤实现:

  1. 缩放(Scaling)
    点积的结果可能会随着向量维度(d_k)的增加而变得过大(因为点积是多个元素的乘积和)。为了防止数值过大导致梯度消失或爆炸,我们将点积结果除以向量维度的平方根1/√d_k

  1. Softmax 函数
    通过 Softmax 函数将注意力得分矩阵中的每一行转换为概率分布,使得每个 Query 向量的注意力分布和为 1


6. 总结:Q × K^T 的意义

  1. 捕捉单词间的关系通过 Q 和 K 的点积,计算输入序列中每个单词对其他单词的相关性。
  2. 生成注意力分布:Q × K^T 的结果经过缩放和 Softmax,生成了注意力分布,用于决定每个单词应该关注哪些单词以及关注的程度。

最终,注意力分布会用来加权 Value 矩阵(V),从而动态地生成上下文敏感的表示,供后续的模型层使用。


图解总结

如果用公式表示:

  1. 计算注意力得分矩阵:

    复制

    Attention_scores = Q × K^T / √d_k
    
  2. 生成注意力分布:

    复制

    Attention_weights = Softmax(Attention_scores)
    
  3. 最终输出:

    复制

    Output = Attention_weights × V
    

这个过程的核心是 Q × K^T,它提供了衡量单词间关系的基础。

详解transformer中的Attention计算原理和过程

GPT-4o

Poe

Transformer 是一种基于 Attention 机制的神经网络架构,其核心创新在于 Attention 机制,尤其是 Self-Attention。Attention 机制的本质是为输入序列中的每个位置分配权重,以突出序列中不同部分对当前任务的重要性。以下是 Transformer 中 Attention 计算的详细原理和过程:


1. Attention 的输入与输出

在 Transformer 中,Attention 机制的输入由以下三部分组成:

  • Query (Q):查询向量,用于与其他向量进行匹配。
  • Key (K):键向量,用于计算与 Query 的匹配度。
  • Value (V):值向量,提供最终的输出信息

通过 Attention 机制,我们希望根据 Query 和 Key 的匹配度,对 Value 进行加权求和,得到输出。

输入形状

假设输入是一个长度为 n 的序列,每个位置的维度为 d_model,输入通常表示为一个矩阵:

  • 输入矩阵形状为 (n, d_model)

Q、K 和 V 是通过输入向量与可学习的权重矩阵线性变换得到:

  • Q = XWq
  • K = XWk
  • V = XWv

其中,WqWkWv 是可学习参数,形状分别为 (d_model, d_k)(d_model, d_k)(d_model, d_v)


2. Scaled Dot-Product Attention

Attention 的核心是通过 Query 和 Key 的点积来计算两个向量的相似度(或相关性),进而对 Value 进行加权求和。

计算公式

  1. 相似度计算(点积)
    首先计算 Query 和 Key 的点积,表示它们之间的匹配度:

    Scoreij=Qi⋅KjT\text{Score}_{ij} = Q_i \cdot K_j^TScoreij​=Qi​⋅KjT​

    对于矩阵形式:

    Scores=QKT\text{Scores} = QK^TScores=QKT

    其中:

    • QQQ 的形状为 (n,dk)(n, d_k)(n,dk​)。
    • KTK^TKT 的形状为 (dk,n)(d_k, n)(dk​,n)。
    • Scores\text{Scores}Scores 的形状为 (n,n)(n, n)(n,n),表示每个 Query 与所有 Key 的相似度。
  2. 缩放(Scaling)
    为了避免点积值过大(尤其当 dkd_kdk​ 很大时),将点积结果缩放:

    Scaled Scores=Scoresdk\text{Scaled Scores} = \frac{\text{Scores}}{\sqrt{d_k}}Scaled Scores=dk​​Scores​

  3. Softmax 归一化
    对每个 Query 的相似度分布应用 Softmax,使得权重和为 1:

    Attention Weights=Softmax(QKTdk)\text{Attention Weights} = \text{Softmax} \left( \frac{QK^T}{\sqrt{d_k}} \right)Attention Weights=Softmax(dk​​QKT​)

    形状为 (n,n)(n, n)(n,n),表示每个 Query 对所有 Key 的注意力分布。

  4. 加权求和
    使用 Attention 权重对 Value 进行加权求和,得到最终的输出:

    Output=Attention Weights⋅V\text{Output} = \text{Attention Weights} \cdot VOutput=Attention Weights⋅V

    其中 VVV 的形状为 (n,dv)(n, d_v)(n,dv​),最终输出的形状为 (n,dv)(n, d_v)(n,dv​)。


3. Multi-Head Attention

Transformer 中使用 Multi-Head Attention,将输入向量分为多个头(Head),每个头独立计算 Attention,然后将结果拼接,再通过线性变换得到最终输出。

步骤

  1. 线性变换
    对输入 XXX 通过不同的权重矩阵 Wq,Wk,WvW_q, W_k, W_vWq​,Wk​,Wv​ 生成多个头的 Q,K,VQ, K, VQ,K,V:

    Qh=XWqh,Kh=XWkh,Vh=XWvh(h=1,2,…,H)Q_h = XW_q^h, \quad K_h = XW_k^h, \quad V_h = XW_v^h \quad (h = 1, 2, \ldots, H)Qh​=XWqh​,Kh​=XWkh​,Vh​=XWvh​(h=1,2,…,H)

    • HHH 是头的数量。
    • 每个头的维度 dk=dv=dmodel/Hd_k = d_v = d_{model} / Hdk​=dv​=dmodel​/H。
  2. 独立计算 Attention
    每个头独立计算 Attention 输出:

    Headh=Attention(Qh,Kh,Vh)\text{Head}_h = \text{Attention}(Q_h, K_h, V_h)Headh​=Attention(Qh​,Kh​,Vh​)

  3. 拼接(Concat)
    将所有头的输出拼接在一起:

    Multi-Head Output=Concat(Head1,Head2,…,HeadH)\text{Multi-Head Output} = \text{Concat}(\text{Head}_1, \text{Head}_2, \ldots, \text{Head}_H)Multi-Head Output=Concat(Head1​,Head2​,…,HeadH​)

    形状为 (n,H⋅dv)(n, H \cdot d_v)(n,H⋅dv​)。

  4. 线性变换
    将拼接结果通过一个线性变换,映射回原始维度 dmodeld_{model}dmodel​:

    Final Output=Multi-Head Output⋅Wo\text{Final Output} = \text{Multi-Head Output} \cdot W_oFinal Output=Multi-Head Output⋅Wo​

    其中 WoW_oWo​ 是一个形状为 (H⋅dv,dmodel)(H \cdot d_v, d_{model})(H⋅dv​,dmodel​) 的可学习参数。


4. Self-Attention

在 Self-Attention 中,Query、Key 和 Value 全部来源于同一个输入 XXX。它通过关注输入序列中不同位置的关系,捕获序列的全局依赖性。

优点

  • 并行化:相比 RNN,Attention 机制可以并行处理整个序列。
  • 长距离依赖:可以直接建模序列中任意两个位置的关系。

5. Transformer 中的应用

Attention 机制在 Transformer 中被广泛应用于以下两部分:

  1. Encoder

    • 每一层包含一个 Self-Attention 子层 和一个 前向全连接子层
    • Self-Attention 用于捕获输入序列中各位置之间的关系。
  2. Decoder

    • 包含 Masked Self-Attention 子层(防止未来信息泄露)和 Encoder-Decoder Attention 子层
    • Encoder-Decoder Attention 用于结合 Encoder 输出和 Decoder 当前输入的关系。

6. Attention 机制的直观理解

Attention 的核心在于:

  • Query 指定我们关心的内容。
  • Key 提供参考的标识。
  • Value 是需要提取的信息。
    通过计算 Query 和 Key 的匹配度,我们可以从 Value 中提取与 Query 相关的内容。

7. 总结公式

  1. Attention Output:

    Attention(Q,K,V)=Softmax(QKTdk)V\text{Attention}(Q, K, V) = \text{Softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right) VAttention(Q,K,V)=Softmax(dk​​QKT​)V

  2. Multi-Head Attention:

    MultiHead(Q,K,V)=Concat(head1,…,headH)Wo\text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, \ldots, \text{head}_H) W_oMultiHead(Q,K,V)=Concat(head1​,…,headH​)Wo​

    其中:

    headh=Attention(QWqh,KWkh,VWvh)\text{head}_h = \text{Attention}(QW_q^h, KW_k^h, VW_v^h)headh​=Attention(QWqh​,KWkh​,VWvh​)


通过 Attention 机制,Transformer 能够高效建模序列的全局依赖性,是现代自然语言处理的核心技术之一。

在以上整个训练过程中,位置编码是怎么被引入的,哪里可以看到位置编码对注意力计算的影响。为什么要有位置编码

T-4o

Poe

在 Transformer 中,位置编码(Positional Encoding) 是一个关键的设计,用于在模型中引入序列顺序信息。由于 Transformer 本身没有任何递归或卷积结构,无法天然捕获输入序列的位置信息,因此需要通过显式的方式将位置关系编码到输入中。

以下是位置编码在 Transformer 中的作用、引入方式,以及它对注意力计算的影响。


1. 为什么需要位置编码

Transformer 的核心是 Self-Attention 机制,它对序列中的每个位置进行全局加权计算。然而,这种机制是完全对称的,对输入序列的位置信息没有直观感知:

  • 如果输入序列被完全打乱(例如词序改变),Self-Attention 机制仍然会计算相同的注意力权重。
  • 自然语言和许多序列数据中,元素的顺序至关重要,例如 "I eat lunch" 和 "Lunch eats I" 是完全不同的。

因此,位置编码的作用是显式地将序列的位置信息注入到模型中,使得模型能够捕获序列元素的顺序关系。


2. 位置编码是如何引入的

位置编码被添加到输入的 词嵌入(word embedding) 中,形成包含位置信息的嵌入向量

公式

假设输入序列的嵌入矩阵为 X,形状为 (n,dmodel) (n, d_{\text{model}}) (n,dmodel​),其中 n 是序列长度,dmodel d_{\text{model}} dmodel​ 是嵌入向量的维度。位置编码 P 的形状与 XXX 相同,位置编码通过以下方式加入到输入中:

X′=X+P

其中:

  • PPP 是一个固定的或可学习的矩阵,表示每个位置的编码。
  • 加法操作是逐元素的,将每个位置的编码添加到对应的词向量中。

位置编码的生成方式

Transformer 原论文(Attention Is All You Need)中使用了一种 固定的正弦和余弦函数 来生成位置编码,其公式如下:

对于位置 pospospos 和嵌入维度 iii:

P(pos,2i)=sin⁡(pos10000 2i/dmodel)

P(pos, 2i) = \sin\left(\frac{pos}{10000^{2i / d_{\text{model}}}}\right)

P(pos,2i+1)=cos⁡(pos100002i/dmodel)

P(pos, 2i+1) = \cos\left(\frac{pos}{10000^{2i / d_{\text{model}}}}\right)

  • pospospos 是序列中的位置索引。
  • iii 是嵌入向量的维度索引。
  • dmodel  d_{\text{model}}是嵌入向量的总维度。

这种设计的特点是:

  1. 不同位置的编码是唯一的。
  2. 不同位置之间的编码具有一定的相对位置信息(通过正弦和余弦函数的周期性)。
  3. 位置编码是固定的,不需要额外学习参数。

3. 位置编码对注意力计算的影响

位置编码通过与词嵌入相加的方式,间接影响了注意力计算。下面分析其影响的机制。

1. 对 Self-Attention 矩阵的影响

在 Self-Attention 中,注意力权重由 Query (QQQ) 和 Key (KKK) 的点积决定:

Attention Weights=Softmax(QKTdk)\text{Attention Weights} = \text{Softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)Attention Weights=Softmax(dk​​QKT​)

  • QQQ 和 KKK 是通过输入 X′X'X′ 的线性变换得到的:

    Q=X′Wq,K=X′WkQ = X'W_q, \quad K = X'W_kQ=X′Wq​,K=X′Wk​

    其中 X′=X+PX' = X + PX′=X+P。

由于输入 X′X'X′ 包含了位置编码 PPP,因此位置编码会影响 Query 和 Key 的表示,进而影响相似度的计算。

具体影响

  • 绝对位置感知:位置编码 PPP 提供了每个位置的绝对位置信息,使得 Self-Attention 能够区分序列中各元素的具体位置。
  • 相对位置感知:正弦和余弦函数的设计使得不同位置的编码之间包含一定的相对位置信息。例如,相邻位置的编码具有相似的值。

2. 对注意力权重的影响

由于位置编码修改了 Query 和 Key 的表示,最终的注意力权重会反映序列中不同位置之间的内容相关性以及位置关系。例如:

  • 如果两个位置的编码相似(例如相邻位置),它们的点积会更大,注意力权重会更高。
  • 远距离位置的编码差异较大,点积值较小,注意力权重会较低。

3. 位置编码的作用是间接的

需要注意的是,位置编码本身并不直接参与注意力权重的计算,而是通过修改输入向量的表示,间接影响注意力权重。


4. 为什么选择正弦和余弦作为位置编码

Transformer 原论文中选择正弦和余弦函数作为位置编码的理由包括以下几点:

  1. 无需学习参数

    • 位置编码是固定的,不需要通过训练学习,减少了模型的复杂性。
  2. 周期性和相对位置信息

    • 正弦和余弦函数的周期性能够捕获相对位置关系。例如,相邻位置的编码之间的差异较小,而远距离位置的差异较大。
    • 这种相对位置信息对于序列建模非常重要。
  3. 平滑的表示

    • 正弦和余弦函数生成的编码在高维空间中分布均匀,能够为模型提供更加稳定的输入。


5. 可学习的位置编码

虽然原论文中采用了固定的正弦和余弦位置编码,但后续研究中也探索了 可学习的位置编码

  • 方法:将位置编码 PPP 作为可学习参数矩阵,与词嵌入一起训练。
  • 优点:允许模型自动调整位置编码以适应具体任务。
  • 缺点:需要额外的模型参数,并且可能对训练数据有较强的依赖。

许多现代 Transformer 模型(如 BERT)采用了可学习的位置编码。


6. 总结

  • 位置编码的必要性:Transformer 无法天然感知序列的顺序,因此需要通过位置编码显式地引入位置信息。
  • 位置编码的引入方式:通过与词嵌入逐元素相加,将位置信息融入输入表示。
  • 对注意力计算的影响:位置编码影响了 Query 和 Key 的计算,进而改变了注意力权重,使得模型能够捕获序列元素的顺序关系。
  • 正弦和余弦的优点:无需学习参数,能够捕获绝对和相对位置信息。

位置编码是 Transformer 架构的核心设计之一,确保模型能够有效处理序列数据中的顺序信息。

分享研究追问


相关事件

事件名称事件时间事件概述

Transformer模型的时间复杂度分析

2024年05月24日技术分析Transformer模型的时间复杂度主要取决于输入序列的长度和隐藏层的数量

Transformer模型的提出

2023年11月20日技术创新Transformer模型的提出是为了解决传统递归神经网络和卷积神经网络的计算复杂度高、训练时间长等问题

Transformer模型的具体计算过程解析

2023年04月21日技术解析详细解析了Transformer模型的计算过程,包括Encoder和Decoder的处理流程

Transformer技术原理深入理解

2024年04月25日技术解析深入理解了Transformer模型的技术原理,包括其使用8个注意力头的特点

Transformer流程及细节思考

2022年08月18日技术解析详细介绍了Transformer网络结构图,包括注意力机制和各个模块的细节

Transformer完全图解指南发布

2023年01月25日教育资源发布发布了一个完整的Transformer工作流程图,包括Encoder-Decoder中的详细模块和循环机制

来源

1. PDFEfficient Transformers: A Survey. YI TAY et al.

2. [从0开始AIGC][Transformer相关]:算法的时间和空间复杂度 [2024-05-24]

3. 阿里面试官问:Self-Attention 的时间复杂度/空间 ... [2024-09-12]

4. Transformer的时间复杂度分析- 爱吃西瓜的菜鸟 [2021-09-17]

5. PPT大规模语言模型 : 从理论到实践. 张奇等. [2023-11-06]

6. PPTTransformers in 3D Point Clouds: A Survey. 万嘉诚.

7. PDF程序员的算法趣题. [日] 增井敏克/著绝云/译. [2015-12-31]

8. PDF时空关联的Transformer骨架行为识别. 卢先领等. [2024-03-31]

9. 支持Transformer全流程训练加速,最高加速3倍,字节跳动 ... [2021-06-25]

10. PDFVision Transformer with Hierarchical Structure

11. transformer系列之时间复杂度原创 [2023-11-20]

12. PDFDynamic programming with meta-reinforcement learning

13. PDF数据结构习题解析(第3版). 邓俊辉编著等.

14. Transformer模型-3-基本工作流程 [2023-11-02]

15. PDFPrimos de Mersenne. Publicações Matemáticas.

16. Transformer的具体计算过程原创 [2023-04-21]

17. PDF微软技术面试心得. 電子工業出版社.

18. PDFMathematical Formulation of Learning and Its Computational Complexity for Transformers’ Layers

19. PDFUrban Carbon Price Forecasting by Fusing Remote Sensing Images and Historical Price Data. Cha.

20. PDFPython数据科学手册. [美] JakeVanderPlas著 et al.

21. PDFTime Series Analysis Based on Informer Algorithms. Qingbo Zhu et al.

22. PDFMIFM: Multimodal Information Fusion Model for Educational Exercises. Jianfeng Song et al.

23. Transformer算法完全解读- 奥辰 [2022-07-07]

24. Decoder-only模型的参数与计算量分析 - Shihanmax's blog [2024-03-23]

25. 深入理解Transformer技术原理 [2024-04-25]

26. Transformer流程解析及细节思考原创 [2022-08-18]

27. Transformer 完全图解指南 [2023-01-25]


http://www.ppmy.cn/ops/136021.html

相关文章

【POSIX】posix_fadvise()接口

前言 posix_fadvise()是一个 POSIX 标准的系统调用&#xff0c;用于为打开的文件描述符提供建议&#xff0c;以优化文件 I/O 操作。它允许应用程序指示内核如何处理与特定文件的读取和写入操作。 函数原型 #include <fcntl.h>int posix_fadvise(int fd, off_t offset,…

Mac M4苹果电脑M4上支持的AE/PR/PS/AI/ID/LrC/AU/DC/ME有哪些?

Mac 首次搭载 M4 芯片&#xff0c;为创业者、学生、创作者等用户带来出众性能。M4 芯片配备了最多 10 核中央处理器&#xff0c;包括 4 颗性能核心和最多 6 颗能效核心。中央处理器性能相比 M1 提升最多可达 1.8 倍&#xff0c;让使用 Safari 浏览器和 Excel 等 app 进行多任务…

秋意浓,森林披金装

秋意浓&#xff0c;森林披金装&#xff0c; 枫叶如火&#xff0c;漫山遍野狂。 松间轻风送寒意&#xff0c; 鸟鸣悠扬入云翔。 林间小径蜿蜒行&#xff0c; 落叶铺成金色毯。 溪水潺潺绕石转&#xff0c; 映出天边一抹霞。 野菊点缀在草间&#xff0c; 白云悠悠随意闲。…

网安基础知识|IDS入侵检测系统|IPS入侵防御系统|堡垒机|VPN|EDR|CC防御|云安全-VDC/VPC|安全服务

网安基础知识|IDS入侵检测系统|IPS入侵防御系统|堡垒机|VPN|EDR|CC防御|云安全-VDC/VPC|安全服务 IDS入侵检测系统 Intrusion Detection System 安全检测系统&#xff0c;通过监控网络流量、系统日志等信息&#xff0c;来检测系统中的安全漏洞、异常行为和入侵行为。 分为&am…

【Android】android compat理解

1&#xff0c;前提 即便是在同一手机上安装的不同apk&#xff0c;其编译的apk不同&#xff0c;也会导致行为上的差异。如SDK34有限制后台启动&#xff0c;但如果安装的apk所依赖的sdk是33&#xff0c;则不会表现出此差异。这是如何实现的呢&#xff1f;其实&#xff0c;本质是…

NuHertz/HFSS:使用矩形、径向和阻抗短截线的平面 LPF Chebyshev-II 实现

我们今天的主题是使用 NuHertz 和 HFSS 设计微带低通 Chebyshev-Type2 滤波器。Chebyshev 2 型滤波器在通带中具有平坦响应&#xff0c;在阻带中具有波纹。我们将比较 NuHertz 中的不同选项。 低通滤波器由集总的 L 和 C 元件制成。这种方法很难用于高频应用。高频滤波器需要分…

在 Spark RDD 中,sortBy 和 top 算子的各自适用场景

在 Spark RDD 中&#xff0c;sortBy 和 top 算子各有适用场景&#xff0c;而它们的性能高低主要取决于数据规模和使用场景&#xff1a; 1. 算子用途与核心区别 sortBy&#xff1a;用于对整个数据集进行分区排序或者全局排序。 可通过参数 numPartitions 指定输出分区数。底层依…

04 - 尚硅谷 - MQTT 客户端编程

1.在Java中使用MQTT 1.1 Eclipse Paho Java Client 具体步骤&#xff1a; 1、创建一个Spring Boot项目&#xff0c;添加如下依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId>…