Reinfocement Learning 学习笔记PartⅡ

文章目录

  • Reinfocement Learning
    • 六、随机近似与随机梯度下降(Stochastic Approximation & Stochastic Gradient Descent)
      • 6.1 Robbins-Monro Algorithm
      • 6.2 随机梯度下降
    • 七、时序差分方法(Temporal-Difference Learning)
      • 7.1 TD算法介绍
      • 7.2 TD算法的收敛性
      • 7.3 TD算法与MC算法的比较
      • 7.4 Sarsa及其变种
      • 7.5 Q-learning
      • 7.6 on-policy learning & off-policy learning
      • 7.7 summary

Reinfocement Learning

六、随机近似与随机梯度下降(Stochastic Approximation & Stochastic Gradient Descent)

6.1 Robbins-Monro Algorithm

Stochastic approximation (SA) 是指一大类求根和优化问题的随机迭代算法,与许多其他求根算法相比,SA 的强大之处在于它无需知道目标函数的表达式或其导数。Robbins-Monro算法是SA领域的开创工作。

假定我们想要此等式的根 w w w g ( w ) = 0 g(w)=0 g(w)=0

当函数 g g g 的表达式已知或者它的导数已知的时候,求解当然很简单。但是当 g g g 未知的时候,问题就困难起来了。Robbins-Monro 算法是这样解决的:
w k + 1 = w k − a k g ∼ ( w k , η k ) w_{k+1}=w_k-a_k {\overset{\sim}{g}}(w_k,\eta_k) wk+1=wkakg(wk,ηk)
其中 w k w_k wk 是对第 k k k 次根的估计, g ∼ ( w k , η k ) = g ( w k ) + η k {\overset{\sim}{g}}(w_k,\eta_k)=g(w_k)+\eta_k g(wk,ηk)=g(wk)+ηk 是第 k k k 个带有噪声(误差)的观测(输出), a k a_k ak 是正系数。

显然这个算法并不依赖于函数 g g g,但依赖于输入序列 w k w_k wk 和带有噪声输出序列 g ∼ ( w k , η k ) {\overset{\sim}{g}}(w_k,\eta_k) g(wk,ηk),框图如下:

image-20231214133817850

最终 w k + 1 w_{k+1} wk+1 能收敛到根 w ∗ w^* w。收敛性在此不做证明。

来看一个平均值求解的例子。如何求平均值,把所有数加起来除以个数当然能求得。但这样做的弊端是我必须要获取所有的数据后才能求其均值,如何使用迭代的方式求解呢?

我们可以假设 w k + 1 = 1 k ∑ k i = 1 x i w_{k+1}=\frac{1}{k}\underset{i=1}{\overset{k} \sum} x_i wk+1=k1i=1kxi,则 w k = 1 k − 1 ∑ k − 1 i = 1 x i w_{k}=\frac{1}{k-1}\underset{i=1}{\overset{k-1} \sum} x_i wk=k11i=1k1xi,所以 w k + 1 w_{k+1} wk+1 可以由 w k w_k wk 表示:
w k + 1 = 1 k ∑ k i = 1 x i = 1 k ( ∑ k − 1 i = 1 x i + x k ) = 1 k ( ( k − 1 ) w k + x k ) = w k − 1 k ( w k − x k ) w_{k+1}=\frac{1}{k}\underset{i=1}{\overset{k} \sum} x_i=\frac{1}{k}(\underset{i=1}{\overset{k-1} \sum}x_i+x_k)=\frac{1}{k}((k-1)w_k+x_k)=w_k-\frac{1}{k}(w_k-x_k) wk+1=k1i=1kxi=k1(i=1k1xi+xk)=k1((k1)wk+xk)=wkk1(wkxk)
就像这样:

image-20231214140823822

如果把 1 k \frac{1}{k} k1 变为 α k \alpha_k αk 还能成立吗?可以用上述的 Robbins-Monro Algorithm 来证明 w k + 1 w_{k+1} wk+1 仍然能收敛到期望。

