A Closer Look at Invalid Action Masking in Policy Gradient Algorithms 论文阅读

这篇具有很好参考价值的文章主要介绍了A Closer Look at Invalid Action Masking in Policy Gradient Algorithms 论文阅读。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

强化学习无效动作的掩码处理

原文链接:http://arxiv.org/abs/2006.14171

简介

这篇文章证明了无效动作掩蔽可以看作是在计算动作概率分布时应用状态相关的可微函数来产生行为策略。接下来,设计了实验来比较无效动作掩饰和无效动作惩罚的性能。

无效动作惩罚:这是一种常见的方法,对无效动作给予负奖励,以便Agent学习通过不执行任何无效动作来最大化奖励。

我们的经验表明,当无效行动的空间扩大时,无效行动掩蔽的规模很大,Agent解决了我们想要的任务,而无效行动惩罚甚至难以探索第一个奖励。

然后,设计了实验来回答两个问题:

  1. 一旦用掩码训练Agent,去除无效操作掩码会发生什么?
  2. 当我们通过从屏蔽的动作概率分布中采样动作,但使用未屏蔽的动作概率分布来更新策略梯度时,当我们单纯地实施无效动作屏蔽时,Agent的性能如何?

背景

MDP过程【马尔科夫决策过程】
( S , A , P , ρ 0 , r , γ , T ) (S,A,P,\rho_{0},r,\gamma,T) (S,A,P,ρ0,r,γ,T)

符号 含义
S S S 状态空间
A A A 离散动作空间
P P P 状态转移概率矩阵
ρ 0 \rho_{0} ρ0 初始状态分布
r r r 奖励函数
γ \gamma γ 衰减因子
T T T 过程的最大长度
π θ \pi_{\theta} πθ 策略,给定状态下的动作概率分布

优化目标就是最大化下面的式子:
J = E τ [ ∑ t = 0 T − 1 γ t r t ] J=\mathbb{E}_{\tau}\left[\sum_{t=0}^{T-1}\gamma^tr_t\right] J=Eτ[t=0T1γtrt]
τ \tau τ:经验数据/交互记录, ( s 0 , a 0 , r 0 , … , s T − 1 , a T − 1 , r T − 1 ) (s_0,a_0,r_0,\ldots,s_{T-1},a_{T-1},r_{T-1}) (s0,a0,r0,,sT1,aT1,rT1)

也就是找到一个 θ \theta θ,使之对应的策略梯度 ∇ θ J \nabla_\theta J θJ最大,也就是梯度上升,让奖励最大化!
θ = θ + ∇ θ J \theta=\theta+\nabla_\theta J θ=θ+θJ
以下是早期对于策略梯度的估计:
∇ θ J = E τ ∼ π θ [ ∑ t = 0 T − 1 ∇ θ log ⁡ π θ ( a t ∣ s t ) G t ] G t = ∑ k = 0 ∞ γ k r t + k \nabla_{\theta}J=\mathbb{E}_{\tau\sim\pi_{\theta}}\left[\sum_{t=0}^{T-1}\nabla_{\theta}\log\pi_{\theta}(a_{t}|s_{t})G_{t}\right] \\ G_{t}=\sum_{k=0}^{\infty}\gamma^{k}r_{t+k} θJ=Eτπθ[t=0T1θlogπθ(atst)Gt]Gt=k=0γkrt+k

推不出来了!!!啊啊啊啊啊啊啊啊,感觉论文这一块写的很奇怪,可能是我水平不够,没看明白这个论文的公式,以下是个人推导过程。



推导如下:参考强化学习(九)–Policy Gradient推导过程 - 知乎 (zhihu.com)

针对公式(2),可以将 E τ [ ⋅ ] \mathbb{E}_{\tau}[·] Eτ[]理解为对交互记录的期望,因为策略的随机性会导致采样出不同的交互记录!理论上最大化的也要是其对应的期望值!

