ConKI: Contrastive Knowledge Injection for Multimodal Sentiment Analysis

文章目录

  • ConKI:用于多模态情感分析的对比知识注入
    • 文章信息
    • 研究目的
    • 研究内容
    • 研究方法
      • 1.总体结构
      • 2.Encoding with Knowledge Injection
        • 2.1 Pan-knowledge representations
        • 2.2 Knowledge-specific representations
      • 3.Hierarchical Contrastive Learning
      • 4.损失函数
      • 5.训练过程
    • 结果与讨论
    • 代码和数据集
    • 附录
      • 1.分层对比学习样本示例
      • 2.Temperature Parameter
      • 3.分层对比损失原理解释

ConKI:用于多模态情感分析的对比知识注入

总结:提出了一种利用知识注入和分层对比学习来获取更有效的单模态表征的方法。

文章信息

作者:Yakun Yu,Mingjun Zhao

单位:University of Alberta(艾伯塔大学,加拿大)

会议/期刊:Findings of the Association for Computational Linguistics(ACL 2023)(CCF A)

题目:ConKI: Contrastive Knowledge Injection for Multimodal Sentiment Analysis

年份:2023

研究目的

现有的多模态情感分析方法主要基于预训练模型获得的一般知识对模态进行编码,来进行多模态融合和表征学习,从而忽略了特定领域知识的影响。

研究内容

提出了用于多模态情感分析的对比知识注入框架(ConKI),用于学习泛知识表征(来自预训练模型提取的一般知识,如BERT)和特定知识表征(从相关外部数据源获得的领域特定知识)。

  • 通过基于适配器架构的知识注入,每种模态不仅学习到一般知识表征,还能学习到来自外部数据源的特定领域知识表征。
  • 使用分层对比学习,在单模态内不同知识类型之间、单个样本内不同模态之间、不同样本之间进行对比学习,促进模型学习更有效的特定知识与泛知识表征,从而改善多模态情感预测性能。

研究方法

1.总体结构

image-20240315203607593

首先处理原始多模态输入,得到对应的低级特征序列 I m ∈ { t , v , a } I_{m\in\{t,v,a\}} Im{t,v,a}。然后将每种模态的低级特征 I m I_m Im编码为特定知识表征 A m A_m Am和泛知识表征 O m O_m Om,其中 A m A_m Am由适配器Adapter的知识注入模型生成,而 O m O_m Om​由预训练模型生成(文本使用BERT编码器,视频/音频使用随机初始化的Transformer编码器)。最后,ConKI同时在下游目标数据集上执行两个任务,即主要的MSA回归任务和辅助的分层对比学习子任务。

  • MSA任务

    在MSA任务中,首先将每种模态的特定知识表征 A m A_m Am和泛知识表征 O m O_m Om合并起来。然后通过全连接 FC 进行内模态融合。接着使用融合网络 Fusion Network 实现跨模态融合。最后将融合后的表征送入多层感知器 MLP,产生情感预测值 y ^ \hat{y} y^​.

    image-20240315213921310

  • 分层对比学习任务

    在知识层面、模态层面和样本层面构建负样本和正样本配对。通过整合这些分层对比,ConKI能够全面捕捉表征之间的动态变化,配对策略如下:

    • 由于 A m A_m Am O m O_m Om能够捕捉到不同的知识,因此将它们分离开来,使它们相互补充,从而通过知识层面的对比获得更丰富的模态表征。

    • 由于视频的情感是由所有模态决定的,因此通过模态级对比来学习六种表征的共性。

    • 表达相似情感的视频应具有一定的相关性,因此通过样本级对比来捕捉相关性,以帮助进一步学习情绪接近的样本之间的共性。

