Attention Is All Your Need论文翻译

0.摘要

这个统治序列转换模型是基于复杂循环或者卷积神经网络,它包含编码器和解码器。表现最好的模型也通过注意力机制来连接编码器和解码器。我们提出了一个新的简单网络架构——Transformer,它仅仅是是基于注意力机制,完全免去递推和卷积。在两个机器翻译任务的实验表明,这些模型在质量上更好,同时更好的并行性和需要的训练时间显著减少。我们的模型在WMT 2014英翻德的任务上实现了28.4 BLEU,比现有的最好的结果(包括ensembles)提高了2 BLEU。在WMT 2014英翻法任务中,我们的模型在8个GPU上训练了3.5天后,建立了一个新的单模型最新BLEU分数为41.8,这是文献中最好模型的训练成本的一小部分。我们通过成功地应用Transformer到英语选区用大量有限地训练数据分析,发现Transformer可以很好地泛化到其他任务上。

1.引言

循环神经网络、特别是长短期记忆和门控神经网络,已经被稳定地建立在序列模型和转换问题(比如语言模型和机器翻译)的最新方法中。此后,大量的精力继续推动循环语言模型和编码-解码架构的界限。

循环模型通常沿着把输入和输出序列的符号位置进行计算。将位置和计算时间中的步骤进行对其,它们产生一系列隐藏状态ht,作为前一个隐藏状态ht-1和位置t输入的一个函数。这个固有的顺序性质阻止训练样本中的并行性,这在更长的序列长度上是至关重要的,因为内存限制限制了样本间的批处理。最近工作通过因数分解技巧和条件计算在计算效率上已经实现了显著的进步,与此同时提升了后者的模型性能。但是,根本的顺序计算限制仍然存在。

注意力机制已经成为各种任务中引人入胜的序列建模和转换模型的一个必要的部分,允许依赖建模,而不考虑它们在输入输出序列上的距离。但是,除了一些例子中,这样的注意力机制被用来与一个循环网络结合。

在这项工作中,我们提出了Transformer,这是一个回避循环并且完全依赖注意力机制去绘制输入和输出间的全局依赖关系的模型架构。Transformer允许显著的更多并行性并且在8块P100GPU上被训练只要12小时就可以在翻译质量上达到一个最先进的水平。

2.背景

减少序列化计算的目标也是为可扩展神经元GPU——ByteNet和ConvS2S奠定基础,它们都使用卷积神经网络作为基本构建块,并行计算所有输入输出位置的隐藏表示。在这些模块中,被要求关联两个任意输入或输出位置的信号的操作数量随着位置间距离的增长而增长,对于ConvS2S是线性增长而对于ByteNet是对数增长。这使得去学习两个远距离位置的依赖关系更加困难。在Transformer中,这被减少到一个恒定的操作数量,尽管其代价是由于平均注意力加权位置而减少有效分辨率,我们在3.2节中描述用一个多头注意力来抵消的影响。

自我注意力有时又叫内部注意力,这是一个注意力机制,是将单个序列不同位置联系起来以计算一个序列表示的注意力机制。自我注意力已经被成功地运用到不同地任务中,包括阅读理解,抽象总结,文本蕴含和学习任务无关的句子表示。

端到端的记忆网络是基于一个循环注意力机制而不是序列对齐递归,并且在简单语言问答和语言模型任务中表现很好。

但是,据我们所知,Transformer是第一个完全依赖自注意力去计算它的输入输出表示的转换模型,而没有使用序列对齐RNN或者卷积。在接下来的小结中,我们会描述Transformer,激励自我注意力和讨论它相对于[17]、[18]、[9]的优势。

3.模型架构

大部分竞争的神经序列转换模型有编码-解码结构。这里,编码器映射了一个符号表示的输入序列(x1,x2,x3,…,xn)到一个持续表示序列z=(z1,z2,…,zn)。给定向量z,解码器然后会产生一个符号输出序列(y1,y2,….,ym),每次一个元素。每一步这个模型是自动回归的,当产生下一个时,将之前生成的符号作为额外的输出。

图片1:Transformer的模型架构

Transformer遵循这个整体架构,对编码器和解码器使用堆叠自关注和逐点、全连接层,分别出现在图片1的左右两部分。

