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

DPO(Direct Preference Optimization)算法解释:中英双语

中文版

DPO paper: https://arxiv.org/pdf/2305.18290

DPO 算法详解:从理论到实现

1. 什么是 DPO?

DPO(Direct Preference Optimization)是一种直接基于人类偏好进行优化的算法,旨在解决从人类偏好数据中训练出表现更优的语言模型的问题。它与传统的基于奖励建模的强化学习方法(如 PPO)不同,通过引入一种基于 Bradley-Terry 模型的参数化方法,将人类偏好概率直接与语言模型的输出概率相关联,从而避免了明确训练奖励模型的过程。


2. DPO 解决什么问题?

在 RLHF(Reinforcement Learning with Human Feedback)框架中,通常需要训练一个奖励模型来对语言模型的生成进行打分。然而,训练奖励模型和使用强化学习优化策略模型(如 PPO)通常会引入一些复杂性和不稳定性:

  • 奖励模型可能过拟合或偏离人类真实偏好。
  • 使用强化学习优化策略模型需要平衡探索和收敛,容易引发 KL 散度爆炸等问题。

DPO 提供了一种更直接的优化方式,通过重新参数化,将偏好建模直接嵌入语言模型优化中,从而绕过奖励建模,简化了训练流程。


3. DPO 的核心公式

DPO 的核心思想是通过 Bradley-Terry 偏好模型,将偏好概率建模为语言模型输出概率的对数比值,并引入温度参数 ( β \beta β ) 来控制 KL 惩罚强度。

核心公式

人类偏好概率建模公式如下:

p ∗ ( y 1 ≻ y 2 ∣ x ) = 1 1 + exp ⁡ ( β log ⁡ π ∗ ( y 2 ∣ x ) π ref ( y 2 ∣ x ) − β log ⁡ π ∗ ( y 1 ∣ x ) π ref ( y 1 ∣ x ) ) p^*(y_1 \succ y_2 | x) = \frac{1}{1 + \exp\left(\beta \log \frac{\pi^*(y_2|x)}{\pi_{\text{ref}}(y_2|x)} - \beta \log \frac{\pi^*(y_1|x)}{\pi_{\text{ref}}(y_1|x)}\right)} p(y1y2x)=1+exp(βlogπref(y2x)π(y2x)βlogπref(y1x)π(y1x))1

在实际中,我们通过最大化以下目标函数来优化参数化的策略模型 ( π θ \pi_\theta πθ ):

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 ) ) ] L_{\text{DPO}}(\pi_\theta; \pi_{\text{ref}}) = - \mathbb{E}_{(x, y_w, y_l) \sim D}\left[ \log \sigma\left(\beta \log \frac{\pi_\theta(y_w | x)}{\pi_{\text{ref}}(y_w | x)} - \beta \log \frac{\pi_\theta(y_l | x)}{\pi_{\text{ref}}(y_l | x)}\right) \right] LDPO(πθ;πref)=E(x,yw,yl)D[logσ(βlogπref(ywx)πθ(ywx)βlogπref(ylx)πθ(ylx))]

其中:

  • ( σ \sigma σ ) 是 Sigmoid 函数。
  • ( y w y_w yw ) 和 ( y l y_l yl ) 分别是人类标注的偏好和非偏好样本。

通过最大化该目标函数,策略模型会更倾向于生成被人类偏好的输出,同时抑制被人类不喜欢的输出。


4. 如何理解 DPO?

