LLM 直接偏好优化(DPO)的一些研究

news2024/11/24 16:02:40

今天我们来聊聊大型语言模型(LLMs)吧。要让这些聪明的家伙和咱们人类的价值观还有喜好对上号,这事儿可不简单。以前咱们用的方法,比如基于人类反馈的强化学习(RLHF),虽然管用,但是它太复杂了,得用上好多计算资源和数据处理的力气。现在,直接偏好优化(Direct Preference Optimization, DPO)来了,它就像是一股清流,给咱们提供了一个既简单又高效的新选择。DPO简化了优化的过程,不仅减轻了计算的负担,还让模型能更快地适应咱们的喜好。

咱们这篇文章,就是要深入挖掘DPO的精髓,从基础理论到实际怎么操作,再到它在现实世界中的应用,咱们都会一一细说。

偏好对齐的必要性

在我们开始深入了解DPO之前,得先弄明白为啥得让大型语言模型(LLMs)跟咱们人类的喜好挂上钩。虽然这些模型经过大量数据训练后挺厉害的,但有时候它们给出的结果可能跟咱们的价值观不太搭,或者有点偏见,甚至完全不搭边。这种情况可能表现为:

  • 弄出些不安全或者有害的东西来;

  • 给出的信息不太准确,或者会误导人;

  • 反映了训练数据里的一些偏见。

为了解决这些问题,研究人员就搞出了一些用人类反馈来微调LLMs的技术。在这些方法里,RLHF算是最显眼的一个。

聊聊RLHF:DPO的前辈

咱们得先了解下RLHF,也就是基于人类反馈的强化学习,这可是让大型语言模型(LLMs)和人类喜好对上号的首选法宝。咱们来一步步拆解RLHF的过程,看看它都复杂在哪儿:

  1. 监督式微调(SFT):咱们先拿一个已经学了不少东西的LLM,然后用一堆质量上乘的回应数据来调教它。这样,它在面对特定任务时,就能生成更靠谱、更有条理的输出了。

  2. 奖励建模:接下来,咱们得训练一个独立的奖励模型来预测人类会喜欢啥。这个过程包括:

    • 给定一些提示,生成一堆回应的选项。

    • 让真人来评价,看他们更喜欢哪个回应。

    • 再训练一个模型,让它学会预测这种喜好。

  3. 强化学习:有了奖励模型后,咱们就可以用强化学习来进一步打磨LLM了。奖励模型会给反馈,帮助LLM学会生成更符合人类喜好的回应。

不过,虽然RLHF挺有效的,但它也有自己的短板:

  • 得训练和维护好几个模型,比如SFT模型、奖励模型还有强化学习模型。

  • 强化学习的过程可能不太稳定,对那些需要调整的参数特别敏感。

  • 计算成本高,需要反复在模型里做前向和后向的计算。

就是因为这些限制,人们开始寻找更简单、更高效的替代方案,于是直接偏好优化(DPO)就应运而生了。

直接偏好优化:核心概念

这张图片展示了两种不同的方法来使大型语言模型(LLM)的输出与人类的偏好保持一致:一种是基于人类反馈的强化学习(RLHF),另一种是直接偏好优化(DPO)。RLHF需要一个奖励模型,通过反复的反馈循环来指导语言模型的策略;而DPO则直接对模型输出进行优化,以确保它们与人类偏好的响应相匹配,这是通过使用偏好数据来实现的。这种对比突出了每种方法的优势和可能的应用场景,为未来LLM的训练提供了有价值的见解,帮助我们训练出更能满足人类期望的模型。

DPO背后的几个关键思想包括:

a) 隐式奖励建模:DPO不使用单独的奖励模型,而是将语言模型本身作为隐式的奖励函数来处理。

b) 基于策略的公式:与优化奖励函数不同,DPO直接对策略(也就是语言模型)进行优化,以提高产生符合偏好响应的概率。

c) 封闭形式解:DPO利用数学上的洞察,允许我们以封闭形式求解最优策略,这样就不需要通过迭代的RL更新过程。

