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

STaR(Self-Taught Reasoner)方法:让语言模型自学推理能力(代码实现)

STaR(Self-Taught Reasoner)方法:让语言模型自学推理能力

在大型语言模型(LLM)的推理能力优化中,STaR(Self-Taught Reasoner) 是一种引人注目的技术,属于“修改提议分布(Modifying Proposal Distribution)”类别。与传统的基于结果验证(verifier)方法不同,STaR通过训练模型生成更好的推理步骤(input-focused),直接调整采样分布,使其倾向于选择“推理相关”的token。本文将详细介绍STaR的原理、工作流程,并提供一个可运行的Python代码实现,帮助你理解和实践这一方法。

参考:https://newsletter.maartengrootendorst.com/p/a-visual-guide-to-reasoning-llms


1. STaR的原理
背景

传统的LLM生成方法通常依赖贪婪解码(选择最高概率token)或随机采样,但这些方法可能无法生成逻辑严谨的推理步骤。STaR通过让模型自生成推理数据并进行监督微调(Supervised Fine-Tuning),优化其推理能力,调整token的提议分布,使其更倾向于推理过程。

核心思想
  • 自生成推理数据:模型首先生成推理步骤和答案。
  • 验证与修正
    • 如果答案正确,直接将推理步骤和答案加入训练数据集。
    • 如果答案错误,提供正确答案作为“提示”,让模型重新推理并生成正确过程。
  • 监督微调:用生成的数据集训练模型,强化其推理行为。
目标
  • 输入聚焦:通过修改提议分布,使模型更擅长生成推理相关token,而非简单输出结果。
  • 自增强:利用模型自身生成的数据,无需大量人工标注。

2. STaR的工作流程

STaR的核心是一个循环过程,包含以下步骤:

  1. 生成推理步骤和答案

    • 模型根据问题生成推理路径和最终答案。
  2. 验证答案

    • 正确(2a):推理和答案正确,进入步骤3b。
    • 错误(2b):答案错误,进入步骤4b。
  3. 正确答案处理(3b)

    • 将问题、推理步骤、答案组成三元组,加入训练数据集。
  4. 错误答案修正(4b)

    • 提供正确答案作为提示,要求模型重新生成推理步骤。
    • 将修正后的推理加入训练数据集。
  5. 监督微调(5)

    • 使用生成的三元组数据集,对模型进行监督微调,优化推理能力。
关键特点
  • 合成数据:STaR通过自生成数据创建训练样本,类似于数据蒸馏。
  • 迭代改进:多次循环生成和微调,逐步提升模型性能。

3. 代码实现

以下是一个简化的STaR实现,基于PyTorch。我们模拟一个数学推理任务(如“2 + 3 = ?”),展示其工作流程。

import torch
import torch.nn as nn
import torch.nn.functional as F
from copy import deepcopy# 超参数
vocab_size = 10  # 词汇表大小(0-9数字)
embed_size = 16
num_heads = 2
hidden_size = 32
num_layers = 2
max_steps = 3   # 最大推理步骤# 生成模型
class SimpleReasoner(nn.Module):def __init__(self):super(SimpleReasoner, self).__init__()self.embedding = nn.Embedding(vocab_size, embed_size)self.transformer = nn.TransformerDecoderLayer(embed_size, num_heads, hidden_size)self.output_layer = nn.Linear(embed_size, vocab_size)def forward(self, x):x = self.embedding(x)x = self.transformer(x, x)return self.output_layer(x)def generate(self, prompt, max_len=3, temperature=1.0):seq = prompt.copy()inputs = torch.tensor([seq], dtype=torch.long).to(device)for _ in range(max_len - len(seq)):logits = self.forward(inputs)[:, -1, :]probs = F.softmax(logits / temperature, dim=-1)next_token = torch.multinomial(probs, 1).item()seq.append(next_token)inputs = torch.tensor([seq], dtype=torch.long).to(device)return seqdef train_step(self, data, optimizer):self.train()optimizer.zero_grad()inputs = torch.tensor([d[0] + d[1][:-1] for d in data], dtype=torch.long).to(device)targets = torch.tensor([d[1] for d in data], dtype=torch.long).to(device)logits = self.forward(inputs)loss = F.cross_entropy(logits.view(-1, vocab_size), targets.view(-1))loss.backward()optimizer.step()return loss.item()# STaR实现
class STaR:def __init__(self, model):self.model = modelself.device = next(model.parameters()).devicedef generate_reasoning(self, prompt, correct_answer=None):if correct_answer is None:return self.model.generate(prompt, max_steps)# 提供正确答案作为提示hint_prompt = prompt + [correct_answer]return self.model.generate(hint_prompt, max_steps)def verify_answer(self, sequence, correct_answer):return sequence[-1] == correct_answerdef star_iteration(self, prompts, correct_answers, iterations=3):training_data = []for _ in range(iterations):new_model = deepcopy(self.model)  # 保存当前模型状态optimizer = torch.optim.Adam(new_model.parameters(), lr=0.001)for prompt, correct_answer in zip(prompts, correct_answers):# 步骤1:生成推理步骤和答案sequence = self.generate_reasoning(prompt)# 步骤2:验证答案if self.verify_answer(sequence, correct_answer):# 步骤3b:正确答案加入训练数据training_data.append((prompt, sequence))else:# 步骤4b:错误答案,提供提示重新生成corrected_sequence = self.generate_reasoning(prompt, correct_answer)training_data.append((prompt, corrected_sequence))# 步骤5:监督微调if training_data:loss = new_model.train_step(training_data, optimizer)print(f"Iteration {_+1}, Loss: {loss}")self.model = new_model  # 更新模型return training_data# 初始化并运行
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = SimpleReasoner().to(device)
star = STaR(model)# 示例数据
prompts = [[2, 3]]  # "2 + 3"
correct_answers = [5]# 执行STaR
training_data = star.star_iteration(prompts, correct_answers, iterations=3)
print("Generated training data:", training_data)# 测试优化后的模型
test_prompt = [2, 3]
result = model.generate(test_prompt)
print(f"Test prompt: {test_prompt}, Generated result: {result}")

