强化学习的数学原理学习笔记 - Actor-Critic

文章目录

  • 概览:RL方法分类
  • Actor-Critic
    • Basic actor-critic / QAC
    • 🟦A2C (Advantage actor-critic)
    • Off-policy AC
      • 🟡重要性采样(Importance Sampling)
      • Off-policy PG
      • Off-policy AC
    • 🟦DPG (Deterministic AC)


本系列文章介绍强化学习基础知识与经典算法原理,大部分内容来自西湖大学赵世钰老师的强化学习的数学原理课程(参考资料1),并参考了部分参考资料2、3的内容进行补充。

系列博文索引:

  • 强化学习的数学原理学习笔记 - RL基础知识
  • 强化学习的数学原理学习笔记 - 基于模型(Model-based)
  • 强化学习的数学原理学习笔记 - 蒙特卡洛方法(Monte Carlo)
  • 强化学习的数学原理学习笔记 - 时序差分学习(Temporal Difference)
  • 强化学习的数学原理学习笔记 - 值函数近似(Value Function Approximation)
  • 强化学习的数学原理学习笔记 - 策略梯度(Policy Gradient)
  • 强化学习的数学原理学习笔记 - Actor-Critic

参考资料:

  1. 【强化学习的数学原理】课程:从零开始到透彻理解(完结)(主要)
  2. Sutton & Barto Book: Reinforcement Learning: An Introduction
  3. 机器学习笔记

*注:【】内文字为个人想法,不一定准确

概览:RL方法分类

图源:https://zhuanlan.zhihu.com/p/36494307
*图源:https://zhuanlan.zhihu.com/p/36494307

Actor-Critic

Actor-Critic属于策略梯度(PG)方法,实际上是将值函数近似和策略梯度方法进行了结合。

  • Actor:策略更新,Actor用来执行动作与环境交互
  • Critic:策略评估 / 值估计,Critic用来评估Actor的好坏

Basic actor-critic / QAC

与策略梯度算法对应,Actor即为策略梯度算法中执行策略更新的部分(通过更新参数 θ \theta θ),而Critic是估计 q t ( s t , a t ) q_t(s_t,a_t) qt(st,at)的算法。QAC(Q actor-critic)是最简单的actor-critic算法,也是一种on-policy方法。

QAC vs. REINFOCE:估计 q t ( s t , a t ) q_t(s_t,a_t) qt(st,at)的方法不同

  • REINFORCE:蒙特卡洛(MC)
  • QAC:时序差分(TD)

QAC算法:【简单理解:QAC = Sarsa with function estimation + Policy Gradient

  • Critic(值更新 / 策略评估):采用Sarsa with function estimation的方法估计 q t ( s t , a t ) q_t(s_t,a_t) qt(st,at)
    • w t + 1 = w t + α w [ r t + 1 + γ q ( s t + 1 , a t + 1 , w t ) − q ( s t , a t , w t ) ] ∇ w q ( s t , a t , w t ) w_{t+1} = w_t + \alpha_w [r_{t+1} + \gamma {q}(s_{t+1}, a_{t+1}, w_t) - {\color{blue} {q}(s_t, a_t, w_t)}] {\color{blue} \nabla_w {q}(s_t, a_t, w_t)} wt+1=wt+αw[rt+1+γq(st+1,at+1,wt)q(st,at,wt)]wq(st,at,wt)
  • Actor(策略更新 / 策略提升):采用策略梯度(PG)的方法(同REINFROCE)更新策略
    • θ t + 1 = θ t + α θ ∇ θ ln ⁡ π ( a t ∣ s t , θ t ) q t ( s t , a t , w t + 1 ) \theta_{t+1} = \theta_t + \alpha_\theta \nabla_\theta \ln\pi (a_t|s_t, \theta_t) {\color{blue} q_t(s_t, a_t, w_{t+1}) } θt+1=θt+αθθlnπ(atst,θt)qt(st,at,wt+1)

🟦A2C (Advantage actor-critic)

A2C的基本思想:在QAC中引入baseline来减少估计的方差(variance)。

