当前位置: 首页 > news >正文

RoCBert:具有多模态对比预训练的健壮中文BERT

摘要

大规模预训练语言模型在自然语言处理(NLP)任务上取得了最新的最优结果(SOTA)。然而,这些模型容易受到对抗攻击的影响,尤其是对于表意文字语言(如中文)。 在本研究中,我们提出了 ROCBERT——一种对抗各种形式对抗攻击(如单词扰动、同义词替换、拼写错误等)具有鲁棒性的中文预训练 BERT 模型。 该模型采用对比学习目标(contrastive learning objective)进行预训练,以最大化不同合成对抗样本下的标签一致性。此外,模型输入包含多模态信息,包括:

  • 语义(semantic)
  • 音韵(phonetic)
  • 视觉(visual)

我们发现,这些特征对于提升模型的鲁棒性至关重要,因为对抗攻击可能发生在这三种信息模态中。 在 5 个中文自然语言理解(NLU)任务上,ROCBERT 在三种黑盒对抗攻击算法下均优于强基线模型,同时不损失干净测试集(clean testset)上的性能。此外,在有害内容检测任务中,该模型在人工构造的攻击下表现最佳。


1 引言

大规模预训练模型在微调(finetuning) 充足的标注数据后,已经能够接近甚至超越人类水平(Peters et al., 2018; Radford et al.; Devlin et al., 2019; Liu et al., 2019; Brown et al., 2020)。 然而,即便这些模型在海量文本上进行了预训练,它们仍然容易受到对抗攻击(adversarial attacks)的影响,例如:

  • 同义词替换(synonyms substitution)
  • 单词删除/交换(word deletion/swapping)
  • 拼写错误(misspelling)

这些对抗样本(adversarial examples) 在真实世界场景中频繁出现,它们可能是:

  • 自然产生的(例如:拼写错误)
  • 恶意制造的(例如:规避有害内容的自动检测)

在这里插入图片描述

缺乏鲁棒性的问题

在噪声较大的真实环境中进行测试时,这些预训练模型的鲁棒性不足,可能会导致严重的性能下降。这一问题在表意文字语言(如中文)中尤为突出,因为对抗攻击可以发生在:

  • 字形(Glyph Character)
  • 拼音(Pinyin,即罗马化音标表示)
  • 或二者结合的方式

(Wang et al., 2020; Li et al., 2020d; Zhang et al., 2020; Nuo et al., 2020)。

表 1 展示了一些攻击示例。例如,单词“科比 (Kobe)” 可以被替换为:

  • 同义词(语义攻击)
  • 发音相似的词(语音攻击)
  • 视觉上相似的字(视觉攻击)

攻击者甚至可以先将汉字转换为拼音,然后在字母层面继续攻击(如表中的 “keb1”)。

由于汉字的语义与语音信息相互独立,且汉字的字形字符丰富,使得攻击形式远比英语等字母语言更加多样化。


当前对抗防御方法的局限性

目前,研究人员主要采用两种方法来防御对抗攻击:

  1. 拼写检查(Spell Checking)

    • 在文本输入预测模型之前,先进行拼写检查,以修正书写错误
    • 相关研究:Pruthi et al., 2019; Li et al., 2020b; Mozes et al., 2021
    • 问题:中文拼写检查本身就是一个极具挑战的任务,模型需要准确恢复原始文本,而拼写检查中的微小错误都可能导致模型无法预测或产生错误行为
  2. 对抗训练(Adversarial Training)

    • 在训练数据中加入对抗样本,让模型适应对抗攻击
    • 相关研究:Zang et al., 2020; Li et al., 2020a; Liu et al., 2020
    • 问题:在微调阶段,模型难以适应所有对抗变体,尤其是在训练数据稀缺的情况下(Meng et al., 2021)

ROCBERT 方案:构建鲁棒的中文 BERT

为了解决上述挑战,我们提出ROCBERT,这是一种鲁棒的中文 BERT 预训练模型,其核心方法包括:

  • 对抗对比学习目标(Contrastive Learning Objective)

    • 最大化不同对抗样本下的标签一致性,提高模型鲁棒性
  • 自动生成对抗样本

    • 采用专门的算法,涵盖常见的攻击类型
  • 组合攻击(Combinatorial Attacks)

    • 多个攻击类型可叠加(这在以往研究中从未被考虑)
  • 多模态信息融合

    • 在编码器中融合语义、音韵和视觉信息,以全面抵御不同形式的攻击
    • 其中,语音和视觉特征被插入到自注意力层(Self-Attention Layer)中,然后在后续层进行动态融合

在5 个标准 NLU 任务和1 个有害内容检测任务上,我们的预训练模型在各种对抗攻击下达到了最新 SOTA 结果。


贡献总结

  1. 提出了一种新的鲁棒中文 BERT 预训练方法,结合对抗对比学习,使模型在干净测试集和对抗攻击数据集上都能表现良好。
  2. 采用合成对抗样本,涵盖语义、音韵和视觉三种攻击类型,并融合多模态特征来防御所有级别的攻击。
  3. 在 5 个 NLU 任务和 1 个有害内容检测任务上,在各种对抗攻击下均超越强基线模型。
  4. 进行广泛的消融实验,探讨不同预训练选项的影响,并与主流对抗防御方法进行了深入比较,以促进未来研究。

2 相关工作

对抗攻击(Adversarial Attack)

大量研究表明,NLP 模型在对抗样本下极易受到攻击,即使这些样本对人类来说可理解,但会导致模型预测错误(Li et al., 2020c; Garg & Ramakrishnan, 2020; Zang et al., 2020)。

通常,对抗攻击可分为两类:

  1. 语义等价替换(Semantic Equivalent Replacement)

    • 通过词向量相似性替换单词(Jin et al., 2020; Wang et al., 2020)
    • 通过WordNet 同义词替换(Zang et al., 2020)
    • 通过预训练模型的掩码预测(Masked Prediction)(Li et al., 2020c; Garg & Ramakrishnan, 2020; Li et al., 2020d)
  2. 噪声注入(Noise Injection)

    • 添加/删除/交换单词(Li et al., 2019a; Gil et al., 2019; Sun et al., 2020a)
    • 替换为发音或视觉相似的单词(Eger et al., 2019; Eger & Benz, 2020)

对于中文而言,由于汉字的字形和拼音特性,噪声可以同时作用在字形和拼音上(Zhang et al., 2020; Nuo et al., 2020)。


3 对抗样本生成(Adversarial Example Synthesis)

3.1 中文字符攻击(Attacking Chinese Characters)

