《Reinforcement Learning: An Introduction》第7章笔记

news2024/9/29 17:36:34

Chapter 7 n-step Bootstrapping

本章的n-step TD方法是前两章的Monte Carlo 方法和one-step TD方法的推广。它使自举法在多个时间步内进行,解决了前两章中的更新时间步不灵活的问题。

7.1 n-step TD Prediction

在用策略 π \pi π下生成的采样回合序列来估计 v π v_{\pi} vπ时,Monte Carlo方法根据从某一个状态开始到终止状态的整个奖励序列来对这个状态进行价值更新。而one-step TD方法则只根据下一个奖励,用下一个后继状态的价值作为其余奖励的近似的基础上进行自举更新。

所以,介于两者之间的方法根据多个中间时刻的奖励来进行更新:多于一个时刻的奖励,但又不是到终止状态的所有奖励。比如,two-step基于接下来的两步奖励和两步之后的状态的价值估计值。下图是 v π v_{\pi} vπ的一个n-step更新的回溯图,最左边是one-step TD更新,最右边是Monte Carlo更新。
在这里插入图片描述

n-step更新属于TD方法,因为它们仍然根据一个状态与后继状态的估计值的差异来进行状态的更新。但这里的后继状态是n步后的状态,而不是后一步状态。将时序差分量被扩展成n步的方法称为n-step TD 方法

现在使用更正式的方式来讨论状态的价值估计值的更新。假设有“状态-奖励”序列 S t , R t + 1 , S t + 1 , R t + 2 , ⋯   , R T , S T S_t,R_{t+1},S_{t+1},R_{t+2},\cdots,R_T,S_T St,Rt+1,St+1,Rt+2,,RT,ST (这里为了简便,我们先忽略动作),我们的目的是更新状态 S t S_t St的价值估计。在Monte Carlo的更新中, v π ( S t ) v_{\pi}(S_t) vπ(St)的估计值会沿着完整回报的方向进行更新,即(式中的T是终止状态的时刻, G t G_t Gt是更新的目标):
G t   = ˙   R t + 1 + γ R t + 2 + γ 2 R t + 3 + ⋯ + γ T − t − 1 R T G_t \ \dot{=} \ R_{t+1} + \gamma R_{t+2} + \gamma^2R_{t+3} + \cdots + \gamma^{T-t-1} R_T Gt =˙ Rt+1+γRt+2+γ2Rt+3++γTt1RT
而对于one-step TD的更新的目标为下式,即用第一个奖励值加上折扣后继状态的价值估计,称其为one-step return:
G t : t + 1   = ˙   R t + 1 + γ V t ( S t + 1 ) G_{t:t+1} \ \dot{=} \ R_{t+1} + \gamma V_t(S_{t+1}) Gt:t+1 =˙ Rt+1+γVt(St+1)
上式中, V t : S → R V_t: \mathcal{S} \rightarrow \mathbb{R} Vt:SR 是在t时刻 v π v_{\pi} vπ的估计值。 G t : t + 1 G_{t:t+1} Gt:t+1的下标表示它是一种截断回报,它由当前时刻到时刻t+1的累积奖励 R t + 1 R_{t+1} Rt+1和折扣估计 γ V t ( S t + 1 ) \gamma V_t(S_{t+1}) γVt(St+1)组成, γ V t ( S t + 1 ) \gamma V_t(S_{t+1}) γVt(St+1)很明显是代替了完整回报中的 γ R t + 2 + γ 2 R t + 3 + ⋯ + γ T − t − 1 R T \gamma R_{t+2} + \gamma^2R_{t+3} + \cdots + \gamma^{T-t-1} R_T γRt+2+γ2Rt+3++γTt1RT