DPO 的优化过程可以从以下几个方面理解:

  1. 奖励重新参数化
    通过将奖励模型嵌入策略模型输出的对数比值中,避免了显式训练奖励模型的过程。
    隐式奖励定义为:
    r ^ θ ( x , y ) = β log ⁡ π θ ( y ∣ x ) π ref ( y ∣ x ) \hat{r}_\theta(x, y) = \beta \log \frac{\pi_\theta(y | x)}{\pi_{\text{ref}}(y | x)} r^θ(x,y)=βlogπref(yx)πθ(yx)

  2. 梯度优化
    DPO 的梯度公式为:
    ∇ θ L DPO = − β E ( x , y w , y l ) ∼ D [ σ ( r ^ θ ( x , y l ) − r ^ θ ( x , y w ) ) ⋅ ( ∇ θ log ⁡ π θ ( y w ∣ x ) − ∇ θ log ⁡ π θ ( y l ∣ x ) ) ] \nabla_\theta L_{\text{DPO}} = -\beta \mathbb{E}_{(x, y_w, y_l) \sim D}\left[ \sigma(\hat{r}_\theta(x, y_l) - \hat{r}_\theta(x, y_w)) \cdot (\nabla_\theta \log \pi_\theta(y_w | x) - \nabla_\theta \log \pi_\theta(y_l | x)) \right] θLDPO=βE(x,yw,yl)D[σ(r^θ(x,yl)r^θ(x,yw))(θlogπθ(ywx)θlogπθ(ylx))]

    直观上,这意味着模型会:

    • 提高 ( y w y_w yw ) 的生成概率。
    • 降低 ( y l y_l yl ) 的生成概率。
    • 偏差较大的样本(即 ( r ^ θ ( x , y l ) − r ^ θ ( x , y w ) \hat{r}_\theta(x, y_l) - \hat{r}_\theta(x, y_w) r^θ(x,yl)r^θ(x,yw) ) 较大时)权重更高。
  3. 温度参数 ( β \beta β )
    ( β \beta β ) 控制 KL 惩罚的强度,平衡策略模型与参考模型之间的分布差异。


5. 示例解析

假设我们有一个 Prompt,生成了两个候选回复 ( y 1 y_1 y1 ) 和 ( y 2 y_2 y2 ),并根据人类偏好得到以下信息:

  • ( y 1 y_1 y1 ) 被偏好 (( y w = y 1 y_w = y_1 yw=y1 )),( y 2 y_2 y2 ) 被不偏好 (( y l = y 2 y_l = y_2 yl=y2 ))。
  • 模型的输出概率为:
    π θ ( y 1 ∣ x ) = 0.6 , π θ ( y 2 ∣ x ) = 0.4 , π ref ( y 1 ∣ x ) = 0.5 , π ref ( y 2 ∣ x ) = 0.5 \pi_\theta(y_1|x) = 0.6, \quad \pi_\theta(y_2|x) = 0.4, \quad \pi_{\text{ref}}(y_1|x) = 0.5, \quad \pi_{\text{ref}}(y_2|x) = 0.5 πθ(y1x)=0.6,πθ(y2x)=0.4,πref(y1x)=0.5,πref(y2x)=0.5

计算隐式奖励:
r ^ θ ( x , y 1 ) = β log ⁡ π θ ( y 1 ∣ x ) π ref ( y 1 ∣ x ) = β log ⁡ 0.6 0.5 \hat{r}_\theta(x, y_1) = \beta \log \frac{\pi_\theta(y_1|x)}{\pi_{\text{ref}}(y_1|x)} = \beta \log \frac{0.6}{0.5} r^θ(x,y1)=βlogπref(y1x)πθ(y1x)=βlog0.50.6
r ^ θ ( x , y 2 ) = β log ⁡ π θ ( y 2 ∣ x ) π ref ( y 2 ∣ x ) = β log ⁡ 0.4 0.5 \hat{r}_\theta(x, y_2) = \beta \log \frac{\pi_\theta(y_2|x)}{\pi_{\text{ref}}(y_2|x)} = \beta \log \frac{0.4}{0.5} r^θ(x,y2)=βlogπref(y2x)πθ(y2x)=βlog0.50.4

