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

STRUCTBERT:将语言结构融入预训练以提升深度语言理解

【摘要】最近,预训练语言模型BERT(及其经过稳健优化的版本RoBERTa)在自然语言理解(NLU)领域引起了广泛关注,并在情感分类、自然语言推理、语义文本相似度和问答等各种NLU任务中达到了最先进的准确率。受到Elman [8] 线性化探索工作的启发,我们在BERT的基础上提出了一种新模型StructBERT,通过在预训练过程中融入语言结构来提升表现。具体而言,我们为StructBERT设计了两个辅助任务,以充分利用单词和句子的顺序信息,从而在词级和句子级别上利用语言结构。这使得新模型能够适应下游任务所需的不同层次的语言理解能力。在引入结构化预训练后,StructBERT在多个下游任务上取得了出色的实验结果。例如,在GLUE基准测试中达到89.0的分数(超越所有已发布模型),在SQuAD v1.1问答任务中F1分数达到93.0,在SNLI数据集上的准确率达到91.7。

1,引言

预训练语言模型(LM)是许多自然语言理解(NLU)任务的关键组件,例如语义文本相似度 [4]、问答 [21] 和情感分类 [25]。为了获得可靠的语言表示,神经语言模型利用自监督学习来定义文本中单词序列的联合概率分布。与传统的基于单词的嵌入方法不同(即为每个标记分配一个全局表示),近年来的研究(如 Cove [16]、ELMo [18]、GPT [20] 和 BERT [6])通过在大规模文本语料库上训练语言模型,生成上下文化的单词向量。这些模型已被证明在许多下游NLU任务中具有良好的效果。

在上下文敏感的语言模型中,BERT(及其经过稳健优化的版本RoBERTa [15])席卷了NLP领域。BERT的设计旨在通过在所有层中同时考虑左右上下文来预训练双向表示,并仅通过上下文来预测被掩码的单词,以学习语言表示。然而,它并未充分利用潜在的语言结构。

根据 Elman [8] 的研究,循环神经网络(RNN)在处理简单句子时对单词顺序的规律性表现出敏感性。由于语言的流畅性取决于单词和句子的排序,因此在许多自然语言处理(NLP)任务(如机器翻译和自然语言理解 [9])中,找到一组单词和句子的最佳排列方式是一个关键问题。近年来,单词排序被视为基于语言模型(LM)的线性化任务,仅依赖语言模型进行处理 [24]。Schmaltz 的研究表明,即使没有显式的句法信息,带有长短时记忆(LSTM)单元的循环神经网络语言模型(RNN-LM)[17] 也能有效地完成单词排序任务。

在本文中,我们介绍了一种新的上下文表示方式——StructBERT,它通过提出两种新的线性化策略,将语言结构引入到BERT的预训练中。具体而言,除了现有的掩码策略外,StructBERT 还利用结构信息来扩展 BERT,包括词级顺序和句级顺序。我们在模型预训练过程中分别针对句内结构和句间结构引入了两个新的结构化目标。通过这种方式,语言学特征在预训练过程中得到了显式捕捉。通过结构化预训练,StructBERT 在上下文化表示中编码了单词之间以及句子之间的依赖关系,从而使模型具有更好的泛化能力和适应性。

  • 我们提出了一种新颖的结构化预训练方法,通过引入词级结构目标和句级结构目标扩展 BERT,在上下文化表示中利用语言结构。这使得 StructBERT 能够显式建模语言结构,并通过强制模型重建正确的单词和句子顺序来进行准确预测。

  • StructBERT 在各种自然语言理解(NLU)任务上显著超越了所有已发布的最新模型。该模型扩展了 BERT 的优势,并在语义文本相似度、情感分析、文本蕴含和问答等语言理解应用中提升了性能。

2,StructBERT 模型预训练

StructBERT 基于 BERT 架构,后者使用多层双向 Transformer 网络 [26]。给定一个单独的文本句子或一对文本句子,BERT 将它们打包成一个令牌序列,并为每个令牌学习一个上下文化的向量表示。每个输入令牌的表示是基于该词、位置以及它所属的文本片段。接下来,输入向量被送入一堆多层双向 Transformer 块,这些块使用自注意力机制,通过考虑整个输入序列来计算文本表示。