符号含义
t , v , a t,v,a t,v,a文本模态,视觉模态,音频模态
I t ∈ R l t × d t I_{t}\in\mathbb{R}^{l_{t}\times d_{t}} ItRlt×dt文本模态对应的低级特征序列
I v ∈ R l v × d v I_{v}\in\mathbb{R}^{l_{v}\times d_{v}} IvRlv×dv视觉模态对应的低级特征序列
I a ∈ R l a × d a I_a\in\mathbb{R}^{l_a\times d_a} IaRla×da音频模态对应的低级特征序列
l m ∈ { t , v , a } l_{m\in\{t,v,a\}} lm{t,v,a}每个模态的序列长度
d m ∈ { t , v , a } d_{m\in\{t,v,a\}} dm{t,v,a}特征向量维度
A m ∈ { t , v , a } A_{m\in\{t,v,a\}} Am{t,v,a}特定知识表征
O m ∈ { t , v , a } O_{m\in\{t,v,a\}} Om{t,v,a}泛知识表征

2.Encoding with Knowledge Injection

通过预训练编码器将每种模态编码为泛知识表征 O m O_m Om,通过适配器将每种模态编码为特定知识表征 A m A_m Am

2.1 Pan-knowledge representations

使用预训练的BERT对文本模态进行编码,最后一层的POOL输出作为文本模态的泛知识表征 O t O_t Ot。使用transformer的编码器对音频模态和视频模态进行编码,捕捉音频模态和视觉模态的泛知识表征 O v , O a O_v,O_a Ov,Oa
O t , H t = Bert ⁡ ( I t ; θ t Bert ) O m , H m = Encoder ( I m ; θ m encoder ) , m ∈ { v , a } O_t,H_t=\operatorname{Bert}(I_t;\theta_t^{\text{Bert}}) \\ O_m,H_m=\text{Encoder}(I_m;\theta_m^\text{encoder}),m\in\{v,a\} Ot,Ht=Bert(It;θtBert)Om,Hm=Encoder(Im;θmencoder),m{v,a}
符号含义 H m , m ∈ { t , a , v } H_m, m\in\{t,a,v\} Hm,m{t,a,v}​代表所有层的隐藏状态。

2.2 Knowledge-specific representations

通过知识注入模型(适配器)从外部多模态来源注入特定领域知识,适配器的输出作为各模态的特定知识表征 A t , A a , A v A_t,A_a,A_v At,Aa,Av​。

Alt

Adapter由多个模块组成(两个FC层,中间有两个transformer层),每个模块可以插入到预训练编码器的任何transformer层之前(每个模态的适配器插入到各自预训练的编码器外部)。

每个模块都将预训练编码器的中间隐藏层状态和前一个适配器模块的输出作为输入。
A m = Adapter ( H m ; θ m adapter ) , m ∈ { t , v , a } A_m=\text{Adapter}(H_m;\theta_m^\text{adapter}),m\in\{t,v,a\} Am=Adapter(Hm;θmadapter),m{t,v,a}
【注】:在外部数据集上仅用MSA任务预训练各模态的适配器,然后利用预训练的适配器为下游目标任务(既包括MSA任务又包括分层对比学习子任务)生成特定知识表征 A m A_m Am

