【极速前进】20240706-24240714:用于Agent的树搜、理解LLM的语种困惑、事实知识抽取微调、Quiet-STaR

news2024/10/1 12:10:26

相关博客
【极速前进】20240706-24240714:用于Agent的树搜、理解LLM的语种困惑、事实知识抽取微调、Quiet-STaR
【极速前进】20240615-20240623:Zipper融合模态、VideoLLM视频理解、WebAgent可以自我改善、Nemotron-4、AnyGPT统一模态
【极速前进】20240608-20240610:评估模型Prometheus 2、CoPE、DITTO:使用示例反馈对齐LLM、CoA:利用多Agent解决长文本、Qwen2在线合并优化器
【极速前进】20240524-20240526:Meta多模态模型Chameleon、参数高效微调MoRA、跨层注意力降低KV Cache、Octopus v4、SimPO
【极速前进】20240423-20240428:Phi-3、fDPO、TextSquare多模态合成数据、遵循准则而不是偏好标签、混合LoRA专家
【极速前进】20240422:预训练RHO-1、合成数据CodecLM、网页到HTML数据集、MLLM消融实验MM1、Branch-Train-Mix
【极速前进】20240415-20240421:TR-DPO、压缩与智能的线性关系、模拟伪代码改善算术能力、Many-shot、合成数据综述

一、用于LM Agent的树搜

论文名称:Tree Search for Language Model Agents

论文地址:https://arxiv.org/pdf/2407.01476

1. 简介

​ 基于LLM的Agent已经展现出了执行决策任务的能力,但是LM主要是针对自然语言理解和生成进行优化的。在基于多步推理、计划和理解环境反馈来求解现实计算机任务对于LM来说很难。本文为LM agent提出了一种推理时搜索算法,用于在web环境中执行探索和多步计划。

2. 方法

​ 成功求解web环境中的一个任务,可以被解释为给定正向奖励 R ( s ∗ ) = 1 R(s_*)=1 R(s)=1时达到某个目标状态 s ∗ s_* s。agent起始于状态 s 0 s_0 s0。给定自然语言指令 I I I,agent的目标是通过执行一组动作 ( a 0 , … , a t ) ∈ A (a_0,\dots,a_t)\in\mathcal{A} (a0,,at)A来达到目标状态。每个动作会产生一个新状态 s t + 1 ∈ S s_{t+1}\in\mathcal{S} st+1S和观察 o t + 1 ∈ Ω o_{t+1}\in\Omega ot+1Ω。状态的转移 s t → s t + 1 s_t\rightarrow s_{t+1} stst+1是由转移函数 T : S × A → S T:\mathcal{S}\times\mathcal{A}\rightarrow\mathcal{S} T:S×AS决定的。

​ 大多数方法将其看作是一个部分可观察Markov决策过程,仅基于当前观测 o t o_t ot来预测下一个动作 a t a_t at。这有一个显著的限制:agent的错误会随着步骤累加,若在某个t时刻采取了错误的动作,这将导致未来的不良状态且难以纠正。

2.1 Agent Backbone

​ 大多数SOTA web agent都是建立在LLM上的。一个预训练语言模型或者多模态模型 f ϕ f_{\phi} fϕ被要求基于当前的webpage观测 o t o_t ot来预测下一个要执行的动作 a t a_t at。通常会利用一些prompting技术,例如ReAct、RCI或者CoT等来改善agent的效果。

2.2 Value Function

​ 本文基于价值函数 f v f_v fv实现了best-first搜索启发算法,该价值函数用于估计当前状态 s t s_t st的期望奖励 E [ R ( s t ) ] \mathbb{E}[R(s_t)] E[R(st)],而真实的目标状态将提供值为1的完美奖励。由于模拟器的状态 s t s_t st并不能总是被agent访问,价值函数使用当前和先前的观测以及自然语言任务指令 I I I来计算价值 v t v_t vt
v t = f v ( I , { o 1 , … , o t } ) ∈ [ 0 , 1 ] v_t=f_v(I,\{o_1,\dots,o_t\})\in[0,1] \\ vt=fv(I,{o1,,ot})[0,1]
在本文的实验中,价值函数(value function)是通过提示一个多模态语言模型来实现的。