由于汉字的复杂性,我们专门设计了5 种中文特定的攻击方法:

  1. 语音攻击(Phonetic Attack)

    • 用同音字替换汉字(忽略声调)
    • 对于多音字,选取最常见的 2 个拼音
  2. 视觉攻击(Visual Attack)

    • 用视觉上相似的汉字进行替换(使用汉字相似度数据库)
  3. 字符拆分攻击(Character Split Attack)

    • 拆分汉字为两个子部分,且每部分仍是有效汉字或视觉相似汉字
    • 参考中文拆分字典(共17,803 种拆分方式)
  4. 同义词替换攻击(Synonym Attack)

    • 分词后用同义词替换部分单词(使用Jieba 分词器)
    • 同义词判定标准:相似度 > 0.75
    • 仅替换名词和形容词(因为其他词的替换往往会改变语义)
  5. 字符转拼音攻击(Character-to-Pinyin Attack)

    • 用拼音表示汉字(忽略声调)

      在这里插入图片描述

3.2 其他字符的攻击方式

除了中文字符,中文语料库中还包含拼音、数字、标点符号和外文单词。我们设计了以下 4 种攻击方法,适用于所有字符类型:

  1. Unicode 攻击(Unicode Attack)

    • 随机选取一个视觉相似的 Unicode 字符进行替换
  2. 随机插入(Random Insertion)

    • 从词汇表中随机抽取一个字符
    • 随机插入到目标字符的左侧或右侧
  3. 交换字符(Swap)

    • 交换目标字符与其相邻字符的位置
  4. 删除字符(Deletion)

    • 直接删除目标字符

表 1 展示了所有攻击类型的示例。

3.3 对抗样本的生成过程(Synthesis Process)

对抗样本的生成流程如下:

  1. 给定一个句子,我们首先选择多个字符作为攻击目标。
  2. 针对每个被选中的字符,我们结合上述字符级攻击算法,生成被攻击后的字符形式。

攻击比例(Attack Ratio) 攻击比例( γ γ γ)决定了一个句子中有多少字符会被攻击。
设句子中的总字符数为 n c n_c nc,我们定义 γ γ γ 为:
γ = min ⁡ ( max ⁡ ( int ⁡ ( ϵ ) , 1 ) , n c ) ( 1 ) ϵ ∼ N ( max ⁡ ( 1 , 0.15 n c ) , 1 ) \begin{aligned} & \gamma=\operatorname*{min}(\operatorname*{max}(\operatorname{int}(\epsilon),1),n_{c}) \\ & & \mathrm{(1)} \\ & \epsilon\sim\mathcal{N}(\max(1,0.15n_{c}),1) \end{aligned} γ=min(max(int(ϵ),1),nc)ϵN(max(1,0.15nc),1)(1)
其中,int 函数将四舍五入为最接近的整数。这样做的直观原因是,我们希望平均攻击 15% 的字符。如果句子较短,我们将确保至少攻击一个字符。我们在平均比例的基础上添加了正态高斯噪声,以增加一定的随机性。

字符选择:许多研究表明,攻击信息量大的词比随机选择词更有效(Li et al., 2019a; Sun et al., 2020a)。因此,我们根据字符在句子中的信息量来决定其被选中的概率。设 w ( c i ) w(c_i) w(ci) 表示字符 c i c_i ci 所属的词, c i c_i ci 的信息量得分通过删除 w ( c i ) w(c_i) w(ci) 后语言模型损失的变化来计算(记为 L ( ▽ w ( c i ) ) \mathcal{L}(\triangledown w(c_{i})) L(w(ci)),参考 Li et al., 2016)。字符 c i c_i ci 被选中攻击的概率为:
p ( c i ) = e L ( ∇ w ( c i ) ) ∣ w ( c i ) ∣ ∑ j = 1 n w e L ( ∇ w j ) ( 2 ) p(c_i)=\frac{e^{\mathcal{L}(\nabla w(c_i))}}{|w(c_i)|\sum_{j=1}^{n_w}e^{\mathcal{L}(\nabla w_j)}}\qquad{(2)} p(ci)=w(ci)j=1nweL(wj)eL(w(ci))(2)
其中, n w n_{w} nw 是句子中的词数。 ∣ w ( c i ) ∣ |w(c_i)| w(ci) 表示 w ( c i ) w(c_i) w(ci) 中的字符数,因此同一词中的字符被选中的概率相等。

攻击组合:一个字符可能会受到多种攻击的组合。例如,我们可以将一个中文字符转换为其拼音,然后继续在字母级别对其进行攻击(如表1中的“to pinyin + unicode”)。我们将其定义为一个顺序过程,每一步都可以在之前的基础上添加新的攻击。具体来说,所有攻击组合应用于字符 c c c 后得到的新字符 c ~ \tilde{c} c~ 为:
c ~ = A S ( c ) ∘ ⋯ ∘ A 2 ∘ A 1 ( c ) ( 3 ) \tilde{c}=A_{S(c)}\circ\cdots\circ A_2\circ A_1(c) \qquad{(3)} c~=AS(c)A2A1(c)(3)

p ( S ( c ) = k ) = q ( 1 − q ) k − 1 p(S(c)=k)=q(1-q)^{k-1} p(S(c)=k)=q(1q)k1

其中,“o” 表示将新的攻击算法 A A A 应用于上一步的输出。在每一步 i i i,攻击算法 A i A_i Ai 都是从所有适用于上一步输出的算法中随机选择的。 S ( c ) S(c) S(c) 表示应用于字符 c c c 的攻击步骤数,它服从指数衰减函数。我们在实验中将超参数设定为 q = 0.7 q=0.7 q=0.7。对抗样本生成的完整流程如图 1 所示。


4. 多模态对比学习预训练(Multimodal Contrastive Pretraining)

借助上述对抗样本生成算法,我们可以通过多模态对比学习目标来预训练模型。


4.1 多模态特征(Multimodal Features)

我们采用标准 BERT 结构(Devlin et al., 2019)作为基础,并在此基础上**将语音(Phonetic)和视觉(Visual)特征融合到输入文本中。

特征表示(Feature Representation)

对于词汇表中的每个字符 c c c,除了标准的语义嵌入(Semantic Embedding) S e ( c ) Se(c) Se(c),我们还包括两个额外的向量:

  • P h ( c ) Ph(c) Ph(c) —— 编码字符的语音(拼音)信息
  • V i ( c ) Vi(c) Vi(c) —— 编码字符的视觉信息

如果 c c c 不是一个汉字,它会有自己的语音向量。否则,其语音向量 P h ( c ) Ph(c) Ph(c) 定义如下:

P h ( c ) = ∑ k ∈ p i n y i n ( c ) P h ( k ) Ph(c)=∑k∈pinyin(c)Ph(k) Ph(c)=kpinyin(c)Ph(k)