更多详细信息和数学原理,可以查看发表在arXiv上的论文《Direct Preference Optimization: Your Language Model is Secretly a Reward Model》(https://arxiv.org/abs/2305.18290)。

实现DPO:实践代码演示

好的,来聊聊这段代码是干嘛的。想象一下,我们有个聪明的语言模型,我们想让它输出的内容更符合人类的喜好。为了做到这一点,我们用PyTorch这个工具来写了一个叫做dpo_loss的函数。

这个函数就像是个指导老师,它告诉模型:"嘿,这里有些规则要遵守哦"。它接收几个重要的信息:

  • pi_logps:这是模型自己认为的每个选项有多靠谱的概率。

  • ref_logps:这是另一个模型,也就是参考模型,认为的选项靠谱程度。

  • yw_idxsyl_idxs:这两个是告诉模型,哪些选项是人类喜欢的(偏好),哪些是人类不喜欢的(不偏好)。

  • beta:这个参数就像是调整规则严格程度的旋钮。

接下来,函数会做几件事情:

  1. 它先从模型里拿出人类喜欢和不喜欢的选项的对数概率。

  2. 然后,它会计算这两个概率的差异,这个差异很重要,因为它决定了模型需要往哪个方向调整。

  3. 通过logsigmoid这个函数,我们能得到一个损失值,这个值告诉我们模型现在的输出和人类喜好之间差距有多大。

  4. 最后,我们还会计算一个奖励值,这个奖励值是基于模型的输出和参考模型的差异,乘以beta这个旋钮的值来决定的。

总的来说,这个dpo_loss函数就是帮助我们的模型学习如何更好地适应人类的喜好,让它的输出更加精准。

让我们深入研究DPO背后的数学原理,以理解它如何实现这些目标。

DPO的数学原理

DPO是对偏好学习问题的巧妙重新表述,咱们一步步来理解它:

a) 起点:KL约束下的奖励最大化。原始的RLHF目标可以表示为:

咱们要优化的策略,也就是语言模型πθ,目标是最大化奖励函数r(x,y),同时保持与参考策略πref的KL散度在β控制的约束范围内。

b) 最优策略:数学上可以证明,最优策略的形式是π_r(y|x) = 1/Z(x) * πref(y|x) * exp(1/β * r(x,y))。这里的Z(x)是个归一化常数,用来确保所有选项的概率加起来等于1。

c) 奖励-策略对偶性:DPO的洞见在于,用最优策略来表示奖励函数,即r(x,y) = β * log(π_r(y|x) / πref(y|x)) + β * log(Z(x))。

d) 偏好模型:如果咱们假设偏好遵循Bradley-Terry模型,那么在给定x的情况下,偏好y1而不是y2的概率可以表示为p*(y1 ≻ y2 | x) = σ(r*(x,y1) - r*(x,y2)),这里的σ是逻辑函数。

e) DPO目标:将奖励-策略对偶性放入偏好模型中,咱们得到了DPO的目标公式:L_DPO(πθ; πref) = -E_(x,y_w,y_l)~D [log σ(β * log(πθ(y_w|x) / πref(y_w|x)) - β * log(πθ(y_l|x) / πref(y_l|x)))]。这个目标可以通过标准的梯度下降技术来优化,不需要用到RL算法。

简单来说,DPO就是用一种新的方式来调整语言模型,让它的输出更符合人类的偏好,而且这个过程比传统的强化学习方法更简单、更直接。

实现DPO

现在我们理解了DPO背后的理论,让我们看看如何在实践中实现它。我们将使用PythonPyTorch作为示例:

import torch
import torch.nn.functional as F
class DPOTrainer:
    def __init__(self, model, ref_model, beta=0.1, lr=1e-5):
        self.model = model
        self.ref_model = ref_model
        self.beta = beta
        self.optimizer = torch.optim.AdamW(self.model.parameters(), lr=lr)

    def compute_loss(self, pi_logps, ref_logps, yw_idxs, yl_idxs):
        """
        pi_logps: policy logprobs, shape (B,)
        ref_logps: reference model logprobs, shape (B,)
        yw_idxs: preferred completion indices in [0, B-1], shape (T,)
        yl_idxs: dispreferred completion indices in [0, B-1], shape (T,)
        beta: temperature controlling strength of KL penalty
        Each pair of (yw_idxs[i], yl_idxs[i]) represents the indices of a single preference pair.
        """
        # Extract log probabilities for the preferred and dispreferred completions
        pi_yw_logps, pi_yl_logps = pi_logps[yw_idxs], pi_logps[yl_idxs]
        ref_yw_logps, ref_yl_logps = ref_logps[yw_idxs], ref_logps[yl_idxs]
        # Calculate log-ratios
        pi_logratios = pi_yw_logps - pi_yl_logps
        ref_logratios = ref_yw_logps - ref_yl_logps
        # Compute DPO loss
        losses = -F.logsigmoid(self.beta * (pi_logratios - ref_logratios))
        rewards = self.beta * (pi_logps - ref_logps).detach()
        return losses.mean(), rewards

    def train_step(self, batch):
        x, yw_idxs, yl_idxs = batch
        self.optimizer.zero_grad()
        # Compute log probabilities for the model and the reference model
        pi_logps = self.model(x).log_softmax(-1)
        ref_logps = self.ref_model(x).log_softmax(-1)
        # Compute the loss
        loss, _ = self.compute_loss(pi_logps, ref_logps, yw_idxs, yl_idxs)
        loss.backward()
        self.optimizer.step()
        return loss.item()
# Usage
model = YourLanguageModel()  # Initialize your model
ref_model = YourLanguageModel()  # Load pre-trained reference model
trainer = DPOTrainer(model, ref_model)
for batch in dataloader:
    loss = trainer.train_step(batch)
    print(f"Loss: {loss}")

挑战与未来方向

DPO虽然比传统的基于人类反馈的强化学习(RLHF)方法有它的优势,但咱们还是得承认,它面前也有不少难题,需要进一步的研究和开发:

a) 扩大到更大的模型:想想看,现在的语言模型越来越大,参数动不动就是数千亿。要把DPO用在这样的大家伙上,现在还是个难题。不过,研究人员也没闲着,他们正在琢磨一些技术,比如:

  • 高效的微调方法:像是LoRA(低秩调整)或者调整模型的前缀,这样可以让模型更快地学习。

  • 分布式训练优化:把训练任务分散到多个设备上,大家一起干,效率更高。

  • 梯度检查点和混合精度训练:保存一些中间的梯度结果,然后用不同的数值精度来训练,这样可以减少计算资源的消耗。

总之,DPO是个好工具,但要让它在更大的舞台上发挥作用,咱们还得继续努力。

下面来看下使用LoRA与DPO的示例:

from peft import LoraConfig, get_peft_model
class DPOTrainerWithLoRA(DPOTrainer):
    def __init__(self, model, ref_model, beta=0.1, lr=1e-5, lora_rank=8):
        lora_config = LoraConfig(
            r=lora_rank,
            lora_alpha=32,
            target_modules=["q_proj", "v_proj"],
            lora_dropout=0.05,
            bias="none",
            task_type="CAUSAL_LM"
        )
        self.model = get_peft_model(model, lora_config)
        self.ref_model = ref_model
        self.beta = beta
        self.optimizer = torch.optim.AdamW(self.model.parameters(), lr=lr)
# Usage
base_model = YourLargeLanguageModel()
dpo_trainer = DPOTrainerWithLoRA(base_model, ref_model
)

DPO技术虽然强大,但要让它迅速适应新任务或者在只有少量偏好数据的情况下还能表现出色,这可是个技术活。研究人员正在积极探索几种新方法来解决这个问题:

b) 多任务和少样本适应:想象一下,咱们得让DPO技术学会同时处理好几个不同的任务,或者在只有很少的样本数据时也能快速上手。这就需要一些特别的技巧了:

  • 元学习框架:这就像是给DPO上一堂速成课,让它能够快速学会新任务。

  • 基于提示的DPO微调:通过给DPO一些提示或者线索,帮助它更好地理解和适应新任务。

  • 迁移学习:这就好比是让DPO先学习一些通用的偏好,然后再把这些知识应用到特定的领域中去。

