论文笔记(四十五)Attention Is All You Need

Attention Is All You Need

  • 文章概括
  • 摘要
  • 1. 介绍
  • 2. 背景
  • 3. 模型架构
    • 3.1 编码器和解码器堆栈
    • 3.2 Attention
      • 3.2.1 按比例点积Attention
      • 3.2.2 Multi-Head Attention
      • 3.2.3 注意力在模型中的应用
    • 3.3 定位前馈网络
    • 3.4 嵌入与 Softmax
    • 3.5 位置编码
  • 4 为什么 Self-Attention
  • 5. Training
    • 5.1 训练数据和批处理
    • 5.2 硬件和时间表
    • 5.3 优化器
    • 5.4 正则化
  • 6 Results
    • 6.1 Machine Translation
    • 6.2 模型变化
  • 7 Conclusion

文章概括

作者:Ashish Vaswani,Noam Shazeer,Niki Parmar,Jakob Uszkoreit,Llion Jones,Aidan N. Gomez,Łukasz Kaiser,Illia Polosukhin
来源:
原文:https://proceedings.neurips.cc/paper_files/paper/2017/file/3f5ee243547dee91fbd053c1c4a845aa-Paper.pdf
代码、数据和视频:https://github.com/tensorflow/tensor2tensor
系列文章目录:
上一篇:
https://blog.csdn.net/xzs1210652636/article/details/134431873
下一篇:



摘要

主流的序列转换模型基于复杂的递归或卷积神经网络,其中包括一个编码器和一个解码器。性能最好的模型还通过注意力机制连接编码器和解码器。我们提出了一种新的简单网络架构–“转换器”(Transformer),它完全基于注意力机制,无需递归和卷积。在两项机器翻译任务上的实验表明,这些模型的质量更优,同时可并行化程度更高,所需的训练时间也大大减少。我们的模型在 WMT 2014 英德翻译任务中达到了 28.4 BLEU,比现有的最佳结果(包括集合)提高了 2 BLEU 以上。在 WMT 2014 英法翻译任务中,我们的模型在 8 个 GPU 上训练了 3.5 天后,单个模型的 BLEU 得分达到了 41.0 分,这只是文献中最佳模型训练成本的一小部分。


1. 介绍

递归神经网络,特别是长短期记忆[12]和门控递归[7]神经网络,已被牢固地确立为语言建模和机器翻译等序列建模和转译问题的最先进方法[29, 2, 5]。自此以后,许多人继续努力推动递归语言模型和编码器-解码器架构的发展[31, 21, 13]。

递归模型通常按照输入和输出序列的符号位置进行计算。将位置与计算时间的步长对齐,它们会生成隐藏状态 h t h_t ht 的序列,作为前一个隐藏状态 h t − 1 h_{t-1} ht1 和位置 t t t 的输入的函数。这种固有的序列性质排除了训练实例内的并行化,而在序列长度较长时,这一点变得至关重要,因为内存约束限制了跨实例的批处理。最近的研究通过因式分解技巧[18]和条件计算[26]显著提高了计算效率,同时也改善了后者的模型性能。然而,顺序计算的基本限制仍然存在。

在各种任务中,注意机制已成为引人注目的序列建模和转导模型的一个组成部分,它可以对依赖关系进行建模,而不必考虑它们在输入或输出序列中的距离[2, 16]。然而,除了少数情况[22]外,这种注意机制都是与递归网络结合使用的。

在这项工作中,我们提出了 Transformer 模型架构,它摒弃了递归,而是完全依赖注意力机制来绘制输入和输出之间的全局依赖关系。Transformer 可以大大提高并行化程度,在 8 个 P100 GPU 上只需训练 12 个小时,翻译质量就能达到新的水平。


2. 背景