3.1编码器和解码器堆栈

编码器:编码器是由6个相同层的堆栈组成。每一层有两个自层。第一个子层是一个多头自关注机制,并且第二个子层是一个简单的,逐点的,全连接前向网络。我们在两个子层周围采用残差连接,然后进行层归一化。那就是,每个子层的输出是LayerNorm(x+Sublayer(x)), 其中Sublayer(x)是子层本身实现的函数。为了促进这些残差连接,模型中的所有子层和嵌入层,都会产生维度为d=512的输出。

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

3.2注意力

注意力函数可以被描述为将查询和一组键值对映射到输出,这里的查询,键,值和输出都是向量。输出被计算为值的加权和,其中赋每个值的权重是由查询相应键的兼容性函数计算的。

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

3.2.1 缩放点积注意力

我们称我们特别注意力为“缩放点积注意力”(如图2)。这个输入包含了维度为dk的查询和键,和维度为dv的值。我们使用所有的键计算查询的点积,将每个键除以根号dk,然后应用softmax函数去获得值上的权重。

事实上,我们同时计算一组查询上的注意力函数,并将它们打包成一个矩阵Q。键和值也被一起打包到矩阵K和V中。我们计算输出矩阵为:

两个最常用的注意力函数是加性注意力和点积(乘法)注意力。点积注意力和我们算法相同,除了缩放因子1/根号dk。附加注意力使用具有一个单隐藏层的前向反馈网络计算兼容性函数。尽管这两个在理论复杂度上相似,点积注意力事实上更快更节省空间,因为它可以使用高度的矩阵乘法代码实现。

尽管对于较小值的dk,两个机制地表现相似,附加注意力优于点积注意力,而无需针对较大的dk值进行缩放。我们怀疑,对于较大的dk值,点积的幅度会增大,从而推动softmax函数到它极小的梯度区域中。为了抵消这种音响,我们将点积缩放1/根号dk。

3.2.2多头注意力

我们发现使用不同的学习线性投影到dk,dk和dv维度h次是有益的,而不是用dmodel维度的键,值和查询来执行单个注意力函数。然后,我们对于这些查询,键和值的投影版本的每一个并行地执行注意力函数,产生dv维度的输出值。它们被连接并且再次投影,导致最终的值,如图2所示。

多头注意力允许这个模型共同关注来自不同地点不同表示子空间的信息。对于单注意力头,平均会抑制这种情况。

其中投影是参数矩阵

在这个工作中,我们使用了h=8的并行注意力层或者头。对于这些中每一个,我们使用dk = dv = dmodel / h = 64。由于每个头减少的维度,这个总的计算成本与使用全维度的单头注意力是相似的。

3.2.3注意力在我们模型中的应用

Transformer在三个方面使用多头注意力:

在“编码-解码注意”层中,这个查询来自之前的解码层,并且内存键和值来自编码器的输出。这允许解码器中的每个位置去参与输入序列的所有位置。这模仿序列到序列模型中典型的编码-解码注意力机制,如。

编码器包含自我注意力层。在一个自我注意力层中,所有的键、值和查实训来自同一个地方,在这个例子中,是编码器先前层的输出。编码器的每个位置可以关注编码器上一层的所有位置。

相似地,解码器中自注意力层允许解码器中每个位置关注解码器中达到并包含该位置的所有位置。我们需要去防止解码器中的左向信息流,以保留自回归属性。我们通过屏蔽(设置负无穷)softmax输入中所有与非法连接相对应的值来实现缩放点积注意力的内部。如图2。

3.3位置式前反馈网络

除了注意力子层,在我们编码-解码器中的每一层包含了一个全连接前向反馈网络,这被分别且相同地应用到每个位置。这是由两个线性变换组成,中间有一个ReLu激活。

尽管不同位置的线性变换是相同的,它们从一层到另一层用不同的参数。另一个描述这个的方式是内核大小为1的两个卷积。输入输出的维度是dmodel=512,并且内部层有dff=2048的维度。

3.4嵌入和softmax

