强化学习的数学原理-06随即近似理论和随机梯度下降

文章目录

  • Robbins-Monro algorithm
  • Stochastic gradient descent
  • BGD、MBGD、 and SGD
  • Summary

Robbins-Monro algorithm

迭代式求平均数的算法

1730166803753.png

S t o c h a s t i c    a p p r o x i m a t i o n    ( S A ) Stochastic \; approximation \;(SA) Stochasticapproximation(SA):是指随机迭代的一类算法,进行求解方程或者优化的问题, S A SA SA的优势是不需要知道方程或目标函数的表达式,自然也不知道导数、梯度之类的信息.

R 0 b b i n − M o n r o    a l g o r i t h m R0bbin-Monro \; algorithm R0bbinMonroalgorithm

  • s t o c h a s t i c    a p p r o x i m a t i o n ( S A ) stochastic \; approximation(SA) stochasticapproximation(SA)领域具有开创性的工作
  • 大名鼎鼎的 s t o c h a s t i c    g r a d i e n t    d e s c e n t stochastic \; gradient \; descent stochasticgradientdescent R M RM RM算法的一种特殊情况

下面看一个求解方程问题

g ( w ) = 0 , w h e r e    w ∈ R    i s    t h e    v a r i a b l e    t o    b e    s o l v e d , g    i s    R → R    f u n c t i o n g(w)=0, where \; w \in \mathbb{R} \; is \; the \; variable \; to \; be \; solved ,g \; is \;\mathbb{R} \rightarrow \mathbb{R} \; function g(w)=0,wherewRisthevariabletobesolved,gisRRfunction

  • 如果 g g g的表达式已知,那么就有很多种算法可以求解
  • 另一种是表达式未知的情况,就比如神经网络,这样的问题就可以用RM算法求解

下面就看一下RM算法如何解决上面的问题

我们的目标是求解 g ( w ) = 0 , g(w)=0, g(w)=0,最优解 w ∗ w^* w

w k + 1 = w k − a k g ~ ( w k , η ) , k = 1 , 2 , 3 , . . . w_{k+1}=w_k-a_k\tilde{g}(w_k,\eta),k=1,2,3,... wk+1=wkakg~(wk,η),k=1,2,3,...

  • w k w_k wk是对方程根的第 k k k次估计
  • g ~ ( w k , η ) = g ( w k ) + η k \tilde{g}(w_k,\eta)=g(w_k)+\eta_k g~(wk,η)=g(wk)+ηk g ~ \tilde{g} g~是对 g g g的一个有噪音观测, η k \eta_k ηk是一个噪音
  • a k a_k ak是一个正系数

函数 g ( w ) g(w) g(w)就是作为一个黑盒 ( b l a c k    b o x ) (black \; box) (blackbox),这个算法求解依赖于数据 d a t a data data

  • i n p u t    s e q u e n c e : w k input \;sequence:{w_k} inputsequence:wk
  • N o i s y    o u t p u t    s e q u e n c e : g ~ ( w k , η k ) Noisy \; output \; sequence:{\tilde{g}(w_k,\eta_k)} Noisyoutputsequence:g~(wk,ηk)

61d519d464d2601edd51dd1596f79a4.jpg

下面是关于 R M RM RM算法收敛性的一些数学解释

1730170247927.png

1730170201086.png

1730170341222.png

1730170447404.png

1730170491387.png

1730170547247.png

下面看如何把 R M RM RM算法应用到 m e a n    e s t i m a t i o n mean \; estimation meanestimation里面

E n = ∑ i = 1 n x i n = ∑ i = 1 n − 1 x i + x n n = ( n − 1 ) E n − 1 + x n n = E n − 1 + x n − E n − 1 n \mathbb{E}_n = \frac{\sum_{i=1}^nx_i}{n}=\frac{\sum_{i=1}^{n-1}x_i+x_n}{n}=\frac{(n-1)\mathbb{E_{n-1}} + x_n}{n}=\mathbb{E}_{n-1}+\frac{x_n-\mathbb{E}_{n-1}}{n} En=ni=1nxi=ni=1n1xi+xn=n(n1)En1+xn=En1+nxnEn1

这是最开始介绍的 m e a n    e s t i m a t i o n mean \; estimation meanestimation