问题转换为当 α k ≠ 1 k \alpha_k \neq \frac{1}{k} αk=k1 时, w k + 1 w_{k+1} wk+1 还能收敛到期望 E [ X ] \mathbb{E}[X] E[X] 吗?

我们有 w k + 1 = w k − α k ( w k − x k ) w_{k+1}=w_k-\alpha_k(w_k-x_k) wk+1=wkαk(wkxk)

建立如下函数 g ( w ) = w − E [ X ] g(w)=w-\mathbb{E}[X] g(w)=wE[X],如果 g ( w ) = 0 g(w)=0 g(w)=0,根即为期望。

现输入一个 w w w,如何得到其噪音的观测呢?
g ∼ ( w , η ) = g ( w ) + η = ( w − E [ X ] ) + ( E [ X ] − x ) = w − x {\overset{\sim}{g}}(w,\eta)=g(w)+\eta=(w-\mathbb{E}[X])+(\mathbb{E}[X]-x)=w-x g(w,η)=g(w)+η=(wE[X])+(E[X]x)=wx
现考虑 w k w_k wk 序列并带入到 Robbins-Monro 公式中得:
w k + 1 = w k − α k ( w k − x k ) w_{k+1}=w_k-\alpha_k(w_k-x_k) wk+1=wkαk(wkxk)
即得到证明:即使 α k ≠ 1 k \alpha_k \neq \frac{1}{k} αk=k1 时, w k + 1 w_{k+1} wk+1 仍能收敛到期望 E [ X ] \mathbb{E}[X] E[X]

6.2 随机梯度下降

Stochastic gradient descent(SGD)被广泛应用于机器学习和强化学习,但后面可以发现它实际上就是一种特殊的 Robbins-Monro 算法。

假设我们要求解一个最优化问题 w w w 何值时, J ( w ) J(w) J(w) 最小:
min ⁡ w J ( w ) = E [ f ( w , X ) ] \underset{w}{\min}\quad J(w)=\mathbb{E}[f(w,X)] wminJ(w)=E[f(w,X)]
image-20231214144946062

α k \alpha_k αk 是学习率(步长), ∇ \nabla 表示梯度,采用梯度下降的方法一定能找到一个局部极小值

期望很难求,用蒙特卡洛估计依靠数据近似期望

image-20231214145951576

但每一次更新 w k w_k wk 时,都需要进行多次采样,现实中可能行不通

image-20231214150222648

与 GD 相比使用随机梯度来代替真实的梯度,与 BGD 相比,使 n = 1 n=1 n=1,即采样一次。

例子:

image-20231214150614741 image-20231214151150422

为什么 SGD 是可以收敛的呢?同样时使用 Robbins-Monro 证明。

现在有目标函数 J ( w ) = E [ f ( w , X ) ] J(w)=\mathbb{E}[f(w,X)] J(w)=E[f(w,X)]

我想让它取得最小值,那么一个必要条件时取得最小值时的梯度为0,即 ∇ w J ( w ) = E [ ∇ w f ( w , X ) ] = 0 \nabla_wJ(w)=\mathbb{E}[\nabla_w f(w,X)]=0 wJ(w)=E[wf(w,X)]=0

g ( w ) = ∇ w J ( w ) = E [ ∇ w f ( w , X ) ] g(w)=\nabla_wJ(w)=\mathbb{E}[\nabla_w f(w,X)] g(w)=wJ(w)=E[wf(w,X)],此时变成了 g ( w ) = 0 g(w)=0 g(w)=0 的求根问题

image-20231214152331509

image-20231214152355128

七、时序差分方法(Temporal-Difference Learning)

7.1 TD算法介绍

TD 算法是 m o d e l − f r e e model-free modelfree 的算法

由给定的策略 π \pi π t t t 时刻可以得到序列 { ( s t , r t + 1 , s t + 1 ) } t \{(s_t,r_{t+1},s_{t+1})\}_t {(st,rt+1,st+1)}t s t s_t st 表示 t t t 时刻所在的状态

image-20231214162807099