与其他序列转换模型相似,我们使用学习嵌入去把输入标记和输出标记转换为维度dmodel的向量。我们使用学习嵌入去把输入标记和输出标记转换为维度dmodel的向量。我们还使用常用的学习线性转换和softmax函数去把解码输出转换为预测下一个标记的可能性。在我们的模型中,我们在两个嵌入层和预softmax线性转换之间共享同样的权重矩阵,类似于[30]。在嵌入层中,我们将那些权重乘以根号dmodel。

表格1:对于不同层类型的最大路径长度,每层复杂度和序列操作的最小数量。N是序列长度,d是表示维度,k是卷积核大小并且r是受限自注意力中领域的大小。

3.5位置编码

因为我们的模型不包含递归或卷积,为了使模型利用序列的顺序,我们必须投入一些有关序列中标记的相关或者绝对位置的信息。为此,我们把“位置编码”添加到在编码和解码栈底部的输入嵌入中。这个位置编码有着和嵌入相同的维度dmodel,以至于这两个可以被求和。有许多位置编码的选择,有学习的,有固定的。

在我们工作中,我们使用不同频率的sin和cos函数。

其中,pos是位置,i是维度。那是,位置编码的每个维度对应于正弦函数。波长形成从2Π到1000·2Π的几何级数。我们选择这个函数因为我们假定它会允许模型去轻松学习关注相关位置,因为对于任意固定的偏差k,PEpos+k可以被表示为PEpos的线性函数。

我们还尝试使用学习的位置嵌入,并且发现这两个版本产生几乎相同的结果(看表格3行E)。我们选择正弦版本,因为它可能允许模型去推断比在训练期间遭遇的序列长度更长的序列长度。

4 为什么是自注意力

在这个部分,我们把自注意力层的各种方面与循环层和卷积层进行比较,这些层通常被用于将符号表示的一个可变长度序列(x1,x2,..,xn)映射到另一个等长序列(z1,z2,...,zn),其中 xi, zi ∈ Rd,例如典型序列转换编码器或者解码器中的隐藏层。随着激励我们使用自注意力,我们考虑三个需求。

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

第三个是在网络中远程范围依赖之间的路径长度。学习远程依赖是许多序列转换任务中的关键挑战。一个影响学习这样依赖关系能力的关键因素是前向后向信号必须在网络中传播的路径长度。在输入输出序列中任何位置组合之间的路径越短,那么学习远程依赖关系也就越容易。

如表1所提到的,一个自关注层用一个固定的数量的序列执行操作连接所有位置,而一个循环层需要O(n)的序列操作。就计算复杂度而言,当序列长度n比表示维度d更小时,自注意力层比循环层更快,这通常是机器翻译中最新的模型使用的句子表示的情况,例如word-piece和byte-pair表示。为了提高长序列任务的计算性能,自注意力可能被限制去考虑输入序列中以相关输出位置为中心的大小为r的领域。这会增加最大路径长度到O(n/r)。我们计划在未来的工作中进一步研究这个方法。

一个内核宽度为k<n的单卷积层没有连接所有对的输入输出位置。做这样的事需要连续内核的一堆O(n/k)卷积层,或者在扩张卷积下的O(logk(n)),从而增加网络中任意两个位置之间最长路径的长度。卷积层通常比循环层更加贵k倍。但是,可分离卷积大大降低了复杂度达到O(knd + nd^2)。但是,即使k = n,一个可分离卷积的复杂度与自我注意力层和逐点前反馈层的组合相等,我们的模型中采取了这个方法。

作为附带的好处,自我注意力会产生更多可解释模型。我们检查模型中的注意力分布并且展示和讨论附录中的例子。个人注意力头不仅清晰学习执行不同的任务,而且许多其他注意力头似乎表现出关于句子语法和语义结构的行为。

5 训练

这个部分描述了我们模型的训练制度。

5.1 训练数据和批处理

我们使用标准WMT2014英翻德数据集上训练,该数据集包含大约450万句子对。句子是使用byte-pair编码的,这是一个大约由37000标记的共享源目标词汇。对于英翻法,我们使用包含3600万个句子组成的更大的WMT2014英翻法数据集,并且把标记分隔成32000个单词片段词汇表。

5.2硬件和时间表

我们在一个装有8块NVIDIA P100 GPUs上训练我们的模型。对于我们使用整篇论文中描述的超参数基本模型,每个训练步骤花了0.4s。我们训练这个基本模型花了共计100000步骤或者12h。对于我们的大模型(表3的底线所描述的),步长时间花了1秒。这个大模型被训练了300000步(3.5天)。