偏好模型的概率:
p ∗ ( y 1 ≻ y 2 ∣ x ) = 1 1 + exp ⁡ ( r ^ θ ( x , y 2 ) − r ^ θ ( x , y 1 ) ) p^*(y_1 \succ y_2 | x) = \frac{1}{1 + \exp\left(\hat{r}_\theta(x, y_2) - \hat{r}_\theta(x, y_1)\right)} p(y1y2x)=1+exp(r^θ(x,y2)r^θ(x,y1))1

优化目标是让模型进一步增加 ( y 1 y_1 y1 ) 的概率,同时减少 ( y 2 y_2 y2 ) 的概率。


6. DPO 和 PPO 的区别
特性DPOPPO
核心思想直接基于人类偏好优化语言模型基于奖励信号,通过强化学习优化策略
是否需要奖励模型不需要需要
优化目标最大化偏好概率最大化累计奖励
实现复杂度较低较高
稳定性较高可能出现 KL 爆炸等问题

关于KL爆炸问题,可以参考笔者的另一篇博客:PPO 可能出现 KL 爆炸等问题的详细分析(KL Explosions in PPO): 中英双语


7. 总结

DPO 提供了一种高效、稳定的语言模型优化方法,适合在大规模人类偏好数据上训练更优的模型。相比于传统的 RLHF 方法,DPO 不仅简化了实现过程,还具备更强的理论一致性和实践可靠性。

Direct Preference Optimization (DPO): A Comprehensive Overview

What Problem Does DPO Solve?

Direct Preference Optimization (DPO) addresses the limitations of Reinforcement Learning with Human Feedback (RLHF) by offering a simpler and more direct optimization method. RLHF traditionally uses reward models and Proximal Policy Optimization (PPO) to align language models with human preferences. However, PPO introduces complexity due to the need for dynamic reward modeling and reinforcement learning updates, which involve policy rollouts and value function estimation.

DPO simplifies this process by directly optimizing the likelihood of human-preferred responses relative to dispreferred ones without requiring an explicit reward model or reinforcement learning steps. Instead, it reformulates the optimization as a maximum likelihood estimation (MLE) problem.

Core Formula of DPO

The central idea of DPO is to use a Bradley-Terry preference model to define probabilities for human preferences based on the log-probabilities output by the model.

Given:

  • ( π θ \pi_\theta πθ ): The policy (current model being optimized)
  • ( π r e f \pi_{ref} πref ): The reference policy (pre-trained model used as a baseline)
  • ( y w y_w yw ): Preferred response
  • ( y l y_l yl ): Dispreferred response
  • ( β \beta β ): Temperature hyperparameter controlling regularization strength

DPO models human preferences using the log-ratio of probabilities between the preferred and dispreferred outputs.

The loss function is:
L D P O ( π θ ; π r e f ) = − E ( x , y w , y l ) ∼ D [ log ⁡ σ ( β ( log ⁡ π θ ( y w ∣ x ) π r e f ( y w ∣ x ) − log ⁡ π θ ( y l ∣ x ) π r e f ( y l ∣ x ) ) ) ] L_{DPO}(\pi_\theta; \pi_{ref}) = -E_{(x, y_w, y_l) \sim D} \left[ \log \sigma \left( \beta \left( \log \frac{\pi_\theta(y_w | x)}{\pi_{ref}(y_w | x)} - \log \frac{\pi_\theta(y_l | x)}{\pi_{ref}(y_l | x)} \right) \right) \right] LDPO(πθ;πref)=E(x,yw,yl)D[logσ(β(logπref(ywx)πθ(ywx)logπref(ylx)πθ(ylx)))]

Key Points in the Formula:
  1. The loss directly optimizes the relative log-probabilities of preferred (( y w y_w yw)) versus dispreferred (( y l y_l yl)) responses.
  2. ( β \beta β ) controls the strength of KL-regularization between the policy and the reference model.
  3. ( σ ( ⋅ ) \sigma(\cdot) σ() ) represents the sigmoid function, ensuring the preference probabilities are modeled effectively.
  4. It eliminates the need for explicit reward modeling, treating model preferences as implicit rewards.

Understanding the Formula