减少顺序计算的目标也是扩展神经 GPU[20]、ByteNet[15]和 ConvS2S[8]的基础,它们都使用卷积神经网络作为基本构建模块,并行计算所有输入和输出位置的隐藏表示。在这些模型中,将两个任意输入或输出位置的信号联系起来所需的运算次数随位置间距离的增加而增加,ConvS2S 为线性增加,ByteNet 为对数增加。这就增加了学习远距离位置间依赖关系的难度[11]。在 Transformer 中,这将被减少到一个恒定的操作数,但代价是由于平均注意力加权位置而降低了有效分辨率,我们在 3.2 节中介绍了多头注意力来抵消这一影响。

自我注意(有时也称为内部注意)是一种注意机制,它将单个序列的不同位置联系起来,以计算序列的表征。自我注意已成功应用于多种任务,包括阅读理解、抽象概括、文本引申和学习与任务无关的句子表征[4, 22, 23, 19]。

端到端记忆网络基于递归注意机制,而非序列对齐递归,在简单语言问题解答和语言建模任务中表现出色[28]。

然而,据我们所知,Transformer 是第一个完全依靠自我注意来计算输入和输出表示而不使用序列对齐 RNN 或卷积的转导模型。在下面的章节中,我们将描述 Transformer,激发自我注意,并讨论它与 [14, 15] 和 [8] 等模型相比的优势。


3. 模型架构

大多数竞争性神经序列转换模型都具有编码器-解码器结构 [5, 2, 29]。在这里,编码器将输入的符号表示序列 ( x 1 , . . . , x n ) (x_1, ..., x_n) (x1,...,xn)映射为连续表示序列 z = ( z 1 , . . . , z n ) z = (z_1, ..., z_n) z=(z1,...,zn)。给定 z z z 后,解码器每次生成一个元素的符号输出序列 ( y 1 , . . . , y m ) (y_1, ..., y_m) (y1,...,ym)。在每一步中,该模型都是自动回归的 [9],在生成下一步时,会消耗之前生成的符号作为额外输入。

图 1 的左半部分和右半部分分别显示了编码器和解码器采用堆叠式自关注和点式全连接层的整体架构。


在这里插入图片描述

图 1:变压器–模型结构。


3.1 编码器和解码器堆栈

编码器: 编码器由 N = 6 N = 6 N=6 层相同的层堆叠组成。每一层都有两个子层。第一个子层是多头自注意机制,第二个子层是简单的位置全连接前馈网络。我们在两个子层的每个周围都采用了残差连接[10],然后进行层归一化[1]。也就是说,每个子层的输出都是 LayerNorm ( x + Sublayer ( x ) ) \text{LayerNorm}(x + \text{Sublayer}(x)) LayerNorm(x+Sublayer(x)),其中 Sublayer ( x ) \text{Sublayer}(x) Sublayer(x) 是子层本身实现的函数。为了方便这些残差连接,模型中的所有子层以及嵌入层都会产生维数为 d m o d e l = 512 d_{model} = 512 dmodel=512 的输出。

解码器: 解码器也由 N = 6 N = 6 N=6 层相同的层堆叠组成。除了每个编码器层中的两个子层外,解码器还插入了第三个子层,对编码器堆栈的输出执行多头关注。与编码器类似,我们在每个子层周围采用残差连接,然后进行层归一化。我们还修改了解码器堆栈中的自我关注子层,以防止位置关注到后续位置。这种屏蔽,加上输出嵌入偏移一个位置的事实,确保了对位置 i i i 的预测只能依赖于小于 i i i 位置的已知输出。

3.2 Attention

注意力函数可以描述为将一个查询和一组键值对映射到一个输出,其中查询、键、值和输出都是向量。输出是以值的加权和来计算的,其中分配给每个值的权重是通过查询与相应键的兼容函数来计算的。

3.2.1 按比例点积Attention

我们将这种特殊的注意力称为 “缩放点积注意力”(图 2)。输入包括查询、维度为 d k d_k dk 的键和维度为 d v d_v dv 的值。我们计算查询与所有密钥的点积,将每个点积除以 d k \sqrt{d_k} dk ,然后应用软最大函数来获得值的权重。


在这里插入图片描述

图 2:(左)缩放点积注意。(右图)多头注意由多个并行运行的注意层组成。