5.3优化器

我们使用beta1 = 0.9, beta2 = 0.98 和 c = 10e-9的Adam优化器。我们根据公式在训练过程中改变学习率。

这与第一个warmup_steps训练步骤线性地增加学习率相一致,然后与步骤数平方根的倒数成比例地减少。我们使用warmup_steps = 4000。

5.4正则化

我们在训练期间采用三种类型的正则化:

表2:Transformer在英翻德和英翻法newtest2014测试中以小部分训练成本实现了比先前最新的模型更好的BLEU分数

剩余辍学率: 我们应用dropout到每个子层的输出上,在它被添加到子层输入和被标准化之前。此外,我们将dropout应用到编码和解码堆栈中的的嵌入和位置编码综合。对于基准模型,我们使用Pdrop = 0.1的比率。

标签平滑:在训练期间,我们使用了值c = 0.1的标签平滑。这损害了困惑度,随着模型学习变得更加的不确定,但是提升了准确度和BLEU分数。

6结果

6.1机器翻译

在WMT 2014 英翻德的翻译任务上,一个大转换模型(表2Transformer(大)),比之前已报道过最好的模型(包括集成)表现要好2.0BLEU以上,然后建立了一个全新的最新28.4BLEU 分数。该模型的配置列于表3的最后一行。在8块P100GPU上训练了3.5天。甚至我们的基准模型超过了所有之前已经发布的模型和集成,训练成本是任何竞争模型的一小部分。

在WMT2014英法翻译任务中,我们的大模型获得了41.0的BLEU分数,超过了之前所有已发布的单个模型,比之前最新模型的训练成本的1/4还要少。这个被训练英法翻译的Transformer(大)模型使用辍学率Pdrop = 0.1,而不是0.3。

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

表2总结了我们的结果,并且把我们翻译质量和训练成本与文献中的其他模型架构进行了比较。我们通过将训练时间、使用的GPU数量以及每块GPU持续的单精度浮点容量的估计相乘来估计用于训练模型的浮点操作数量。

6.2模型变化

为了评估Transformer不同组件的重要性,我们用不同的方式改变了我们的基准模型,测量了在开发集newstest2013上英德翻译性能的变化。我们使用上一届中描述的波束搜索,但是没有平均检查点。我们在表三中呈现这些结果。

表3:Transformer架构上的变化。未列出的价值等同于哪些基准模型。所有指标是在英德翻译开发集newstests2013上。根据我们字节对编码,列出的困惑度是每个单词并且不应该与每个单词困惑度进行比较。

在表3行A中,正如3.2.2描述的,我们改变了注意力头和注意力键值维度的数量,使得计算量恒定。尽管弹头注意力比最好的设置要差0.9BLEU,但是头数过多质量也会下降。

在表3行B,我们观察到,下降的注意力键大小dk损害了模型质量。这里表明,确定兼容性并不容易并且一个更加复杂的兼容性函数与点积相比可能是有益的。我们进一步观察行C和行D发现,正如预期的,更大的模型是更好的,并且辍学是有助于避免过拟合的。在行(E),我们用学习位置嵌入取代我们正弦位置编码,并且观察到几乎与基本模型等同的结果。

6.3英语选区解析

为了评估这个Transformer是否可以泛化到其他任务,我们在英语选取解析上进行实验。这个任务提出了具体的挑战:输出受到强大结构约束并且明显比输入更长。进一步,RNN序列到序列模型不能够在小数据情况下获得最先进的结果。

我们在Penn Treebank的WSJ上,部分训练一个维度dmodel=1024的4层transformer,大约4万个训练句子。我们还在半监督环境中对其进行训练,使用了更大的高置信度和BerkleyParser语料库,其中包含大约1700万个句子。我们仅在WSJ设置中使用了1.6万个标记的词汇表,并且在半监督设置中使用了3.2万个标记的词汇表。

我们执行仅仅一小部分实验区选择dropout、注意力和残差(第5.4节),学习率和波束大小在2.2节开发集,所有其他参数与英语到德语基本翻译模型保持不变。在推理过程中,我们增加最大输出长度到输入长度+300。对于仅WSJ和半监督设置,我们使用大小为21的波束和apha=0.3。