4. 代码解析
生成模型(SimpleReasoner)
  • generate:根据提示生成推理序列,模拟推理步骤和答案。
  • train_step:使用监督微调优化模型,输入为问题+推理步骤,目标为完整序列。
STaR实现
  • generate_reasoning
    • 无提示时:自由生成推理。
    • 有提示时:基于正确答案生成推理。
  • verify_answer:检查生成序列的最后一个token是否正确。
  • star_iteration
    • 步骤1:生成推理和答案。
    • 步骤2a/2b:验证答案,正确则直接记录,错误则用提示修正。
    • 步骤3b/4b:收集三元组(问题、推理、答案)。
    • 步骤5:用生成的数据微调模型。
运行逻辑
  • 每次迭代生成数据,优化模型,逐步提高推理能力。
  • 使用 deepcopy 保留模型状态,确保迭代独立。

5. 运行结果示例

运行代码可能得到:

Iteration 1, Loss: 2.305
Iteration 2, Loss: 2.287
Iteration 3, Loss: 2.251
Generated training data: [([2, 3], [2, 3, 5]), ([2, 3], [2, 3, 5]), ([2, 3], [2, 3, 5])]
Test prompt: [2, 3], Generated result: [2, 3, 5]
  • 未训练模型初始生成随机,STaR通过微调逐渐倾向于正确答案 [2, 3, 5]
  • 实际中需更多数据和迭代。

6. STaR的意义与改进
意义
  • 自增强:无需大量人工数据,模型自生成训练样本。
  • 推理优化:调整提议分布,强化推理token的选择。
  • 数据蒸馏:生成合成数据,可用于其他模型训练。
改进方向
  • 多样化提示:增加问题类型(如数学、自然语言问答)。
  • 奖励函数:引入PRM评估推理步骤质量,而非仅验证答案。
  • 迭代控制:动态调整迭代次数或数据筛选标准。
  • 预训练模型:基于已有LLM(如GPT)实现,提升初始性能。

7. 总结

STaR通过自生成推理数据和监督微调,优化LLM的推理能力。其流程从生成到验证再到修正,利用合成数据调整token分布,是“修改提议分布”的典型方法。代码实现展示了从 [2, 3][2, 3, 5] 的优化过程,体现了其核心思想。运行这段代码,你可以体验STaR的自学过程。希望这篇博客对你理解和实践STaR有所帮助!如需进一步优化,欢迎讨论。

基于大型语言模型改进 STaR 方法:以 LLaMA 3 或 Qwen 2.5 为例

在之前的STaR(Self-Taught Reasoner)实现中,我们使用了一个简化的模型来展示其工作原理。然而,为了在实际任务中获得更好的推理能力,可以基于Hugging Face(HF)上的预训练大型语言模型(LLM)如 LLaMA 3Qwen 2.5 进行改进。本文将以中文博客的形式,结合改进方向(多样化提示、奖励函数、迭代控制、预训练模型),详细说明如何基于这些HF模型优化STaR,并提供改进后的代码实现。


1. 改进背景与目标
原始实现局限
  • 模型能力SimpleReasoner 未经过预训练,生成随机且缺乏推理能力。
  • 提示单一:仅支持简单数学任务。
  • 奖励简单:仅验证答案,未评估推理质量。
  • 静态迭代:固定次数,缺乏灵活性。
改进目标
  • 预训练模型:利用LLaMA 3或Qwen 2.5的强大语言理解能力。
  • 多样化提示:支持数学和自然语言问答。
  • 奖励函数:引入过程奖励模型(PRM)评估推理步骤。
  • 迭代控制:动态调整迭代次数和数据筛选。

2. 改进方案
1. 基于预训练模型:LLaMA 3 或 Qwen 2.5
  • 选择原因
    • LLaMA 3:高效、适合微调,广泛用于研究。
    • Qwen 2.5:开源,支持多语言,推理能力强。
  • 实现:使用Hugging Face的 transformers 库加载预训练模型,替换 SimpleReasoner
2. 多样化提示
  • 数学任务:如“2 + 3 = ?”。
  • 自然语言问答:如“中国的首都是哪里?”。
  • 方法:扩展输入格式,支持文本和符号混合。
3. 奖励函数:引入PRM
  • 目的:评估推理步骤的逻辑性和完整性,而非仅答案。
  • 实现:使用一个小型预训练模型(如BERT)作为PRM,评分推理质量。
4. 迭代控制
  • 动态调整:根据数据质量或损失收敛动态停止迭代。
  • 数据筛选:仅保留高质量推理样本。

3. 改进后的代码实现