在实践中,我们会同时计算一组查询的注意力函数,这些查询会被打包成一个矩阵 Q Q Q。键和值也被打包成矩阵 K K K V V V。我们计算的输出矩阵为:

在这里插入图片描述

最常用的两种注意力函数是加法注意力[2]和点积(多乘法)注意力。点积注意力与我们的算法相同,只是缩放因子为 1 d k \frac{1}{\sqrt{d_k}} dk 1。加法注意使用单隐层前馈网络计算兼容性函数。虽然两者的理论复杂度相似,但点积注意力在实际应用中速度更快,空间效率更高,因为它可以使用高度优化的矩阵乘法代码来实现。

d k d_k dk 值较小的情况下,这两种机制的表现类似,但在 d k d_k dk 值较大的情况下,加法注意在不缩放的情况下优于点积注意 [3]。我们怀疑,对于较大的 d k d_k dk 值,点积的幅度会变大,从而将 softmax \text{softmax} softmax 函数推向梯度极小的区域(为了说明点积为什么会变大,假设 q q q k k k 的分量是均值为 0、方差为 1 的独立随机变量。那么它们的点积 q ⋅ k = ∑ i = 1 d k q i k i q \cdot k = \sum_{i = 1}^{d_k}q_ik_i qk=i=1dkqiki 的均值为 0,方差为 d k d_k dk)。为了消除这种影响,我们用 1 d k \frac{1}{\sqrt{d_k}} dk 1 来缩放点积。

3.2.2 Multi-Head Attention

我们发现,与其使用 d m o d e l d_{model} dmodel 维度的键、值和查询来执行单一的注意力函数,不如将查询、键和值分别线性投影到 d k d_k dk d k d_k dk d v d_v dv 维度,并将不同的学习过的线性投影进行 h h h 次投影。然后,我们对每个投影版本的查询、键和值并行执行注意力函数,得到 d v d_v dv 维的输出值。如图 2 所示,这些值被串联起来并再次投影,从而得到最终值。

多头注意力允许模型在不同位置共同关注来自不同表征子空间的信息。而在单注意头的情况下,平均化会抑制这一点。

在这里插入图片描述

其中的投影是参数矩阵 W i Q ∈ R d m o d e l × d k , W i K ∈ R d m o d e l × d k , W i V ∈ R d m o d e l × d v 和 W O ∈ R h d v × d m o d e l W_i^Q ∈ \mathbb{R} ^{d_{model}×d_k} , W_i ^K ∈ \mathbb{R}^{ d_{model}×d_k} , W_i ^V ∈ \mathbb{R}^{ d_{model}×d_v} 和 W^O ∈ \mathbb{R} ^{hd_v×d_{model}} WiQRdmodel×dk,WiKRdmodel×dk,WiVRdmodel×dvWORhdv×dmodel
.

在这项工作中,我们采用了 h = 8 h = 8 h=8 个并行注意力层,或称为 “头”。其中,我们使用 d k = d v = d m o d e l / h = 64 d_k = d_v = d_{model}/h = 64 dk=dv=dmodel/h=64。由于减少了每个头的维度,总计算成本与全维度的单头注意力相似。

3.2.3 注意力在模型中的应用

Transformer通过三种不同方式实现多头关注:

  • 在 "编码器-解码器attention "层中,查询来自前一个解码器层,而记忆键和记忆值则来自编码器的输出。这使得解码器中的每个位置都能关注输入序列中的所有位置。这模仿了序列到序列模型中典型的编码器-解码器注意机制,例如 [31, 2, 8]。

  • 编码器包含自注意层。在自注意层中,所有的键、值和查询都来自同一个地方,在这种情况下,就是编码器中上一层的输出。编码器中的每个位置都可以关注编码器上一层的所有位置

  • 同样,解码器中的自关注层允许解码器中的每个位置关注解码器中包括该位置在内的所有位置。我们需要防止解码器中的信息向左流动,以保持自动回归特性。我们通过屏蔽(设置为- ∞ ∞ )软最大输入中对应于非法连接的所有值,在缩放点积关注内部实现了这一点。见图 2。

