大模型学习笔记 - 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

相关文章

C#原型模式之如何通过克隆对象来优化创建过程

《C#原型模式之如何通过克隆对象来优化创建过程》原型模式是一种创建型设计模式,通过克隆现有对象来创建新对象,避免重复的创建成本和复杂的初始化过程,它适用于对象创建过程复杂、需要大量相似对象或避免重复初... 目录什么是原型模式?原型模式的工作原理C#中如何实现原型模式?1. 定义原型接口2. 实现原型接口3

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

Java嵌套for循环优化方案分享

《Java嵌套for循环优化方案分享》介绍了Java中嵌套for循环的优化方法,包括减少循环次数、合并循环、使用更高效的数据结构、并行处理、预处理和缓存、算法优化、尽量减少对象创建以及本地变量优化,通... 目录Java 嵌套 for 循环优化方案1. 减少循环次数2. 合并循环3. 使用更高效的数据结构4

Python中如何控制小数点精度与对齐方式

《Python中如何控制小数点精度与对齐方式》在Python编程中,数据输出格式化是一个常见的需求,尤其是在涉及到小数点精度和对齐方式时,下面小编就来为大家介绍一下如何在Python中实现这些功能吧... 目录一、控制小数点精度1. 使用 round() 函数2. 使用字符串格式化二、控制对齐方式1. 使用

C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)

《C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)》本文主要介绍了C#集成DeepSeek模型实现AI私有化的方法,包括搭建基础环境,如安装Ollama和下载DeepS... 目录前言搭建基础环境1、安装 Ollama2、下载 DeepSeek R1 模型客户端 ChatBo

SpringBoot快速接入OpenAI大模型的方法(JDK8)

《SpringBoot快速接入OpenAI大模型的方法(JDK8)》本文介绍了如何使用AI4J快速接入OpenAI大模型,并展示了如何实现流式与非流式的输出,以及对函数调用的使用,AI4J支持JDK8... 目录使用AI4J快速接入OpenAI大模型介绍AI4J-github快速使用创建SpringBoot

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

通俗易懂的Java常见限流算法具体实现

《通俗易懂的Java常见限流算法具体实现》:本文主要介绍Java常见限流算法具体实现的相关资料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的实现原理和具体步骤,并比较了它们的... 目录一、漏桶算法1.漏桶算法的思想和原理2.具体实现二、令牌桶算法1.令牌桶算法流程:2.具体实现2.1

golang内存对齐的项目实践

《golang内存对齐的项目实践》本文主要介绍了golang内存对齐的项目实践,内存对齐不仅有助于提高内存访问效率,还确保了与硬件接口的兼容性,是Go语言编程中不可忽视的重要优化手段,下面就来介绍一下... 目录一、结构体中的字段顺序与内存对齐二、内存对齐的原理与规则三、调整结构体字段顺序优化内存对齐四、内