3.Hierarchical Contrastive Learning

  • 单模态内不同知识类型对比(拉远)

    泛知识表征和特定知识表征应相互分离,因为它们属于不同的知识领域,旨在相互补充。这种情况既存在于每个样本内部(i 和 j 代表同一个样本),也存在于批次中的不同样本之间(i 和 j 代表两个不同的样本)。因此,在一个批次中建立知识间负对
    N 1 i = { ( O m i , A n j ) ∣ m , n ∈ { t , v , a } & i , j ∈ B } ; \begin{gathered}\mathcal{N}_1^i=\{(O_m^i,A_n^j) \mid m,n\in\{t,v,a\}\&i,j\in B\};\end{gathered} N1i={(Omi,Anj)m,n{t,v,a}&i,jB};

  • 单个样本内不同模态对比(拉近)

    对于单个视频样本 i,所有模态都有说话者的共同动机,这些动机决定了整体情感。不同模态的泛知识表征代表相似的含义,因此需要拉近彼此的距离。同样对于特定知识表征,不同模态的特定知识表征也代表相似的含义,也需要拉近之间的距离因此,建立样本内泛知识表征正对与特定知识表征正对
    P 1 i = { ( O m i , O n i ) , ( A m i , A n i ) ∣ m , n ∈ { t , v , a } & m ≠ n & i ∈ B } \mathcal{P}_1^i=\{(O_m^i,O_n^i),(A_m^i,A_n^i) \mid m,n\in\{t,v,a\} \& m\neq n\&i\in B\} P1i={(Omi,Oni),(Ami,Ani)m,n{t,v,a}&m=n&iB}

  • 不同样本间的对比(相同情感拉近,不同情感拉远)

    情感接近与否的判断标准是:将不同样本的情感分数进行四舍五入的取整,相同即为接近,反之亦然。

    • 对于情感接近的两个任意样本 i 和 j,样本 i 的六个表征应该接近样本 j 对应的六个表征。因此,建立不同样本之间表征的正对

    P 2 i = { ( O m i , O n j ) , ( A m i , A n j ) ∣ m , n ∈ { t , v , a } & r ( y i ) = r ( y j ) & i , j ∈ B & i ≠ j } \mathcal{P}_2^i = \{(O_m^i,O_n^j),(A_m^i,A_n^j)|\quad m,n\in\{t,v,a\}\&r(y^i)=r(y^j)\&i,j\in B\&i\neq j\} P2i={(Omi,Onj),(Ami,Anj)m,n{t,v,a}&r(yi)=r(yj)&i,jB&i=j}

    • 对于情感不接近的两个任意样本 i 和 j,样本 i 的六个表征应该远离样本 j 的六个表征。因此,建立不同样本之间表征的负对

    N 2 i = { ( O m i , O n j ) , ( A m i , A n j ) ∣ m , n ∈ { t , v , a } & r ( y i ) ≠ r ( y j ) & i , j ∈ B & i ≠ j } \mathcal{N}_2^i = \{(O_m^i,O_n^j),(A_m^i,A_n^j)|\quad m,n\in\{t,v,a\}\&r(y^i)\neq r(y^j)\&i,j\in B\&i\neq j\} N2i={(Omi,Onj),(Ami,Anj)m,n{t,v,a}&r(yi)=r(yj)&i,jB&i=j}

符号含义
y i y^i yi代表样本 i 的真实标签
r ( ⋅ ) r(\cdot) r()代表取整函数
B B B代表批次

分层对比学习样本示例,对上面理论知识的解释

4.损失函数

整体损失:
L = L t a s k + λ L c o n \mathcal{L}=\mathcal{L}_{task}+\lambda\mathcal{L}_{con} L=Ltask+λLcon
MSA 任务损失:(均方误差计算)
L t a s k = 1 ∣ B ∣ ∑ i ∣ B ∣ ( y ^ i − y i ) 2 \mathcal{L}_{task}=\frac1{|B|}\sum_i^{|B|}(\hat{y}^i-y^i)^2 Ltask=B1iB(y^iyi)2
分层对比损失:

分层对比损失函数将正样本对拉近,将负样本对推远。
L c o n = ∑ i ∈ B − 1 ∣ P 1 i ∪ P 2 i ∣ × ∑ ( p , q ) ∈ P 1 i ∪ P 2 i log ⁡ f ( ( p , q ) ) ∑ ( p ′ , q ′ ) ∈ A l l   P a i r s f ( ( p ′ , q ′ ) ) \mathcal{L}_{con}=\sum_{i\in B}\frac{-1}{|\mathcal{P}_1^i\cup\mathcal{P}_2^i|}\times \sum_{(p,q)\in\mathcal{P}_1^i\cup\mathcal{P}_2^i}\log\frac{f((p,q))}{\sum_{(p^{\prime},q^{\prime})\in\mathsf{All~Pairs}}f((p^{\prime},q^{\prime}))} Lcon=iBP1iP2i1×(p,q)P1iP2ilog(p,q)All Pairsf((p,q))f((p,q))