因此可以把式子(2)换为如下形式:
J ( θ ) = E τ [ ∑ t = 0 T − 1 γ t r t ] = ∑ τ P ( τ ; θ ) R ( τ ) J\left(\theta\right)=\mathbb{E}_{\tau}\left[\sum_{t=0}^{T-1}\gamma^tr_t\right]=\sum_{\tau}{P\left(\tau ;\theta\right)R\left(\tau\right)} J(θ)=Eτ[t=0T1γtrt]=τP(τ;θ)R(τ)
P ( τ ; θ ) P\left(\tau ;\theta\right) P(τ;θ):表示交互记录 τ \tau τ出现的概率

R ( τ ) R\left(\tau\right) R(τ):表示该条交互记录的奖励,也就是 ∑ t = 0 T − 1 γ t r t \sum_{t=0}^{T-1}\gamma^tr_t t=0T1γtrt

J ( θ ) J(\theta) J(θ),进行求导:
∇ θ J ( θ ) = ∇ θ ∑ τ P ( τ ; θ ) R ( τ ) = ∑ τ ∇ θ P ( τ ; θ ) R ( τ ) = ∑ τ P ( τ ; θ ) P ( τ ; θ ) ∇ θ P ( τ ; θ ) R ( τ ) = ∑ τ P ( τ ; θ ) ∇ θ P ( τ ; θ ) P ( τ ; θ ) R ( τ ) = ∑ τ P ( τ ; θ ) ∇ θ log ⁡ P ( τ ; θ ) R ( τ ) \begin{aligned} &\nabla_\theta J\left(\theta\right)=\nabla_\theta\sum_{\tau}P\left(\tau;\theta\right)R\left(\tau\right) \\ &=\sum_\tau\nabla_\theta P\left(\tau;\theta\right)R\left(\tau\right) \\ &=\sum_\tau\frac{P(\tau;\theta)}{P(\tau;\theta)}\nabla_\theta P\left(\tau;\theta\right)R\left(\tau\right) \\ &=\sum_{\tau}P\left(\tau;\theta\right)\frac{\nabla_{\theta}P(\tau;\theta)}{P(\tau;\theta)}R(\tau) \\ &=\sum_{\tau}P\left(\tau;\theta\right)\nabla_{\theta}\log P\left(\tau;\theta\right)R\left(\tau\right) \end{aligned} θJ(θ)=θτP(τ;θ)R(τ)=τθP(τ;θ)R(τ)=τP(τ;θ)P(τ;θ)θP(τ;θ)R(τ)=τP(τ;θ)P(τ;θ)θP(τ;θ)R(τ)=τP(τ;θ)θlogP(τ;θ)R(τ)
上述推导的最后一步的详细解释如下【 l o g log log没有底数的时候就是 l n ln ln】:
[ l o g a x ] ′ = 1 x l n a [ l o g ( u ) ] ′ = 1 u u ′ ∇ θ log ⁡ P ( τ ; θ ) = ∇ θ P ( τ ; θ ) P ( τ ; θ ) [log_ax]^{^{\prime}}=\frac1{xlna} \\ [log(u)]^{^{\prime}}=\frac1uu^{^{\prime}} \\ \nabla_{\theta}\log P\left(\tau;\theta\right)=\frac{\nabla_{\theta}P\left(\tau;\theta\right)}{P\left(\tau;\theta\right)} [logax]=xlna1[log(u)]=u1uθlogP(τ;θ)=P(τ;θ)θP(τ;θ)
即现在要对 ∇ θ J = ∑ τ P ( τ ; θ ) ∇ θ log ⁡ P ( τ ; θ ) R ( τ ) \nabla_\theta J=\sum_{\tau}P\left(\tau;\theta\right)\nabla_{\theta}\log P\left(\tau;\theta\right)R\left(\tau\right) θJ=τP(τ;θ)θlogP(τ;θ)R(τ)进行下一步推导,先求解 ∇ θ log ⁡ P ( τ ; θ ) \nabla_{\theta}\log P\left(\tau;\theta\right) θlogP(τ;θ)