理论基础:引入baseline b ( S ) b(S) b(S)后,策略梯度(期望)不会发生改变,但其方差会减小(推导略),即 ∇ θ J ( θ ) = E S ∼ η , A ∼ π [ ∇ θ ln ⁡ π ( A ∣ S , θ ) q π ( S , A ) ] = E S ∼ η , A ∼ π [ ∇ θ ln ⁡ π ( A ∣ S , θ ) ( q π ( S , A ) − b ( S ) ) ] \nabla_\theta J (\theta) = \mathbb{E}_{S\sim\eta,A\sim\pi} [\nabla_\theta \ln\pi (A|S, \theta) q_\pi(S, A) ] = \mathbb{E}_{S\sim\eta,A\sim\pi} [\nabla_\theta \ln\pi (A|S, \theta) (q_\pi(S, A) {\color{blue} - b(S))} ] θJ(θ)=ESη,Aπ[θlnπ(AS,θ)qπ(S,A)]=ESη,Aπ[θlnπ(AS,θ)(qπ(S,A)b(S))] 其中, b ( S ) b(S) b(S)为关于 S S S的标量函数。
使得方差最小的最优baseline形式为: b ∗ ( s ) = E A ∼ π [ ∥ ∇ θ ln ⁡ π ( A ∣ s , θ t ) ∥ 2 q ( S , A ) ] E A ∼ π [ ∥ ∇ θ ln ⁡ π ( A ∣ s , θ t ) ∥ 2 ] b^*(s) = \frac{ \mathbb{E}_{A\sim\pi} [ {\color{blue} \| \nabla_\theta \ln\pi (A|s, \theta_t) \|^2} {\color{red} q(S,A)} ] }{ \mathbb{E}_{A\sim\pi} [ {\color{blue} \| \nabla_\theta \ln\pi (A|s, \theta_t) \|^2} ] } b(s)=EAπ[θlnπ(As,θt)2]EAπ[θlnπ(As,θt)2q(S,A)]
但直接应用此式过于复杂,因此在实际中选择次优baseline,去掉权重项 ∥ ∇ θ ln ⁡ π ( A ∣ s , θ t ) ∥ 2 \| \nabla_\theta \ln\pi (A|s, \theta_t) \|^2 θlnπ(As,θt)2,有: b ( s ) = E A ∼ π [ q ( S , A ) ] = v π ( s ) b(s) = \mathbb{E}_{A\sim\pi} [q(S,A)] = v_\pi(s) b(s)=EAπ[q(S,A)]=vπ(s)
即将 s s s的状态值作为baseline。

在actor(策略更新)中引入状态值作为baseline,即:
θ t + 1 = θ t + α E [ ∇ θ ln ⁡ π ( A ∣ S , θ t ) [ q π ( S , A ) − v π ( S ) ] ] = θ t + α E [ ∇ θ ln ⁡ π ( A ∣ S , θ t ) δ π ( S , A ) ] \begin{aligned} \theta_{t+1} &= \theta_t + \alpha \mathbb{E} \Big[ \nabla_\theta \ln\pi (A|S, \theta_t) [{\color{blue} q_\pi(S, A) - v_\pi (S)}] \Big] \\ &= \theta_t + \alpha \mathbb{E} \Big[ \nabla_\theta \ln\pi (A|S, \theta_t) {\color{blue} \delta_\pi(S, A)} \Big] \end{aligned} θt+1=θt+αE[θlnπ(AS,θt)[qπ(S,A)vπ(S)]]=θt+αE[θlnπ(AS,θt)δπ(S,A)]
其中, δ π ( S , A ) = q π ( S , A ) − v π ( S ) \delta_\pi(S, A) = q_\pi(S, A) - v_\pi (S) δπ(S,A)=qπ(S,A)vπ(S)是优势函数(advantage function),表示当前状态下的特定动作相对于当前策略的优势。对应的随机采样公式为:
θ t + 1 = θ t + α ∇ θ ln ⁡ π ( a t ∣ s t , θ t ) [ q t ( s t , a t ) − v t ( s t ) ] = θ t + α ∇ θ ln ⁡ π ( a t ∣ s t , θ t ) δ t ( s t , a t ) \begin{aligned} \theta_{t+1} &= \theta_t + \alpha \nabla_\theta \ln\pi (a_t|s_t, \theta_t) [ {\color{blue} q_t(s_t, a_t) - v_t(s_t)} ] \\ &= \theta_t + \alpha \nabla_\theta \ln\pi (a_t|s_t, \theta_t) {\color{blue} \delta_t(s_t, a_t)} \end{aligned} θt+1=θt+αθlnπ(atst,θt)[qt(st,at)vt(st)]=θt+αθlnπ(atst,θt)δt(st,at)
进一步地,优势函数可以由TD error近似(推导略),好处是只需要一个神经网络近似 v t v_t vt即可,不需要再近似 q t q_t qt。这就是A2C(也称为TD actor-critic)算法,其优势函数的具体形式为:
δ t = r t + 1 + γ v t ( s t + 1 ) − v t ( s t ) \delta_t = r_{t+1} + \gamma v_{t} (s_{t+1}) - v_t (s_t) δt=rt+1+γvt(st+1)vt(st)
*注:

  • 优势函数在文献中通常记作 A A A
  • 这里的直觉是,动作值的相对值比其绝对值更重要

