【论文阅读】Attention is all you need

摘要
主要的序列转换模型是基于复杂的循环或卷积神经网络,其中包括一个编码器和一个解码器。性能最好的模型还通过一种注意力机制将编码器和解码器连接起来。我们提出了一种新的简单的网络架构,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.背景
减少顺序计算的目标也形成了Extended Neural 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,解码器一次生成一个符号的输出序列 ( y 1 , . . . , y m ) (y_1,...,y_m) y1...ym。在每一步中,模型都是自回归的[9],在生成下一个符号时使用之前生成的符号作为附加的输入。
Transformer遵循这种架构,对编码器和解码器都使用堆叠的自注意力层和point-wise的全连接层,分别如图1的左半部分和右半部分所示。
在这里插入图片描述
3.1编码器和解码器堆栈
编码器: 编码器由6个相同的层组成。每个层都有两个子层。第一层是一个多头自注意力,然后第二层比较简单,逐位置的全连接前馈网络。我们在两个子层上都使用了残差连接[10],然后进行层归一化[1]。也就是说,每个子层的输出是 L a y e r N o r m ( x + S u b l a y e r ( x ) ) LayerNorm(x +Sublayer(x)) LayerNormx+Sublayer(x),其中 S u b l a y e r ( x ) Sublayer(x) Sublayer(x)是由子层本身产生的因变量。为了方便这些残差连接,模型中的所有子层以及嵌入层都会产生维度为 d m o d e l d_model dmodel= 512的输出。
解码器: 解码器也由6个相同的层组成。除了每个编码器层中的两个子层外,解码器还插入第三个子层,该子层对编码器堆栈的输出执行多头注意力。与编码器类似,我们在每个子层周围使用剩余连接,然后进行层归一化。我们还修改了解码器堆栈中的自注意力子层(解码器块中有一个Masked Multi-Head Attention),以防止位置关注后续的位置。这种掩蔽,加上输出嵌入的一个位置偏移,确保了对位置 i i i的预测只能依赖于小于 i i i的位置的已知输出。
3.2注意力
注意力函数可以描述为将查询(query)和一组键-值(key-value)对映射到输出,其中查询(query)、键(key)、值(value)和输出都是向量。输出是值的加权和,其中分配给每个值的权重由查询与相应键的兼容性函数计算。
3.2.1缩放点积注意力
我们将我们的特别注意力称为“缩放点积注意力”(图2)。
在这里插入图片描述
输入由维度为 d k d_k dk的查询和键,以及维度为 d v d_v dv的值组成。我们计算出查询和所有键的点积,用 d k \sqrt {d_k} dk 除以每一个值(scale操作),并应用一个softmax函数来获得这些值的权重。
在实际应用中,我们同时计算一组查询上的注意力因变量,并打包到一个矩阵 Q Q Q中。键和值也被打包到矩阵 K K K V V V中。我们计算输出的矩阵计算如下:
A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d k ) V Attention(Q,K,V)=softmax(\frac {QK^T}{\sqrt{d_k}})V Attention(Q,K,V)=softmax(dk QKT)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函数具有极小梯度。为了抵消这种效应,我们用 1 d k \frac 1 {\sqrt {d_k}} dk 1来缩放点积。
3.2.2多头注意
相比于单个 d m o d e l d_model dmodel维度的键,值和查询的注意力函数的表现,我们发现用不同的可学习线性投影分别将查询、键和值线性投影到dk、dk和dv维数,是很有益的。在每个查询、键和值的投影版本上,我们会并行地执行注意力函数,生成 d v d_v dv维的输出值。这些值被连接起来并再次投影,从而得到最终的值,如图2所示。
多头注意力允许模型在不同位置联合关注来自不同表示子空间的信息,而单个注意力头会抑制这种情况。
在这里插入图片描述
其中投影为参数矩阵 W i Q ∈ R d m o d e l ∗ d k W^Q_i∈R^{d_{model}*d_k} WiQRdmodeldk W i k W^k_i Wik R d m o d e l ∗ d k R^{d_{model}*d_k} Rdmodeldk W i V ∈ R d m o d e l ∗ d v W^V_i∈R^{d_{model}*d_v} WiVRdmodeldv W O ∈ R h d v ∗ d m o d e l W^O∈R^{hd_v*d_{model}} WORhdvdmodel
在这项工作中,我们使用了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以三种不同的方式使用多头注意力:

  • 在“编码器-解码器注意力”层中,查询来自于上一个解码器层,键和值来自于编码器的输出。这允许解码器中的每个位置都参与输入序列中的所有位置。这模拟了sequence-to-sequence模型中典型的编码-解码器注意力机制,如[31,2,8]。
  • 该编码器包含自注意力层。在自注意力层中,所有的键、值和查询都来自同一个位置,在这种情况下,上一层的输出在编码器中。编码器中的每个位置都可以注意到编码器上一层中的所有位置。
  • 类似地,解码器中的自注意力层允许解码器中的每个位置关注解码器中的所有位置,直到并包括该位置。**我们需要防止解码器中的信息向左流,以保持自回归特性。**我们通过屏蔽(设置为−∞)softmax输入中对应于非法连接的所有值来在缩放点积注意力内部实现这一点,见图2。