w k + 1 = w k + α ( x k − w k ) w_{k+1} = w_k + \alpha(x_k-w_k) wk+1=wk+α(xkwk)

当时 α = 1 k \alpha=\frac{1}{k} α=k1,最开始当 α = 1 k \alpha=\frac{1}{k} α=k1时,可以显示的写出 w k + 1 = 1 k ∑ i = 1 k x i w_{k+1}=\frac{1}{k}\sum_{i=1}^{k}x_i wk+1=k1i=1kxi,但当 α ≠ 1 k \alpha \neq \frac{1}{k} α=k1时,当时无法分析 w k + 1 w_{k+1} wk+1的收敛性,根据 R M RM RM算法可以知如果这个 m e a n    e s t i m a t i o n mean \; estimation meanestimation是一种特殊的 R M RM RM算法,那么 w k + 1 w_{k+1} wk+1就会收敛

下面就看一下这个 m e a n    e s t i m a t i o n mean \; estimation meanestimation是不是一个 R M RM RM算法

考虑这样一个函数 g ( w ) = w − E [ X ] g(w)=w-\mathbb{E}[X] g(w)=wE[X],我们的目标是求 g ( w ) = 0 g(w)=0 g(w)=0,如果能解决这个问题,就能得到 E [ X ] \mathbb{E}[X] E[X]

E [ X ] \mathbb{E}[X] E[X]显示我们是不知道的(也是我们想要去求解的),但是我们可以对 X X X进行采样也就是可以获得 g ~ ( w , x ) = w − x \tilde{g}(w,x)=w-x g~(w,x)=wx

g ~ ( w , η ) = w − x = w − x + E [ X ] − E [ X ] = ( w − E [ X ] ) + ( E [ X ] − x ) = g ( w ) + η \tilde{g}(w,\eta)=w-x=w-x+\mathbb{E}[X]-\mathbb{E}[X]=(w-\mathbb{E}[X])+(\mathbb{E}[X]-x)=g(w)+\eta g~(w,η)=wx=wx+E[X]E[X]=(wE[X])+(E[X]x)=g(w)+η

相对应的 R M RM RM算法

w k + 1 = w k − α k g ~ ( w k , η k ) = w k − α k ( w k − x k ) w_{k+1}=w_k-\alpha_k\tilde{g}(w_k, \eta_k)=w_k-\alpha_k(w_k-x_k) wk+1=wkαkg~(wk,ηk)=wkαk(wkxk)

上面的这个式子就是所给出的 m e a n    e s t i m a t i o n mean \; estimation meanestimation的算法

Stochastic gradient descent

S G D SGD SGD算法主要是去解决优化问题

min ⁡ w J ( w ) = E [ f ( w , X ) ] \min_w J(w)=\mathbb{E}[f(w,X)] wminJ(w)=E[f(w,X)]

  • w w w是一个待优化的参数
  • X X X是一个随机变量,期望 ( e x p e c t i o n ) (expection) (expection)是对 X X X求的

求解这个问题下面给出3种方法,这三种方法是逐渐递进的


M e t h o d    1 : g r a d i e n t    d e s c e n t ( G D )    梯度下降 Method \; 1:gradient \; descent(GD) \; 梯度下降 Method1:gradientdescent(GD)梯度下降

如果要最大化一个函数可以用梯度上升

w k + 1 = w k − α k ∇ w E [ f ( w k , X ) ] = w k − α k E [ ∇ w f ( w k , X ) ] w_{k+1}=w_k-\alpha_k\nabla_w\mathbb{E}[f(w_k, X)]=w_k-\alpha_k\mathbb{E}[\nabla_wf(w_k,X)] wk+1=wkαkwE[f(wk,X)]=wkαkE[wf(wk,X)]

  • α k \alpha_k αk被称为步长,是用来控制在梯度方向下降的快还是慢的
  • 这里要对梯度求期望,我们就需要模型或者数据两者其中之一

M e t h o d    2 : b a t c h    g r a d i e n t    d e s c e n t ( B G D )    批量梯度下降 Method \; 2:batch \;gradient \; descent(BGD) \; 批量梯度下降 Method2:batchgradientdescent(BGD)批量梯度下降