这些方法都在尝试让DPO变得更加灵活和强大,无论是面对多样的任务还是只有少量数据的挑战,都能游刃有余。

在现实世界中,人们的偏好往往不是那么明确,有时候甚至是相互矛盾的。这对DPO来说是个挑战,因为它需要能够处理这种模糊或冲突的数据。为了让DPO更健壮,研究人员正在考虑一些解决方案:

c) 处理模糊或冲突的偏好:要让DPO更好地应对现实世界中的复杂情况,研究人员正在探索以下几个方向:

  • 概率偏好建模:这种方法不再把偏好看作是非黑即白的,而是给每个偏好赋予一个概率值,这样就能更好地表达不确定性。

  • 主动学习以解决模糊性:通过主动寻求额外的信息或数据,来帮助模型解决那些不明确的偏好。

  • 多智能体偏好聚合:在多个人或多个模型有不同的偏好时,这种方法可以帮助整合这些不同的偏好,形成一个统一的视角。

举个例子,概率偏好建模可能看起来像这样:假设我们有两个选项A和B,用户对它们的偏好不是绝对的,而是有一定的概率性。在这种情况下,我们可以建立一个模型,不是简单地说用户喜欢A或B,而是说用户喜欢A的概率是70%,喜欢B的概率是30%。这样,DPO就可以在优化过程中考虑到这种概率性,从而更好地适应用户的不确定性。

下面来看个概率偏好建模的示例:

class ProbabilisticDPOTrainer(DPOTrainer):
    def compute_loss(self, pi_logps, ref_logps, yw_idxs, yl_idxs, preference_prob):
        # Compute log ratios
        pi_yw_logps, pi_yl_logps = pi_logps[yw_idxs], pi_logps[yl_idxs]
        ref_yw_logps, ref_yl_logps = ref_logps[yw_idxs], ref_logps[yl_idxs]

        log_ratio_diff = pi_yw_logps.sum(-1) - pi_yl_logps.sum(-1)
        loss = -(preference_prob * F.logsigmoid(self.beta * log_ratio_diff) +
                 (1 - preference_prob) * F.logsigmoid(-self.beta * log_ratio_diff))
        return loss.mean()
# Usage
trainer = ProbabilisticDPOTrainer(model, ref_model)
loss = trainer.compute_loss(pi_logps, ref_logps, yw_idxs, yl_idxs, preference_prob=0.8)  # 80% confidence in preference

  1. 先从pi_logpsref_logps中提取出偏好和不偏好的对数概率。

  2. 计算这两个对数概率的差值的和。

  3. 然后,用这个差值和偏好概率来计算损失值。这里用了logsigmoid函数,它可以帮助我们处理概率相关的计算。

  4. 最后,损失值取个平均,就得到了我们最终的损失。

使用的时候,我们先创建一个ProbabilisticDPOTrainer的实例,然后把模型、参考模型和其他必要的数据传进去。接着,调用compute_loss方法,传入所有需要的数据和80%的偏好概率,就可以得到损失值了。

这个损失值反映了模型输出和我们偏好之间的差距,训练的时候就是要让这个损失值尽可能小,这样模型就能更好地学习我们的偏好了。

DPO如果和其他的技术结合起来,可能会让我们的系统更强大、更全面。比如说:

d) 结合DPO和其他对齐技术:把DPO和其他一些让模型更符合人类期望的方法结合起来,可能会让我们得到一个既健壮又聪明的系统。这些方法包括:

  • 宪法AI原则:就像是给AI设定一套基本法则,确保它在任何情况下都能遵守这些规则。

  • 辩论和递归奖励建模:通过辩论来挖掘出更深层次的偏好,然后用这些信息来构建奖励模型。

  • 逆强化学习:尝试从观察到的行为中推断出背后的奖励机制,这样可以帮助我们更好地理解模型是如何做决策的。

举个例子,如果我们想要把DPO和宪法AI结合起来,可能会写出类似这样的代码:

class ConstitutionalDPOTrainer(DPOTrainer):
    def __init__(self, model, ref_model, beta=0.1, lr=1e-5, constraints=None):
        super().__init__(model, ref_model, beta, lr)
        self.constraints = constraints or []
    def compute_loss(self, pi_logps, ref_logps, yw_idxs, yl_idxs):
        base_loss = super().compute_loss(pi_logps, ref_logps, yw_idxs, yl_idxs)
        
        constraint_loss = 0
        for constraint in self.constraints:
            constraint_loss += constraint(self.model, pi_logps, ref_logps, yw_idxs, yl_idxs)
        
        return base_loss + constraint_loss
# 使用方法
def safety_constraint(model, pi_logps, ref_logps, yw_idxs, yl_idxs):
    # 在这里实现安全检查逻辑
    unsafe_score = compute_unsafe_score(model, pi_logps, ref_logps)
    return torch.relu(unsafe_score - 0.5)  # 如果不安全分数超过0.5,就进行惩罚

constraints = [safety_constraint]
trainer = ConstitutionalDPOTrainer(model, ref_model, constraints=constraints)

在这个例子中,我们创建了一个ConstitutionalDPOTrainer类,它在原有的DPO训练基础上增加了对宪法AI原则的约束。通过在损失函数中加入这些约束,可以确保模型在训练过程中不会违反我们设定的安全规则。

当我们要把DPO用在现实世界的应用中时,有几个关键点需要注意,这样我们才能确保模型的效果最佳:

a) 数据质量:咱们得保证用来训练的偏好数据是高质量的。这意味着:

  • 数据集要广泛,涵盖多种输入和我们期望的行为。

  • 注释要一致可靠,确保每次的偏好标记都是准确可信的。

  • 要平衡好不同类型的偏好,比如准确性、安全性和风格等。

b) 超参数调整:虽然DPO的超参数没有RLHF那么多,但调整它们还是挺重要的:

  • β(beta):这个参数决定了咱们在满足偏好和保持模型不偏离原始状态之间如何取舍。一般从0.1到0.5开始尝试。

  • 学习率:要比通常的微调学习率低一些,大概在1e-6到1e-5之间。

  • 批量大小:用大一点的批量,比如32到128,这样通常更适合偏好学习。

c) 迭代细化:DPO可以用迭代的方式来不断优化:

  1. 首先,用DPO来训练一个初始的模型。

  2. 然后,用这个训练好的模型来生成新的响应。

  3. 接下来,在这些新生成的响应上收集更多的偏好数据。

  4. 最后,用这些新数据来重新训练模型,让模型学习得更好。

通过这种方式,我们可以不断地反馈和优化模型,让它更好地适应我们的需要。

直接偏好优化(DPO)的性能表现真是让人眼前一亮。最近的研究对比了几种不同的训练技术,包括DPO、监督式微调(SFT)和近端策略优化(PPO),来看看它们如何影响大型语言模型(LLM)的性能,尤其是像GPT-4这样的模型。

结果表明,在所有这些训练方法中,GPT-4的表现越来越贴近人类的偏好,特别是在做摘要任务的时候。这个表格里头的数据显示,GPT-4生成的内容和人类评审者的评价之间的一致性越来越高,说明这个模型现在能够制作出那些不仅符合人类期望,而且几乎和人类自己创作的内容一样自然的东西。

简单来说,就是GPT-4通过DPO这样的训练,学会了怎么更好地理解人类想要什么样的内容,并且在实际生成文本的时候,能够更准确地满足这些期望。这对于提高LLM的实用性和可靠性来说,是个巨大的进步。

案例研究和实际应用