3.3 定位前馈网络

除了注意力子层外,我们的编码器和解码器中的每一层都包含一个全连接的前馈网络,该网络分别对每个位置进行相同的处理。这包括两个线性变换,中间有一个 ReLU 激活。

在这里插入图片描述
虽然不同位置的线性变换相同,但各层使用的参数不同。另一种描述方法是两个内核大小为 1 的卷积。输入和输出的维度为 d m o d e l = 512 d_{model} = 512 dmodel=512,内层的维度为 d f f = 2048 d_{ff} = 2048 dff=2048

3.4 嵌入与 Softmax

与其他序列转换模型类似,我们使用学习到的嵌入将输入标记和输出标记转换为维数为 d m o d e l d_{model} dmodel 的向量。我们还使用常用的学习线性变换和 softmax 函数,将解码器输出转换为预测的下一个标记概率。在我们的模型中,我们在两个嵌入层和预软最大线性变换之间共享相同的权重矩阵,这与 [24] 类似。在嵌入层中,我们将这些权重乘以 d m o d e l \sqrt{d_{model}} dmodel

3.5 位置编码

由于我们的模型不包含递归和卷积,为了让模型能够利用序列的顺序,我们必须注入一些关于序列中标记的相对或绝对位置的信息。为此,我们在编码器和解码器堆栈底部的输入嵌入中添加了 “位置编码”。位置编码的维度 dmodel 与嵌入式编码相同,因此两者可以相加。位置编码有多种选择,包括学习编码和固定编码 [8]。

在这项工作中,我们使用了不同频率的正弦和余弦函数:

在这里插入图片描述

其中, p o s pos pos 是位置, i i i 是维数。也就是说,位置编码的每个维度对应一个正弦波。波长形成一个从 2 π 2π 2π 10000 ⋅ 2 π 10000 \cdot 2π 100002π 的几何级数。我们之所以选择这个函数,是因为我们假设它可以让模型轻松地学习到相对位置,因为对于任何固定的偏移 k k k P E p o s + k PE_{pos+k} PEpos+k 都可以表示为 P E p o s PE_{pos} PEpos 的线性函数。

我们还尝试用学习到的位置嵌入[8]来代替,结果发现两个版本产生的结果几乎相同(见表 3 第(E)行)。我们之所以选择正弦波版本,是因为它可以让模型推断出比训练时遇到的序列长度更长的序列。


表 3:变压器架构的各种变化。未列出的值与基础模型的值相同。所有指标均基于英德翻译开发集 newstest2013。根据我们的字节对编码,列出的困惑度为每字片段的困惑度,不应与每字困惑度进行比较。

在这里插入图片描述



4 为什么 Self-Attention

在本节中,我们将比较自注意层与递归层和卷积层的各个方面,后者通常用于将一个可变长度的符号表示序列 ( x 1 , . . . , x n ) (x_1, ..., x_n) x1,...,xn映射到另一个等长序列 ( z 1 , . . . , z n ) (z_1, ..., z_n) z1,...,zn,其中 x i , z i ∈ R d x_i, z_i∈\mathbb{R}^d xi,ziRd,例如典型序列转换编码器或解码器中的隐藏层。我们使用自注意的动机有三个。

一个是每层的总计算复杂度。另一个是可并行化的计算量,以所需的最小顺序运算次数来衡量。

第三是网络中长距离依赖关系之间的路径长度。学习长程依赖关系是许多序列转导任务的关键挑战。影响学习此类依赖关系能力的一个关键因素是前向和后向信号必须在网络中穿越的路径长度。输入和输出序列中任意位置组合之间的路径越短,学习长距离依赖关系就越容易[11]。因此,我们还比较了由不同层类型组成的网络中任意两个输入和输出位置之间的最大路径长度。

如表 1 所示,自注意层连接所有位置的连续操作数不变,而递归层则需要 O ( n ) O(n) O(n) 次连续操作。就计算复杂度而言,当序列长度 n n n 小于表示维度 d d d 时,自注意层的速度要快于递归层,机器翻译中最先进的模型所使用的句子表示,如单词片[31]和字节对[25]表示,通常就是这种情况。