其中, p i n y i n ( c ) pinyin(c) pinyin(c) 是字符 c c c 的拼音序列。字符的视觉向量 V i ( c ) Vi(c) Vi(c) 是从其 32×32 图像 I ( c ) I(c) I(c) 中提取的。对于汉字,该图像采用宋体(Simsun);对于其他字符,则采用Arial字体,这些是大多数在线文本的默认字体。

V i ( c ) Vi(c) Vi(c) 的计算方式如下:
V i ( c ) = L a y e r N o r m ( M T R e s N e t 18 ( I ( c ) ) ) ( 4 ) Vi(c)=LayerNorm(M^TResNet18(I(c)))\qquad{(4)} Vi(c)=LayerNorm(MTResNet18(I(c)))(4)
M M M 是一个可学习矩阵,我们利用 ResNet18 (He et al., 2016)将 字符图像 I ( c ) I(c) I(c) 映射为一维向量(该映射在训练过程中被冻结,即不会更新)。


视觉表征预训练(Visual Representation Pretrain)

为了获得合理的初始化,我们增加了一个仅针对视觉表征的预训练阶段。

  • 语音表征(Phonetic representations)在训练开始时随机初始化。
  • 视觉表征的变换矩阵 M M M(公式 4 中)使用与公式 5 相同的对比损失进行预训练。

在该阶段,字符 c c c 的正样本(positive sample)是其视觉对抗形式 c ~ \tilde{c} c~,定义如下:

c ~ = A ( c ) \tilde{c}=\mathcal{A}(c) c~=A(c) ,其中, A ∼ U ( visual, character split, unicode ) \mathcal{A} \sim \mathbb{U}(\text{visual, character split, unicode}) AU(visual, character split, unicode),表示从 §3 提到的三种视觉攻击方法**(**视觉替换、字符拆分、Unicode 替换)中均匀采样。 如果 c c c 被拆分为两个字符 c 1 c_1 c1 c 2 c_2 c2,则其视觉表征计算方式如下:

V i ( c ~ ) = V i ( c 1 ) + V i ( c 2 ) Vi(\tilde{c})=Vi(c_1)+Vi(c_2) Vi(c~)=Vi(c1)+Vi(c2)

负样本(negative samples) 是同一批次(batch)中的所有其他字符。 经过该训练后,视觉相似的字符将在表征空间中彼此靠近。


特征融合(Feature Integration)

一个直接的多模态特征融合方法是在送入编码器(encoder)之前进行融合(Sun et al., 2021; Liu et al., 2021)。
然而,这种方法会对三种特征(语义、语音、视觉)赋予相等的权重**,使模型无法动态关注最有用的特征。

另一种方法是两步编码(two-step encoding),先确定各特征的权重,然后用选择性注意力进行编码(Xu et al., 2021)。
但这种方法会显著降低系统的运行速度。 我们提出了一种轻量级融合方法——“层插入”(layer-insert) ,即仅在编码器的一个层中插入多模态特征。令 H k ( i ) H_k(i) Hk(i) 表示第 k k k 层中第 i i i 个词的表征,我们的插入方式如下:
W 1 = K 1 T H k ( i ) H k ( i ) V 1 W 2 = K 2 T H k ( i ) P h ( i ) V 2 W 3 = K 3 T H k ( i ) V i ( i ) V 3 H k ( i ) = W 1 H k ( i ) + W 2 P h ( i ) + W 3 V i ( i ) W 1 + W 2 + W 3 \begin{aligned} W_{1} & =K_{1}^{T}H^{k}(i)H^{k}(i)V_{1} \\ W_{2} & =K_{2}^{T}H^{k}(i)Ph(i)V_{2} \\ W_{3} & =K_3^TH^k(i)Vi(i)V_3 \\ H^{k}(i) & =\frac{W_{1}H^{k}(i)+W_{2}Ph(i)+W_{3}Vi(i)}{W_{1}+W_{2}+W_{3}} \end{aligned} W1W2W3Hk(i)=K1THk(i)Hk(i)V1=K2THk(i)Ph(i)V2=K3THk(i)Vi(i)V3=W1+W2+W3W1Hk(i)+W2Ph(i)+W3Vi(i)
其中, P h ( i ) Ph(i) Ph(i) V i ( i ) Vi(i) Vi(i)分别是语音和视觉表示, K j / V j K_j / V_j Kj/Vj是可学习的矩阵。直观上,我们可以使用第 0 层到第 ( k-1 ) 层来决定三种多模态表示的权重,并使用其余层进行句子表示学习。这使得模型能够根据句子上下文动态融合多模态信息,同时仅增加少量复杂性。

4.2 模型损失

模型损失由两部分组成:对比学习损失和标准的掩码语言模型(MLM)损失。

对比学习:对比学习(Chen et al., 2020; Kim et al., 2021)的核心思想是,表示空间应使相似(正)样本更接近,而使不相似(负)样本更远离。对于每个句子,我们将其对抗形式(通过第 3 节中的算法获得)视为正样本,并将同一批次中的所有其他句子视为负样本。给定一个包含 ( N ) 个句子的批次,第 ( i ) 个句子 ( s i s_i si ) 的损失为:
L c ( i ) = − log ⁡ e s i m ( s i , s ~ i ) / τ ∑ j = 1 N e s i m ( s i , s j ) / τ , ( 5 ) \mathcal{L}_{c}(i)=-\log\frac{e^{sim(s_{i},\tilde{s}_{i})/\tau}}{\sum_{j=1}^{N}e^{sim(s_{i},s_{j})/\tau}},\qquad{(5)} Lc(i)=logj=1Nesim(si,sj)/τesim(si,s~i)/τ,(5)
其中, τ \tau τ 是温度超参数(temperature hyperparameter), s i s_i^{~} si  是从 s i s_i si 生成的对抗样本。我们在初步实验的基础上设定 τ = 0.01 \tau = 0.01 τ=0.01,并定义相似度计算公式如下: sim ( s i , s ~ i ) = h i ⃗ T h i ⃗ ∥ h i ⃗ ∥ ⋅ ∥ h i ⃗ ∥ \text{sim}(s_i, \tilde{s}_i) = \frac{\vec{h_i}^T\vec{h_i}}{\|\vec{h_i}\| \cdot \|\vec{h_i}\|} sim(si,s~i)=hi hi hi Thi ,即在表示空间 h i h_i hi h i ~ \tilde{h_i} hi~ 中的余弦相似度(cosine similarity)。


混合 MLM 训练(Mix with MLM)

我们将**对比学习损失(contrastive learning loss)与标准的掩码语言模型(MLM)损失(Devlin et al., 2019)混合,以实现句子级和词级的表示学习。 我们采用基于字符(character-based)的分词器,原因如下:

  1. 中文字符本身可作为独立的语义单元(Li et al., 2019b)。
  2. 基于字符的模型在嘈杂(noisy)或对抗性(adversarial)场景下更具鲁棒性**(El Boukkouri et al., 2020)。