原始的 BERT 引入了两个无监督的预测任务来预训练模型:即掩码语言模型(Masked LM)任务和下一个句子预测任务。与原始 BERT 不同,我们的 StructBERT 通过在单词掩码后打乱一定数量的令牌并预测正确的顺序,增强了掩码语言模型任务的能力。此外,为了更好地理解句子之间的关系,StructBERT 随机交换句子顺序,并预测下一个句子和前一个句子,作为一种新的句子预测任务。通过这种方式,新的模型不仅显式地捕捉了每个句子中细粒度的词语结构,还以双向的方式正确地建模了句间结构。一旦通过这两个辅助任务预训练了 StructBERT 语言模型,我们就可以在任务特定数据上进行微调,以适应广泛的下游任务。

2.1,输入表示

每个输入 x 是一系列词元,可以是一个单独的句子,也可以是两个句子组成的对。输入表示遵循 BERT [6] 中使用的方式。对于每个输入词元 t_i,其向量表示 x_i 是通过将对应的词元嵌入、位置嵌入和段落嵌入相加来计算的。我们总是将一个特殊的分类嵌入([CLS])作为每个序列的第一个词元,并在每个段落的末尾添加一个特殊的序列结束标记([SEP])。文本通过 WordPiece [30] 被分词为子词单元,绝对位置嵌入是通过支持的最大序列长度(最多 512 个词元)进行学习的。此外,段落嵌入用于区分一对句子,就像 BERT 中一样。

2.2,Transformer Encoder

我们使用多层双向 Transformer 编码器 [26] 来对输入表示进行上下文信息编码。给定输入向量 X=\left \{ x_i \right \}_{i=1}^N,使用 L 层 Transformer 对输入进行编码,表示为:

H^l=Transformer_{l}(H^{l-1})

其中:l\in[1,L]H^0=XH^L=[h_1^L,...,h_N^L]。我们使用隐藏向量 h_i^L 作为输入词元 t_i的上下文化表示。

2.3,预训练目标

为了充分利用语言中丰富的句内和句间结构,我们在原始 BERT 的预训练目标基础上进行了两方面的扩展:

  • 词汇结构目标(主要用于单句任务)

  • 句子结构目标(主要用于句子对任务)

我们将这两个辅助目标与原始的掩码语言模型(LM)目标一起,在统一的模型中进行预训练,以利用语言的固有结构。

【词汇结构目标】尽管原始 BERT 在各种自然语言理解(NLU)任务中取得了成功,但它无法显式地建模自然语言中词语的顺序和高阶依赖关系。给定一组随机顺序的词汇,理想的语言模型应该能够通过重构这些词汇的正确顺序来恢复原句。为了在 StructBERT 中实现这一想法,我们在 BERT 的训练目标基础上增加了一个新的词汇结构目标,使模型具备了重构某些故意打乱顺序的词元正确顺序的能力。这个新的词汇目标与 BERT 的原始掩码语言模型(LM)目标一起联合训练。

上图展示了联合训练新的词汇目标和掩码 LM 目标的过程。在每个输入序列中,我们首先像 BERT [6] 中一样随机掩码 15% 的所有词元。由双向 Transformer 编码器计算的掩码词元对应的输出向量 h_i^L 被输入到 softmax 分类器中,以预测原始词元。

接下来,新的词汇目标开始发挥作用,考虑词语顺序。鉴于词元洗牌的随机性,词汇目标相当于最大化将每个洗牌词元放置到其正确位置的概率。更正式地,这个目标可以被表述为:

arg\, \underset{\theta}{max}\sum log\,P(pos_1=t_1,pos_2=t_2,...,pos_K=t_K[t_1,t_2,...,t_K,\theta])

其中,\theta 表示 StructBERT 的可训练参数集,K 表示每个打乱子序列的长度。从技术上讲,较大的 K 会迫使模型能够重建更长的序列,同时注入更多干扰的输入。相反,当 K 较小的时候,模型获得更多未受干扰的序列,但在恢复长序列方面的能力较差。我们决定使用三元组(即 K = 3)进行子序列打乱,以平衡语言重建能力和模型的鲁棒性。