E [ ∇ w f ( w k , X ) ] ≈ 1 n ∑ i = 1 n ∇ f ( w k , x i ) \mathbb{E}[\nabla_wf(w_k,X)] \approx \frac{1}{n}\sum_{i=1}{n}\nabla f(w_k,x_i) E[wf(wk,X)]n1i=1nf(wk,xi)

w k + 1 = w k − α k 1 n ∑ i = 1 n ∇ f ( w k , x i ) w_k+1=w_k-\alpha_k \frac{1}{n}\sum_{i=1}{n}\nabla f(w_k,x_i) wk+1=wkαkn1i=1nf(wk,xi)

这个其实就是我们之前学习的蒙特卡洛的思想,思想比较简单,但是缺点是在每次更新 w k w_k wk时,都需要采样很多次


M e t h o d    3 : s t o c h a s t i c    g r a d i e n t    d e s c e n t ( S G D )    随机梯度下降 Method \; 3:stochastic \;gradient \; descent(SGD) \; 随机梯度下降 Method3:stochasticgradientdescent(SGD)随机梯度下降

w k + 1 = w k − α k ∇ w f ( w k , x k ) w_{k+1}=w_k-\alpha_k\nabla_wf(w_k,x_k) wk+1=wkαkwf(wk,xk)

注意 G D GD GD公式中的 X X X变成了对 X X X的一次采样 x k x_k xk

  • G D GD GD中用的是 t r u e    g r a d i e n t    E [ ∇ w f ( w k , X ) ] true \; gradient \; \mathbb{E}[\nabla_wf(w_k,X)] truegradientE[wf(wk,X)],但是这个真正的梯度是不知道的,所以就用一个 s t o c h a s t i c    g r a d i e n t    ∇ w f ( w k , x k ) stochastic \; gradient \; \nabla_w f(w_k, x_k) stochasticgradientwf(wk,xk)来代替,,之所以被称为 s t o c h a s t i c stochastic stochastic是因为这里面有一个对 X X X随机的采样
  • B G D BGD BGD相比, S G D SGD SGD就是把 B G D BGD BGD中的 n n n变成了 1 1 1

下面是一个用 S G D SGD SGD优化的例子

min ⁡ w J ( w ) = E [ f ( w , X ) ] = E [ 1 2 ∣ ∣ ∣ w − X ∣ ∣ 2 ] \min_w J(w)=\mathbb{E}[f(w,X)]=E\left[ \frac{1}{2}\mid\mid \mid w - X \mid \mid^2 \right] wminJ(w)=E[f(w,X)]=E[21∣∣∣wX2]

w h e r e    f ( w , X ) = 1 2 ∣ ∣ ∣ w − X ∣ ∣ 2 ∇ f ( w , X ) = w − X where \; f(w,X)=\frac{1}{2}\mid\mid \mid w - X \mid \mid^2 \quad \nabla f(w,X)=w-X wheref(w,X)=21∣∣∣wX2f(w,X)=wX

这个问题的解 w ∗ = E [ X ] w^* =\mathbb{E}[X] w=E[X]

下面是推导:

我们知道 J ( w ) J(w) J(w)要达到最小值,有一个必要条件,就是对 J ( w ) J(w) J(w)求梯度应该等于 0 0 0,也就是

∇ J ( w ) = ∇ E [ f ( w , X ) ] = E [ ∇ f ( w , X ) ] = E [ w − X ] = w − E [ X ] = 0 \nabla J(w) = \nabla \mathbb{E}[f(w,X)]= \mathbb{E}[\nabla f(w,X)]=\mathbb{E}[w-X]=w-\mathbb{E}[X]=0 J(w)=E[f(w,X)]=E[f(w,X)]=E[wX]=wE[X]=0

于是

w ∗ = E [ X ] w^*=\mathbb{E}[X] w=E[X]

G D 算法: GD算法: GD算法:

w k + 1 = w k − α k ∇ w J ( w k ) = w k − α k E [ ∇ w f ( w k , X ) ] = w k − α k E [ w k − X ] \begin{align} w_{k+1} &= w_k - \alpha_k \nabla_w J(w_k) \\ &= w_k - \alpha_k \mathbb{E}[\nabla_wf(w_k,X)] \\ &= w_k - \alpha_k\mathbb{E}[w_k-X] \end{align} wk+1=wkαkwJ(wk)=wkαkE[wf(wk,X)]=wkαkE[wkX]