我们将这种想法扩展到两步的情况,两步更新的目标被称为two-step return:
G t : t + 2   = ˙   R t + 1 + γ R t + 2 + γ 2 V t + 1 ( S t + 2 ) G_{t:t+2} \ \dot{=} \ R_{t+1} + \gamma R_{t+2} + \gamma^2 V_{t+1}(S_{t+2}) Gt:t+2 =˙ Rt+1+γRt+2+γ2Vt+1(St+2)
显然,两步更新中的 γ V t + 1 ( S t + 2 ) \gamma V_{t+1}(S_{t+2}) γVt+1(St+2)替代了完整回报中的 γ 2 R t + 3 + γ 3 R t + 4 + ⋯ + γ T − t − 1 R T \gamma^2R_{t+3} + \gamma^3R_{t+4} + \cdots + \gamma^{T-t-1} R_T γ2Rt+3+γ3Rt+4++γTt1RT。 类似地,对于n-step更新的n-step return为:
G t : t + n   = ˙   R t + 1 + γ R t + 2 + ⋯ + γ n − 1 R t + n + γ n V t + n − 1 ( S t + n ) G_{t:t+n} \ \dot{=} \ R_{t+1} + \gamma R_{t+2} + \cdots + \gamma^{n-1}R_{t+n} + \gamma^n V_{t+n-1}(S_{t+n}) Gt:t+n =˙ Rt+1+γRt+2++γn1Rt+n+γnVt+n1(St+n)
其中, n ≥ 1 n \ge 1 n1 0 ≤ t < T − n 0 \le t < T-n 0t<Tn,如果 t + n ≥ T t+n \ge T t+nT(即n-step return 超出了终止状态),则其余部分为0,即n-step回报等于完整的回报。

n-step TD算法: 基于n-step回报的状态价值函数的更新算法为:
V t + n ( S t ) = ˙ V t + n − 1 ( S t ) + α [ G t : t + n − V t + n − 1 ( S t ) ] ,    0 ≤ t < T   ( 7.2 ) V_{t+n}(S_t) \dot{=} V_{t+n-1}(S_t) + \alpha [G_{t:t+n} - V_{t+n-1}(S_t)], \ \ 0 \le t < T \ \qquad (7.2) Vt+n(St)=˙Vt+n1(St)+α[Gt:t+nVt+n1(St)],  0t<T (7.2)
而对于任意其他状态s( s ≠ S t s \neq S_t s=St)的价值估计保持不变: V t + n ( s ) = V t + n − 1 ( s ) V_{t+n}(s) = V_{t+n-1}(s) Vt+n(s)=Vt+n1(s)。注意,在每一个回合的前n-1个时刻,价值函数不会被更新,为了弥补这个损失,在终止时刻后还将执行对应次数的更新,完整的伪代码如下图:

在这里插入图片描述

n-step回报的一个重要的性质是:在最坏情况下,它们的期望作为 v π v_{\pi} vπ的估计可以保证比 V t + n − 1 V_{t+n-1} Vt+n1更好,也就是说n-step回报的期望的最坏误差能够保证不大于 V t + n − 1 V_{t+n-1} Vt+n1最坏误差的 γ n \gamma^n γn倍:
m a x s ∣ E π [ G t : t + n ∣ S t = s ] − v π ( s ) ∣ ≤ γ n m a x s ∣ V t + n − 1 ( s ) − v π ( s ) ∣ \mathop{max}_s \left\lvert \mathbb{E}_{\pi}[G_{t:t+n}|S_t=s] - v_{\pi}(s) \right\rvert \le \gamma^n \mathop{max}_s \left| V_{t+n-1}(s) - v_{\pi}(s) \right| maxsEπ[Gt:t+nSt=s]vπ(s)γnmaxsVt+n1(s)vπ(s)
上式中, n ≥ 1 n \ge 1 n1,被称为n-step回报的误差减少性质(error reduction property),因为误差减少性质,可以证明在合适的条件下,n-step方法可以收敛到正确的预测。

7.2 n-step Sarsa

Sarsa算法的n-step版本被称为n-step Sarsa,在第6章 的初始版本被称为one-step Sarsa,或Sarsa(0)。

n-step Sarsa方法的回溯图如下图(注意对比一下本章的第一个图,类似但是Sarsa的首末两端都是动作)。
在这里插入图片描述

这里用动作价值估计来重新定义一下 n-step回报:
G t : t + n   = ˙   R t + 1 + γ R t + 2 + ⋯ + γ n − 1 R t + n + γ n Q t + n − 1 ( S t + n , A t + n ) , n ≥ 1 , 0 ≤ t < T − n   ( 7.4 ) G_{t:t+n} \ \dot{=} \ R_{t+1} + \gamma R_{t+2} + \cdots + \gamma^{n-1}R_{t+n} + \gamma^n Q_{t+n-1}(S_{t+n}, A_{t+n}), n \ge 1, 0 \le t < T-n \ \qquad (7.4) Gt:t+n =˙ Rt+1+γRt+2++γn1Rt+n+γnQt+n1(St+n,At+n),n1,0t<Tn (7.4)
上式中,当 t + n ≥ T t+n \ge T t+nT时,有 G t : t + n = ˙ G t G_{t:t+n} \dot{=} G_t Gt:t+n=˙Gt