2.3 搜索算法

​ 本文提出的算法是受A*搜索启发的best-first搜索算法。使用语言模型agent来提出搜索树的候选分支。该搜索具有超参数深度 d d d、分支因子 b b b和搜索预算 c c c,这些决定了搜索树的最大尺寸和终止阈值 θ \theta θ

​ 在执行轨迹的时刻 t t t,agent先前已经执行了一系列动作达到了状态 s t s_t st。从 s t s_t st开始搜索算法,初始化一个最大优先级队列 F ← { } \mathcal{F}\leftarrow\{\} F{},该队列包含了计算进行评估的状态集合。目前找到的最优状态为 s ^ t ← s t \hat{s}_t\leftarrow s_t s^tst,最优序列分数为 v ^ t ← 0 \hat{v}_t\leftarrow 0 v^t0,搜索计数器为 s ← 0 s\leftarrow 0 s0

​ 在每次搜索过程中,从 F \mathcal{F} F中抽取下一项 s p ← pop ( F ) s_p\leftarrow\text{pop}(\mathcal{F}) sppop(F)。然后使用价值函数来计算状态 s p s_p sp的分数:
v p = f v ( I , { o 1 , … , o p } ) v_p=f_v(I,\{o_1,\dots,o_p\}) \\ vp=fv(I,{o1,,op})
然后,增强搜索计数器 s s s,若 v p v_p vp比当前的最优分数 v ^ t \hat{v}_t v^t更高,则更新分数和最优状态:
s ← s + 1 s ^ t ← { s p if  v p > v ^ t s ^ t otherwise v ^ t ← max ⁡ ( v ^ t , v p ) \begin{align} s&\leftarrow s+1 \\ \hat{s}_t&\leftarrow \begin{cases} s_p&\text{if }v_p>\hat{v}_t \\ \hat{s}_t&\text{otherwise} \\ \end{cases} \\ \hat{v}_t&\leftarrow\max(\hat{v}_t,v_p) \end{align} \\ ss^tv^ts+1{sps^tif vp>v^totherwisemax(v^t,vp)
v p ≥ θ v_p\geq\theta vpθ或者 s ≥ c s\geq c sc(超出搜索预算),将会终止搜索并转移到目前为止最优状态 s ^ t \hat{s}_t s^t

​ 若当前分支没有超过最大深度 ( 即 ∣ ( s 0 , … , s p ) ∣ < d ) (即|(s_0,\dots,s_p)|<d) ((s0,,sp)<d),那么会从语言模型agent f ϕ f_\phi fϕ中获取 b b b个候选动作 { a p 1 , … , a p b } \{a_p^1,\dots,a_p^b\} {ap1,,apb}作为分支的下一步动作。对于每个 i i i,执行动作 a p i a_p^i api并添加结果状态 s p i s_p^i spi至优先队列中:
F ← F ∪ ( v p , s p i ) for  i = 1 , … , b \mathcal{F}\leftarrow\mathcal{F}\cup(v_p,s_p^i)\quad\text{for }i=1,\dots,b \\ FF(vp,spi)for i=1,,b
这样就结束了搜索迭代。若两个终止条件都没有达到,回溯并重复这个过程。

二、理解和缓解LLM的语种困惑

论文名称:Understanding and Mitigating Language Confusion in LLMs

论文地址:https://arxiv.org/pdf/2406.20052

1. 简介

​ 本文研究LLM的局限性:它们无法始终如一地以用户期望的语言生成文本。创建了一个语言困惑基准(Language Confusion Benchmark, LCBl)来评估语言一致性,其覆盖了15种不同类型的语言。评估了一系列单语或者多语LLM,发现Llama Instruct和Mistral展现出高度的语言困惑,即使是最强的模型也无法始终以正确的语言进行应答。本文发现base模型和以英语为中心的指令模型更容易产生语言混乱,复杂的指令和高采样温度会加剧语言困惑。few-shot提示、多语言SFT和偏好微调能够部分缓解语言困惑。

2.Language Confusion Benchmark

2.1 生成设置

​ 在两种设置中衡量语言困惑:单语言生成和跨语言生成。单语言生成:使用语言 l l l进行查询并期望使用语言 l l l应答。跨语言生成:用户使用语言 l l l来提示模型并期望使用另一种语言 l ′ l' l来响应。

2.2 语言困惑度量

行级检测。将响应划分为行,并使用fastText来检测每行是否为用户期望的语言。

词级检测。没有现成的词级别语种检测工具,并且LLM的准确率不足以作为自动评估器。观测到单词级困惑主要是在英语中,因此选择启发式评估一个语种子集,包括Arabic(ar)、Hindi(hi)、Japanese(ja)、Korean(ko)、Russian(ru)和简体中文(zh)。

二值评估。计算二值度量来表明应答中是否包含实例:(a) 一行不正确的语言;(b) 非Latin语言中包含度量的英文单词或短语。

行级通过率(LRP):模型应答能够通过行级语言困惑检测的百分比。若一个应答的所有行都满足用户期望的语言则为正确。
LRP = ∣ R \ E L ∣ ∣ R ∣ \text{LRP}=\frac{|R\backslash E_L|}{|R|} \\ LRP=RR\EL
其中 R R R是所有应答的集合, E L E_L EL是包含行级错误的应答集合。

词级通过率(WPR):应答中所有单词都是用户期望语言的比例。
WPR = ∣ ( R \ E L ) \ E W ∣ ∣ R \ E L ∣ \text{WPR}=\frac{|(R\backslash E_L)\backslash E_W|}{|R\backslash E_L|} WPR=R\EL(R\EL)\EW
其中 R R R是所有应答集合, E L E_L EL是具有行级错误的应答集合, E W E_W EW是具有单词级错误的应答集合。

语言困惑通过率(LCPR):LPR和WPR的调和平均值
LCPR = 2 × LPR × WPR LPR+WPR \text{LCPR}=2\times\frac{\text{LPR}\times\text{WPR}}{\text{LPR+WPR}} \\ LCPR=2×LPR+WPRLPR×WPR

2.3 数据源

​ Aya、Dolly、Okapi、ShareGPT、Native prompts、Complex prompts。

3. 实验

单语生成。Command和GPT模型在LPR上表现很好,但是Llama和Mistral表现比较差。Mistral在一些欧洲语言上表现会好一些,但是Llama即使在德语这种高资源语言上表现也比较差。大多数模型的WPR在相同范围,Mixtral 8x7B则要差的多。GPT-4 Turbo在LCPR上最强,GPT-3.5 Turbo和Command R+位列第二。

跨语言生成。Command和OpenAI模型总体是最好的。Llama表现相当差,仅有30多分,因为其倾向于英语应答。

三、理解事实知识抽取的微调

论文名称:Understanding Finetuning for Factual Knowledge Extraction

论文地址:https://arxiv.org/pdf/2406.14785

1. 简介

​ 本文研究QA微调数据对下游事实性的影响。研究表明,即使在预训练时见过所有的事实,但是使用鲜为人知的事实进行微调要不熟悉事实微调的效果差的多。

2. Preliminaries

事实知识定义。将事实知识表示为从主实体 s s s和关系类型 r r r到答案 a a a的映射。表示这些映射为知识三元组 ( s , r , a ) (s,r,a) (s,r,a),其中 s ∈ S , r ∈ R , a ∈ A s\in\mathcal{S},r\in\mathcal{R},a\in\mathcal{A} sS,rR,aA,且 S , R , A \mathcal{S,R,A} S,R,A是所有实体、关系和答案的集合。单个三元组 ( s , r , a ) (s,r,a) (s,r,a)在自然语言中有多种表示。这里,建模自然语言为token序列的集合,token来自于集合 T \mathcal{T} T

知识格式化函数。知识可以有很多种文本表示。通过引入一个格式化函数 g : S × R × A → T k g:\mathcal{S}\times\mathcal{R}\times\mathcal{A}\rightarrow\mathcal{T}^k g:S×R×ATk来将三元组 ( s , r , a ) (s,r,a) (s,r,a)映射为token序列。

预训练和微调。给定一个知识三元组集合 D k = { ( s , r , a ) i = 1 N } D_k=\{(s,r,a)_{i=1}^N\} Dk={(s,r,a)i=1N}和一个预训练格式化函数,那么生成预训练语料 D p r e = { g p r e ( s , r , a ) ∣ ( s , r , a ) ∈ D k } D_{pre}=\{g_{pre}(s,r,a)|(s,r,a)\in D_k\} Dpre={gpre(s,r,a)(s,r,a)Dk}。对于一个下游格式化函数 g d o w n g_{down} gdown,生成下游数据集 D d o w n = { g d o w n ( s , r , a ) ∣ ( s , r , a ) ∈ D k } D_{down}=\{g_{down}(s,r,a)|(s,r,a)\in D_k\} Ddown={gdown(s,r,a)(s,r,a)Dk}。实践中,微调数据集相对于预训练来说是有限的,因此将 D d o w n D_{down} Ddown划分为 D f t D_{ft} Dft D e v a l D_{eval} Deval,其中 D f t D_{ft} Dft用于微调且 D e v a l D_{eval} Deval用于测试集。

​ 在QA的设置中, g p r e g_{pre} gpre以书籍或者文章的形式呈现知识,而 g d o w n g_{down} gdown以问答对的方式呈现知识。

3. 合成实验

3.1 合成设置

​ 对于三元组中每个subject、relation和answer都是单个token,并令 g p r e ( s , r , a ) = ( s , r , a ) g_{pre}(s,r,a)=(s,r,a) gpre(s,r,a)=(s,r,a)。为了能够模拟下游任务的变化,为每个relation类型引入QA-prompt token p r p_r pr。QA-prompt token在预训练中未见过,但是会在下游的格式化函数中使用: g d o w n ( s , r , a ) = ( s , p r , a ) g_{down}(s,r,a)=(s,p_r,a) gdown(s,r,a)=(s,pr,a)。因此,在微调时语言模型必须学会对于 ( s , r ) (s,r) (s,r)使用 ( s , p r ) (s,p_r) (s,pr)应答。token空间 T = S ∪ R ∪ A ∪ { p r ∣ r ∈ R } \mathcal{T}=\mathcal{S}\cup\mathcal{R}\cup\mathcal{A}\cup\{p_r|r\in\mathcal{R}\} T=SRA{prrR}

​ 在预训练过程中, ( s , r , a ) (s,r,a) (s,r,a)是从分布 s ∼ Zipf ( S ) , r ∼ Unif ( R ) s\sim\text{Zipf}(\mathcal{S}),r\sim\text{Unif}(\mathcal{R}) sZipf(S),rUnif(R)中独立同分布采样出来的。这个建模选择类似于预训练语料了,即包含流行的实体也包含未见的实体。在微调时,在 D f t D_{ft} Dft上执行标准的batch。假设呈现给模型的所有知识序列都与 D k D_k Dk中的ground truth ( s , r , a ) (s,r,a) (s,r,a)一致的。

​ 最终,所有下游微调和测试数据集 D f t D_{ft} Dft D e v a l D_{eval} Deval中的事实都在 D p r e D_{pre} Dpre中有呈现。

3.2 模拟观测

在这里插入图片描述

主要发现:微调事实流行度影响下游表现。上图2(a)绘制了在最流行(FT-Top)和最不流行(FT-Botton)实体上微调的准确率。我们发现微调数据的选择会显著影响下游QA的事实性。具体来说,在最流行事实上微调会为模型的事实性带来10%的改善。当在测试集中包含不太流行的事实时,这种差异会被放大。例如,当将测试集中最受欢迎的5%实体扩展至10%时,FT-Top和FT-Bottom的差异会翻倍。当逐步增加不流行实体比例,这种差异会持续存在。

预训练语料中长尾的影响。上图2(b)展示了 Zipf α \alpha α参数影响。直觉上,随着 α \alpha α增加,流行和不流行事实的差异会增大。另一方面,低 α \alpha α值会导致事实的更均匀分布。我们发现,增加 α \alpha α会加剧微调数据集的差异。这些发现表明微调数据集差异的影响与预训练中事实频率差异有关。

预训练步数的影响。先前,我们观察到预训练分布中的长尾性会控制微调数据集的敏感性。这个现象的一种解释是,低频率的事实可能并没有存储在模型中,但是我们观察到即使所有的事实都可以通过 ( s , r ) (s,r) (s,r)的形式抽取,但是高频和低频事实的差距仍然存在。这表明这种差异是由内部事实存储的差异造成的。在图2©中,通过绘制FT-Top和FT-Bottom之间的差距作为预训练步数的函数来研究这个问题。可以发现,更多的预训练步数会缩小差距,表明随着事实被看到足够的次数,事实存储的内部差异消失了。

3.3 事实显著性

​ 在模拟中的发现表明,一个模型是否"知道"一个特定的事实是一个持续的过程。这控制了下游任务中抽取事实的程度。此外,模型对事实的了解程度也觉得了微调的行为。将模型对事实的了解程度这种直观数量称为事实显著性

​ 本文的模拟结果表明,事实显著性和预训练语料中的事实频率有关。特别地,可以看到随着预训练分布变的更加长尾,显著性差于会被加剧。然而,我们也发现这些差异可以通过额外的预训练来缓解,这表明差异主要是由见过事实的次数驱动的。

四、Quiet-STaR:语言模型可以学会说话前思考

论文名称:Quiet-STaR: Language Models Can Teach Themselves to Think Before Speaking

论文地址:https://arxiv.org/pdf/2403.09629

1. 简介

​ 人在写作或者说话时,有时会暂停下来进行思考。先前的一些工作将推理作为回答问题或者完全特定任务的方法,但是推理通常隐含在文本中。例如,在数学证明的步骤中有很多没有明说的步骤;对话的背后同样有很多心理活动。在Self-Taught Reasoner中,用few-shot的方式令模型学会使用rationales进行推理。本文Quiet-STaR则是对Self-Taught的推广。

2. Quiet-STaR

在这里插入图片描述

2.1 并行生成

在这里插入图片描述

​ Quiet-STaR的关键挑战是为输入序列中每个token位置高效的生成rationales。这需要对每个token进行独立的前向传播,对于长序列来说在计算上难以处理。

​ 观察到语言模型的一次推理能够为所有的输入token产生下一个token的概率分布,因此可以高度并行生成。当然,这允许为每个输入中的token采样下一个token。若已经为每个token生成了后继,那么就无法使用原始序列来继续生产。例如,为"<bos> the cat sat"中的每个token生成next token,则可能得到"yes orange saw down",每个后继都是前缀序列的合理的next token。可以利用这些后继来为每个观察到的token生成隐思考。

​ 为了能够有效地做到这一点,缓存每次的前向传播,并拼接对角注意力mask至先前的注意力mask。这样,每个生成的token仅能关注生成它的所有token以及其本身。此外,这个并行化的采样过程可以重复任意次数。

2.2 “混合”头

​ 对于最初的预训练模型,thoughts是分布外的,因此会损害语言模型的效果。为了能够平稳转移到思考模式,在LM使用thought和不使用thought之间引入了一个插值。给定一个end-of-thought token的hidden state以及原始文本token的hidden state,混合头会输出一个决定权重,该权重决定了post-thought预测logit被使用的程度。这个头使用一个浅层的MLP,为每个token输出标量值。

2.3 优化Rationale生成

优化Start-of-Thought和End-of-Thought token

​ <|startofthought|>和<|endofthought|> token作为meta-token来控制模型的rationale生成。优化这些token的表示至关重要。使用"—"的embedding来初始化start和end token的embedding,因为其在文本数据中通常表示暂停或者思考。这可以利用语言模型已有的知识。此外,为了使这些embedding能够更快的被优化,在更新时为这些embedding的梯度添加了一个权重。

Non-myopic评分和Teacher-forcing
在这里插入图片描述

​ 由于并不期望在预测每个token都使用thoughts,那么更希望模型的奖励较少依赖于准确的下一个单词,而是后面的语义内容。这里有两个主要的挑战。首先,不同于基于transformers的典型语言建模,仅有那些与给定next-token预测对应的thought才能从预测中接收梯度,这是并行采样策略的结果。我们可以通过采样先前的token来为未来的token添加Loss项,从而接近这个问题。然而,这将导致语言建模更多的熵太高,降低生成文本的质量。相反,本文使用并行注意力mask来计算true next token的对数概率,通过假设模型选择了正确的next ground-truth token来应用teacher forcing。

目标函数

​ 使用REINFORCE来优化rationales的似然,即给定先前观测的tokens和一个rationale,语言模型对于 n t r u e n_{true} ntrue个true next tokens X j + 1 : j + n t r u e + 1 X_{j+1:j+n_{true}+1} Xj+1:j+ntrue+1的对数似然。为了降低方差,为输入序列中的每个token生成多个rationale continuations。因此,定义每个rationale T j T_j Tj的奖励 r j r_j rj p j : j + n t r u e t a l k p_{j:j+n_{true}}^{talk} pj:j+ntruetalk和rationales的平均值 ( p ˉ j : j + n t r u e t a l k ) (\bar{p}_{j:j+n_{true}}^{talk}) (pˉj:j+ntruetalk)
r j = log ⁡ p j : j + n t r u e t a k l ( X j + 1 : j + n t r u e + 1 ) − log ⁡ p ˉ j : j + n t r u e t a l k ( X j + 1 : j + n t r u e + 1 ) r_j =\log p_{j:j+n_{true}}^{takl}(X_{j+1:j+n_{true}+1})-\log\bar{p}_{j:j+n_{true}}^{talk}(X_{j+1:j+n_{true}+1}) \\ rj=logpj:j+ntruetakl(Xj+1:j+ntrue+1)logpˉj:j+ntruetalk(Xj+1:j+ntrue+1)
然后在REINFORCE损失中使用该奖励来更新语言模型的参数 θ \theta θ,从而增加rationales的似然:
∇ θ L j REINFORCE = − r j ⋅ ∇ θ log ⁡ p θ ( T j ∣ [ X : j ; <|startofthought|> ] ) \nabla_{\theta}\mathcal{L}_j^{\text{REINFORCE}}=-r_j\cdot\nabla_{\theta}\log p_{\theta}(T_j|[X_{:j};\text{<|startofthought|>}]) \\ θLjREINFORCE=rjθlogpθ(Tj[X:j;<|startofthought|>])
该损失函数鼓励模型生成能够改善未来预测的rationales。
模型的参数 θ \theta θ,从而增加rationales的似然:
∇ θ L j REINFORCE = − r j ⋅ ∇ θ log ⁡ p θ ( T j ∣ [ X : j ; <|startofthought|> ] ) \nabla_{\theta}\mathcal{L}_j^{\text{REINFORCE}}=-r_j\cdot\nabla_{\theta}\log p_{\theta}(T_j|[X_{:j};\text{<|startofthought|>}]) \\ θLjREINFORCE=rjθlogpθ(Tj[X:j;<|startofthought|>])
该损失函数鼓励模型生成能够改善未来预测的rationales。

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

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

相关文章

Final Shell for Mac 虚拟机连接工具【简单易操作,轻松上手】【开发所需连接工具】

Mac分享吧 文章目录 效果一、下载软件二、安装软件三、运行测试安装完成&#xff01;&#xff01;&#xff01; 效果 一、下载软件 下载软件 链接&#xff1a;http://www.macfxb.cn 二、安装软件 三、运行测试 安装完成&#xff01;&#xff01;&#xff01;

Kubernets(k8s) 网络原理三:同主机内Pod相互访问

前两篇文章中我们介绍了pod怎么和宿主机通信以及pod怎么访问外网&#xff0c;这两种通信是理解pod间通信的基础。 关于pod间的相互访问&#xff0c;这里还需要细化一下。回想一下pod在k8s节点中的分布&#xff0c;两个pod可能分布在同一台宿主机上&#xff0c;也可能分布在不同…

可视化图表与页面源代码显示

可视化图表与页面源代码显示 页面效果&#xff1a; <!DOCTYPE html> <html lang"en" style"height: 100%"> <head><meta charset"utf-8"><title>饼状图</title><style>body {display: flex;height:…

基于51单片机的交通信号灯proteus仿真设计

1.功能简介 交通信号灯是一种经典应用电路&#xff0c;本设计基于51单片机&#xff0c;利用Proteus仿真软件构建了一个模拟交通信号灯系统。该系统能够模拟真实交通环境中的信号变化&#xff0c;包括红灯、黄灯和绿灯的切换&#xff0c;以及倒计时显示等功能&#xff0c;各种灯…

谷歌出品,一款免费的智能绘图工具

AutoDraw是由Google开发的一款基于网络的智能绘图工具&#xff0c;旨在通过人工智能技术帮助用户快速、简便地创建图画和图表。该工具于2017年4月11日由谷歌创意实验室推出&#xff0c;并迅速获得了广泛关注。 AutoDraw的核心功能是利用机器学习算法识别用户的草图或涂鸦&…

C++STL专题-string类

目录 1.标准库中的string类 1.1 string类 2.2 auto和范围for 2.2.1 auto关键字 2.2.2 范围for 2.3 string类的常用接口讲解 1.string类对象的常见构造 2.元素访问 3.迭代器(iterator) 3.1 begin 和 end 3.2 rbegin 和 rend 4.容器 5.修改 5.1 append 5.2 assign…

在C#中为图片添加数字水印的几种办法

最近在写个人项目时&#xff0c;有遇到需要将图片加上水印防止被盗取的需求。这里找了几种实现方式&#xff0c;可供有需要的朋友参考。 本身我不是搞算法这块的&#xff0c;所以这里只是找了一些实现&#xff0c;也没有继续深究下去。 以前在学校的时候从书上了解过可以将一…

cmake常用命令学习

1.include https://blog.csdn.net/qq_38410730/article/details/102677143 CmakeLists.txt才是cmake的正统文件&#xff0c;而.cmake文件是一个模块文件&#xff0c;可以被include到CMakeLists.txt中。 include指令一般用于语句的复用&#xff0c;也就是说&#xff0c;如果有…

OBS Studio:如何打造专业级的视频直播体验

1.简介 OBS&#xff08;Open Broadcaster Software&#xff09;是一款开源的视频录制和直播软件&#xff0c;广泛用于视频制作、游戏直播和网络直播。它支持多种操作系统&#xff0c;包括Windows、macOS和Linux。OBS提供了丰富的功能&#xff0c;包括但不限于&#xff1a; **…

聊聊跨境电商平台与固定IP的那些事

IP地址网络地址&#xff08;网络号&#xff09;主机地址&#xff08;地址号&#xff09;&#xff0c;IP地址是一台电脑在网络中的唯一标识&#xff0c;可分为固定IP与动态IP。那么IP地址的分类有哪些&#xff1f;什么IP适合亚马逊/eBay/速卖通等平台运营时使用&#xff1f; A类…

Spring5 的日志学习

我们在使用 Spring5 的过程中会出现这样的现像&#xff0c;就是 Spring5 内部代码打印的日志和我们自己的业务代码打印日志使用的不是统一日志实现&#xff0c;尤其是在项目启动的时候&#xff0c;Spring5 的内部日志使用的是 log4j2&#xff0c;但是业务代码打印使用的可能是 …

DNS安全概述

一、DNS的解析过程 1.递归解析 递归解析是一种由DNS客户端&#xff08;通常是用户的应用程序&#xff0c;如一个浏览器&#xff09;向本地DNS解析器发出解析请求&#xff0c;然后本地DNS解析器负责查询最终结果并将结果返回给客户端&#xff0c;而中间的所有查询请求都由本地D…

每日OJ_牛客HJ62 查找输入整数二进制中1的个数

目录 牛客HJ62 查找输入整数二进制中1的个数 解析代码 牛客HJ62 查找输入整数二进制中1的个数 查找输入整数二进制中1的个数_牛客题霸_牛客网 解析代码 本题是计算一个数二进制表示中1的个数&#xff0c;通过&#xff08;n >> i) & 1可以获取第i位的二进制值&…

基于Spring boot + Vue的校园论坛

作者的B站地址&#xff1a;程序员云翼的个人空间-程序员云翼个人主页-哔哩哔哩视频 csdn地址&#xff1a;程序员云翼-CSDN博客 1.项目技术栈&#xff1a; 前后端分离的项目 后端&#xff1a;Springboot MybatisPlus 前端&#xff1a;Vue ElementUI 数据库&#xff1a; …

聚星文社 聚星3高级推理创作

聚星文社 聚星3高级推理创作 Docshttps://qvfbz6lhqnd.feishu.cn/wiki/D3YLwmIzmivZ7BkDij6coVcbn7W

CAS5.3自定义登录校验规则

前一篇文章介绍过CAS自定义用户信息, 这个用户信息实在登录成功后加到session中的, 今天来介绍一下CAS5.3怎么自定义登录校验逻辑 思路 有了前一篇文章的铺垫这一次自定义登录校验其实就很简单了, 因为想要把用户信息放入到session中是一定要在登陆的时候完成的,因此这次我们…

Codeforces Round 960 (Div. 2) A~E

A. Submission Bait &#xff08;思维&#xff09; 题意&#xff1a; A l i c e Alice Alice 和 B o b Bob Bob 正在玩一个数组 a a a 中大小为 n n n 的游戏。 他们轮流进行操作&#xff0c; A l i c e Alice Alice先开始。无法操作的玩家将输掉。首先&#xff0c;将变量…

常用控件之 QWidget

目录 一、控件概述 1.关于控件体系的发展&#xff1a; 二、QWidget 核心属性 1.核心属性概览 2.enabled 3.geometry &#x1f335;window frame&#xff08;窗口框架&#xff09; 的影响 4.windowTitle 5.windowIcon &#x1f335;使用 qrc 文件管理资源 6.windowOpa…

微信公众号上线12周年了,12年前的公众号历史文章怎么找?抓取了公众号历史文章同步到博客,找起来方便了

为了方便看看12年来这些号发过的文章 2023 批量下载公众号文章内容/话题/图片/封面/视频/音频&#xff0c;导出文章pdf和抓取文章数据包含阅读数/点赞数/在看数/留言数&#xff0c;我抓取了其中一些号的所有历史文章同步到博客 : 比如深圳卫健委从2014年更新&#xff0c;到2023…

Reqable:跨平台HTTP开发与调试工具

在当今快速发展的互联网时代&#xff0c;HTTP协议作为网络通信的基础&#xff0c;其开发和调试工具的选择对开发效率有着重要影响。本文将详细介绍一款新型的跨平台HTTP开发和调试工具——Reqable&#xff0c;它支持HTTP1、HTTP2以及最新的HTTP3(QUIC)协议&#xff0c;为开发、…