S G D 算法: SGD算法: SGD算法:

w k + 1 = w k − α k ∇ w f ( w k , x k ) = w k − α ( w k − x k ) w_{k+1}=w_k-\alpha_k \nabla_wf(w_k,x_k)=w_k-\alpha (w_k - x_k) wk+1=wkαkwf(wk,xk)=wkα(wkxk)


G D GD GD S G D SGD SGD

w k + 1 = w k − α k E [ ∇ w f ( w k ) , X ] w_{k+1}=w_k-\alpha_k \mathbb{E}[\nabla_wf(w_k),X] wk+1=wkαkE[wf(wk),X]

w k + 1 = w k − α k ∇ w f ( w k ) , x k w_{k+1}=w_k-\alpha_k \nabla_wf(w_k),x_k wk+1=wkαkwf(wk),xk

直接用 s t o c h a s t i c    g r a d i e n t stochastic \; gradient stochasticgradient去近似 t r u e    g r a d i e n t true \; gradient truegradient

既然是近似两者之间存在有误差,那么两者之间的关系如下

∇ w f ( w k , x k ) = E [ ∇ w f ( w , X ) ] + ∇ w f ( w k , x k ) − E [ ∇ w f ( w , X ) ] \nabla_w f(w_k,x_k) = \mathbb{E}[\nabla_w f(w,X)] +\nabla_w f(w_k,x_k) - \mathbb{E}[\nabla_wf(w,X)] wf(wk,xk)=E[wf(w,X)]+wf(wk,xk)E[wf(w,X)]

∇ w f ( w k , x k ) ≠ E [ ∇ w f ( w , X ) ] \nabla_w f(w_k,x_k) \neq \mathbb{E}[\nabla_w f(w,X)] wf(wk,xk)=E[wf(w,X)]

那么 S G D SGD SGD能否找到最优解呢?也就是 S G D 算法 SGD算法 SGD算法能否收敛

可以通过证明 S G D 算法 SGD算法 SGD算法 R M 算法 RM算法 RM算法解决这个问题

1730178996339.png

1730179060410.png

于是我们可以用 R M RM RM算法的收敛性来分析 S G D SGD SGD算法的收敛性

1730179093923.png


1730179355461.png

1730179430999.png

1730179489369.png

结论:当 w k w_k wk w ∗ w^* w距离比较远时, S G D SGD SGD G D GD GD的行为是比较类似的

BGD、MBGD、 and SGD

1730179942185.png

可以认为 M B G D MBGD MBGD包括了 S G D SGD SGD B G D BGD BGD

m i n i − b a t c h mini-batch minibatch 1 1 1的时候就变成了 S G D SGD SGD

m i n i − b a t c h mini-batch minibatch比较大的时候就变成了 B G D BGD BGD

相比于 S G D SGD SGD, M B G D MBGD MBGD的随机性比较小,因为用了更多的数据去代替一个数据.

相比于 B G D BGD BGD, M B G D MBGD MBGD的随机性会比较大,需要的数据又比较少,效率和性能是比较高的.

1730180194126.png


1730180269427.png

1730180361448.png

Summary

  • m e a n    e s t i m a t i o n : mean \; estimation: meanestimation使用一组数 x k {x_k} xk计算 E [ X ] \mathbb{E}[X] E[X] w k + 1 = w k + 1 k ( w k − x k ) w_{k+1} = w_k + \frac{1}{k}(w_k-x_k) wk+1=wk+k1(wkxk)
  • R M 算法 RM算法 RM算法 s o l v e    g ( w ) = 0    u s i n g    g ~ ( w k , η k ) solve \; g(w)=0 \; using \; {\tilde{g}(w_k,\eta_k)} solveg(w)=0usingg~(wk,ηk) w k k + 1 = w k − a k g ~ ( w k , η k ) w_k{k+1}=w_k-a_k{\tilde{g}(w_k,\eta_k)} wkk+1=wkakg~(wk,ηk)
  • S G D 算法: m i n i m i z e    J ( w ) = E [ f ( w k , X ) ] , u s i n g    ∇ w f ( w k , x k ) ,    w k + 1 = w k − α k ∇ w f ( w k , x k ) SGD算法:minimize \; J(w)=\mathbb{E}[f(w_k, X)],using \; {\nabla_wf(w_k,x_k)}, \; w_{k+1}=w_k-\alpha_k \nabla_w f(w_k, x_k) SGD算法:minimizeJ(w)=E[f(wk,X)]usingwf(wk,xk),wk+1=wkαkwf(wk,xk)

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

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

