【强化学习的数学原理-赵世钰】课程笔记(二)贝尔曼公式

【强化学习的数学原理-赵世钰】课程笔记(二)贝尔曼公式

一. 内容概述

1. 第二章主要有两个内容

(1)一个核心概念:状态值(state value):从一个状态出发,沿着一个策略我所得到的奖励回报的平均值。状态值越高,说明对应的策略越好。之所以关注状态值,是因为它能评价一个策略的好坏

(2)基本工具:贝尔曼公式(the Bellman equation):

  • 用于分析状态值,描述所有状态和状态值之间的关系,这个关系就是一个方程,一个等式。通过求解这个方程就可以求解出来一个给定策略的状态值,因此就可以评价这个策略的好坏。
  • 求解贝尔曼公式进而得到一个策略所对应的状态值这样的一个过程被称为策略评价(policy evaluation),policy evaluation 在强化学习中是非常基础的一个概念,我评价了一个策略得到它的值,然后基于它的值再改进策略然后循环下去,最后就能得到一个最优的策略。

2. 第二章大纲

  1. 激励性实例(Motivating examples)
  2. 状态值(state value)
  3. 贝尔曼公式( Bellman equation):推导
  4. 贝尔曼公式( Bellman equation):矩阵向量形式
  5. 贝尔曼公式( Bellman equation):求解状态值(state value)
  6. 动作值:从 state value 过渡到 action value

二. 激励性实例(Motivating examples)

1. 例子1:为什么回报/收益(return)很重要?

(1)什么是回报(return)

​ 沿着轨迹获得的奖励(reward)的(折扣discounted)总和。

​ What is return? The (discounted) sum of the rewards obtained along a trajectory.

(2)为什么回报(return)很重要?

下图的第三个表示,这个策略在 s1 状态有百分之 50 的概率向右,有百分之 50 的概率向下。

在这里插入图片描述

问题: 从起点 s 1 s_1 s1 出发,哪项策略(policy)是 “最好的”?哪项 “最差”?

直觉: 第一个最好,第二个最差,因为第二个进入了forbidden area。第三个策略是不好也不差,它有一定的概率进入forbidden area。

数学: 我们能用数学来描述这种直觉吗?

回报(return)可以用来评估策略(policy),return 可以告诉我们哪个策略好,哪个策略坏,这样才能不断地改进策略。请参阅下文。

  • 根据策略 1(左图),从 s 1 s_1 s1 开始,折扣回报(discounted return)为

r e t u r n 1 = 0 + γ 1 + γ 2 1 + … , = γ ( 1 + γ + γ 2 + … ) , = γ 1 − γ \begin{align} return_1 &= 0 + \gamma 1 + \gamma^2 1 + \dots, \\ &=\gamma(1 + \gamma + \gamma^2 + \dots), \\ &= \frac{\gamma}{1 - \gamma} \end{align} return1=0+γ1+γ21+,=γ(1+γ+γ2+),=1γγ

  • 根据策略 2(中图),从 s 1 s_1 s1 开始,折扣回报(discounted return)为

r e t u r n 2 = − 1 + γ 1 + γ 2 1 + … , = − 1 + γ ( 1 + γ + γ 2 + … ) , = − 1 + γ 1 − γ \begin{align} return_2 &= -1 + \gamma 1 + \gamma^2 1 + \dots, \\ &= -1 + \gamma(1 + \gamma + \gamma^2 + \dots), \\ &= -1 + \frac{\gamma}{1 - \gamma} \end{align} return2=1+γ1+γ21+,=1+γ(1+γ+γ2+),=1+1γγ

  • 根据策略 3(右图),从 s 1 s_1 s1 开始,折扣回报(discounted return)为(策略3是随机性的Policy 3 is stochastic!)

r e t u r n 3 = 0.5 ( − 1 + γ 1 − γ ) + 0.5 ( γ 1 − γ ) = − 0.5 + γ 1 − γ \begin{align} return_3 &= 0.5 (-1 + \frac{\gamma}{1 - \gamma})+ 0.5(\frac{\gamma}{1-\gamma}) \\ &= -0.5 + \frac{\gamma}{1-\gamma} \end{align} return3=0.5(1+1γγ)+0.5(1γγ)=0.5+1γγ

策略 3 这里其实是在计算期望。这里已经不是 return 的概念了,return 的概念是针对一个轨迹定义的,现在有两个轨迹,我们在做的是求平均值,即求期望。其实这里求的是状态值(state value)。

总之,从 s 1 s_1 s1 开始
r e t u r n 1 > r e t u r n 3 > r e t u r n 2 return_1 > return_3 > return_2 return1>return3>return2
上述不等式表明,第一种策略是最好的,第二种策略是最差的,这与我们的直觉完全相同。

计算回报(return)对于评估一项策略非常重要。

2. 例子2:如何计算回报(return)?

在这里插入图片描述

上图中四个状态(state)是 s 1 , s 2 , s 3 , s 4 s_1,s_2,s_3,s_4 s1,s2,s3,s4,策略(policy)是绿色的箭头,奖励(reward)是 r 1 , r 2 , r 3 , r 4 r_1,r_2,r_3,r_4 r1,r2,r3,r4

(1)方法1:通过定义

v i v_i vi 表示从 s i ( i = 1 , 2 , 3 , 4 ) s_i(i = 1,2,3,4) si(i=1,2,3,4)出发得到的回报(return)。

注意,轨迹是无穷的,例如,从 s 1 s_1 s1 出发: s 1 → s 2 → s 3 → s 4 → s 1 → s 2 … . s_1 \rightarrow s_2 \rightarrow s_3 \rightarrow s_4 \rightarrow s_1 \rightarrow s_2\dots. s1s2s3s4s1s2.会一直走下去
v 1 = r 1 + γ r 2 + γ 2 r 3 + … v 2 = r 2 + γ r 3 + γ 2 r 4 + … v 3 = r 3 + γ r 4 + γ 2 r 1 + … v 4 = r 4 + γ r 1 + γ 2 r 2 + … \begin{align} v_1 &= r_1 + \gamma r_2 + \gamma^2 r_3 + \dots \\ v_2 &= r_2 + \gamma r_3 + \gamma^2 r_4 + \dots \\ v_3 &= r_3 + \gamma r_4 + \gamma^2 r_1 + \dots \\ v_4 &= r_4 + \gamma r_1 + \gamma^2 r_2 + \dots \\ \end{align} v1v2v3v4=r1+γr2+γ2r3+=r2+γr3+γ2r4+=r3+γr4+γ2r1+=r4+γr1+γ2r2+

(2)方法2:

v 1 = r 1 + γ ( r 2 + γ r 3 + … ) = r 1 + γ v 2 v 2 = r 2 + γ ( r 3 + γ r 4 + … ) = r 2 + γ v 3 v 3 = r 3 + γ ( r 4 + γ r 1 + … ) = r 3 + γ v 4 v 4 = r 4 + γ ( r 1 + γ r 2 + … ) = r 4 + γ v 1 \begin{align} v_1 &= r_1 + \gamma (r_2 + \gamma r_3 + \dots) = r_1 + \gamma v_2 \\ v_2 &= r_2 + \gamma (r_3 + \gamma r_4 + \dots) = r_2 + \gamma v_3 \\ v_3 &= r_3 + \gamma (r_4 + \gamma r_1 + \dots) = r_3 + \gamma v_4 \\ v_4 &= r_4 + \gamma (r_1 + \gamma r_2 + \dots) = r_4 + \gamma v_1 \\ \end{align} v1v2v3v4=r1+γ(r2+γr3+)=r1+γv2=r2+γ(r3+γr4+)=r2+γv3=r3+γ(r4+γr1+)=r3+γv4=r4+γ(r1+γr2+)=r4+γv1

​ 上面这一组式子告诉我们:从不同状态出发得到的 return 依赖于从其他状态出发得到的 return,回报(return)相互依赖。

​ 这一思想在强化学习中被称为 Bootstrapping !

现代的意思就是引申出来:我从自己出发,然后不断地迭代所得到的一些结果。

如何使用这些方程?把上面的一组式子写成矩阵向量的形式(matrix-vector form):

在这里插入图片描述

​ 可被重写成一种更简化的形式:
v = r + γ P v v = r + \gamma Pv v=r+γPv
在这里插入图片描述

I I I (identity matrix)减去 γ \gamma γ 然后乘以P 矩阵,然后乘以 v v v 就等于 γ \gamma γ ,把 ( I − v P ) (I - vP) (IvP)这个矩阵求逆,然后乘以 γ \gamma γ ,就得到了 v v v

从上面的方程可以解出从不同状态出发的价值(value) v ,这就是贝尔曼公式(针对这个特定的确定性 deterministic 问题)!

  • 虽然简单,但它展示了核心概念:一个状态(state)的价值(value)依赖于其他状态(state)的价值(value)
  • 矩阵向量形式更容易理解如何求解状态值(state value)。

练习:

​ 考虑图中所示的策略(policy)。请写出回报(return)之间的关系(即写出贝尔曼方程)

在这里插入图片描述

​ 答案:(从 s 1 s_1 s1 出发,以奖励 0 到状态 s 3 s_3 s3 ,从状态 s 3 s_3 s3 出发得到的 return 是 v 3 v_3 v3;从 s 2 s_2 s2 出发,以奖励 1 到状态 s 4 s_4 s4 ,从状态 s 4 s_4 s4 出发 得到的 return 是 v 4 v_4 v4;…)
v 1 = 0 + γ v 3 v 2 = 1 + γ v 4 v 3 = 1 + γ v 4 v 4 = 1 + γ v 4 \begin{align} v_1 = 0 + \gamma v_3 \\ v_2 = 1 + \gamma v_4 \\ v_3 = 1 + \gamma v_4 \\ v_4 = 1 + \gamma v_4 \\ \end{align} v1=0+γv3v2=1+γv4v3=1+γv4v4=1+γv4
​ 如何求解?这是一个线性方程组,很好求解。 我们可以先计算 v 4 v_4 v4,然后计算 v 3 , v 2 , v 1 v_3,v_2,v_1 v3,v2,v1

三. 状态值(state value)

单步:

单步(single-step)流程: b
S t → A t R t + 1 , S t + 1 S_t \xrightarrow{A_t} R_{t+1},S_{t+1} StAt Rt+1,St+1

  • t , t + 1 t,t + 1 t,t+1:离散时间实例, t t t 指当前的时刻, t + 1 t+1 t+1 指下一个时刻
  • S t : t S_t:t Stt 时刻的状态
  • A t A_t At:在状态 S t S_t St 采取的动作
  • R t + 1 R_{t+1} Rt+1:在状态 S t S_t St 采取动作 A t A_t At 之后获得的奖励(reward)(有时也写成 R t R_t Rt,写成什么都没有区别,只是一个习惯,但是一般都写成 R t + 1 R_{t+1} Rt+1
  • S t + 1 S_{t+1} St+1:采取动作 A t A_t At 后转换到的状态

​ 注意, S t 、 A t 、 R t + 1 S_t、A_t、R_{t+1} StAtRt+1 都是大写的,代表随机变量(random variables),就是我们可以对它进行一系列的操作,比如求期望(expectation)。

​ 每一步的所有跳跃(step)都由以下概率分布(probability distributions)所决定:

  • S t S_t St 要采取什么样的动作(action)由 策略 π \pi π 来决定
  • S t S_t St 采取动作(take action) A t A_t At,要得到什么样的奖励(Reward)由奖励概率(reward probability) 决定
  • S t S_t St 采取动作(take action) A t A_t At,要跳到下一个什么状态(State)由状态转移概率( state transition probability) 决定

在这里插入图片描述

​ governed:受约束的,所规管的

多步:

​ 考虑以下多步骤轨迹(multi-step trajectory):
S t → A t R t + 1 , S t + 1 → A t + 1 R t + 2 , S t + 2 → A t + 2 R t + 3 , … S_t \xrightarrow{A_t} R_{t+1},S_{t+1} \xrightarrow{A_{t+1}} R_{t+2},S_{t+2} \xrightarrow{A_{t+2}} R_{t+3},\dots StAt Rt+1,St+1At+1 Rt+2,St+2At+2 Rt+3,
​ 折扣回报(discounted return)Gt 是所有瞬时回报(immediate reward)与折扣因子(discount rate)乘积相加:
G t = R t + 1 + γ R t + 2 + γ 2 R t + 3 + … G_t = R_{t+1}+ \gamma R_{t+2} + \gamma^2 R_{t+3} + \dots Gt=Rt+1+γRt+2+γ2Rt+3+

  • γ ∈ [ 0 , 1 ) \gamma \in [0,1) γ[0,1) 是折扣率(discount rate)。
  • G t G_t Gt 也是一个随机变量(random variables),因为 R t + 1 , R t + 2 R_{t+1},R_{t+2} Rt+1,Rt+2都是随机变量(random variables)。

正式定义状态值(state value):

​ 折扣回报(discounted return) G t G_t Gt 的期望值(或称为期望值 expectation 或平均值 mean)被定义为状态值函数(state-value function),或简称为状态值(state value):

在这里插入图片描述

​ 注意:

  • 状态值(state value)它是 s 的函数, 是一种条件期望(conditional expectation),条件是状态从 s 开始。从不同的状态 s 出发,得到的轨迹不同,得到的折扣回报(discounted return) G t G_t Gt 也不同
  • 状态值(state value)它是策略 π \pi π 的函数, 对于不同的策略(policy) ,会得到不同的轨迹,不同的轨迹会得到不同的折扣回报(discounted return)Gt,就会得到不同的状态值(state value)
  • 它代表一个状态的 “价值”。如果状态值(state value)越大,那么从这个状态出发的策略(policy)就更好,因为可以获得更大的累积回报(return)。

问: 回报(return)与状态值(state value)之间的关系是什么?

答:

回报(return)是针对单个轨迹(trajectory)求的 return;

状态值(state value)针对多个轨迹(trajectory)得到的 return 再求平均值。

如果从一个状态出发,有可能得到多个轨迹(trajectory),这时候回报(return)与状态值(state value)显然有区别;

但假如从一个状态出发,一切都是确定性的,只能得到一条轨迹(trajectory),这时候那个状态的回报(return)与那个状态的状态值(state value)是一样的。

在这里插入图片描述

例子:

在这里插入图片描述

​ 这三个例子分别对应三个策略 π 1 , π 2 , π 3 \pi_1,\pi_2,\pi_3 π1,π2,π3,三个策略导致了三个轨迹(trajectory 理解为根据策略可能走出的轨迹),要计算在这三个不同策略下同一个状态 s 1 s_1 s1 的状态值(state value)

在这里插入图片描述

​ 策略 1 和 2 从 s 1 s_1 s1 出发,能得到唯一的一个 trajectory,这个 trajectory 的 return 就是它们分别的 state value

​ 策略 3 有两条轨迹,状态值(state value)是这两条轨迹分别得到的回报(return)的平均值。就是把 probability 乘到前面去,这实际上就是期望(expectation)的求法。

​ 比较三个策略导致的状态值(state value)的大小可知,第一种策略是最好的,第二种策略是最差的,这与我们的直觉完全相同。

四. 贝尔曼公式:推导

1. 推导

  • 状态值(state value)固然重要,但如何计算呢?答案就在贝尔曼公式(Bellman equation)中。
  • 总之,贝尔曼公式(Bellman equation)描述了不同状态的状态值(state value)之间的关系。

​ 考虑一个随机轨迹:
S t → A t R t + 1 , S t + 1 → A t + 1 R t + 2 , S t + 2 → A t + 2 R t + 3 , … S_t \xrightarrow{A_t} R_{t+1},S_{t+1} \xrightarrow{A_{t+1}} R_{t+2},S_{t+2} \xrightarrow{A_{t+2}} R_{t+3},\dots StAt Rt+1,St+1At+1 Rt+2,St+2At+2 Rt+3,
​ 折扣回报(discounted return) G t G_t Gt 可写成
G t = R t + 1 + γ R t + 2 + γ 2 R t + 3 + … = R t + 1 + γ ( R t + 2 + γ R t + 3 + … ) = R t + 1 + γ G t + 1 \begin{align} G_t &= R_{t+1}+ \gamma R_{t+2} + \gamma^2 R_{t+3} + \dots \\ &=R_{t+1} + \gamma(R_{t+2} + \gamma R_{t+3} + \dots) \\ &=R_{t+1} + \gamma G_{t+1} \end{align} Gt=Rt+1+γRt+2+γ2Rt+3+=Rt+1+γ(Rt+2+γRt+3+)=Rt+1+γGt+1
​ 所以这个时刻我所得到的 return 等于我能立即得到的奖励(immediate reward) R t + 1 R_{t+1} Rt+1 加上到下一时刻从那出发能得到的 return (futrue reward)乘以 discount rate

​ 那么,根据状态值(state value)的定义可以得出
v π ( s ) = E [ G t ∣ S t = s ] = E [ R t + 1 + γ G t + 1 ∣ S t = s ] = E [ R t + 1 ∣ S t = s ] + γ E [ G t + 1 ∣ S t = s ] \begin{align} v_{\pi}(s) &= \mathbb{E}[G_t|S_t = s]\\ &= \mathbb{E}[R_{t+1} + \gamma G_{t+1} | S_t = s] \\ &={\color{blue} \mathbb{E}[R_{t+1}|S_t = s]} + \gamma {\color{blue} \mathbb{E}[G_{t+1}|S_t = s]} \end{align} vπ(s)=E[GtSt=s]=E[Rt+1+γGt+1St=s]=E[Rt+1St=s]+γE[Gt+1St=s]
​ 接下来,分别计算这两个项,求出他们的形式,就得到了贝尔曼公式

​ 首先,计算第一项 E [ R t + 1 ∣ S t = s ] \mathbb{E}[R_{t+1}|S_t = s] E[Rt+1St=s]:当前时刻我在状态 s ,我得到的立即奖励(immediate reward)是 R t + 1 R_{t+1} Rt+1
E [ R t + 1 ∣ S t = s ] = ∑ a π ( a ∣ s ) E [ R t + 1 ∣ S t = s , A t = a ] = ∑ a π ( a ∣ s ) ∑ r p ( r ∣ s , a ) r \begin{align} \mathbb{E}[R_{t+1}|S_t = s] &= \sum_a \pi(a|s) \mathbb{E} [R_{t+1}|S_t = s,A_t = a] \\ &= \sum_a \pi(a|s) \sum_r p(r|s,a)r \end{align} E[Rt+1St=s]=aπ(as)E[Rt+1St=s,At=a]=aπ(as)rp(rs,a)r
理解:

​ 在状态 s ,我有多个 action 可以去选择,take action a 的概率是 π ( a ∣ s ) \pi(a|s) π(as),当我 take action a 我所得到的 value 是 E [ R t + 1 ∣ S t = s , A t = a ] \mathbb{E}[R_{t+1}|S_t = s, A_t = a] E[Rt+1St=s,At=a] E [ R t + 1 ∣ S t = s , A t = a ] \mathbb{E}[R_{t+1}|S_t = s, A_t = a] E[Rt+1St=s,At=a] 可以写成 ∑ r p ( r ∣ s , a ) r \sum\limits_r p(r|s,a)r rp(rs,a)r

​ 意思是,从 s s s 出发,take action a a a,得到的奖励(reward)是 r r r 的概率是 p ( r ∣ s , a ) p(r|s,a) p(rs,a),根据期望的定义,取值为 r r r 的概率乘以 r r r 本身就是期望。

注意: 第一项其实就是我能得到的立即奖励(immediate reward)的期望/平均

  • 大写的 S 不确定,小写的 s 是确定的。在前面的 state value 定义时已说明,S、R 表示随机变量。
  • 这里的大写 St,At,Rt+1都是集合,所以对于任意时刻 t,S 是确定的,A 可能有几种不同选择。 而之前的例子是确定性奖励,所以对于 R 是一个集合(变量)印象不深。最简单的就是抽奖,你每次执行同样的行为得到的奖励却不同
  • 这里 Π(a|s) 是采取动作 a 的概率,后面一项是采取这个动作之后,到下一个不同状态的概率
  • 比如我有 0.5 概率(pai)撞到墙,但是撞到墙之后有 0.1 概率原地不动,也有 0.9 概率后退一步,这部分内容就是后面的 p
  • 这里就是枚举了所有动作下的概率和收益的成绩加起来算了期望
  • 就是两次离散型随机变量计算期望

​ 其次,计算第二项 E [ G t + 1 ∣ S t = s ] \mathbb{E}[G_{t+1}|S_t = s] E[Gt+1St=s]:第二项是我从当前状态 s s s 出发得到的下一个时刻的回报(return)的期望(mean)

在这里插入图片描述

  • 第一行:从当前 s s s 出发,有多个选择,可以跳到不同 s ′ s' s ,跳到不同 s ′ s' s 的概率是 p ( s ′ ∣ s ) p(s' | s) p(ss),跳到不同 s ′ s' s 所得到的值是 E [ G t + 1 ∣ S t = s , S t + 1 = s ’ ] \mathbb{E}[G_{t+1}|S_t = s,S_{t+1} = s’ ] E[Gt+1St=s,St+1=s],一相加就是 (expectation) E [ G t + 1 ∣ S t = s ] \mathbb{E}[G_{t+1}|S_t = s] E[Gt+1St=s]
  • 从第一行到第二行: E [ G t + 1 ∣ S t = s , S t + 1 = s ′ ] \mathbb{E}[G_{t+1}|S_t = s,S_{t+1} = s' ] E[Gt+1St=s,St+1=s] 意思是当前状态是 s s s,下一个状态是 s ′ s' s,计算从下一个状态出发所得到回报(return)的期望(mean),第二行 E [ G t + 1 ∣ S t + 1 = s ′ ] \mathbb{E}[G_{t+1}|S_{t+1} = s' ] E[Gt+1St+1=s] 把第一行中那一项的 S t = s S_t = s St=s 去掉了,因为我已经知道了下一个状态是 s ′ s' s,就不用关心我之前究竟是在什么状态了,这其实就是马尔可夫的性质,是无记忆的(memoryless Markov property)
  • 从第二行到第三行: E [ G t + 1 ∣ S t + 1 = s ′ ] \mathbb{E}[G_{t+1} | S_{t+1} = s' ] E[Gt+1St+1=s] 意思是从下一个状态 s’ 出发计算我所能得到的回报(return)的平均值(mean),这个就是第三行写的一个状态值(state value) v π ( s ′ ) v_{\pi}(s') vπ(s),只不过是针对 s ′ s' s 的状态值(state value) v π ( s ′ ) v_{\pi}(s') vπ(s)。——最开始的状态值(state value)的定义
  • 从第三行到第四行:从 s s s s ′ s' s 的概率 p ( s ′ ∣ s ) p(s' | s) p(ss):从 s s s 出发我有多种选择,可以选择不同的动作(action),选择 action a 的概率是 π ( a ∣ s ) \pi (a|s) π(as) ,选择这个 action 我跳到 s ′ s' s 的概率是 p ( s ′ ∣ s , a ) p(s' |s, a) p(ss,a),通过两者相乘相加可以得到 p ( s ′ ∣ s ) p(s' | s) p(ss)

注意:

  • 第二项是 future reward 的平均(mean)
  • E [ G t + 1 ∣ S t = s , S t + 1 = s ′ ] = E [ G t + 1 ∣ S t + 1 = s ′ ] \mathbb{E}[G_{t+1}|S_t = s,S_{t+1} = s'] = \mathbb{E}[G_{t+1}|S_{t+1} = s'] E[Gt+1St=s,St+1=s]=E[Gt+1St+1=s] 是由于由于无记忆马尔可夫特性(memoryless Markov property)

贝尔曼公式(Bellman equation):此处 σ \sigma σ 后面应该加一个左大括号 {,右大括号在式子的最后面 }

在这里插入图片描述

强调,由方程中的符号可以得出以下重点:

  • 上述方程称为贝尔曼方程(Bellman equation),它描述了不同状态(states)的状态值函数(state-value functions)之间的关系:因为看上面式子标红的地方,上面式子等式左边是 s s s 的状态值(state value),等式右边是 s ′ s' s 的状态值(state value),他们的关系可以通过这样的一个式子表达出来。
  • 它由两个项组成:即时奖励项(immediate reward term)和未来奖励项(future reward term)。
  • 这是一组等式:每个状态(state)都有这样的等式!!!这不是一个式子,这个式子对状态空间中的所有状态都成立(等式后面的取值范围是 ∀ s ∈ S \forall s \in S sS),所以如果有 n 个状态,就有 n 个这样的式子,通过这 n 个式子可以求解出状态值(state value)。

在这里插入图片描述

  • v π ( s ) v_{\pi}(s) vπ(s) v π ( s ′ ) v_{\pi}(s') vπ(s) 是我们要计算的状态值,计算的思想就是 Bootstrapping ! 直观上来讲,等式左边的状态值(state value) v π ( s ) v_{\pi}(s) vπ(s))依赖于等式右边的状态值(state value) v π ( s ′ ) v_{\pi}(s') vπ(s),看起来好像没法计算,其实我们有一组这样的式子,把这些式子连立就可以算出来。
  • 公式中的 π ( a ∣ s ) \pi (a|s) π(as) 是给定的策略 policy(是一种概率 probability)。解方程称为策略评估(policy evaluation):贝尔曼公式依赖于策略(policy),如果我们能计算出状态值(state value),其实我们在做的一件事就是评估这个策略(policy evaluation)究竟是好是坏
  • 奖励概率 (Reward probability) p ( r ∣ s , a ) p(r|s,a) p(rs,a) 和状态转换概率(State transition probability) p ( s ′ ∣ s , a ) p(s'|s,a) p(ss,a) 代表的是动态模型(dynamic model)或称为环境模型(environment model) :分两种情况,一种是我们知道这个模型(model),在本节和下节当中我们都会假设知道这个 model,给出来相应的算法;一种是不知道模型(model),这种情况下我们仍然可以求出 state value,这就是 model free reinforcement learning 的算法。

2. 例子

(1)例子1:

​ 图中的策略 π \pi π 由绿色的箭头表示

在这里插入图片描述

​ 根据一般表达式(general expression)写出贝尔曼方程:
v π ( s ) = ∑ a π ( a ∣ s ) [ ∑ r p ( r ∣ s , a ) r + γ ∑ s ′ p ( s ′ ∣ s , a ) v π ( s ′ ) ] v_{\pi}(s) = \sum_a \pi(a|s)\left[\sum_r p(r|s,a)r + \gamma \sum_{s'}p(s'|s,a)v_{\pi}(s')\right] vπ(s)=aπ(as)[rp(rs,a)r+γsp(ss,a)vπ(s)]
​ 这个例子很简单,因为策略(policy)是确定的(deterministic)。

​ 首先,考虑 s 1 s_1 s1 的状态值(state value):
π ( a = a 3 ∣ s 1 ) = 1 a n d π ( a ≠ a 3 ∣ s 1 ) = 0 p ( s ′ = s 3 ∣ s 1 , a 3 ) = 1 a n d p ( s ′ ≠ s 3 ∣ s 1 , a 3 ) = 0 p ( r = 0 ∣ s 1 , a 3 ) = 1 a n d p ( r ≠ 0 ∣ s 1 , a 3 ) = 0 \pi(a = a_3|s_1) = 1 \ \ and \ \ \pi(a \ne a_3 | s_1) = 0 \\ p(s' = s_3|s_1,a_3)=1 \ \ and p(s' \ne s_3 | s_1,a_3) = 0 \\ p(r=0|s_1,a_3)=1 \ \ and p(r \ne 0 | s_1,a_3) = 0 π(a=a3s1)=1  and  π(a=a3s1)=0p(s=s3s1,a3)=1  andp(s=s3s1,a3)=0p(r=0∣s1,a3)=1  andp(r=0∣s1,a3)=0
​ 将上面这些概率和值代入贝尔曼方程,得出:(下面这个式子和上面在 二.2 那部分用激励性例子 2 介绍的方法计算出的结果一样,即与上面直观计算出的结果是一样的,虽然此时是用复杂贝尔曼公式得到的,但从直观上来讲很容易理解)
v π ( s 1 ) = 0 + γ v π ( s 3 ) v_{\pi}(s_1) = 0 + \gamma v_{\pi}(s_3) vπ(s1)=0+γvπ(s3)
​ 类似地,可以得出
v π ( s 1 ) = 0 + γ v π ( s 3 ) v π ( s 2 ) = 1 + γ v π ( s 4 ) v π ( s 3 ) = 1 + γ v π ( s 4 ) v π ( s 4 ) = 1 + γ v π ( s 4 ) v_{\pi}(s_1) = 0 + \gamma v_{\pi}(s_3) \\ v_{\pi}(s_2) = 1 + \gamma v_{\pi}(s_4) \\ v_{\pi}(s_3) = 1 + \gamma v_{\pi}(s_4) \\ v_{\pi}(s_4) = 1 + \gamma v_{\pi}(s_4) vπ(s1)=0+γvπ(s3)vπ(s2)=1+γvπ(s4)vπ(s3)=1+γvπ(s4)vπ(s4)=1+γvπ(s4)
​ 从最后一个方程到第一个方程,逐一求解上述方程,得到:
v π ( s 4 ) = 1 1 − γ v π ( s 3 ) = 1 1 − γ v π ( s 2 ) = 1 1 − γ v π ( s 1 ) = γ 1 − γ v_{\pi}(s_4) = \frac{1}{1-\gamma} \\ v_{\pi}(s_3) = \frac{1}{1-\gamma} \\ v_{\pi}(s_2) = \frac{1}{1-\gamma} \\ v_{\pi}(s_1) = \frac{\gamma}{1-\gamma} \\ vπ(s4)=1γ1vπ(s3)=1γ1vπ(s2)=1γ1vπ(s1)=1γγ
​ 如果 γ = 0.9 \gamma = 0.9 γ=0.9,那么
v π ( s 4 ) = 1 1 − 0.9 = 10 v π ( s 3 ) = 1 1 − 0.9 = 10 v π ( s 2 ) = 1 1 − 0.9 = 10 v π ( s 1 ) = 0.9 1 − 0.9 = 9 v_{\pi}(s_4) = \frac{1}{1-0.9} = 10 \\ v_{\pi}(s_3) = \frac{1}{1-0.9} = 10\\ v_{\pi}(s_2) = \frac{1}{1-0.9} = 10\\ v_{\pi}(s_1) = \frac{0.9}{1-0.9} = 9\\ vπ(s4)=10.91=10vπ(s3)=10.91=10vπ(s2)=10.91=10vπ(s1)=10.90.9=9
​ 计算出 s 1 s_1 s1 的状态值是 9, s 2 , s 3 , s 4 s_2,s_3,s_4 s2,s3,s4 的状态值是 10。状态值(state values)代表这个状态的价值,如果一个状态的价值高,说明这个状态是值得我们往那个方向走的,之所以 s 2 , s 3 , s 4 s_2,s_3,s_4 s2,s3,s4 的价值高,是因为它们距离 target area 比较近。

在这里插入图片描述

计算出状态值(state values)后干什么?

耐心等待(计算行动值(action value)并改进策略(improve policy)),慢慢的就会得到最优策略。

s 2 s_2 s2 不是陷阱吗?为什么状态值那么高?

  • 前面提到过,reward 是给动作打分,现在的 v v v 是状态的得分,所以虽然 s 2 s_2 s2 是陷阱,但是进入陷阱的惩罚是不体现在陷阱这个状态里面的
  • 陷阱的负价值体现在 s 1 s_1 s1 的 value 是最小的上面,因为只有 s 1 s_1 s1 有可能往陷阱走
  • s 2 s_2 s2 的策略是走向 s 4 s_4 s4,这个是高价值的;如果 s 1 s_1 s1 还有一个策略是走向 s 2 s_2 s2,那么 s 1 s_1 s1 的 value 还会进一步降低
(2)例子2

在这里插入图片描述

v π ( s ) = ∑ a π ( a ∣ s ) [ ∑ r p ( r ∣ s , a ) r + γ ∑ s ′ p ( s ′ ∣ s , a ) v π ( s ′ ) ] v_{\pi}(s) = \sum_a \pi(a|s)\left[\sum_r p(r|s,a)r + \gamma \sum_{s'}p(s'|s,a)v_{\pi}(s')\right] vπ(s)=aπ(as)[rp(rs,a)r+γsp(ss,a)vπ(s)]

  • 写出每个状态的贝尔曼方程。
  • 求解贝尔曼方程中的状态值。
  • 与上一个示例中的策略进行比较。

在这里插入图片描述

在这个策略(policy)下,计算出 s 1 s_1 s1 的状态值(state value)是 8.5, s 2 , s 3 , s 4 s_2,s_3,s_4 s2,s3,s4 的状态值(state value)是 10。而在上一个策略(policy)下 s 1 s_1 s1 的状态值(state value)是 9。

所以这个策略没有刚才的策略好。

五.贝尔曼公式( Bellman equation):矩阵向量形式(Matrix-vector form)

为什么要考虑矩阵向量形式?因为我们需要从中求解状态值(state value)!

一个未知数依赖于另一个未知数。如何解决这些未知数?
v π ( s ) = ∑ a π ( a ∣ s ) [ ∑ r p ( r ∣ s , a ) + γ ∑ s ′ p ( s ′ ∣ s , a ) v π ( s ′ ) ] {\color{red}v_{\pi}(s)} = \sum_a \pi(a|s)\left[ \sum_r p(r|s,a)+\gamma \sum_{s'} p(s'|s,a) {\color{red}v_{\pi}(s')} \right] vπ(s)=aπ(as)[rp(rs,a)+γsp(ss,a)vπ(s)]

  • 元素形式(Elementwise form): 上述元素形式的方程对每个状态 s ∈ S s \in S sS 都成立,如果有 n n n 个状态就有 n n n 个这样的方程。这意味着有这样的 ∣ S ∣ |S| S 方程!
  • 矩阵向量形式(Matrix-vector form): 如果我们把所有方程放在一起,就会得到一组线性方程,可以简洁地写成矩阵向量形式。矩阵向量形式非常优雅,也非常重要。

1. 推导出矩阵向量形式:

回顾一下:

v π ( s ) = ∑ a π ( a ∣ s ) [ ∑ r p ( r ∣ s , a ) + γ ∑ s ′ p ( s ′ ∣ s , a ) v π ( s ′ ) ] v_{\pi}(s) = \sum_a \pi(a|s)\left[ \sum_r p(r|s,a)+\gamma \sum_{s'} p(s'|s,a) v_{\pi}(s') \right] vπ(s)=aπ(as)[rp(rs,a)+γsp(ss,a)vπ(s)]
将贝尔曼方程改写为(括号外的项往括号里面分配)
v π ( s ) = γ π ( s ) + γ ∑ s ′ p π ( s ′ ∣ s ) v π ( s ′ ) v_{\pi}(s) = \gamma_{\pi}(s)+\gamma \sum_{s'} p_{\pi}(s'|s)v_{\pi}(s') vπ(s)=γπ(s)+γspπ(ss)vπ(s)
其中

在这里插入图片描述

  • r π ( s ) r_{\pi}(s) rπ(s) 代表从当前状态出发,我所能得到的即时奖励(immediate reward)的平均值
  • 这个式子其实与推导贝尔曼公式的时候计算第一项和第二项的时候写的中间过程的公式是一样的,是即时奖励加未来奖励
  • 从当前 s s s 出发,有多个选择,可以跳到不同 s ′ s' s ,跳到不同 s ′ s' s 的概率是 p ( s ′ ∣ s ) p(s' | s) p(ss)

假设状态(states)可以索引为 s i ( i = 1 , . . . , n ) s_i (i = 1, ... , n) si(i=1,...,n)

对于状态 s i s_i si,贝尔曼方程为:(从 s i s_i si 跳到 s j s_j sj 的概率是 p π ( s j ∣ s i ) p_{\pi}(s_j|s_i) pπ(sjsi),从 s i s_i si 跳到 s j s_j sj 所取的 state value 是 v π ( s j ) v_{\pi}(s_j) vπ(sj)

v π ( s ) = γ π ( s ) + γ ∑ s j p π ( s j ∣ s i ) v π ( s j ) v_{\pi}(s) = \gamma_{\pi}(s)+\gamma \sum_{s_j} p_{\pi}(s_j|s_i)v_{\pi}(s_j) vπ(s)=γπ(s)+γsjpπ(sjsi)vπ(sj)
将所有这些状态方程放在一起,改写成矩阵向量形式, v π v_{\pi} vπ 是一个向量
v π ( s ) = γ π ( s ) + γ P π v π v_{\pi}(s) = \gamma_{\pi}(s)+\gamma P_{\pi}v_{\pi} vπ(s)=γπ(s)+γPπvπ
其中( P π P_{\pi} Pπ 是状态转换矩阵(state transition matrix), p π ( s j ∣ s i ) p_{\pi}(s_j|s_i) pπ(sjsi) 意思是状态从 s i s_i si 跳到 s j s_j sj 的概率)
在这里插入图片描述

代表第 i i i行第 j j j列的元素从 s i s_i si 跳到 s j s_j sj 的这样一个概率

2. 例子

(1)例子1

有四个状态,即 n = 4 的时候的矩阵向量形式

在这里插入图片描述

考虑下图,策略(policy)用绿色的箭头表示
在这里插入图片描述

(2)例子2

在这里插入图片描述

在这里插入图片描述

六.贝尔曼公式( Bellman equation):求解状态值(state value)

1.求解

用刚才推导的贝尔曼公式的矩阵和向量的形式求解状态值(state value)

为什么要求解状态值(state value)?

  • 给定一个策略(policy),我们会列出来它的贝尔曼公式( Bellman equation),再进一步求解这个贝尔曼公式得到状态值(state value),求出相应的状态值这样的一个过程(state value)称为策略评估(policy evaluation)!这是 RL 中的一个基本问题。它是找到更好策略的基础。
  • 策略评估(policy evaluation)是强化学习中的关键,因为只有能够去评价一个策略好或者不好,我们才能进一步改进它最后再找到最优的策略。

矩阵向量形式的贝尔曼方程为: v π v_π vπ 是一个向量
v π = r π + γ P π v π v_{\pi} = r_{\pi} + \gamma P_{\pi}v_{\pi} vπ=rπ+γPπvπ
下面给出两种求解贝尔曼公式的方法:

(1)闭式解为(The closed-form solution is),即状态值(state value)的解析表达式为:
v π = ( I − γ P π ) − 1 r π v_{\pi} = (I - \gamma P_{\pi})^{-1}r_{\pi} vπ=(IγPπ)1rπ
实际上,我们仍然需要使用数值工具来计算矩阵逆,实际中并不会使用。我们能避免矩阵逆运算吗?可以,通过迭代算法(iterative algorithms)。

(2)迭代解决(iterative solution)方案是: v k v_k vk v k + 1 v_{k+1} vk+1 都是向量,包含了不同时刻的所有状态值)
v k + 1 = r π + γ P π v k v_{k+1} = r_{\pi}+\gamma P_{\pi}v_k vk+1=rπ+γPπvk
首先可以随便猜一个 v 0 v_0 v0 等于什么(比如全为0),然后带入到等式右边,得到等式左边的 v 1 v_1 v1
然后把 v 1 v_1 v1 再带到等式右边,得到等式左边的 v 2 v_2 v2
然后把 v 2 v_2 v2 再带到等式右边,得到等式左边的 v 3 v_3 v3,如此循环计算下去,就会得到一个序列 { v 0 , v 1 , v 2 , } \{v0, v1, v2,\} {v0,v1,v2,}。我们可以证明当 k k k 趋向于 ∞ ∞ 的时候, v k v_k vk 就收敛到了 v π v_{\pi} vπ,这个 v π v_{\pi} vπ 就是真实的状态值(state value)
v k → v π = ( I − γ P π ) − 1 r π , k → ∞ v_k \rightarrow v_{\pi} = (I- \gamma P_{\pi})^{-1}r_{\pi}, \ \ \ \ k \rightarrow \infty vkvπ=(IγPπ)1rπ,    k
证明:

在这里插入图片描述

2.例子

r b o u n d a r y = r f o r b i d d e n = − 1 , r t a r g e t = + 1 , γ = 0.9 r_{boundary} = r_{forbidden} = -1, r_{target} = +1,\gamma = 0.9 rboundary=rforbidden=1,rtarget=+1,γ=0.9

以下是两项 "好 "的策略(绿色箭头是策略)和状态值(state value)。在第四列中,前两个状态的两项策略是不同的。

在这里插入图片描述

用刚才讲的解析表达式或者迭代算法都可以求出状态值(state value)。

可以看出,状态值(state value)全为正数。

  • 靠近目标 target area 的状态值(state value)都比较大,
  • 距离目标 target area 越远,它的状态值(state value)越小。

以下是两项 "不好"的策略(绿色箭头是策略)和状态值(state value)。状态值(state value)比好策略的状态值小。

在这里插入图片描述

上面两个策略很明显会撞墙或进入禁区,从直觉上讲,这是不好的策略;

而计算出的状态值(state value)有负数,通过状态值(state value)也可以判断出这是不好的策略,这与我们的直觉一致。

可以看出,我们可以通过计算状态值(state value)来评价一个策略(policy)的好坏

七.动作值(action value)

从状态值(state value)到动作值(action value) :

  • 状态值(state value):(agent)智能体从某一状态(state)开始所能获得的平均回报(average return)。
  • 动作值(action value):(agent)智能体从某一状态(state)出发并采取某项动作(taking an action)之后所能获得的平均回报(average return)。

我们为什么关心动作值(action value)?

  • 策略指的是在一个状态我要选择什么样的 action,有一些 action 我们如何做选择呢?就要根据 action value 来做判断,action value 大的意味着我选择那个 action 会得到更多的 reward,那我就会去选择那个。
  • 因为我们想知道哪个动作更好。这一点在下面的讲解中会更加清楚。我们将经常使用动作值。

1.动作值定义

动作值定义:我们从当前状态 s 出发,选择动作 a 之后,我所得到的回报(return)的一个平均(average)就是动作值(action value):
q π ( s , a ) = E [ G t ∣ S t = s , A t = a ] q_{\pi}(s,a) = \mathbb{E}[G_t|S_t=s,A_t=a] qπ(s,a)=E[GtSt=s,At=a]

  • q π ( s , a ) q_{\pi}(s,a) qπ(s,a)是状态-动作对 ( s , a ) (s,a) (s,a)的函数,依赖于从哪个状态出发,从哪个状态的 action 出发。
  • q π ( s , a ) q_{\pi}(s,a) qπ(s,a)依赖于 π \pi π,不同的策略会得到不同的 action value

(不确定对)确定了action的话reward不也是确定的吗,为啥还要求期望?

  • 确定了action,action的reward确定,但结果状态不确定,所以期望是给结果状态 v ( s ′ ) v(s') v(s)
  • 就比如之前老师讲的被风吹歪的例子,现态采取同个策略可能会掉到不同的次态

2.动作值与状态值的联系

根据条件期望的性质可以得出:等式右边意思是我有很多个 a a a,我选择一个 a a a 的概率是 π ( a ∣ s ) \pi(a | s) π(as),选择 a a a 后所得到的 average return 是 q π ( s , a ) q_{\pi}(s,a) qπ(s,a)

在这里插入图片描述

因此

v π ( s ) = ∑ a π ( a ∣ s ) q π ( s , a ) ( 2 ) {\color{red}v_{\pi}(s)} = \sum_a \pi(a|s) {\color{red}q_{\pi}(s,a)} \quad \quad \quad (2) vπ(s)=aπ(as)qπ(s,a)(2)
等式左边是从一个状态出发的 state value 等于右边我选择不同 action 得到的 action value 的平均值,权重就是策略 π \pi π

action value其实可以理解为state value的一个action下的值

回想一下,状态值(state value)由以下公式给出

在这里插入图片描述

比较 (2) 和 (3),我们可以得出动作值函数(action-value function)的表达式

在这里插入图片描述

(2) 和 (4) 是一枚硬币的两面:

  • (2) 说明了如何从动作值(action value)中获取状态值(state value)。
  • (4) 则说明了如何从状态值(state value)中获取动作值(action value)。

在概率论范畴下,研究对象都是随机变量,是没有常规意义的平均的。所说的平均都是概率意义平均,即期望。

3.例子

在这里插入图片描述

写出状态 s 1 s_1 s1 的动作值

q π ( s 1 , a 2 ) = − 1 + γ v π ( s 2 ) q_{\pi}(s_1,a_2) = -1+\gamma v_{\pi}(s_2) qπ(s1,a2)=1+γvπ(s2)
问题?下面这些不等于0!!
q π ( s 1 , a 2 ) , q π ( s 1 , a 3 ) , q π ( s 1 , a 4 ) , q π ( s 1 , a 5 ) = ? B e c a r e f u l ! ! q_{\pi}(s_1,a_2),q_{\pi}(s_1,a_3),q_{\pi}(s_1,a_4),q_{\pi}(s_1,a_5)=? \ Be careful \ !! qπ(s1,a2),qπ(s1,a3),qπ(s1,a4),qπ(s1,a5)=? Becareful !!
至于其他动作:所有的 action 都可以计算
q π ( s 1 , a 2 ) = − 1 + γ v π ( s 2 ) q π ( s 1 , a 3 ) = 0 + γ v π ( s 3 ) q π ( s 1 , a 4 ) = − 1 + γ v π ( s 1 ) q π ( s 1 , a 5 ) = 0 + γ v π ( s 2 1 \begin{align} q_{\pi}(s_1,a_2) &= -1+\gamma v_{\pi}(s_2) \\ q_{\pi}(s_1,a_3) &= 0+\gamma v_{\pi}(s_3) \\ q_{\pi}(s_1,a_4) &= -1+\gamma v_{\pi}(s_1) \\ q_{\pi}(s_1,a_5) &= 0+\gamma v_{\pi}(s_21 \\ \end{align} qπ(s1,a2)qπ(s1,a3)qπ(s1,a4)qπ(s1,a5)=1+γvπ(s2)=0+γvπ(s3)=1+γvπ(s1)=0+γvπ(s21
强调:

  • 动作值(action value)很重要,因为我们未来会关注在某个状态它不同的 action ,它们之间会相互比较,我们会选一个动作值(action value)最大的那个。因为我们关心的是采取哪种动作。
  • 我们可以先求解贝尔曼公式,计算所有状态值(state value),然后再计算动作值(action value)。
  • 我们也可以不计算状态值(state value),使用或不使用模型直接计算动作值(action value)。

八.总结

在这里插入图片描述

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

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

相关文章

OWASP TOP10 漏洞详解

前言 该内容是 OWASP TOP 10 的学习笔记,笔记内容来源 B 站龙哥的视频【12.Top漏洞10:服务器请求伪造_哔哩哔哩_bilibili】 一、访问控制崩溃 概念 未对通过身份验证的用户实施恰当的访问控制。攻击者可以利用这些缺陷访问未经授权的功能或数据&#xf…

QA测试开发工程师面试题满分问答9: Python中内存管理的概念、原理、使用

概念原理 Python中的内存管理是由解释器自动处理的,它使用引用计数和垃圾回收机制来管理内存。以下是Python内存管理的一些关键概念、设计原理和最佳实践,以帮助您高效使用和管理内存: 引用计数:Python使用引用计数来追踪对象的引…

基于JAVA+SSM+微信小程序+MySql的图书捐赠管理系统设计与实现(前后端分类)

一、项目背景介绍: 在当今社会,图书捐赠是一种普遍而有益的行为,旨在促进阅读、教育和知识传播。图书捐赠可以帮助改善教育资源不足的地区、学校和社区的阅读环境,提供更多的学习机会和知识获取途径。随着互联网和移动技术的发展&…

Redis-更新策略,缓存穿透,缓存雪崩,缓存击穿

Redis-更新策略,缓存穿透,缓存雪崩,缓存击穿 1.缓存更新 策略 淘汰策略超时剔除主动更新 更新策略:先修改数据库还是先删除缓存 结论:先修改数据库,因为缓存的操作比较快,容易产生数据不一致更新缓存还是删除缓存? …

网络协议——HTTP协议

目录 ​编辑 一,HTTP协议基本认识 二,认识URL 三,http协议的格式 1,发送格式 2,回应格式 四,服务端代码 五,http报文细节 1,Post与Get方法 2,Content_lenth 3&…

html加载后端数据较慢问题记载

标题: html加载后端数据较慢问题记载 日期: 2024-04-06 22:29:00 标签: [html, flask] 分类: [Python, Flask] 网站页面最近加载很慢,不知道为什么,这里记录一下,一步一步查问题的思路。 说下环境 python3.8 flask2.3.3 mysql5.7 问题 刷…

爬虫实战一、Scrapy开发环境(Win10+Anaconda3)搭建

#前言 在这儿推荐使用Anaconda进行安装,并不推荐大家用pythonpip安装,因为pythonpip的坑实在是太多了。 #一、环境中准备: Win10(企业版)Anaconda3-5.0.1-Windows-x86_64,下载地址,如果打不开…

每日OJ题_两个数组dp①_力扣1143. 最长公共子序列

目录 力扣1143. 最长公共子序列 解析代码 力扣1143. 最长公共子序列 1143. 最长公共子序列 难度 中等 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。 一个字符串的 子序列 是指这样…

尚硅谷html5+css3(2)CSS5基本知识

1.网页分为三个部分: 结构:HTML 表现:CSS 行为JavaScript CSS:层叠样式表,网页实际上是一个多层结构,通过CSS可以分别为网页的每一个层来设置样式,最终用户只看最上面的一层,总之&#xff0…

蚁群优化算法(Ant Colony Optimization Algorithm)

注意:本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 ([www.aideeplearning.cn]) 算法引言 蚁群算法,是一种模拟蚂蚁觅食行为的优化算法。想象一下,当你在野餐时,不小心洒了一些糖在地上。一…

免疫检查点信号转导和癌症免疫治疗(文献)

目录 基础 介绍 免疫检查点的表面调控(细胞膜层面) ​编辑 PD-1调节 PD-L1调节 CTLA-4 调节 检查点信号通路 关于靶点研究 展望 Immune checkpoint signaling and cancer immunotherapy - PubMed (nih.gov) 基础 【中英字幕】肿瘤免疫疗法之免…

分享10个免费高可用的GPT3.5和4.0网站并做功能测试【第一个】

1.介绍 网址:直接点:aicnn 或者 www.aicnn.cn 基于ChatGPT可以实现智能聊天、绘画生成、高清文本转语音、论文润色等多种功能,基于sd和mj实现的绘画功能,下面是功能测试: 博主从 1.GPT3.5是否完全免费/是否限制频率、…

MySQL学习笔记------事务

事务 事务是一组操作的集合,他是一个不可分割的单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败 事务操作 create table account(id int comment ID,name varchar(10) …

Spring 中类似 aBbb 单字母单词序列化与反序列问题

文章目录 前言代码准备问题排查lombok自定义生成 get、set 结合源码解析使用 lombok使用 lombok 自定义生成 user 对象 get、set 方法 如何解决使用注解 JsonProperty("aTest")自定义实现符合 Spring 规范的 get set 方法 个人简介 前言 最近在使用 spring boot mvc…

Linux下Qt生成程序崩溃文件

文章目录 1.背景2.Qt编译生成程序2.1.profile模式的本质 3.执行程序,得到core文件4.代码定位4.1.直接使用gdb4.2.使用QtCreator 5.总结6.题外话6.1.profile模式和debug模式的区别 1.背景 在使用Qt时,假如在windows,当软件崩溃时,…

C++11右值引用

传统的C语法中就有引用的语法,而C11中新增了的右值引用语法特性,所以从现在开始我们之前学习的引用就叫做左值引用。无论左值引用还是右值引用,都是给对象取别名。 左值与左值引用 左值是一个表示数据的表达式(如变量名或解引用的指针)&…

C++面试经典问题

常见问题:智能指针、多态、虚函数、STL原理、链表、排序、二叉树、设计模式、线程进程、内存 对象所有权 在接触智能指针之前首先要理解对象的所有权是什么,在这之前我们总是用new和delete来进行内存的申请与释放,在这种堆内存分配的方式中…

springboot国际化多语言

1,新建国际化多语言文件 在resources目录下新建 messages.properties 其他语言的文件 编辑messages.properties文件,下方从text切换到Resource Bundle ,即可对照着编辑多语言文件 (如果没有找到Resource Bundle,先在settings->plugins中安装Resource Bundle Editor) 2,配…

Lumos学习王佩丰Excel第二讲:单元格格式设置

今天学会GIF录制了,分享知识会更简便一些,话不多说,开始吧~ 一、美化表格 1、设置单元格格式的路径 从菜单栏进入: 选中区域(单元格)- 右键“设置单元格格式”: 2、合并单元格 合并一行 批量…