具体来说,如上图所示,我们随机选择一定比例的三元组来自未屏蔽的标记,并在每个三元组内打乱三个词(例如图中的 t2、t3 和 t4)。通过双向 Transformer 编码器计算的打乱标记的输出向量,然后输入到一个 softmax 分类器中,以预测原始标记。新的词目标与掩蔽语言模型(LM)目标一起在统一的预训练模型中共同学习,并赋予相等的权重。

【句子结构目标】原始 BERT 模型认为下一个句子预测任务比较简单(BERT 在此任务中的预测准确率可以轻松达到 97%-98% [6])。因此,我们通过预测下一个句子和上一个句子,扩展了句子预测任务,以使预训练语言模型以双向的方式意识到句子的顺序。如上图所示,给定一对句子(S1,S2)作为输入,我们预测 S2 是紧随 S1 之后的下一个句子,还是在 S1 之前的上一个句子,或者是来自不同文档的随机句子。具体来说,对于句子 S1,1/3 的时间我们选择紧随 S1 之后的文本片段作为第二个句子 S2,1/3 的时间选择 S1 之前的上一个句子,1/3 的时间则随机从其他文档中抽取一个句子作为 S2。这两个句子被连接在一起,形成一个输入序列,并在中间使用分隔符标记 [SEP],如同 BERT 中的做法。我们通过取对应于第一个标记 [CLS] 的隐藏状态来汇聚模型输出,并将 [CLS] 的编码向量输入到一个 softmax 分类器中进行三类预测。

2.4,预训练设置

训练目标函数是词汇结构目标和句子结构目标的线性组合。对于掩蔽语言模型(Masked LM)目标,我们采用了与BERT [6] 相同的掩蔽率和设置,选择5%的三元组进行随机打乱。我们使用了来自英文维基百科(2,500M词)和BookCorpus [35] 的文档作为预训练数据,遵循了[6]中的预处理和WordPiece分词方法。输入序列的最大长度设置为512。

我们使用Adam优化器,学习率设置为1e-4,β1 = 0.9,β2 = 0.999,L2权重衰减为0.01,前10%总步骤进行了学习率预热,学习率采用线性衰减。每层设置了0.1的dropout概率。激活函数使用了gelu [10],与GPT [20]相同。

我们将Transformer块的层数记为L,隐藏向量的大小记为H,自注意力头数记为A。按照BERT的做法,我们主要报告两种模型规模的实验结果:

  • StructBERTBase:L = 12,H = 768,A = 12,参数数量 = 1.1亿

  • StructBERTLarge:L = 24,H = 1024,A = 16,参数数量 = 3.4亿

StructBERT的预训练是在一个由64个Tesla V100 GPU卡组成的分布式计算集群上进行的。对于StructBERTBase,我们进行了40轮预训练,耗时大约38小时;而StructBERTLarge的训练大约花费了7天完成。

3,结论

在本文中,我们提出了一种新颖的结构化预训练方法,将词汇结构和句子结构纳入BERT的预训练中。我们引入了词汇结构目标和句子结构目标,作为两种新的预训练任务,用于在不同粒度上深度理解自然语言。实验结果表明,新的StructBERT模型在多种下游任务中取得了新的最先进的结果,包括流行的GLUE基准、SNLI语料库和SQuAD v1.1问答任务。

相关文章:

STRUCTBERT:将语言结构融入预训练以提升深度语言理解

【摘要】最近,预训练语言模型BERT(及其经过稳健优化的版本RoBERTa)在自然语言理解(NLU)领域引起了广泛关注,并在情感分类、自然语言推理、语义文本相似度和问答等各种NLU任务中达到了最先进的准确率。受到E…...

MCP协议的Streamable HTTP:革新数据传输的未来

引言 在数字化时代,数据传输的效率和稳定性是推动技术进步的关键。MCP(Model Context Protocol)作为AI生态系统中的重要一环,通过引入Streamable HTTP传输机制,为数据交互带来了革命性的变化。本文将深入解读MCP协议的…...

基于 RK3588 的 YOLO 多线程推理多级硬件加速引擎框架设计(代码框架和实现细节)

一、前言 接续上一篇文章,这个部分主要分析代码框架的实现细节和设计理念。 基于RK3588的YOLO多线程推理多级硬件加速引擎框架设计(项目总览和加速效果)-CSDN博客https://blog.csdn.net/plmm__/article/details/146542002?spm1001.2014.300…...

stm32 can 遥控帧的问题