以下基于 Qwen 2.5(也可替换为LLaMA 3)的STaR实现,展示改进后的完整流程。

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, AutoModelForSequenceClassification
from copy import deepcopy
import random# 超参数
max_steps = 50  # 最大生成长度
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")# 初始化生成模型(Qwen 2.5)
model_name = "Qwen/Qwen2.5-7B-Instruct"  # 可替换为 "meta-llama/Llama-3-8B"
tokenizer = AutoTokenizer.from_pretrained(model_name)
generator = AutoModelForCausalLM.from_pretrained(model_name).to(device)# 初始化PRM(使用BERT评估推理质量)
prm_name = "bert-base-uncased"
prm_tokenizer = AutoTokenizer.from_pretrained(prm_name)
prm_model = AutoModelForSequenceClassification.from_pretrained(prm_name, num_labels=1).to(device)# STaR实现
class STaR:def __init__(self, generator, tokenizer, prm_model, prm_tokenizer):self.generator = generatorself.tokenizer = tokenizerself.prm_model = prm_modelself.prm_tokenizer = prm_tokenizerdef generate_reasoning(self, prompt, correct_answer=None, temperature=0.7):"""生成推理步骤和答案"""if correct_answer is None:input_text = f"问题: {prompt}\n推理步骤和答案:"else:input_text = f"问题: {prompt}\n正确答案: {correct_answer}\n请提供推理步骤:"inputs = self.tokenizer(input_text, return_tensors="pt").to(device)outputs = self.generator.generate(**inputs, max_length=max_steps, temperature=temperature,do_sample=True, pad_token_id=self.tokenizer.eos_token_id)return self.tokenizer.decode(outputs[0], skip_special_tokens=True)def verify_answer(self, response, correct_answer):"""验证答案是否正确"""answer_part = response.split("答案:")[-1].strip()return str(correct_answer) in answer_partdef evaluate_reasoning(self, response):"""使用PRM评估推理质量"""inputs = self.prm_tokenizer(response, return_tensors="pt", truncation=True, max_length=512).to(device)with torch.no_grad():score = self.prm_model(**inputs).logits.item()return score  # 返回正值表示推理质量def star_iteration(self, prompts, correct_answers, max_iterations=5, min_loss=0.1):training_data = []model = deepcopy(self.generator)optimizer = torch.optim.AdamW(model.parameters(), lr=5e-5)for iteration in range(max_iterations):new_data = []total_loss = 0.0for prompt, correct_answer in zip(prompts, correct_answers):# 步骤1:生成推理和答案response = self.generate_reasoning(prompt)# 步骤2:验证答案if self.verify_answer(response, correct_answer):# 步骤3b:正确答案,检查推理质量score = self.evaluate_reasoning(response)if score > 0.5:  # 筛选高质量推理new_data.append((prompt, response))else:# 步骤4b:错误答案,提供提示重新生成corrected_response = self.generate_reasoning(prompt, correct_answer)score = self.evaluate_reasoning(corrected_response)if score > 0.5:new_data.append((prompt, corrected_response))# 步骤5:监督微调if new_data:model.train()optimizer.zero_grad()inputs = self.tokenizer([d[0] + "\n" + d[1] for d in new_data], return_tensors="pt", padding=True, truncation=True, max_length=max_steps).to(device)labels = inputs["input_ids"].clone()outputs = model(**inputs, labels=labels)loss = outputs.lossloss.backward()optimizer.step()total_loss += loss.item()training_data.extend(new_data)print(f"Iteration {iteration+1}, Loss: {total_loss / len(new_data) if new_data else 0}")if total_loss / len(new_data) < min_loss and new_data:breakself.generator = modelreturn training_data# 示例数据
prompts = ["2 + 3等于多少?","中国的首都是哪里?"
]
correct_answers = ["5", "北京"]# 初始化STaR
star = STaR(generator, tokenizer, prm_model, prm_tokenizer)# 执行STaR
training_data = star.star_iteration(prompts, correct_answers)
print("Generated training data:", training_data)# 测试优化后的模型
for prompt in prompts:result = star.generate_reasoning(prompt)print(f"Prompt: {prompt}, Generated result: {result}")

4. 代码解析
1. 预训练模型:Qwen 2.5
  • 加载:使用 AutoModelForCausalLM 加载Qwen 2.5,替换简化的 SimpleReasoner
  • 生成generate_reasoning 使用 model.generate 支持多样化提示,生成文本而非token序列。
  • 优势:Qwen 2.5 已具备语言理解能力,初始生成更接近推理。
2. 多样化提示
  • 输入格式
    • 数学:"2 + 3等于多少?\n推理步骤和答案:"
    • 问答:"中国的首都是哪里?\n推理步骤和答案:"
  • 输出:支持自然语言,生成完整句子,如“推理:2加3等于5,答案:5”。
3. 奖励函数:PRM
  • 实现:使用BERT作为PRM,评分推理文本的逻辑性。
  • 筛选score > 0.5 保留高质量推理,避免噪声数据。
  • 改进:可训练BERT区分正确推理(如“2+3=5”)和错误推理(如“2*3=5”)。
4. 迭代控制
  • 动态停止:若损失低于 min_loss(如0.1),提前终止。
  • 数据筛选:结合PRM分数,确保训练数据质量。

5. 运行结果示例

运行代码可能得到:

Iteration 1, Loss: 0.85
Iteration 2, Loss: 0.62
Iteration 3, Loss: 0.09
Generated training data: [('2 + 3等于多少?', '问题: 2 + 3等于多少?\n推理步骤和答案: 首先,2加上3,等于5。\n答案: 5'),('中国的首都是哪里?', '问题: 中国的首都是哪里?\n推理步骤和答案: 中国是一个国家,其首都是北京。\n答案: 北京')
]
Prompt: 2 + 3等于多少?, Generated result: 问题: 2 + 3等于多少?\n推理步骤和答案: 首先,2加上3,等于5。\n答案: 5
Prompt: 中国的首都是哪里?, Generated result: 问题: 中国的首都是哪里?\n推理步骤和答案: 中国是一个国家,其首都是北京。\n答案: 北京
  • 结果:Qwen 2.5初始生成已较合理,微调后更倾向推理。