f ( ( p , q ) ) = exp ⁡ ( p ∥ p ∥ 2 ⋅ q ∥ q ∥ 2 ⋅ 1 τ ) , All Pairs = P 1 i ∪ P 2 i ∪ N 1 i ∪ N 2 i . \begin{aligned}f((p,q))&=\exp(\frac p{\|p\|_2}\cdot\frac q{\|q\|_2}\cdot\frac1\tau),\\\\\text{All Pairs}&=\mathcal{P}_1^i\cup\mathcal{P}_2^i\cup\mathcal{N}_1^i\cup\mathcal{N}_2^i.\end{aligned} f((p,q))All Pairs=exp(p2pq2qτ1),=P1iP2iN1iN2i.

分层对比损失原理解释

符号含义
λ \lambda λ平衡MSA任务损失与分层对比学习损失的超参数
$\mathcal{P}_1i\cup\mathcal{P}_2i
( p , q ) (p,q) (p,q)表示对应集合中的一对,如 ( O t i , O v i ) (O_t^i,O_v^i) (Oti,Ovi)
τ \tau τ代表温度参数,temperature parameter
y y y真实标签
y ^ \hat{y} y^预测标签
$B

5.训练过程

首先使用外部数据集,同时固定预训练骨干的模型参数,通过 L t a s k \mathcal{L}_{task} Ltask损失函数,对ConKI中的适配器进行预训练。然后通过优化整体损失 L \mathcal{L} L​,利用下游目标数据集对 ConKI 进行微调。

Alt Alt

结果与讨论

斜体是消融实验

  • 通过与 SOTA 模型进行对比,证明了 ConKI 的效果最好,各项评估指标都优于以往的 SOTA 模型。
  • 通过使用不同的模态组合,证明了使用三种模态的效果是最好的,验证了多模态的有效性。
  • 通过对 ConKI 的四个组件(外部数据集的使用( C1 ),用于知识注入的适配器( C2 ),用于泛知识的预训练编码器( C3 )和分层对比学习( C4 ))进行消融,表明了 ConKI 的四个组件都是有效的。
  • 通过去除分层对比学习中的知识间负对 N 1 \mathcal{N}_1 N1,表明 ConKI 学习区分泛知识和特定知识的表征对于分层对比学习至关重要。
  • 通过将 ConKI 与经过外部数据集微调的 SOTA 模型进行比较,验证了 ConKI 模型在 MSA 任务上性能的提升不是来自外部数据集,而是与提出的知识注入和对比学习有关。
  • 通过可视化在有无对比学习下的六种表征,证明了对比学习的有效性,通过对比学习能够学习到更好的表征。

代码和数据集

代码:未公开

数据集:CMU-MOSI,CMU-MOSEI,CH-SIMS

实验环境:NVIDIA RTX 2080Ti(11G)

附录

1.分层对比学习样本示例

示例批次由三个样本 ( { O t i , O v i , O a i , A t i , A v i , A a i } i = 1 , 2 , 3 ∈ B ) (\{O_t^i,O_v^i,O_a^i,A_t^i,A_v^i,A_a^i\}_{i=1,2,3}\in B) ({Oti,Ovi,Oai,Ati,Avi,Aai}i=1,2,3B)组成,其中样本 1 和样本 2 属于同一情感区间,而样本 3 属于不同的情感区间。(下图中的“1”代表行向量和列向量的正对。“0”代表行向量与列向量的负对)

Alt

  • 单模态内不同知识类型对比(拉远)。上图蓝色方框中的“0”代表知识间的负对, N 1 B \mathcal{N}_1^{B} N1B

  • 单个样本内不同模态对比(拉近)。上图带有红色边框的“1”代表单样本模态之间的正对。