3.3位置前馈网络
除了注意力子层外,我们的编码器和解码器中的每个层都包含一个全连接的前馈网络,它分别相同地应用于每个位置。这由两个线性变换组成,中间有一个ReLU激活。
F F N ( x ) = m a x ( 0 , x W 1 + b 1 ) W 2 + b 2 FFN(x)=max(0,{xW_1+b_1})W_2+b_2 FFN(x)=max(0,xW1+b1)W2+b2
虽然线性转换在不同的位置上是相同的,但它们每层都使用不同的参数。另一种描述它的方法是用核大小为1的两个卷积。输入和输出的维度为 d m o d e l d_{model} dmodel= 512,且中间层的维数为 d f f = 2048 d_{ff}=2048 dff=2048
3.4嵌入和softmax
与其他序列转换模型类似,我们使用学习到的嵌入来将输入标记和输出标记转换为维度为 d m o d e l d_model dmodel的向量。我们还使用常用的可学习线性变换和softmax函数来将解码器的输出转换为预测的下一个标记的概率。在我们的模型中,我们在两个嵌入层之间共享相同的权重矩阵和pre-softmax线性变换,类似于[24]。在嵌入层中,我们将这些权重乘以 d m o d e l \sqrt {d_{model}} dmodel
3.5位置编码
由于我们的模型不包含递归和卷积,为了使模型利用序列的顺序,我们必须注入一些关于序列中标记的相对或绝对位置的信息。为此,我们在编码器和解码器堆栈底部的输入嵌入中添加“位置编码”。位置编码与嵌入具有相同的维数 d m o d e l d_{model} dmodel,因此两者可以求和。有许多位置编码的选择,可学习的和固定的。
在这项工作中,我们使用不同频率的正弦和余弦函数:
在这里插入图片描述
其中 p o s pos pos是位置, i i i是维度。也就是说,位置编码的每个维度都对应于一个正弦曲线。波长形成了一个从2π到10000·2π的几何级数。我们选择这个函数是因为我们假设它允许模型容易地学习相对位置,因为对于任何固定的偏移量k, P E p o s + k PE_{pos+k} PEpos+k可以表示为 P E p o s PE_{pos} PEpos的线性函数。
我们还实验了使用可学习的位置嵌入[8],发现两个版本产生的几乎相同的结果(见表3行(E))。因此我们选择正弦版本,因为它可能允许模型推断比训练中遇到的更长的序列长度。

