大模型学习笔记 - LLM 对齐优化算法 DPO

2024-08-25 02:04

本文主要是介绍大模型学习笔记 - LLM 对齐优化算法 DPO,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

LLM - DPO

  • LLM - DPO
    • DPO 概述
    • DPO 目标函数推导
    • DPO 目标函数梯度的推导

DPO 概述

大模型预训练是从大量语料中进行无监督学习,语料库内容混杂,训练的目标是语言模型损失,任务是next token prediction,生成的token 不可控,为了让大模型能生成符合人类偏好的答案(无毒无害等)一般都会进行微调和人类对齐,通常采用的方法是 基于人类反馈的强化学习方法RLHF. RLHF 是一个复杂且经常不稳定的过程,RLHF 分为2个步骤:

  1. 首先,训练一个SFT模型
  2. 然后,训练一个反映人类偏好的奖励模型 (Reward model),
  3. 最后,使用强化学习微调大型无监督 LM,以最大化这种估计奖励,而不会偏离原始模型太远。

DPO论文证明现有方法使用的基于 RL 的目标可以通过简单的二元交叉熵目标精确优化,大大简化了偏好学习管道。我们的方法利用了奖励模型参数化的特定选择,它可以在没有 RL 训练循环的情况下以封闭形式提取其最优策略。DPO是稳定的、高性能的、计算量轻的,在微调或执行显著的超参数调优时不需要从LM中采样。我们的实验表明,DPO可以微调LM,使其与人类偏好保持一致,甚至比现有方法更好。

核心就是:不需要显示地训练一个Reward Model,而是利用 从奖励函数到最优策略的解析映射,从而将 奖励函数上的偏好损失函数转换为策略上的偏好损失函数。
具体做法是给定人类对模型响应的偏好数据集,DPO使用简单的二元交叉熵目标优化策略,而无需在训练期间明确学习奖励函数或从策略中采样

DPO 目标函数推导

首先,DPO的目标函数是根据RLHF的2步骤的目标函数进行推理得到的。我们先看 RLHF步骤中的 目标函数:

一个是RewardModel:
m a x r θ E ( x , y w , y l ) ∈ D [ l o g ( σ ( r ϕ ( x , y w ) − r ϕ ( x , y l ) ) ) ] max_{r_{\theta}}E_{(x,y_w,y_l)\in D}[log(\sigma(r_{\phi}(x,y_w) - r_{\phi}(x,y_l)))] maxrθE(x,yw,yl)D[log(σ(rϕ(x,yw)rϕ(x,yl)))]
一个是RL目标函数:
m a x π θ E ( x ∈ D , y ∈ π θ ( y ∣ x ) ) [ r ϕ ( x , y ) ] − β D K L [ π θ ( y ∣ x ) ∣ ∣ π r e f ( y ∣ x ) ] max_{\pi_{\theta}}E_{(x \in D,y \in \pi_{\theta}(y|x))}[r_{\phi}(x,y)] - \beta D_{KL}[\pi_{\theta}(y|x)||\pi_{ref}(y|x)] maxπθE(xD,yπθ(yx))[rϕ(x,y)]βDKL[πθ(yx)∣∣πref(yx)]