P 1 B = { ( O t 1 , O v 1 ) , ( O t 1 , O a 1 ) , ( O a 1 , O v 1 ) , ( A t 1 , A v 1 ) , ( A t 1 , A a 1 ) , ( A a 1 , A v 1 ) , ( O t 2 , O v 2 ) , ( O t 2 , O a 2 ) , ( O a 2 , O v 2 ) , ( A t 2 , A v 2 ) , ( A t 2 , A a 2 ) , ( A a 2 , A v 2 ) , ( O t 3 , O v 3 ) , ( O t 3 , O a 3 ) , ( O a 3 , O v 3 ) , ( A t 3 , A v 3 ) , ( A t 3 , A a 3 ) , ( A a 3 , A v 3 ) } ; \begin{aligned} \mathcal{P}_{1}^{B}=\{(O_{t}^{1},O_{v}^{1}),(O_{t}^{1},O_{a}^{1}),(O_{a}^{1},O_{v}^{1}), \\ (A_{t}^{1},A_{v}^{1}),(A_{t}^{1},A_{a}^{1}),(A_{a}^{1},A_{v}^{1}), \\ \begin{aligned}(O_{t}^{2},O_{v}^{2}),(O_{t}^{2},O_{a}^{2}),(O_{a}^{2},O_{v}^{2}),\end{aligned} \\ (A_t^2,A_v^2),(A_t^2,A_a^2),(A_a^2,A_v^2), \\ \begin{aligned}(O_t^3,O_v^3),(O_t^3,O_a^3),(O_a^3,O_v^3),\end{aligned} \\ (A_{t}^{3},A_{v}^{3}),(A_{t}^{3},A_{a}^{3}),(A_{a}^{3},A_{v}^{3})\}; \end{aligned} P1B={(Ot1,Ov1),(Ot1,Oa1),(Oa1,Ov1),(At1,Av1),(At1,Aa1),(Aa1,Av1),(Ot2,Ov2),(Ot2,Oa2),(Oa2,Ov2),(At2,Av2),(At2,Aa2),(Aa2,Av2),(Ot3,Ov3),(Ot3,Oa3),(Oa3,Ov3),(At3,Av3),(At3,Aa3),(Aa3,Av3)};

  • 不同样本间的对比(相同情感拉近,不同情感拉远)。上图没有红色边框的“1“代表样本间相同情感的正对,蓝色边框外的“0”代表样本间不同情感的负对, N 2 B \mathcal{N}_2^{B} N2B

P 2 B = { ( O t 1 , O t 2 ) , ( O t 1 , O v 2 ) , ( O t 1 , O a 2 ) , ( O v 1 , O t 2 ) , ( O v 1 , O v 2 ) , ( O v 1 , O a 2 ) , ( O a 1 , O t 2 ) , ( O a 1 , O v 2 ) , ( O a 1 , O a 2 ) , ( A t 1 , A t 2 ) , ( A t 1 , A v 2 ) , ( A t 1 , A a 2 ) , ( A v 1 , A t 2 ) , ( A v 1 , A v 2 ) , ( A v 1 , A a 2 ) , ( A a 1 , A t 2 ) , ( A a 1 , A v 2 ) , ( A a 1 , A a 2 ) } ; \begin{aligned} &&\mathcal{P}_{2}^{B}=\{(O_{t}^{1},O_{t}^{2}),(O_{t}^{1},O_{v}^{2}),(O_{t}^{1},O_{a}^{2}), \\ &&\begin{aligned}(O_{v}^{1},O_{t}^{2}),(O_{v}^{1},O_{v}^{2}),(O_{v}^{1},O_{a}^{2}),\end{aligned} \\ &&\begin{aligned}(O_{a}^{1},O_{t}^{2}),(O_{a}^{1},O_{v}^{2}),(O_{a}^{1},O_{a}^{2}),\end{aligned} \\ &&(A_{t}^{1},A_{t}^{2}),(A_{t}^{1},A_{v}^{2}),(A_{t}^{1},A_{a}^{2}), \\ &&(A_{v}^{1},A_{t}^{2}),(A_{v}^{1},A_{v}^{2}),(A_{v}^{1},A_{a}^{2}), \\ &&(A_{a}^{1},A_{t}^{2}),(A_{a}^{1},A_{v}^{2}),(A_{a}^{1},A_{a}^{2})\}; \end{aligned} P2B={(Ot1,Ot2),(Ot1,Ov2),(Ot1,Oa2),(Ov1,Ot2),(Ov1,Ov2),(Ov1,Oa2),(Oa1,Ot2),(Oa1,Ov2),(Oa1,Oa2),(At1,At2),(At1,Av2),(At1,Aa2),(Av1,At2),(Av1,Av2),(Av1,Aa2),(Aa1,At2),(Aa1,Av2),(Aa1,Aa2)};