对于中文字符,我们采用两种掩码策略:

  • 整词掩码(Whole Word Masking, WM)
  • 字符掩码(Char Masking, CM)

因为大量中文词汇由多个字符组成(Cui et al., 2019; Sun et al., 2021)。 最终,对比学习损失和 MLM 损失具有相同的权重**(equally weighted)。

5 实验(Experiments)

5.1 实验设置(Experiment Setup)

模型细节(Model Details)

我们使用16224个词汇(vocabulary size),其中14642个是中文字符。我们提供两种版本的 ROCBERT:

  • Base 版本:12 层/头,隐藏神经元数为 768。训练 600k 步,batch size 为 4k,学习率 1e-4,warmup 25k 步。
  • Large 版本:48 层,24 个注意力头(attention heads),隐藏神经元数为 1024。训练 500k 步,学习率 3e-4,warmup 70k 步,batch size 8k。

预训练细节(Pretraining Details)

按照通用做法,我们在 2TB 文本数据上进行预训练,该数据来源于 THUCTC 12、中文维基百科(Chinese Wikipedia)和 Common Crawl。

  • 训练设备:64 块 NVIDIA V100 (32GB) GPU,使用 FP16 和 ZERO-stage-1 优化(Rasley et al., 2020)。
  • 内存优化:
    • 采用 PatricStar(Fang et al., 2021)以动态内存调度,结合基于块(chunk-based)的内存管理。
    • 该方法会将除当前计算部分外的所有内容卸载到 CPU,从而在相同硬件条件下训练更大的模型。
    • 基于块的内存管理利用了Transformer 结构的线性特性,可以提前预加载即将计算的层到 GPU,提高计算效率。

基线模型(Baseline Models)

我们将 ROCBERT 与以下 最先进(SOTA)的中文预训练模型进行对比:

  1. MBert-Chinese(Devlin et al., 2019)
  2. Bert-wwm(Cui et al., 2019):在 MBert-Chinese 基础上继续预训练,并采用 Whole Word Masking(WWM)策略。
  3. MacBERT(Cui et al., 2020):采用 MLM-As-Correlation(MAC) 预训练策略,并加入句子顺序预测(Sentence-Order Prediction, SOP)任务。
  4. ERNIE-gram(Sun et al., 2019, 2020b):采用多种掩码策略(token 级、短语级、实体级),在大规模异构数据上进行预训练。
  5. ChineseBERT(Sun et al., 2021):在预训练过程中加入了字形(glyph)和音韵(phonetic)特征。

评测任务(Tasks)

我们在 5 个标准中文自然语言理解(NLU)任务和 1 个有害内容检测(toxic detection)任务上测试模型:

  1. ChnSentiCorp(2k 训练数据):中文情感分类任务(Xu et al., 2020)。
  2. TNEWS(50k 训练数据):新闻标题分类任务。
  3. AFQMC(34k 训练数据):问题匹配(question matching)任务。
  4. CSL(20k 训练数据):从论文摘要中识别关键词(keyword recognition)。
  5. CMNLI(390k 训练数据):中文多领域自然语言推理(Chinese Multi-Genre NLI)(Conneau et al., 2018)。
  6. 有害内容检测(Toxic Detection):
    • 该任务用于对抗人类制造的攻击(human-made attacks),与合成攻击(synthesized attacks)形成对比。
    • 数据来源于用户在某在线对话平台上的输入,其中用户会刻意使用各种攻击手段来规避系统的自动过滤(如垃圾广告、色情、辱骂等)。
    • 我们手动标注了50k 条用户输入,其中2k 条为有害内容(positive),且 90% 具有对抗性特征。
    • 负例(negative)随机采样2k 条非有害文本,最终数据集按 8:1:1 划分为 训练/验证/测试集。

攻击方法(Attacker)

我们在 三种不同的攻击方法下测试模型表现(均为无目标攻击,即不对目标类别施加限制):

  1. ADV(我们的自定义攻击算法)
  2. TextFooler(Jin et al., 2020):
    • 黑盒(black-box)攻击算法,通过用语义相似的词替换关键字来欺骗模型。
    • 原生为英文算法,我们重新实现(reimplement)了对应的中文版本。
  3. Argot(Zhang et al., 2020):
    • 黑盒攻击算法,专门针对中文特征进行攻击。

所有三种攻击方法的最大攻击比率(attack ratio)均设为 20%。
在这里插入图片描述


5.2 实验结果(Experiment Results)

中文 NLU 任务结果(Chinese NLU Results)

我们在 5 个中文 NLU 任务上的结果见表 2 至表 6。对于每个任务,我们报告模型在干净测试集(clean test set)和三种对抗测试集(adversarial test sets)(即 ADV、TextFooler 和 Argot 生成的对抗数据集)上的准确率(accuracy)。

为了公平比较,我们报告了所有 base 版本模型的性能。然后,我们选择表现最好的 base 版本模型,测试其 large 版本性能,并将其与 ROCBERT 进行比较。

从实验结果可以看出:

  • TNEWS、AFQMC 和 CSL 受 ADV 攻击的影响较小,因为这些任务更依赖全局句子结构,而非个别单词。
  • 在情感分类(sentiment classification)和自然语言推理(NLI)等任务中,单个词汇对模型决策的影响较大,因此攻击会导致显著的性能下降。
  • Argot 和 TextFooler 导致的性能下降比 ADV 更大,因为:
    • TextFooler 和 Argot 专门选择最能影响模型决策的单词进行攻击,而 ADV 仅基于语言模型分数选择攻击单词。
    • Argot 比 TextFooler 更有效,因为它在替换字符时考虑了中文的特定特征(Chinese-specific features)。
  • 总体而言,ROCBERT 在所有攻击算法和所有 5 个任务上都优于其他模型。即使在干净数据集(clean dataset)上,它在 5 个任务中 4 个任务表现最佳。
  • ChineseBERT 在各种攻击下排名第二,因为它在预训练时也考虑了多模态特征(multimodal features),这进一步证明了多模态特征在中文语言预训练中的重要性。

有害内容检测结果(Toxic Content Detection Results)

我们在有害内容检测任务(toxic content detection task)上训练所有模型,结果见表 7。

  • ROCBERT 在 4 个评测指标上都优于所有其他模型,这验证了其能够捕捉真实语义,而不受对抗攻击形式的影响。

  • 不同模型之间的性能差异较小,因为它们都在该任务上进行了微调(finetuning)。

  • 所有模型在训练过程中都能适应不同形式的攻击,而表 2 至表 6 则测试了它们对未知攻击(unknown attacks)的零样本泛化能力(zeroshot generalization)。

    在这里插入图片描述
    在这里插入图片描述

防御方法比较(Defending Method Comparison)