n-step Sarsa算法
Q t + n ( S t , A t ) = ˙ Q t + n − 1 ( S t , A t ) + α [ G t : t + n − Q t + n − 1 ( S t , A t ) ] ,    0 ≤ t < T   ( 7.5 ) Q_{t+n}(S_t,A_t) \dot{=} Q_{t+n-1}(S_t, A_t) + \alpha [G_{t:t+n} - Q_{t+n-1}(S_t, A_t)], \ \ 0 \le t < T \ \qquad (7.5) Qt+n(St,At)=˙Qt+n1(St,At)+α[Gt:t+nQt+n1(St,At)],  0t<T (7.5)
而对于任意其他状态s( s ≠ S t s \neq S_t s=St)或动作a( a ≠ A t a \neq A_t a=At)的价值估计保持不变: Q t + n ( s , a ) = Q t + n − 1 ( s , a ) Q_{t+n}(s,a) = Q_{t+n-1}(s,a) Qt+n(s,a)=Qt+n1(s,a)。其伪代码如下图。

在这里插入图片描述

公式(7.4)Sarsa的n-step回报可以被写作TD error的形式:
G t : t + n = Q t − 1 ( S t , A t ) + ∑ k = t m i n ( t + n , T ) − 1 γ k − t [ R k + 1 + γ Q k ( S k + 1 , A k + 1 ) − Q k − 1 ( S k , A k ) ]   ( 7.6 ) G_{t:t+n} = Q_{t-1}(S_t, A_t) + \mathop{\sum}_{k=t}^{min(t+n, T)-1} \gamma^{k-t} [R_{k+1} + \gamma Q_k(S_{k+1}, A_{k+1}) - Q_{k-1}(S_k, A_k)] \ \qquad (7.6) Gt:t+n=Qt1(St,At)+k=tmin(t+n,T)1γkt[Rk+1+γQk(Sk+1,Ak+1)Qk1(Sk,Ak)] (7.6)

n-step Expected Sarsa的回溯图如下图,它的更新公式与公式(7.5)一致,只是它的n-step回报定义如下:
G t : t + n   = ˙   R t + 1 + γ R t + 2 + ⋯ + γ n − 1 R t + n + γ n V ‾ t + n − 1 ( S t + n ) ,   t + n < T   ( 7.7 ) G_{t:t+n} \ \dot{=} \ R_{t+1} + \gamma R_{t+2} + \cdots + \gamma^{n-1}R_{t+n} + \gamma^n \overline{V}_{t+n-1}(S_{t+n}),\ t+n < T \ \qquad (7.7) Gt:t+n =˙ Rt+1+γRt+2++γn1Rt+n+γnVt+n1(St+n), t+n<T (7.7)
上式中,当 t + n ≥ T t+n \ge T t+nT时,有 G t : t + n = ˙ G t G_{t:t+n} \dot{=} G_t Gt:t+n=˙Gt, 而 V ‾ t ( s ) \overline{V}_{t}(s) Vt(s) 是状态s的期望近似价值(expected approximate value),它采用了在目标策略下,时刻t的动作价值估计来计算:
V ‾ t ( s )   = ˙   ∑ a π ( a ∣ s ) Q t ( s , a ) ,    f o r   a l l   s ∈ S   ( 7.8 ) \overline{V}_{t}(s) \ \dot{=} \ \sum_a \pi(a|s)Q_t(s, a),\ \ for\ all\ s\in \mathcal{S} \ \qquad (7.8) Vt(s) =˙ aπ(as)Qt(s,a),  for all sS (7.8)
如果s是终止状态,那么期望近似价值被定义为0。

在这里插入图片描述

7.3 n-step Off-policy Learning