2.Temperature Parameter

深度学习中的温度参数(Temperature Parameter)是什么?点击跳转查看

3.分层对比损失原理解释

L c o n = ∑ i ∈ B − 1 ∣ P 1 i ∪ P 2 i ∣ × ∑ ( p , q ) ∈ P 1 i ∪ P 2 i log ⁡ f ( ( p , q ) ) ∑ ( p ′ , q ′ ) ∈ A l l   P a i r s f ( ( p ′ , q ′ ) ) \mathcal{L}_{con}=\sum_{i\in B}\frac{-1}{|\mathcal{P}_1^i\cup\mathcal{P}_2^i|}\times \sum_{(p,q)\in\mathcal{P}_1^i\cup\mathcal{P}_2^i}\log\frac{f((p,q))}{\sum_{(p^{\prime},q^{\prime})\in\mathsf{All~Pairs}}f((p^{\prime},q^{\prime}))} Lcon=iBP1iP2i1×(p,q)P1iP2ilog(p,q)All Pairsf((p,q))f((p,q))

f ( ( p , q ) ) = exp ⁡ ( p ∥ p ∥ 2 ⋅ q ∥ q ∥ 2 ⋅ 1 τ ) , All Pairs = P 1 i ∪ P 2 i ∪ N 1 i ∪ N 2 i . \begin{aligned}f((p,q))&=\exp(\frac p{\|p\|_2}\cdot\frac q{\|q\|_2}\cdot\frac1\tau),\\\\\text{All Pairs}&=\mathcal{P}_1^i\cup\mathcal{P}_2^i\cup\mathcal{N}_1^i\cup\mathcal{N}_2^i.\end{aligned} f((p,q))All Pairs=exp(p2pq2qτ1),=P1iP2iN1iN2i.

分层对比损失函数 L c o n \mathcal{L}_{con} Lcon其实可以看做是带有temperature parameter的softmax loss损失函数的改写。
Softmax Loss = − 1 N ∑ i = 1 N ∑ k = 1 K y i , k log ⁡ ( exp ⁡ ( z i , k / T ) ∑ j = 1 K exp ⁡ ( z i , j / T ) ) \text{Softmax Loss}=-\frac1N\sum_{i=1}^N\sum_{k=1}^Ky_{i,k}\log\left(\frac{\exp(z_{i,k}/T)}{\sum_{j=1}^K\exp(z_{i,j}/T)}\right) Softmax Loss=N1i=1Nk=1Kyi,klog(j=1Kexp(zi,j/T)exp(zi,k/T))

∣ P 1 i ∪ P 2 i ∣ |\mathcal{P}_1^i\cup\mathcal{P}_2^i| P1iP2i表示一个批次B中与样本 i 正对的个数,相当于softmax loss中的 N N N。某种意思上, ∣ P 1 i ∪ P 2 i ∣ |\mathcal{P}_1^i\cup\mathcal{P}_2^i| P1iP2i也是一个不变的值。

log ⁡ f ( ( p , q ) ) ∑ ( p ′ , q ′ ) ∈ A l l   P a i r s f ( ( p ′ , q ′ ) ) \log\frac{f((p,q))}{\sum_{(p^{\prime},q^{\prime})\in\mathsf{All~Pairs}}f((p^{\prime},q^{\prime}))} log(p,q)All Pairsf((p,q))f((p,q)),相当于softmax loss中的 log ⁡ ( exp ⁡ ( z i , k / T ) ∑ j = 1 K exp ⁡ ( z i , j / T ) ) \log\left(\frac{\exp(z_{i,k}/T)}{\sum_{j=1}^K\exp(z_{i,j}/T)}\right) log(j=1Kexp(zi,j/T)exp(zi,k/T)),都是用的softmax函数的思想。

