深度学习进阶篇-国内预训练模型[6]:ERNIE-Doc、THU-ERNIE、K-Encoder融合文本信息和KG知识;原理和模型结构详解。

news2024/12/29 11:07:15

在这里插入图片描述
【深度学习入门到进阶】必看系列,含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、序列模型、预训练模型、对抗神经网络等

在这里插入图片描述
专栏详细介绍:【深度学习入门到进阶】必看系列,含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、序列模型、预训练模型、对抗神经网络等

本专栏主要方便入门同学快速掌握相关知识。后续会持续把深度学习涉及知识原理分析给大家,让大家在项目实操的同时也能知识储备,知其然、知其所以然、知何由以知其所以然。

声明:部分项目为网络经典项目方便大家快速学习,后续会不断增添实战环节(比赛、论文、现实应用等)

专栏订阅:深度学习入门到进阶专栏

预训练

1.ERNIE-Doc: A Retrospective Long-Document Modeling Transformer

1.1. ERNIE-Doc简介

经典的Transformer在处理数据时,会将文本数据按照固定长度进行截断,这个看起来比较”武断”的操作会造成上下文碎片化以及无法建模更长的序列依赖关系。基于此项考虑,ERNIE-Doc提出了一种文档层级的预训练语言模型方法:ERNIE-Doc在训练某一个Segment时,允许该segment能够获得整个Doc的信息。

如图1所示,假设一篇完整的文档被分割成3个Segment: S 1 , S 2 , S 3 S_1, S_2, S_3 S1,S2,S3,在编码segment S 2 S_2 S2时,经典的Transformer依赖的只是 S 2 S_2 S2本身: P ( y ∣ S 2 ) P(y|S_2) P(yS2), Recurrence Transformer (例如 Transformer-XL)依赖的是 S 1 , S 2 S_1, S_2 S1,S2 P ( y ∣ S 1 , S 2 ) P(y|S_1,S_2) P(yS1,S2),这两种方法均没有使Segment S 2 S_2 S2获得完整的文档信息 S 1 , S 2 , S 3 S_1, S_2, S_3 S1,S2,S3

图1 ERNIE-Doc的建模方式图

但是ERNIE-Doc在建模过程中,使得每个Segment均能获得完整的文档信息: P ( y ∣ S 1 , S 2 , S 3 ) P(y|S_1, S_2,S_3) P(yS1,S2,S3),其中建模长序列的关键点如下:

  • Retrospective feed mechanism: 将文本两次传入模型获得文本序列的representation,第一次将获得完整的文本序列表示,然后该序列的representation继续参与第二次的编码过程,这样该文本序列在第二次编码过程中,每个token位置便能获得序列完整的双向信息。

  • Enhanced recurrence mechanism: 使用了一种增强的Segment循环机制进行建模。

  • Segment-reordering objective: 对一篇文档中的各个segment随机打乱,获得多个乱序文档,然后要求模型预测这些文档中哪个是正常语序的文档。

1.2. 经典/Recurrence Transformer的计算

在正式介绍正式ERNIE-DOC之前,我们先来回顾一下经典和Recurrence Transformer模型的计算。假设当前存在一个长文档 D D D​被划分为这样几个Segment: D = { S 1 , S 2 , . . . , S T } D=\{S_1, S_2, ..., S_T\} D={S1,S2,...,ST}​​,其中每个Segment包含 L L L​个token: S τ = { x τ , 1 , x τ , 2 , . . . , x τ , L } S_\tau = \{x_{\tau,1}, x_{\tau, 2}, ..., x_{\tau,L}\} Sτ={xτ,1,xτ,2,...,xτ,L}​​。另外约定 h τ n ∈ R L × d h_\tau^{n} \in \mathbb{R}^{L \times d} hτnRL×d为Transformer第 n n n层第 τ \tau τ​​个Segment的编码向量。对于第 τ + 1 \tau+1 τ+1​个Segment S τ + 1 S_{\tau+1} Sτ+1​,Transformer第 n n n层对其相应的编码计算方式为:

h ~ τ + 1 n − 1 = { h τ + 1 n − 1 , Vanilla Transformers [ SG ( h τ n − 1 )    ∘    h τ + 1 n − 1 ] , Recurrence Transformers q τ + 1 n ,    k τ + 1 n ,    v τ + 1 n = h τ + 1 n − 1 W q T ,    h ~ τ + 1 n − 1 W k T ,    h ~ τ + 1 n − 1 W v T h τ + 1 n = Transformer-Layer ( q τ + 1 n ,    k τ + 1 n ,    v τ + 1 n ) \begin{split} \begin{align} & \tilde{h}_{\tau+1}^{n-1} = \left\{ \begin{matrix} h_{\tau+1}^{n-1}, \qquad \text{Vanilla Transformers} \\ \left[ \text{SG}(h_{\tau}^{n-1}) \; \circ \;h_{\tau+1}^{n-1} \right], \qquad \text{Recurrence Transformers} \end{matrix} \right. \\ & q_{\tau+1}^{n}, \; k_{\tau+1}^n, \; v_{\tau+1}^n = h_{\tau+1}^{n-1}W_{q}^{\mathrm{ T }}, \; \tilde{h}_{\tau+1}^{n-1}W_{k}^{\mathrm{ T }}, \; \tilde{h}_{\tau+1}^{n-1}W_{v}^{\mathrm{ T }} \\ & h_{\tau+1}^n = \text{Transformer-Layer}(q_{\tau+1}^{n}, \; k_{\tau+1}^n, \; v_{\tau+1}^n) \end{align} \end{split} h~τ+1n1={hτ+1n1,Vanilla Transformers[SG(hτn1)hτ+1n1],Recurrence Transformersqτ+1n,kτ+1n,vτ+1n=hτ+1n1WqT,h~τ+1n1WkT,h~τ+1n1WvThτ+1n=Transformer-Layer(qτ+1n,kτ+1n,vτ+1n)

如上述讨论,这两种方式均不能使得每个Segment获得Doc的完整信息。

1.3. Retrospective feed mechanism

ERNIE-Doc借鉴了人类阅读的行为习惯,在人类阅读时会分为两个阶段:首先会快速略读一下文档内容,然后回过头来仔细阅读。ERNIE-Doc基于此设计了Retrospective feed mechanism,该机制同样包含两个阶段:Skimming phase 和 Retrospective phase。

具体来讲,一篇文档会传入模型两次,第一次被称为Skimming phase,在该阶段将会获得改文档的完整序列表示。第二次被称为 Retrospective phase,在该阶段将会融入Skimming phase获得的完整文档表示,开始进一步的编码计算,从而保证在第二次计算每个Segment编码时能够获得完整的文档信息。Retrospective phase的计算方式如下:

H ^ = [ H ^ 1 : T 1 ∘ H ^ 1 : T 2 ⋅ ⋅ ⋅ ∘    H ^ 1 : T N ] , (skimming phase) H ^ 1 : T i = [ h ^ 1 i ∘ h ^ 2 i ⋅ ⋅ ⋅ ∘    h ^ T i ] , (skimming phase) h ~ τ + 1 n − 1 = [ S G ( H ^ ∘ h τ n − 1 ) ∘ h τ + 1 n − 1 ] , (retrospective phase) \begin{split} \begin{align} \hat{H} &= \left[ \hat{H}_{1:T}^{1} \circ \hat{H}_{1:T}^{2} \cdot \cdot \cdot \circ \; \hat{H}_{1:T}^N \right], \quad \text{(skimming phase)} \\ \hat{H}_{1:T}^{i} &= \left[ \hat{h}_1^i \circ \hat{h}_2^i \cdot \cdot \cdot \circ \;\hat{h}_T^i \right] , \quad \text{(skimming phase)} \\ \tilde{h}_{\tau+1}^{n-1} &= \left[{SG}(\hat{H }\circ h_{\tau}^{n-1}) \circ h_{\tau+1}^{n-1} \right], \quad \text{(retrospective phase)} \end{align} \end{split} H^H^1:Tih~τ+1n1=[H^1:T1H^1:T2H^1:TN],(skimming phase)=[h^1ih^2ih^Ti],(skimming phase)=[SG(H^hτn1)hτ+1n1],(retrospective phase)

其中以上公式各个参数解释如下:

  • T T T​:一篇文档的Segment数量; N N N:Transformer模型层的数量; L L L​:每个Segment中的最大token数量。

  • H ^ ∈ R ( L × T × N ) × d \hat{H} \in \mathbb{R}^{(L \times T \times N) \times d} H^R(L×T×N)×d​​​​​:一篇文档在所有层中输出的编码向量。

  • H ^ 1 : T i ∈ R ( L × T ) × d \hat{H}_{1:T}^i \in \mathbb{R}^{(L \times T) \times d} H^1:TiR(L×T)×d : 一篇文档在第 i i i​层产生的编码向量。

  • h ^ τ i \hat{h}_\tau^i h^τi:第 τ \tau τ个Segment在第 i i i层产生的编码向量。

从以上公式可以看到,在retrospective 阶段,当计算每个Segment时,会引入完整文档的表示 H ^ \hat{H} H^​,这样就保证了编码时,每个token能够获得完整文档的信息。

1.4. Enhanced Recurrence Mechanism

ERNIE-Doc通过使用Retrospective feed mechanism和Enhanced Recurrence Mechanism两种方式,增大了计算每个segment时的有效上下文长度。但是第3节引入的公式计算复杂度是很高,因此 Enhanced Recurrence Mechanism期望前一个Segment便能获得完整的文档信息,然后直接融入前一个Segment便能使得当前Segment计算融入完整的文档信息。

如图2所示,ERNIE-Doc通过将前一个Segment的同层编码表示,引入了当前Segment的计算中,这个做法同时也有利于上层信息反补下层的编码表示,具体公式为:

h ~ τ + 1 n − 1 = [ S G ( h τ n ) ∘ h τ + 1 n − 1 ] \tilde{h}_{\tau+1}^{n-1} = \left[{SG}(h_\tau^n) \circ h_{\tau+1}^{n-1} \right] h~τ+1n1=[SG(hτn)hτ+1n1]

图2 ERNIE的Segment连接方式

1.5. Segment-Reordering Objective

在预训练阶段,ERNIE-Doc使用了两个预训练任务:MLM和Segment-Reordering Objective。我们先来讨论Segment-Reordering Objective,其旨在帮助模型显式地建模Segment之间的关系,其会将一篇长文档进行划分为若干部分,然后将这些部分进行随机打乱,最后让模型进行预测原始的语序,这是一个 K K K​分类问题: K = ∑ i = 1 m i ! K=\sum_{i=1}^m i! K=i=1mi!​,其中 m m m​​是最大的划分数量。

如图3所示,假设存在一篇文档 D D D被划分为3部分: D = { C 1 , C 2 , C 3 } D=\{C_1, C_2, C_3\} D={C1,C2,C3},ERNIE-Doc通过打乱这些部分得到 D ^ = { C 2 , C 3 , C 1 } \hat{D}=\{C_2, C_3, C_1\} D^={C2,C3,C1},然后在最后一个Segment S τ S_\tau Sτ的位置进行预测原始的文档顺序 C 1 , C 2 , C 3 C_1, C_2, C_3 C1,C2,C3

图3 预训练任务Segment-Reordering Objective

另外,在获得 D ^ = { C 2 , C 3 , C 1 } \hat{D}=\{C_2, C_3, C_1\} D^={C2,C3,C1}后,ERNIE-Doc会对 D ^ \hat{D} D^进行划分Segment: D ^ = { S 1 , S 2 , . . . , S T } \hat{D} = \{S_1,S_2,...,S_T \} D^={S1,S2,...,ST}​​​​,并且会对这些Segment中的某些Token 进行Mask,从而构造MLM任务,要求模型根据破坏的Segment S ^ τ \hat{S}_\tau S^τ恢复成原始的 S τ S_\tau Sτ​。结合MLM和Segment-Reordering Objective总的预训练目标为:

max θ    log    p θ ( S τ ∣ S ^ τ ) + 1 τ = T    log    p θ ( D ∣ D ^ ) \underset {\theta}{\text{max}} \; \text{log} \; p_\theta(S_\tau|\hat{S}_\tau) + \mathbb{1}_{\tau=T}\; \text{log}\;p_\theta(D|\hat{D}) θmaxlogpθ(SτS^τ)+1τ=Tlogpθ(DD^)

其中, 1 τ = T \mathbb{1}_{\tau=T} 1τ=T表示Segment-Reordering Objective仅仅在最后一个Semgnet S T S_T ST位置被执行,以优化模型。

  • 相关资料
  1. ERNIE-Doc: A Retrospective Long-Document Modeling Transformer

  2. ERNIE-Doc Github

2.ERNIE:Enhanced Language Representation with Informative Entities

2.1. THU-ERNIE简介

当前的预训练模型(比如BERT、GPT等)往往在大规模的语料上进行预训练,学习丰富的语言知识,然后在下游的特定任务上进行微调。但这些模型基本都没有使用知识图谱(KG)这种结构化的知识,而KG本身能提供大量准确的知识信息,通过向预训练语言模型中引入这些外部知识可以帮助模型理解语言知识。基于这样的考虑,作者提出了一种融合知识图谱的语言模型ERNIE,由于该模型是由清华大学提供的,为区别百度的ERNIE,故本文后续将此模型标记为THU-ERNIE

这个想法很好,但将知识图谱的知识引入到语言模型存在两个挑战

  • Structured Knowledge Encoding:如何为预训练模型提取和编码知识图谱的信息?

  • Heterogeneous Information Fusion:语言模型和知识图谱对单词的表示(representation)是完全不同的两个向量空间,这种情况下如何将两者进行融合?

对于第一个问题,THU-ERNIE使用TAGME提取文本中的实体,并将这些实体链指到KG中的对应实体对象,然后找出这些实体对象对应的embedding,这些embedding是由一些知识表示方法,例如TransE训练得到的。

对于第二个问题,THU-ERNIE在BERT模型的基础上进行改进,除了MLM、NSP任务外,重新添加了一个和KG相关的预训练目标:Mask掉token和entity (实体) 的对齐关系,并要求模型从图谱的实体中选择合适的entity完成这个对齐。

2.2. THU-ERNIE的模型结构

图1 THU-ERNIE的模型架构

THU-ERNIE在预训练阶段就开始了与KG的融合,如图1a所示,THU-ERNIE是由两种类型的Encoder堆叠而成:T-EncoderK-Encoder。其中T-Encoder在下边堆叠了 N N N层,K-Encoder在上边堆叠了 M M M层,所以整个模型共有 N + M N+M N+M层,T-Encoder的输出和相应的KG实体知识作为K-Encoder的输入。

从功能上来讲,T-Encoder负责从输入序列中捕获词法和句法信息;K-Encoder负责将KG知识和从T-Encoder中提取的文本信息进行融合,其中KG知识在这里主要是实体,这些实体是通过TransE模型训练出来的。

THU-ERNIE中的T-Encoder的结构和BERT结构是一致的,K-Encoder则做了一些改变,K-EncoderT-Encoder的输出序列和实体输入序列分别进行Multi-Head Self-Attention操作,之后将两者通过Fusion层进行融合。

2.3. K-Encoder融合文本信息和KG知识

本节将详细探讨K-Encoder的内部结构以及K-Encoder是如何融合预训练文本信息和KG知识的。图1b展示了K-Encoder的内部细节信息。

我们可以看到,其对文本序列 (token Input) 和KG知识(Entity Input)分别进行Multi-Head Self-Attention(MH-ATT)操作,假设在第 i i i层中,token Input对应的embedding是 { w 1 ( i − 1 ) , w 2 ( i − 1 ) , . . . , w n ( i − 1 ) } \{w_{1}^{(i-1)},w_{2}^{(i-1)},...,w_{n}^{(i-1)}\} {w1(i1),w2(i1),...,wn(i1)},Entity Input对应的embedding是 { e 1 ( i − 1 ) , e 2 ( i − 1 ) , . . . , e n ( i − 1 ) } \{ e_1^{(i-1)},e_2^{(i-1)},...,e_n^{(i-1)}\} {e1(i1),e2(i1),...,en(i1)},则Multi-Head Self-Attention操作的公式可以表示为:

{ w ~ 1 ( i − 1 ) , w ~ 2 ( i − 1 ) , . . . , w ~ n ( i − 1 ) } = MH-ATT ( { w 1 ( i − 1 ) , w 2 ( i − 1 ) , . . . , w n ( i − 1 ) } ) { e ~ 1 ( i − 1 ) , e ~ 2 ( i − 1 ) , . . . , e ~ m ( i − 1 ) } = MH-ATT ( { e 1 ( i − 1 ) , e 2 ( i − 1 ) , . . . , e m ( i − 1 ) } ) \begin{split} \{\tilde{w}_{1}^{(i-1)},\tilde{w}_{2}^{(i-1)},...,\tilde{w}_{n}^{(i-1)}\} = \text{MH-ATT}(\{w_{1}^{(i-1)},w_{2}^{(i-1)},...,w_{n}^{(i-1)}\}) \\ \{\tilde{e}_{1}^{(i-1)},\tilde{e}_{2}^{(i-1)},...,\tilde{e}_{m}^{(i-1)}\} = \text{MH-ATT}(\{e_{1}^{(i-1)},e_{2}^{(i-1)},...,e_{m}^{(i-1)}\}) \end{split} {w~1(i1),w~2(i1),...,w~n(i1)}=MH-ATT({w1(i1),w2(i1),...,wn(i1)}){e~1(i1),e~2(i1),...,e~m(i1)}=MH-ATT({e1(i1),e2(i1),...,em(i1)})

然后Entity序列的输出将被对齐到token序列的第一个token上,例如实体”bob dylan”将被对齐到第一个单词”bob”上。接下里将这些MH-ATT的输入到Fusion层,在这里将进行文本信息和KG知识的信息融合。因为有些token没有对应的entity,有些token有对应的entity,所以这里需要分两种情况讨论。

对于那些对应entity的token,信息融合的过程是这样的:

h j = σ ( W ~ t ( i ) w ~ j ( i ) + W ~ e ( i ) e ~ k ( i ) + b ~ ( i ) ) w j ( i ) = σ ( W t ( i ) h j + b t ( i ) ) e k ( i ) = σ ( W e ( i ) h j + b e ( i ) ) \begin{split} h_j = \sigma(\tilde{W}_t^{(i)}\tilde{w}_j^{(i)}+\tilde{W}_e^{(i)}\tilde{e}_k^{(i)}+\tilde{b}^{(i)}) \\ w_j^{(i)} = \sigma({W}_t^{(i)}{h}_j+b_t^{(i)}) \\ e_k^{(i)} = \sigma({W}_e^{(i)}{h}_j+b_e^{(i)}) \end{split} hj=σ(W~t(i)w~j(i)+W~e(i)e~k(i)+b~(i))wj(i)=σ(Wt(i)hj+bt(i))ek(i)=σ(We(i)hj+be(i))

对于那些没有对应entity的token,信息融合的过程是这样的:

h j = σ ( W ~ t ( i ) w ~ j ( i ) + b ~ ( i ) ) w j ( i ) = σ ( W t ( i ) h j + b t ( i ) ) \begin{split} h_j = \sigma(\tilde{W}_t^{(i)}\tilde{w}_j^{(i)}+\tilde{b}^{(i)}) \\ w_j^{(i)} = \sigma({W}_t^{(i)}{h}_j+b_t^{(i)}) \end{split} hj=σ(W~t(i)w~j(i)+b~(i))wj(i)=σ(Wt(i)hj+bt(i))

其中这里的 σ ( ⋅ ) \sigma(\cdot) σ()是个非线性的激活函数,通常可以使用GELU函数。最后一层的输出将被视作融合文本信息和KG知识的最终向量。

2.4. THU-ERNIE的预训练任务

在预训练阶段,THU-ERNIE的预训练任务包含3个任务:MLM、NSP和dEA。dEA将随机地Mask掉一些token-entity对,然后要求模型在这些对齐的token上去预测相应的实体分布,其有助于将实体注入到THU-ERNIE模型的语言表示中。

由于KG中实体的数量往往过于庞大,对于要进行这个任务的token来讲,THU-ERNIE将会给定小范围的实体,让该token在这个范围内去计算要输出的实体分布,而不是全部的KG实体。

给定token序列 { w 1 , w 2 , . . . , w n } \{w_{1},w_{2},...,w_{n}\} {w1,w2,...,wn}和对应的实体序 { e 1 , e 2 , . . . , e m } \{ e_1,e_2,...,e_m\} {e1,e2,...,em},对于要对齐的token w i w_i wi来讲,相应的对齐公式为:

p ( e j ∣ w i ) = e x p ( linear ( w i o ) ⋅ e j ) ∑ k = 1 m e x p ( linear ( w i o ) ⋅ e k ) p(e_j|w_i) = \frac{exp(\text{linear}(w_i^o) \cdot e_j)}{\sum_{k=1}^{m}exp(\text{linear}(w_i^{o}) \cdot e_k)} p(ejwi)=k=1mexp(linear(wio)ek)exp(linear(wio)ej)

类似与BERT对token的Mask策略,THU-ERNIE在Mask token-entity对齐的时候也采用的一定的策略,如下:

  1. 以5%的概率去随机地替换实体,让模型去预测正确的entity。

  2. 以15%的概率直接Mask掉token-entity,让模型去预测相应的entity。

  3. 以80%的概率保持token-entity的对齐不变,以让模型学到KG知识,提升语言理解能力。

最终,THU-ERNIE的总的预训练损失是由MLM、NSP和dEA三者的加和。

  • 参考资料
  1. ERNIE:Enhanced Language Representation with Informative Entities

  2. ERNIE Githut

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

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

相关文章

计算机网络第一章——计算机体系结构(上)

提示:剑未佩妥,出门已是江湖;酒尚余温,入口不识乾坤,愿历尽千帆,归来仍是少年。 文章目录 1.1.1 概念和功能计算机网络的概念计算机网络的功能计算机网络的发展——第一阶段第二阶段——三级结构第三阶段—…

生活-考驾照2

昨日已通过科目一,接下来,向着科目二出发!!! 考试注意事项 就考前一周死命刷题,至少一天有三次93以上的记录,我也就最后一天达到90,之前一直马路杀手刷题,我就在网页版…

泰国这场发布会,UTONMOS元宇宙游戏玩出炫酷新花样

Sensor Tower 最近发布的一项报告显示,全球元宇宙 App 下载量在 2022 年H1 达到 1.7 亿次,其中游戏达到了 1.1 亿次,占比 67.3%。在营收方面,元宇宙 App 在 H1 共获得 6.5 亿美元收入,游戏占 94%,达到 6.4 …

中低压母线室弧光保护装置在水电站的应用

摘要:本文介绍了电弧光保护在水电站的配置及应用,提供给相关人员参考。 关键词:水电站;开关柜;电弧光 0前言 电弧光是由于发生相间短路或接地短路时空气电离而形成的。在我国电力系统中开关柜内部电弧光故障时有发生…

整数口算练习“小程序”

设定练习题目数量、最大取值整数数,即时判定,答对鼓励答错打印正确结果。 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么简…

Centos stream 8 使用 cephadm 安装 Ceph (17.2.6 quincy)集群

一、环境 1、机器列表 名称IP角色备注cephnode12010.0.49.120_admin双网卡 双硬盘/sda/60G /sdb/160Gcephnode12110.0.49.121_storage双网卡 双硬盘/sda/60G /sdb/160G cephnode12210.0.49.122_storage双网卡 双硬盘/sda/60G /sdb/160G 2 、软件环境 [rootcephnode120 …

2:异常处理

文章目录 一:try catch处理异常1:原理:2:catch中如何处理异常**3:try-catch-finally**4:多重catch5:异常的分类6:throw和throws的区别7:练习题8:重载和重写的…

C语言-【指针三】-【野指针】

我又来了,勤奋博主上线啦,哈哈哈。本篇文章呢,主要简单介绍一下指针中野指针的相关知识。 野指针 那在对它进行深入了解时,先得知道什么叫野指针吧,那什么是野指针呢? 野指针就是:指向的内存地…

An illegal reflective access operation has occurred警告

问题描述 今天 在 install Maven项目的时候,控制台出现警告如下: WARNING: An illegal reflective access operation has occurred WARNING: Illegal reflective access by com.thoughtworks.xstream.core.util.Fields (file:/E:/DevelopmentKit/Maven/…

【送书福利-第六期】Java诞生日,推荐Java“此生错过必遗憾”系列书单

大家好,我是洲洲,欢迎关注,一个爱听周杰伦的程序员。关注公众号【程序员洲洲】即可获得10G学习资料、面试笔记、大厂独家学习体系路线等…还可以加入技术交流群欢迎大家在CSDN后台私信我! 本文目录 一、前言二、推荐书籍三、抽奖方…

三维电子沙盘虚拟数字沙盘开发教程第9课

三维电子沙盘虚拟数字沙盘开发教程第9课 查询面板调用: private void Button_Click_11(object sender, RoutedEventArgs e) { GisLib.MapSech _Sech new MapSech(); //查询面板 Root.Children.Add(_Sech); Canvas.Se…

docker可视化管理工具portainer忘记密码重置教程

目录 前言: 1 停止portainer容器 2 借助仓库 portainer/helper-reset-password 重置密码 3 重新启动portainer容器 4 验证是否修改成功 5 修改登录密码 前言: 由于学习的深入,各种账号密码实在是太多了,建议各位配置账号密…

python+django在线借阅图书管理系统vue

本论文是以构建图书借阅为目标,使用 django框架制作,由系统前台、读者和管理员三大部分组成。着重论述了系统设计分析,系统的实现(读者注册模块,读者登录,读者浏览图书模块,图书借阅模块&#…

keepalived脑裂后,近20min不能访问虚拟IP问题分析

问题现象和说明 真实的场景比较复杂,抽象起来可以用下面的图表示, #mermaid-svg-OmKwPLsGwcVuYnha {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-OmKwPLsGwcVuYnha .error-icon{fill:#5522…

充分发挥C/C++test的价值(上)

对于开发测试来说,最有效的环境就是能够深度集成到开发人员IDE中的统一测试解决方案。例如,团队可能会将测试工作集中在最近更新的、高风险的代码上,而Parasoft C/Ctest这样的集成工具就是最合适的解决方案。 软件验证和确认(Ver…

Vulkan Tutorial 5 顶点缓冲区

目录 16 顶点缓冲区 顶点着色器 顶点数据 管道顶点输入 17 顶点缓冲区创建 缓冲区创建 内存要求 内存分配 填充顶点缓冲区 18 暂存缓冲区 传输队列 使用暂存缓冲区 19 索引缓冲区 索引缓冲区创建 使用索引缓冲区 16 顶点缓冲区 我们将用内存中的顶点缓冲区替换…

vue-admin-template框架搭建及应用

一、框架介绍 vue-admin-template是基于vue-element-admin的一套后台管理系统基础模板(最少精简版),可作为模板进行二次开发; 可以把 vue-element-admin当做工具箱或者集成方案仓库,在 vue-admin-template 的基础上进…

FPGA基于AXI 1G/2.5G Ethernet Subsystem实现千兆UDP通信 提供工程源码和技术支持

目录 1、前言2、我这里已有的UDP方案3、详细设计方案传统UDP网络通信方案本方案详细设计说明UDP层设计AXIS-FIFOAXI 1G/2.5G Ethernet Subsystem:输出 4、vivado工程详解5、上板调试验证并演示系统配置UDP数据回环测试注意事项 6、福利:工程代码的获取 1…

SpringMVC第七阶段:SpringMVC的增删改查(01)

SpringMVC的增删改查 1、准备单表的数据库 drop database if exists springmvc;create database springmvc;use springmvc; ##创建图书表 create table t_book(id int(11) primary key auto_increment, ## 主键name varchar(50) not null, ## 书名 author varchar(50) no…

敏捷缺陷「bug」跟踪管理

一般情况下,当前迭代的缺陷,建议放到本迭代的迭代看板上,在迭代结束前修复完成。 “缺陷看板”通常存放发布后遗留的缺陷,客户反馈的缺陷,生产环境发现的缺陷等。 在Leangoo领歌的敏捷项目中,默认创建了“…