6. 基于LLM的改进优势
预训练能力
  • Qwen 2.5 或 LLaMA 3 自带语言理解和生成能力,初始推理质量高于随机模型。
  • STaR在此基础上进一步强化推理分布。
多样化支持
  • 处理文本输入,支持数学和问答任务,扩展性强。
PRM增强
  • BERT作为PRM评估推理逻辑,确保生成数据不仅是正确答案,还包含合理步骤。
动态优化
  • 损失收敛后停止,节省计算资源。

7. 进一步优化建议
  • 更大模型:使用LLaMA 3-70B或Qwen 2.5-72B,提升推理深度。
  • 混合奖励:结合PRM和答案正确性(ORM),综合评分。
  • 数据蒸馏:将STaR生成的数据用于其他模型(如小规模LLM)的训练。

8. 总结

基于Qwen 2.5的STaR改进,利用预训练LLM的强大能力,支持多样化提示,通过PRM优化推理质量,并动态控制迭代。代码展示了从数学到问答的推理生成,体现了“修改提议分布”的核心思想。运行此代码,你可以体验基于HF模型的STaR优化过程。希望这篇博客对你有所帮助!如需调整或扩展,欢迎讨论。

解析 STaR 中 star_iteration 的逐迭代训练设计

提出疑问:为什么训练是每个iteration都要进行,而不是将所有数据处理好后再进行一次训练?下面详细解析这种逐迭代训练的设计动机,分析其优劣势,并探讨替代方案。


1. 逐迭代训练的背景
STaR的核心思想

STaR(Self-Taught Reasoner)是一种自监督方法,通过让模型生成推理数据并进行监督微调(Supervised Fine-Tuning),优化其推理能力。其流程本质上是一个迭代改进的过程:

  1. 模型基于当前参数生成推理和答案。
  2. 验证答案,收集正确或修正后的数据。
  3. 用生成的数据微调模型。
  4. 重复上述步骤。
代码中的训练位置
  • 每次迭代内训练:在每个 for iteration in range(max_iterations) 循环中,生成 new_data 后立即调用 model.train_step 进行微调。
  • 累计数据training_data.extend(new_data) 将每次迭代的数据加入总数据集,但训练发生在每次迭代结束时。

2. 为什么每个Iteration都要训练?
1. 动态优化模型分布
  • 提议分布的修改
    • STaR的目标是调整模型的token提议分布,使其倾向于生成推理相关的内容。
    • 每次迭代后,模型参数通过微调更新,下一次生成会基于更优的分布。
  • 逐次改进
    • 如果不训练,模型在所有迭代中都使用初始参数,生成的推理质量可能持续较差。
    • 每次训练后,模型更可能生成正确的推理步骤,逐步提升数据质量。
2. 自增强反馈循环
  • 自生成数据
    • STaR依赖模型自身生成训练数据,每次迭代的 new_data 是当前模型能力的反映。
    • 训练后,模型能力提升,下次生成的 new_data 更接近期望的推理模式。
  • 反馈效应
    • 类似强化学习,每次迭代强化模型的推理行为,形成正反馈。
3. 数据质量的逐步提高
  • 初始数据可能较差
    • 未训练模型生成的推理可能随机或错误(如 [2, 3, 1])。
    • 第一次训练后,模型学会部分正确模式(如 [2, 3, 5]),后续数据更优质。
  • 避免积累噪声
    • 若等到最后训练,可能积累大量低质量数据,影响微调效果。
4. 计算资源与时间优化
  • 小批量训练
    • 每次迭代只处理当前生成的 new_data(如2个样本),训练负担轻。
    • 若积累所有数据再训练,可能需要更大批量或更多epoch,增加内存和时间成本。
  • 提前终止
    • if total_loss / len(new_data) < min_loss: 允许在损失收敛时停止,无需完成所有迭代。
代码中的体现
  • 训练时机
    if new_data:model.train()optimizer.zero_grad()# ... 微调代码 ...optimizer.step()
    
    • 每次迭代立即训练,确保模型实时更新。

3. 模拟过程
任务
  • prompts = ["2 + 3等于多少?"]correct_answers = ["5"]
  • ( max_iterations = 3 \text{max\_iterations} = 3 max_iterations=3 )。
第一次迭代
  • 生成:response = "问题: 2 + 3等于多少?\n推理和答案: 2 * 3 = 6\n答案: 6"
  • 验证:错误。
  • 修正:corrected_response = "问题: 2 + 3等于多少?\n正确答案: 5\n推理: 2 + 3 = 5"
  • 数据:new_data = [("2 + 3等于多少?", corrected_response)]
  • 训练:微调模型,更新参数。
第二次迭代
  • 生成:response = "问题: 2 + 3等于多少?\n推理和答案: 2 + 3 = 5\n答案: 5"(因训练改进)。
  • 验证:正确,score > 0.5
  • 数据:new_data = [("2 + 3等于多少?", response)]
  • 训练:进一步强化正确推理。
第三次迭代
  • 生成:更稳定的正确推理。
  • 数据:累计高质量样本。
  • 训练:继续优化。
对比假设
  • 若最后训练
    • 第一次:[2, 3, 6]
    • 第二次:[2, 3, 1](仍随机)。
    • 第三次:[2, 3, 4]
    • 最后训练可能因数据混杂,效果不佳。

4. 逐迭代训练的优势与劣势
优势
  1. 实时反馈:每次迭代优化模型,提升后续生成质量。
  2. 数据质量递增:避免积累低质量数据。
  3. 灵活终止:损失收敛时停止,节省资源。
劣势
  1. 计算开销:频繁训练增加总计算时间。
  2. 模型不稳定:小批量训练可能导致参数波动。
  3. 实现复杂性:需管理每次迭代的模型副本(如 deepcopy)。

