【OpenAI Q* 超越人类的自主系统】DQN :Q-Learning + 深度神经网络

深度 Q 网络:用深度神经网络,来近似Q函数

    • DQN(深度 Q 网络)= 深度神经网络 + Q-Learning
      • Q-Learning
      • 模型结构
      • 损失函数
      • 经验回放
      • 探索策略
      • 流程关联
    • DQN 优化
      • DDQN:双 DQN,实现无偏估计
      • Dueling DQN:提高决策的准确性和效率
      • Noisy DQN:增强模型的探索能力
      • 优先级经验回放
    • OpenAI Q* :超越人类的自主系统

 


DQN(深度 Q 网络)= 深度神经网络 + Q-Learning

DQN 算法全称 深度Q网络,以 Q-Learning 算法为基础,融合了神经网络。

因为传统Q学习,不适合处理大规模数据(连续状态空间)的问题,就可用深度神经网络来近似Q函数。

Q-Learning

Q 值表示做出一个行为后能够获得的累计奖励,越大,越应该选择。

Q 值的组成是:当前状态s下,所有行为 a 的 Q 值。

那优化目标就是,每个状态(s)下都能做出 Q 值最大的行为(a),从而实现机器与环境的最优交互。

我们会使用表格用于存储和更新Q值,是因为这种方法提供了一种直观、清晰的方式来表示和跟踪每个状态和行为组合的预期回报。


当状态和行为的数量非常庞大时,用表格储存所有数据会占用非常多的资源。

一般就会想到状态压缩,只保存与决策相关的几个最优可能来源。

但是在强化学习中,每个状态-动作对的历史信息都可能对学习最优策略至关重要,所以不能用状态压缩。

问题就是,输入状态s、行为a,怎么计算出 Q 值?

使用神经网络可以直接学习状态、行为、Q值的关系,输入状态,就能得到每个行为的Q值。

神经网络在这的功能:从存储 3 个值的排列组合,到只存储状态。

模型结构

  1. 现在的状态(St):

    • 想象你在一个房间里(这就是现在的状态St),你有几个门可以选择出去(这些门是你可以采取的动作A)。
  2. Q网络:

    • Q网络就像一个超级计算机,它能告诉你选择每扇门的好处是什么(这就是Q(St, A),每个动作的预期奖励)。
  3. 选择动作和获得奖励(R):

    • 根据Q网络的建议,你选择了一扇门并通过它(这就是你的动作A),然后你可能会找到一些糖果(这是你的奖励R)。
  4. 下一个状态(St+1):

    • 通过门之后,你来到了另一个房间(这就是下一个状态St+1)。
  5. target Q网络:

    • 这里有另一个类似的超级计算机,它叫做 target Q 网络。它会计算在新房间里,选择下一扇门的好处,帮助你决定下一次应该选择哪扇门。
  6. 更新Q网络(loss):

    • 你告诉第一个超级计算机你找到的糖果和第二个超级计算机的建议。第一个超级计算机会用这些信息来更新自己,变得更聪明,以便下次能给出更好的建议。

在这个过程中,Q网络不断学习和更新,目的是帮助你在这个房间的世界里找到更多的糖果。

每次你选择了一个动作并看到结果,Q网络都会变得更好,帮助你做出更好的选择。

损失函数

损失函数采用时序差分来,比较两个连续时间步的 Q 值来计算误差,并将这个误差用于更新神经网络的权重。

  • DQN的损失函数用来衡量我们的预测(比如猜测)和实际发生的事情之间的差距。

在DQN中,损失函数特别关注的是预测的奖励(我们认为采取某个动作能得到多少好处)和实际得到的奖励(实际采取动作后得到的好处)之间的差别。

上图有 2 个 Q 网络,目标 Q 网络 是 S t + 1 S_{t+1} St+1