A2C的完整算法(on-policy):

  • TD error(优势函数): δ t = r t + 1 + γ v t ( s t + 1 ) − v t ( s t ) {\color{darkred} \delta_t} = r_{t+1} + \gamma v_{t} (s_{t+1}) - v_t (s_t) δt=rt+1+γvt(st+1)vt(st)
  • Critic(值更新 / 策略评估): w t + 1 = w t + α w δ t ∇ w v ( s t , w t ) w_{t+1} = w_t + \alpha_w {\color{darkred} \delta_t} {\nabla_w {v}(s_t, w_t)} wt+1=wt+αwδtwv(st,wt)
    • *注意这里与QAC的区别:QAC用的是Sarsa,A2C用的是TD,因此这里用状态值而非动作值
  • Actor(策略更新 / 策略提升): θ t + 1 = θ t + α θ δ t ∇ θ ln ⁡ π ( a t ∣ s t , θ t ) \theta_{t+1} = \theta_t + \alpha_\theta {\color{darkred} \delta_t} \nabla_\theta \ln\pi (a_t|s_t, \theta_t) θt+1=θt+αθδtθlnπ(atst,θt)

Off-policy AC

AC算法本身是on-policy的,但是可以通过重要性采样(Importance Sampling) 将其转为off-policy算法。
*实际上,重要性采样可以应用于任何需要求期望的算法(如MC、TD等)。

🟡重要性采样(Importance Sampling)

重要性采样:基于概率分布 p 1 p_1 p1上对随机变量 X X X的采样,估计概率分布 p 0 p_0 p0 X X X的期望 E [ X ] \mathbb{E}[X] E[X]
*应用场景:难以直接在 p 0 p_0 p0上计算 X X X的期望,但可以很容易在 p 1 p_1 p1上对进行 X X X采样。例如: p 0 p_0 p0是连续分布,或 p 0 p_0 p0的形式未知(如其为神经网络)。

E X ∼ p 0 [ X ] = ∑ x p 0 ( x ) x = ∑ x p 1 ( x ) p 0 ( x ) p 1 ( x ) x ⏟ f ( x ) = E X ∼ p 1 [ f ( X ) ] {\color{red} \mathbb{E}_{X\sim p_0} [X] } = \sum_x p_0(x) x = \sum_x {\color{blue} p_1(x)} \underbrace{\frac{p_0(x)}{\color{blue} p_1(x)} x}_{f(x)} = {\color{red} \mathbb{E}_{X\sim p_1} [f (X)] } EXp0[X]=xp0(x)x=xp1(x)f(x) p1(x)p0(x)x=EXp1[f(X)]
其中, E X ∼ p 1 [ f ( X ) ] \mathbb{E}_{X\sim p_1} [f (X)] EXp1[f(X)]可以由对 f ( X ) f(X) f(X)的采样均值直接估计(大数定律),即:
E X ∼ p 0 [ X ] ≈ f ˉ = 1 n ∑ i = 1 n f ( x i ) = 1 n ∑ i = 1 n p 0 ( x i ) p 1 ( x i ) x i {\color{red} \mathbb{E}_{X\sim p_0} [X] } \approx \bar{f} = \frac{1}{n} \sum_{i=1}^{n} f(x_i) {\color{red} = \frac{1}{n} \sum_{i=1}^{n} {\color{blue} \frac{p_0(x_i)}{p_1(x_i)} } x_i } EXp0[X]fˉ=n1i=1nf(xi)=n1i=1np1(xi)p0(xi)xi
其中, p 0 ( x i ) p 1 ( x i ) \frac{p_0(x_i)}{p_1(x_i)} p1(xi)p0(xi)是重要性权重(importance weight),其大于1表明 x i x_i xi p 0 p_0 p0下被采样的概率更高,小于1表明在 p 1 p_1 p1下被采样的概率更高。

