机器学习 | 强化学习(6) | 策略梯度方法(Policy Gradient Method)
6-策略梯度方法(Policy Gradient Method)
策略梯度概论(Introduction)
基于策略(Policy-Based) 的强化学习
对于上一节课(价值函数拟合)中采用参数\(\theta\)来估计价值和动作-价值函数
\[\begin{align}
V_\theta(S) & \approx V^\pi(s) \\
Q_\theta(s,a) & \approx Q^\pi(s,a)
\end{align}
\]一个策略可以直接由价值函数生成
- 例如说基于\(\epsilon\)-贪婪策略
本节课我们直接对策略进行参数化
\[\pi_\theta(s,a)=\mathbb{P}[a|s,\theta]
\]我们本节课再次聚焦于无模型的强化学习
基于价值(Value-Based)和基于策略的强化学习
基于价值
- 学习价值函数
- 显式的策略(例如\(\epsilon\)-贪婪策略)
基于策略
- 没有价值函数
- 学习策略
AC算法(Actor-Critic)
- 学习价值函数
- 学习策略
*因此AC算法属于既基于价值也基于策略的算法
基于策略强化学习的优点
优点:
- 更好的收敛性(更新更稳定,更平滑)
- 在高维或者连续的动作空间更为高效
- 可以基于随机策略进行学习
缺点:
- 典型地只能收敛于局部最优解而非全局最优解
- 当评价一个策略的时候也是相当典型地低效(因为梯度下降是一个慢速的稳定过程)与高方差
策略随机性的思考
- 如果一个模型拥有的绝对确定的策略(假若这些动作价值基本一致),那么在遭遇相同情况下作出一致的动作会导致长期困在某一个状态下(例如在一个能见度有限的迷宫中行走,基本都是一样的房间,那么确定性策略反而无法到达终点)
策略目标函数(Policy Objective Functions)
目标:给定一个策略\(\pi_\theta(s,a)\)基于参数\(\theta\),然后寻找最优的参数\(\theta\)
但是如何去评估策略\(\pi_\theta\)的质量
对于一个序列化的环境,我们可以基于开始值
\[J_1(\theta) = V^{\pi_\theta}(s_1)=\mathbb{E_{\pi_\theta}}[v_1]
\]对于连续的环境,那么就用平均值
\[J_{avV}(\theta)=\sum_s d^{\pi_\theta}(s)V^{\pi_\theta}
\]或者每一个时间戳的平均回报
\[J_{avR}(\theta)=\sum_sd^{\pi_\theta}(s),\sum_a\pi_{\theta}(s,a)\mathcal{R^a_s}
\]其中\(d^{\pi_\theta}(s)\)是基于策略\(\pi_\theta\)的马尔科夫链的一个静态分布
策略最优化
- 基于强化学习的策略属于优化问题
- 寻找\(\theta\)足以最大化\(J(\theta)\)
- 一些非基于梯度的优化方法
- 爬山法(Hill Climbing)
- SImplex法/amoeba法/Nelder Mead法
- 遗传算法(Genetic Algorithm)
- 基于梯度的优化方法往往更高效
- 梯度下降法(Gradient descent)
- 共轭梯度法(Conjugate gradient)
- Quasi-Newton法
- 我们主要研究梯度下降法,因为其有很多拓展形式
- 以及必须基于矩阵结构的方法
有限微分梯度策略(Finite Difference Policy Gradient)
梯度策略(Policy Gradient)
使\(J(\theta)\)为任意一个策略目标函数
策略梯度算法通过策略的梯度下降在\(J(\theta)\)中寻找一个局部最优解,策略的梯度即:
\[\Delta \theta = \alpha \nabla_\theta J(\theta)
\]其中\(\nabla_\theta J(\theta)\)就被称为策略梯度
\[\nabla_\theta J(\theta)=
\left(\begin{array}{c}
\frac{\partial J(\theta)}{\partial \theta_1} \\
\vdots\\
\frac{\partial J(\theta)}{\partial \theta_n}
\end{array}\right)
\]其中\(\alpha\)即是步长参数
通过有限微分去计算梯度
评估\(\pi_\theta(s,a)\)的策略梯度
对于每一维度\(k\in[1.n]\)
估算目标函数的第k个偏导数
也就是:用一个小的数值\(\epsilon\)去变动第k维的\(\theta\)
\[\frac{\partial J(\theta)}{\partial \theta_k}\approx \frac{J(\theta+\epsilon u_k)-J(\theta)}{\epsilon}
\]其中\(u_k\)是只有第k维为1,其他维度为0的单位向量
利用n次评估来计算第n维度的策略梯度
简单,高噪音,并不是每次都高效
任意策略都适用,即使不可导
蒙特卡罗策略梯度(Monte-Carlo Policy Gradient)
似然率(Likelihood Ratios)
分数函数(Score Function)
我们现在基于微积分去计算策略梯度
假设策略\(\pi_\theta\)是一个可微分的且无论何时都是非零的
以及我们知道其梯度\(\nabla_\theta\pi_\theta(s,a)\)
似然率即是以下公式:
\[\begin{align}
\nabla_\theta\pi_\theta(s,a) & = \pi_\theta(s,a)\frac{\nabla_\theta\pi_\theta(s,a)}{\pi_\theta(s,a)} \\
& = \pi_\theta(s,a)\nabla_\theta\log\pi_\theta(s,a)
\end{align}
\]那么分数函数即是\(\nabla_\theta\log\pi_\theta(s,a)\)
Softmax策略(Softmax Policy)
通过特征的线性组合\(\phi(s,a)^T\theta\)去为动作赋予权重
动作的概率将与指数化的权重成正比例
\[\pi_\theta(s,a)\propto e^{\phi(s,a)^T\theta}
\]因此分数函数即是
\[\nabla_\theta\log\pi_\theta(s,a) = \phi(s,a)-\mathbb{E_{\pi_\theta}}[\phi(s,\cdot)]
\]
高斯策略(Gaussian Policy)
对于连续动作空间,高斯策略相对比较自然
均值是状态特征的线性组合\(\mu(s)=\phi(s)^T\theta\)
方差可以是固定的\(\sigma^2\),也可以是一个参数化的形式
策略则是一个高斯分布,\(a\sim\mathcal{N}(\mu(s),\sigma^2)\)
那么其分数函数即是
\[\nabla_\theta\log\pi_\theta(s,a)=\frac{(a-\mu(s))\phi(s)}{\sigma^2}
\]
一步马尔科夫决策过程(One-Step MDPs)
定义一种简单的一步马尔科夫决策过程
- 从状态\(s\sim d(s)\)开始
- 一步之后就状态终结,并且回报\(r=\mathcal{R_{s,a}}\)
通过似然率去计算策略梯度
\[\begin{align}
J(\theta) & = \mathbb{E_{\pi_\theta}}[r] \\
& = \sum_{s\in S}d(s)\sum_{a\in A}\pi_\theta(s,a)\mathcal{R_{s,a}} \\
\nabla_\theta J(\theta) & = \sum_{s\in S}d(s)\sum_{a\in A}\pi_\theta(s,a)\nabla_\theta\log\pi_\theta(s,a)\mathcal{R_{s,a}} \\
& = \mathbb{E_{\pi_\theta}}[\nabla_\theta\log\pi_\theta(s,a)r]
\end{align}
\]
策略梯度理论(Policy Gradient Theorem)
- 策略梯度理论通过生成一个似然率去拟合一个多步马尔科夫决策过程(multi-step MDPs)
- 用长期价值\(Q^\pi(s,a)\)去替代瞬时回报\(r\)
- 策略梯度主要应用于开始状态目标,平均回报以及平均价值目标
原理:
对于任意可导的策略\(\pi_\theta(s,a)\)
对于任意策略目标函数\(J=J_1,J_{avR}\)亦或是\(\frac{1}{1-\gamma}J_{avV}\)
那么策略梯度为:
\[\nabla_\theta J(\theta)=\color{red}{\mathbb{E_{\pi_\theta}}[\nabla_\theta\log\pi_\theta(s,a)\ Q^{\pi_\theta}(s,a)]}
\]
蒙特卡罗策略梯度(REINFORCE算法)
效率较低,迭代代数较大
通过随机梯度下降去更新参数
基于梯度策略理论
使用一个返回回报\(v_t\)作为\(Q^{\pi_\theta}(s_t,a_t)\)的无偏取样
\[\Delta\theta_t = \alpha\nabla_\theta\log\pi_\theta(s_t,a_t)v_t
\]
function REINFORCE
随机初始化\(\theta\)
for 对于每一个序列 \(\{s_1,a_1,r_2,\dots,s_{T-1},a_{T-1},r_T\}\sim\pi_\theta\) do
for \(t=1\) to \(T-1\) do
\(\theta\leftarrow\theta+\alpha\nabla_{\theta}\log\pi_{\pi}(s_t, a_t)v_t\)
end for
end for
return \(\theta\)
end function
Actor-Critic策略梯度
基于Critic算法以减少方差
蒙特卡罗策略梯度法具有较高的方差
我们将采用critic算法以估计动作-价值函数
\[Q_w(s,a) \approx Q^{\pi_\theta(s,a)}
\]对于Actor-critic算法(也称AC算法)一般带有两组参数
- Critic 更新动作-价值函数的参数\(w\)
- Actor 间接基于critic,更新策略参数\(\theta\)
对于AC算法基于一个策略梯度的估计
\[\begin{align}
\nabla_\theta J(\theta)&\approx\mathbb{E_{\pi_\theta}}[\nabla_\theta\log\pi_\theta(s,a) \ Q_w(s,a)] \\
\Delta\theta & =\alpha\nabla_\theta\log\pi_\theta(s,a)\ Q_w(s,a)
\end{align}
\]
AC算法中的critic指的是不进行任何决策,而只是对行为进行评价,而actor间接基于critic进行决策
估计动作-价值函数
- Critic算法解决着一个熟悉的问题:即策略评估
- 在目前策略参数\(\theta\)下的策略\(\pi_\theta\)有多好?
- 该问题在前两节课已经探讨过了,如:
- 蒙特卡罗策略评估
- 时序差分学习
- \(TD(\lambda)\)
- 当然同样也可以用最小二乘策略评估
动作-价值 Actor-Critic
- 对于一个简单的actor-critic算法乃是基于动作-价值critic
- 通过线性函数进行拟合:\(Q_w(s,a)=\phi(s,a)^Tw\)
- Critic 通过线性\(TD(0)\)去更新\(w\)
- Actor 通过策略梯度去更新\(\theta\)
function QAC
初始化 s,\(\theta\)
取样 \(a\sim\pi_\theta\)
for 每一步 do
取样回报\(r=\mathcal{R^a_s}\),取样转移状态\(s'\sim\mathcal{P^a_s}\)
取样动作\(a'\sim\pi_\theta(s',a')\)
\(\delta = r + \gamma Q_w(s',a')-Q_w(s,a)\)
\(\theta=\theta+\alpha\nabla_\theta\log\pi_\theta(s,a)Q_w(s,a)\)
\(w\leftarrow w+\beta\delta\phi(s,a)\)
\(a\leftarrow a'\),\(s\leftarrow s'\)
end for
end function
兼容函数拟合(Compatible Function Approximation)
- 试图·去估计一个策略梯度比如会产生爬偏差
- 对于一个偏差策略梯度有时候并不能找到合适的算法
- 比如说:如果\(Q_w(s,a)\)的特征是有所失真的话,在矩阵方格模型中会难以奏效
- 不过幸运的是,如果我们能小心翼翼地选择价值函数进行拟合
- 并且避免产生一切偏差
- 即我们始终没有偏离一个精确的策略梯度
兼容函数拟合定义:
如果满足以下两个条件:
价值函数拟合对于策略是兼容的
\[\nabla_wQ_w(s,a) = \nabla_\theta\log\pi_\theta(s,a)
\]价值函数的\(w\)能够最小化均方差(MSE)
\[\epsilon = \mathbb{E_{\pi_\theta}}[(Q^{\pi_\theta}(s,a)-Q_w(s,a))^2]
\]
那么其策略梯度是精确的
\]
兼容函数定理的证明
若\(w\)是被选中用于最小化均方差(MSE),即\(\epsilon\)的梯度,也就是\(w\)要为0
\[\begin{align}
\nabla_w \epsilon & = 0 \\
\mathbb{E_{\pi_\theta}}[(Q^\theta(s,a)-Q_w(s,a))\nabla_wQ_w(s,a)] & = 0 \\
\mathbb{E_{\pi_\theta}}[(Q^\theta(s,a)-Q_w(s,a))\nabla_\theta\log\pi_\theta(s,a)] & = 0 \\
\mathbb{E_{\pi_\theta}}[Q^\theta(s,a)\nabla_\theta\log\pi_\theta(s,a)] & = \mathbb{E_{\pi_\theta}}[Q_w(s,a)\nabla_\theta\log\pi_\theta(s,a)]
\end{align}
\]为此\(Q_w(s,a)\)可以直接代替策略梯度
\[\nabla_\theta J(\theta) = \mathbb{E_{\pi_\theta}}[\nabla_\theta\log\pi_\theta(s,a)\ Q_w(s,a)]
\]
改进Critic函数
通过Baseline去降低方差
我们从策略梯度中减去一个baseline函数
这样就可以在降低方差的同时又不改变期望
\[\begin{align}
\mathbb{E_{\pi_\theta}}[\nabla_\theta\log\pi_\theta(s,a)B(s)] &=\sum_{s\in S}d^{\pi_\theta}(s)\sum_a\nabla_\theta\pi_\theta(s,a)B(s) \\
& = \sum_{s\in S}d^{\pi_\theta}(s)B(s)\nabla_\theta\sum_{a\in A}\pi_\theta(s,a)\\
& = 0
\end{align}
\]对于一个性质良好的baseline则是一个状态-价值函数\(B(s)=V^{\pi_\theta}(s)\)
为此我们可以通过优势函数\(A^{\pi_\theta}(s,a)\)重写策略梯度
\[A^{\pi_\theta}(s,a) = Q^{\pi_\theta}(s,a)-V^{\pi_\theta}(s) \\
\nabla_\theta J(\theta)=\color{red}{\mathbb{E_{\pi_\theta}}[\nabla_\theta\log\pi_\theta(s,a)\ A^{\pi_\theta}(s,a)]}
\]
估计优势函数(1)
优势函数可以显著地降低策略梯度的方差
因此critic应该能够较好地估计优势函数
例如说:采用两个近似函数和参数向量
去同时拟合\(V^{\pi_\theta}(s)\)以及\(Q^{\pi_\theta(s,a)}\)
\[\begin{align}
V_v(s) & \approx V^{\pi_\theta}(s) \\
Q_w(s,a) & \approx Q^{\pi_\theta}(s, a) \\
A(s,a) & \approx Q_w(s,a) - V_v(s)
\end{align}
\]然后再通过例如时序差分的方式对两个价值函数进行更新。
估计优势函数(2)
对于真正的价值函数\(V^{\pi_\theta}(s)\),其时序差分误差\(\delta^{\pi_\theta}\)如下:
\[\delta^{\pi_\theta}=r+\gamma V^{\pi_\theta}(s')-V^{\pi_\theta}(s)
\]因此就是一个优势函数的无偏估计
\[\begin{align}
\mathbb{E_{\pi_\theta}}[\delta^{\pi_\theta}|s,a]& =\mathbb{E_{\pi_\theta}}[r+\gamma V^{\pi_\theta}(s')(s)|s,a]-V^{\pi_\theta}(s) \\
& = Q^{\pi_\theta}(s,a)-V^{\pi_\theta}(s) \\
& = A^{\pi_\theta}(s,a)
\end{align}
\]为此我们可以通过时序差分误差去计算梯度策略
\[\nabla_\theta J(\theta) = \color{red}{}\mathbb{E_{\pi_\theta}}[\nabla_\theta\log\pi_\theta(s,a)\ \delta^{\pi_\theta}]
\]在实践中我们一般采用一个近似的时序差分误差
\[\delta_V = r+\gamma V_V(s')-V_V(s)
\]采取这种方法的话,就只需要一组critic的参数v了
有效性追踪(Eligibility Tracse)
不同时间尺度的Critics(Critics at Different Time-Scales)
Critic是可以通过多个时间尺度不同的目标中拟合目标函数\(V_\theta(s)\)
对于蒙特卡罗。那么目标则是返回回报\(v_t\)
\[\Delta\theta= \alpha(\color{red}{v_t}-V_\theta(s))\phi(s)
\]对于\(TD(0)\),目标则是TD目标\(r + \gamma V(s')\)
\[\Delta\theta=\alpha(\color{red}{r+\gamma V(s')}-V_\theta(s))\phi(s)
\]对于前向\(TD(\lambda)\),目标则为\(\lambda\)-返回回报\(v^\lambda_t\)
\[\Delta\theta = \alpha(\color{red}{v_t^\lambda} - V_\theta(s))\phi(s)
\]对于后向\(TD(\lambda)\),我们则采用有效性追踪(Eligibility Traces)
\[\begin{align}
\delta_t & = r_{t+1}+\gamma V(s_{t+1}) - V(s_t) \\
e_t & = \gamma\lambda e_{t-1} + \phi(s_t) \\
\Delta\theta & = \alpha\delta_t e_t
\end{align}
\]
不同时间尺度的Actors
对于策略梯度同样也可以通过多个不同时间尺度进行估计
\[\nabla_\theta J(\theta) = \mathbb{E_{\pi_\theta}}[\nabla_\theta\log \pi_\theta(s,a)\ \color{red}{A^{\pi_\theta}(s,a)}]
\]而蒙特卡罗策略梯度则是利用了整个完整返回回报的误差
\]
- Actor-Critic梯度策略则是采用一步时序差分误差
\[\Delta\theta = \alpha(\color{red}{r + \gamma V_V(s_{t+1})}-V_V(s_t))\nabla_\theta\log\pi_\theta(s_t,a_t)
\]
带有效性追踪的策略梯度
正如前向\(TD(\lambda)\),我们可以对读个时间尺度进行混合
\[\Delta\theta = \alpha(\color{red}{v^\lambda_t} - V_V(s_t))\nabla_\theta\log\pi_\theta(s_t,a_t)
\]其中\(v^\lambda_t - V_V(s_t)\)是优势函数的有偏估计
正如后向\(TD(\lambda)\),我们同样可以采用有效性追踪
通过等价于\(TD(\lambda)\),我们使得\(\phi(s) = \nabla_\theta\log\pi_\theta(s,a)\)
\[\begin{align}
\delta & = r_{t+1} + \gamma V-V(s_{t+1})-V_V(s_t) \\
e_{t + 1} & = \lambda e_t + \nabla_\theta\log \pi_\theta(s,a) \\
\Delta\theta & = \alpha\delta e_t
\end{align}
\]这样的更新方法直接就能应用在基于策略的非完整序列中了
自然策略梯度(Natural Policy Gradient)
更多选择的策略梯度方向
- 梯度上升算法足以跟随一切上升方向
- 好的上升方向可以带来显著的收敛性
- 同样地,一个策略在不改变动作概率的同时进行参数重设
- 例如说,对于softmax策略中所有动作的分数都进行提升
- 其中vanilla梯度法对参数重设相当敏感
自然策略梯度(Natural Policy Gradient)
对于自然策略梯度是参数化独立的
当通过一个小而合适数量进行策略更新,它会找到一个比较接近于vanilla梯度的上升方向
\[\nabla_\theta^{nat}\pi_\theta(s,a) = G^{-1}_\theta\nabla_\theta\pi_\theta(s,a)
\]其中\(G_\theta\)是一个费舍尔信息矩阵(Fisher information matrix)
\]
自然Actor-Critic算法
基于兼容函数近似
\[\nabla_wA_w(s,a)=\nabla_\theta\log\pi_\theta(s,a)
\]因此自然策略梯度简化为:
\[\begin{align}
\nabla_\theta J(\theta) & = \mathbb{E_{\pi_\theta}}[\nabla_\theta\log\pi_\theta(s,a)A^{\pi_\theta}(s,a)] \\
& = \mathbb{E_{\pi_\theta}}[\nabla_\theta\log\pi_\theta(s,a)\nabla_\theta\log\pi_\theta(s,a)^Tw] \\
& = G_\theta w \\
\color{red}{\nabla_\theta^{nat}J(\theta)}& \ \color{red}{=w}\end{align}
\]即:通过直接的critic参数去更新actor参数
对于所有策略梯度算法的总结
\nabla_\theta J(\theta) & = \mathbb{E_{\pi_\theta}}[\nabla_\theta\log\pi_\theta(s,a)\color{red}{v_t}]
& \text{REINFORCE}
\\
& = \mathbb{E_{\pi_\theta}}[\nabla_\theta\log\pi_\theta(s,a)\color{red}{Q^w(s,a)}]
& \text{Q Actor-Critic}
\\
& = \mathbb{E_{\pi_\theta}}[\nabla_\theta\log\pi_\theta(s,a)\color{red}{A^w(s,a)}]
& \text{Advantage Actor-Critic}
\\
& = \mathbb{E_{\pi_\theta}}[\nabla_\theta\log\pi_\theta(s,a)\color{red}{\delta}]
& \text{TD Actor-Critic}
\\
& = \mathbb{E_{\pi_\theta}}[\nabla_\theta\log\pi_\theta(s,a)\color{red}{\delta e}]
& \text{TD(}\lambda)\text{ Actor-Critic}
\\
G_\theta^{-1}\nabla_\theta J(\theta) &= w
& \text{Natural Actor-Critic}
\end{align}
\]
所有算法都基于随机梯度下降
Critic则是采用典型的策略评估(例如蒙特卡罗或者时序差分)来估算\(Q^\pi(s,a)\),\(A^\pi(s,a)\)或者\(V^\pi(s)\)
机器学习 | 强化学习(6) | 策略梯度方法(Policy Gradient Method)的更多相关文章
- 强化学习读书笔记 - 13 - 策略梯度方法(Policy Gradient Methods)
强化学习读书笔记 - 13 - 策略梯度方法(Policy Gradient Methods) 学习笔记: Reinforcement Learning: An Introduction, Richa ...
- 强化学习(十三) 策略梯度(Policy Gradient)
在前面讲到的DQN系列强化学习算法中,我们主要对价值函数进行了近似表示,基于价值来学习.这种Value Based强化学习方法在很多领域都得到比较好的应用,但是Value Based强化学习方法也有很 ...
- 深度学习课程笔记(十三)深度强化学习 --- 策略梯度方法(Policy Gradient Methods)
深度学习课程笔记(十三)深度强化学习 --- 策略梯度方法(Policy Gradient Methods) 2018-07-17 16:50:12 Reference:https://www.you ...
- DRL之:策略梯度方法 (Policy Gradient Methods)
DRL 教材 Chpater 11 --- 策略梯度方法(Policy Gradient Methods) 前面介绍了很多关于 state or state-action pairs 方面的知识,为了 ...
- 机器学习进阶-图像形态学操作-梯度运算 cv2.GRADIENT(梯度运算-膨胀图像-腐蚀后的图像)
1.op = cv2.GRADIENT 用于梯度运算-膨胀图像-腐蚀后的图像 梯度运算:表示的是将膨胀以后的图像 - 腐蚀后的图像,获得了最终的边缘轮廓 代码: 第一步:读取pie图片 第二步:进行腐 ...
- Ⅶ. Policy Gradient Methods
Dictum: Life is just a series of trying to make up your mind. -- T. Fuller 不同于近似价值函数并以此计算确定性的策略的基于价 ...
- 强化学习(十六) 深度确定性策略梯度(DDPG)
在强化学习(十五) A3C中,我们讨论了使用多线程的方法来解决Actor-Critic难收敛的问题,今天我们不使用多线程,而是使用和DDQN类似的方法:即经验回放和双网络的方法来改进Actor-Cri ...
- 强化学习(十四) Actor-Critic
在强化学习(十三) 策略梯度(Policy Gradient)中,我们讲到了基于策略(Policy Based)的强化学习方法的基本思路,并讨论了蒙特卡罗策略梯度reinforce算法.但是由于该算法 ...
- 【转载】 “强化学习之父”萨顿:预测学习马上要火,AI将帮我们理解人类意识
原文地址: https://yq.aliyun.com/articles/400366 本文来自AI新媒体量子位(QbitAI) ------------------------------- ...
- 强化学习之三:双臂赌博机(Two-armed Bandit)
本文是对Arthur Juliani在Medium平台发布的强化学习系列教程的个人中文翻译,该翻译是基于个人分享知识的目的进行的,欢迎交流!(This article is my personal t ...
随机推荐
- 中电金信鲸视:以AI视觉技术为复杂行业场景装上“火眼金睛”
作为人工智能和计算机视觉的交叉领域,智能视觉通过仿生人类视觉机能,对不同形式的视觉输入进行处理.理解和决策.现今,智能视觉已成为应用广泛.市场覆盖大.形式多样的产业方向,得到了国家政策的大力支持. ...
- StreamJsonRpc.ConnectionLostException 在请求完成之前, 与远程方的 JSON-RPC 连接已丢失
今天电脑重启之后,发现 visual studio 2022 的智能提示与报错经常性不好用,不光不能在正常时候提示代码错误信息,甚至在编译过后也不提示错误.反复重启,刚开始正常,隔一会儿就会提示什么什 ...
- 【Linux】【虚拟机】 IP地址的动态与静态设置
目录 配置文件的修改 配置文件的修改 vim /etc/sysconfig/network-scripts/ifcfg-ens33 IP配置方式(不指定:none,静态:static,动态:dhcp) ...
- JVM故障分析及性能优化系列之四:jstack生成的Thread Dump日志线程状态
https://www.javatang.com/archives/2017/10/25/36441958.html JVM故障分析及性能优化系列文章 JVM故障分析及性能优化系列之一:使用jstac ...
- Windows10 Linux子系统安装图形化界面的两种方法及其对比
理论上讲,所有Win10的Linux子系统都可以通过Windows10本机远程桌面和Xming的方法来安装使用图形化界面,笔者目前只接触了Debian系的Linux系统,故以Debian GNU/Li ...
- Qt编写地图综合应用50-获取区域边界
一.前言 区域边界也是一些坐标点集合,而且不同的行政区划得到的区域边界点数组集合个数不同,觉得部分都是一个集合,少部分有一些飞地之类的,需要多个闭合区域,所以会得到多个数组集合,绘制的时候都要分别取出 ...
- Sqlsugar 跨库查询小心得(同服务器不同数据库)
同一个服务器下的不同数据库,目前还没有进行跨服务器的查询,以后有待研究-- 1.使用的是Left Join左查询,因此连接字符串应该是写的第一个表所在的数据库的连接字符串 假设数据库A,B,连接字符串 ...
- OpenCV4.1.0编译时提示“CV_BGR2GRAY”: 未声明的标识符
OpenCV版本为4.1.0 使用CV_BGR2GRAY时报错: "CV_BGR2GRAY": 未声明的标识符 解决方法一:添加头文件:#include <opencv2/i ...
- IM开发者的零基础通信技术入门(十):零基础,史上最强5G技术扫盲
本文引用了"鲜枣课堂"的<史上最强5G科普>文章内容.为了更好的内容呈现,在引用和收录时内容有改动,转载时请注明原文来源. 1.内容概述 ➊ 5G技术的关注度越来越高: ...
- 深入理解ReentrantLock的实现原理
文章目录ReentrantLock简介AQS回顾ReentrantLock原理ReentrantLock结构非公平锁的实现原理lock方法获取锁tryRelease锁的释放公平锁的实现原理lock方法 ...