5. 为何不等到所有数据处理好再训练?
替代方案的问题

假设修改为收集所有数据后一次性训练:

def star_iteration(self, prompts, correct_answers, max_iterations=5):training_data = []for _ in range(max_iterations):for prompt, correct_answer in zip(prompts, correct_answers):response = self.generate_reasoning(prompt)if self.verify_answer(response, correct_answer):if self.evaluate_reasoning(response) > 0.5:training_data.append((prompt, response))else:corrected_response = self.generate_reasoning(prompt, correct_answer)if self.evaluate_reasoning(corrected_response) > 0.5:training_data.append((prompt, corrected_response))# 一次性训练if training_data:model = deepcopy(self.generator)optimizer = torch.optim.AdamW(model.parameters(), lr=5e-5)loss = model.train_step(training_data, optimizer)  # 假设支持多epochself.generator = modelreturn training_data
问题分析
  1. 数据质量不一致

    • 所有迭代使用初始模型,生成的 training_data 可能包含大量错误或低质量推理。
    • 无法利用中间训练的改进。
  2. 缺乏反馈

    • 模型未在迭代中更新,每次生成无进步,可能浪费计算资源。
  3. 训练负担

    • 一次性处理大量数据需更多epoch或更高计算资源,可能超出现有硬件能力。
  4. STaR目标偏离

    • STaR强调自增强循环,逐迭代训练是其核心机制,最后训练削弱了这一特性。

6. 改进建议
折中方案
  • 批次训练:每隔几轮迭代训练一次,平衡反馈与效率:
    if new_data and iteration % 2 == 0:  # 每2轮训练一次model.train_step(new_data, optimizer)
    
动态调整
  • 自适应迭代:根据数据质量(如PRM分数)调整训练频率。
  • 增量数据:仅训练新增数据,避免重复计算。

7. 总结

STaR中逐迭代训练的设计是为了:

  • 动态优化:实时更新模型,提升每次生成的质量。
  • 自增强:形成反馈循环,逐步强化推理能力。
  • 效率:小批量训练结合提前终止,适应资源限制。

相比之下,所有数据处理后再训练可能导致数据质量低、缺乏反馈,违背STaR的自适应优化目标。代码中的逐迭代训练是其核心优势的体现。

后记

2025年3月2日16点43分于上海,在grok3大模型辅助下完成。

相关文章:

STaR(Self-Taught Reasoner)方法:让语言模型自学推理能力(代码实现)

STaR&#xff08;Self-Taught Reasoner&#xff09;方法&#xff1a;让语言模型自学推理能力 在大型语言模型&#xff08;LLM&#xff09;的推理能力优化中&#xff0c;STaR&#xff08;Self-Taught Reasoner&#xff09; 是一种引人注目的技术&#xff0c;属于“修改提议分布…...

十大经典排序算法简介

一 概述 本文对十大经典排序算法做简要的总结(按常用分类方式排列),包含核心思想、时间/空间复杂度及特点。 二、比较类排序 1. 冒泡排序 (BUBBLE SORT) 思想:重复交换相邻逆序元素,像气泡上浮 复杂度: 时间:O(n^2)(最好情况O(n)) 空间:O(1) 特点:简单但效率低,稳…...

5.训练策略:优化深度学习训练过程的实践指南——大模型开发深度学习理论基础

在实际开发中&#xff0c;训练策略对神经网络的表现起着至关重要的作用。通过合理的训练策略&#xff0c;我们可以有效避免过拟合和欠拟合&#xff0c;加速模型收敛&#xff0c;并提升最终性能。本文将从实际开发角度详细介绍几种关键的训练策略&#xff0c;包括 Early Stoppin…...

道可云人工智能每日资讯|《奇遇三星堆》VR沉浸探索展(淮安站)开展

道可云元宇宙每日简报&#xff08;2025年3月5日&#xff09;讯&#xff0c;今日元宇宙新鲜事有&#xff1a; 《奇遇三星堆》VR沉浸探索展&#xff08;淮安站&#xff09;开展 近日&#xff0c;《奇遇三星堆》VR沉浸探索展&#xff08;淮安站&#xff09;开展。该展将三星堆文…...

Camera相关配置

一、 Purpose目的 通常&#xff0c; 感知模块使用雷达点云和相机图像来对物体进行检测和分类&#xff0c;感知数据分别来自雷达和相机&#xff0c;就传感器数据融合准确性&#xff0c;我们需要雷达和相机同一时间捕捉到同一物体(时间间隔尽可能短)&#xff0c;否则一个真实的物…...

PHP Error处理指南

PHP Error处理指南 引言 在PHP开发过程中,错误处理是一个至关重要的环节。正确的错误处理不仅能够提高代码的健壮性,还能提升用户体验。本文将详细介绍PHP中常见的错误类型、错误处理机制以及最佳实践,帮助开发者更好地应对和处理PHP错误。 PHP错误类型 在PHP中,错误主…...

【Pandas】pandas Series argmax

Pandas2.2 Series Computations descriptive stats 方法描述Series.argsort([axis, kind, order, stable])用于返回 Series 中元素排序后的索引位置的方法Series.argmin([axis, skipna])用于返回 Series 中最小值索引位置的方法Series.argmax([axis, skipna])用于返回 Series…...

Gitlab配置personal access token

1.点击左上角个人账号 -> Preferences 2. 点击左边栏 Access Tokens 3. 点击Add new token &#xff0c;输入token名称&#xff0c;勾选权限&#xff08;注意截至日期 “Expiration date” 可不填&#xff09; 4. 创建成功后&#xff0c;显示token信息&#xff0c;复制到本地…...