表4:Transformer泛化很好到英语选区解析(结果见WSJ的23节)

表4中我们的结果表明,尽管缺乏特定任务的调整,我们的模型表现出奇的好,比之前报告的所有模型(循环神经网络语法除外)产生了更好的结果。

与 RNN 序列到序列模型 [37] 相比,即使仅在 WSJ 40K 句子训练集上进行训练,Transformer 的性能也优于 BerkeleyParser [29]。

7总结

在这个工作中,我们呈现了Transformer,这是第一个完全基于注意力的序列转导模型,用多头自我注意力取代在编码-解码架构中最常使用的推导层。

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

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

致谢 我们感谢Nal Kalchbrenner和Stephan Gouws富有成效的评论、更正和启发。

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

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

相关文章

Docker基础篇

docker 三个要素 镜像容器仓库 CentOS 6.8 安装 docker centos 7.0 yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager -y --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo systemctl start docker

『运维备忘录』之 APT 命令详解

运维人员不仅要熟悉操作系统、服务器、网络等只是&#xff0c;甚至对于开发相关的也要有所了解。很多运维工作者可能一时半会记不住那么多命令、代码、方法、原理或者用法等等。这里我将结合自身工作&#xff0c;持续给大家更新运维工作所需要接触到的知识点&#xff0c;希望大…

【制作100个unity游戏之25】3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机战利品宝箱12(附带项目源码)

效果演示 文章目录 效果演示系列目录前言悬停显示物品详情源码完结 系列目录 前言 欢迎来到【制作100个Unity游戏】系列&#xff01;本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第25篇中&#xff0c;我们将探索如何用unity制作一个3D背包、库存、制作、快…

【感知机】感知机(perceptron)学习算法的对偶形式

感知机( perceptron )是二类分类的线性分类模型&#xff0c;其输入为实例的特征向量&#xff0c;输出为实例的类别&#xff0c;取1 和-1二值。感知机对应输入空间(特征空间)中将实例划分为正负两类的分离超平面&#xff0c;是一种判别模型。感知机是神经网络与支持向量机的基础…

GPT-4助力我们突破思维定势

GPT-4在突破思维局限、激发灵感和促进知识交叉融合方面的作用不可小觑&#xff0c;它正逐渐成为一种有力的工具&#xff0c;助力各行业和研究领域的创新与发展。 GPT-4在突破传统思维模式、拓宽创新视野和促进跨学科知识融合方面扮演着越来越重要的角色&#xff1a; 突破思维…

【JAVA】List.addAll 详解

List.addAll() 方法是 Java 中 List 接口提供的一个用于向一个 List 集合中添加另一个 List 集合中所有元素的方法。该方法可以方便地将一个 List 集合中的元素添加到另一个 List 集合中&#xff0c;从而使得代码变得更加简洁&#xff0c;功能更加优秀。 一、使用List.addAll方…

Vue首屏优化,12个提速建议

文章目录 代码拆分和懒加载&#xff1a;代码拆分懒加载 图片优化&#xff1a;组件懒渲染&#xff1a;数据预获取和缓存&#xff1a;服务器端渲染&#xff08;SSR&#xff09;&#xff1a;代码压缩和合并&#xff1a;使用 CDN 加速&#xff1a;监控和性能分析&#xff1a;代码优…

SpringBoot+Vue项目部署上线

部署前准备 注册京东云 京东云: https://www.jdcloud.com/ 117.72.32.65vue本地部署 新建文件.env.development VUE_APP_BASEURLhttp://localhost:9191新建文件 .env.production VUE_APP_BASEURLhttp://117.72.32.65:9191main.js 设置全局变量$baseUrl Vue.prototype.$baseUrl…

《学成在线》微服务实战项目实操笔记系列(P92~P120)【下】

史上最详细《学成在线》项目实操笔记系列【下】&#xff0c;跟视频的每一P对应&#xff0c;全系列18万字&#xff0c;涵盖详细步骤与问题的解决方案。如果你操作到某一步卡壳&#xff0c;参考这篇&#xff0c;相信会带给你极大启发。 四、课程发布模块 4.1 (课程发布)模块需求…