我们进一步将 ROCBERT 与 两种流行的对抗攻击防御方法进行比较:

  1. 拼写检查(Spell Checker):在输入模型之前运行拼写检查器。
  2. 对抗训练(Adversarial Training, AdvTrain):通过添加对抗样本来增强训练数据。

我们在不同任务中,将这两种防御方法添加到在干净测试集上表现最好的 base 版本模型之上进行对比:
在这里插入图片描述

  • TNEWS 任务:使用 ChineseBert 作为基线模型。
  • AFQMC、CSL 和 CMNLI 任务:使用 Ernie-gram 作为基线模型。
  • ChnSentiCorp 任务:使用 MacBert 作为基线模型。

我们采用 Cheng et al. (2020) 提出的拼写检查器。结果如图 2 所示。 从实验结果可以看出:

  • 拼写检查(Spell Checking)对模型性能的提升非常有限,甚至在某些情况下反而降低性能(例如,在 ChnSentiCorp 任务下,使用 ADV 攻击时,拼写检查的效果最差)。

    • 这可能是因为 拼写检查器对领域外(out-of-domain)的对抗样本效果较差,错误的拼写修正会导致错误传播,从而降低整体性能。
  • 对抗训练(AdvTrain)能显著提升模型的鲁棒性(robustness),但它的缺点是它“窥探”(peeps)了测试集中的对抗攻击算法,即它在训练时已经知道测试中使用的攻击类型。

  • ROCBERT 在不知晓测试集攻击算法的情况下,依然能与 AdvTrain 相媲美,甚至在某些情况下超越 AdvTrain,说明它在 面对未知攻击时具有更强的泛化能力。

  • ROCBERT 和 AdvTrain 结合使用时,模型的鲁棒性可以进一步提升。

    5.3 消融实验(Ablation Study)

    我们进行了一系列 消融实验(Ablation Study),以理解ROCBERT不同组件的选择对模型性能的影响。

    在本节中,所有模型均采用相同的 base 结构和超参数,并在100 万个采样训练文本上预训练1轮(epoch),然后在TNEWS 任务上进行测试。实验结果如表 8 所示。

    在这里插入图片描述
    在这里插入图片描述

损失函数(Loss)
为了研究 预训练阶段损失函数的影响,我们尝试了两种不同的设置:

  1. 仅对比学习(Contrastive Only):模型仅使用 公式 5 中的 对比学习损失 进行预训练。
  2. 仅 MLM(MLM-Only):模型仅使用 MLM(掩码语言模型)目标 进行预训练(即标准 Bert 预训练方式)。

实验结果表明,这两种单一的损失函数都会降低模型的性能。
结合两种损失函数 可以提高模型的 对抗攻击鲁棒性,同时不会影响模型在 干净数据(Clean Data) 上的表现。

分词方法(Tokenization)
字符级分词(char-based tokenization) 在中文处理任务中已被广泛证明是最优选择(Li et al., 2019b)。
但对于拼音(pinyin)和非中文词汇,最佳的分词方法尚不明确。因此,我们尝试了以下几种不同的分词方法:

  1. BPE(Byte Pair Encoding):

    • 设定词汇表大小为 20K,在 训练数据 上进行训练(所有 中文字符 先转换为 拼音)。
  2. Char-CNN(Zhang et al., 2015):

    • 逐个字符处理,并使用 Char-CNN 获取拼音嵌入(embedding)。
  3. Char-Sum(ROCBERT 最终采用的方法):

    • 逐个字符处理,并将拼音嵌入表示为 其字符嵌入的总和(sum)。

在这里插入图片描述

实验结果表明:

  • BPE 分词方法会降低模型的性能,可能是因为 BPE 分词仅在 干净数据(Clean Data) 上进行训练。
    • 对于 对抗样本(Adversarial Examples),拼音中的字母更容易受到干扰,从而破坏其词汇表结构。
  • 字符级(Char-Based)分词方法在对抗攻击下更具鲁棒性。
  • Char-CNN 方法没有带来明显提升,可能是因为 拼音字符组合数量有限(约 400 种),每个拼音通常可以通过 字符袋(Bag of Characters) 唯一确定,无需考虑顺序信息。
    ** 多模态特征(Multimodal Feature)**
    我们尝试移除 视觉特征(Visual Feature) 预训练,并观察模型性能的变化:
  1. 移除视觉特征预训练(-vis-pretrain):
    • 结果表明:模型性能下降 甚至比完全移除视觉特征(-vis)更糟糕,
    • 这说明 视觉特征预训练是必要的,否则模型难以学习到有意义的视觉特征。
  2. 移除视觉特征(-vis):
    • 结果表明:视觉特征比拼音特征更为重要。
  3. 移除拼音特征(-pho):
    • 结果表明:拼音特征也能带来一定的性能提升,但不如视觉特征重要。
  4. 添加拼音特征预训练(+pho-pretrain):
    • 结果表明:拼音特征预训练的提升幅度很小,可能是因为拼音特征本身 基于字符嵌入(Character Embedding),
    • 这使得 模型可以在训练过程中自动学习拼音特征,无需额外的预训练。

多模态融合(Multimodal Integration)
我们将 ROCBERT 提出的层插入(Layer-Insert) 方法与 三种主流的多模态特征融合方法 进行了比较:

  1. 加和(Sum, Liu et al., 2021):
    • 直接对不同模态的嵌入进行加和。
  2. 拼接(Concatenation, Sun et al., 2021):
    • 先 拼接 多模态嵌入,然后使用 MLP 层进行融合。
  3. 两步融合(Two-Step, Xu et al., 2021):
    • 先计算不同模态嵌入的权重,然后再融合到 编码器(Encoder) 中。

实验结果表明:

  • ROCBERT 采用的层插入(Layer-Insert)方法效果最佳,且计算开销 极小,
  • 这是因为它仅通过 更新编码器的一层表征 来完成多模态信息的融合。

插入层(Insert Layer)
我们进一步分析了 插入层的位置 对模型性能的影响。

  • 最佳插入层:
    • 基础模型(Base Model) 在 第 1 层插入 多模态特征,
    • 大模型(Large Model) 在 第 3 层插入 多模态特征。
  • 插入层位置对性能的影响(见表 8):
    • 当插入层提升到更高层(如第 4、7 和 10 层),模型性能逐渐下降,
    • 这表明 较早插入(Early Insert) 可以 更深入地融合多模态信息,
    • 但如果 直接插入到第 0 层,效果反而变差,
    • 可能原因是:模型在第 0 层只能从词袋(Bag of Words)层面学习模态特征的权重,而无法进行深入表征学习。