1. Implicit Reward Calculation

DPO implicitly defines a reward function based on the policy and reference model:

r ^ θ ( x , y ) = β log ⁡ π θ ( y ∣ x ) π r e f ( y ∣ x ) \hat{r}_\theta(x, y) = \beta \log \frac{\pi_\theta(y | x)}{\pi_{ref}(y | x)} r^θ(x,y)=βlogπref(yx)πθ(yx)

This means the reward is proportional to the log-likelihood ratio between the current and reference models.

2. Optimization Objective

DPO optimizes the probability of preferred completions being ranked higher than dispreferred completions.

Specifically, it increases the likelihood of preferred completions (( y w y_w yw)) while decreasing the likelihood of dispreferred ones (( y l y_l yl)).

The gradient of the loss is:
∇ θ L D P O = − β E ( x , y w , y l ) ∼ D [ σ ( r ^ θ ( x , y l ) − r ^ θ ( x , y w ) ) ( ∇ θ log ⁡ π θ ( y w ∣ x ) − ∇ θ log ⁡ π θ ( y l ∣ x ) ) ] \nabla_\theta L_{DPO} = -\beta E_{(x, y_w, y_l) \sim D}\left[ \sigma(\hat{r}_\theta(x, y_l) - \hat{r}_\theta(x, y_w)) \left( \nabla_\theta \log \pi_\theta(y_w | x) - \nabla_\theta \log \pi_\theta(y_l | x) \right) \right] θLDPO=βE(x,yw,yl)D[σ(r^θ(x,yl)r^θ(x,yw))(θlogπθ(ywx)θlogπθ(ylx))]

3. Weighting by Confidence

The weighting term ( σ ( r ^ θ ( x , y l ) − r ^ θ ( x , y w ) ) \sigma(\hat{r}_\theta(x, y_l) - \hat{r}_\theta(x, y_w)) σ(r^θ(x,yl)r^θ(x,yw)) ) penalizes errors when the model incorrectly assigns higher rewards to dispreferred completions. This ensures that updates focus on examples where the model is most uncertain or wrong, leading to more effective training.


Example Analysis

Suppose we have the following preferences for prompts:

Input Prompt:
“What is the capital of France?”

Completions:

  • ( y w y_w yw ): “The capital of France is Paris.” (Preferred)
  • ( y l y_l yl ): “The capital of France is London.” (Dispreferred)

The log-probabilities from the current model (( π θ \pi_\theta πθ )) and reference model (( π r e f \pi_{ref} πref )) are:

  • ( π θ ( y w ∣ x ) = − 0.2 \pi_\theta(y_w | x) = -0.2 πθ(ywx)=0.2 ), ( π θ ( y l ∣ x ) = − 0.8 \pi_\theta(y_l | x) = -0.8 πθ(ylx)=0.8 )
  • ( π r e f ( y w ∣ x ) = − 0.3 \pi_{ref}(y_w | x) = -0.3 πref(ywx)=0.3 ), ( π r e f ( y l ∣ x ) = − 0.7 \pi_{ref}(y_l | x) = -0.7 πref(ylx)=0.7 )

Using the DPO loss formula:

  1. Calculate the log-probability ratios:
    r w = log ⁡ π θ ( y w ∣ x ) π r e f ( y w ∣ x ) = log ⁡ ( − 0.2 ) − log ⁡ ( − 0.3 ) = − 0.17 r_w = \log \frac{\pi_\theta(y_w | x)}{\pi_{ref}(y_w | x)} = \log(-0.2) - \log(-0.3) = -0.17 rw=logπref(ywx)πθ(ywx)=log(0.2)log(0.3)=0.17
    r l = log ⁡ π θ ( y l ∣ x ) π r e f ( y l ∣ x ) = log ⁡ ( − 0.8 ) − log ⁡ ( − 0.7 ) = 0.06 r_l = \log \frac{\pi_\theta(y_l | x)}{\pi_{ref}(y_l | x)} = \log(-0.8) - \log(-0.7) = 0.06 rl=logπref(ylx)πθ(ylx)=log(0.8)log(0.7)=0.06

  2. Compute the preference difference:
    Δ r = β ( r w − r l ) = β ( − 0.17 − 0.06 ) = β ( − 0.23 ) \Delta r = \beta (r_w - r_l) = \beta(-0.17-0.06)=\beta(-0.23) Δr=β(rwrl)=β(0.170.06)=β(0.23)

  3. Final loss:
    L = − log ⁡ σ ( Δ r ) = − log ⁡ σ ( − 0.23 β ) L = -\log \sigma(\Delta r) = -\log \sigma(-0.23\beta) L=logσ(Δr)=logσ(0.23β)

