ConKI: Contrastive Knowledge Injection for Multimodal Sentiment Analysis

news2025/1/22 9:19:52

文章目录

  • 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有效。

😃😃😃

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

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

相关文章

五个跟进方法,让你的老外客户不再跑路!

一、不同客户该怎么跟进? 1.已报价的客户 在向客户报过价之后,过几天要记得再询问一下对方是否收到了报价,如果没收到就提醒一下客户必要时将价格再发过去,如果客户已收到还要再进一步了解其对于报价的想法。 如果客户有兴趣也有需要&…

外包2月,技术倒退警钟长鸣。。。。。

曾经的我,作为一名大专生,在湖南某软件公司从事功能测试工作近四年。日复一日的工作让我陷入舒适区,不思进取。直到今年8月,我才意识到自己的技术停滞不前,女友的离开更是让我痛定思痛,决定改变现状&#x…

如何选择合适的奶瓶?五大超实用选购技巧,新手宝妈必看

奶瓶什么品牌好?奶瓶是每个新生宝宝都需要用到的辅喂产品,然而市场上许多网红品牌为了赚快钱,往往凭借外观设计、性价比和广告营销来吸引消费者。这些品牌由于缺乏专业技术,往往没有对选材用料和安全性进一步的优化,从…

使用jQuery的autocomplete实现数据查询一次,联想自动补全

书接上回,上次说到在jsp页面中,通过监听输入框的数值变化,实时查询数据库,得到返回值使用autocomplete属性自动补全,实现一个联想补全辅助操作,链接:使用jquery的autocomplete属性实现联想补全操…

Redis数据结构对象中的类型检查与命令多态、内存回收

类型检查与命令多态 概述 redis中用于操作键的命令基本上可以分为两种类型。其中一种命令可以对任何类型的键执行,比如说DEL命令、EXPIRE命令、RENAME命令、TYPE命令、OBJECT命令等. 而另一种命令只能对特定类型的键执行,比如说 1.SET、GET、APPEND、…

Vector Magic:矢量图像转换神器,轻松驾驭Mac与Win双平台

在数字化时代,图像已经成为我们生活和工作中不可或缺的一部分。无论是设计师、艺术家,还是普通用户,都对图像质量有着极高的要求。而矢量图像,以其清晰度高、可无限放大的特点,逐渐受到广大用户的青睐。今天&#xff0…

打破沟通壁垒:跨部门需求冲击与IT部门的应对智慧

引言 在快节奏、高要求的互联网行业,跨部门间的有效沟通是确保项目顺利进行和公司业务稳定发展的基石。然而,需求突袭往往成为打乱这一稳定局面的重要因素。 事件的背景 作为一IT部门负责人,在跨部门的领导层沟通会议上,一个在事…

深度解析深度学习中的长短期记忆网络(LSTM)(含代码实现)

在深度学习中,长短期记忆网络(LSTM)是一种强大的循环神经网络结构,能够更好地处理长序列数据并减轻梯度消失的问题。本文将介绍LSTM的工作原理,并使用PyTorch实现一个简单的LSTM模型来展示其在自然语言处理中的应用。 …

使用 wxWidgets 的 wxAUI 界面库,创建功能丰富的软件界面

目录 前言: wxAUI 的优势: 使用 wxAUI 创建软件界面的步骤: 以下是一些使用 wxAUI 创建软件界面的技巧: 案例: 总结: 前言: 软件界面是用户与软件交互的重要桥梁,一个好的界面…

应用测评要求解读-三级

身份鉴别: a)应对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换; 1. 在未登录状态下尝试直接访问任意操作页面或功能,查看是否具有登陆界面。 2.询问或者测试…

《你就是孩子最好的玩具·升级版》笔记(四)给父母的话

经典摘录 两岁到三岁之间是最具有挑战性的一段时期。在这个阶段,你的工作最多,责任也最大,因为你将极大地影响并决定孩子的情感发育。“当妈妈本来就不容易,你并不需要时时刻刻都开心,这很正常。” 【●反省自己生气的…

Vue技能树总结01

Vue vs React 相似之处: 它们都有使用 Virtual DOM;提供了响应式(Reactive)和组件化(Composable)的视图组件。将注意力集中保持在核心库,而将其他功能如路由和全局状态管理交给相关的库。React 比 Vue 有更…

MySQL数据自动同步到Es

Logstash 测试数据准备 DROP DATABASE IF EXISTS es;CREATE DATABASE es DEFAULT CHARACTER SET utf8;USE es;CREATE TABLE book (id INT NOT NULL,title VARCHAR(20),author VARCHAR(20),price DECIMAL(6,2),PRIMARY KEY(id) );DROP PROCEDURE IF EXISTS batchInsertBook;DELI…

极大似然估计和最大参数后验估计

概率是已知模型和参数,推数据;统计(似然)是已知数据,推模型和参数。对于函数 x表示某一个具体的数据;θ表示模型的参数。 如果θ是已知确定的,x 是变量,这个函数叫做概率函数(prob…

全国人口密度分布数据

数据福利是专门为关注小编博客及公众号的朋友定制的,未关注用户不享受免费共享服务,已经被列入黑名单的用户和单位不享受免费共享服务。参与本号发起的数据众筹,向本号捐赠过硬盘以及多次转发、评论的朋友优先享有免费共享服务。 对人口数量、…

网络架构层_交换机连接使用

网络架构层_交换机连接使用 交换机是不是不会用呀?交换机,服务器,路由器,防火墙,网关,这些都是嘛呀? 网上的一些网络架构图,具体项目按照实际考虑。 交换机的Console口——通过Con…

递增三元组C++

题目 输入样例&#xff1a; 3 1 1 1 2 2 2 3 3 3输出样例&#xff1a; 27 思路1 题目让我们求所有满足Ai < Bi < Ci的三元组组合&#xff0c;我们可以先将A, B, C三个数组按升序排序&#xff0c;设计分别指向A数组和C数组的指针ia、ic&#xff0c;一开始指向数组的第一…

数据结构与算法1-大O表示法

大O指Big Operation&#xff0c;可以用来表示时间复杂度和空间复杂度 常见大 O O O 表示法 按时间复杂度从低到高 黑色横线 O ( 1 ) O(1) O(1)&#xff0c;常量时间&#xff0c;意味着算法时间并不随数据规模而变化绿色 O ( l o g ( n ) ) O(log(n)) O(log(n))&#xff0c;…

算法打卡day17|二叉树篇06|Leetcode 654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

算法题 Leetcode 654.最大二叉树 题目链接:654.最大二叉树 大佬视频讲解&#xff1a;最大二叉树视频讲解 个人思路 大概思路就是在数组中 找最大值的节点作为当前节点&#xff0c;用最大值的index切割左右子树的区间&#xff0c;往复循环到数组元素为0&#xff1b; 解法 递…

【Linux】详谈进程优先级进程调度与切换

一、进程优先级 1.1、为什么要有优先级 进程要访问某种资源&#xff0c;进程通过一定的方式排队&#xff0c;确认享受资源的优先顺序。计算机中资源过少&#xff0c;所以进程访问某种资源时需要排队。 1.2、优先级的具体表示 进程的优先级其实就是PCB中的一个整形变量…