STM32单片机使用CAN协议进行通信 引用这个博客的一段话 CAN的遥控帧(Remote Frame)的主要作用是请求其他节点发送具 有特定ID的数据帧。具体来说,当一个节点需要从另一个节点获取数 据时,它可以发送一个遥控帧,而不是…...

机器人基础知识-1

1.六轴机器人中的六轴是什么? 第一轴(J1):底座旋转 控制机器人整体绕垂直轴旋转(左右摆动),决定工作范围的水平方向。 第二轴(J2):下臂前后摆动 驱动机器人的…...

JAVA- 锁机制介绍 进程锁

进程锁 基于文件的锁基于Socket的锁数据库锁分布式锁基于Redis的分布式锁基于ZooKeeper的分布式锁 实际工作中都是集群部署,通过负载均衡多台服务器工作,所以存在多个进程并发执行情况,而在每台服务器中又存在多个线程并发的情况,…...

如何在WordPress中强制用户使用强密码?

在如今网络安全备受关注的环境下,弱密码问题不容忽视。很多用户习惯在多个网站使用相同且简单的密码,这样一来,若不强制他们在 WordPress 网站上使用强密码,网站的安全性就会受到威胁。尤其对于在线商店、会员网站、多作者博客等站…...

鸿蒙NEXT开发Base64工具类(ArkTs)