在本书的5.5节中学习过off-policy有两个策略:目标策略 π \pi π和行为策略 b b b,为了使用遵循策略 b b b得到的数据,我们必须考虑两种策略之间的不同,使用它们对应动作的相对概率。对于off-policy的n-step TD版本,对于时刻t的更新,可以使用 ρ t : t + n − 1 \rho_{t:t+n-1} ρt:t+n1来加权:
V t + n ( S t ) = ˙ V t + n − 1 ( S t ) + α   ρ t : t + n − 1 [ G t : t + n − V t + n − 1 ( S t ) ] ,    0 ≤ t < T   ( 7.9 ) V_{t+n}(S_t) \dot{=} V_{t+n-1}(S_t) + \alpha \ \rho_{t:t+n-1}[G_{t:t+n} - V_{t+n-1}(S_t)], \ \ 0 \le t < T \ \qquad (7.9) Vt+n(St)=˙Vt+n1(St)+α ρt:t+n1[Gt:t+nVt+n1(St)],  0t<T (7.9)
ρ t : t + n − 1 \rho_{t:t+n-1} ρt:t+n1是重要度采样率(importance sampling ratio),是两种策略下采取 A t A_t At A t + n − 1 A_{t+n-1} At+n1的n个动作的相对概率(参考本书的5.5节的式5.3)。
ρ t : h   = ˙   ∏ k = t m i n ( h , T − 1 ) π ( A k ∣ S t ) b ( A k ∣ S t ) ( 7.10 ) \rho_{t:h}\ \dot{=} \ \prod_{k=t}^{min(h, T-1)} \frac {\pi(A_k|S_t)}{b(A_k|S_t)} \qquad (7.10) ρt:h =˙ k=tmin(h,T1)b(AkSt)π(AkSt)(7.10)
如果策略 π \pi π永远都不会采取某个特定动作( π ( A k ∣ S k ) = 0 ) \pi(A_k|S_k)=0) π(AkSk)=0),则n-step回报的权重应该为0,即完全忽略。另一方面,如果某个动作在策略 π \pi π下被采取的概率远远大于行为策略b,那么将增加对应回报的权重。

如果两种策略实际上是一样的,那么重要度采样率总是为1,故更新是之前的n步时序差分学习方法的推广,并且可以完整代替它,前面的n-step Sarsa更新可以用下面的off-policy形式代替,对于 0 ≤ t < T 0 \le t <T 0t<T
Q t + n ( S t , A t )   = ˙   Q t + n − 1 ( S t , A t ) + α ρ t + 1 : t + n [ G t : t + n − Q t + n − 1 ( S t , A t ) ] ,   ( 7.11 ) Q_{t+n}(S_t, A_t) \ \dot{=} \ Q_{t+n-1}(S_t, A_t) + \alpha \rho_{t+1:t+n} [G_{t:t+n} - Q_{t+n-1}(S_t, A_t)], \ \qquad (7.11) Qt+n(St,At) =˙ Qt+n1(St,At)+αρt+1:t+n[Gt:t+nQt+n1(St,At)], (7.11)
注意上式中的重要度采样率,其起点和终点比公式(7.9)都要晚一步,因为这里我们更新的是“状态-动作”对:不关心这些动作有多大概率被选择,既然我们已经选择了这些动作,那么我们想要的是充分学习发生的事情,通过后继动作的重要度采样率来实现的。

在这里插入图片描述

对于off-policy版本的n-step 期望Sarsa使用与上式一样的更新公式,不过重要度采样率是 ρ t + 1 : t + n − 1 \rho_{t+1:t+n-1} ρt+1:t+n1,并且使用式(7.7)的期望Sarsa版本的n-step回报。这是因为在期望Sarsa方法中,所有可能的动作都会在最后一个状态中被考虑,实际采取的那个具体动作对期望Sarsa的计算没有影响,所以不需要去修正。

7.4 *Per-decision Methods with Control Variates

TODO

7.5 Off-policy Learning Without Importance Sampling: The n-step Tree Backup Algorithm

有不需要重要度采样的off-policy学习方法吗?在第6章的Q-learning和期望Sarsa因为是one-step,所以不需要重要度采样,那对于multi-step算法呢?树回溯算法(tree-backup algorithm)是一个答案。

下图是一个3-step的树回溯图,在初始“状态-动作”对 S t S_t St A t A_t At后面,有三个采样状态和奖励、两个采样动作。连接在每个状态侧边的是没有被采样选择的动作(对于最后一个状态,所有的动作都被认为是没有被选择的)。因为没有未被选择的动作的样本数据,所以我们采用自举法并且使用它们的估计值来构建用于价值函数更新的目标。在树回溯中,目标包含了沿途所有的奖励(加上折扣)和底部节点的估计价值以及每一层悬挂在两侧的动作节点的估计价值。这是为什么它被称为树回溯:它的更新来源于整个树的动作价值的估计。