The optimization encourages increasing the likelihood of ( y w y_w yw ) while reducing ( y l y_l yl ).


DPO vs PPO: Key Differences

AspectDPOPPO
Reward ModelImplicitly modeled via log-probabilities.Requires an explicit, learned reward model.
Algorithm TypeMaximum Likelihood Estimation (MLE).Reinforcement Learning with Policy Gradients.
Training ComplexitySimpler and requires fewer hyperparameters.More complex with value function updates and clipping mechanisms.
StabilityMore stable due to direct optimization.Requires careful tuning to avoid divergence.
Data RequirementRelies on preference data directly.Requires preference data and rollout data for updates.
KL RegularizationControlled by parameter ( β \beta β ).Controlled by PPO clipping.

Why is DPO Effective?

  1. Simplified Training Process: No need for reward model training or complex PPO pipelines.
  2. Implicit Reward Modeling: Avoids separate reward models and leverages pre-trained probabilities.
  3. Theoretical Guarantees: Based on Bradley-Terry models, ensuring consistency under reasonable assumptions.
  4. Practical Applicability: Compatible with public preference datasets without requiring new data collection.

Implementation Example

import torch
import torch.nn.functional as Fdef dpo_loss(pi_logps, ref_logps, yw_idxs, yl_idxs, beta):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]pi_logratios = pi_yw_logps - pi_yl_logpsref_logratios = ref_yw_logps - ref_yl_logpslosses = -F.logsigmoid(beta * (pi_logratios - ref_logratios))rewards = beta * (pi_logps - ref_logps).detach()return losses, rewards

Conclusion

DPO offers a lightweight alternative to PPO for preference optimization by directly leveraging preference data without relying on complex reinforcement learning frameworks. It is particularly effective for aligning language models with human preferences and offers theoretical guarantees grounded in Bradley-Terry models. Given its simplicity and effectiveness, DPO is increasingly used for tasks requiring preference-based fine-tuning of large language models.

后记

2024年12月26日20点52分于上海,在GPT4o大模型辅助下完成。

相关文章:

DPO(Direct Preference Optimization)算法解释:中英双语

中文版 DPO paper: https://arxiv.org/pdf/2305.18290 DPO 算法详解:从理论到实现 1. 什么是 DPO? DPO(Direct Preference Optimization)是一种直接基于人类偏好进行优化的算法,旨在解决从人类偏好数据中训练出表现…...

Hostapd2.11解析笔记

最近在调试Hostapd,尝试通过配置使能一个支持MLO的AP,不过不知道hostapd conf里面哪些选项开启后可以使能,所以对Hostapd做一个整体解析. 简介 hostapd 是用于接入点和身份验证服务器的用户空间守护程序。它实现 IEEE 802.11 接入点管理、IEEE 802.1X/WPA/WPA2/WPA3/EAP 身份…...

js控制文字溢出显示省略号

.text{display: -webkit-box;overflow: hidden;white-space: normal;text-overflow: ellipsis;word-wrap: break-word;-webkit-line-clamp: 2;-webkit-box-orient: vertical; }本人有个需求就是在一个盒子内有一段文本,然后控制文本显示两行,第二行要显示…...