表 1:不同层类型的最大路径长度、每层复杂度和最小顺序操作数。n 是序列长度,d 是表示维度,k 是卷积的内核大小,r 是受限自注意邻域的大小。

在这里插入图片描述


为了提高涉及超长序列任务的计算性能,可以限制自我注意的范围,只考虑输入序列中以相应输出位置为中心、大小为 r r r 的邻域。这将把最大路径长度增加到 O ( n / r ) O(n/r) O(n/r)。我们计划在今后的工作中进一步研究这种方法。

核宽 k < n k < n k<n 的单个卷积层无法连接所有输入和输出位置对。在内核连续的情况下,这样做需要堆叠 O ( n / k ) O(n/k) O(n/k) 个卷积层;在扩张卷积的情况下,则需要堆叠 O ( l o g k ( n ) ) O(log_k(n)) O(logk(n)) 个卷积层[15],从而增加了网络中任意两个位置之间最长路径的长度。卷积层的成本通常比递归层高 k k k 倍。然而,可分离卷积[6]将复杂度大大降低到 O ( k ⋅ n ⋅ d + n ⋅ d 2 ) O(k \cdot n \cdot d + n \cdot d^2) Oknd+nd2。即使在 k = n k = n k=n 的情况下,可分离卷积的复杂度也相当于自注意层和点式前馈层的组合,而我们在模型中采用的正是这种方法。

作为附带的好处,自我关注可以产生更多可解释的模型。我们从模型中检查了注意力分布,并在附录中介绍和讨论了一些例子。各个注意力头不仅明显学会执行不同的任务,而且许多注意力头似乎还表现出与句子的句法和语义结构有关的行为。


5. Training

本节将介绍我们模型的训练机制。

5.1 训练数据和批处理

我们在 WMT 2014 英德标准数据集上进行了训练,该数据集包含约 450 万个句子对。句子采用字节对编码[3],源目标共享词汇量约为 37000 个标记。对于英语-法语,我们使用了规模更大的 WMT 2014 英语-法语数据集,该数据集包含 3600 万个句子,并将标记拆分为 32000 个词块词汇[31]。句子对按近似序列长度分组。每个训练批包含一组句子对,其中包含约 25000 个源词块和 25000 个目标词块。

5.2 硬件和时间表

我们在一台配备 8 个英伟达 P100 GPU 的机器上训练模型。对于我们的基础模型,使用本文所述的超参数,每个训练步骤耗时约 0.4 秒。我们总共训练了 100,000 步或 12 个小时的基础模型。对于我们的大型模型(如表 3 底行所述),每步训练时间为 1.0 秒。大型模型的训练时间为 300,000 步(3.5 天)。

5.3 优化器

我们使用了亚当优化器[17], β 1 = 0.9 β_1 = 0.9 β1=0.9 β 2 = 0.98 β_2 = 0.98 β2=0.98 ϵ = 1 0 − 9 \epsilon = 10^{-9} ϵ=109。在训练过程中,我们根据公式改变学习率:

在这里插入图片描述

这相当于在第一个热身 w a r m u p _ s t e p s warmup\_steps warmup_steps训练步数中线性增加学习率,此后学习率按步数的平方反比例递减。我们使用的是 w a r m u p _ s t e p s = 4000 warmup\_steps = 4000 warmup_steps=4000

5.4 正则化

在训练过程中,我们采用了三种正则化方法:

残差滤波 我们对每个子层的输出进行滤波 [27],然后将其添加到子层输入中并进行归一化处理。此外,我们还对编码器和解码器堆栈中的嵌入和位置编码之和进行了滤除。在基础模型中,我们使用 P d r o p , = 0.1 P_{drop}, = 0.1 Pdrop,=0.1 的比率。