式中 v t v_t vt 代表在 t t t 时刻状态 s s s s t a t e   v a l u e state \ value state value (即 v π v_{\pi} vπ)的估计值,这个式子就是要用 v t v_t vt 来不断逼近 s t a t e   v a l u e state \ value state value

( 1 ) (1) (1) 式表示更新当前状态 s t s_t st s t a t e   v a l u e state \ value state value 估计值 v t + 1 ( s t ) v_{t+1}(s_t) vt+1(st)

( 2 ) (2) (2) 式表示其余状态的的 s t a t e   v a l u e state \ value state value 估计值不进行更新

image-20231214163154558

q u e s t i o n 1 question1 question1:为什么 v − t \overset{-}v_t vt 被称作 T D   t a r g e t TD \ target TD target

a n s w e r 1 answer1 answer1:因为此算法是要把 v t ( s t ) v_t(s_t) vt(st) 朝着 v − t \overset{-}v_t vt 的方向改进

image-20231214164326703

q u e s t i o n 2 question2 question2 T D   e r r o r TD \ error TD error 是什么?

a n s w e r 2 answer2 answer2

  • 两个时刻的差值
  • 描述了 v t v_t vt v π v_{\pi} vπ 之间的误差

T D   A l g o r i t h m   p r o p e r t i e s TD \ Algorithm \ properties TD Algorithm properties

  1. 对给定的策略进行 p o l i c y   e v a l u a t i o n policy \ evaluation policy evaluation ,即计算 s t a t e   v a l u e state \ value state value(不能估计 a c t i o n   v a l u e action \ value action value,不能寻找最优策略)
  2. 核心思想就是对于给定的策略,我对状态 s s s v π v_{\pi} vπ 有一个估计,这可能是不准确的,此时将得到的 { ( s t , r t + 1 , s t + 1 ) } t \{(s_t,r_{t+1},s_{t+1})\}_t {(st,rt+1,st+1)}t 与估计联系到一起,得到 T D   e r r o r TD \ error TD error,这说明了此时的估计是不准确的,并利用 T D   e r r o r TD \ error TD error 来改进当前的估计。

7.2 TD算法的收敛性

TD 算法其实是求解了这样一个贝尔曼公式:

image-20231215121843563