相关文章

Apache Hive 通过Docker快速入门

QuickStarted 介绍 在伪分布式模式下在 docker 容器内运行 Apache Hive,以便为 Hive 提供以下快速启动/调试/准备测试环境 快速入门 步骤 1:拉取镜像 从 DockerHub 拉取镜像:https://hub.docker.com/r/apache/hive/tags。以下是最新的镜像…

【K8S系列】Kubernetes 中 NodePort 类型的 Service 无法访问的问题【已解决】

在 Kubernetes 中,NodePort 类型的 Service 允许用户通过每个节点的 IP 地址和指定的端口访问应用程序。如果 NodePort 类型的 Service 无法通过节点的 IP 地址和指定端口进行访问,可能会导致用户无法访问应用。本文将详细分析该问题的常见原因及其解决方…

逻辑卷动态扩容与缩容-----

一、创建逻辑卷 需求:创建一个2.5G大小的逻辑卷 思路: 1. 物理的设备 2. 将物理设备做成物理卷 pv 3. 创建卷组并将物理卷加入其中 vg 4. 创建逻辑卷 lv 5. 格式化逻辑卷 mkfs.ext4 6. 挂载使用 mount 步骤: 1. 物理设备【如何来分区】…

开关灯问题(c语言)

样例&#xff1a;10 10 &#xff0c;输出&#xff1a;1&#xff0c;4&#xff0c;9 5 5 &#xff0c;输出&#xff1a;1&#xff0c;4 代码如下 #include<stdio.h> //引入bool值的概念 #include<stdbool.h> int main() {int n 0;//n为灯的数量int m 0;…

扫雷游戏(C语言详解)

扫雷游戏&#xff08;C语言详解&#xff09; 放在最前面的1、前言&#xff08;扫雷游戏的简介&#xff09;2、扫雷游戏的规则&#xff08;简易版&#xff09;3、代码实现&#xff08;3.1&#xff09;提醒一下&#xff1a;( i ) 提醒1&#xff1a;( ii ) 提醒2&#xff1a; &…

在面试了些外包以后,我有了些自己的思考

大家好&#xff0c;我是洋子&#xff0c;最近公司在降本增效&#xff0c;需要把外包从北京迁移到陕西的某新一线城市&#xff0c;其实就是变相裁员&#xff0c;减少外包的成本&#xff0c;裁掉现有的员工&#xff0c;重新招聘新人 在整个测试行业&#xff0c;外包测试的比重是…

论文 | Ignore Previous Prompt: Attack Techniques For Language Models

这篇论文探讨了针对大型语言模型&#xff08;LLM&#xff09;的“提示注入”攻击&#xff0c;并提出了一种名为 PROMPTINJECT 的框架来研究这类攻击。 论文的主要内容包括&#xff1a;1. 提示注入攻击&#xff1a; 论文定义了“提示注入”的概念&#xff0c;即通过在用…

Django-中间件

定义&#xff1a; 编写中间件&#xff1a; 注册中间件&#xff1a; 添加中间件&#xff1a; 1.在项目目录下添加一个文件夹&#xff08;名字随意&#xff09;&#xff0c;然后文件夹下创建.py文件 2.将中间件添加到setting文件中 MIDDLEWARE [django.middleware.security.Se…

MBR20100CT-ASEMI半塑封肖特基二极管MBR20100CT

编辑&#xff1a;ll MBR20100CT-ASEMI半塑封肖特基二极管MBR20100CT 型号&#xff1a;MBR20100CT 品牌&#xff1a;ASEMI 封装&#xff1a;TO-220 安装方式&#xff1a;插件 批号&#xff1a;最新 最大平均正向电流&#xff08;IF&#xff09;&#xff1a;20A 最大循环…

操作数据表

创建表 创建表语法&#xff1a; CREATE TABLE table_name ( field1 datatype [COMMENT 注释内容], field2 datatype [COMMENT 注释内容], field3 datatype ); 注意&#xff1a; 1. 蓝色字体为关键字 2. CREATE TABLE 是创建数据表的固定关键字&#xff0c;表…

