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∗(y1≻y2∣x)=1+exp(βlogπref(y2∣x)π∗(y2∣x)−βlogπref(y1∣x)π∗(y1∣x))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(yw∣x)πθ(yw∣x)−βlogπref(yl∣x)πθ(yl∣x))]
其中:
- ( σ \sigma σ ) 是 Sigmoid 函数。
- ( y w y_w yw ) 和 ( y l y_l yl ) 分别是人类标注的偏好和非偏好样本。
通过最大化该目标函数,策略模型会更倾向于生成被人类偏好的输出,同时抑制被人类不喜欢的输出。
4. 如何理解 DPO?
DPO 的优化过程可以从以下几个方面理解:
-
奖励重新参数化
通过将奖励模型嵌入策略模型输出的对数比值中,避免了显式训练奖励模型的过程。
隐式奖励定义为:
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(y∣x)πθ(y∣x) -
梯度优化
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πθ(yw∣x)−∇θlogπθ(yl∣x))]直观上,这意味着模型会:
- 提高 ( 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) ) 较大时)权重更高。
-
温度参数 ( β \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 πθ(y1∣x)=0.6,πθ(y2∣x)=0.4,πref(y1∣x)=0.5,πref(y2∣x)=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(y1∣x)πθ(y1∣x)=β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(y2∣x)πθ(y2∣x)=β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∗(y1≻y2∣x)=1+exp(r^θ(x,y2)−r^θ(x,y1))1
优化目标是让模型进一步增加 ( y 1 y_1 y1 ) 的概率,同时减少 ( y 2 y_2 y2 ) 的概率。
6. DPO 和 PPO 的区别
特性 | DPO | PPO |
---|---|---|
核心思想 | 直接基于人类偏好优化语言模型 | 基于奖励信号,通过强化学习优化策略 |
是否需要奖励模型 | 不需要 | 需要 |
优化目标 | 最大化偏好概率 | 最大化累计奖励 |
实现复杂度 | 较低 | 较高 |
稳定性 | 较高 | 可能出现 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(yw∣x)πθ(yw∣x)−logπref(yl∣x)πθ(yl∣x)))]
Key Points in the Formula:
- The loss directly optimizes the relative log-probabilities of preferred (( y w y_w yw)) versus dispreferred (( y l y_l yl)) responses.
- ( β \beta β ) controls the strength of KL-regularization between the policy and the reference model.
- ( σ ( ⋅ ) \sigma(\cdot) σ(⋅) ) represents the sigmoid function, ensuring the preference probabilities are modeled effectively.
- 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(y∣x)πθ(y∣x)
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πθ(yw∣x)−∇θlogπθ(yl∣x))]
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 πθ(yw∣x)=−0.2 ), ( π θ ( y l ∣ x ) = − 0.8 \pi_\theta(y_l | x) = -0.8 πθ(yl∣x)=−0.8 )
- ( π r e f ( y w ∣ x ) = − 0.3 \pi_{ref}(y_w | x) = -0.3 πref(yw∣x)=−0.3 ), ( π r e f ( y l ∣ x ) = − 0.7 \pi_{ref}(y_l | x) = -0.7 πref(yl∣x)=−0.7 )
Using the DPO loss formula:
-
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(yw∣x)πθ(yw∣x)=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(yl∣x)πθ(yl∣x)=log(−0.8)−log(−0.7)=0.06 -
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=β(rw−rl)=β(−0.17−0.06)=β(−0.23) -
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
Aspect | DPO | PPO |
---|---|---|
Reward Model | Implicitly modeled via log-probabilities. | Requires an explicit, learned reward model. |
Algorithm Type | Maximum Likelihood Estimation (MLE). | Reinforcement Learning with Policy Gradients. |
Training Complexity | Simpler and requires fewer hyperparameters. | More complex with value function updates and clipping mechanisms. |
Stability | More stable due to direct optimization. | Requires careful tuning to avoid divergence. |
Data Requirement | Relies on preference data directly. | Requires preference data and rollout data for updates. |
KL Regularization | Controlled by parameter ( β \beta β ). | Controlled by PPO clipping. |
Why is DPO Effective?
- Simplified Training Process: No need for reward model training or complex PPO pipelines.
- Implicit Reward Modeling: Avoids separate reward models and leverages pre-trained probabilities.
- Theoretical Guarantees: Based on Bradley-Terry models, ensuring consistency under reasonable assumptions.
- 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)是一种直接基于人类偏好进行优化的算法,旨在解决从人类偏好数据中训练出表现…...
springboot495基于java的物资综合管理系统的设计与实现(论文+源码)_kaic
摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统物资综合管理系统信息管理难度大,容错率低&am…...
JavaScript语言的编程范式
JavaScript:面向对象与函数式编程的双重奏 在编程世界中,JavaScript 无疑是一颗璀璨的明星,它不仅主宰着前端开发领域,还在后端、桌面应用、甚至物联网设备上展现出了强大的生命力。JavaScript 的魅力在于其灵活多变的编程范式&a…...
MyBatis动态 SQL 的执行原理
MyBatis 动态 SQL 是 MyBatis 框架中的一个重要特性,它允许开发者根据条件动态地生成不同的 SQL 语句。通过使用动态 SQL,开发者可以根据传入的参数动态地构建 SQL 查询,这样就避免了写多个 SQL 语句,提升了代码的灵活性和可维护性…...
PostgreSQL自带的一个命令行工具pg_waldump
pg_waldump是PostgreSQL自带的一个命令行工具,用于以人类可读的形式显示PostgreSQL数据库集簇的预写式日志(Write-Ahead Logging,WAL)。以下是对pg_waldump的详细介绍: 一、主要用途 pg_waldump主要用于调试或教育目…...
K8s 常用资源介绍
在 Kubernetes 中,资源指的是可以在集群中管理的对象(Objects)。这些资源用来定义和控制应用、服务、以及集群的状态。以下是 Kubernetes 中常见的资源及其用途介绍: 1. 工作负载资源(Workloads Resources)…...
基于 Python 大数据的拼团购物数据分析系统的设计与实现
标题:基于 Python 大数据的拼团购物数据分析系统的设计与实现 内容:1.摘要 本文设计并实现了一个基于 Python 大数据的拼团购物数据分析系统。通过对拼团购物数据的收集、清洗和分析,系统能够为商家提供用户行为分析、商品销售情况分析等功能,帮助商家更…...
finalshell密码解密
finalshell密码解密 在线网站运行java https://c.runoob.com/compile/10/ import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.IOException; import java.math.BigInteger; import java.security.MessageDigest; import java.security.N…...
利用Java爬虫速卖通按关键字搜索AliExpress商品
在这个信息爆炸的时代,数据的价值日益凸显。对于电商领域的从业者来说,能够快速获取商品信息成为了一项重要的技能。速卖通(AliExpress)作为全球领先的跨境电商平台,拥有海量的商品数据。本文将介绍如何使用Java语言编…...
每天40分玩转Django:Django缓存
一、Django缓存概述 在高并发的Web应用中,缓存是提高性能的重要手段。通过缓存频繁访问的数据,可以显著减少数据库查询和渲染模板的时间,从而加快响应速度,提升用户体验。Django提供了多层级的缓存方案,可以灵活地满足不同场景下的缓存需求。 Django支持的缓存方式包括: 视图…...
matrix-breakout-2-morpheus
将这一关的镜像导入虚拟机,出现以下页面表示导入成功 以root身份打开kali终端,输入以下命令,查看靶机ip arp-scan -l 根据得到的靶机ip,浏览器访问进入环境 我们从当前页面没有得到有用的信息,尝试扫描后台 发现有一个…...
第七节:GLM-4v-9b模型的视觉模型源码解读
文章目录 前言一、EVA2CLIPModel视觉编码模块结构二、PatchEmbedding图像分块源码解读三、GLM的transformer结构源码解读四、GLU映射方法源码解读前言 清华智普的GLM-4v-9b模型,作为优化的多模态大模型,特别适用于国内应用场景,解决了国外模型本地化不足的问题。本专栏提供…...
@RestControllerAdvice和@ControllerAdvice的区别
RestControllerAdvice 和 ControllerAdvice 都是 Spring 框架中的注解,用于定义全局的异常处理、数据绑定、模型属性共享等功能。它们的区别主要体现在返回值的处理和适用的场景。 1. ControllerAdvice 功能: ControllerAdvice 是 Spring MVC 提供的全局…...
c++ 类似与c# 线程 AutoResetEvent 和 ManualResetEvent的实现
在 C 中,没有直接类似于 C# 的 AutoResetEvent 和 ManualResetEvent 的类,但可以通过一些线程同步机制来实现类似的功能。C 提供了一些线程同步原语,如 std::condition_variable 和 std::mutex,这些可以用来模拟类似于 C# 中 Auto…...
简单贪吃蛇小游戏的设计与实现
文章目录 1、知识预备1.1 WIN32 API1.1.1 什么是WIN32 API1.1.2 了解部分WIN32 API1.1.2.1 控制台坐标1.1.2.2 控制台光标1.1.2.3 获取键盘按键情况 2.1 宽字符2.1.1 C语言的国际化2.1.2 宽字符的打印 2、 贪吃蛇游戏设计2.1 游戏开始2.2 游戏运行2.2.1 更新分数2.2.2 按键检测…...
动态规划<五> 子数组问题(含对应LeetcodeOJ题)
目录 引例 经典LeetcodeOJ题 1.第一题 2.第二题 3.第三题 4.第四题 5.第五题 6.第六题 7.第七题 引例 OJ传送门 Leetcode<53> 最大子数组和 画图分析: 使用动态规划解决 1.状态表示 dp[i]表示以i位置为结尾的所有子数组中的最大和 2.状态转移方程 子数组的问题可以…...
计算机网络——期末复习(4)协议或技术汇总、思维导图
思维导图 协议与技术 物理层通信协议:曼彻斯特编码链路层通信协议:CSMA/CD (1)停止-等待协议(属于自动请求重传ARQ协议):确认、否认、重传、超时重传、 (2)回退N帧协…...
在 RK3568 Linux 系统上使用 TUN 设备:详细教程
RK3568 是一个基于 ARM 架构的处理器,广泛应用于嵌入式系统和物联网设备。Linux 系统上的 TUN(网络隧道)设备提供了一个虚拟的网络接口,允许用户空间程序通过内核与网络栈进行交互。本文将详细介绍如何在 RK3568 上配置和使用 TUN 设备,适用于搭建 VPN 或容器网络等应用场…...
记录一次前端绘画海报的过程及遇到的几个问题
先看效果 使用工具 html2canvas import html2canvas from html2canvas// 绘画前的内容 我就不过多写了<div class"content" ref"contentRef" v-show"!imgShow"><img :src"getReplaceImg(friendObj.coverUrl)" alt"&qu…...
费舍尔信息矩阵全面讲述
费舍尔信息矩阵(Fisher Information Matrix) 费舍尔信息矩阵是统计学中一个非常重要的概念,尤其在参数估计、最大似然估计(MLE)和贝叶斯推断中具有广泛的应用。它反映了参数估计的不确定性程度,也可以用来…...
【CSS in Depth 2 精译_094】16.2:CSS 变换在动效中的应用(下)——导航菜单的文本标签“飞入”特效与交错渲染效果的实现
当前内容所在位置(可进入专栏查看其他译好的章节内容) 第五部分 添加动效 ✔️【第 16 章 变换】 ✔️ 16.1 旋转、平移、缩放与倾斜 16.1.1 变换原点的更改16.1.2 多重变换的设置16.1.3 单个变换属性的设置 16.2 变换在动效中的应用 16.2.1 放大图标&am…...
webpack3 webpack4 webpack5 有什么区别
性能优化 Webpack 3 性能优化主要依赖开发者手动配置各种插件。例如,在代码分割方面,需要通过CommonsChunkPlugin来实现公共模块的提取,其配置相对复杂。如果配置不当,可能会导致模块重复打包等问题,影响构建效率和最终…...
vue2 升级为 vite 打包
VUE2 中使用 Webpack 打包、开发,每次打包时间太久,尤其是在开发的过程中,本文记录一下 VUE2 升级Vite 步骤。 安装 Vue2 Vite 依赖 dev 依赖 vitejs/plugin-vue2": "^2.3.3 vitejs/plugin-vue2-jsx": "^1.1.1 vite&…...
[创业之路-206]:《华为战略管理法-DSTE实战体系》- 6-关键成功因素法CSF
目录 一、概述 1、定义与起源 2、关键成功因素的定义 3、关键成功因素的来源 4、关键成功因素的确认方法 5、关键成功因素法的步骤 6、关键成功因素法的应用 7、关键成功因素法的优势与局限性 二、 关键成功因素法CSF的应用 1、企业战略管理 2、项目管理 3、绩效管…...
WebRTC服务质量(08)- 重传机制(05) RTX机制
WebRTC服务质量(01)- Qos概述 WebRTC服务质量(02)- RTP协议 WebRTC服务质量(03)- RTCP协议 WebRTC服务质量(04)- 重传机制(01) RTX NACK概述 WebRTC服务质量(…...
Go的select的运行原理
Go语言中的select语句是一种专门用于处理多个通道(channel)操作的控制结构。其运行原理可以概括为以下几点: 1. 监听多个通道 select语句能够同时监听多个通道上的操作,这些操作可以是发送操作或接收操作。每个通道操作都对应se…...
操作002:HelloWorld
文章目录 操作002:HelloWorld一、目标二、具体操作1、创建Java工程①消息发送端(生产者)②消息接收端(消费者)③添加依赖 2、发送消息①Java代码②查看效果 3、接收消息①Java代码②控制台打印③查看后台管理界面 操作…...
3D坐标下,一点在某一线段上的左右方向的判定
3D坐标下,一点在某一线段上的左右方向的判定 代码 代码 #include <iostream> #include <Eigen/Dense>#define M_PI 3.1415926// 计算三点组成平面的参数和变换到XOY平面的变换矩阵 void computePlaneAndTransform(const Eigen::Vector3d& P1, cons…...
Visual Studio 使用 GitHub Copilot 与 IntelliCode 辅助编码 【AI辅助开发系列】
🎀🎀🎀【AI辅助编程系列】🎀🎀🎀 Visual Studio 使用 GitHub Copilot 与 IntelliCode 辅助编码Visual Studio 安装和管理 GitHub CopilotVisual Studio 使用 GitHub Copilot 扩展Visual Studio 使用 GitHu…...
Linux高级--2.4.5 靠协议头保证传输的 MAC/IP/TCP/UDP---协议帧格式
任何网络协议,都必须要用包头里面设置写特殊字段来标识自己,传输越复杂,越稳定,越高性能的协议,包头越复杂。我们理解这些包头中每个字段的作用要站在它们解决什么问题的角度来理解。因为没人愿意让包头那么复杂。 本…...
【UE5 C++课程系列笔记】14——GameInstanceSubsystem与动态多播的简单结合使用
效果 通过在关卡蓝图中触发GameInstanceSubsystem包含的委托,来触发所有绑定到这个委托的事件,从而实现跨蓝图通信。 步骤 1. 新建一个C类 这里命名为“SubsystemAndDelegate” 引入GameInstanceSubsystem.h,让“SubsystemAndDelegate”继承…...
PyQt实战——随机涂格子的特色进度条(十一)
系类往期文章: PyQt5实战——多脚本集合包,前言与环境配置(一) PyQt5实战——多脚本集合包,UI以及工程布局(二) PyQt5实战——多脚本集合包,程序入口QMainWindow(三&…...
.NET 8.0 项目升级到 .NET 9.0
本文项目从.NETCore3.1开始一直延续到目前,如果您没有升级过,请参考以下文章: .Net Core 2.2 升级到 .Net Core 3.1:https://blog.csdn.net/hefeng_aspnet/article/details/131259537 NetCore3.1或Net6.0项目升级到Net7.0&#x…...
用Python写炸金花游戏
文章目录 **代码分解与讲解**1. **扑克牌的生成与洗牌**2. **给玩家发牌**3. **打印玩家的手牌**4. **定义牌的优先级**5. **判断牌型**6. **确定牌型优先级**7. **比较两手牌的大小**8. **打印结果** 完整代码 以下游戏规则: 那么我们要实现的功能,就是…...
深度学习中的并行策略概述:2 Data Parallelism
深度学习中的并行策略概述:2 Data Parallelism 数据并行(Data Parallelism)的核心在于将模型的数据处理过程并行化。具体来说,面对大规模数据批次时,将其拆分为较小的子批次,并在多个计算设备上同时进行处…...
电商平台能挡住恶意网络爬虫的攻击吗?
爬虫盗取电商数据的步骤 爬虫技术作为一种数据获取工具,正逐渐成为电商平台的一大隐患。网络爬虫不仅能够获取商家关键信息并滋生仿冒网站,还能收集用户敏感信息,对用户的财产安全和隐私造成严重威胁。同时,爬虫攻击还会扰乱正常…...
Jenkins安装方法二
配置环境 和 Jenkins 官方的 yum 源之后进行安装 # 关闭防火墙 $ sudo systemctl stop firewalld $ sudo systemctl disable firewalld# 安装 EPEL 源 $ sudo yum install -y epel-release # 安装 wget $ sudo yum install -y wget# 配置 Jenkins 官方 yum 源 $ sudo wget -O /…...
Nginx性能优化全方案:打造一个高效服务器
提到前面:一个热衷技术,反对八股的资深研发,不卖课不引流,专注分享高质量教学博客。 如果觉得文章还不错的话,可以点赞收藏关注 支持一下,持续分享高质量技术博客。 如果有什么需要改进的地方还请大佬指出❌…...
【每日学点鸿蒙知识】沙箱目录、图片压缩、characteristicsArray、gm-crypto 国密加解密、通知权限
1、HarmonyOS 如何创建应用沙箱目录? 下载文件,想下载到自己新建的应用沙箱目录,有什么方法实现吗? fs.mkdir可以创建目录 参考文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis…...
XMLHttpRequest的基础知识
get请求 const xml new XMLHttpRequest(); xml.open("GET", "https://jsonplaceholder.typicode.com/todos/1", true); xml.onreadystatechange function () {if (xml.readyState 4 && xml.status 200) {console.log(xml.responseText);} }…...
学习笔记(C#基础书籍)-- C#基础篇
(12.24) C#介绍:《第一章》 特点:语法简洁,面向对象,支持绝大部分的web标准,强大的安全机制(垃圾回收器),兼容性好(遵循.NET的公共语言规范【CL…...
现在有什么赛道可以干到退休?
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家:点击跳转到网站 ,对人工智能感兴趣的小伙伴可以点进去看看。 最近,一则“90后无论男女都得65岁以后退休”的消息在多个网…...
【VScode】第三方GPT编程工具-CodeMoss安装教程
一、CodeMoss是什么? CodeMoss是一款集编程、学习和办公于一体的高效工具。它兼容多种主流平台,包括VSCode、IDER、Chrome插件、Web和APP等,支持插件安装,尤其在VSCode和IDER上的表现尤为出色。无论你是编程新手还是资深开发者&a…...
选择屏幕的用法
**************************定义控件*********************************** SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-002. SELECT-OPTIONS bukrs FOR iloa-bukrs . "公司代码 SELECT-OPTIONS swerk FOR iloa-swerk OBLIGATORY . "工厂 SELECT-O…...
VirtualBox下ubuntu23.04使用主机串口以及使用 minicom 进行串口调试
VirtualBox下ubuntu23.04使用主机串口以及使用 minicom 进行串口调试 一、打开设备管理器看主机(Window系统)是否识别出串口,我这边显示的串行通信端口是COM3 二、打开VirtualBox,设置串口和USB设备 串口设置: 启用…...
CH340系列芯片驱动电路·CH340系列芯片驱动!!!
目录 CH340基础知识 CH340常见类型 CH340引脚功能讲解 CH340驱动电路 CH340系列芯片数据手册 编写不易,仅供学习,请勿搬运,感谢理解 常见元器件驱动电路文章专栏连接 LM7805系列降压芯片驱动电路降压芯片驱动电路详解-CSDN博客 ME62…...
Unity中使用环形缓冲区平滑抖动值
环形缓冲数据结构,就是如下图一样的一个收尾相接的列表 在index指针指到4时,再往里添加数据,index就会指向0,并覆盖已有数据。 如何绘制Sin函数,请看下面一篇文章 Unity中如何实现绘制Sin函数图像-CSDN博客 接下来要…...
如何通过HTTP API插入或更新Doc
本文介绍如何通过HTTP API向Collection中插入或更新Doc。 说明 若调用本接口时Doc Id已存在,则等同于更新Doc;Doc Id不存在,则等同于插入Doc。 若调用本接口时不指定Doc Id,则等同于插入Doc,DashVector会自动生成Doc …...
RTMW:实时多人2D和3D 全人体姿态估计
单位:上海AI实验室 代码:mmpose/tree/main/projects/rtmpose 系列文章目录 RTMO: 面向高性能单阶段的实时多人姿态估计 目录 系列文章目录摘要一、背景二、相关工作2.1 自上而下的方法。2.2 坐标分类。2.3 3D Pose 3 实验方法3.1.1 任务限制3.1.3训练技…...
《Java源力物语》-3.空值猎手
~犬📰余~ “我欲贱而贵,愚而智,贫而富,可乎? 曰:其唯学乎” \quad 夜色渐深,在一处偏僻小径上,月光透过浓密的源力云层,在地面上投下斑驳的光影。String正独自练习着刚从…...