Off-policy PG

由行为策略 β \beta β生成经验采样,目标是最大化下式:
J ( θ ) = ∑ s ∈ S d β ( s ) v π ( s ) = E S ∼ d β [ v π ( S ) ] J(\theta) = \sum_{s \in \mathcal{S}} d_\beta (s) v_\pi (s) = \mathbb{E}_{S \sim d_\beta} [v_\pi (S)] J(θ)=sSdβ(s)vπ(s)=ESdβ[vπ(S)]
其中, d β d_\beta dβ为策略 β \beta β下的平稳分布。(*注意此式与策略梯度中 J ( θ ) J(\theta) J(θ)为平均状态值 v ˉ π \bar{v}_\pi vˉπ时公式的区别)
对应的梯度为:
∇ θ J ( θ ) = E S ∼ ρ , A ∼ β [ π ( A ∣ S , θ ) β ( A ∣ S ) ∇ θ ln ⁡ π ( A ∣ S , θ ) q π ( S , A ) ] \nabla_\theta J(\theta) = \mathbb{E}_{S \sim \rho, A \sim \beta} \Big[ \frac{\pi(A|S, \theta)}{\beta(A|S)} \nabla_\theta \ln \pi (A|S, \theta) q_\pi (S, A) \Big] θJ(θ)=ESρ,Aβ[β(AS)π(AS,θ)θlnπ(AS,θ)qπ(S,A)]
式中 ρ \rho ρ是一个状态分布, π ( A ∣ S , θ ) β ( A ∣ S ) \frac{\pi(A|S, \theta)}{\beta(A|S)} β(AS)π(AS,θ)是重要性权重。注意 A ∼ β A \sim \beta Aβ而非 A ∼ π A \sim \pi Aπ

Off-policy AC

基于前文分析,Off-policy AC的算法为:
θ t + 1 = θ t + α θ π ( a t ∣ s t , θ t ) β ( a t ∣ s t ) ∇ θ ln ⁡ π ( a t ∣ s t , θ t ) [ r t + 1 + γ v t ( s t + 1 ) − v t ( s t ) ] = θ t + α θ π ( a t ∣ s t , θ t ) β ( a t ∣ s t ) ∇ θ ln ⁡ π ( a t ∣ s t , θ t ) δ t ( s t , a t ) \begin{aligned} \theta_{t+1} &= \theta_t + \alpha_\theta \frac{\pi(a_t|s_t, \theta_t)}{\beta(a_t|s_t)} \nabla_\theta \ln\pi (a_t|s_t, \theta_t) [ {r_{t+1} + \gamma v_{t} (s_{t+1}) - v_t (s_t)} ] \\ &= \theta_t + \alpha_\theta \frac{\pi(a_t|s_t, \theta_t)}{\beta(a_t|s_t)} \nabla_\theta \ln\pi (a_t|s_t, \theta_t) {\delta_t(s_t, a_t)} \end{aligned} θt+1=θt+αθβ(atst)π(atst,θt)θlnπ(atst,θt)[rt+1+γvt(st+1)vt(st)]=θt+αθβ(atst)π(atst,θt)θlnπ(atst,θt)δt(st,at)

算法步骤及伪代码类似于A2C,主要是多了重要性权重 π ( a t ∣ s t , θ t ) β ( a t ∣ s t ) \frac{\pi(a_t|s_t, \theta_t)}{\beta(a_t|s_t)} β(atst)π(atst,θt)