DPO的实用性在很多真实世界的例子中都得到了证明,而且还有一些基于DPO的变体也挺有意思的:

  • 迭代DPO:Snorkel团队在2023年开发了这个版本,它把拒绝采样和DPO结合起来,让训练数据的选择过程更加精细。通过多轮的偏好采样迭代,模型能够更好地泛化,不会过度拟合到那些嘈杂或者有偏见的数据上。

  • IPO(迭代偏好优化):Azar他们团队在2023年提出了这个概念,IPO在优化过程中加了个正则化项,这有助于防止过度拟合,因为这是偏好优化时常见的问题。这个改进让模型能够在遵循偏好和保持泛化能力之间找到平衡。

  • KTO(知识转移优化):Ethayarajh团队在2023年提出了这个更新的版本,KTO放弃了传统的二元偏好,转而专注于把知识从参考模型转移到策略模型上,这样可以让模型与人类的价值观更加平滑和一致地对齐。

  • 跨领域多模态DPO:Xu等人在2024年的研究中,展示了DPO在不同模态——比如文本、图像和音频——上的应用。这证明了DPO在使模型与人类偏好对齐方面的多样性,并且适用于多种类型的数据。这项研究凸显了DPO在构建能够处理复杂多模态任务的全面AI系统方面的潜力。

这些案例和变体展示了DPO不仅在理论上很吸引人,而且在实际应用中也非常有价值。通过这些方法,我们可以训练出更智能、更符合人类期望的AI模型。

结语

直接偏好优化(DPO)真是个突破性的进展,它让语言模型能更好地和咱们人类的喜好对上号。这玩意儿简单、效率高,而且还特别有效,简直就是搞研究的和实际应用者的超级利器。

用上DPO,咱们就能打造出两种都牛气的语言模型:一种是能力超群的,另一种是和人类的价值观、意图紧密结合的。这样的模型,不仅聪明,还懂得咱们想要啥,能更好地服务于咱们的需求。


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

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

相关文章

3.2-CoroutineScope/CoroutineContext:GlobalScope

文章目录 GlobalScope 是一个特殊的 CoroutineScope,它是一个单例的 CoroutineScope,我们可以直接用它启动协程: GlobalScope.launch {}我们在 IDE 用 GlobalScope 时会有一条黄线,提示的是要小心使用它因为容易用错、容易写出问…

标配M4芯片!苹果三款Mac新品蓄势待发

Mark Gurman透露, 苹果正在测试M4系列Mac新品,包含MacBook Pro、Mac mini和iMac,这些设备会在今年10月同台亮相。 根据曝光的开发者日志,上述Mac设备新品测试了两种M4芯片,一种是10核CPU10核GPU,一种是8核C…

无人机PX4飞控 | 电源系统详解与相关代码

无人机需要一个稳压电源用于飞控供电,同时用于电机、舵机、外围设备等的供电。 供电系统一般是一块电池或多块电池 电源模块通常用于“分离”飞行控制器的稳压电源,也用于测量电池电压和PX4学习笔记飞行器消耗的总电流。 PX4可以使用这些信息来推断剩余的…

Steam昨夜故障原因公布:遭DDoS攻击 与《黑神话》在线人数无关

24日晚,Steam平台突然崩溃,国内国外玩家纷纷反馈无法登录,相关话题迅速登上热搜。不少玩家猜测Steam崩溃是因为《黑神话:悟空》在线人数过多导致。 不过,根据完美世界竞技平台发布的公告,此次Steam崩溃是由…

新书推荐:《分布式商业生态战略:数字商业新逻辑与企业数字化转型新策略》

近两年,商业经济环境的不确定性越来越明显,市场经济受到疫情、技术、政策等多方因素影响越来越难以预测,黑天鹅事件时有发生。在国内外经济方面,国际的地缘政治对商业经济产生着重大的影响,例如供应链中断,…

Python画笔案例-010 绘制台阶图

1、绘制台阶图 通过 python 的turtle 库绘制一个台阶图的图案,如下图: 2、实现代码 引入新的命令:turtle.ycor(),获取当前海龟的y 坐标值,turtle.xcor()是获取海龟的 x 坐标值; turtle.setx(x) &#xff0…

NC 最长上升子序列(三)

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 描述 给定数组 arr…

C++ STL 容器

引言--多看案例 STL概念 STL(Standard Template Library, 标准模板库 ), 是惠普实验室开发的一系列软件的统 称。 STL 6 大组件 容器 : 作用 : 容纳存储数据 分类 : 序列式容器: 强调值的排序,每个元素均有固定的位置, 除非用删除或插…

深度学习与神经网络戴做讲解