标签平滑 在训练过程中,我们使用了标签平滑值 ϵ l s = 0.1 \epsilon _{l_s} = 0.1 ϵls=0.1 [30]。这样做会增加模型的不确定性,从而降低复杂度,但却提高了准确度和 BLEU \text{BLEU} BLEU 得分。

6 Results

6.1 Machine Translation

在 WMT 2014 英译德翻译任务中,大转换器模型(表 2 中的转换器(big))的 BLEU \text{BLEU} BLEU 值比之前报道的最佳模型(包括集合)高出 2.0 以上,达到了 28.4 的新的最先进 BLEU \text{BLEU} BLEU 值。该模型的配置见表 3 底行。在 8 个 P100 GPU 上的训练耗时 3.5 天。即使是我们的基本模型,也超越了之前发布的所有模型和集合,而训练成本只是任何竞争模型的一小部分。


表 2:在英语到德语和英语到法语的 newstest2014 测试中,Transformer 的 BLEU 分数优于之前的先进模型,而训练成本仅为之前的一小部分。

在这里插入图片描述


在 WMT 2014 英语到法语的翻译任务中,我们的大模型获得了 41.0 的 BLEU 分数,超过了之前发布的所有单一模型,而训练成本还不到之前最先进模型的四分之一。为英译法而训练的 Transformer(大)模型使用了 P d r o p = 0.1 P_{drop} = 0.1 Pdrop=0.1,而不是 0.3 0.3 0.3

对于基本模型,我们使用的是通过平均最近 5 个检查点获得的单一模型,这些检查点以 10 分钟的间隔写入。对于大型模型,我们取最后 20 个检查点的平均值。我们使用波束搜索,波束大小为 4,长度惩罚 α = 0.6 α = 0.6 α=0.6 [31]。这些超参数是在开发集上实验后选择的。我们将推理过程中的最大输出长度设定为输入长度 + 50,但尽可能提前终止推理 [31]。

表 2 总结了我们的结果,并将我们的翻译质量和训练成本与文献中的其他模型架构进行了比较。我们通过将训练时间、使用的 GPU 数量和每个 GPU 的持续单精度浮点运算能力的估计值相乘,估算出训练一个模型所使用的浮点运算次数(我们为 K80、K40、M40 和 P100 分别使用了 2.8、3.7、6.0 和 9.5 TFLOPS 的数值)。

6.2 模型变化

为了评估 Transformer 不同组件的重要性,我们以不同方式改变了基础模型,测量了开发集 newstest2013 上英译德性能的变化。我们使用了上一节所述的波束搜索,但没有使用检查点平均法。表 3 列出了这些结果。

如 3.2.2 节所述,在表 3 行(A)中,我们改变了注意力头的数量以及注意力键和值的维度,但计算量保持不变。虽然单头注意力比最佳设置差 0.9 BLEU,但注意力头数过多也会导致质量下降。

在表 3 行(B)中,我们发现减小关注键大小 dk 会降低模型质量。这表明,确定兼容性并不容易,比点积更复杂的兼容性函数可能更有益处。在第(C)行和第(D)行中,我们进一步观察到,正如我们所预期的那样,模型越大越好,而 dropout 对避免过度拟合很有帮助。在第(E)行中,我们用学习到的位置嵌入[8]替换了正弦位置编码,观察到的结果与基础模型几乎完全相同。

7 Conclusion

在这项工作中,我们提出了 “变形器”,这是第一个完全基于注意力的序列转换模型,用多头自我注意力取代了编码器-解码器架构中最常用的递归层。

在翻译任务中,Transformer 的训练速度明显快于基于递归层或卷积层的架构。在 WMT 2014 英译德和 WMT 2014 英译法翻译任务中,我们都达到了新的技术水平。在前一项任务中,我们的最佳模型甚至优于之前报告的所有集合。

我们对基于注意力的模型的未来充满期待,并计划将其应用于其他任务。我们计划将 Transformer 扩展到涉及文本以外的输入和输出模式的问题上,并研究局部的、受限的注意力机制,以有效处理大型输入和输出,如图像、音频和视频。我们的另一个研究目标是减少生成的顺序。