设某一条交互路径的概率可以写为:
P ( τ ( i ) ; θ ) = ∏ t = 0 T − 1 P ( s t + 1 ( i ) ∣ s t ( i ) , a t ( i ) ) ⋅ π θ ( a t ( i ) ∣ s t ( i ) ) P\left(\tau^{(i)};\theta\right)=\prod_{t=0}^{T-1}P\left(s_{t+1}^{(i)}|s_{t}^{(i)},a_{t}^{(i)}\right)\cdot\pi_{\theta}\left(a_{t}^{(i)}|s_{t}^{(i)}\right) P(τ(i);θ)=t=0T1P(st+1(i)st(i),at(i))πθ(at(i)st(i))
其求导如下,其中第二行到第三行是因为 P ( s t + 1 ( i ) ∣ s t ( i ) , u t ( i ) ) P\left(s_{t+1}^{(i)}|s_t^{(i)},u_t^{(i)}\right) P(st+1(i)st(i),ut(i))中无参数 θ \theta θ,因此可在求导过程中消掉:
∇ θ log ⁡ P ( τ ( i ) ; θ ) = ∇ θ log ⁡ [ ∏ t = 0 T − 1 P ( s t + 1 ( i ) ∣ s t ( i ) , a t ( i ) ) ⋅ π θ ( a t ( i ) ∣ s t ( i ) ) ] = ∇ θ [ ∑ t = 0 T − 1 log ⁡ P ( s t + 1 ( i ) ∣ s t ( i ) , a t ( i ) ) + ∑ t = 0 T log ⁡ π θ ( a t ( i ) ∣ s t ( i ) ) ] = ∇ θ [ ∑ t = 0 T − 1 log ⁡ π θ ( a t ( i ) ∣ s t ( i ) ) ] = ∑ t = 0 T − 1 ∇ θ log ⁡ π θ ( a t ( i ) ∣ s t ( i ) ) \begin{aligned} &\nabla_{\theta}\log P\left(\tau^{(i)};\theta\right)=\nabla_{\theta}\log\left[\prod_{t=0}^{T-1}P\left(s_{t+1}^{(i)}|s_{t}^{(i)},a_{t}^{(i)}\right)\cdot\pi_{\theta}\left(a_{t}^{(i)}|s_{t}^{(i)}\right)\right] \\ &=\nabla_\theta\left[\sum_{t=0}^{T-1}\log P\left(s_{t+1}^{(i)}|s_t^{(i)},a_t^{(i)}\right)+\sum_{t=0}^T\log\pi_\theta\left(a_t^{(i)}|s_t^{(i)}\right)\right] \\ &=\nabla_\theta\left[\sum_{t=0}^{T-1}\log\pi_\theta\left(a_t^{(i)}|s_t^{(i)}\right)\right] \\ &=\sum_{t=0}^{T-1}\nabla_\theta\log\pi_\theta\left(a_t^{(i)}|s_t^{(i)}\right) \end{aligned} θlogP(τ(i);θ)=θlog[t=0T1P(st+1(i)st(i),at(i))πθ(at(i)st(i))]=θ[t=0T1logP(st+1(i)st(i),at(i))+t=0Tlogπθ(at(i)st(i))]=θ[t=0T1logπθ(at(i)st(i))]=t=0T1θlogπθ(at(i)st(i))

故策略梯度的式子可以写为:
∇ θ J = E τ [ ∑ t = 0 T − 1 ∇ θ log ⁡ π θ ( a t ( i ) ∣ s t ( i ) ) ∗ ∑ t = 0 T − 1 γ t r t ] \nabla_\theta J=\mathbb{E}_{\tau}[\sum_{t=0}^{T-1}\nabla_\theta\log\pi_\theta\left(a_t^{(i)}|s_t^{(i)}\right)* \sum_{t=0}^{T-1}\gamma^tr_t] θJ=Eτ[t=0T1θlogπθ(at(i)st(i))t=0T1γtrt]