4.为什么使用自注意力
在本节中我们从各个方面比较了自注意层和循环以及卷积层,这些常被用于映射一个可变长序列符号表示 ( 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∈R^d xiziRd,就像在一个典型的序列转换编码器或解码器中的隐藏层。为了激励我们使用自注意力,我们考虑了三个需求。
一个是每层的总计算复杂度。另一个是可以并行化的计算量,通过所需的最小顺序操作数量来衡量。
第三个是网络中长期依赖关系之间的路径长度。学习长期依赖关系是许多序列转导任务中的一个关键挑战。影响学习这种依赖关系能力的一个关键因素是信号在网络中向前和向后跨越的路径的长度。在输入和输出序列中的任何位置组合之间的这些路径越短,就越容易学习长期依赖关系[11]。因此,我们也比较了由不同层类型组成的网络中的任意两个输入和输出位置之间的最大路径长度。
在这里插入图片描述
如表1所示,自注意力层用恒定数量的顺序执行操作连接所有位置,而循环层需要O (n)个顺序操作。对于计算的复杂性,自注意力层在序列长度n小于表示维度d的时候比循环层快,这是机器翻译领域使用句子表示模型的最常见的情况,如word-piece[31]和byte-pair[25]表示。为了提高涉及很长序列的任务的计算性能,可以将自注意力限制在只考虑输入序列大小为r的邻域。这将使最大路径长度增加到 O ( n / r ) O(n/r) O(n/r)。我们计划在今后的工作中进一步研究这种方法。(计算复杂度变低了)
核大小为 k k k k < n k<n k<n的单个卷积层并不能连接所有的输入和输出位置对。要实现连接所有的位置对,在使用连续核的情况下,需要堆叠 O ( n / k ) O(n/k) O(n/k)个卷积层,或者在扩展卷积[15]的情况下,需要堆叠 O ( l o g k ( n ) ) O(log_k(n)) O(logk(n)),从而增加网络中任意两个位置之间的最长路径的长度。卷积层通常比循环层昂贵k倍。然而,可分离卷积[6]大大降低了复杂度,达到 O ( k ⋅ n ⋅ d + n ⋅ d 2 ) O(k·n·d + n·d^2) O(knd+nd2)。然而,即使使用k = n,可分离卷积的复杂性也等于自注意力层和点向前馈层的组合,这是我们在我们的模型中采用的方法。
作为额外的好处,自注意力可以产生更多可解释的模型。我们检查了从我们的模型中获得的注意力分布,并在附录中提出和讨论了一些例子。不仅单个的注意力头清楚地学会了执行不同的任务,而且许多头似乎表现出与句子的句法和语义结构相关的行为。

5.训练
本节描述了我们的模型的训练机制。
5.1训练数据和批次
我们在标准的WMT 2014英-德语数据集上进行了训练,该数据集包含约450万对句子对。句子使用字节对编码方法[3]进行编码,它有大约37000个标记的共享源数据词汇表。对于英法词汇,我们使用了明显更大的WMT 2014英法数据集,其中包含3600万个句子,并将标记分解为32000个字片词汇[31]。句子对按近似的序列长度组合在一起。每个训练batch包含一组句子对,其中包含大约25000个源标记和25000个目标标记。
5.2硬件和时间表
我们在一台使用8个NVIDIA P100 gpu的机器上训练我们的模型。对于我们使用整个论文中描述的超参数的基础模型,每个训练步骤大约需要0.4秒。我们总共训练了基本模型10万步或12个小时。对于我们的大模型(如表3的最后一行所描述的),步长时间为1.0秒。这些大型模型接受了30万步(3.5天)的训练
5.3优化器
我们使用了Adam优化器,其 β 1 = 0.9 , β 2 = 0.98 , ϵ = 1 0 − 9 β_1 = 0.9,β_2 = 0.98,\epsilon= 10^{−9} β1=0.9β2=0.98ϵ=109。我们在整个训练过程中按照以下公式改变学习率,如下:
在这里插入图片描述
这表示第一步骤warmup_steps训练步骤,学习率线性增加,然后按步数的平方反比成比例降低。我们设置warmup_steps = 4000。
5.4正则化
我们在训练过程中采用了三种类型的正则化:
Residual Dropout我们在其和子层的输入相加和归一化之前将dropout[27]应用于每个子层的输出。此外,我们还将dropout应用于编码器和解码器堆栈中的嵌入和位置编码求和。对于基础模型,我们使用 P d r o p = 0.1 P_{drop} = 0.1 Pdrop=0.1的速率。
标签平滑在训练过程中,我们采用了 ϵ l s = 0.1 \epsilon _{ls} = 0.1 ϵls=0.1 [30]的标签平滑。这会造成困惑,因为模型学习的更不确定,但提高了准确性和BLEU分数。
6.结论
6.1机器翻译
在WMT 2014英德翻译任务中,Transformer(big)(表2)比之前报道的最佳模型(包括集成)多出2.0个BLEU,实现了一个新的最先进的BLEU分数28.4分。该模型的配置列于表3的最后一行中。在8个P100gpu上进行训练需要3.5天。即使是我们的基础模型也超过了之前发表的所有模型和集合,而训练成本相比只是其竞争模型的一小部分。
在这里插入图片描述
在WMT 2014年的英法翻译任务中,我们的大模型获得了41.0分的BLEU分数,优于之前发布的所有单个模型,其训练成本不到之前最先进的模型的1/4。为英语到法语训练的Transformer(大)模型使用的丢弃率为 P d r o p = 0.1 P_{drop} = 0.1 Pdrop=0.1,而不是0.3。
对于基础模型,我们使用了通过平均最后5个检查点获得的单一模型,这些检查点每10分钟记录一次。对于大型模型,我们平均了最后20个检查点。我们使用了束搜索(beam search),束大小(beam size)为4,并且使用了长度惩罚α = 0.6 [31]。这些超参数是在开发集上经过实验后选择的。我们将推理期间的最大输出长度设置为输入长度 + 50,但在可能的情况下提前终止 [31]。
表2总结了我们的结果,并将我们的翻译质量和训练成本与文献中的其他模型架构进行了比较。我们通过将训练时间、使用的GPU数量和估计每个GPU 的持续单精度浮点容量相乘来估计用于训练模型的浮点运算的数量。
6.2模型变化
为了评估Transformer不同组件的重要性,我们以不同的方式修改了我们的基础模型,并测量了其在开发集newstest2013上进行英语到德语翻译时性能的变化。我们使用了前一节描述的束搜索方法,但没有使用检查点平均。我们在表3中展示了这些结果。
在这里插入图片描述
在表3的A行中,我们改变了注意力头的数量以及注意力键和值的维度,如3.2.2节所述,保持计算量不变。虽然单头注意力比最佳设置低0.9 BLEU,但太多的头也会导致质量下降。
在表3的B行中,我们观察到减小注意力键的大小dk会损害模型质量。这表明确定兼容性并不容易,可能需要比点积更复杂的兼容性函数。我们在C行和D行进一步观察到,如预期的那样,更大的模型表现更好,且dropout在避免过拟合方面非常有帮助。在E行中,我们用学习到的位置嵌入替换了我们的正弦位置编码[8],观察到的结果与基础模型几乎相同。
7 结论
在这项工作中,我们介绍了Transformer,这是第一个完全基于注意力的序列转换模型,它取代了在编码器-解码器架构中最常用的循环层,使用了多头自注意力机制
对于翻译任务,与基于循环或卷积层的架构相比,Transformer可以被显著更快地训练。在WMT 2014年的英德和英法翻译任务上,我们都达到了新的最佳水平。在前者任务中,我们的最佳模型甚至超过了以前报道的所有模型集合。
我们对基于注意力的模型的未来感到兴奋,并计划将它们应用到其他任务上。我们计划将Transformer扩展到除文本之外的输入和输出模态的问题,并研究局部的、限制性的注意力机制,以有效处理大型输入和输出,如图像、音频和视频。让生成过程更少依赖于序列化是我们的另一个研究目标。
我们用来训练和评估模型的代码在下列网址https://github.com/
tensorflow/tensor2tensor

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

杜牧是唐朝最风流的诗人

杜牧&#xff0c;有“杜紫薇”之称&#xff0c;是宰相杜佑的孙子。李白、杜甫是“大李杜”。杜牧、李商隐是“小李杜”。 杜牧23岁写了《阿房宫赋》&#xff0c;一朝成名天下知。 唐朝晚年&#xff0c;科举和仕途没有出路&#xff0c;杜牧寄情享乐。杜牧怀才不遇&#xff0c;…

C语言--函数递归

目录 1、什么是递归&#xff1f; 1.1 递归的思想 1.2 递归的限制条件 2. 递归举例 2.1 举例1&#xff1a;求n的阶乘 2.2 举例2&#xff1a;顺序打印⼀个整数的每⼀位 3. 递归与迭代 扩展学习&#xff1a; 早上好&#xff0c;下午好&#xff0c;晚上好 1、什么是递归&…

Ubuntu 22.04.4安装Docker引擎

正文共&#xff1a;1024 字 13 图&#xff0c;预估阅读时间&#xff1a;1 分钟 我们前面安装了几次Ubuntu的操作系统&#xff08;Ubuntu 23.10通过APT安装Open vSwitch&#xff09;&#xff0c;在开始之前&#xff0c;我还是简单提醒一下&#xff0c;从Ubuntu下载页面&#xff…

因式分解技巧1-----一次提净

什么是因式分解&#xff1f; 在小学&#xff0c;我们都学过质因数分解。就比如&#xff1a;&#xff0c;然而我们可以发现&#xff01;4此时还没有被分解完&#xff0c;于是&#xff1a; 则&#xff1a; 这是小学的质因数分解。那么我们一起看看初中的因式分解。 例1&…

SpringBoot3 函数式web 小记

前言&#xff1a;函数式web是spring5.2之后的一个新特性&#xff0c;Spring Boot 3 进一步优化了这一模型&#xff0c;为开发现代 Web 应用提供了更加灵活、简洁的方法&#xff1b; 函数式web的四大核心对象 - RouterFunction&#xff1a;定义路由信息 - RequestPredicates&am…

深度解析 Spring 源码:三级缓存机制探究

文章目录 一、 三级缓存的概述二、 三级缓存的实现原理2.1 创建Bean流程图2.2 getBean()2.3 doGetBean()2.4 createBean()2.5 doCreateBean()2.4 getSingleton() 三、 三级缓存的使用场景与注意事项3.1 在实际开发中如何使用三级缓存3.2 三级缓存可能出现的问题及解决方法 一、…

检索算法和技术的本质回顾

目录 一、数据结构和存储特点对检索效率的重大影响总结 二、数组和链表的线性结构检索 &#xff08;一&#xff09;基本分析 &#xff08;二&#xff09;使用二分查找提升数组检索效率 &#xff08;三&#xff09;灵活改造链表提升检索效率 问题背景 解决方案 歌曲块链…

循序渐进丨使用 Python 向 MogDB 数据库批量操作数据的方法

当我们有时候需要向数据库里批量插入数据&#xff0c;或者批量导出数据时&#xff0c;除了使用传统的gsql copy命令&#xff0c;也可以通过Python的驱动psycopg2进行批量操作。本文介绍了使用psycopg2里的executemany、copy_from、copy_to、copy_expert等方式来批量操作 MogDB …

[C++][算法基础]求a的b次方模p的值(快速幂)

给定 n 组 &#xff0c;对于每组数据&#xff0c;求出 的值。 输入格式 第一行包含整数 n。 接下来 n 行&#xff0c;每行包含三个整数 。 输出格式 对于每组数据&#xff0c;输出一个结果&#xff0c;表示 的值。 每个结果占一行。 数据范围 1≤n≤100000, 1≤≤2 …

移动Web学习09-响应式布局bootstrap案例开发

3、综合案例-AlloyTeam移动全端 准备工作 HTML 结构 <title>腾讯全端</title> <link rel"shortcut icon" href"favicon.ico" type"image/x-icon"> <!-- 层叠性&#xff1a;咱们的css 要 层叠 框架的 --> <link rel&…

匿名函数与gorm中的Transaction事务方法

整理下go中的匿名函数&#xff0c;项目中很多地方都在用。 1、函数类型的变量 Go中&#xff0c;函数也是一种数据类型。定义一个函数&#xff0c;把这个函数赋值给一个变量&#xff0c;这个变量就是函数类型的变量&#xff0c;用这个变量等价于直接调函数&#xff1a; packa…

数字阅览室解决方案

一、方案概述 “数字阅览室”概念一经提出&#xff0c;就得到了广泛的关注&#xff0c;纷纷组织力量进行探讨、研究和开发&#xff0c;进行各种模型的试验。随着数字地球概念、技术、应用领域的发展&#xff0c;数字阅览室已成为数字地球家庭的成员&#xff0c;为信息高速公路…

高频前端面试题汇总之JavaScript篇(上)

一、数据类型 1. JavaScript有哪些数据类型&#xff0c;它们的区别&#xff1f; JavaScript共有八种数据类型&#xff0c;分别是 Undefined、Null、Boolean、Number、String、Object、Symbol、BigInt。 其中 Symbol 和 BigInt 是ES6 中新增的数据类型&#xff1a; Symbol 代…

如何免费申请长期HTTPS证书?

长期HTTPS证书申请步骤&#xff1a; 第一步&#xff1a;确定证书类型 根据你的网站需求&#xff0c;选一种适合的HTTPS证书。一般有这几种&#xff1a; - 域名型&#xff08;DV&#xff09;证书&#xff1a;最基础&#xff0c;验证你对域名的所有权&#xff0c;适合个人网站或…

构建有序链表,有序链表的归并,反转链表

本次将对于构建有序链表&#xff0c;有序链表的归并&#xff0c;反转链表&#xff0c;进行一一介绍和代码分享。 首先是一些链表中的基本的函数&#xff1a; Node* creatList() {Node* headNode (Node*)malloc(sizeof(Node));assert(headNode);headNode->next NULL;retu…

海信电视:中国游戏的影像“黑神话”

【潮汐商业评论/文】 《西游记》最后一难中&#xff0c;通天河老鼋回唐三藏“何时才能修成正果”&#xff0c;《黑神话&#xff1a;悟空》也曾面临这个拷问&#xff0c;如今海信电视与它正在共同回答这个命题。 自2020年发布预告片震动行业后&#xff0c;这部游戏就承载着太多…

Shader 渐变屏幕

渐变 前置工作&#xff0c;创建缓冲&#xff0c;对顶点着色器传递顶点数据 function main() {var canvas document.getElementById(webgl);var gl getWebGLContext(canvas);if (!initShaders(gl, VSHADER_SOURCE, FSHADER_SOURCE)) returnvar n initVertexBuffers(gl); }fu…

HBM 发展史与前景(持续更新)

主页&#xff1a; 元存储博客 文章目录 前言1. JEDEC 规范2. HBM 发展历程3. HBM 应用场景4. HBM 市场前景5. 发展挑战 翻译自&#xff1a; https://namu.wiki/w/HBM 前言 NVIDIA H2 上的 HBM100e。 1. JEDEC 规范 2. HBM 发展历程 HBM技术曾被视为一种噱头&#xff0c;因为它…

PSAvatar:一种基于点的可变形形状模型,用于3D高斯溅射的实时头部化身创建

PSAvatar: A Point-based Morphable Shape Model for Real-Time Head Avatar Creation with 3D Gaussian Splatting PSAvatar&#xff1a;一种基于点的可变形形状模型&#xff0c;用于3D高斯溅射的实时头部化身创建 Zhongyuan Zhao1,2, Zhenyu Bao1,2, Qing Li1, Guoping Qiu3,…