我们用于训练和评估模型的代码可在 https://github.com/tensorflow/tensor2tensor 上获取。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/591304.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenWRT部署Zerotier虚拟局域网实现内网穿透

前言 细心的小伙伴肯定已经发现了&#xff1a;电脑上部署了Zerotier&#xff0c;如果路由器也部署了OpenWRT&#xff0c;那是否能远程访问呢&#xff1f; 答案是肯定的。 OpenWRT部署Zerotier有啥好处&#xff1f; 那好处必须多&#xff0c;其中的一个便是在外远程控制家里…

Win11安装Postgresql(更新于24.5)

Postgresql是一个功能强大的开源对象关系数据库系统&#xff0c;拥有超过 35 年的积极开发经验&#xff0c;这为其在可靠性、功能稳健性和性能方面赢得了良好的声誉。 1.安装程序下载 根据系统版本型号选择对应安装程序完成下载 网址&#xff1a; https://www.enterprisedb…

自定驾驶A*算法的思路

1. 背景 2 算法理论 2. 1.A*算法公式 2.2. H是不确定的 2.4. H使用的启发函数 2.5. 曼哈顿距离

电机控制系列模块解析(14)—— 脉冲频率/幅值/密度调制

一、脉冲序列调制&#xff08;PSM&#xff09; 脉冲宽度调制&#xff08;PWM&#xff09;、脉冲幅值调制&#xff08;PAM&#xff09;和脉冲密度调制&#xff08;PDM&#xff09;都是脉冲序列调制技术&#xff0c;它们通过改变脉冲信号的某一特性&#xff08;宽度、幅值或密度…

机器学习每周挑战——二手车车辆信息交易售价数据

这是数据集的截图 目录 背景描述 数据说明 车型对照&#xff1a; 燃料类型对照&#xff1a; 老规矩&#xff0c;第一步先导入用到的库 第二步&#xff0c;读入数据&#xff1a; 第三步&#xff0c;数据预处理 第四步&#xff1a;对数据的分析 第五步&#xff1a;模型建…

深入了解 Arthas:Java 应用程序诊断利器

序言 在 Java 应用程序的开发和运维过程中&#xff0c;诊断和解决性能问题是一项非常重要的任务。而 Arthas 作为一款由阿里巴巴开发的 Java 应用程序诊断工具&#xff0c;提供了一系列强大的功能&#xff0c;帮助开发人员实时监控、诊断和调优Java 应用程序。本文将深入介绍 …

压缩机的实际制冷量

制冷压缩机是制冷系统的“心脏”&#xff0c;吸收来自蒸发器的制冷剂蒸气&#xff0c;提高压力后排气到冷凝器&#xff0c;使制冷剂在系统中循环流动。 按温度范围可以分为高温&#xff0c;中温&#xff0c;低温制冷压缩机。按密封结构形式分类为开启式&#xff1b;半封闭式&a…

深度学习每周学习总结P7(咖啡豆识别)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 –来自百度网盘超级会员V5的分享 数据链接 提取码&#xff1a;7zt2 –来自百度网盘超级会员V5的分享 目录 0. 总结1. 数据导入及处理部分…

【Linux】学习笔记

文章目录 [toc]第一章&#xff1a;基础篇01|课程介绍02|内容综述03|什么是Linux04|Linux的内核版本及常见发行版内核版本发行版本Red Hat Enterprise LinuxFedoraCentOSDebianUbuntu 05|安装VirtualBox虚拟机VirtualBox下载url 06|在虚拟机中安装Linux系统Linux安装镜像下载 07…

020、Python+fastapi,第一个Python项目走向第20步:ubuntu 24.04 docker 安装mysql8、redis(一)

系列文章 pythonvue3fastapiai 学习_浪淘沙jkp的博客-CSDN博客https://blog.csdn.net/jiangkp/category_12623996.html 前言 docker安装起来比较方便&#xff0c;不影响系统整体&#xff0c;和前面虚拟环境有异曲同工之妙&#xff0c;今天把老笔记本T400拿出来装了个ubuntu24…