损失函数更新Q值规则:

  • Q ( s t , a t ) = Q ( s t , a t ) + α [ r t + 1 + γ max ⁡ Q ( s t + 1 , a t + 1 ) ⏟ Target Value − Q ( s t , a t ) ] Q(s_t,a_t)=Q(s_t,a_t)+\alpha[\underbrace{r_{t+1}+\gamma\max Q(s_{t+1},a_{t+1})}_{\text{Target Value}}-Q(s_t,a_t)] Q(st,at)=Q(st,at)+α[Target Value rt+1+γmaxQ(st+1,at+1)Q(st,at)]

使用均方差误差做损失函数:

  • ω ∗ = arg ⁡ min ⁡ ω 1 2 N ∑ i = 1 N [ Q ω ( s t i , a t i ) − ( r t + 1 i + γ max ⁡ a t + 1 Q ω ( s t + 1 i , a t + 1 ) ) ] 2 \omega^*=\arg\min_\omega\frac{1}{2N}\sum_{i=1}^N\left[Q_\omega\left(s_t^i,a_t^i\right)-\left(r_{t+1}^i+\gamma\max_{a_{t+1}}Q_\omega\left(s_{t+1}^i,a_{t+1}\right)\right)\right]^2 ω=argminω2N1i=1N[Qω(sti,ati)(rt+1i+γmaxat+1Qω(st+1i,at+1))]2

Q w Q_{w} Qw 网络每步都更新,后面的 目标 Q 网络 隔几步才更新。

隔几步才更新目标Q网络是为了让训练更加稳定和有效,就像你在学习时每隔一段时间才询问朋友一样。

如果每步都听从朋友的建议,就会过于保守,完全用他的经验(使用已知的最佳动作)了,错过更好的动作选择。

经验回放

经验回放就像是给机器一个记事本,它可以在每次玩游戏后记下自己的经验(特别是已知的最佳动作)。

这个记事本包含了机器在不同游戏情况下的经验,比如在某个特定情况下采取了哪个动作,以及随后获得了多少奖励。

在执行任务的同时,将一部分数据(通常是状态、动作、奖励和下一个状态等信息)存储到经验池中,以供后续的训练使用。

在训练过程中不仅仅使用当前的经验来更新模型,还要积累更多的经验,以便在训练中使用更多的数据。这可以有几个好处:

  • 稳定性:通过将多个时间步的经验存储到经验池中,可以减少训练数据的相关性,使训练更加稳定。这有助于防止模型陷入局部最优解或出现训练不稳定的情况。

  • 重复利用经验:存储的经验可以多次用于训练,这有助于更有效地学习和提高样本的利用率。有时候,某些经验可能在一开始并不显著,但随着训练的积累,它们可能变得更有价值。

探索策略

但有一个问题:是选择已知的好方法(已知的最佳动作),还是尝试新方法(尝试新动作,可能有更好的方法)?

探索策略就是决定如何平衡这两种选择的方法。

如果一直按同一个按钮,它可能会错过更好的方法,但如果总是尝试新方法,它可能会很难取得进展。

在 ε-greedy 探索策略下,智能体以ε的概率选择随机动作(探索),以1-ε的概率选择当前认为最优的动作(利用)。

在一部分时间步中会尝试新的动作以发现更多信息,而在另一部分时间步中会选择已知的最佳动作以最大化奖励。

初始的时候,多探索ε要大,经验多了后,多利用ε减少