攻击算法(Attacking Algorithm)
我们改变 攻击算法的设置,并在 图 3 中展示了其影响。

  • 攻击比例(Attacking Ratio):
    • 不能 过小或过大,
    • 15% 是对抗预训练的最佳比例(Sweet Spot)。
  • 高斯噪声(Gaussian Noise, 公式 1):
    • 持续带来 正面效果,
    • 这表明 不应在预训练阶段使用固定的攻击比例,而应动态调整。
  • 字符选择(Character Selection):
    • 该机制至关重要,
    • 去掉字符选择后,模型性能大幅下降。
  • 攻击算法的复杂性:
    • 为了验证是否有必要采用复杂的攻击算法,
    • 我们 用 SimCSE(Gao et al., 2021)进行对比(SimCSE 采用 Dropout 作为噪声,而非对抗样本)。
    • 实验结果表明:SimCSE 在不同攻击方式下几乎没有帮助,
    • 这说明:
      • 制定基于规则的攻击算法 以更好地模拟 真实世界攻击 是必要的。
      • 通用的 Dropout 正则化 无法有效适应 复杂的真实世界攻击。

6 结论(Conclusion)

我们提出了 ROCBERT:

  • 第一个鲁棒的中文预训练语言模型,
  • 能够抵御多种形式的对抗攻击。

关键特性:

  1. 基于多模态对比学习目标(Multimodal Contrastive Learning Objective)进行预训练,
  2. 在 5 项中文 NLU 任务上取得最佳表现,
  3. 能在 3 种不同的攻击算法下保持强大的鲁棒性,且不会影响干净测试集的性能,
  4. 在有害内容检测任务(Toxic Content Detection)上显著超越其他模型,
  5. 提供了大量消融实验(Ablation Studies),为未来研究提供参考。

相关文章:

RoCBert:具有多模态对比预训练的健壮中文BERT

摘要 大规模预训练语言模型在自然语言处理(NLP)任务上取得了最新的最优结果(SOTA)。然而,这些模型容易受到对抗攻击的影响,尤其是对于表意文字语言(如中文)。 在本研究中&#xff0…...

DeepSeek入门到大师 清华大学[1-5版]全集

1、文件概览 1、清华大学《DeepSeek:从入门到精通》 2、清华大学《Deepseek如何赋能职场应用?》 3、清华大学《普通人如何抓住DeepSeek红利》 4、清华大学《DeepSeekDeepResearch让科研像聊天一样简单》 5、清华大学《DeepSeek与AI幻觉》 6、天津大学《深度解读Deepseek:原理…...

Debezium:实时数据捕获与同步的利器

一、什么是 Debezium Debezium 是一个开源的分布式平台,专门用于捕获数据库中的数据变更。它通过读取数据库的事务日志,能够以非侵入性的方式捕获数据库中发生的所有变化,并将这些变化转化为事件流,实时推送到像 Kafka 这样的消息…...

【蓝桥杯】第十五届省赛大学真题组真题解析