# 从浅入深 学习 SpringCloud 微服务架构(八)Sentinel(1)

从浅入深 学习 SpringCloud 微服务架构&#xff08;八&#xff09;Sentinel&#xff08;1&#xff09; 一、sentinel&#xff1a;概述 1、前言 – 服务熔断 Hystrix 的替换方案。 1&#xff09;2018年底 Netflix 官方宣布 Hystrix 已经足够稳定&#xff0c;不再积极开发 Hys…

redis中的双写一致性问题

双写一致性问题 1.先删除缓存或者先修改数据库都可能出现脏数据。 2.删除两次缓存&#xff0c;可以在一定程度上降低脏数据的出现。 3.延时是因为数据库一般采用主从分离&#xff0c;读写分离。延迟一会是让主节点把数据同步到从节点。 1.读写锁保证数据的强一致性 因为一般放…

值得推荐的5个免费 PDF 转 Word 转换器分享

最好的免费 PDF 转 Word 转换器专注于两件事&#xff1a;范围和速度。 大多数 PDF 转换工具不限于一种文件类型 - 它们允许您将 PDF 转换为Microsoft Word&#xff0c;以及转换 Excel、Powerpoint 和其他 Office 应用程序&#xff08;并再次转换回来&#xff09;。最好的人很快…

C语言:指针详解(3)

目录 一、字符指针 二、数组指针 1.数组指针的定义 2.数组指针的初始化 3. 二维数组传参的本质 三、函数指针 1.函数指针的创建 2.函数指针的使用 3.有趣的代码(1) 4.有趣的代码(2) 四、typedef关键字 1.typedef的使用方法 2.typedef和#define的区别 五、函数指针…

社交媒体数据恢复:新浪微博

当我们在使用新浪微博时&#xff0c;可能会遇到一些意外情况&#xff0c;如误删微博、账号出现问题等。这时&#xff0c;我们需要进行数据恢复。本文将详细介绍如何在新浪微博中进行数据恢复。 首先&#xff0c;我们需要了解新浪微博的数据恢复功能。根据微博的帮助中心&#…

【智能算法应用】麻雀搜索算法求解非线性方程组问题

目录 1.算法原理2.数学模型3.结果展示4.代码获取 1.算法原理 【智能算法】麻雀搜索算法&#xff08;SSA&#xff09;原理及实现 2.数学模型 非线性方程组为&#xff1a; 2 x 1 − x 2 e − x 1 − x 1 2 x 2 e − x 2 (1) \begin{aligned}&2x_1-x_2e^{-x_1}\\&-…

【Redis面试题】Redis常见的一些高频面试题

分享几个Redis入门级常见面试过程中遇到的题目! 你项目中哪里使用到了redis?可以讲一讲嘛 这个题目无论是大公司还是小公司都经常考,建议大家根据自己的项目做总结 redis的几种基础数据结构 redis为什么那么快&#xff1f; 1.基于内存实现&#xff1a;我们都知道内存读写是…

关于YOLO8学习(三)训练自定义的数据集

前文 关于YOLO8学习&#xff08;一&#xff09;环境搭建&#xff0c;官方检测模型部署到手机 关于YOLO8学习&#xff08;二&#xff09;数据集收集&#xff0c;处理 简介 本文将会讲解&#xff1a; &#xff08;1&#xff09;如何通过PyCharm&#xff0c;进行训练数据&#…

关于Clion开发stm32printf重定向问题简单解决问题方法

title: 关于Clion开发stm32printf重定向问题简单解决问题方法 tags: STM32Clion 参考来源1 这是另一种方法 在printf 重定向的基础上加上 一句 setbuf(stdout,NULL); 参考来源2 自己写的笔记啦

TCP重传机制——快速重传

TCP 有一种快速重传机制&#xff0c;它不以时间为驱动&#xff0c;而是以数据驱动重传。 在上图&#xff0c;发送方发出了 1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5 份数据&#xff1a; 第一份 Seq1 先送到了&#xff0c;于是就 Ack 回 2&#xff1b;结果 Seq2…