f ( ( p , q ) ) = exp ⁡ ( p ∥ p ∥ 2 ⋅ q ∥ q ∥ 2 ⋅ 1 τ ) f((p,q))=\exp(\frac p{\|p\|_2}\cdot\frac q{\|q\|_2}\cdot\frac1\tau) f((p,q))=exp(p2pq2qτ1),类比于 exp ⁡ ( z i , k / T ) \exp(z_{i,k}/T) exp(zi,k/T),不过不同的是前者计算的是余弦距离得分,后者是logits得分。

所以二者思想是类似的。

分层对比损失函数 L c o n \mathcal{L}_{con} Lcon有效是因为:公式里面计算的,简单的说是正对之间的距离得分,我们想让距离得分越来越大,这样总体的损失就越来越小了。通过反向传播,就实现了这一问题。所以 L c o n \mathcal{L}_{con} Lcon有效。

😃😃😃

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

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

相关文章

发布镜像到阿里云仓库

发布上一篇Dockerfile实战-自定义的centos镜像。 1、登录阿里云 2、找到容器镜像服务 3、创建命令空间 4、创建镜像仓库 5、点击进入这个镜像仓库,可以看到所有的信息 6、根据操作指南测试推送发布 6.1登录阿里云 [rootzhoujunru home]# docker login --usernam…

【问题记录】自定义Prometheus exporter收集数据,Prometheus显示收集到数据,grafana未显示数据出来

问题背景: 使用golang编写Prometheus exporter,获取指定API Url返回值中的data值,把它做为自定义指标。 1、exporter 500ms自动更新一次data值 2、Prometheus的Graph界面输入自定义指标可以查询到值的变化 3、自定义指标最小时间是ms级别&…

es 集群安全认证

参考文档:Configure security for the Elastic Stack | Elasticsearch Guide [7.17] | Elastic ES敏感信息泄露的原因 Elasticsearch在默认安装后,不提供任何形式的安全防护不合理的配置导致公网可以访问ES集群。比如在elasticsearch.yml文件中,server…

数据在内存中的的存储

1.数据类型介绍 内置类型 char , short , int , long , float , double , long long (C99) long 类型的大小是 4 / 8 个字节,元素C语言规定 sizeof(long)> sizeof(int)就行。在32位平台上,long为4个字…

完整指南:如何使用 Stable Diffusion API

Stable Diffusion 是一个先进的深度学习模型,用于创造和修改图像。这个模型能够基于文本描述来生成图像,让机器理解和实现用户的创意。使用这项技术的关键在于掌握其 API,通过编程来操控图像生成的过程。 在探索 Stable Diffusion API 的世界…

循环链表的用法