深度学习指导,计算机视觉指导。检测,分割,视频处理,估计,人脸,目标跟踪,图像&视频检索/视频理解,医学影像,GAN/生成式/对抗式,图像生成/图像合成&#xf…

C++ 设计模式——迭代器模式

迭代器模式 C 设计模式——迭代器模式1. 主要组成成分2. 迭代器模式范例2.1 抽象迭代器2.2 抽象容器2.3 具体的迭代器2.4 具体的容器2.5 主函数示例 3. 迭代器 UML 图3.1 迭代器 UML 图解析 4. 迭代器模式的优点5. 迭代器模式的缺点6. 迭代器模式的适用场景7. 现代C中的迭代器总…

【kubernetes】相关pod的创建和命令

【书写方法】: 管理使用k8s集群时,创建资源的Yaml文件非常重要,如何快速手写呢? 根据命令提示书写: kubectl explain [资源名称]例如打算写pod资源文件时,可查看如下: # 查看pod下所有字段 …

20. elasticsearch进阶_数据可视化与日志管理

20. 数据可视化 本章概述一. `elasticsearch`实现数据统计1.1 创建用户信息索引1.1.1 控制台创建`aggs_user`索引1.1.2 `aggs_user`索引结构初始化1.1.3 `aggs_user`索引的`EO`对象1.1.4 用户类型枚举1.1.5 数据初始化1.2 内置统计聚合1.2.1 `terms`与`date_histogram``terms``…

RocketMQ指南(二)高级篇

高级篇 1. 高级功能 1.1 消息存储 分布式队列因为有高可靠性的要求,所以数据要进行持久化存储。 消息生成者发送消息MQ收到消息,将消息进行持久化,在存储中新增一条记录返回ACK给生产者MQ push 消息给对应的消费者,然后等待消…

一文学会Shell中case语句和函数

大家好呀!今天简单聊一聊Shell中的case语句与函数。在多选择情况下使用case语句将非常方便,同时,函数的学习和使用对于学好一门编程语言也是非常重要的。 一、case语句 case语句为多选择语句。可以用case语句匹配一个值与一个模式&#xff0c…

g++,gcc

由一个错误引发对这个问题的关注 上面我对于cpp文件利用gcc进行编译时产生的错误,起初我以为时三方库安装版本问题,反复卸载重装,发现仍然没有解决。然后我把目光聚焦到gcc编译这,发现把gcc改成g,编译就通过了。 g和 …

回归分析系列14.2— 正则化回归

16 正则化回归 16.1 简介 正则化回归是一种在回归模型中引入约束的技术,目的是防止模型过拟合并提高其泛化能力。最常见的正则化方法有岭回归(L2正则化)和套索回归(L1正则化)。这些方法通过添加惩罚项来限制模型参数的大小,从而降低模型的复杂度。 16.2 岭回归(L2正则…

OpenStack命令行发放云主机

source keystonerc_admin 查看环境变量 创建租户(项目) openstack project create hds 创建用户 openstack user create hds --password 1 --project hds 追加角色 openstack role add_member --user hds --project hds 创建规格 openstack flavor cr…

警惕.mkp勒索病毒:如何有效预防.mkp勒索病毒攻击

导言: 在数字化时代,网络安全问题日益严峻,勒索病毒作为一种极具破坏性的恶意病毒,严重威胁着个人用户和企业机构的数据安全。其中,.mkp勒索病毒以其强大的加密能力和广泛的传播方式,成为近期备受关注的网…

Linux 命令重定向介绍

今天给伙伴们分享一下Linux 命令重定向,希望看了有所收获。 我是公众号「想吃西红柿」「云原生运维实战派」作者,对云原生运维感兴趣,也保持时刻学习,后续会分享工作中用到的运维技术,在运维的路上得到支持和共同进步&…

Linux磁盘实用指令

目录 磁盘实用指令 磁盘实用指令 显示opt目录下的文件和目录 。 筛选出第一个符号为-的。 wc指令统计数目。 将符号-改为d就可以统计目录数目。 添加一个大写的r就可以递归的显示子目录了。 再与之前同理筛选出文件即可。 包括子文件夹的话加个大写的r即可 。 没有是因为默认情…