WPF+MVVM案例实战与特效(四十七)-实现一个路径绘图的自定义按钮控件

文章目录 1、案例效果2、创建自定义 PathButton 控件1、定义 PathButton 类2、设计样式与控件模板3、代码解释3、控件使用4、直接在 XAML 中绑定命令3、源代码获取4、总结1、案例效果 2、创建自定义 PathButton 控件 1、定义 PathButton 类 首先,我们需要创建一个新的类 Pat…...

操作002:HelloWorld

文章目录 操作002:HelloWorld一、目标二、具体操作1、创建Java工程①消息发送端(生产者)②消息接收端(消费者)③添加依赖 2、发送消息①Java代码②查看效果 3、接收消息①Java代码②控制台打印③查看后台管理界面 操作…...

odoo中@api.model, @api.depends和@api.onchange 装饰器的区别

文章目录 1. api.model用途特点示例 2. api.depends用途特点示例 3. api.onchange用途特点示例 总结 在 Odoo 中,装饰器(decorators)用于修饰方法,以指定它们的行为和触发条件。api.model、api.depends 和 api.onchange 是三个常用…...

有哪些精益工具可以帮助企业实现转型?

为了在激烈的市场竞争中立于不败之地,许多企业开始寻求通过精益转型来优化运营、降低成本、提高效率和客户满意度。然而,精益转型并非一蹴而就,而是需要一系列精益工具的辅助,这些工具能够帮助企业识别浪费、优化流程、提升质量&a…...

以太网帧结构

以太网帧结构 目前,我们局域网当中应用最广的技术或者协议啊,就是以太网。我们首先来看一下以太网的真结构。这块内容这里边再系统的来给大家去展开说一下,以太网真格式就如下面这个图。所示前面有八个字节,是用于时钟同步的&…...

QT调用Sqlite数据库

QT设计UI界面,后台访问数据库,实现数据库数据的增删改查。 零售商店系统 数据库表: 分别是顾客表,订单详情表,订单表,商品表 表内字段详情如下: 在QT的Pro文件中添加sql,然后添加头…...

前端

前端页面 Web页面 PC端程序页面 移动端APP页面 ... HTML页面 HTML超文本标记页面 超文本:文本,声音,图片,视频,表格,链接 标记:由许多标签组成 HTML页面运行到浏览器上面 vscode便捷插件使用 vs…...

【Git】—— 使用git操作远程仓库(gitee)

目录 一、远程仓库常用命令 1、从远程仓库克隆项目 2、查看关联的远程仓库 3、添加关联的远程仓库 4、移除关联的远程仓库 5、将本地仓库推送到远程仓库 6、从远程仓库拉取项目 二、分支命令 1、查询分支 2、创建分支 3、切换分支 4、推送到远程分支 5、合并分支 …...

Paddler负载均衡器

Paddler负载均衡器 Paddler本身是用Go语言编写的,没有直接的Python接口,但可以通过以下方式在Python中使用: 执行命令行调用 在Python中可以使用 subprocess 模块来调用Paddler的命令行工具,实现负载均衡功能 。例如: import subprocessdef start_paddler_agent():com…...

OSCP - Proving Grounds - Slort

主要知识点 文件包含 windows的reveseshell 具体步骤 执行nmap,依旧是很多端口开放,尝试了ftp,smb等均失败 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-10-13 12:00 UTC Nmap scan report for 192.168.53.53 Host is up (0.00095s latency). Not sho…...

YoloV9改进策略:Head改进|DynamicHead,利用注意力机制统一目标检测头部|即插即用

摘要 论文介绍 本文介绍了一种名为DynamicHead的模块,该模块旨在通过注意力机制统一目标检测头部,以提升目标检测的性能。论文详细阐述了DynamicHead的工作原理,并通过实验证明了其在COCO基准测试上的有效性和效率。 创新点 DynamicHead模块的创新之处在于它首次尝试在一…...

BFD综合详细实验配置案例