下面我们针对RL的目标函数进行推导,看DPO的目标是如何得到的。

  1. 对于RL目标函数进行展开计算:
    m a x π θ E ( x ∈ D , y ∈ π θ ( y ∣ x ) ) [ r ϕ ( x , y ) ] − β D K L [ π θ ( y ∣ x ) ∣ ∣ π r e f ( y ∣ x ) ] max_{\pi_{\theta}}E_{(x \in D,y \in \pi_{\theta}(y|x))}[r_{\phi}(x,y)] - \beta D_{KL}[\pi_{\theta}(y|x)||\pi_{ref}(y|x)] maxπθE(xD,yπθ(yx))[rϕ(x,y)]βDKL[πθ(yx)∣∣πref(yx)]
    = m a x π θ E ( x ∈ D , y ∈ π θ ( y ∣ x ) ) [ r ϕ ( x , y ) ] − β l o g π θ ( y ∣ x ) π r e f ( y ∣ x ) =max_{\pi_{\theta}}E_{(x \in D,y \in \pi_{\theta}(y|x))}[r_{\phi}(x,y)] - \beta log\frac{\pi_{\theta}(y|x)}{\pi_{ref}(y|x)} =maxπθE(xD,yπθ(yx))[rϕ(x,y)]βlogπref(yx)πθ(yx)
    = m i n π θ E ( x ∈ D , y ∈ π θ ( y ∣ x ) ) [ β l o g π θ ( y ∣ x ) π r e f ( y ∣ x ) − r ϕ ( x , y ) ] =min_{\pi_{\theta}}E_{(x \in D,y \in \pi_{\theta}(y|x))}[\beta log\frac{\pi_{\theta}(y|x)}{\pi_{ref}(y|x)} - r_{\phi}(x,y)] =minπθE(xD,yπθ(yx))[βlogπref(yx)πθ(yx)rϕ(x,y)]
    = m i n π θ E ( x ∈ D , y ∈ π θ ( y ∣ x ) ) [ l o g π θ ( y ∣ x ) π r e f ( y ∣ x ) − 1 β r ϕ ( x , y ) ] =min_{\pi_{\theta}}E_{(x \in D,y \in \pi_{\theta}(y|x))}[log\frac{\pi_{\theta}(y|x)}{\pi_{ref}(y|x)} - \frac{1}{\beta }r_{\phi}(x,y)] =minπθE(xD,yπθ(yx))[logπref(yx)πθ(yx)β1rϕ(x,y)]
    = m i n π θ E ( x ∈ D , y ∈ π θ ( y ∣ x ) ) [ l o g π θ ( y ∣ x ) π r e f ( y ∣ x ) − l o g ( e 1 β r ϕ ( x , y ) ) ] =min_{\pi_{\theta}}E_{(x \in D,y \in \pi_{\theta}(y|x))}[log\frac{\pi_{\theta}(y|x)}{\pi_{ref}(y|x)} - log(e^{\frac{1}{\beta }r_{\phi}(x,y)})] =minπθE(xD,yπθ(yx))[logπref(yx)πθ(yx)log(eβ1rϕ(x,y))]
    = m i n π θ E ( x ∈ D , y ∈ π θ ( y ∣ x ) ) [ l o g π θ ( y ∣ x ) π r e f ( y ∣ x ) e 1 β r ϕ ( x , y ) ] =min_{\pi_{\theta}}E_{(x \in D,y \in \pi_{\theta}(y|x))}[log\frac{\pi_{\theta}(y|x)}{\pi_{ref}(y|x)e^{\frac{1}{\beta }r_{\phi}(x,y)}}] =minπθE(xD,yπθ(yx))[logπref(yx)eβ1rϕ(x,y)πθ(yx)]

  2. 还是针对RL目标函数,假定在奖励函数 r r r下,最优策略为 π r \pi_{r} πr,那么 RL的目标就是要得到最优策略,因此RL的目标可以等价为 最小化 π θ \pi_{\theta} πθ π r \pi_{r} πr的KL散度,即:
    m a x π θ E ( x ∈ D , y ∈ π θ ( y ∣ x ) ) [ r ϕ ( x , y ) ] − β D K L [ π θ ( y ∣ x ) ∣ ∣ π r e f ( y ∣ x ) ] max_{\pi_{\theta}}E_{(x \in D,y \in \pi_{\theta}(y|x))}[r_{\phi}(x,y)] - \beta D_{KL}[\pi_{\theta}(y|x)||\pi_{ref}(y|x)] maxπθE(xD,yπθ(yx))[rϕ(x,y)]βDKL[πθ(yx)∣∣πref(yx)]
    = m i n π θ D K L [ π θ ( y ∣ x ) ∣ ∣ π r ( y ∣ x ) ] =min_{\pi_{\theta}}D_{KL}[\pi_{\theta}(y|x) || \pi_{r}(y|x)] =minπθDKL[πθ(yx)∣∣πr(yx)]
    = m i n π θ E ( x ∈ D , y ∈ π θ ( y ∣ x ) ) [ l o g π θ ( y ∣ x ) π r ( y ∣ x ) ] =min_{\pi_{\theta}}E_{(x \in D,y \in \pi_{\theta}(y|x))}[log\frac{\pi_{\theta}(y|x)}{\pi_{r}(y|x)}] =minπθE(xD,yπθ(yx))[logπr(yx)πθ(yx)]

  3. 综合上面两个推导,可以得到
    m i n π θ E ( x ∈ D , y ∈ π θ ( y ∣ x ) ) [ l o g π θ ( y ∣ x ) π r e f ( y ∣ x ) e 1 β r ϕ ( x , y ) ] = m i n π θ E ( x ∈ D , y ∈ π θ ( y ∣ x ) ) [ l o g π θ ( y ∣ x ) π r ( y ∣ x ) ] min_{\pi_{\theta}}E_{(x \in D,y \in \pi_{\theta}(y|x))}[log\frac{\pi_{\theta}(y|x)}{\pi_{ref}(y|x)e^{\frac{1}{\beta }r_{\phi}(x,y)}}] =min_{\pi_{\theta}}E_{(x \in D,y \in \pi_{\theta}(y|x))}[log\frac{\pi_{\theta}(y|x)}{\pi_{r}(y|x)}] minπθE(xD,yπθ(yx))[logπref(yx)eβ1rϕ(x,y)πθ(yx)]=minπθE(xD,yπθ(yx))[logπr(yx)πθ(yx)]
    从而可知 π r ( y ∣ x ) \pi_r(y|x) πr(yx) π r e f ( y ∣ x ) e 1 β r ϕ ( x , y ) \pi_{ref}(y|x)e^{\frac{1}{\beta }r_{\phi}(x,y)} πref(yx)eβ1rϕ(x,y) 正相关
    因此设 π r ( y ∣ x ) = 1 Z ( x ) π r e f ( y ∣ x ) e 1 β r ϕ ( x , y ) \pi_r(y|x) = \frac{1}{Z(x)}\pi_{ref}(y|x)e^{\frac{1}{\beta }r_{\phi}(x,y)} πr(yx)=Z(x)1πref(yx)eβ1rϕ(x,y)
    其中 Z ( x ) = ∑ y π r e f ( y ∣ x ) e 1 β r ϕ ( x , y ) Z(x) = \sum_y \pi_{ref}(y|x)e^{\frac{1}{\beta }r_{\phi}(x,y)} Z(x)=yπref(yx)eβ1rϕ(x,y)这里 Z ( x ) Z(x) Z(x) 函只和 基线策略 π r e f \pi_{ref} πref有关,而不依赖与策略函数 π \pi π,其目的是使得右边满足取值在[0,1]范围内,相当于起到一个归一化作用。( π r \pi_{r} πr本质是一个概率,概率的特性之一就是归一化的,所以这里要有一个归一化项)

  4. 为了根据最优策略 π r \pi_r πr,基线策略 π r e f \pi_{ref} πref 和位置的分配函数 Z ( x ) Z(x) Z(x),来表示奖励函数,我们对 π r ( y ∣ x ) = 1 Z ( x ) π r e f ( y ∣ x ) e 1 β r ϕ ( x , y ) \pi_r(y|x) = \frac{1}{Z(x)}\pi_{ref}(y|x)e^{\frac{1}{\beta }r_{\phi}(x,y)} πr(yx)=Z(x)1πref(yx)eβ1rϕ(x,y) 进行推导,两边取对数,然后进行推导,得到 r ϕ ( x , y ) r_{\phi}(x,y) rϕ(x,y)

    • l o g π r ( y ∣ x ) = l o g ( 1 Z ( x ) π r e f ( y ∣ x ) e 1 β r ϕ ( x , y ) ) log \pi_r(y|x) = log (\frac{1}{Z(x)}\pi_{ref}(y|x)e^{\frac{1}{\beta }r_{\phi}(x,y)}) logπr(yx)=log(Z(x)1πref(yx)eβ1rϕ(x,y)) (取log)
      l o g π r ( y ∣ x ) = l o g ( π r e f ( y ∣ x ) ) + l o g ( e 1 β r ϕ ( x , y ) ) − l o g ( Z ( x ) ) log \pi_r(y|x) = log (\pi_{ref}(y|x))+log(e^{\frac{1}{\beta }r_{\phi}(x,y)}) - log(Z(x)) logπr(yx)=log(πref(yx))+log(eβ1rϕ(x,y))log(Z(x)) (拆分对数运行)
      l o g ( e 1 β r ϕ ( x , y ) ) = l o g π r ( y ∣ x ) − l o g ( π r e f ( y ∣ x ) ) + l o g ( Z ( x ) ) log(e^{\frac{1}{\beta }r_{\phi}(x,y)}) = log \pi_r(y|x) -log (\pi_{ref}(y|x))+log(Z(x)) log(eβ1rϕ(x,y))=logπr(yx)log(πref(yx))+log(Z(x))
      1 β r ϕ ( x , y ) = l o g π r ( y ∣ x ) − l o g ( π r e f ( y ∣ x ) ) + l o g ( Z ( x ) ) {\frac{1}{\beta }r_{\phi}(x,y)} = log \pi_r(y|x) -log (\pi_{ref}(y|x))+log(Z(x)) β1rϕ(x,y)=logπr(yx)log(πref(yx))+log(Z(x))
      r ϕ ( x , y ) = β l o g π r ( y ∣ x ) − β l o g ( π r e f ( y ∣ x ) ) + l o g ( Z ( x ) ) r_{\phi}(x,y) = \beta log \pi_r(y|x) -\beta log (\pi_{ref}(y|x))+log(Z(x)) rϕ(x,y)=βlogπr(yx)βlog(πref(yx))+log(Z(x))
      r ϕ ( x , y ) = β l o g π r ( y ∣ x ) π r e f ( y ∣ x ) + l o g ( Z ( x ) ) r_{\phi}(x,y) = \beta log \frac{\pi_r(y|x)}{\pi_{ref}(y|x)}+log(Z(x)) rϕ(x,y)=βlogπref(yx)πr(yx)+log(Z(x))

    假定最优奖励函数 r ∗ r* r下对应的最优模型策略是 π ∗ \pi* π,那么
    r ∗ ϕ ( x , y ) = β l o g π ∗ r ( y ∣ x ) π r e f ( y ∣ x ) + l o g ( Z ( x ) ) r*_{\phi}(x,y) = \beta log \frac{\pi*_r(y|x)}{\pi_{ref}(y|x)}+log(Z(x)) rϕ(x,y)=βlogπref(yx)πr(yx)+log(Z(x))

  5. 考虑到最优策略的不确定性,因此使用参数化的策略 π θ \pi_{\theta} πθ来表示,相应的奖励函数则表示为 r θ ( x , y ) = β l o g π θ ( y ∣ x ) π r e f ( y ∣ x ) + l o g ( Z ( x ) ) r_{\theta}(x,y) = \beta log \frac{\pi_{\theta}(y|x)}{\pi_{ref}(y|x)}+log(Z(x)) rθ(x,y)=βlogπref(yx)πθ(yx)+log(Z(x))

  6. 此时,我们可以为策略 π θ \pi_{\theta} πθ构建最大似然目标,类似于奖励建模方法,最大化偏好答案于非偏好答案奖励的差值。那么我们的策略目标变为: L D P O ( θ ) = − E x , y w , y l ∈ D [ l o g σ ( r θ ( x , y w ) − r θ ( x , y l ) ) ] L_{DPO}(\theta) = -E_{{x,y_w,y_l}\in D}[log\sigma(r_{\theta}(x,y_w) - r_{\theta}(x,y_l))] LDPO(θ)=Ex,yw,ylD[logσ(rθ(x,yw)rθ(x,yl))]
    = − E x , y w , y l ∈ D [ l o g σ ( β l o g π θ ( y w ∣ x ) π r e f ( y w ∣ x ) − β l o g π θ ( y l ∣ x ) π r e f ( y l ∣ x ) ) ] = -E_{{x,y_w,y_l}\in D}[log\sigma(\beta log\frac{\pi_{\theta}(y_w|x)}{\pi_{ref}(y_w|x)} - \beta log\frac{\pi_{\theta}(y_l|x)}{\pi_{ref}(y_l|x)})] =Ex,yw,ylD[logσ(βlogπref(ywx)πθ(ywx)βlogπref(ylx)πθ(ylx))]