在这里插入图片描述

n-step 树回溯算法的one-step回报与期望Sarsa一样:
G t : t + 1 = ˙ R t + 1 + γ ∑ a π ( a ∣ S t + 1 ) Q t ( S t + 1 , a ) ,   f o r   t < T − 1   ( 7.15 ) G_{t:t+1} \dot{=} R_{t+1} + \gamma \sum_a \pi(a|S_{t+1})Q_t(S_{t+1}, a),\ for \ t<T-1 \ \qquad (7.15) Gt:t+1=˙Rt+1+γaπ(aSt+1)Qt(St+1,a), for t<T1 (7.15)
two-step 树回溯的回报为:
G t : t + 2 = ˙ R t + 1 + γ ∑ a ≠ A t + 1 π ( a ∣ S t + 1 ) Q t + 1 ( S t + 1 , a ) + γ π ( A t + 1 ∣ S t + 1 ) ( R t + 2 + γ ∑ a π ( a ∣ S t + 2 ) Q t + 1 ( S t + 2 , a ) ) = R t + 1 + γ ∑ a ≠ A t + 1 π ( a ∣ S t + 1 ) Q t + 1 ( S t + 1 , a ) + γ π ( A t + 1 ∣ S t + 1 ) G t + 1 : t + 2 ,    f o r   t < T − 2 \begin {aligned} G_{t:t+2} & \dot{=} R_{t+1} + \gamma \sum_{a \neq A_{t+1}} \pi(a|S_{t+1})Q_{t+1}(S_{t+1}, a) + \gamma \pi(A_{t+1}|S_{t+1}) \left(R_{t+2} + \gamma \sum_a \pi(a|S_{t+2})Q_{t+1}(S_{t+2}, a) \right) \\ & = R_{t+1} + \gamma \sum_{a \neq A_{t+1}} \pi(a|S_{t+1})Q_{t+1}(S_{t+1}, a) + \gamma \pi(A_{t+1}|S_{t+1}) G_{t+1:t+2}, \ \ for \ t<T-2 \end {aligned} Gt:t+2=˙Rt+1+γa=At+1π(aSt+1)Qt+1(St+1,a)+γπ(At+1St+1)(Rt+2+γaπ(aSt+2)Qt+1(St+2,a))=Rt+1+γa=At+1π(aSt+1)Qt+1(St+1,a)+γπ(At+1St+1)Gt+1:t+2,  for t<T2
上式显示了树回溯的n-step回报的递归形式的一般形式:
G t : t + n = R t + 1 + γ ∑ a ≠ A t + 1 π ( a ∣ S t + 1 ) Q t + n − 1 ( S t + 1 , a ) + γ π ( A t + 1 ∣ S t + 1 ) G t + 1 : t + n ,    f o r   t < T − 1 , n ≥ 2 ,   ( 7.16 ) G_{t:t+n} = R_{t+1} + \gamma \sum_{a \neq A_{t+1}} \pi(a|S_{t+1})Q_{t+n-1}(S_{t+1}, a) + \gamma \pi(A_{t+1}|S_{t+1}) G_{t+1:t+n}, \ \ for \ t<T-1, n\ge 2, \ \qquad (7.16) Gt:t+n=Rt+1+γa=At+1π(aSt+1)Qt+n1(St+1,a)+γπ(At+1St+1)Gt+1:t+n,  for t<T1,n2, (7.16)
除了 G T − 1 : t + n = ˙ R T G_{T-1:t+n} \dot{=} R_T GT1:t+n=˙RT之外n=1时可以用公式(7.15)来解决。这个目标可以用于n-step Sarsa的动作-价值更新规则(不需要重要性采样率了):
Q t + n ( S t , A t )   = ˙   Q t + n − 1 ( S t , A t ) + α [ G t : t + n − Q t + n − 1 ( S t , A t ) ] ,  f o r   0 ≤ t < T Q_{t+n}(S_t, A_t) \ \dot{=} \ Q_{t+n-1}(S_t, A_t) + \alpha [G_{t:t+n} - Q_{t+n-1}(S_t, A_t)],\ for \ 0 \le t < T Qt+n(St,At) =˙ Qt+n1(St,At)+α[Gt:t+nQt+n1(St,At)] for 0t<T
而对于任意其他状态s( s ≠ S t s \neq S_t s=St)或动作a( a ≠ A t a \neq A_t a=At)的价值估计保持不变: Q t + n ( s , a ) = Q t + n − 1 ( s , a ) Q_{t+n}(s,a) = Q_{t+n-1}(s,a) Qt+n(s,a)=Qt+n1(s,a)。其伪代码如下图。