流程关联

  1. Q-Learning(时间步0):

    • 开始时,我们有一个深度神经网络(DNN),该网络的目标是学习在不同状态下采取不同动作的Q值,以获得最大的累积奖励。
    • 我们初始化Q值网络,并且可以随机选择一个探索策略来探索环境。
  2. 探索策略

    • 在每个时间步骤,智能体使用探索策略来选择一个动作,如ε-greedy策略,这使得智能体有机会尝试新的动作。初始的时候,多探索ε要大,经验多了后,多利用ε减少
  3. 环境交互

    • 智能体采取选定的动作,并与环境互动,从环境中获得奖励(r_t+1)和新的状态(s_t+1)。
  4. 经验回放

    • 智能体将这次互动的信息(状态s_t、动作a_t、奖励r_t+1和下一个状态s_t+1)存储到经验池中。
  5. 损失函数计算

    • 定期或随机地,我们从经验池中抽取一些数据,这些数据用于计算损失函数。
    • 损失函数的目标是调整深度神经网络DNN的参数( ω \omega ω),以使 Q 值网络的预测更接近真实的 Q 值。
    • 损失函数通常是均方差误差(MSE),用来比较 Q 值网络的预测 Q 值和目标 Q 值(根据Q-Learning更新公式计算得出的值)之间的差异。
  6. DNN参数更新

    • 使用损失函数的梯度,我们更新深度神经网络(DNN)的参数( ω \omega ω),以减小预测误差。
  7. Q值网络更新

    • 周期性地或者在一定步骤之后,我们将Q值网络的权重更新为DNN的权重,以确保Q值网络也受到最新的训练影响。
  8. 探索策略更新

    • 随着训练的进行,我们可能会逐渐降低探索策略中的探索比例ε,以便智能体更多地依赖学到的Q值来做出决策,而不是随机探索。
  9. 重复

    • 重复执行上述步骤,不断与环境互动、收集经验、更新网络参数,直到智能体能够获得满意的策略并在任务中表现出色。

DQN 优化

DDQN:双 DQN,实现无偏估计

因为 DQN 的 Q 值更新是以下一个状态为参考,我们是神经网络近似估算给的都是最大值,层层传递,会导致偏大。

  1. 真实值和估计值(True value and an estimate):

    • 紫色虚线表示真实值,也就是在游戏中某个动作实际的分数。
    • 绿色实线表示我们的网络估计的值。在 DDQN 中,我们尝试让这条绿线尽可能接近紫线。
  2. 所有估计值和最大值(All estimates and max):

    • 这里有三条绿色实线,每一条代表一个独立的网络在不同时间的估计。
    • 黑色虚线代表这些估计中的最大值,DDQN 通过分开选择动作和评估动作的价值来避免过高估计这个最大值。
  3. 偏差作为状态函数(Bias as function of state):

    • 橙色线代表使用传统方法(一个网络同时选择动作和评估价值)时的偏差。
    • 蓝色线代表DDQN(分开网络)的偏差。我们可以看到蓝色线通常更接近零线,这意味着 DDQN 的估计更准确。
  4. 平均错误(Average error):

    • 这个图展示了平均而言,传统方法和DDQN方法的误差大小。
    • DDQN(蓝色线)的误差通常比传统方法(橙色线)的小,这表明 DDQN 提供了更准确的Q值估计。

在 DDQN 中,我们用两个网络分别来选择动作和评估动作的价值,这样做可以减少估计中的偏差和误差,而不是过分依赖单一的估计。

 

DDQN 只改变了目标值的计算方法,其他地方与DQN算法完全一致。

  • 让Q网络、Q 目标网络,俩个网络相互监督。

就像是有两个智能助手:

  • 一个助手(目标网络)负责告诉你下一步最好的行动方向
  • 另一个助手(估算网络)则用来判断这个行动有多好。

这两个助手轮流工作,确保你既知道往哪走,又不会对前方的好处期望过高。

损失函数的变化:

Q ( s t , a t ) ⟷ r t + 1 + γ Q ′ ( s t + 1 , a r g m a x a Q ( s t + 1 , a ) ) Q(s_t,a_t)\longleftrightarrow r_{t+1}+\gamma Q'\left(s_{t+1},\mathop{\mathrm{argmax}}_aQ\left(s_{t+1},a\right)\right) Q(st,at)rt+1+γQ(st+1,argmaxaQ(st+1,a))

具体来说:

  1. 估算网络(Evaluation Network)

    • 这个网络在每一步学习中都会更新。它基于最新的游戏数据(如玩家的动作和得到的奖励)来预测Q值,即每一个可能动作的期望奖励。
  2. 目标网络(Target Network)

    • 这个网络与估算网络结构相同,但它不会在每一步都更新。目标网络的参数会定期地、较慢地更新,例如,每N步学习之后,目标网络会复制估算网络的参数。这样可以提供一个相对稳定的目标值,以供估算网络学习。
  3. 相互监督的实现

    • 当智能体从环境中收集数据并需要更新估算网络的参数时,它会计算两部分信息:
      • 使用估算网络选出最好的动作(即在当前状态下预测未来奖励最大的动作)。
      • 使用目标网络评估这个最好动作的Q值(即这个最好动作的未来奖励)。
  4. 结合使用两个网络的优势

    • 由于估算网络趋向于过估计Q值,通过使用目标网络的稳定性来评估这个最好动作的Q值,算法可以减少估算网络可能带来的过度乐观的预测。
    • 在实际更新估算网络的参数时,会用目标网络的这个评估值作为学习目标,而不是直接用估算网络的输出。