上面推导出奖励函数 r 与策略 π \pi π的关系,就是为了把 RL 目标函数中的 r 替换掉,从而实现DPO的目标,不需要训练奖励函数。

DPO 这个目标函数的意义:

  • 当一个答案是好的答案时,我们要尽可能增大其被策略模型生成的概率(且这个的概率尽可能大于被基线模型生成的概率,举个例子,既然是好的,就要比初期更大胆的趋近之)
  • 当一个答案是差的答案时,我们要尽可能降低其被策略模型生成的概率(且这个的概率尽可能小于被基线模型生成的概率,换言之,既然是差的,则要比初期尽可能远离之)

由于我们追求的是让目标函数最大(虽说我们一般要求loss最小化,但毕竟整个目标函数的最前面加了个负号),故意味着针对大括号里的这个式子而言 [ l o g σ ( β l o g π θ ( y w ∣ x ) π r e f ( y w ∣ x ) − β l o g π θ ( y l ∣ x ) π r e f ( y l ∣ x ) ) ] [log\sigma(\beta log\frac{\pi_{\theta}(y_w|x)}{\pi_{ref}(y_w|x)} - \beta log\frac{\pi_{\theta}(y_l|x)}{\pi_{ref}(y_l|x)})] [logσ(βlogπref(ywx)πθ(ywx)βlogπref(ylx)πθ(ylx))]