就是把原来的 G t + 1 G_{t+1} Gt+1 替换成了 v π ( S ′ ) v_{\pi}(S') vπ(S) ,这是由 s t a t e   v a l u e state \ value state value 最初始的定义得到的。

可以用 Robbins-Monro Algorithm 来求解这个公式,首先定义:

image-20231215122233806

如果 g ( v ( s ) ) = 0 g(v(s))=0 g(v(s))=0,那么 v ( s ) = E [ R + γ v π ( S ′ ∣ s ) ] v(s)=\mathbb{E}[R+\gamma v_{\pi}(S'|s)] v(s)=E[R+γvπ(Ss)] 成立,就可以用 v ( s ) v(s) v(s) 来逼近 v π ( s ) v_{\pi}(s) vπ(s)。我们有大量 R , S ′ R,S' R,S 的数据采样 r , s ′ r,s' r,s

image-20231215122504113

得到:

image-20231215122532778

此式存在两个问题。

q u e s t i o n 1 question1 question1:式子是由 { ( s , r , s ′ ) } \{(s,r,s')\} {(s,r,s)} 的得到的,如何确保它是按序的呢?

a n s w e r 1 answer1 answer1:将 { ( s , r , s ′ ) } \{(s,r,s')\} {(s,r,s)} 替换为一个 t r a j e c t o r y trajectory trajectory 中的 { ( s t , r t + 1 , s t + 1 ) } \{(s_t,r_{t+1},s_{t+1})\} {(st,rt+1,st+1)}

q u e s t i o n 2 question2 question2:式中的 v π ( s k ′ ) v_{\pi}(s_k') vπ(sk) 是不知道的

a n s w e r 2 answer2 answer2:用 v k ( s k ′ ) v_{k}(s_k') vk(sk) v π ( s k ′ ) v_{\pi}(s_k') vπ(sk) 的估计值来代替 v π ( s k ′ ) v_{\pi}(s_k') vπ(sk) ,仍能使得 v k ( s ) v_k(s) vk(s) 收敛

7.3 TD算法与MC算法的比较

TD LearningMC Learning
O n l i n e Online Online:能够在收到一个 r e w a r d reward reward 后立即更新 s t a t e / a c t i o n   v a l u e state/action \ value state/action value O f f l i n e Offline Offline:必须要等到一个 e p i s o d e episode episode 结束才能计算 r e t u r n return return
C o n t i n u i n g   t a s k s Continuing \ tasks Continuing tasks:可以处理连续的任务( e p i s o d e episode episode 无限长) E p i s o d i c   t a s k s Episodic \ tasks Episodic tasks:只能处理一个 e p i s o d e episode episode t e r m i n a l   s t a t e terminal \ state terminal state 的任务
B o o t s t r a p p i n g Bootstrapping Bootstrapping:更新 v a l u e value value 依赖于先前 v a l u e value value 的估计值 N o n − b o o t s t r a p p i n g Non-bootstrapping Nonbootstrapping:可以直接估计 s t a t e / a c t i o n   v a l u e state/action \ value state/action value
L o w   e s t i m a t i o n   v a r i a n c e Low \ estimation \ variance Low estimation variance:相较于 MC 有较少的随机变量,但是是有偏估计(由初始的估计造成) H i g h   e s t i m a t i o n   v a r i a n c e High \ estimation \ variance High estimation variance:为估计 q π k ( s , a ) q_{\pi_k}(s,a) qπk(s,a) 涉及到的随机变量较多,采样数量少的情况下方差较大,是无偏估计

7.4 Sarsa及其变种

S a r s a Sarsa Sarsa 可以给出给定策略 π \pi π a c t i o n   v a l u e action \ value action value

假设有集合 { ( s t , a t , r t + 1 , s t + 1 , a t + 1 ) } t \{(s_t,a_t,r_{t+1},s_{t+1},a_{t+1})\}_t {(st,at,rt+1,st+1,at+1)}t

image-20231215130620423

形式上跟 T D TD TD 算法是一样的,只是 T D TD TD 得到的是 s t a t e   v a l u e state \ value state value 的估计值,而 S a r s a Sarsa Sarsa a c i t o n   v a l u e aciton \ value aciton value 的估计值

S a r s a Sarsa Sarsa 求解的是这样的贝尔曼公式:

在这里插入图片描述

在求得 a c t i o n   v a l u e action \ value action value 之后,使用 ϵ − g r e e d y \epsilon-greedy ϵgreedy 的策略进行 p o l i c y   i m p r o v e m e n t policy \ improvement policy improvement

算法存在的问题是:如果 e p i s o d e episode episode 不足以覆盖全部的 ( s , a ) (s,a) (s,a),那么可能找不到全局的最优策略。

E x p e c t e d   S a r s a Expected \ Sarsa Expected Sarsa

image-20231215132900346

不需要再对 a t + 1 a_{t+1} at+1 进行采样, E x p e c t e d   S a r s a Expected \ Sarsa Expected Sarsa 求解的是这样的贝尔曼公式:

在这里插入图片描述

n − s t e p   S a r s a n-step\ Sarsa nstep Sarsa 需要的集合为 { ( s t , a t , r t + 1 , s t + 1 , a t + 1 ) , . . . , r t + n , s t + n , a t + n } t \{(s_t,a_t,r_{t+1},s_{t+1},a_{t+1}),...,r_{t+n},s_{t+n},a_{t+n}\}_t {(st,at,rt+1,st+1,at+1),...,rt+n,st+n,at+n}t,而 M C MC MC 是需要整个的 e p i s o d e episode episode,即所有的 s t a t e − a c t i o n   p a i r state-action \ pair stateaction pair

image-20231215133651194

区别在于后面的 T D   t a r g e t TD \ target TD target 不同

image-20231215133734213

7.5 Q-learning

image-20231215140030458

S a r s a Sarsa Sarsa 相比也是 T D   t a r g e t TD \ target TD target 不同, Q − l e a r n i n g Q-learning Qlearning 取的是让状态 s t + 1 s_{t+1} st+1 a c t i o n   v a l u e action \ value action value 取得最大值时的动作 a a a,而 S a r s a Sarsa Sarsa 是随机采样一个 a a a

Q − l e a r n i n g Q-learning Qlearning 求解的是贝尔曼最优方程:

image-20231215140438341

得到的值是最优的 a c t i o n   v a l u e action \ value action value,当然对应的是最优策略

7.6 on-policy learning & off-policy learning

T D   L e a r n i n g TD \ Learning TD Learning 中有两种策略:

  • b e h a v i o r   p o l i c y behavior \ policy behavior policy:用于生成 e x p e r i e n c e   s a m p l e s experience \ samples experience samples(即前面所说的 { ( s t , a t , r t + 1 , s t + 1 , a t + 1 ) } t \{(s_t,a_t,r_{t+1},s_{t+1},a_{t+1})\}_t {(st,at,rt+1,st+1,at+1)}t 这样的序列)
  • t a r g e t   p o l i c y target \ policy target policy:持续向最优策略更新

由此引出 o n − p o l i c y on-policy onpolicy o f f − p o l i c y off-policy offpolicy

  • o n − p o l i c y on-policy onpolicy b e h a v i o r   p o l i c y behavior \ policy behavior policy t a r g e t   p o l i c y target \ policy target policy 相同,即用一个策略 π \pi π 与环境交互得到 e x p e r i e n c e experience experience 同时改进这个策略 π \pi π ,再用改进的策略 π ′ \pi' π 与环境交互然后再改进直到得到最优策略 π ∗ \pi^* π
  • o f f − p o l i c y off-policy offpolicy b e h a v i o r   p o l i c y behavior \ policy behavior policy t a r g e t   p o l i c y target \ policy target policy 不相同,即用一个策略 π \pi π 与环境交互得到 e x p e r i e n c e experience experience 同时改进另外一个策略 π ′ \pi' π ,再用策略 π \pi π 与环境交互然后再改进 π ′ \pi' π 直到得到最优策略 π ∗ \pi^* π

S a r s a Sarsa Sarsa o n − p o l i c y on-policy onpolicy π t → e x p e r i e n c e → a c t i o n   v a l u e   e s t i m a t i o n → π t + 1 \pi_t \rightarrow experience \rightarrow action \ value \ estimation \rightarrow \pi_{t+1} πtexperienceaction value estimationπt+1 π t \pi_t πt 既是 b e h a v i o r   p o l i c y behavior \ policy behavior policy 也是 t a r g e t   p o l i c y target \ policy target policy

M o n t e − C a r l o Monte-Carlo MonteCarlo o n − p o l i c y on-policy onpolicy π t → e x p e r i e n c e / t r a j e c t o r y → a c t i o n   v a l u e   e s t i m a t i o n → π t + 1 \pi_t \rightarrow experience / trajectory \rightarrow action \ value \ estimation \rightarrow \pi_{t+1} πtexperience/trajectoryaction value estimationπt+1 π t \pi_t πt 既是 b e h a v i o r   p o l i c y behavior \ policy behavior policy 也是 t a r g e t   p o l i c y target \ policy target policy

Q − l e a r n i n g Q-learning Qlearning o f f − p o l i c y off-policy offpolicy: 由 s t s_t st 选择动作 a t a_t at b e h a v i o r   p o l i c y behavior \ policy behavior policy 可以是任意策略, t a r g e t   p o l i c y target\ policy target policy 是根据最大 a c t i o n   v a l u e action \ value action value 确定的最优策略

Q − l e a r n i n g Q-learning Qlearning 可以是 o n − p o l i c y on-policy onpolicy 的,也可以是 o f f − p o l i c y off-policy offpolicy

image-20231215144254887

用更新的 π t + 1 \pi_{t+1} πt+1 继续生成 e x p e r i e n c e experience experience,在 p o l i c y   i m p r o v e m e n t policy \ improvement policy improvement 阶段采用 ϵ − g r e e d y \epsilon-greedy ϵgreedy 是希望策略具有一定的探索性,希望能覆盖到所有的 ( s , a ) (s,a) (s,a)

image-20231215144400046

π b \pi_b πb (此策略生成的 e p i s o d e episode episode 会对 Q − l e a r n i n g Q-learning Qlearning 的结果产生影响)来生成 e x p e r i e n c e experience experience,在 p o l i c y   i m p r o v e m e n t policy \ improvement policy improvement 阶段采用 g r e e d y greedy greedy 是因为我不会用改进的策略来生成 e x p e r i e n c e experience experience,所以选最优的即可

7.7 summary

前面介绍的 T D TD TD 算法其实都可以用下面的式子统一表示:

image-20231215150359580

不同点在于 q t − \overset{-}{q_t} qt

image-20231215150431266

所有的算法也可以看作是求解贝尔曼公式或者贝尔曼最优公式的随即近似算法:

image-20231215150547040

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

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

相关文章

OpenAI 承认 ChatGPT 最近的懒惰:由于用户体验到响应缓慢和无用的输出,调查正在进行中

文章目录 一. ChatGPT 指令遵循能力下降引发用户投诉1.1 用户抱怨回应速度慢、敷衍回答、拒绝回答和中断会话 二. OpenAI 官方确认 ChatGPT 存在问题,展开调查三. OpenAI 解释模型行为差异,回应用户质疑四. GPT-4 模型变更受人事动荡和延期影响 一. Chat…

【设计模式--行为型--中介者模式】

设计模式--行为型--中介者模式 中介者模式定义结构案例实现优缺点使用场景 中介者模式 定义 又叫调停模式,定义一个中介角色来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立的改变它们之间的交互。 结构 抽象中介者角色…

IntelliJ IDEA 运行 若依分离版后端

一、本地运行 一、选择打开IntelliJ IDEA项目 二、选择若依项目 如:java123 三、等待右下角的准备工作(有进度条的)完成 四、修改MySQL 五、修改资源上传目录 六、修改redis 七、然后点击运行 八、成功图 九、测试访问 二、部署服务器运行 …

策略+工厂完成支付方式选择(微信/支付宝),简单实现

需求 传参String payType wechat 使用微信支付传参String payType ali 使用支付宝支付代码不允许出现if-else 思路 把支付当作一个行为,代码中当作一个接口,payService。2个实现类,分别是微信支付实现类WeChatPayServiceImpl&#xff0c…

【数据结构】单链表的定义和操作

目录 1.单链表的定义 2.单链表的创建和初始化 3.单链表的插入节点操作 4.单链表的删除节点操作 5.单链表的查找节点操作 6.单链表的更新节点操作 7.完整代码 🌈嗨!我是Filotimo__🌈。很高兴与大家相识,希望我的博客能对你有所帮助…

汽车充电协议OpenV2G的平替cbexigen!!

纵所周知,开源欧规协议 CCS 的 OpenV2G 协议不支持 ISO15118-20:2022 协议,并且软件维护者已经明确不在进行该软件的维护。 前几天在 Github 上冲浪发现了一个宝藏开源项目,完美的实现的 OpenV2G 的 Exidizer 工具的功能:cbexigen…

Goldstein枝切法对存在间断相位缺陷的解缠研究

摘要: Goldstein枝切法作为相位解缠中路径积分法的重要算法之一,其解缠结果易受到噪声或间断相位缺陷所引起的残差点影响。为了研究相位间断缺陷对解缠算法的影响,模拟了具有间断相位缺陷的数据,采用 Gold-stein枝切法进行了系统的解缠研究。…

嵌入式C语言变量、数组、指针初始化的多种操作

在敲代码的时候,我们会给变量一个初始值,以防止因为编译器的原因造成变量初始值的不确定性。 对于数值类型的变量往往初始化为0,但对于其他类型的变量,如字符型、指针型等变量等该如何初始化呢? 数值类变量初始化 整…

巴贝拉葡萄酒是单一品种还是混合品种制成的?

大多数巴贝拉葡萄酒都是由单一的巴贝拉葡萄品种制成的,许多意大利葡萄酒商开始尝试在巴贝拉葡萄酒中加入其它葡萄品种,其中两个最受欢迎的意大利品种是皮埃蒙特的巴贝拉德阿尔巴和达斯蒂。和朋友在一家意大利餐厅吃饭,被酒单吓到了&#xff1…

MySQL数据库 入门

目录 一、MySQL概述 二、MySQL安装 安装数据库 配置数据库 启动停止数据库 客户端连接数据库 三、数据模型 四、SQL 一、MySQL概述 先来讲解三个概念:数据库、数据库管理系统、 SQL 。 而目前主流的关系型数据库管理系统的市场占有率排名如下: …

Android--Jetpack--数据库Room详解一

人生何须万种愁,千里云烟一笑收 一,定义 Room也是一个ORM框架,它在SQLite上提供了一个抽象层,屏蔽了部分底层的细节,使用对象对数据库进行操作,进行CRUD就像对象调用方法一样的简单。 二,角色介…

​【EI会议征稿中】#先投稿,先送审#第三届网络安全、人工智能与数字经济国际学术会议(CSAIDE 2024)​

#先投稿,先送审# 第三届网络安全、人工智能与数字经济国际学术会议(CSAIDE 2024) 2024 3rd International Conference on Cyber Security, Artificial Intelligence and Digital Economy 2024年3月1日-3日 | 中国南京 会议官网&#xff1a…

外包干了4个月,测试技术退步明显

先说一下自己的情况,本科生,20年通过校招进入杭州某软件公司,干了3年的功能测试,当然有半年是被封在了家里,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我…

10个 Python 脚本来自动化你的日常任务

在这个自动化时代,我们有很多重复无聊的工作要做。想想这些你不再需要一次又一次地做的无聊的事情,让它自动化,让你的生活更轻松。 那么在本文中,我将向您介绍 10 个 Python 自动化脚本,以使你的工作更加自动化&#…

在Mac系统下为SpringBoot 配置Maven 【避坑完整版】

前提背景 电脑罢工,操作系统重装,不仅有大量的软件需要安装,还有很多开发环境需要配置。 就在今天配置Maven的时候各种坑,写下来供大家参考。 一、在讨论安装Maven前先安装一下JDK,方式很多,我这里有个比较快的办法&am…

gitee(ssh)同步本地

一、什么是码云 gitee Git的”廉价平替” > 服务器在国内,运行不费劲 在国内也形成了一定的规模 git上的一些项目插件等在码云上也可以找得到 二、创建仓库 三、删除仓库 四、仓库与本地同步 > 建立公钥 五、把仓库同步到本地 六、在本地仓库中创建vue项目…

Docker 部署 Lobe Chat 服务

拉取最新版本的 Lobe Chat 镜像: $ sudo docker pull lobehub/lobe-chat:latest使用以下命令来运行 Lobe Chat 容器: $ sudo docker run -d --name lobe-chat -p 10084:3210 -e OPENAI_API_KEYsk-xxxx -e OPENAI_PROXY_URLhttps://api.openai.com/v1 -e ACCESS_CO…

C之switch小问题

执行结果: 为什么会是100呢? 因为C语言会忽视 switch语句与第一个case之间的code,也就是根本不会执行 “num100;

谷歌Gemini API 应用(二):LangChain 加持

昨天我完成了谷歌Gemini API 应用(一):基础应用这篇博客,今天我们要在此基础上实现Gemini模型的Langchian加持,因为Gemini API刚发布没几天,所以langchian还没有来得及将其整合到现有的langchain包的架构内,langchain公…

【SpringBoot篇】Interceptor拦截器 | 拦截器和过滤器的区别

文章目录 🌹概念⭐作用 🎄快速入门⭐入门案例代码实现 🛸拦截路径🍔拦截器interceptor和过滤器filter的区别🎆登录校验 🌹概念 拦截器(Interceptor)是一种软件设计模式,…