在这里插入图片描述

7.6 *A Unifing Algorithm: n-step Q()

TODO


参考资料

  1. 《Reinforcement Learning: An Introduction》Sutton, Richard S. and Andrew G. Barto. 第2版, 书籍网站,文中图片全部来自书籍。
  2. https://github.com/ShangtongZhang/reinforcement-learning-an-introduction
  3. https://github.com/YunlianMoon/reinforcement-learning-an-introduction-2nd-edition/tree/master

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

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

相关文章

UE5 MetaHuman SDK插件的使用【一、编辑器创建音波与蓝图创建获取音波,音波与嘴唇的同步】

目录 打开插件 创建音频 编辑器这直接创建音频&#xff1a; 蓝图中创建和获取音频&#xff1a; 唇语&#xff1a; 声音与嘴唇同步&#xff1a; 方法一【效果不是很好】&#xff1a; 方法二【效果很好&#xff0c;但有一段时间延迟在处理】&#xff1a; 逻辑&#xff1…

Spring Boot 中的微服务架构:原理和使用

Spring Boot 中的微服务架构&#xff1a;原理和使用 什么是微服务架构&#xff1f; 微服务架构是一种软件架构模式&#xff0c;它将一个应用程序分解成一组小的、松散耦合的服务。每个服务都有独立的进程和数据存储&#xff0c;可以独立地开发、部署、测试和扩展。这种架构模…

最新AI创作系统ChatGPT网站源码+新增GPT联网功能+支持GPT4+支持ai绘画+实时语音识别输入

最新AI创作系统ChatGPT网站源码新增GPT联网功能支持GPT4支持ai绘画实时语音识别输入 一、AI创作系统二、系统介绍三、系统程序下载四、安装教程五、其他主要功能展示六、更新日志 一、AI创作系统 提问&#xff1a;程序已经支持GPT3.5、GPT4.0接口、支持新建会话&#xff0c;上…

常见面试题之ThreadLocal的理解

1. ThreadLocal概述 ThreadLocal是多线程中对于解决线程安全的一个操作类&#xff0c;它会为每个线程都分配一个独立的线程副本从而解决了变量并发访问冲突的问题。ThreadLocal同时实现了线程内的资源共享 案例&#xff1a;使用JDBC操作数据库时&#xff0c;会将每一个线程的…

常微分方程的解题思路

通解&#xff1a;独立常数的个数等于微分方程的阶数&#xff0c;独立常数的个数实际上就是 c 1 , c 2 , . . . , c n c_1,c_2,...,c_n c1​,c2​,...,cn​是数目 所以补 C C C也是关键的一步&#xff0c;而且未必是 C C C&#xff0c;也可以是 ln ⁡ C \ln C lnC之类的&…

HPM6750系列--第六篇 创建自己的工程

一、目的 细心的朋友可能会发现官方提供了HPM-Sdk仓库&#xff0c;示例代码都是作为一个文件夹的形式放在此仓库下&#xff0c;我们之前都是直接拷贝里面的工程进行演示。 下面我们就具体来分析一下hello_world工程的文件组成&#xff0c;这样我们就可以创建自己的工程。 二、…

vscode里vue文件内<template>标签报错

发现只要把文件名使用驼峰命名法&#xff0c;把Login.vue改为LoginView.vue就不报错了加个大写的View就没有了。 官方参考文档&#xff1a;vue/multi-word-component-names | eslint-plugin-vue

说说@EnableConfigurationProperties那点事

两者的对比 ConfigurationProperties 使用ConfigurationProperties的时候&#xff0c;把配置类的属性与yml配置文件绑定起来的时候&#xff0c;还需要加上Component注解才能绑定并注入IOC容器中&#xff0c;若不加上Component&#xff0c;则会无效。 EnableConfigurationPro…

Mybatis 入门及实践

Mybatis 入门及实践 文章目录 Mybatis 入门及实践前言一. 简介二. 入手案例2.1 前置准备2.1.1 Maven依赖2.1.2 sql准备2.1.3 Log4j2 配置1. Maven引入2. log4j2.xml 2.2 代码流程构建步骤2.2.1 Mybatis前置知识2.2.2 步骤流程2.2.3 代码实现 三. XML映射器前置代码3.1 select3.…