🟦DPG (Deterministic AC)

先前的PG及AC算法均为随机性(stochastic)策略,实际上也存在确定性(deterministic)策略的AC算法,即DPG(Deterministic Policy Gradient)。
确定性策略相对于随机性策略的优势:随机性策略只能处理有限个动作的情况(比如,神经网络的输出是有限的),而确定性策略可以处理连续的动作空间。

确定性策略记作: a = μ ( s , θ ) a = \mu (s, \theta) a=μ(s,θ),也可以简记为 μ ( s ) \mu (s) μ(s)
μ \mu μ是从状态空间 S \mathcal{S} S到动作空间 A \mathcal{A} A的映射,可以由神经网络表示。

DPG为off-policy方法(动作不依赖于具体策略),其梯度计算如下:
∇ θ J ( θ ) = ∑ s ∈ S ρ μ ( s ) ∇ θ μ ( s ) ( ∇ a q μ ( s , a ) ) ∣ a = μ ( s ) = E S ∼ ρ μ [ ∇ θ μ ( s ) ( ∇ a q μ ( s , a ) ) ∣ a = μ ( s ) ] \begin{aligned} \nabla_\theta J (\theta) &= \sum_{s \in \mathcal{S}} \rho_\mu (s) \nabla_\theta \mu(s) (\nabla_a q_\mu (s, a)) |_{a = \mu (s)} \\ & = \mathbb{E}_{S \sim \rho_\mu} [\nabla_\theta \mu(s) (\nabla_a q_\mu (s, a)) |_{a = \mu (s)}] \end{aligned} θJ(θ)=sSρμ(s)θμ(s)(aqμ(s,a))a=μ(s)=ESρμ[θμ(s)(aqμ(s,a))a=μ(s)]
其中, ρ μ \rho_\mu ρμ是一个状态分布。 ( ∇ a q μ ( s , a ) ) ∣ a = μ ( s ) (\nabla_a q_\mu (s, a)) |_{a = \mu (s)} (aqμ(s,a))a=μ(s)表示先对 q μ ( s , a ) q_\mu(s,a) qμ(s,a)求关于 a a a的梯度,再将其中 a a a的替换为 μ ( s ) \mu(s) μ(s)
对应的随机梯度上升算法为:
θ t + 1 = θ t + α θ ∇ θ μ ( s t ) ( ∇ a q μ ( s t , a ) ) ∣ a = μ ( s ) \theta_{t+1} = \theta_t + \alpha_\theta \nabla_\theta \mu(s_t) (\nabla_a q_\mu (s_t, a)) |_{a=\mu(s)} θt+1=θt+αθθμ(st)(aqμ(st,a))a=μ(s)

DPG算法步骤(伪代码):
初始化:行为策略 β ( a ∣ s ) \beta (a|s) β(as);确定性目标策略 μ ( s , θ 0 ) \mu(s, \theta_0) μ(s,θ0),其中 θ 0 \theta_0 θ0为初始参数向量;值函数 v ( s , w 0 ) v(s, w_0) v(s,w0),其中 w 0 w_0 w0为初始参数向量。(* β \beta β也可以被替换为 μ \mu μ+噪音)

目标:最大化 J ( θ ) J(\theta) J(θ)
步骤:在每个episode的第 t t t个时间步中,遵循行为策略 β \beta β产生动作 a t a_t at并获得 r t + 1 r_{t+1} rt+1 s t + 1 s_{t+1} st+1

  • TD error(优势函数): δ t = r t + 1 + γ q ( s t + 1 , μ ( s t + 1 , θ t ) , w t ) − q ( s t , a t , w t ) {\color{darkred} \delta_t} = r_{t+1} + \gamma q(s_{t+1}, \mu(s_{t+1}, \theta_t), w_t) - q(s_t, a_t, w_t) δt=rt+1+γq(st+1,μ(st+1,θt),wt)q(st,at,wt)
  • Critic(值更新 / 策略评估): w t + 1 = w t + α w δ t ∇ w q ( s t , a t , w t ) w_{t+1} = w_t + \alpha_w {\color{darkred} \delta_t} \nabla_w q(s_t, a_t, w_t) wt+1=wt+αwδtwq(st,at,wt),即TD+值函数估计
  • Actor(策略更新 / 策略提升): θ t + 1 = θ t + α θ ∇ θ μ ( s t , θ t ) ( ∇ a q ( s t , a , w t + 1 ) ) ∣ a = μ ( s t ) \theta_{t+1} = \theta_t + \alpha_\theta \nabla_\theta \mu(s_t, \theta_t) (\nabla_a q (s_t, a, w_{t+1})) |_{a=\mu(s_t)} θt+1=θt+αθθμ(st,θt)(aq(st,a,wt+1))a=μ(st)