通过这种方式,两个网络相互监督,一个提供动作选择的建议,另一个提供稳定的目标值,共同工作以实现更准确的学习和决策过程。

Dueling DQN:提高决策的准确性和效率


Dueling DQN 的核心思想是将 Q 值的估计分解为两个独立的部分:状态值(Value)和优势值(Advantage)。

  • 状态值(V(s)):这是在给定状态下,不考虑任何具体动作的情况下,智能体预计能获得的总回报。简单来说,它反映了仅凭当前状态就能判断的智能体处境的好坏。

  • 优势值(A(s, a)):这个值衡量了相对于其他可能动作,选择某个特定动作可能带来的额外回报。如果一个动作比其他动作好得多,它的优势值就会更高。

然后,这两个值合并起来,形成了对每个动作的 Q 值的估计:

  • Q ( s , a ) = V ( s ) + A ( s , a ) Q(s,a)=V(s)+A(s,a) Q(s,a)=V(s)+A(s,a)

但这里有一个问题:如果我们简单地加起来,可能会有多个状态和动作对的组合导致相同的 Q 值,这样就不能正确地学习它们的区别了。

为了解决这个问题,Dueling DQN 使用了一个技巧来稳定学习过程:它会从每个动作的优势值中减去所有动作优势值的平均值:

  • Q ( s , a ) = V ( s ) + ( A ( s , a ) − mean a A ( s , a ) ) Q(s,a)=V(s)+(A(s,a)-\text{mean}_aA(s,a)) Q(s,a)=V(s)+(A(s,a)meanaA(s,a))

强制让没有优势的动作(也就是平均动作)的优势值为零。

这样的结构使得网络能够更加明确地区分出在决策中状态价值和动作选择的影响。

一部分帮你看到当前位置的总体价值(比如这是不是一个好地方),另一部分让你看到每个动作(比如跳跃、下蹲或向右移动)的特别价值。

这样你就能更清楚地知道是继续在当前位置探索好,还是采取某个特别动作好。

DDQN改善了训练过程的稳定性并减少了估值偏差,而Dueling-DQN通过独立评估状态的总体价值和每个动作的相对优势,提高决策的准确性和效率。

Noisy DQN:增强模型的探索能力

在传统的DQN中,探索通常是通过 ε-greedy 策略实现的,即智能体有一定概率(ε)随机选择动作(探索),而不是总是选择它认为最好的动作(利用)。

随着训练的进行,这个概率逐渐降低,智能体越来越多地选择它认为的最佳动作。

Noisy DQN 采用了不同的方法来实现探索。它在网络的参数上添加可学习的噪声,使得即使在选择最佳动作时,智能体的行为也会有一定的随机性。

Noisy DQN 的创新之处在于它引入了噪声,直接添加到网络的参数中,而不是依靠外部的随机探索策略(如ε-greedy)。

这样做的好处是:

  1. 自动调整探索率:在Noisy DQN中,探索是通过网络内部的噪声决定的。随着训练的进行和智能体学习的改进,这个内部噪声可以自动调整,从而调整探索的程度。

  2. 更有效的探索:由于噪声是直接加在网络参数上的,这种方法可能比传统的随机探索更有效,因为它允许网络学习何时探索以及如何探索,而不是简单地随机选择动作,避免过早陷入固定行为模式(过度依赖经验)。

优先级经验回放

对传统的经验回放机制进行了改进。

在标准的经验回放中,智能体在训练过程中收集的经验(即从环境中得到的状态、动作、奖励和新状态的数据)被存储在一个记忆缓冲区中,然后这些经验被随机抽取来训练智能体。