【网络编程】网络编程套接字(一)

文章目录 网络编程预备知识认识端口号理解源端口号和目的端口号认识TCP协议和UDP协议网络字节序sockaddr结构1.socket 常见API2.sockaddr结构 网络编程预备知识 认识端口号 端口号(port)是传输层协议的内容. 端口号是一个2字节16位的整数; 端口号用来标识一个进程, 告诉操作系…

Linux :LNMP(源码包安装)

Linux 虚拟机 VMware&#xff1a;安装centos7_鲍海超-GNUBHCkalitarro的博客-CSDN博客 物理机 linux&#xff1a;真机安装centos linux&#xff08;突发事件&#xff1a;解决卡在安装界面&#xff09;{寻找镜像--u启制作--引导u盘--解决卡在安装界面--安装配置}_安装centos7卡…

Linux--文件/目录权限

看懂权限&#xff1a; 拥有者&#xff1a;文件属于谁 所属组&#xff1a;文件属于哪个组 other:不属于上面两种的任何一个&#xff0c;就是other 图示&#xff1a; 分析&#xff1a; ①第一列&#xff1a; d:目录 -:普通文件 p:管道文件 b:块设备 c:字符设备 l:链接…

数学建模概论

1、从现实对象到数学模型 我们常见的模型 玩具、照片......~实物模型水箱中的舰艇、风洞中的飞机......~物理模型地图、电路图、分子结构图......~符号模型 模型是为了一定目的&#xff0c;对客观事物的一部分进行简缩、抽象、提炼出来的原型的替代物&#xff0c;集中反映了原型…

【C++1】函数重载,类和对象,引用,string类,vector容器,类继承和多态,/socket

文章目录 1.函数重载&#xff1a;writetofile()&#xff0c;Ctrue和false&#xff0c;C0和非02.类和对象&#xff1a;vprintf2.1 构造函数&#xff1a;对成员变量初始化2.2 析构函数&#xff1a;一个类只有一个&#xff0c;不允许被重载 3.引用&#xff1a;C中&取地址&…

沁恒CH32V307VCT6最小系统板/开发板开源

沁恒CH32V307VCT6最小系统板&#xff0c;引出了所有IO口&#xff0c;一个Type-C连接到USB2.0全速OTG接口&#xff0c;一个Flash芯片 型号W25Q64 容量64Mbit 连接到SPI2接口&#xff0c;板上还有TL432电压基准1.25V(实测1.246V左右)可通过跳线连接到PC3的AD13&#xff0c;还有3.…

【c++】并行编程:cuda入门

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍cuda入门。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新不迷路&#x1f95e…

测试在 4090 上运行 vicuna-33b 进行推理

测试在 4090 上运行 vicuna-33b 进行推理 今天尝试在 4090 上运行 vicuna-33b 进行推理&#xff0c;使用的是 8bit 量化。 运行命令如下&#xff0c; python3 -m fastchat.serve.cli --model-path lmsys/vicuna-33b-v1.3 --load-8bit结论&#xff0c;使用 8bit 量化在 4090 上…

HTTP概述以及Tomcat概述

HTTP 概念&#xff1a;Hyper Text Transfer Protocol&#xff0c;超文本传输协议&#xff0c;规定了浏览器和服务器之间数据传输的规则。特点&#xff1a; 基于TCP协议&#xff1a;面向连接、安全基于请求-响应模型的&#xff1a;一次请求对应一次响应HTTP协议是无状态的协议…

Java面试题3

[TOC]目录 1. spring事务 事务简介 事务在逻辑上是一组操作&#xff0c;要么执行&#xff0c;要不都不执行。主要是针对数据库而言的&#xff0c;比如说 MySQL。 为了保证事务是正确可靠的&#xff0c;在数据库进行写入或者更新操作时&#xff0c;就必须得表现出 ACID 的 4 …

nexus搭建maven私有仓库

Nexus 在企业开发中还是比较常用的私有仓库管理工具&#xff0c;一般把公司内部的Maven jar 包或npm包上传到仓库中&#xff0c;有效的对包文件进行管理。 Nexus 至少需要 2G 以上的内存 安装nexus之前首先安装配置好 JDK 环境 和 Maven环境 1、Linux环境安装openJDK 2、Centos…