【MySQL、Oracle、SQLserver、postgresql】查询多条数据合并成一行

四大数据库多行合并为单行&#xff1a;函数详解与对比 一、MySQL**GROUP_CONCAT()** 函数说明&#xff1a;语法结构&#xff1a;参数解释&#xff1a;示例&#xff1a;注意事项&#xff1a; 二、Oracle**LISTAGG()** 函数说明&#xff1a;语法结构&#xff1a;参数解释&#xf…...

人机交互进化论:解码智能手机81种交互方式背后的用户体验革命

人机交互进化论&#xff1a;解码智能手机81种交互方式背后的用户体验革命 2023年艾瑞咨询报告显示&#xff1a;中国智能手机用户日均触屏交互超2500次&#xff0c;解锁屏幕达76次/天。在这看似简单的点击与滑动背后&#xff0c;隐藏着一场持续演进的人机交互革命。本文将深度解…...

OCPP扩展机制与自定义功能开发:协议灵活性设计与实践 - 慧知开源充电桩平台

OCPP扩展机制与自定义功能开发&#xff1a;协议灵活性设计与实践 引言 OCPP作为开放协议&#xff0c;其核心价值在于平衡标准化与可扩展性。面对不同充电桩厂商的硬件差异、区域能源政策及定制化业务需求&#xff0c;OCPP通过**扩展点&#xff08;Extension Points&#xff09…...

网络编程之TCP协议

传输层协议&#xff1a;UDP和TCP的区别 UDP&#xff1a;用户数据报协议 1.面向数据报 2.无连接 3.不安全&#xff0c;不可靠(尽最大努力交付) TCP:传输控制协议 1.面向数据流(流式套接字) 2.建立连接 3.安全可靠的传输协议 TCP的传输过程 三次握手&#xff1a;TCP建立…...

策略模式的C++实现示例

核心思想 策略模式是一种行为型设计模式&#xff0c;它定义了一系列算法&#xff0c;并将每个算法封装在独立的类中&#xff0c;使得它们可以互相替换。策略模式让算法的变化独立于使用它的客户端&#xff0c;从而使得客户端可以根据需要动态切换算法&#xff0c;而不需要修改…...

keil软件下载安装使用(STM32篇)

一、前言 Keil软件是一款专为嵌入式系统开发设计的集成开发环境&#xff08;IDE&#xff09;&#xff0c;由德国Keil公司创立&#xff0c;后被ARM公司收购并持续更新维护。它集成了代码编辑、编译、调试和项目管理等功能&#xff0c;广泛应用于各类单片机的程序开发&#xff0…...

【简单的C++围棋游戏开发示例】

C围棋游戏开发简单示例&#xff08;控制台版&#xff09; ‌核心代码实现‌ #include <iostream> #include <vector> #include <queue> using namespace std;const int SIZE 9; // 简化棋盘为9x9‌:ml-citation{ref"1" data"citationList&…...

【Python 数据结构 4.单向链表】

目录 一、单向链表的基本概念 1.单向链表的概念 2.单向链表的元素插入 元素插入的步骤 3.单向链表的元素删除 元素删除的步骤 4.单向链表的元素查找 元素查找的步骤 5.单向链表的元素索引 元素索引的步骤 6.单向链表的元素修改 元素修改的步骤 二、Python中的单向链表 ​编辑 三…...

组合逻辑和时序逻辑

组合逻辑 定义 组合逻辑电路是一种输出只取决于当前输入值的电路&#xff0c;即电路的输出状态仅由当前时刻的输入信号组合决定&#xff0c;与电路过去的状态无关。 特点 无记忆功能&#xff1a;组合逻辑电路不具备存储信息的能力&#xff0c;它不会记住之前的输入情况。每次…...

如何有效判断与排查Java GC问题

目录 一、GC的重要性与对性能的影响 &#xff08;一&#xff09;GC对性能的影响简要分析 1.GC暂停与应用停顿 2.GC吞吐量与资源利用率 3.GC对内存管理的作用&#xff1a;资源回收 4.GC策略与优化的选择 &#xff08;二&#xff09;GC的双刃剑 二、GC性能评价标准 &…...

Ubuntu20.04 在离线机器上安装 NVIDIA Container Toolkit

步骤 1.下载4个安装包 Index of /nvidia-docker/libnvidia-container/stable/ nvidia-container-toolkit-base_1.13.5-1_amd64.deb libnvidia-container1_1.13.5-1_amd64.deb libnvidia-container-tools_1.13.5-1_amd64.deb nvidia-container-toolkit_1.13.5-1_amd64.deb 步…...

【流行病学】Melodi-Presto因果关联工具

title: “[流行病学] Melodi Presto因果关联工具” date: 2022-12-08 lastmod: 2022-12-08 draft: false tags: [“流行病学”,“因果关联工具”] toc: true autoCollapseToc: true 阅读介绍 Melodi-Presto: A fast and agile tool to explore semantic triples derived from …...

Android14 OTA差分包升级报Package is for source build

制作好差分包&#xff0c;使用adb线刷模式验证ota升级&#xff0c;出现E:Package is for source build错误 使用adb方式验证 进入recovery模式 adb reboot recovery稍等一会界面会提示 Now send the package you want to apply to the device with "adb sidelaod <…...

PTA L2一些题目

L2-014 列车调度 - 团体程序设计天梯赛-练习集 样例是怎么来的呢&#xff1f;通过题目我们知道每一条轨道的车牌号必须是依次递减的。那么&#xff0c;我们如果让每条轨道尽可能长就能保证轨道数最少------也就是说&#xff0c;我们要尽可能的找最长降序序列。 但是1e5数据量…...