一、ARMv8寄存器之通用、状态、特殊寄存器

ARMV8核心寄存器数量是非常大的&#xff0c;为了更好的学习&#xff0c;可以划分为以下几大类&#xff1a; 通用寄存器。这类寄存器主要是用来暂存数据和参与运算。通过load\store指令操作。状态寄存器。AArch64体系结构使用PSTATE寄存器表示当前处理器状态。特殊寄存器。有专门…

WPF+MVVM案例实战(六)- 自定义分页控件实现

文章目录 1、项目准备2、功能实现1、分页控件 DataPager 实现2、分页控件数据模型与查询行为3、数据界面实现 3、运行效果4、源代码获取 1、项目准备 打开项目 Wpf_Examples&#xff0c;新建 PageBarWindow.xaml 界面、PageBarViewModel.cs ,在用户控件库 UserControlLib中创建…

【Docker】构建Linux云桌面环境

目录 一、说明 二、离线安装Docker 1&#xff09;将下载的包上传到服务器上去 2&#xff09;安装docker 3) 启动docker 4&#xff09;配置加速器 三、安装云桌面镜像 四、启动云桌面 方式一&#xff1a;docker命令直接运行 方式二&#xff1a;docker-compose方式 五…

Easysearch 与 LLM 融合打造知识库系统

文章目录 一、LangChain 简介二、RAG 产生的背景及其局限性三、RAG 工作流程四、 Easysearch 结合 LLM 实现 RAG&#xff08;1&#xff09;Easysearch 简介&#xff08;2&#xff09;结合实现RAG 五、 Easysearch 结合 LLM 实现 RAG 的优势&#xff08;1&#xff09;提高检索准…

驱动-----adc

在key1.c的基础上进行对adc1.c进行编写 首先将文件里面的key全部改为adc 再修改一下设备号 按键和adc的区别是什么,按键只需要按一下就触发了,并且不需要返回一个值出来, adc要初始化,启动,返回值 以下是裸机adc的代码: #include <s3c2440.h> #include "ad…

快速生成高质量提示词,Image to Prompt 更高效

抖知书老师推荐&#xff1a; 随着 AI 技术的不断发展&#xff0c;视觉信息与语言信息之间的转换变得越来越便捷。在如今的数字化生活中&#xff0c;图像与文字的交互需求愈发旺盛&#xff0c;很多人都希望能轻松将图像内容直接转化为文本描述。今天我们来推荐一款实用的 AI 工…

FileLink跨网文件传输与传统文件传输对比

在数字化时代&#xff0c;文件传输已成为企业日常运营不可或缺的一部分。然而&#xff0c;随着企业规模的扩大和业务的复杂化&#xff0c;传统的文件传输方式逐渐暴露出诸多不足。本文将对比FileLink跨网文件传输与传统文件传输方式&#xff0c;揭示FileLink在高效性、安全性和…

渗透测试-百日筑基—文件上传篇特征截断渲染%00绕过——下篇

目录 day10-渗透测试文件上传篇&绕过&特征&截断&渲染 一、黑名单大小写绕过代码分析 1、获取文件后缀名进行判断&#xff0c;如果后缀在这个字典里就禁止上传。 2、黑名单大小写绕过攻击 二、利用 windows 系统特征绕过上传 1、windows 系统特征绕过漏洞…

YoloV9改进策略:Block改进|RFE模块,提高小物体的识别精度|即插即用|代码+修改过程

摘要 论文介绍 本文介绍了一种基于YOLOv5的人脸检测方法,命名为YOLO-FaceV2。该方法旨在解决人脸检测中的尺度变化、简单与困难样本不平衡以及人脸遮挡等问题。通过引入一系列创新模块和损失函数,YOLO-FaceV2在WiderFace数据集上取得了优异的表现,特别是在小物体、遮挡和困…

CodeQL学习笔记(3)-QL语法(模块、变量、表达式、公式和注解)

最近在学习CodeQL&#xff0c;对于CodeQL就不介绍了&#xff0c;目前网上一搜一大把。本系列是学习CodeQL的个人学习笔记&#xff0c;根据个人知识库笔记修改整理而来的&#xff0c;分享出来共同学习。个人觉得QL的语法比较反人类&#xff0c;至少与目前主流的这些OOP语言相比&…