这个方法的一个局限性是它假设所有经验都同等重要,但实际上并非如此。

优先级经验回放的核心思想是,某些经验比其他经验更有价值,应该更频繁地用于训练。

这种方法通过赋予每个经验一个优先级来实现,让学习率高的状态权重更大。

  • Q ( s t , a t ) = Q ( s t , a t ) + α [ r t + 1 + γ max ⁡ Q ( s t + 1 , a t + 1 ) − Q ( s t , a t ) ⏟ T D e r r o r ] Q(s_{t},a_{t})=Q(s_{t},a_{t})+\alpha[\underbrace{r_{t+1}+\gamma\operatorname*{max}Q(s_{t+1},a_{t+1})-Q(s_{t},a_{t})}_{\mathrm{TD~error}}] Q(st,at)=Q(st,at)+α[TD error rt+1+γmaxQ(st+1,at+1)Q(st,at)]
  1. 当前状态和动作(( s_t, a_t ))

    • 在时间 ( t ),智能体在状态 ( s_t ) 中,并选择了动作 ( a_t )。
  2. Q值更新(( Q(s_t, a_t) ) 更新)

    • ( Q(s_t, a_t) ) 是当前状态和动作对应的预期奖励值。我们想要更新这个值,使其更接近实际的预期奖励。
  3. 学习率 ( α \alpha α

    • α \alpha α 是学习率,它决定了新信息覆盖旧信息的程度。如果 α \alpha α 很大,新信息就会更快地覆盖旧信息。
  4. 即时奖励 ( r t + 1 ) ( r_{t+1} ) (rt+1)

    • r t + 1 r_{t+1} rt+1 是智能体在时间 ( t+1 ) 获得的即时奖励,即在状态 ( s_t ) 采取动作 ( a_t ) 后得到的奖励。
  5. 折扣因子 ( γ ) (\gamma ) γ

    • ( γ ) (\gamma ) γ) 是折扣因子,用于调整未来奖励的重要性。一个较低的 ( γ ) (\gamma ) γ 使智能体更专注于即时奖励,而较高的 ( γ ) (\gamma ) γ使智能体更考虑长远奖励。
  6. 最大未来奖励( max ⁡ Q ( s t + 1 , a t + 1 ) \max Q(s_{t+1}, a_{t+1}) maxQ(st+1,at+1)

    • max ⁡ Q ( s t + 1 , a t + 1 ) \max Q(s_{t+1}, a_{t+1}) maxQ(st+1,at+1) 是在下一个状态 s t + 1 s_{t+1} st+1 中所有可能动作的最大Q值,代表了智能体对未来最优动作的最佳预期奖励。
  7. 时序差分(Temporal Difference Error)

    • r t + 1 + γ max ⁡ Q ( s t + 1 , a t + 1 ) − Q ( s t , a t ) r_{t+1} + \gamma \max Q(s_{t+1}, a_{t+1}) - Q(s_t, a_t) rt+1+γmaxQ(st+1,at+1)Q(st,at)是TD误差,它代表了当前Q值和包括即时奖励及未来最大奖励的新估计之间的差异。
  8. 更新规则

    • 最后,整个公式 Q ( s t , a t ) = Q ( s t , a t ) + α [ T D e r r o r ] Q(s_t, a_t) = Q(s_t, a_t) + \alpha [TD~error] Q(st,at)=Q(st,at)+α[TD error] 表示用TD误差更新当前的Q值,以更好地估计在状态 ( s_t ) 下采取动作 ( a_t ) 的长期奖励。

OpenAI Q* :超越人类的自主系统

OpenAI在11月22号,给公司人员发了一封内部信,承认了 Q*,并将这个项目描述为 “超越人类的自主系统”。

Q* 是在搞 过程监督,通过奖励推理的每个正确步骤。

而不仅仅是结果监督,奖励正确的最终答案。

Q* 是 Q-learning 和 A* (可能)的组合,能大幅度提升推理能力,用于解决数学中高难度问题。

openai研究 Q-learning 的成果:https://noambrown.github.io。

Q-learning 需要大量的探索(左图二基本遍历完了),A* (左图三只遍历了一部分)。

Q* 结合了双方的优点(左图四):

  • 更高效选择策略:高效地学习最优策略,并且可以用于部分可观察的环境
  • 自我修剪:评估并去除其模型中不必要的部分,以提高效率和决策的过程,类似于一个人反思自己的思想和行为,实现自我提升。
  • 迁移学习:使 Q-learning 模型在一个领域受过训练后能够将其知识应用于不同但相关的领域的技术,比如会开摩托,学习自行车就很容易
  • 创造和不可知能力:在Q-learning框架中实现元学习可以使人工智能学会如何学习,这是一种自省创造性解决问题,提出以前没有考虑过的新颖的解决方案,如破解密码系统或发明新的数学方法。

最强的是不可知能力,成功破解了现代加密算法 AES,但是不可知。

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

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

相关文章

探索微软Edge:使用方法和心得分享

学习目标: 了解微软Edge的基本功能和使用方法。掌握在微软Edge上进行浏览、搜索和书签管理的技巧。学习如何使用微软Edge进行隐私和安全管理。探索微软Edge的扩展和其他高级功能。 学习内容: 微软Edge的简介:了解微软Edge的起源、特点和与其…

【halcon深度学习】dev_display_dl_data 移植到C# 上篇

效果展示 前言 在研究halcon深度学习的时候,会发现halcon的例程里面用到了大量的二次封装库函数。这些库函数内部也是由基础的算子组成。我们在halcon的开发环境里面用的很爽,但是一旦要在C#中使用,就会报错。 一开始,我想避开这个移植过程,直接使用halcon引擎(HDevEngi…

运筹视角下,体系化学习机器学习算法原理的实践和总结

文章目录 引言目标设计目标实践文章汇总经验总结一则预告 引言 上两周总结了我在体系化学习运筹学基础知识方面的个人经验,看过那篇文章的人可能知道,今年我还花了很多时间学习机器学习中各种模型的算法原理。 在工业应用中,机器学习和运筹…

Spring基础IoC(控制反转)与DI(依赖注入)

1. Spring 基础 1.1 什么是Spring框架?它能带来那些好处? Spring 是一个开源的轻量级的 Java 开发框架,可以帮助开发人员更高效的进行开发,主要优势在于简化开发和框架整合。 Spring框架整合了很多模块,这些模块可以…

智能优化算法应用:基于厨师算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于厨师算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于厨师算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.厨师算法4.实验参数设定5.算法结果6.参考文献7.MA…

2023/12/21作业

思维导图 代码 .text .global _start _start: 灯1 gpio时钟使能 [4]->1 0x5000A28 LDR R0,0x50000A28 指定寄存器地址 LDR R1,[R0]将寄存器取出放到R1 ORR R1,R1,#(0x1<<4)将第四位设置为1 STR R1,[R0]读取R0寄存器到R1 PE…

传统项目基于tomcat cookie单体会话升级分布式会话解决方案

传统捞项目基于servlet容器 cookie单体会话改造分布式会话方案 ##引入redis,spring-session依赖 <!--redis依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>&…

OKCC语音机器人的人机耦合来啦

目前市场上语音机器人的外呼形式基本就分为三种&#xff0c;一种纯AI外呼&#xff0c;第二种也是目前主流的AI外呼转人工。那么第三种也可能是未来的一种趋势&#xff0c;人机耦合&#xff0c;或者也叫人机协同。 那么什么是人机耦合呢&#xff1f; 人机耦合是为真人坐席创造相…

Featured Based知识蒸馏及代码(3): Focal and Global Knowledge (FGD)

文章目录 1. 摘要2. Focal and Global 蒸馏的原理2.1 常规的feature based蒸馏算法2.2 Focal Distillation2.3 Global Distillation2.4 total loss3. 实验完整代码论文: htt

逻辑卷学习

磁盘分区的缺点 1.无法扩容 2.必须使用的空间 3.没有备份: 一、逻辑卷的定义 LVM 是 Logical Volume Manager 的简称&#xff0c;译为中文就是逻辑卷管理。它是 Linux 下对硬盘分区的一种管理机制。LVM 适合于管理大存储设备&#xff0c;并允许用户动态调整文件系统的大小…

【电商项目实战】MD5登录加密及JSR303自定义注解

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《电商项目实战》。&#x1f3af;&#x1f3af; &am…

鸿蒙开发之崩溃信息收集FaultLogger

前申&#xff1a;果然系统的API没有让我失望&#xff0c;日志完全看不出来崩溃原因所在 一、使用 logCrash() {FaultLogger.query(FaultLogger.FaultType.JS_CRASH,(err,val) > {if (err) {console.log(fault log get an errJSON.stringify(err))return}let len val.lengt…

【C++】map和set

目录 1. 关联式容器 2. 键值对 3. 树形结构的关联式容器 4.set的介绍 接口count 接口lower_bound和upper_bound insert插入接口 5.map的介绍 接口insert 接口operator[] 6.multiset 7.multimap 8.map和set相关OJ 1. 关联式容器 vector 、 list 、 deque、forward_li…

electron使用electron-builder进行MacOS的 打包、签名、公证、上架、自动更新

一、前言 由于electron在macOS下的坑太多&#xff0c;本文不可能把所有的问题都列出来&#xff0c;也不可能把所有的解决方案贴出来&#xff1b;本文也不太会讲解每一个配置点为什么要这么设置的原因&#xff0c;因为有些点我也说不清&#xff0c;我尽可能会说明的。所以&…

运维实践|MySQL查询时如何正确使用正则表达式

&#x1f4eb; 作者简介&#xff1a;「六月暴雪飞梨花」&#xff0c;专注于研究Java&#xff0c;就职于科技型公司后端工程师 &#x1f3c6; 近期荣誉&#xff1a;华为云云享专家、阿里云专家博主、 &#x1f525; 三连支持&#xff1a;欢迎 ❤️关注、&#x1f44d;点赞、&…

Google Play上架:2023年度总结报告

今天是2023年的最后一个工作日&#xff0c;今天用来总结一下2023年关于谷歌商店上架的相关政策改动和对应的拒审解决方法。 目录 政策更新与改动2023 年 2 月 22 日2023 年 4 月5 日2023 年 7 月 12 日2023 年 10 月 25 日 开发者计划政策拒审邮件内容和解决办法 政策更新与改…

vue项目hdr格式文件放在assets下rgbeloader.load获取不到问题解决

如下图 我再App.vue组件中这样写 艾特符号定位 告诉系统 要src下的assets下的xhdr下的xidis.hdr 但是运行项目 他会告诉你找不到这个资源 我们改一下 我们组件时 App.vue 与assets同在 src目录下 用 ./去找 这样也是找不到的 我们需要将它放在静态资源包public下 public路…

【C++干货铺】STL中set和map的介绍和使用

个人主页点击直达&#xff1a;小白不是程序媛 C系列专栏&#xff1a;C干货铺 代码仓库&#xff1a;Gitee 目录 序列式容器 关联式容器 键值对 树形结构的关联式容器 set set的介绍 set的使用 set的模板参数列表 set的构造 ​编辑 set的容量 set的删除和查找 mult…

HPM6750开发笔记《开发环境的搭建》

目录 一&#xff0c;下载完整的HPM—SDK 二&#xff0c;安装硬件驱动 二&#xff0c;软件激活 三&#xff0c;创建工程 1.用文档中给的方法创建工程&#xff1a; 2.用sdk_env_v1.3.0中提供的工具创建工程&#xff1a; 一&#xff0c;下载完整的HPM—SDK 下载网址&#x…

Jmeter 分布式压测

‍你可以使用 JMeter 来模拟高并发秒杀场景下的压力测试。这里有一个例子&#xff0c;它模拟了同时有 5000 个用户&#xff0c;循环 10 次的情况‍。 请求默认配置 token 配置 秒杀接口 结果分析 但是&#xff0c;实际企业中&#xff0c;这种压测方式根本不满足实际需求。下面介…