注意到DPG中包含了 q ( s , a , w ) q(s,a,w) q(s,a,w),其可以由两种方式确定:

  • 线性函数: q ( s , a , w ) = ϕ T ( s , a ) w q(s,a,w) = \phi^T (s,a) w q(s,a,w)=ϕT(s,a)w,其中 ϕ ( s , a ) \phi(s,a) ϕ(s,a)是特征向量。这是DPG原论文中采用的方法,缺陷在于特征向量的选择比较困难,且线性函数的拟合能力有限
  • 神经网络:即后续的DDPG(Deep deterministic policy gradient)方法

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

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

相关文章

【自控实验】1. 线性系统串联超前校正实验

本科课程实验报告,有太多公式和图片了,干脆直接转成图片了 仅分享和记录,不保证全对 串联超前校正实验:频域设计计算(校正装置),时域观察验证(校正结果) 使用matlab中的simulink进行仿真

String有没有最大长度限制?

大家都用过String字符串,有的人可能还不知道它的长度在某些方面是有一些限制。 public String(byte bytes[], int offset, int length);这是java.lang.String中的一个构造函数,可以看到它的长度是int类型,int的最大取值是2^31-1.但是我们却不…

python股票分析挖掘预测技术指标知识跳空缺口指标详解(5)

本人股市多年的老韭菜,各种股票分析书籍,技术指标书籍阅历无数,萌发想法,何不自己开发个股票预测分析软件,选择python因为够强大,它提供了很多高效便捷的数据分析工具包。 我们已经初步的接触与学习其中数…

Next.js 学习笔记(五)——渲染

渲染 渲染将你编写的代码转换到用户界面。React 和 Next.js 允许你创建混合 web 应用程序,其中部分代码可以在服务器或客户端上呈现。本节将帮助你了解这些渲染环境、策略和运行时之间的差异。 基本知识 首先,下列对熟悉三个基本的网络概念是有帮助的…

哈希-力扣454.四数相加Ⅱ

题目 给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a; 0 < i, j, k, l < nnums1[i] nums2[j] nums3[k] nums4[l] 0 示例 1&#xff1a; 输入&#xff1a;nums1 [1…

UI功能6大流程、接口测试8大流程这些你真的全会了吗?

在讲接口流程测试之前&#xff0c;首先需要给大家申明下&#xff1a;接口测试对于测试人员而言&#xff0c;非常非常重要&#xff0c;懂功能测试接口测试&#xff0c;就能在企业中拿到一份非常不错的薪资。 这么重要的接口测试&#xff0c;一般也是面试笔试必问。为方便大家更…

Java并发之互斥一:管程

1、简单聊聊什么是管程模型 &#xff08;共享资源&#xff09;&#xff1a;定义一个共享变量&#xff0c;可以理解锁&#xff0c;令牌这类的东西&#xff08;互斥访问共享资源&#xff09;&#xff1a;获取这个锁、令牌的时候是排好队的&#xff0c;只允许单线程访问&#xff…

LeetCode刷题---最小栈

解题思路&#xff1a; 该题通过辅助栈的方式来解决 定义数据栈(用于实现正常操作流程)和辅助栈(用于获取最小元素)。 push:首先将数据push进数据栈中&#xff0c;此时再判断辅助栈是否为空或者当前数据是否小于辅助栈中的最小元素(栈顶元素)&#xff0c;如果条件成立&#xff0…

什么是广告联盟?国内哪些广告联盟?广告联盟如何赚取收益?