无效动作的掩码

假设一个MDP过程为:

状态空间 S : { s 0 , s 1 } S:\{s_0,s_1\} S{s0,s1}

动作空间 A : { a 0 , a 1 , a 2 , a 3 } A:\{a_0,a_1,a_2,a_3\} A:{a0,a1,a2,a3}

此时策略 π θ \pi_\theta πθ由向量 θ \theta θ来参数化, θ = [ l 1 , l 2 , l 3 , l 4 ] \theta = [l_1,l_2,l_3,l_4] θ=[l1,l2,l3,l4]

假设初始 θ = [ 1 , 1 , 1 , 1 ] \theta=[1,1,1,1] θ=[1,1,1,1],故各个动作的采样概率 π θ = [ 0.25 , 0.25 , 0.25 , 0.25 ] \pi_\theta=[0.25,0.25,0.25,0.25] πθ=[0.25,0.25,0.25,0.25]

且无论为为什么动作,都可以让智能体从初始状态 s 0 s_0 s0转移到末态 s 1 s_1 s1,并得到1的奖励
π θ ( ⋅ ∣ s 0 ) = [ π θ ( a 0 ∣ s 0 ) , π θ ( a 1 ∣ s 0 ) , π θ ( a 2 ∣ s 0 ) , π θ ( a 3 ∣ s 0 ) ] = s o f t m a x ( [ l 0 , l 1 , l 2 , l 3 ] ) = [ 0.25 , 0.25 , 0.25 , 0.25 ] \begin{aligned} \pi_{\theta}(\cdot|s_{0})& =[\pi_{\theta}(a_{0}|s_{0}),\pi_{\theta}(a_{1}|s_{0}),\pi_{\theta}(a_{2}|s_{0}),\pi_{\theta}(a_{3}|s_{0})] \\ &=\mathrm{softmax}([l_{0},l_{1},l_{2},l_{3}]) \\ &=[0.25,0.25,0.25,0.25] \end{aligned} πθ(s0)=[πθ(a0s0),πθ(a1s0),πθ(a2s0),πθ(a3s0)]=softmax([l0,l1,l2,l3])=[0.25,0.25,0.25,0.25]
其中 π θ ( a i ∣ s 0 ) = exp ⁡ ( l i ) ∑ j exp ⁡ ( l j ) \pi_\theta(a_i|s_0)=\frac{\exp(l_i)}{\sum_j\exp(l_j)} πθ(ais0)=jexp(lj)exp(li)

根据策略梯度的推导结果,可以得知,该交互记录的策略梯度为:
∇ θ J = E τ ∼ π θ [ ∑ t = 0 T − 1 ∇ θ log ⁡ π θ ( a t ∣ s t ) G t ] \nabla_{\theta}J=\mathbb{E}_{\tau\sim\pi_{\theta}}\left[\sum_{t=0}^{T-1}\nabla_{\theta}\log\pi_{\theta}(a_{t}|s_{t})G_{t}\right] θJ=Eτπθ[t=0T1θlogπθ(atst)Gt]
其中交互记录只有一条,假设采样的结果是动作 a 0 a_0 a0,奖励大小为1