import util from ohos.util;/*** Base64 工具类* author: 鸿蒙布道师* since: 2025/03/31*/ export class Base64Util {/*** 创建 Base64Helper 实例* returns Base64Helper 实例*/private static createBase64Helper(): util.Base64Helper {return new util.Base64Helper();}…...

基于HUTOOL实现RSA工具类

一、前言:用 Hutool 简化 RSA 加密开发,提升代码安全与效率 在当今数据安全至关重要的时代,RSA 非对称加密作为保护敏感信息的核心技术,广泛应用于通信加密、数字签名、密钥交换等场景。然而,手动实现 RSA 算法涉及复…...

flink 分组窗口聚合 与 窗口表值函数聚合 的区别

警告:分组窗口聚合已经过时。推荐使用更加强大和有效的窗口表值函数聚合。 参考官方文档 在 Apache Flink 中,分组窗口聚合(Group Window Aggregation) 和 窗口表值函数聚合(Windowing TVF Aggregation)…...

prompt_status:5: command not found: wc解决办法

问题出现背景 想配置uniapp的命令行,在.zprofile配置路径的时候PATH 前面少打了一个$,执行了 source,导致各种命令都失效。 解决办法 用fider 打开用户文件夹,Command Shift .显示隐藏文件,用文本编辑器修改一下&…...

《STL 六大组件之容器篇:简单了解 list》

目录 一、list 简介二、list 的常用接口1. 构造函数(constructor )2. 迭代器(iterator)3. 容量、修改和访问(capacity 、modify and access) 一、list 简介 简单来说,list 就是数据结构初阶中学…...

向量数据库学习笔记(2) —— pgvector 用法 与 最佳实践

关于向量的基础概念,可以参考:向量数据库学习笔记(1) —— 基础概念-CSDN博客 一、 pgvector简介 pgvector 是一款开源的、基于pg的、向量相似性搜索 插件,将您的向量数据与其他数据统一存储在pg中。支持功能包括&…...

TCP的连接建立

面向连接 定义:在发送数据之前,需要建立一条点到点的连接 (参数协商的过程。因为tcp要保证可靠,所以tcp通信是发生在双方之间、两端之间的,两端在正式发送数据之前需要约定一些初始参数,这个过程就是面向连…...

如何让AI帮你做用户运营:用户消费偏好分层和洞察

随着deepseek的爆火,我一直在想能不能用AI来帮我做用户运营,目前deepseek只能提供框架层面的运营建议,还无法实现将订单数据给到它,能够自动化分析并将用户分层,并给出可视化的运营洞察报表。但是,我要告诉…...

二分答案-P8647 [蓝桥杯 2017 省 AB] 分巧克力

题解:P8647 [蓝桥杯 2017 省 AB] 分巧克力 题目传送门 题目链接 一、题目描述 小明有N块不同尺寸的巧克力,需要切出K块相同大小的正方形巧克力分给小朋友们。要求找到能满足条件的最大的正方形边长。 二、题目分析 我们需要从N块巧克力中切出K个相…...

搜广推校招面经六十一

美团推荐算法 一、ANN算法了解么?说几种你了解的ANN算法 ANN 近似最近邻搜索(Approximate Nearest Neighbor Search)算法 1.1. KD-Tree(K-Dimensional Tree,K 维树) 类型: 空间划分数据结构适用场景: 低…...

某地老旧房屋自动化监测项目

1. 项目简介 自从上个世纪90年代以来,我国经济发展迅猛,在此期间大量建筑平地而起,并且多为砖混结构的住房,使用寿命通常约为30-50年,钢筋混凝土结构,钢结构等高层建筑,这些建筑在一般情况下的…...

【第一节】Python爬虫基础-HTTP基本原理

目录 前言 一、URI和URL是什么 二、什么是超文本 三、HTTP和HTTPS的区别 四、HTTP请求过程 五、请求 六、响应 前言 在着手开发爬虫程序之前,我们需要先掌握一些基础概念。本节将详细讲解HTTP的基本工作原理,重点分析从浏览器输入网址到获取网页内…...

docker打包使用有头模式playwright

1.打包镜像 创建Dockerfile文件如下 # playywright 官方镜像 FROM mcr.microsoft.com/playwright:v1.37.0-jammy# 设置非交互式环境变量和时区 ENV DEBIAN_FRONTENDnoninteractive ENV TZEtc/UTC# 安装 Python 3.9 和 pip(修复时区阻塞问题) RUN apt-g…...

VuePress 和 Docusaurus的对比

VuePress 和 Docusaurus 是两个流行的现代静态网站生成器 vuepress:首页 | VuePress Docusaurus:Docusaurus 博客 | Docusaurus中文文档 | Docusaurus中文网 一、技术栈和设计理念 VuePress 技术栈:基于Vue.js,专为技术文档设计&#xff0c…...

JAVA数据库增删改查

格式 Main.java(测试类) package com.example;import com.example.dao.UserDao; import com.example.model.User;public class Main {public static void main(String[] args) {UserDao userDao new UserDao();// 测试添加用户System.out.println(" 添加用户 ");Us…...

MSTP多域生成树

协议信息 MSTP 兼容 STP 和 RSTP,既可以快速收敛,又提供了数据转发的多个冗余路径,在数据转发过程中实现 VLAN 数据的负载均衡。 MSTP 可以将一个或多个 VLAN 映射到一个 Instance(实例)(一个或多个 VLAN…...

HashMap 在 JDK 1.7 和 JDK 1.8 有什么区别

HashMap 在 JDK 1.7 和 JDK 1.8 中的实现存在显著差异,主要体现在以下几个方面: 1. 数据结构的变化 • JDK 1.7:HashMap 的底层数据结构是数组 单向链表。当哈希冲突发生时,新的元素会插入到链表的头部(头插法&#…...

Mysql忽略大小写

🚀欢迎来到我的【Mysql】专栏🚀 🙋我是小蜗,一名在职牛马。🐒我的博客主页​​​​​​ ➡️ ➡️ 小蜗向前冲的主页🙏🙏欢迎大家的关注,你们的关注是我创作的最大动力🙏🙏在 MySQL 中取消大小写区分主要涉及以下两个层面的配置,具体操作如下: 一、表名大…...

基于TradingView和CTPBee的自动化期货交易系统实现

引言 在量化交易领域,TradingView因其强大的技术分析工具和丰富的指标库而广受欢迎,但是其不支持国内期货自动化交易,CTPBee则是一个优秀的国产Python期货交易接口。本文将介绍如何将两者结合,实现一个完整的自动化交易系统。 本…...

昇腾CANN算子共建仓CANN-Ops正式上线Gitee,首批算子已合入

在人工智能技术呈指数级发展的今天,AI创新已走向更底层的算法创新,以DeepSeek为例,通过MoE模型架构和底层算法创新,不仅获取极佳的模型性能,又更大程度释放硬件性能,降低硬件使用成本。 算子,作…...

基于PyQt5的自动化任务管理软件:高效、智能的任务调度与执行管理

基于PyQt5的自动化任务管理软件:高效、智能的任务调度与执行管理 相关资源文件已经打包成EXE文件,可双击直接运行程序,且文章末尾已附上相关源码,以供大家学习交流,博主主页还有更多Python相关程序案例,秉着…...

Pycharm(八):字符串切片

一、字符串分片介绍 对操作的对象截取其中一部分的操作,比如想要获取字符串“888666qq.com前面的qq号的时候就可以用切片。 字符串、列表、元组都支持切片操作。 语法:字符串变量名 [起始:结束:步长] 口诀:切片其实很简单,只顾头来…...

C++编程学习笔记:函数相关特性、引用与编译流程

目录 一、函数的缺省参数 (一)全缺省参数 (二)半缺省参数 二、函数重载 (一)参数类型不同 (二)参数个数不同 (三)参数类型顺序不同 三、引用相关问题…...

Nginx 配置 HTTPS 与 WSS 完整指南

Nginx 配置 HTTPS 与 WSS 完整指南 本教程将手把手教你如何为网站配置 HTTPS 加密访问,并通过反向代理实现安全的 WebSocket(WSS)通信。以 https://www.zhegepai.cn 域名为例,完整流程约需 30 分钟完成。 一、前置准备 1.1 域名…...

链表基本操作

文章目录 1、单链表1.1 链表的创建1.2 链表的遍历1.3 链表的删除1.4 链表的插入1.5 链表和数组 2、双向链表2.1 双链表的创建2.2 双链表的删除2.3 双链表的插入2.4 双向循环链表2.5 双链表优缺点 1、单链表 链表是一种物理存储单元上非连续、非顺序的存储结构,插入…...

【huggingface 数据下载】ssh / https 不同的下载流程,hf 镜像下载注意事项

ssh 下载流程 在 linux 服务器上生成 ssh key将 pub key 放入 huggingface 的 setting 中通过 git lfs install 然后 git clone githf.co … 来下载数据 遇到的问题 一直卡在 Updating files 后 卡住的可能原因: 系统当前限制了允许监视的最大文件数&#xff1…...

简单版CentOS7配置haproxy

一、实验步骤 1、自行下载pes的tar包 然后解压到家目录下 tar -xzvf pes.tar.gz 2、创建一个目录 mkdir docker-compose-pes-lb2 3、在这个目录下写两个文件docker-compose.yml和haproxy.cfg docker-compose.yml version: 3 services: db: image: mysql:5.7.44 container…...

leetcode146.LRU缓存

思路源自 【面试高频】146. LRU 缓存 采用哈希表双向链表 put一个键值对时,采用头插法将缓存块置于等级较高的位置,如果put数量超出限制,那么就将尾部的缓存块删除,以此达到置换的一个效果 get一个键值对也是同样的思路&#xf…...

SpringIoC和DI

文章目录 OCP开闭原则DIP(依赖倒置原则)IOC(控制反转)依赖注入DI基于XML配置Beanset注入构造注入 使用注解存储beanController方法注解Bean扫描路径依赖注入三种注入方式优缺点分析 引入 当我们写了一个程序,遵循SpringMVC三层架构,表现层调用业务逻辑层…...

vue 路由

目录 一、路由的使用 二、声明式导航 2.1 声明式导航 2.2 声明式导航路由传参 2.2.1.字符串写法 2.2.2.对象写法 2.2.3 query 传参和 param 传参总结 2.3 命名路由 2.4 可选操作符 2.5 props 参数 三、编程式导航 3.1 replace 和 push 跳转…...

JAVA常见的 JVM 参数及其典型默认值

在 Java 线上应用中,JVM 参数的默认值取决于具体的 JVM 实现(如 Oracle JDK、OpenJDK、Zulu 等)、版本(如 Java 8、11、17 等)以及运行环境(物理机、容器等)。以下是常见的 JVM 参数及其典型默认…...

文件压缩与解压(zip4j)

maven依赖 <dependency><groupId>net.lingala.zip4j</groupId><artifactId>zip4j</artifactId><version>2.11.5</version></dependency>示例 //参数配置ZipParameters parameters new ZipParameters();parameters.setCompres…...

【操作系统】查内存泄漏方法

【操作系统】查内存泄漏方法 1. 通用检测方法1.1 代码审查1.2 运行时监测 2.Linux平台检测工具2.1 Valgrind工具套件2.2 AddressSanitizer (ASan)2.3 mtrace 3.Windows平台检测工具3.1 Visual Studio诊断工具3.2 CRT调试堆 4.嵌入式系统检测方法4.1 RT-Thread内存检测4.2 自定义…...

oracle常用sql

获取主键 1. 查询主键的两种常用方法 Oracle 的主键信息存储在以下两个视图中&#xff1a; USER_CONSTRAINTS&#xff1a;存储当前用户下所有表的约束信息&#xff08;如主键、外键等&#xff09;。 USER_CONS_COLUMNS&#xff1a;存储约束对应的列信息。 方法 1&#xff…...

【第十三届“泰迪杯”数据挖掘挑战赛】【2025泰迪杯】【思路篇】A题解题全流程(持续更新)

【第十三届“泰迪杯”数据挖掘挑战赛】【2025泰迪杯】A题解题全流程-思路&#xff08;持续更新&#xff09; 写在前面&#xff1a; 1、A题、C题将会持续更新&#xff0c;陆续更新发布文章 2、赛题交流咨询Q群&#xff1a;1037590285 3、全家桶依旧包含&#xff1a; 代码、…...

Qt 信号量使用方法

Qt 信号量使用方法 QSemaphore 类 常用函数介绍 函数名称函数功能QSemaphore()构造并初始化对象acquire()尝试获取n个资源&#xff0c;如果没有那么多资源&#xff0c;线程将阻塞直到有n个资源可用available()返回当前信号量可用的资源个数&#xff0c;这个数永远不可能为负…...

C++进阶——封装哈希表实现unordered_map/set

与红黑树封装map/set基本相似&#xff0c;只是unordered_map/set是单向迭代器&#xff0c;模板多传一个HashFunc。 目录 1、源码及框架分析 2、模拟实现unordered_map/set 2.1 复用的哈希表框架及Insert 2.2 iterator的实现 2.2.1 iteartor的核心源码 2.2.2 iterator的实…...

AI Agent 实战:搭建个人在线旅游助手

AI Agent 实战&#xff1a;搭建个人在线旅游助手 本次实验中&#xff0c;我们将继续探索 Agent 的提示词&#xff0c;学习更加规范的提示词撰写方法。 本实验中你将掌握的知识点 使用 Dify 构建 Agent 的方法结构化的提示词撰写技巧变量的使用方法 1. 准备 在新建 Agent 之…...

CSS中的overflow属性

在 CSS 中&#xff0c;overflow 属性用于控制当一个元素的内容溢出其指定的区域时&#xff0c;应该如何处理溢出的部分。通常用于盒模型&#xff08;如 div&#xff09;中&#xff0c;指定内容超出容器时的显示方式。 overflow 属性的常用值&#xff1a; 1. visible&#xff08…...

【Unity】处理文字显示不全的问题

1.选中字体文件&#xff0c;检查 MultiAtlasTeextures 是否勾选&#xff0c;未勾选的话&#xff0c;先勾选保存后查看是否显示正常 2.勾选后未正常显示&#xff0c;则在搜索框中输入未显示的文本&#xff0c;确认字体图集是否包含该文本&#xff0c;然后点击Update Atlas Textu…...

蓝桥备赛指南(11):递归简介

递归的介绍 概念&#xff1a;递归是指函数直接或间接调用自身的过程。 解释递归的两个关键要素&#xff1a; 基本情况&#xff08;递归终止条件&#xff09;&#xff1a;递归函数中的一个条件&#xff0c;当满足该条件时&#xff0c;递归终止&#xff0c;避免无限递归。可以…...

Python 图片水印处理工具

自定义水印文本自定义水印位置支持图片裁剪支持各种图片格式 from PIL import Image, ImageDraw, ImageFont import osclass ImageWatermarker:def __init__(self, font_pathNone, font_size40):"""初始化水印处理器font_path: 字体文件路径&#xff0c;默认使…...

从零开始:如何打造一套完整的UI设计系统?

1. 建立色彩系统 色彩系统是设计系统的基础之一&#xff0c;它不仅影响界面的整体美感&#xff0c;还对用户体验有着深远的影响。首先&#xff0c;设计师需要定义主色调、辅助色和强调色&#xff0c;并确保这些颜色在不同场景下的应用保持一致。使用工具如Adobe Color或Coolor…...