我们希望左边尽可能大,而右边尽可能小,那左边、右边分别意味着什么呢?

  • 左半部分代表生成good response相较于初期生成good response的累积概率差值
  • 右半部分代表生成bad response 相较于初期生成 bad response 的累计概率差值

有三种可能的情况:

  • 左边变大,右边变小,理想情况,good response相对概率提升,bad response相对概率下降
  • 左边变小,右边更小,good response相对概率下降,但是bad response相对概率下降的更多,生成的时候还是倾向于good response
  • 左边变的更大,右边只大了一点点,和上一条 同理

DPO 目标函数梯度的推导

我们看DPO目标函数的梯度如何推导:
L D P O ( θ ) = − E x , y w , y l ∈ D [ l o g σ ( β l o g π θ ( y w ∣ x ) π r e f ( y w ∣ x ) − β l o g π θ ( y l ∣ x ) π r e f ( y l ∣ x ) ) ] L_{DPO}(\theta) = -E_{{x,y_w,y_l}\in D}[log\sigma(\beta log\frac{\pi_{\theta}(y_w|x)}{\pi_{ref}(y_w|x)} - \beta log\frac{\pi_{\theta}(y_l|x)}{\pi_{ref}(y_l|x)})] LDPO(θ)=Ex,yw,ylD[logσ(βlogπref(ywx)πθ(ywx)βlogπref(ylx)πθ(ylx))]