【蓝桥杯】第十五届省赛大学真题组真题解析 一、智能停车系统 1、知识点 (1)flex-wrap 控制子元素的换行方式 属性值有: no-wrap不换行wrap伸缩容器不够则自动往下换行wrap-reverse伸缩容器不够则自动往上换行 (2&#xff0…...

AI助力下的PPT革命:DeepSeek 与Kimi的高效创作实践

清华大学出品《DeepSeek:从入门到精通》分享 在忙碌的职场中,制作一份高质量的PPT往往需要投入大量时间和精力,尤其是在临近截止日期时。今天,我们将探索如何借助 AI 工具 —— DeepSeek 和 Kimi —— 让 PPT 制作变得既快捷又高…...

【MySQL篇】持久化和非持久化统计信息的深度剖析(含analyze命令和mysqlcheck工具两种收集方式)

💫《博主介绍》:✨又是一天没白过,我是奈斯,从事IT领域✨ 💫《擅长领域》:✌️擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控;并对SQLserver、NoSQL(…...

C++ 手撕定时器

C 手撕定时器 思路与知识调用场景类声明 参考 思路与知识 1. 为了支持相同时间戳下多个任务,需要考虑到支持重复key的std::mutimap, 以及成员函数equal_range 2. 工具函数Timer::GetTick 返回一个uint64_t毫秒时间戳作为multimap的key,需要会使用chrono…...

邮件安全之发件人伪造

电子邮件工作原理 电子邮件传输过程中主要涉及到SMTP、IMAP、POP3三种协议,具体功能如下: SMTP:全称Simple Mail Transfer Protocol,即简单邮件传输协议,主要用于发送邮件,使用端口号25。 IMAP:全称Internet Mail Acce…...

前端八股——JS+ES6

前端八股:JSES6 说明:个人总结,用于个人复习回顾,将持续改正创作,已在语雀公开,欢迎评论改正。...

Qt QTreeWidget 总结

Qt QTreeWidget 总结 1. 概述 QTreeWidget 是 Qt 中用于显示树形结构的控件,继承自 QTreeView,但提供了更简单的接口。适合展示层级数据(如文件目录、组织结构)。每个节点是 QTreeWidgetItem 对象,支持文本、图标、复…...

Python常见面试题的详解16

1. 如何强行关闭客户端和服务器之间的连接? 在网络编程中,有时需要强行中断客户端和服务器之间的连接。对于基于 TCP 协议的连接,由于其面向连接的特性,需要采取特定的步骤来确保连接被正确关闭;而 UDP 是无连接协议&a…...

前端设计模式面试题及参考答案

目录 如何用闭包实现单例模式?列举两种实现方式 工厂模式与构造函数创建对象的核心区别是什么? 抽象工厂模式如何解决多平台 UI 组件兼容问题? 原型模式在前端框架中如何优化对象创建性能? 建造者模式如何实现复杂表单配置的链式调用? 单例模式在全局状态管理中的典型…...

Python Django系列—入门实例(二)

数据库配置 现在,打开 mysite/settings.py 。这是个包含了 Django 项目设置的 Python 模块。 默认情况下,​ DATABASES 配置使用 SQLite。如果你是数据库新手,或者只是想尝试 Django,这是最简单的选择。SQLite 包含在 Python 中…...

STM32-智能台灯项目

一、项目需求 1. 红外传感器检测是否有人,有人的话实时检测距离,过近则报警;同时计时,超过固定时间则报警; 2. 按键 1 切换工作模式:智能模式、按键模式、远程模式; 3. 智能模式下,根…...

HTML之JavaScript DOM操作元素(2)

HTML之JavaScript DOM操作元素(2) 4.增删元素var element document.createElement("元素名") 创建新元素父元素.appendChild(子元素) 在父元素中追加子元素父元素.insertBefore(新元素,参照元素) 在特定元素之前新增元…...

智能优化算法:莲花算法(Lotus flower algorithm,LFA)介绍,提供MATLAB代码

一、 莲花算法 1.1 算法原理 莲花算法(Lotus flower algorithm,LFA)是一种受自然启发的优化算法,其灵感来源于莲花的自清洁特性和授粉过程。莲花的自清洁特性,即所谓的“莲花效应”,是由其叶片表面的微纳…...

【复习】计算机网络

网络模型 OSI 应用层:给应用程序提供统一的接口表示层:把数据转换成兼容另一个系统能识别的格式会话层:负责建立、管理、终止表示层实体之间的通信会话传输层:负责端到端的数据传输网络层:负责数据的路由、转发、分片…...

【R语言】读取CSV数据时,显示[1] PK...<0 行> (或0-长度的row.names)

一、问题 当我使用以下代码读取CSV数据后&#xff0c;发现使用head(data)显示[1] PK...<0 行> (或0-长度的row.names)&#xff0c;如下截图所示。 # 尝试读取文件 data <- read.csv("C:\\Users\\11300\\Desktop\\test.csv", header TRUE) # 检查数据 hea…...

CentOS环境变量配置+解析

环境变量的作用就是让系统快速通过你的命令找到你的可执行程序&#xff0c;windows系统里也同理&#xff0c;也就是你每次输入个命令&#xff0c;系统就会找环境变量里到底有没有叫这个命令进程的 一、环境变量配置 1.编辑配置文件 vim /etc/profile export PATH$PATH:$JAVA…...

最新版本Exoplayer扩展FFmpeg音频软解码保姆级教程

ExoPlayer 是一个开源的 Android 媒体播放库&#xff0c;由 Google 开发和维护&#xff0c;用于替代 Android 系统自带的 MediaPlayer。它提供了更强大的功能、更好的性能和更高的灵活性&#xff0c;适用于各种复杂的媒体播放场景。所以被广泛用于各种播放器场景。 最近项目中…...

【蓝桥杯集训·每日一题2025】 AcWing 6134. 哞叫时间II python

6134. 哞叫时间II Week 1 2月20日 农夫约翰正在试图向埃尔茜描述他最喜欢的 USACO 竞赛&#xff0c;但她很难理解为什么他这么喜欢它。 他说「竞赛中我最喜欢的部分是贝茜说『现在是哞哞时间』并在整个竞赛中一直哞哞叫」。 埃尔茜仍然不理解&#xff0c;所以农夫约翰将竞赛…...

HTML/CSS中子代选择器

1.作用:选中指定元素中,符合要求的子元素. 子代选择器又称:子元素选择器,子选择器. 2.语法:选择器1>选择器2>选择器3>......选择器n 3.实例 <style>/* div中子代选择器 */div>a{color: red;}</style><div><a href"#">张三</…...

计算机毕业设计SpringBoot+Vue.jst网上购物商城系统(源码+LW文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

EasyRTC:全平台支持与自研算法驱动的智能音视频通讯解决方案

在智能硬件的浪潮中&#xff0c;设备之间的互联互通已成为提升用户体验的核心需求。无论是智能家居、智能办公&#xff0c;还是工业物联网&#xff0c;高效的音视频通讯和交互能力是实现智能化的关键。然而&#xff0c;传统音视频解决方案往往面临平台兼容性差、交互体验不佳以…...

C#: 日志函数

背景&#xff1a; 1.常见的官方日志模块项目过于复杂&#xff0c;且配置过于繁琐&#xff0c;针对这种现象&#xff0c;实现在大型项目中快速定位错误问题&#xff1b; 实现思路&#xff1a; 1.设置当前日志文件路径&#xff08;获取到当前文件应用程序路径 \ErrorLog) 2.判…...

PyTorch 是如何进行机器学习的

1. 机器学习的核心流程 机器学习的核心是通过数据训练模型&#xff0c;让模型学会从输入数据中提取规律&#xff0c;并对新数据做出预测。整个过程可以分为以下几个步骤&#xff1a; 准备数据&#xff1a;收集并整理数据&#xff0c;分为输入&#xff08;特征&#xff09;和输…...

Java中的Stream API:从入门到实战

引言 在现代Java开发中&#xff0c;Stream API 是处理集合数据的强大工具。它不仅让代码更加简洁易读&#xff0c;还能通过并行处理提升性能。本文将带你从基础概念入手&#xff0c;逐步深入Stream API的使用&#xff0c;并通过实战案例展示其强大功能。 1. 什么是Stream API…...

【蓝桥杯单片机】客观题

一、第十三届省赛&#xff08;一&#xff09; 二、第十三届省赛&#xff08;二&#xff09;...

Spring Boot 中使用 @Transactional 注解配置事务管理

事务管理是应用系统开发中必不可少的一部分。Spring 为事务管理提供了丰富的功能支持。Spring 事务管理分为编程式和声明式的两种方式。编程式事务指的是通过编码方式实现事务&#xff1b;声明式事务基于 AOP,将具体业务逻辑与事务处理解耦。声明式事务管理使业务代码逻辑不受污…...

嵌入式八股文(五)硬件电路篇

一、名词概念 1. 整流和逆变 &#xff08;1&#xff09;整流&#xff1a;整流是将交流电&#xff08;AC&#xff09;转变为直流电&#xff08;DC&#xff09;。常见的整流电路包括单向整流&#xff08;二极管&#xff09;、桥式整流等。 半波整流&#xff1a;只使用交流电的正…...

《论多源数据集成及应用》审题技巧 - 系统架构设计师

论多源数据集成及应用写作框架 一、考点概述 本论题“论多源数据集成及应用”主要考察的是计算机软件测试工程师在数据管理和集成方面的专业知识与实践能力。论题聚焦于信息爆炸时代企业、组织和个人所面临的数据挑战&#xff0c;特别是如何有效地收集、整理和清洗来自不同渠…...

怎么在Github上readme文件里面怎么插入图片?

环境&#xff1a; Github 问题描述&#xff1a; 怎么在Github上readme文件里面怎么插入图片&#xff1f; https://github.com/latiaoge/AI-Sphere-Butler/tree/master 解决方案&#xff1a; 1.相对路径引用 上传图片到仓库 将图片文件&#xff08;如 .png/.jpg&#xff…...

【NLP 31、预训练模型的发展过程】

人的行为&#xff0c;究竟是人所带来的思维方式不同还是与机器一样&#xff0c;刻在脑海里的公式呢&#xff1f; 只是因为不同的人公式不同&#xff0c;所以人的行为才不同&#xff0c;可这又真的是人引以为傲的意识吗&#xff1f; 人脑只是相当于一个大型、驳杂的处理器&#…...

【计算机网络】传输层TCP协议

传输层 - layer4 - TCP协议 传输层&#xff1a;位于ISO模型的第四层 ——>L4 tcp协议意为传输控制协议&#xff08;Transmission Control Protocol&#xff09; 提供端到端的连接 端口号范围&#xff1a;0-65535 &#xff08;2^16次方&#xff09; 一个应用程序(服务)会占用…...

vscode settings(二):文件资源管理器编辑功能主题快捷键

参考资料 Visual Studio Code权威指南 by 韩骏 一. 文件资源管理器 1.1 文件资源管理器隐藏文件夹 默认情况下&#xff0c;Visual Studio Code会在文件资源管理器中隐藏一些文件夹&#xff08;如.git文件夹&#xff09;​。可以通过files.exclude来配置要被隐藏的文件和文件…...

halcon机器视觉深度学习对象检测,物体检测

目录 效果图操作步骤软件版本halcon参考代码本地函数 get_distinct_colors()本地函数 make_neighboring_colors_distinguishable() 效果图 操作步骤 首先要在Deep Learning Tool工具里面把图片打上标注文本&#xff0c; 然后训练模型&#xff0c;导出模型文件 这个是模型 mod…...

go 反射 interface{} 判断类型 获取值 设置值 指针才可以设置值

内容包括 1. 用interface{}接收值 2. 判断interface{}的类型 switch 3. 打印interface{}的类型 4. 通过字符串对结构体&#xff0c;interface{}等进行设置值、获取值处理 示例代码 package mainimport ("fmt""log""reflect" )type Student…...

单臂路由

单臂路由&#xff08;Router on a Stick&#xff09;是一种网络配置方式&#xff0c;主要用于在单个物理接口上实现多个VLAN之间的路由。它通常用于交换机与路由器之间的连接&#xff0c;适用于VLAN间通信需求较小的情况。 工作原理 VLAN划分&#xff1a;交换机上配置多个VLAN…...

SpringBoot【实用篇】- 测试

文章目录 目标&#xff1a; 1.加载测试专用属性3.Web环境模拟测试2.加载测试专用配置4.数据层测试回滚5.测试用例数据设定 目标&#xff1a; 加载测试专用属性加载测试专用配置Web环境模拟测试数据层测试回滚测试用例数据设定 1.加载测试专用属性 我们在前面讲配置高级的…...

NutUI内网离线部署

文章目录 官网拉取源代码到本地仓库修改源代码打包构建nginx反向代理部署访问内网离线地址 在网上找了一圈没有写NutUI内网离线部署的文档&#xff0c;花了1天时间研究下&#xff0c;终于解决了。 对于有在内网离线使用的小伙伴就可以参考使用了 如果还是不会联系UP主:QQ:10927…...

【深度学习】Adam和AdamW优化器有什么区别,以及为什么Adam会被自适应学习率影响

Adam 和 AdamW 的主要区别在于 权重衰减&#xff08;Weight Decay&#xff09; 的实现方式&#xff0c;具体如下&#xff1a; 1. 权重衰减&#xff08;Weight Decay&#xff09;处理方式 Adam&#xff1a;采用 L2 正则化&#xff0c;通过在梯度更新时手动添加 weight_decay 项…...

Pytorch的F.cross_entropy交叉熵函数

参考笔记&#xff1a;pytorch的F.cross_entropy交叉熵函数和标签平滑函数_怎么给crossentropyloss添加标签平滑-CSDN博客 先来讲下基本的交叉熵cross_entropy&#xff0c;官网如下&#xff1a;torch.nn.functional.cross_entropy — PyTorch 1.12 documentation torch.nn.fun…...

一文讲解Redis为什么读写性能高以及I/O复用相关知识点

Redis为什么读写性能高呢&#xff1f; Redis 的速度⾮常快&#xff0c;单机的 Redis 就可以⽀撑每秒十几万的并发&#xff0c;性能是 MySQL 的⼏⼗倍。原因主要有⼏点&#xff1a; ①、基于内存的数据存储&#xff0c;Redis 将数据存储在内存当中&#xff0c;使得数据的读写操…...

[特殊字符] Elasticsearch 双剑合璧:HTTP API 与 Java API 实战整合指南

&#x1f680; Elasticsearch 双剑合璧&#xff1a;HTTP API 与 Java API 实战整合指南 一、HTTP API 定义与用途 Elasticsearch 的 HTTP API 是基于 RESTful 接口设计的核心交互方式&#xff0c;支持通过 URL 和 JSON 数据直接操作索引、文档、集群等资源。适用于快速调试、…...

某手sig3-ios算法 Chomper黑盒调用

Chomper-iOS界的Unidbg 最近在学习中发现一个Chomper框架&#xff0c;Chomper 是一个模拟执行iOS可执行文件的框架&#xff0c;类似于安卓端大名鼎鼎的Unidbg。 这篇文章使用Chomper模拟执行某手的sig3算法&#xff0c;初步熟悉该框架。这里只熟悉模拟执行步骤以及一些常见的…...

蓝桥杯之阶段考核

&#x1f4d6; Day 7&#xff1a;阶段考核 - 蓝桥杯官方模拟赛&#xff08;限时 4 小时&#xff09; &#x1f4d6; 一、如何高效完成模拟赛&#xff1f; 模拟赛是一种接近真实竞赛的训练方式。要高效完成模拟赛&#xff0c;需要掌握以下策略&#xff1a; 1. 赛前准备 ✅ 环…...

DeepSeek掘金——VSCode 接入DeepSeek V3大模型,附使用说明

VSCode 接入DeepSeek V3大模型,附使用说明 由于近期 DeepSeek 使用人数激增,服务器压力较大,官网已 暂停充值入口 ,且接口响应也开始不稳定,建议使用第三方部署的 DeepSeek,如 硅基流动 或者使用其他模型/插件,如 豆包免费AI插件 MarsCode、阿里免费AI插件 TONGYI Lin…...

华为昇腾服务器(固件版本查询、驱动版本查询、CANN版本查询)

文章目录 1. **查看固件和驱动版本**2. **查看CANN版本**3. **其他辅助方法**注意事项 在华为昇腾服务器上查看固件、驱动和CANN版本的常用方法如下&#xff1a; 1. 查看固件和驱动版本 通过命令行工具 npu-smi 执行以下命令查看当前设备的固件&#xff08;Firmware&#xff0…...

红帽7基于kickstart搭建PXE环境

Kickstart 文件是一种配置文件&#xff0c;用于定义 Linux 系统安装过程中的各种参数&#xff0c;如分区、网络配置、软件包选择等。system-config-kickstart 提供了一个图形界面&#xff0c;方便用户快速生成这些配置文件。 用户可以通过图形界面进行系统安装的详细配置&…...

【Python爬虫(58)】从0到1:Scrapy实战爬取大型新闻网站

【Python爬虫】专栏简介&#xff1a;本专栏是 Python 爬虫领域的集大成之作&#xff0c;共 100 章节。从 Python 基础语法、爬虫入门知识讲起&#xff0c;深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑&#xff0c;覆盖网页、图片、音频等各类数据爬取&#xff…...