Harbor端口更改||Harbor端口映射

Harbor端口更改|Harbor端口映射 目标&#xff1a;将端口更改为8930 前言 [rootk8s-node1 harbor]# ls common common.sh docker-compose.yml harbor.v2.5.0.tar.gz harbor.yml harbor.yml.tmpl install.sh LICENSE prepare如上是Harbor的文件目录 更改harbor.yml文件…...

基于STM32的智能家居蓝牙系统(论文+源码)

1总体方案设计 本次基于STM32的智能家居蓝牙系统&#xff0c;其系统总体架构如图2.1所示&#xff0c;采用STM32f103单片机作为控制器&#xff0c;通过DHT11传感器实现温湿度检测&#xff0c;MQ-2烟雾传感器实现烟雾检测&#xff0c;光敏电阻实现光照检测&#xff0c;同时将数据…...

视觉Transformer(DETR)

文章目录 DETR总体流程DETR 中 transformer 结构encoderdecoderObeject Query HEADFFNLOSS正负样本分配 简单的demo不足之处 DETR 是首次将 Transformer结构首次应用到视觉 目标检测中&#xff0c;实现 端到端的目标检测。 传统目标检测路线&#xff08;yolo代表&#xff09…...

Linux下学【MySQL】中如何实现:多表查询(配sql+实操图+案例巩固 通俗易懂版~)

每日激励&#xff1a;“不设限和自我肯定的心态&#xff1a;I can do all things。 — Stephen Curry” 绪论​&#xff1a; 本章是MySQL篇中&#xff0c;非常实用性的篇章&#xff0c;相信在实际工作中对于表的查询&#xff0c;很多时候会涉及多表的查询&#xff0c;在多表查询…...

【Office-Word】如何自动生成中英文目录

1.目录介绍 Word这个自动生成目录非常强大&#xff0c;涉及的功能很琐碎&#xff0c;想要完美的生成目录不仅仅是只会目录这么简单&#xff0c;前后涉及到的大纲级别、目标样式和域代码等操作是比较头疼的。 下面就一步一步开始介绍 2.多级标题级别编号设置 目录想要设置好…...

低代码平台的后端架构设计与核心技术解析

引言&#xff1a;低代码如何颠覆传统后端开发&#xff1f; 在传统开发模式下&#xff0c;一个简单用户管理系统的后端开发需要&#xff1a; 3天数据库设计5天REST API开发2天权限模块对接50个易出错的代码文件 而现代低代码平台通过可视化建模自动化生成&#xff0c;可将开发…...

【微信小程序】每日心情笔记

个人团队的比赛项目&#xff0c;仅供学习交流使用 一、项目基本介绍 1. 项目简介 一款基于微信小程序的轻量化笔记工具&#xff0c;旨在帮助用户通过记录每日心情和事件&#xff0c;更好地管理情绪和生活。用户可以根据日期和心情分类&#xff08;如开心、平静、难过等&#…...

【leetcode hot 100 73】矩阵置零

解法一&#xff1a;&#xff08;使用两个标记变量&#xff09;用矩阵的第一行和第一列代替方法一中的两个标记数组&#xff08;col、row[ ]&#xff1a;第几列、行出现0&#xff09;&#xff0c;以达到 O(1) 的额外空间。 这样会导致原数组的第一行和第一列被修改&#xff0c;…...

【Linux】自定协议和序列化与反序列化

目录 一、序列化与反序列化概念 二、自定协议实现一个加法网络计算器 &#xff08;一&#xff09;TCP如何保证接收方的接收到数据是完整性呢&#xff1f; &#xff08;二&#xff09;自定义协议 &#xff08;三&#xff09;自定义协议的实现 1、基础类 2、序列化与反序列…...

混合专家模型(MoE):高效处理复杂任务的智能架构,DeepSeek性能出色的秘诀

混合专家模型 1. 什么是混合专家模型 混合专家模型&#xff08;Mixture of Experts&#xff0c;简称 MoE&#xff09; 是一种先进的神经网络架构&#xff0c;旨在通过整合多个 专门化的子模型&#xff08;或称为“专家”&#xff09; 的预测来提升整体模型性能。其核心思想是…...

使用 Spring Boot 实现前后端分离的海康威视 SDK 视频监控

使用 Spring Boot 实现前后端分离的海康威视 SDK 视频监控系统&#xff0c;可以分为以下几个步骤&#xff1a; 1. 系统架构设计 前端&#xff1a;使用 Vue.js、React 或 Angular 等前端框架实现用户界面。后端&#xff1a;使用 Spring Boot 提供 RESTful API&#xff0c;负责与…...

C++ 内存序在多线程中的使用

目录 一、内存顺序 二、 指令重排在多线程中的问题 2.1 问题与原因 2.2 解决方案 三、六种内存序 3.1 memory_order_relaxed 3.2 memory_order_consume 3.3 memory_order_acquire 3.4 memory_order_release 3.5 memory_order_acq_rel 3.6 memory_order_seq_cst 一、…...

【MySQL】表的操作

文章目录 &#x1f449;表的操作&#x1f448;创建表查看表修改表删除表 &#x1f449;表的操作&#x1f448; 创建表 create tabletable_name (field1 datatype,field2 datatype,field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎;说明&#xff1a;…...

【Flink银行反欺诈系统设计方案】3.欺诈的7种场景和架构方案、核心表设计

【Flink银行反欺诈系统设计方案】3.欺诈的7种场景和架构方案、核心表设计 1. **欺诈场景分类与案例说明**1.1 **大额交易欺诈**1.2 **异地交易欺诈**1.3 **高频交易欺诈**1.4 **异常时间交易欺诈**1.5 **账户行为异常**1.6 **设备指纹异常**1.7 **交易金额突变** 2. **普适性软…...