u = ( β l o g π θ ( y w ∣ x ) π r e f ( y w ∣ x ) − β l o g π θ ( y l ∣ x ) π r e f ( y l ∣ x ) ) u = (\beta log\frac{\pi_{\theta}(y_w|x)}{\pi_{ref}(y_w|x)} - \beta log\frac{\pi_{\theta}(y_l|x)}{\pi_{ref}(y_l|x)}) u=(βlogπref(ywx)πθ(ywx)βlogπref(ylx)πθ(ylx))

  • ∇ θ L D P O = − E x , y w , y l ∈ D [ ∇ θ l o g σ ( u ) ] \nabla_{\theta}L_{DPO} = -E_{{x,y_w,y_l}\in D} [\nabla_{\theta} log\sigma(u)] θLDPO=Ex,yw,ylD[θlogσ(u)] = − E x , y w , y l ∈ D [ 1 σ ( u ) ∇ θ σ ( u ) ] = -E_{{x,y_w,y_l}\in D} [\frac{1}{\sigma(u)}\nabla_{\theta} \sigma(u)] =Ex,yw,ylD[σ(u)1θσ(u)] = − E x , y w , y l ∈ D [ σ ′ ( u ) σ ( u ) ∇ θ u ] = -E_{{x,y_w,y_l}\in D} [\frac{\sigma'(u)}{\sigma(u)}\nabla_{\theta} u] =Ex,yw,ylD[σ(u)σ(u)θu]

根据sigmoid函数的性质 σ ′ ( x ) = σ ( x ) ( 1 − σ ( x ) \sigma'(x) = \sigma(x)(1-\sigma(x) σ(x)=σ(x)(1σ(x) 以及 σ ′ ( − x ) = ( 1 − σ ( x ) ) \sigma'(-x) =(1-\sigma(x)) σ(x)=(1σ(x))
可得
在这里插入图片描述

其中 r θ = β l o g π θ ( y w ∣ x ) π r e f ( y w ∣ x ) r_{\theta}=\beta log\frac{\pi_{\theta}(y_w|x)}{\pi_{ref}(y_w|x)} rθ=βlogπref(ywx)πθ(ywx)可以看作对 ( x , y ) (x,y) (x,y)的奖励的估计。红色部分表示当非偏好答案 y l y_l yl的奖励大于偏好答案 y w y_w yw的奖励时,梯度越大。绿色部分会增加偏好答案 y w y_w yw的概率,蓝色部分会减小非偏好答案 y l y_l yl的概率。

参考: DPO: Direct Preference Optimization训练目标推导

这篇关于大模型学习笔记 - LLM 对齐优化算法 DPO的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1104240

相关文章

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传