开发者想要对接广告联盟获得广告变现收益&#xff0c;就要了解广告联盟的优势&#xff0c;以及广告联盟是如何获取收益的。 一、什么是广告联盟&#xff1f; 广告联盟是一种在线广告服务模式&#xff0c;将广告主和流量主联系在一起。通过广告联盟平台的技术服务&#xff0c;…

用友U8流程审批效率-SQLServer+SSRS

文章目录 @[TOC]1、 需求及效果1.1 需求1.2 效果2、 思路及SQL语句3、实现折叠明细表4、结语1、 需求及效果 1.1 需求 想要查看U8的审批流程,查看流程在哪个节点或人停留的时间,这个单据整个流程走下来需要的时间。可以更加直观方便的查看审批效率 1.2 效果 采用了SSRS上…

NLP论文阅读记录 - wos | 01 使用深度学习对资源匮乏的语言进行抽象文本摘要

文章目录 前言0、论文摘要一、Introduction1.1目标问题1.2相关的尝试1.3本文贡献 二.相关工作三.本文方法四 实验效果4.1数据集4.2 对比模型4.3实施细节4.4评估指标4.5 实验结果4.6 细粒度分析 五 总结思考 前言 Abstractive text summarization of lowresourced languages usi…

企业级进销存管理系统

框架&#xff1a; 进销存管理系统&#xff0c;采用SpringBootShiroMyBatisEasyUI 项目采用Maven构建&#xff0c;数据库文件存放在 sql/jxc.sql 截图 运行项目部分截图&#xff0c; 登录界面&#xff0c;用户名admin&#xff0c;密码admin123 当前库存查询&#xff0c; 进…

C/C++ 堆排序

个人主页&#xff1a;仍有未知等待探索-CSDN博客 专题分栏&#xff1a;数据结构_仍有未知等待探索的博客-CSDN博客 欢迎大家来指教&#xff01; 一、前言 今天要介绍的是堆排序。 首先什么是堆&#xff1f;简而言之&#xff0c;堆就是二叉树的数组形式&#xff0c;用数组来存…

c++最值查找

目录 min和max函数 min_element和max_element 例 nth_element函数 例 例题 题目描述 输入描述 输出描述 解 min和max函数 只能传入两个值或一个列表 时间复杂度为O(1),数组O(n)&#xff0c;n为元素个数 min_element和max_element min_element(st,ed)返回地址[st,…

企业泛域名SSL证书

SSL数字证书是一种电子证书&#xff0c;它由CA认证机构颁发&#xff0c;提供了加密连接和身份验证的功能。SSL数字证书广泛应用于各种在线服务&#xff0c;如网页浏览、电子邮件、在线银行等。它能够提供安全的连接&#xff0c;保护用户的个人信息和交易数据不被窃取或篡改。企…

如果你还忍受校园网,那么一定要看它!随身WiFi哪个品牌最靠谱 ?高人气随身WiFi第一名

很多学生党反映校园网价格太贵&#xff0c;贵就算了&#xff0c;还非常不好用&#xff0c;真的很泪崩。 对于学生党来说&#xff0c;一个性价比极高的随身WiFi才是正正好。 但是很多学生党对随身WiFi并不了解&#xff0c;那么下面我就回答几个学生党最关心的问题。一、价格合…

JVM类加载器打破双亲委派机制

欢迎大家关注我的微信公众号&#xff1a; 传送门&#xff1a;从JDK源码级别剖析JVM类加载器 目录 打破双亲委派机制 Tomcat打破双亲委派机制 Tomcat自定义加载器详解 模拟实现Tomcat打破双亲委派 上一篇文章讲到了jvm类加载器的双亲委派机制&#xff0c;本文就来讲…

探索 hasOwnProperty:处理对象属性的关键(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

IntelliJ IDEA Java 连接 mysql 配置(附完整 demo)

下载 MySQL 驱动 从MySQL官网下载JDBC驱动的步骤如下&#xff1a; 1&#xff09;访问MySQL的官方网站&#xff1a;MySQL 2&#xff09;点击页面上方的"DOWNLOADS"菜单&#xff1b; 3&#xff09;在下载页面&#xff0c;找到"MySQL Community (GPL) Downloads…