因此:
∇ θ J = E τ ∼ π θ [ ∑ t = 0 T − 1 ∇ θ log ⁡ π θ ( a t ∣ s t ) G t ] = ∇ θ log ⁡ π θ ( a 0 ∣ s 0 ) G 0 \begin{aligned} \nabla_{\theta}J&=\mathbb{E}_{\tau\sim\pi_{\theta}}\left[\sum_{t=0}^{T-1}\nabla_{\theta}\log\pi_{\theta}(a_{t}|s_{t})G_{t}\right]\\ &=\nabla_{\theta}\log\pi_{\theta}(a_{0}|s_{0})G_{0} \end{aligned} θJ=Eτπθ[t=0T1θlogπθ(atst)Gt]=θlogπθ(a0s0)G0
而对于 ∇ θ log ⁡ π θ ( a t ∣ s t ) \nabla_{\theta}\log\pi_{\theta}(a_{t}|s_{t}) θlogπθ(atst),由于是对 θ \theta θ求导,而 θ \theta θ是一个四维向量,因此,其求导结果为4*4矩阵,同时该矩阵的各个元素的取值为:
( ∇ θ log ⁡ softmax ( θ ) j ) i = { ( 1 − exp ⁡ ( l j ) ∑ j exp ⁡ ( l j ) ) if  i = j − exp ⁡ ( l j ) ∑ j exp ⁡ ( l j ) otherwise (\nabla_\theta\log\text{softmax}(\theta)_j)_i=\begin{cases}(1-\frac{\exp(l_j)}{\sum_j\exp(l_j)})&\text{if }i=j\\\frac{-\exp(l_j)}{\sum_j\exp(l_j)}&\text{otherwise}\end{cases} (θlogsoftmax(θ)j)i= (1jexp(lj)exp(lj))jexp(lj)exp(lj)if i=jotherwise
故最终的策略梯度求解结果为 ∇ θ J = [ 0.75 , − 0.25 , − 0.25 , − 0.25 ] \nabla_{\theta}J=[0.75,-0.25,-0.25,-0.25] θJ=[0.75,0.25,0.25,0.25]

而此时假设动作 a 2 a_2 a2不能被采样,是一个无效动作,因此可以用一个大负数替换要屏蔽的操作的logits来实现!
π θ ′ ( ⋅ ∣ s 0 ) = s o f t m a x ( m a s k ( [ l 0 , l 1 , l 2 , l 3 ] ) ) = s o f t m a x ( [ l 0 , l 1 , M , l 3 ] ) = [ π θ ′ ( a 0 ∣ s 0 ) , π θ ′ ( a 1 ∣ s 0 ) , ϵ , π θ ′ ( a 3 ∣ s 0 ) ] = [ 0.33 , 0.33 , 0.0000 , 0.33 ] \begin{aligned} \pi_{\theta}^{\prime}(\cdot|s_{0})&=\mathrm{softmax}(mask([l_{0},l_{1},l_{2},l_{3}])) \\ &=\mathrm{softmax}([l_{0},l_{1},M,l_{3}]) \\ &=[\pi_{\theta}^{\prime}(a_{0}|s_{0}),\pi_{\theta}^{\prime}(a_{1}|s_{0}),\epsilon,\pi_{\theta}^{\prime}(a_{3}|s_{0})] \\ &=[0.33,0.33,0.0000,0.33] \end{aligned} πθ(s0)=softmax(mask([l0,l1,l2,l3]))=softmax([l0,l1,M,l3])=[πθ(a0s0),πθ(a1s0),ϵ,πθ(a3s0)]=[0.33,0.33,0.0000,0.33]
故最后的策略梯度计算结果为:
∇ θ J = E τ [ ∇ θ ∑ t = 0 T − 1 log ⁡ π θ ′ ( a t ∣ s t ) G t ] = ∇ θ log ⁡ π θ ′ ( a 0 ∣ s 0 ) G 0 = [ 0.67 , − 0.33 , 0.0000 , − 0.33 ] \begin{aligned} \nabla_{\theta}J& =\mathbb{E}_{\tau}\left[\nabla_{\theta}\sum_{t=0}^{T-1}\log\pi_{\theta}^{\prime}(a_{t}|s_{t})G_{t}\right] \\ &=\nabla_{\theta}\log\pi_{\theta}^{\prime}(a_{0}|s_{0})G_{0} \\ &=[0.67,-0.33,0.0000,-0.33] \end{aligned} θJ=Eτ[θt=0T1logπθ(atst)Gt]=θlogπθ(a0s0)G0=[0.67,0.33,0.0000,0.33]
上述例子可以有效说明,无效动作的掩码似乎不仅仅是“重新规范概率分布”,还可以使无效动作的logits相对应的梯度为零!

无效动作的掩码会生成有效的策略梯度

动作选择过程受到一个在 π θ \pi_\theta πθ之外的过程所影响,该过程用来计算掩码。因此,人们自然会想知道政策梯度定理是针对该情况要如何应用?

分析表明,无效动作的掩码过程可以看作是一个状态相关的可微函数,适用于 π θ ′ \pi_{\theta}^{\prime} πθ的计算,因此无效动作策略可以看作是 π θ ′ \pi_{\theta}^{\prime} πθ的策略梯度更新。


证明:假设s∈S是任意的,并将无效动作掩蔽的过程视为一个可微函数 i n v s inv_s invs ,该函数被应用于由策略 π θ ′ \pi_{\theta}^{\prime} πθ给定状态输出的Logits l s l_s ls 。那么就有:
π θ ′ ( ⋅ ∣ s ) = softmax ( m a s k ( l ( s ) ) ) m a s k ( l ( s ) ) i = { l i if  a i  is valid in  s M otherwise \begin{aligned} \pi_{\theta}^{\prime}(\cdot|s)& =\text{softmax}(mask(l(s))) \\ mask(l(s))_i& \left.=\left\{\begin{aligned}&l_i&&\text{if }a_i\text{ is valid in }s\\&M&&\text{otherwise}\end{aligned}\right.\right. \end{aligned} πθ(s)mask(l(s))i=softmax(mask(l(s)))={liMif ai is valid in sotherwise
显然,掩码对于logits中的元素来说要么是一个恒等函数,要么是常数函数。

【恒等函数即:输出=输入】

因为这两类函数是可微的,所以可导。因此, π θ ′ \pi_{\theta}^{\prime} πθ对于参数 θ \theta θ是可微的,也就是说 ∂ π θ ′ ( a ∣ s ) ∂ θ \begin{aligned}\frac{\partial\pi_\theta^{\prime}(a|s)}{\partial\theta}\end{aligned} θπθ(as)对于所有的 a ∈ A , s ∈ S a\in A,s\in S aA,sS,都满足策略梯度定理的假设!因此,无效操作策略是策略 π θ ′ \pi_{\theta}^{\prime} πθ的策略梯度。

需要注意的是,掩码过程不是分段线性函数。如果绘制掩码过程,它要么是一个单位函数【恒等函数】,要么是常数函数,取决于状态 s s s,从-∞到+∞。因此,我们称掩码为状态相关的可微函数。

没有对后续实验部分进行记录

                                            自行去阅读原文吧!


引用阅读

https://zhuanlan.zhihu.com/p/445681092
hhttp://arxiv.org/abs/2006.14171
https://zhuanlan.zhihu.com/p/57285213文章来源地址https://www.toymoban.com/news/detail-839685.html

到了这里,关于A Closer Look at Invalid Action Masking in Policy Gradient Algorithms 论文阅读的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 强化学习PPO从理论到代码详解(1)--- 策略梯度Policy gradient

    Proximal Policy Optimization(PPO) 近端策略优化,可以说是目前最稳定,最强的强化学习算法之一了,也是openAI默认的强化学习算法,有多叼不用我说了吧。 笔者在强化学习的道路上看来很多书,看了很多代码,和很多大佬的博客,只是很多都是侧重一个方面,所以我在吸取百家之

    2024年02月07日
    浏览(42)
  • R语言 Error in make.names(col.names, unique = TRUE) : invalid multibyte string at ‘<b1><ea><cc><e2>‘

    R语言导入CSV文件的时候,代码如下: 出现以下报错: Error in make.names(col.names, unique = TRUE) : invalid multibyte string at \\\'b1eacce2\\\' 报错的解决方法如下: 报错的原因是,导入文件的编码格式不是read.csv()函数的默认格式。我们可以使用windows自带的“记事本/notepad”软件来查看格式,打

    2024年02月02日
    浏览(46)
  • MapReduce and Hadoop: An InDepth Look at the Relationship

    大数据是当今世界最热门的话题之一,它指的是那些以前无法使用传统数据库和数据处理技术来处理的数据。这些数据通常是非结构化的,例如社交网络的用户行为数据、传感器数据、图像、音频和视频等。处理这些大型、分布式、多结构的数据需要一种新的数据处理技术。

    2024年02月20日
    浏览(30)
  • UE4/5动画系列(3.通过后期处理动画蓝图的头部朝向Actor,两种方法:1.通过动画层接口的look at方法。2.通过control rig的方法)

    目录 蓝图 点积dot Yaw判断  后期处理动画蓝图  动画层接口 ControlRig: 首先我们创建一个actor类,这个actor类是我们要看的东西,actor在哪,我们的动物就要看到哪里(同样,这个我们也是做一个父类,因为它会和我们的蓝图类模板一起使用)。 这样子做,将模型作为根(也可

    2024年02月11日
    浏览(62)
  • sql_in_action

    某互联网公司数据分析岗位SQL面试题,要求计算每个卖家销量最高的商品。 某互联网公司数据分析岗位SQL面试题,要求计算每个商家的自建商品销量占总销量的比例。 某互联网公司数据分析岗位SQL面试题,要求计算每个用户首次销售日期后 30 天内累计销售金额。 某互联网(

    2024年02月16日
    浏览(47)
  • Kubernetes-in-action (十二)

    resource name usage note doc Pod 实际应用run的地方,由至少一个容器组成 如果容器内进程启动失败,pod资源仍然存在 Kubernetes-in-action (一) ReplicaSet 管理pod,弹性伸缩 只关心pod的数量,不关心pod的状态 Kubernetes-in-action (二) Role/ClusterRole 创建角色并设置角色拥有的权限 Kubernetes-in-acti

    2023年04月14日
    浏览(31)
  • Rust in Action笔记 第六章 内存

    OptionT 类型在Rust中使用了空指针优化(null pointer optimization)来保证该类型在编译后的二进制文件中占用0个字节。 None 变量是通过一个空指针 null pointer 来表示; 内存地址、指针、引用的区别,内存地址是指在内存中的一个字节,由汇编语言提供的一个抽象;指针,有时候也

    2024年02月08日
    浏览(49)
  • Rust in Action笔记 第五章 深入理解数据

    如果希望看到f32类型的数转换成整型数字u32类型,需要在unsafe包裹下调用 std::mem::transmute(data) ,因为在安全的Rust语法中没有把整型数据按照bit转换成浮点数据的实现,如果想要看到浮点数的二进制输出(通过 {:b} ),需要先通过unsafe把浮点数转换成整型数再输出; 大端(b

    2024年02月09日
    浏览(37)
  • Rust in Action笔记 第九章 时间管理

    本章主要讲如何实现一个网络时间协议NTP(Network Time Protocol)客户端,谷歌的世界时间同步误差大概在7毫秒,开源网站CockroachDB的延迟在数十毫秒,使用了NTP协议,在处理与时间敏感的数据时, chrono 库成为了事实上的标准库; 由于潮汐影响和地球转矩的问题,事实上每一秒

    2024年02月12日
    浏览(71)
  • Rx.NET in Action 第一章学习笔记

    什么是反应式程序?它们有什么用?使用反应式扩展(Rx)编程,会如何改变你编写代码的方式?在开始使用 Rx 之前应该做些什么?为什么 Rx 比传统的事件驱动编程更好? 这些都是我们将在前三章开始讨论的问题。 你将了解什么是反应式系统及反应式程序,以及为什么要关

    2024年02月13日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包