7.设 数 组 data[m] 作 为 循 环 队 列 SQ 的 存 储 空 间 ,front 为 队 头 指 针 ,rear 为 队 尾 指 针 ,则 执 行 出 队 操 作 后 其 头 指 针 front 值 为 ( ) A.frontfront1 B.front(front1…

上位机图像处理和嵌入式模块部署(qmacvisual自己编写算法插件)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 前面我们说过,qmacvisual本身支持52个控件,但是指望这52个控件可以cover所有的应用场景,这也不太现实。另外&am…

【DBC专题】-11-使用Cantools将CAN/CANFD DBC自动生成C语言代码

目录 1 安装Python和Cantools 1.1 查看Python已安装的Package包 1.2 在Python中安装Cantools插件包 1.3 获取更多Cantools工具的更新动态 2 经典CAN/CANFD DBC自动生成C语言代码 2.1 批处理文件CAN_DBC_To_C.bat内容说明 2.2 经典CAN/CANFD DBC文件要求 2.3 如何使用生…

腾讯云k8s容器服务

1、新建一个集群 这个网址: 登录登录 - 腾讯云 2、选择第一个 3、名字随便起一个,然后基本默认就行 4、 组件配置直接跳过,信息确认,等待集群初始化,等10分钟左右(容器服务需要充点钱才行) 5…

瑞_JVM虚拟机_类的生命周期_初始化阶段 <clinit>

文章目录 1 JVM虚拟机概述2 类的生命周期2.1 加载阶段2.2 连接阶段2.3 初始化阶段\<client> ★★★★★2.3.1 案例一2.3.1.1 案例描述2.3.1.2 解析字节码指令 2.3.2 案例二2.3.3 小结2.3.4 代码中触发类的初始化的方式2.3.4.0 设置打印出加载并初始化的类2.3.4.1 方式一2…

three.js 鼠标左右拖动改变玩家视角

这里主要用到了 一个方法 obj.getWorldDirection(); obj.getWorldDirection()表示的获取obj对象自身z轴正方向在世界坐标空间中的方向。 按下 W键前进运动&#xff1b; <template><div><el-container><el-main><div class"box-card-left…

redis学习-List类型相关命令以及特殊情况分析

目录 1. lpush key value1 value2 ... 2. lrange key start end 3. lpop key num 4. rpush key value1 value2 ... 5. rpop key num 6. lindex key index 7. llen key 8. lrem key num value 9. rpoplpush key1 key2 10. lset key index value 11. linsert key before/after…

【STL】List容器介绍+相关练习题详细版本

List 1.List介绍2.使用注意3.list与vector的对比4.练习题 1.List介绍 list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;…

索引常见面试题

面试中&#xff0c;MySQL 索引相关的问题基本都是一系列问题&#xff0c;都是先从索引的基本原理&#xff0c;再到索引的使用场景&#xff0c;比如&#xff1a; 索引底层使用了什么数据结构和算法&#xff1f;为什么 MySQL InnoDB 选择 Btree 作为索引的数据结构&#xff1f;什…

5_springboot_shiro_jwt_多端认证鉴权_禁用Cookie

1. Cookie是什么 ​ Cookie是一种在客户端&#xff08;通常是用户的Web浏览器&#xff09;和服务器之间进行状态管理的技术。当用户访问Web服务器时&#xff0c;服务器可以向用户的浏览器发送一个名为Cookie的小数据块。浏览器会将这个Cookie存储在客户端&#xff0c;为这个Co…

30.网络游戏逆向分析与漏洞攻防-网络通信数据包分析工具-数据搜索功能

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果 内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;29.数据推测功能…

从爬楼梯到斐波那契数列:解密数学之美

题目描述 我们来看看力扣的一道经典问题70. 爬楼梯 递归 假设n级台阶有climbStairs(n)种方法爬到楼梯顶。如果有n级台阶&#xff0c;如果第一次往上爬1级台阶&#xff0c;就会剩下n-1级台阶&#xff0c;这n-1级台阶就有climbStairs(n-1)种方法爬到楼梯顶&#xff1b;如果第一…

【Week Y2】使用自己的数据集训练YOLO-v5s

Y2-使用自己的数据集训练YOLO-v5s 零、遇到的问题汇总&#xff08;1&#xff09;遇到git的import error&#xff08;2&#xff09;Error&#xff1a;Dataset not found&#xff08;3&#xff09;Error&#xff1a;删除中文后&#xff0c;训练图片路径不存在 一、.xml文件里保存…

【MySQL】MySQL视图

文章目录 一、视图的基本使用1.创建视图2.修改了视图&#xff0c;对基表数据有影响3.修改了基表&#xff0c;对视图有影响4.删除视图 二、视图规则和限制 一、视图的基本使用 视图是一个虚拟表&#xff0c;其内容由查询定义。同真实的表一样&#xff0c;视图包含一系列带有名称…

Vulnhub - Jarbas

希望和各位大佬一起学习&#xff0c;如果文章内容有错请多多指正&#xff0c;谢谢&#xff01; 个人博客链接&#xff1a;CH4SER的个人BLOG – Welcome To Ch4sers Blog Jarbas 靶机下载地址&#xff1a;https://www.vulnhub.com/entry/jarbas-1,232/ 0x01 信息收集 Nmap…