Introduction to Multi-Armed Bandits——05 Thompson Sampling[3]

news/2024/5/15 22:28:41/文章来源:https://blog.csdn.net/weixin_47692652/article/details/129131938

Introduction to Multi-Armed Bandits——05 Thompson Sampling[3]

参考资料

  1. Russo D J, Van Roy B, Kazerouni A, et al. A tutorial on thompson sampling[J]. Foundations and Trends® in Machine Learning, 2018, 11(1): 1-96.

  2. ts_tutorial

项目代码地址: https://github.com/yijunquan-afk/bandit-learning.git

到目前为止,我们所考虑的 Bernoulli bandit 和最短路径例子中的共轭性质有利于简单和计算效率高的贝叶斯推理。 计算效率制定模型时的一个重要考虑。 然而,很多情况下我们需要更复杂的模型,而精确的贝叶斯推理在计算上是难以实现的。 幸运的是,我们有一些准确的方法可以用来对后验分布进行近似采样。(Approximations

在本节中,我们将讨论四种近似后验取样的方法。Gibbs samplingLangevin Monte Carlo、从Laplace approximation中抽样和bootstrap。 作为一个例子,我们考虑在线最短路径问题的一个变体。

一、Binary Feedback

在之前最短路的基础上。假设图代表了 MMM 阶的 binomial bridge,让每个 θe\theta_eθe 独立分布,且是 gamma分布的,E[θe]=1\mathbb{E}[\theta_e] = 1E[θe]=1, E[θe2]=1.5\mathbb{E}[\theta_e^2] = 1.5E[θe2]=1.5,观察值根据如下公式产生:
yt∣θ∼{1with probability 11+exp⁡(∑e∈xtθe−M)0otherwise.\begin{equation*} y_t | \theta \sim \begin{cases} 1 \qquad & \text{with probability } \frac{1}{1 + \exp\left(\sum_{e \in x_t} \theta_e - M\right)} \\ 0 \qquad & \text{otherwise.} \end{cases} \end{equation*} ytθ{10with probability 1+exp(extθeM)1otherwise.

我们将奖励看作评级,rt=ytr_t = y_trt=yt。例如,一个Internet路线推荐服务。每天,系统推荐一条路线 xtx_txt ,并收到司机的反馈 yty_tyt ,表示该路线是否可取。当实现的遍历时间 ∑e∈xt\sum_{e \in x_t}ext 低于先前的期望值 MMM ,反馈往往是积极的(1),反之亦然(0)。

这个新的模型不具有在第四节中利用的共轭性质,也不适合于有效的精确贝叶斯推理。 不过,这个问题可以通过近似的方法来解决。 为了说明这一点,下图显示了三个近似版本的TS应用于twenty-stage binomial bridge 的在线最短路问题的结果。这些算法利用了Langevin Monte CarloLaplace近似和bootstrap这三种方法。 作为比较的基线,还绘制了贪心算法的应用结果。

image-20230126103058446

在本节中,我们让 ft−1f_{t-1}ft1 代表在历史为 Ht−1=((x1,y1),…,(xt−1,yt−1))\mathbb{H}_{t-1} = ((x_1, y_1),\ldots,(x_{t-1},y_{t-1}))Ht1=((x1,y1),,(xt1,yt1)) 的条件下 θ\thetaθ 的后验密度。TS算法通过从 ft−1f_{t-1}ft1 中抽取参数向量 θ^\hat{\theta}θ^ 并求解 θ^\hat{\theta}θ^ 下的最优路径来生成动作 xtx_txt 。我们所描述的方法产生了一个样本 θ^\hat{\theta}θ^ ,其分布近似于后验 f^t−1\hat{f}_{t-1}f^t1,当精确的后验抽样不可行时,可以近似地实现TS的功能。

二、Gibbs Sampling

可以阅读这篇文章:机器学习中的MC、MCMC、Gibbs采样

Gibbs抽样是一种通用马尔可夫链蒙特卡罗(MCMC)算法,用于从多元概率分布中提取近似样本。它产生了一个采样参数序列 (θ^n:n=0,1,2,…)(\hat{\theta}^{n} : n =0,1,2, \ldots)(θ^n:n=0,1,2,),形成了一个稳定分布的马尔可夫链 ft−1f_{t-1}ft1 。在合理的技术条件下,该马尔可夫链的极限分布为其平稳分布,θ^n\hat{\theta}^nθ^n 的分布收敛于 ft−1f_{t-1}ft1

Gibbs抽样从最初的猜测 θ^0\hat{\theta}^{0}θ^0 开始,迭代遍历n=1,…,Nn=1,\ldots,Nn=1,,N,对于第n次扫描,该算法迭代分量 k=1,…,Kk=1,\ldots,Kk=1,,K,对于每个 kkk 生成一维边际分布:

ft−1n,k(θk)∝ft−1((θ^1n,…,θ^k−1n,θk,θ^k+1n−1,…,θ^Kn−1))f^{n,k}_{t-1}(\theta_k) \propto f_{t-1}((\hat{\theta}^n_1, \ldots, \hat{\theta}^n_{k-1}, \theta_k, \hat{\theta}^{n-1}_{k+1}, \ldots, \hat{\theta}^{n-1}_K))ft1n,k(θk)ft1((θ^1n,,θ^k1n,θk,θ^k+1n1,,θ^Kn1))

按照 θ^kn∼ft−1n,k\hat{\theta}^n_k \sim f^{n,k}_{t-1}θ^knft1n,k 对第k个分量进行采样。经过 NNN 次的扫描,向量 θ^N\hat{\theta}^{N}θ^N 被认为是近似的后验样本。

Gibbs抽样适用于广泛的问题,即使在从 ft−1f_{t-1}ft1 抽样时,在计算上也往往是可行的。这是因为从一维分布中取样比较简单。 也就是说,对于复杂的问题,Gibbs抽样在计算上仍有一定要求。 例如我们的二元反馈的路径推荐问题。在这种情况下,很容易实现Gibbs抽样的一个版本,它可以在一分钟内产生一个接近于后验样本的结果。然而, 在数百个时间段内运行数千次模拟是相当耗时的,需要更有效的近似方法。

三、Laplace Approximation

可以参考贝叶斯推断之拉普拉斯近似、拉普拉斯近似法。

我们现在讨论一种方法,用高斯分布来逼近潜在的复杂后验分布。然后,来自这个较简单的高斯分布的样本可以作为感兴趣的后验分布的近似样本。 Chapelle和Li 提出了这种方法,用广告点击率的逻辑回归模型来近似显示广告问题中的TS。

ggg 表示 RK\R^KRK 上的概率密度函数,我们希望从中抽样。如果 ggg 是单峰的(unimodal),它的对数密度 ln⁡(g(ϕ))\ln(g(\phi))ln(g(ϕ)) 在其模 ϕ‾\overline{\phi}ϕ 上是严格凹的,g(ϕ)=eln⁡(g(ϕ))g(\phi)= e^{\ln(g(\phi))}g(ϕ)=eln(g(ϕ))ϕ‾\overline{\phi}ϕ 周围急剧地达到顶峰。考虑围绕其模进行全局近似是很自然的。对数密度的二阶泰勒近似给出如下:

ln⁡(g(ϕ))≈ln⁡(g(ϕ‾))−12(ϕ−ϕ‾)⊤C(ϕ−ϕ‾),\ln(g(\phi)) \approx \ln(g(\overline{\phi})) - \frac{1}{2} (\phi - \overline{\phi})^\top C (\phi - \overline{\phi}),ln(g(ϕ))ln(g(ϕ))21(ϕϕ)C(ϕϕ),

其中C=−∇2ln⁡(g(ϕ‾)).C = -\nabla^2 \ln(g(\overline{\phi})).C=2ln(g(ϕ)).

我们可以使用

g~(ϕ)∝e−12(ϕ−ϕ‾)⊤C(ϕ−ϕ‾).\tilde{g}(\phi) \propto e^{-\frac{1}{2} (\phi - \overline{\phi})^\top C (\phi - \overline{\phi})}.g~(ϕ)e21(ϕϕ)C(ϕϕ).

作为 ggg 的近似值。这与具有均值 ϕ‾\overline{\phi}ϕ 和协方差 C−1C^{-1}C1 的高斯分布密度成正比,因此

g~(ϕ)=∣C/2π∣e−12(ϕ−ϕ‾)⊤C(ϕ−ϕ‾).\tilde{g}(\phi) = \sqrt{|C/2\pi|} e^{-\frac{1}{2} (\phi - \overline{\phi})^\top C (\phi - \overline{\phi})}.g~(ϕ)=C/2πe21(ϕϕ)C(ϕϕ).

我们称之为 gggLaplace Approximation. 由于有高效的算法来生成高斯分布的样本,这为从 ggg 中近似取样提供了一种可行的方法。

作为一个例子,让我们考虑拉普拉斯近似在例子binary feedback中的应用。贝叶斯规则表明 ft−1f_{t-1}ft1 的后验密度 θθθ 满足:

ft−1(θ)∝f0(θ)∏τ=1t−1(11+exp⁡(∑e∈xτθe−M))yτ(exp⁡(∑e∈xτθe−M)1+exp⁡(∑e∈xτθe−M))1−yτf_{t-1}(\theta) \propto f_0(\theta) \prod_{\tau=1}^{t-1} \left(\frac{1}{1 + \exp\left(\sum_{e \in x_\tau} \theta_e - M\right)}\right)^{y_\tau} \left(\frac{\exp\left(\sum_{e \in x_\tau} \theta_e - M\right)}{1 + \exp\left(\sum_{e \in x_\tau} \theta_e - M\right)}\right)^{1-y_\tau} ft1(θ)f0(θ)τ=1t1(1+exp(exτθeM)1)yτ(1+exp(exτθeM)exp(exτθeM))1yτ

众数(mode) θ‾\overline{\theta}θ 可以通过最大化 ft−1f_{t-1}ft1 来有效计算,ft−1f_{t-1}ft1 是对数凹的。然后从高斯分布中抽取一个近似的后验样本 θ^\hat{\theta}θ^,其平均值为 θ‾\overline{\theta}θ,协方差矩阵为 (−∇2ln⁡(ft−1(θ‾)))−1(- \nabla^2 \ln(f_{t-1}(\overline{\theta})))^{-1}(2ln(ft1(θ)))1

拉普拉斯近似法非常适合于binray feedback,因为对数后验密度是严格内凹的,其梯度和Hessian矩阵可以有效计算。

我们采用了牛顿方法和回溯线搜索法,使 ln⁡(ft−1)\ln(f_{t-1)}ln(ft1) 达到最大。 遗憾会衰减,最终应该消失。在我们的例子中,拉普拉斯近似法的表现不如Langevin Monte Carlo。这可能是由于后验分布不够接近高斯。而在TS的实际应用中,拉普拉斯近似是一种流行的方法

四、Langevin Monte Carlo

我们现在描述一种替代性的马尔科夫链蒙特卡罗(MCMC)方法,它使用目标分布的梯度信息。 让 g(ϕ)g(\phi)g(ϕ) 表示在 RK\mathbb{R}^{K}RK 上的一个对数凹的概率密度函数,我们希望从中取样。假设 ln⁡(g(ϕ))\ln(g(\phi))ln(g(ϕ)) 是可微的,其梯度是可有效计算的。 Langevin dynamics 首先出现在物理学中,指的是扩散过程
dϕt=∇ln⁡(g(ϕt))dt+2dBt(5.1)d\phi_t = \nabla \ln(g(\phi_t)) dt + \sqrt{2} dB_t \tag{5.1} dϕt=ln(g(ϕt))dt+2dBt(5.1)
其中 BtB_tBt 是一个标准布朗运动过程,这个过程有 ggg 作为其唯一的静止分布,在合理的技术条件下, ϕt\phi_tϕt $的分布会迅速收敛到这个静止分布。因此,模拟(5.1)提供了一种从 ggg 中近似取样的方法。

通常情况下,我们可以用欧拉离散化来代替这个随机微分方程:
ϕn+1=ϕn+ϵ∇ln⁡(g(ϕn))+2ϵWnn∈N(5.2)\phi_{n+1}= \phi_{n} + \epsilon \nabla \ln(g(\phi_n)) + \sqrt{2\epsilon} W_n \qquad n \in \mathbb{N}\tag{5.2} ϕn+1=ϕn+ϵln(g(ϕn))+2ϵWnnN(5.2)
其中 W1,W2,…W_1, W_2,\ldotsW1,W2, 是独立同分布的标准高斯随机变量, ϵ>0\epsilon>0ϵ>0 是一个小的步长。与梯度上升法一样,在这种方法下,ϕn\phi_nϕn 倾向于向密度 g(ϕn)g(\phi_n)g(ϕn) 增加的方向漂移。然而,每一步都会注入随机的高斯噪声 WnW_nWn ,因此,对于大的 nnnϕn\phi_nϕn 的位置是随机的。

我们对这个方法做了两个标准的修改以提高计算效率。

  • 首先,根据最近的工作,我们实现了stochasticgradientstochastic\ gradientstochastic gradient。Langevin Monte Carlo,它使用采样的小批数据来计算近似梯度而不是精确梯度。我们的实现使用了100个mini-batch的规模。当观测值少于100个时,我们遵循Markov链(5.2),进行精确梯度计算。当收集到超过100个观测值时,我们遵循(5.2),但在每一步使用基于100个数据点的随机子样本的估计梯度 ∇ln⁡(g^n(ϕn))\nabla \ln(\hat{g}_n(\phi_n))ln(g^n(ϕn))

  • 我们的第二个修改涉及到使用一个预处理矩阵来提高马尔科夫链(5.2)的混合率。对于binary feedback中的路径推荐问题,我们发现对数后验密度在后期变得病态的。由于这个原因,梯度上升法收敛到后验众数(mode)的速度非常慢。有效的优化方法应该利用二阶信息。同样,由于条件较差,我们可能需要选择一个极小的步长 ϵ\epsilonϵ ,导致(5.2)中的Markov链混合缓慢。Langevin MCMC可以通过模拟马尔科夫链,用对称正定预处理矩阵 AAA 实现

ϕn+1=ϕn+ϵA∇ln⁡(g(ϕn))+2ϵA1/2Wnn∈N\phi_{n+1}= \phi_{n} + \epsilon A \nabla \ln(g(\phi_n)) + \sqrt{2\epsilon} A^{1/2} W_n \qquad n \in \mathbb{N} ϕn+1=ϕn+ϵAln(g(ϕn))+2ϵA1/2WnnN

其中 A1/2A^{1/2}A1/2 表示 AAA 的矩阵平方根。我们采取 ϕ0=argmaxϕln⁡(g(ϕ))\phi_0 = \text{argmax}_{\phi} \ln(g(\phi))ϕ0=argmaxϕln(g(ϕ)),所以链的初始化是在后验众数(mode)。并采取预处理矩阵 A=−(∇2ln⁡(g(ϕ))∣ϕ=ϕ0)−1A= -(\nabla^2 \ln(g(\phi)) \rvert_{\phi=\phi_0})^{-1}A=(2ln(g(ϕ))ϕ=ϕ0)1 为该点的负逆Hessian。

五、Bootstrapping

bootstrap的解释可以看这个:用 Bootstrap 进行参数估计大有可为

作为一种替代方法,我们讨论了一种基于 statistical bootstrap 的方法,它甚至可以容纳非常复杂的密度。 我们介绍一个适用于我们在本教程中涉及的例子。

与拉普拉斯近似法一样,我们的bootstrap法也假定θ\thetaθ 是从欧几里得空间 RKR^KRK中抽取。首先考虑一个标准的bootstrap法,用于评估 θ\thetaθ 的最大似然估计的抽样分布。该方法产生了一个假设的历史 Ht−1^=((x^1,y^1),…,(x^t−1,y^t−1))\hat{\mathbb{H}_{t-1}} = ((\hat{x}_1,\hat{y}_1), \ldots, (\hat{x}_{t-1}, \hat{y}_{t-1}))Ht1^=((x^1,y^1),,(x^t1,y^t1)) ,它由 t−1t-1t1 action−observationaction-observationactionobservation 对组成,每个人都从 Ht−1\mathbb{H}_{t-1}Ht1 均匀采样并替换。然后,我们在假设的历史下最大化 θ\thetaθ 的可能性,对于我们的最短路径推荐问题来说,这个可能性是这样的:
L^t−1(θ)=∏τ=1t−1(11+exp⁡(∑e∈x^τθe−M))y^τ(exp⁡(∑e∈x^τθe−M)1+exp⁡(∑e∈x^τθe−M))1−y^τ\hat{L}_{t-1}(\theta) = \prod_{\tau=1}^{t-1} \left(\frac{1}{1 + \exp\left(\sum_{e \in \hat{x}_\tau} \theta_e - M\right)}\right)^{\hat{y}_\tau} \left(\frac{\exp\left(\sum_{e \in \hat{x}_\tau} \theta_e - M\right)}{1 + \exp\left(\sum_{e \in \hat{x}_\tau} \theta_e - M\right)}\right)^{1-\hat{y}_\tau} L^t1(θ)=τ=1t1(1+exp(ex^τθeM)1)y^τ(1+exp(ex^τθeM)exp(ex^τθeM))1y^τ
最大化器中的随机性 L^t−1\hat{L}_{t-1}L^t1 反映了最大似然估计的抽样分布的随机性。不幸的是,这种方法并没有考虑到代理人的先验。一个更严重的问题是,它严重低估了智能体在初始时期的真实不确定性。我们将以一种简单的方式克服这些缺点。

该方法的步骤如下。首先,像以前一样,我们抽取一个假设的历史 Ht−1^=((x^1,y^1),…,(x^t−1,y^t−1))\hat{\mathbb{H}_{t-1}} = ((\hat{x}_1,\hat{y}_1), \ldots, (\hat{x}_{t-1}, \hat{y}_{t-1}))Ht1^=((x^1,y^1),,(x^t1,y^t1)),它由t−1t-1t1 action−observationaction-observationactionobservation 对组成,每个人都从 Ht−1\mathbb{H}_{t-1}Ht1 均匀采样并替换。接下来,我们从先验分布 f0f_0f0 中抽取一个样本 θ0\theta^0θ0。让 Σ\SigmaΣ 表示先验 f0f_0f0 的协方差矩阵。最后,我们解决最大化问题
θ^=argmaxθ∈Rke−(θ−θ0)⊤Σ(θ−θ0)L^t−1(θ)\hat{\theta} = \text{argmax}_{\theta \in \mathbb{R}^k} \,\, e^{-(\theta-\theta^0)^\top \Sigma (\theta - \theta^0)} \hat{L}_{t-1}(\theta) θ^=argmaxθRke(θθ0)Σ(θθ0)L^t1(θ)
并将 θ^\hat{\theta}θ^ 视为近似的后验样本。这可以看作是对后验密度的随机近似 f^t−1\hat{f}_{t-1}f^t1 的最大化,其中 f^t−1(θ)∝e−(θ−θ0)⊤Σ(θ−θ0)L^t−1(θ)\hat{f}_{t-1}(\theta) \propto e^{-(\theta-\theta^0)^\top \Sigma (\theta - \theta^0)} \hat{L}_{t-1}(\theta)f^t1(θ)e(θθ0)Σ(θθ0)L^t1(θ) 是指如果先验是均值为 θ0\theta^0θ0、协方差矩阵为 Σ\SigmaΣ 的高斯分布,而观察的历史是 H^t−1\hat{\mathbb{H}}_{t-1}H^t1,后验密度会是什么。当收集到的数据很少时,样本中的随机性大多源于先验样本 θ0\theta_0θ0 的随机性。这种随机的先验样本鼓励智能体在早期阶段进行探索。当 ttt 很大时,已经收集了大量的数据,可能性通常压倒了先验样本,样本中的随机性主要来自于对历史 H^t−1\hat{\mathbb{H}}_{t-1}H^t1 的随机选择。

在最短路径推荐问题中,f^t−1(θ)\hat{f}_{t-1}(\theta)f^t1(θ) 是对数凹的,因此可以有效地实现最大化。 同样,为了得出图中报告的计算结果,我们采用了牛顿方法和回溯线搜索来最大化 ln⁡(f^t−1)\ln(\hat{f}_{t-1})ln(f^t1)

从图中可以看出,对于我们的例子,bootstrap法的表现与拉普拉斯近似法差不多。 bootstrap法的一个优点是它是非参数性的,无论后验分布的函数形式如何,它都可以合理地工作,而拉普拉斯近似法则依赖于高斯近似法,Langevin Monte Carlo 法则依赖于log-concavity和其他规则性假设。

六、健全性检查

图5.1展示了Laplace approximationLangevin Monte Carlobootstrap方法在应用于路径推荐问题时,从二项反馈中学习,以随着时间的推移提高性能。然而,这可能会让人疑惑,确切的TS是否会提供更好的性能。由于我们没有可处理的方法来执行该问题的精确TS,因此在本节中,我们将我们的近似方法应用于精确TS可处理的问题。这使得可以比较精确方法和近似方法的性能。

image-20230217212610069

回顾一下三臂beta-Bernoulli强盗问题,其贪心算法和TS算法的结果如上图所示。对于这个问题,θ\thetaθ 的各分量在后验分布下是独立的。因此,Gibbs抽样可以得到精确的后验样本。 因此,使用Gibbs抽样的近似版本的性能将与精确的TS完全相同。下图中的a绘制了应用Laplace approximationLangevin Monte Carlobootstrap方法的结果。对于这个问题,我们的近似方法提供的性能与精确的TS在质量上相似,拉普拉斯近似法的表现比其他方法略差。

接下来,考虑具有correlated边延迟的在线最短路径问题。如图b所示。应用拉普拉斯近似方法与适当的变量替换达到了与精确TS相同的结果。 图中将这些结果与Gibbs samplingLangevin Monte Carlobootstrap方法所产生的结果进行了比较。同样,近似方法产生了有竞争力的结果,bootstrap的效果略逊于其他方法。

image-20230217213731548

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【自然语言处理】主题建模:Top2Vec(理论篇)

主题建模:Top2Vec(理论篇)Top2Vec 是一种用于 主题建模 和 语义搜索 的算法。它自动检测文本中出现的主题,并生成联合嵌入的主题、文档和词向量。 算法基于的假设:许多语义相似的文档都可以由一个潜在的主题表示。首先…

苏宁基于 AI 和图技术的智能监控体系的建设

汤泳,苏宁科技集团智能监控与运维产研中心总监,中国商业联合会智库顾问,致力于海量数据分析、基于深度学习的时间序列分析与预测、自然语言处理和图神经网络的研究。在应用实践中,通过基于 AI 的方式不断完善智能监控体系的建设&a…

如何快速掌握DDT数据驱动测试?

如何快速掌握DDT数据驱动测试? 目录:导读 前言 实施数据驱动步骤 数据驱动测试环境准备 测试步骤 数据存储 数据存在当前脚本中 json文件读取测试数据进行数据驱动测试 从xml读取数据进行数据驱动测试 总结 写在最后 前言 网盗概念相同的测试…

SpringBoot整合分布式锁redisson

1、导入maven坐标<!-- 用redisson作为所有分布式锁&#xff0c;分布式对象等功能框架--><dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.12.5</version></dependency>2、red…

Kafka第三章:新旧节点更替

系列文章目录 Kafka第一章&#xff1a;环境搭建 Kafka第二章&#xff1a;生产者案例 Kafka第三章&#xff1a;新旧节点更替 文章目录系列文章目录前言一、创建新节点1.克隆节点2.修改Kafka配置二、添加新节点1.启动集群2.启动105的Kafka3.创建一个要均衡的主题4.生成一个负载均…

C++项目——高并发内存池(1)--介绍及定长内存池

1.什么是内存池 1.1 池化技术 将程序中需要经常使用的核心资源先申请出来&#xff0c;放在一个池内&#xff0c;由程序自己管理&#xff0c;这样可以提高资源的使用效率&#xff0c;也可以保证本程序占有的资源数量。 比如之前博文实现的线程池&#xff0c;就是预先的申请出…

第四次作业

学生表&#xff1a;Student (Sno, Sname, Ssex , Sage, Sdept)学号&#xff0c;姓名&#xff0c;性别&#xff0c;年龄&#xff0c;所在系 Sno为主键课程表&#xff1a;Course (Cno, Cname)课程号&#xff0c;课程名 Cno为主键学生选课表&#xff1a;SC (Sno, Cno, Score)学号&…

面试经常被问悲观锁和乐观锁?什么是cas?来我花3分钟时间告诉你

锁大家都知道吧&#xff0c;多线程访问资源会存在竞争&#xff0c;那么就需要加锁进而让多个线程一个一个访问。 比如有一个房间&#xff0c;一次只能进一个人&#xff0c;现在有十个人都想进去怎么办&#xff1f; 对&#xff0c;加锁。拿一把钥匙&#xff0c;谁抢到钥匙谁就…

微服务 ModuleFederationPlugin Vue项目体验

随着公司项目的模块越来越多&#xff0c;每次打包后的项目都非常大&#xff0c;而且每修改一个小的模块&#xff0c;都会将整个项目打包&#xff0c;会非常的麻烦&#xff0c;随着前端的发展&#xff0c;微服务的出现&#xff0c;很好的解决了项目庞大的问题&#xff0c;而且每…

大数据处理学习笔记1.4 掌握Scala运算符

文章目录零、本讲学习目标一、运算符等价于方法&#xff08;一&#xff09;运算符即方法&#xff08;二&#xff09;方法即运算符1、单参方法2、多参方法3、无参方法二、Scala运算符&#xff08;一&#xff09;运算符分类表&#xff08;二&#xff09;Scala与Java运算符比较三、…

I.MX6ULL_Linux_系统篇(17) uboot分析-启动linux

bootz 启动 Linux 内核 images 全局变量 不管是 bootz 还是 bootm 命令&#xff0c;在启动 Linux 内核的时候都会用到一个重要的全局变量&#xff1a;images&#xff0c; images 在文件 cmd/bootm.c 中有如下定义&#xff1a; images 是 bootm_headers_t 类型的全局变量&…

03- 通过OpenCV进行图像变换 (OpenCV基础) (机器视觉)

知识重点 resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]) 图像的放大与缩小, 变形 flip(src, flipCode) 图像的翻转 rotate(img, rotateCode) 图像的旋转 warpAffine(src, M, dsize, flags, mode, value) 仿射变换是图像旋转, 缩放, 平移的总称.具体的做法是通…

Windows10神州网信政府版麦克风、摄像头的使用

Windows10神州网信政府版默认麦克风摄像头是禁用状态&#xff0c;此禁用状态符合版本规定。 在录课和直播过程中&#xff0c;如果需要使用麦克风和摄像头的功能&#xff0c;可以这样更改&#xff1a; 1、鼠标右键点击屏幕左下角的开始菜单图标&#xff0c;选择windows中的“运…

跨时钟域 单脉冲 脉冲信号同步问题——快到慢(1)

引言 FPGA设计或者ASIC设计中经常存在多个时钟域&#xff0c;那么这些时钟域之间脉冲信号的同步该如何进行设计&#xff1f;快时钟域到慢时钟域的脉冲信号同步与慢时钟域信号到快时钟域信号的同步是不一样的。 本文先给出快时钟域到慢时钟域脉冲信号同步的方法之一&#xff…

C++设计模式(17)——备忘录模式

亦称&#xff1a; 快照、Snapshot、Memento 意图 备忘录模式是一种行为设计模式&#xff0c; 允许在不暴露对象实现细节的情况下保存和恢复对象之前的状态。 问题 假如你正在开发一款文字编辑器应用程序。 除了简单的文字编辑功能外&#xff0c; 编辑器中还要有设置文本格…

覃小龙34岁生日记:结合趋势,发挥优势,方能百战不殆

覃小龙34岁生日记:结合趋势&#xff0c;发挥优势&#xff0c;方能百战不殆&#xff01;2023-2-20星期一 覃小龙2023年2月17日&#xff0c;是我34岁生日&#xff0c;1989年出生的我&#xff0c;一晃眼&#xff0c;已经走过第34个年头了&#xff01;从2016年创业到今天&#xff0…

【Spark分布式内存计算框架——Spark SQL】13. 自定义UDF函数

第七章 自定义UDF函数 无论Hive还是SparkSQL分析处理数据时&#xff0c;往往需要使用函数&#xff0c;SparkSQL模块本身自带很多实现公共功能的函数&#xff0c;在org.apache.spark.sql.functions中。SparkSQL与Hive一样支持定义函数&#xff1a;UDF和UDAF&#xff0c;尤其是U…

C++进阶:二叉搜索树

文章目录1 二叉搜索树概念2 二叉搜索树的实现2.1 结点的定义2.2 二叉搜索树的插入2.2 二叉搜索树的查找2.3 二叉搜索树的删除2.4 二叉搜索树的默认成员函数2.4.1 拷贝构造2.4.2 析构函数2.4.3 赋值重载3 二叉搜索树的应用3.1 k模型3.2 kv模型4 二叉搜索树的性能分析1 二叉搜索树…

Nacos注册中心和配置中心使用详情

Nacos Nacos就是Alibaba推出的一款 配置中心和注册中心结合的一款工具&#xff0c;属于SpringCloudAlibaba技术栈下 Nacos官网地址 https://nacos.io/zh-cn/index.html 安装启动 下载 目录结构 根据目录结构可以看出Nacos本身也就是一个java程序。SpringBoot程序 启动 c…

配置Tomcat性能优化

配置Tomcat性能优化 &#x1f4d2;博客主页&#xff1a; 微笑的段嘉许博客主页 &#x1f4bb;微信公众号&#xff1a;微笑的段嘉许 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐留言&#x1f4dd; &#x1f4cc;本文由微笑的段嘉许原创&#xff01; &#x1f4…