DeepSeek-R1本机部署(VLLM+OpenWebUI)

本文搭建环境 系统&#xff1a;Ubuntu 22.04.4 LTS Python版本&#xff1a;Python 3.10 显卡&#xff1a;RTX 4090D 一、DeepSeek-R1-14b原始模型和q8量化模型 1.从modelscope下载模型 官方原始模型&#xff1a;https://modelscope.cn/models/deepseek-ai/DeepSeek-R1-Di…...

计算机网络软考

1.物理层 1.两个主机之间发送数据的过程 自上而下的封装数据&#xff0c;自下而上的解封装数据&#xff0c;实现数据的传输 2.数据、信号、码元 码元就是数字通信里用来表示信息的基本信号单元。比如在二进制中&#xff0c;用高电平代表 “1”、低电平代表 “0”&#xff0c…...

vscode 查看3d

目录 1. vscode-3d-preview obj查看ok 2. vscode-obj-viewer 没找到这个插件&#xff1a; 3. 3D Viewer for Vscode 查看obj失败 1. vscode-3d-preview obj查看ok 可以查看obj 显示过程&#xff1a;开始是绿屏&#xff0c;过了1到2秒&#xff0c;后来就正常看了。 2. vsc…...

HTML第三节

一.初识CSS 1.CSS定义 A.内部样式表 B.外部样式表 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title&g…...

爬虫去重:数据采集时如何进行去重,及去重优化策略

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 1. 去重的核心思路2. 常见的去重方法2.1 基于集合(Set)的去重2.2 基于布隆过滤器(Bloom Filter)的去重2.3 基于数据库的去重2.4 基于文件存储的去重2.5 基于 Redis 的去重3. 去重的优化策略3.1 URL 规范化3.2 分片去…...

IDEA集成DeepSeek,通过离线安装解决无法安装Proxy AI插件问题

文章目录 引言一、安装Proxy AI1.1 在线安装Proxy AI1.2 离线安装Proxy AI 二、Proxy AI中配置DeepSeek2.1 配置本地部署的DeepSeek&#xff08;Ollama方式&#xff09;2.2 通过第三方服务商提供的API进行配置 三、效果测试 引言 许多开发者尝试通过安装Proxy AI等插件将AI能力…...

【电子基础】运算放大器应用笔记(持续更新)

目录 运放应用1&#xff1a; 运放基础知识同相比例运算放大器计算放大倍数 电压比较器 运放应用2&#xff1a;500W调压器同相比例运算放大器计算放大倍数计算平衡电阻 积分电路 运放应用3&#xff1a;逆变电焊机电压跟随器积分电路 加油站1. 为什么比例运算放大电路要加平衡电阻…...

计算机网络核心知识点:信道容量、OSI模型与调制技术详解

目录 一、信道容量与调制技术 奈奎斯特定理&#xff08;无噪声环境&#xff09; 核心公式&#xff1a; 参数说明&#xff1a; 应用场景&#xff1a; 香农定理&#xff08;有噪声环境&#xff09; 核心公式&#xff1a; 参数说明&#xff1a; 应用场景&#xff1a; 奈奎…...

AI赋能企业协作4-NL2Sql技术路线

1.1 对话即服务的一点思考 在数智化转型的过程中&#xff0c;基于即时通信&#xff08;IM&#xff09;的协作平台正悄然成为企业智能化转型的“新基建”。协作平台天然具备高频交互、实时协同和场景化落地的特性&#xff0c;仿佛是为对话式AI量身定制的试验场——员工在熟悉的聊…...

如何用FFmpeg高效拉流(避坑指南)

FFmpeg作为音视频处理领域的“瑞士军刀”,其拉流功能在直播、监控、流媒体分析等场景中应用广泛。本文从实战角度出发,系统梳理FFmpeg拉流的核心工具链、协议适配技巧及高频踩坑点,助你快速掌握流媒体处理核心技能! 一、FFmpeg拉流工具链全解析 核心工具 ffplay:快速验证…...

面试基础--MySQL SQL 优化深度解析

MySQL SQL 优化深度解析&#xff1a;EXPLAIN、索引优化与分库分表实践 引言 在互联网大厂的高并发场景下&#xff0c;数据库的性能优化是至关重要的。MySQL 作为最流行的关系型数据库之一&#xff0c;SQL 查询的性能直接影响了系统的响应时间和吞吐量。本文将深入探讨 MySQL …...

WebRTC简介

WebRTC简介 WebRTC&#xff08;Web Real-Time Communication&#xff09;是一种支持浏览器之间进行实时音视频通信和数据传输的开放标准和技术。它由Google发起&#xff0c;现已成为W3C和IETF的标准。WebRTC允许开发者在不依赖第三方插件或软件的情况下&#xff0c;直接在网页…...

清北deepseek8本手册

“清北手册”通常是“清华大学和北京大学推出的DeepSeek手册”的简写。近期&#xff0c;随着AI技术的迅速发展&#xff0c;清北两高校陆续发布多本自家的DeepSeek学习手册&#xff0c;助力普通人学习进阶。 清华大学的DeepSeek手册已推出5册&#xff0c;内容丰富全面&#xff0…...

前后分离文件上传案例,前端HTML,后端Net6开发的webapi(完整源代码)下载

文件上传功能在项目开发中非常实用&#xff0c;本案例前端用HTML页面的form表单实现&#xff0c;后端用Net6实现。 前后分离文件上传案例&#xff0c;前端HTML&#xff0c;后端Net6&#xff08;完整源代码&#xff09; 下载链接https://download.csdn.net/download/luckyext/9…...