ElementUI Form:Cascader 级联选择器

ElementUI安装与使用指南 Cascader 级联选择器 点击下载learnelementuispringboot项目源码 效果图 el-cascader.vue&#xff08;Cascader 级联选择器&#xff09;页面效果图 项目里el-cascader.vue代码 <script> let id 0; export default {name: el_cascader,dat…

MySQL数据库基础(五):SQL语言讲解

文章目录 SQL语言讲解 一、SQL概述 二、SQL语句分类 1、DDL 2、DML 3、DQL 4、DCL 三、SQL基本语法 1、SQL语句可以单行或多行书写&#xff0c;以分号结尾 2、可使用空格和缩进来增强语句的可读性 3、MySQL数据库的SQL语句不区分大小写&#xff0c;关键字建议使用大写…

数据结构-邻接矩阵

介绍 邻接矩阵&#xff0c;是表示图的一种常见方式&#xff0c;具体表现为一个记录了各顶点连接情况的呈正方形的矩阵。 假设一共有以下顶点&#xff0c;其连接关系如图所示 那么&#xff0c;怎么表示它们之间的连接关系呢&#xff1f; 我们发现&#xff0c;各条边所连接的都…

Spring学习笔记(三)--Spring中的Bean的管理

一、什么是Bean Bean是注册到Spring容器中的Java类&#xff0c;控制反转和依赖注入都是通过Bean实现的&#xff0c;任何一个Java类都可以是一个Bean。Bean由Spring进行管理&#xff0c;可以通过xml文件对bean进行配置和管理。 二、BeanFactory接口和ApplicationContext接口&a…

Java基于微信小程序的医院挂号小程序,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

神经网络算法原理

目录 得分函数 数学表示 计算方法 损失函数 ​编辑 前向传播 反向传播 ​编辑 整体架构 正则化的作用 数据预处理 ​过拟合解决方法 得分函数 得分函数是在机器学习和自然语言处理中常用的一种函数&#xff0c;用于评估模型对输入数据的预测结果的准确性或匹配程度。…

全新工业制造时代当中,EM-I12U加固平板终端起到了哪些决定性作用?

随着人们的物质生活水平、经济水平发生改变&#xff0c;行业当上面的竞争也由原来的传统行业向着科技产业转型&#xff0c;就连传统的工业生产、流水线操作都进入了智能化模式当中&#xff0c;可见效率、质量、价格、数据化已经摆到了每个行业的面前。 数字化转型意味着企业会…

P2024 [NOI2001] 食物链 带权并查集 循环关系

题目&#xff1a; P2024 [NOI2001] 食物链 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 本文学习自&#xff1a; 题解 P2024 【食物链】 - RE: 从零开始的异世界信竞生活 - 洛谷博客 (luogu.com.cn) ———— 关系并查集其实就是在普通并查集的基础上额外开个数组r…

Pandas Series Mastery: 从基础到高级应用的完整指南【第83篇—Series Mastery】

Pandas Series Mastery: 从基础到高级应用的完整指南 Pandas是Python中一流的数据处理库&#xff0c;它为数据科学家和分析师提供了强大的工具&#xff0c;简化了数据清理、分析和可视化的流程。在Pandas中&#xff0c;Series对象是最基本的数据结构之一&#xff0c;它为我们处…

【STM32 CubeMX】SPI层次结构SPI协议与SPI控制器结构

文章目录 前言一、SPI 程序层次1.1 硬件原理图1.2 硬件框图1.3 软件层次 二、SPI协议2.1 硬件连线2.2 如何访问SPI设备2.3 SPI 框图 总结 前言 随着嵌入式系统的迅猛发展&#xff0c;STM32系列微控制器在各种应用中得到广泛应用。在嵌入式系统设计中&#xff0c;串行外设接口&…

洗眼镜机是什么原理?眼镜适合用超声波清洗机洗吗?

洗眼镜机是一种通过超声波技术进行清洗的设备&#xff0c;它利用超声波振动在清洗液中产生微小气泡并将其释放到眼镜表面&#xff0c;从而去除污垢、油脂和细菌。洗眼镜机也是相当于超声波清洗机&#xff0c;超声波清洗机能够清洗的物品是有非常的多&#xff0c;不止可以清洗眼…