前言 本实验的目的是通过配置BGP(边界网关协议)、OSPF(开放式最短路径优先协议)、VRRP(虚拟路由冗余协议)以及BFD(双向转发检测)等网络协议,模拟企业级网络环境中的多协…...

自然语言处理与知识图谱的融合与应用

目录 前言1. 知识图谱与自然语言处理的关系1.1 知识图谱的定义与特点1.2 自然语言处理的核心任务1.3 二者的互补性 2. NLP在知识图谱构建中的应用2.1 信息抽取2.1.1 实体识别2.1.2 关系抽取2.1.3 属性抽取 2.2 知识融合2.3 知识推理 3. NLP与知识图谱融合的实际应用3.1 智能问答…...

c# RSA加解密工具,.netRSA加解密工具

软件介绍 名称: c# RSA加解密工具,.netRSA加解密工具依赖.net版本: .net 8.0工具类型: WinForm源码下载 c# RSA加解密工具,.netRSA加解密工具 依赖项 WinFormsRSA.csproj <Project...

Metricbeat安装教程——Linux——Metricbeat监控ES集群

Metricbeat安装教程——Linux 一、安装 下载安装包&#xff1a; 官网下载地址&#xff1a;https://www.elastic.co/cn/downloads/beats/metricbeat 上传包到linux 切换到安装目录下 解压&#xff1a;tar -zxvf metricbeat-7.17.1-linux-x86_64.tar.gz 重命名安装文件夹 mv met…...

一万多字拆解java中——“ 注解 ”的一切(三)(已完结)

前言&#xff1a; 咱们书接上回&#xff0c;上次按照框架讲了 第一篇&#xff0c;我们讲到了&#xff1a; ①注解的引入&#xff08;简单概述&#xff09;&#xff1a;在jdk5.0的时候 ②注解与注释的区别&#xff1a; 注释 是为了帮助人类阅读代码&#xff0c;不会对程序的执…...

记一次rac故障原因分析(虚拟化平台)

一 现象描述 XX客户于1月14号凌晨业务中断&#xff0c;检查数据库发现数据库集群宕机。 XX客户于2月14号春节初五早上业务异常&#xff0c;连接数据库无响应。 二 问题详细诊断 1月14号故障 1月14号凌晨2点&#xff0c;客户反馈业务中断&#xff0c;发现节点1无法连接&…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

省略号和可变参数模板

本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准

城市路内停车管理常因行道树遮挡、高位设备盲区等问题&#xff0c;导致车牌识别率低、逃费率高&#xff0c;传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法&#xff0c;正成为破局关键。该设备安装于车位侧方0.5-0.7米高度&#xff0c;直接规避树枝遮…...

ThreadLocal 源码

ThreadLocal 源码 此类提供线程局部变量。这些变量不同于它们的普通对应物&#xff0c;因为每个访问一个线程局部变量的线程&#xff08;通过其 get 或 set 方法&#xff09;都有自己独立初始化的变量副本。ThreadLocal 实例通常是类中的私有静态字段&#xff0c;这些类希望将…...

Docker、Wsl 打包迁移环境

电脑需要开启wsl2 可以使用wsl -v 查看当前的版本 wsl -v WSL 版本&#xff1a; 2.2.4.0 内核版本&#xff1a; 5.15.153.1-2 WSLg 版本&#xff1a; 1.0.61 MSRDC 版本&#xff1a; 1.2.5326 Direct3D 版本&#xff1a; 1.611.1-81528511 DXCore 版本&#xff1a; 10.0.2609…...

高保真组件库:开关

一:制作关状态 拖入一个矩形作为关闭的底色:44 x 22,填充灰色CCCCCC,圆角23,边框宽度0,文本为”关“,右对齐,边距2,2,6,2,文本颜色白色FFFFFF。 拖拽一个椭圆,尺寸18 x 18,边框为0。3. 全选转为动态面板状态1命名为”关“。 二:制作开状态 复制关状态并命名为”开…...