强化学习入门笔记(Reinforcement Learning,RL) 强推!

由于本人的近期研究方向涉及到强化学习,本科时已经学习过了,但是感觉还是有些概念和算法没有学懂学透,所以想重新系统性的学习一下,记录了整个学习过程,而且对当时没有理解不是特别深刻的内容有了一些更加深刻的理解,所以希望把学习的过程记录下来,也帮助其他的初学者能够快速入门强化学习。并且为了加深理解,会涉及一些公式。

(ps:第二遍学习了,知识真的越学越新,如果第一遍没有读懂,可能过一遍,等应用学习一段时间,可以返回来再看,真的有不同的理解),希望这份笔记能给你带来帮助。) 记录一下时间:

第一次撰写时间:20241111 00:04
第二次撰写时间:20241113 22:03

强化学习(Reinforcement Learning)

一.总体概念

首先从大致上理解一下强化学习。传统的机器学习可以大致分为:有监督学习、无监督学习、强化学习。

  • 有监督学习 是从外部监督者提供的带标签的训练集中学习。
  • 非监督学习 是从为标注的数据集中找到隐含结构的学习过程,例如K-means聚类算法
  • 强化学习更偏重于智能体与环境之间的交互。一个智能体(agent)在一个特定的环境(environment)中最大化它所能获得的奖励。通过感知所处的环境的状态(state)作出行动(action),与环境交互之后进行状态转移并得到对应的奖赏(reward),最终得到累积回报(return)。而这的方式被叫做强化学习或RL(Reinforcement Learning)。而RL学习的范式非常类似于人类学习知识的过程,也正因如此,RL被视为实现AGI重要途径。
    强化学习的图片

二.强化学习特点

  1. 试错学习:强化学习一般没有直接的指导信息,Agent 要以不断与 Environment 进行交互,通过试错的方式来获得最佳策略(Policy)。
  2. 延迟回报:强化学习的指导信息很少,而且往往是在事后(最后一个状态(State))才给出的。比如 围棋中只有到了最后才能知道胜负。

三.相关术语

根据上述对于强化学习的描述,可以注意到对应的术语包括environment, state,action,reward,return,以下将详细介绍对应的概念。

  • 环境(environment)是一个外部系统,智能体处于这个系统中,能够感知到这个系统并且能够基于感知到的状态作出一定的动作,并且环境根据作出的动作给智能体一个奖赏。
  • 状态(state):状态是对环境的当前状态的完整描述,不会隐藏环境的信息。所有的状态构成了状态空间(state space)
  • 行动(action):智能体处于当前环境状态下作出一个动作。所有可以执行的动作构成了动作空间(action space),其中包括离散动作空间(例如:前后左右四个动作)和连续的状态空间(例如:智能体的旋转角度,360度都可以)。
  • 奖励(reward):是由环境所给的一个反馈信号,该信号表明了智能体在某一步采取动作的表现,如果表现的很好,对应的reward大一点,否则就小一点。
  • 回报(return):智能体从当前状态一直到最终状态所获的累积奖励

(这里注意区别return和reward)

四.强化学习问题的基本设定:

根据上述的描述,已经对强化学习有了基本的概念,接下来让我们用形式化的数学语言来更好的表示强化学习问题:
强化学习可以用一个四元组表示,如下:

<A, S, R, P>
Action space : A 
State space : S
Reward: R : S × A × S → R
Transition : P :S × A → S 

说明:<A,S,R,P>是强化学习的形式化表达。其中A代表智能体的动作空间(包括离散的状态空间和连续的状态空间);S表示状态空间;R是奖赏,可以看出来是一个函数映射的形式,表示智能体处在状态s,执行了某一个动作a,与环境交互后转换到了s‘,得到的奖赏(Reward)为r。所以, ( s , a , s ′ ) → r (s,a,s')→r (sas)r;P表示状态转移函数,下一个状态完完全取决于环境。
根据上述的说明,此处也引出几个重要的概念,并详细介绍,对后续理解算法具有重要作用:

  1. 策略(Policy)
    策略是智能体用于决定下一步之行什么动作的规则。具体是指Agent在状态s时,所要作出的action的选择,一般定义为 π \pi π,是强化学习中的核心问题。可以视为智能体在感知到环境s后动作a到一个映射。这个策略可以是确定性的,即在当前状态下只会选择一个确定的动作( a = π ( s ) a= \pi(s) a=π(s),其中a为智能体处于状态s下用策略 π \pi π所选择的动作a);也可以是随机的(不确定的),这个时候 π \pi π不再是一个确定的动作,而是当前所能选择的动作的一个概率分布(例如当前状态下智能体可以执行4个上下左右动作,在当前的策略下,对应的概率为上:0.6;下:0.1;左:0.1;右:0.2,并且概率总和为1),以上的确定策略和随机策略可以用数学表示为:
    s t o c h a s t i c P o l i c y : ∑ π ( a ∣ s ) = 1 stochasticPolicy: \sum{\pi(a|s)}=1 stochasticPolicy:π(as)=1 d e t e r m i n i s t i c P o l i c y : π ( s ) : S → A deterministicPolicy: \pi(s):S→A deterministicPolicy:π(s):SA
  2. 状态转移(State Transition)
    智能体在环境中作出某种交互(动作)之后,将会转移到下一个状态,这种状态的转移取决于环境本身,而且这种转移也可以分为随机性和确定性转移。确定性转移表示根据当前状态和作出的动作只能转移到唯一的状态。而随机性转移则是由于环境的不确定性,导致可能下一个状态的转移是概率性的,可以用状态概率密度函数表示:
    p ( s ′ ∣ s , a ) = P ( S ′ = s ′ ∣ S = s , A = a ) p(s'|s,a)=P(S'=s'|S=s,A=a) p(ss,a)=P(S=sS=s,A=a)
    大多数情况下,对于智能体来说,环境是未知的,并且环境也可能发生变化,而上述的函数描述了在当前环境和行动下,衡量系统状态向某一个状态转移的概率是多少。
  3. 回报 (Return)
    累积回报
    回报也可以被称为累积奖赏,cumulated future reward,一般表示为U,定义为
    U t = R t + R t + 1 + . . . . R T U_t = R_t+R_{t+1}+....R_T Ut=Rt+Rt+1+....RT其中 R t R_t Rt代表每一步动作的奖赏reward,而对于智能体来说,就是最大化Return,一定是累积奖赏。
    未来的奖励不如现在等值的奖励那么好(比如一年后给100块不如现在就给),所以 R t + 1 R_{t+1} Rt+1的权重要比 R t R_{t} Rt的小。
    在实际表示中,加入了折扣回报率用来表示折扣回报,如下:
    U t = R t + γ R t + 1 + γ 2 R t + 2 + . . . U_t = R_t+\gamma R_{t+1}+\gamma ^2R_{t+2}+... Ut=Rt+γRt+1+γ2Rt+2+...其中 γ \gamma γ表示折扣率。

4.价值函数(Value-based function)
举例来说,在象棋游戏中,定义赢得游戏得1分,其他动作得0分,状态是棋盘上棋子的位置。仅从1分和0分这两个数值并不能知道智能体在游戏过程中到底下得怎么样。例如:象棋中在某一步中吃了对方的车,这步的reward会很大,但是由于这一步导致被将军,所以对于最终的目标来说,这一步也并不好。
为了对在整个游戏过程中对状态(当前的棋面对最后来说怎么样)进行评估,从而引入价值函数使用期望对未来的收益进行预测,一方面不必等待未来的收益实际发生就可以获知当前状态的好坏,另一方面通过期望汇总了未来各种可能的收益情况。使用价值函数可以很方便地评价不同策略的好坏。

注意价值函数和奖赏的区别

为了更加严谨,用数学表述:
Reward 定义的是评判一次交互中的立即的(immediate sense)回报好坏。而Value function则定义的是从长期看action平均回报的好坏。一个状态s的value是其长期期望Reward的高低。定义 V π ( s ) V_\pi(s) Vπ(s)是策略状态s长期期望收益,Q_\pi(s,a)是策略在状态s下,采取动作a的长期期望收益。
定义 G t G_t Gt为长期回报期望(Return)
G t = ∑ n = 0 N γ n r t + n G_t = \sum_{n=0}^N \gamma^nr_{t+n} Gt=n=0Nγnrt+n状态s的价值函数V为:
V π ( s ) = E π [ G t ∣ S t = s ] V_\pi(s) = E_\pi[G_t|S_t=s] Vπ(s)=Eπ[GtSt=s]
在状态s下采取动作a的动作价值函数Q为:
Q π ( s , a ) = E π [ G t ∣ S t = s , A t = a ] Q_\pi(s,a) = E_\pi[G_t|S_t=s,A_t=a] Qπ(s,a)=Eπ[GtSt=s,At=a]
在强化学习中,价值函数和Q函数之间存在一定的关系,可以通过转换公式相互表达。主要的转换方式如下:
从 Q 函数转换到状态价值函数

  1. 对于确定性策略
    如果我们选取的是一个贪婪策略,即在状态
    𝑠中选择能最大化 Q 值的动作,则价值函数可以表示为: V s = m a x a Q ( s , a ) V_s=max_aQ(s,a) Vs=maxaQ(s,a)该公式适用于寻找最优策略时(即在状态 s 中采取最佳动作的情况下)。
  2. 对于随机策略
    如果策略 π(a∣s) 是随机的,即每个动作 𝑎 在状态 s 的概率不相同,那么价值函数可以表示为 Q 函数的期望: V s = ∑ i π ( a i ∣ s ) ∗ Q ( s , a i ) V_s=\sum_i\pi(a_i|s)*Q(s,a_i) Vs=iπ(ais)Q(s,ai)这里,价值函数 𝑉(𝑠)是在策略 𝜋下,对所有动作加权的 Q 值之和。这个转换公式表示的是在随机策略下,期望的长期回报。
    从价值函数转换到 Q 函数
    假设我们知道执行动作 𝑎会从状态 𝑠 转移到下一个状态 𝑠′,那么 Q 函数可以表示为: Q ( s , a ) = E [ r + γ V ( s ′ ) ∣ s , a ] Q(s,a) =E[ r+\gamma V(s')|s,a] Q(s,a)=E[r+γV(s)s,a]在此情况下,Q 函数表示在状态 𝑠下采取动作 𝑎后获得的即时奖励 𝑟加上未来回报的折现值。而这个就是非常有名的Bellman等式

五.算法分类

按照环境是否已知划分:免模型学习(Model-Free) vs 有模型学习(Model-Based)

  • Model-free就是不去学习和理解环境,环境给出什么信息就是什么信息,常见的方法有policy optimization和Q-learning。
  • Model-Based是去学习和理解环境,学会用一个模型来模拟环境,通过模拟的环境来得到反馈。Model-Based相当于比Model-Free多了模拟环境这个环节,通过模拟环境预判接下来会发生的所有情况,然后选择最佳的情况。

一般情况下,环境都是不可知的,无法对环境进行建模,只能被动接受环境的反馈

按照学习方式划分:在线策略(On-Policy) vs 离线策略(Off-Policy)

  • On-Policy是指agent必须本人在场, 并且一定是本人边玩边学习。典型的算法为Sarsa。
  • Off-Policy是指agent可以选择自己玩, 也可以选择看着别人玩, 通过看别人玩来学习别人的行为准则,离线学习同样是从过往的经验中学习, 但是这些过往的经历没必要是自己的经历,任何人的经历都能被学习,也没有必要是边玩边学习,玩和学习的时间可以不同步。典型的方法是Q-learning,以及Deep-Q-Network。

按照学习目标划分:基于策略(Policy-Based)和基于价值(Value-Based)。

  • Policy-Based的方法直接输出下一步动作的概率,根据概率来选取动作。但不一定概率最高就会选择该动作,还是会从整体进行考虑。适用于非连续和连续的动作。常见的方法有Policy gradients。
  • Value-Based的方法输出的是动作的价值,选择价值最高的动作。适用于非连续的动作。常见的方法有Q-learning、Deep Q Network和Sarsa。
    更为厉害的方法是二者的结合:Actor-Critic,Actor根据概率做出动作,Critic根据动作给出价值,从而加速学习过程,常见的有A2C,A3C,DDPG等。

举个例子,基于策略的方法,是直接会输出当前状态下所有可选择动作的概率,(例如:上下左右,都会给一个概率),选择其中最大的并采取这步动作;基于价值的方法则是会计算当前状态下的Q-Funcion(例如: Q ( s , a i ) Q(s,a_i) Q(s,ai))然后选择最大的动作执行。

六.具体算法(重点关注深度强化学习算法,DRL)

  1. Q-learning算法(基于价值的方法)
  • 算法思路:Q-learning算法是一个基于价值函数(value-based)的方法,不直接输出每一个状态下对应的动作的概率,而是通过计算每一步下采取某一个动作的价值,并选择动作价值最大(累计收益最大)的那个动作,从而得到最佳策略。
  • 算法流程:根据算法思路,其实Q-learning算法学习的就是每一状态下采取每一个动作的价值(预期的累积收益),所以具体实现的时候就可以维护一张由state和action所组成的一张表Q-table,其中纵轴表示状态,横轴表示动作,其中每个值代表当前状态s下执行某一个动作a的Q(s,a),通过智能体与环境交互的过程不断收到环境的反馈,从而不断更新这个Qtable直到收敛了。
    为了更好地理解这个算法,我们举一个例子走迷宫的例子:
    迷宫
    问题:假设机器人必须越过迷宫并到达终点。有地雷,机器人一次只能移动一个地砖。如果机器人踏上矿井,机器人就死了。机器人必须在尽可能短的时间内到达终点。
    得分/奖励系统如下:
    1. 机器人在每一步都失去1点。这样做是为了使机器人采用最短路径并尽可能快地到达目标。
    2. 如果机器人踩到地雷,则点损失为100并且游戏结束。
    3. 如果机器人获得动力⚡️,它会获得1点。
    4. 如果机器人达到最终目标,则机器人获得100分。

现在,显而易见的问题是:我们如何训练机器人以最短的路径到达最终目标而不踩矿井?
我们可以思考一下,智能体处于迷宫中,在每一步中均可以执行上下左右四个动作,状态表示当前所处的位置(start,blank,power,mines,end)这样就能构成一张Q-table,如下:
Q-table
有了Q-table表,初始化时所有的Q值均为0,需要在智能体作出动作之后不断的更新这个表,而具体的更新方法,则利用上述提到的Bellman公式
Q ( s , a ) = Q ( s , a ) + α ( r + γ m a x a ′ Q ( s , a ′ ) − Q ( s , a ) ) Q(s,a) = Q(s,a)+\alpha(r+\gamma max_{a'}Q(s,a')-Q(s,a)) Q(s,a)=Q(s,a)+α(r+γmaxaQ(s,a)Q(s,a))其中 α \alpha α表示为学习步长, γ \gamma γ表示奖赏的折扣因子。 s ′ s' s表示状态s下执行动作a后转变为状态s’
解释:这里的 m a x a ′ Q ( s , a ′ ) max_{a'}Q(s,a') maxaQ(s,a)其实就是上边提到的 V ( s ′ ) V(s') V(s),即状态s’的值函数(预期的累积回报)。所以这个变换公式其实可以理解为状态s下执行动作a后环境会给出一个反馈r,然后就会转移到下一个状态,而这个状态下也会有一个预期的累积回报,这样就形成了一个递推的公式。或者也可以认为 r + γ m a x a ′ Q ( s , a ′ ) r+\gamma max_{a'}Q(s,a') r+γmaxaQ(s,a)是真实的Q值,而当前的Q(s,a)为估计的,二者之间存在一个误差,然后把这个误差加到原来的Q值上就会更加准确了 ,而这个误差在RL也被称作TD误差(感兴趣的同学可以自行查阅,之后的章节也会详细讲解)。看到这里,学过数据结构或算法的同学应该能发现其实就是一个动态规划方程。

ps:如果这里不懂,可以重新看一下第四章节,要重点理解Q动作价值函数

通过上述的递推过程,不断的更新Q-table,我们就能得到一个最后最佳的Q值表,这样智能体在每一个状态下都可以得到对应动作的Q值,从而选择最大的那个动作,走到终点。
2. Deep Q Network(DQN)(基于价值的方法)
Q-learning是RL的很经典的算法,但有个很大的问题在于它是一种表格方法,也就是说它非常的直来之前,就是根据过去出现过的状态,统计和迭代Q值。一方面Q-learning适用的状态和动作空间非常小,当状态和动作空间是离散且维数不高时可使用Q-Table储存每个状态动作对的Q值,而当状态和动作空间是高维连续时,使用Q-Table不现实,我们无法构建可以存储超大状态空间的Q_table。;另一方面但如果一个状态从未出现过,Q-learning是无法处理的。也就是说Q-learning压根没有预测能力,也就是没有泛化能力。
灵感乍现,突然想到, 为了能使得Q的学习能够带有预测能力,熟悉机器学习的同学很容易想到这就是一个回归问题啊!用函数拟合Q:
在这里插入图片描述
其中, θ \theta θ代表模型参数
模型有很多种选择,线性的或非线性的。传统的非深度学习的函数拟合更多是人工特征+线性模型拟合。这几年伴随着深度学习最近几年在监督学习领域的巨大成功,用深度神经网络端到端的拟合Q值,也就是DQN,似乎是个必然了。

后续更新

  1. Policy Gradient(基于策略的方法)
    后续更新

  2. Actor Critic(基于价值与基于策略二者结合)
    后续更新

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

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

相关文章

【计算机网络】【网络层】【习题】

计算机网络-网络层-习题 文章目录 13. 图 4-69 给出了距离-向量协议工作过程&#xff0c;表&#xff08;a&#xff09;是路由表 R1 初始的路由表&#xff0c;表&#xff08;b&#xff09;是相邻路由器 R2 传送来的路由表。请写出 R1 更新后的路由表&#xff08;c&#xff09;。…

外星人入侵

学习于Python编程从入门到实践&#xff08;Eric Matthes 著&#xff09; 整体目录&#xff1a;外星人入侵文件夹是打包后的不必在意 图片和音效都是网上下载的 音效下载网站&#xff1a;Free 游戏爆击中 Sound Effects Download - Pixabay 运行效果&#xff1a;可以上下左右移…

美国10月CPI符合预期,12月降息稳了?

KlipC报道&#xff1a;当地时间11月13日&#xff0c;美国劳工部公布数据显示&#xff0c;美国10月CPI同比上升2.6%&#xff0c;CPI环比上升0.2%&#xff1b;核心CPI同比上升3.3%&#xff0c;核心CPI环比上升0.3%。 数据公布后&#xff0c;交易员加大了对美联储12月降息的押注。…

游戏引擎学习第四天

视频参考:https://www.bilibili.com/video/BV1aDmqYnEnc/ BitBlt 是 Windows GDI&#xff08;图形设备接口&#xff09;中的一个函数&#xff0c;用于在设备上下文&#xff08;device context, DC&#xff09;之间复制位图数据。BitBlt 的主要用途是将一个图像区域从一个地方复…

堆排序与链式二叉树:数据结构与排序算法的双重探索

大家好&#xff0c;我是小卡皮巴拉 文章目录 目录 引言 一.堆排序 1.1 版本一 核心概念 堆排序过程 1.2 版本二 堆排序函数 HeapSort 向下调整算法 AdjustDown 向上调整算法 AdjustUp 二.链式二叉树 2.1 前中后序遍历 链式二叉树的结构 创建链式二叉树 前序遍历…

Rust语言在系统编程中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 Rust语言在系统编程中的应用 Rust语言在系统编程中的应用 Rust语言在系统编程中的应用 引言 Rust 概述 定义与原理 发展历程 Ru…

车-路-站-网”信息耦合的汽车有序充电

电动汽车作为一种环保、的交通工具&#xff0c;正逐渐成为未来交通的发展趋势。然而&#xff0c;大规模电动汽车的无序充电可能导致电网负荷波动、电压下降等问题&#xff0c;影响电网的安全稳定运行。为了解决这些问题&#xff0c;需要制定有效的电动汽车有序充电策略&#xf…

42个接受医工交叉领域投稿的二三四区期刊汇总|个人观点·24-11-14

小罗碎碎念 昨天晚上的推文总结了94个接受医工交叉研究投稿的一区期刊&#xff0c;今天这期推文把剩下的二三四区期刊补上。我会按照二三四区的顺序介绍&#xff0c;其中每个区会按照大类进行区分。 同样&#xff0c;由于公众号的排版限制&#xff0c;如下图所示的表格&#…

【更新中】《硬件架构的艺术》笔记(三):处理多个时钟

介绍 单时钟设计更易于实现&#xff0c;也更少出现亚稳态、建立和保持时间违例方面的问题。但在实践中&#xff0c;很少有设计只在一个时钟下运行。 多时钟域 多个始终可以有以下一种或多种时钟关系&#xff1a; 1、时钟频率不同。 2、时钟频率相同&#xff0c;但相位不同…

【vue2.0入门】vue基本语法

目录 引言一、页面动态插值1. 一般用法 二、计算属性computed三、动态class、style绑定四、条件渲染与列表渲染五、事件处理六、表单输入绑定七、总结 引言 本系列教程旨在帮助一些零基础的玩家快速上手前端开发。基于我自学的经验会删减部分使用频率不高的内容&#xff0c;并不…

vuepress+vdoing主题搭建自己的知识管理库

在github上建2个仓库 仓库1&#xff0c;文档源文件&#xff08;markdown&#xff09;&#xff0c;可以是私有或公有仓库。 仓库2&#xff0c;build生成的文件&#xff08;发布为github pages&#xff09;&#xff0c;公有仓库。 克隆模板 https://github.com/xugaoyi/vdoing…

开源项目推荐——OpenDroneMap无人机影像数据处理

实景三维作为GIS最火的课题&#xff0c;最近在想做一套自己的三维构建工具&#xff0c;考察了几个开源项目&#xff0c;把自己的搜索过程用csdn记录下来&#xff0c;希望也能帮助到各位同仁。 OpenDroneMap&#xff08;ODM&#xff09;是一个开源项目&#xff0c;旨在处理无人…

深入浅出《钉钉AI》产品体验报告

1. 引言 随着人工智能技术的迅猛发展&#xff0c;企业协同办公领域迎来了新的变革。钉钉作为阿里巴巴集团旗下的企业级通讯与协同办公平台&#xff0c;推出了钉钉AI助理&#xff0c;旨在提高工作效率&#xff0c;优化用户体验。本报告将对钉钉AI助理进行全面的产品体验分析&am…

夹耳开放式耳机好用吗?夹耳开放式耳机推荐

夹耳式耳机作为开放式耳机的一种&#xff0c;在最近几年里深受大家欢迎。它能够受到大家欢迎的原因主要是其不入耳的特性&#xff0c;既有助于保护听力健康&#xff0c;又能让人尽情享受极致的音乐体验。不过&#xff0c;很多小伙伴不知道夹耳式耳机到底好不好用&#xff1f;夹…

opencv(c++)----图像的读取以及显示

opencv(c)----图像的读取以及显示 imread: 作用&#xff1a;读取图像文件并将其加载到 Mat 对象中。参数&#xff1a; 第一个参数是文件路径&#xff0c;可以是相对路径或绝对路径。第二个参数是读取标志&#xff0c;比如 IMREAD_COLOR 表示以彩色模式读取图像。 返回值&#x…

SwiftUI-基础入门

开发OS X 图形应用界面时有三种实现方式&#xff1a;XIB、Storyboard、SwiftUI。Storyboard基于XIB做了优化&#xff0c;但XIB基本被放弃了&#xff0c;而SwiftUI是苹果公司后来开发的一套编程语言&#xff0c;用来平替Objective-C。虽然现在Swift 6 还是有些不完善的地方&…

string------1

文章目录 一. STL1.概念2.版本 二. string类2.1 为什么学习string类2. 标准库中的string类2.2.1 构造&#xff08;7个&#xff09;2.2.2 对string类对象进行“访问和修改”&#xff08;1&#xff09;operator[]&#xff08;2&#xff09;迭代器1.迭代器的使用2.迭代器的价值&am…

css-50 Projects in 50 Days(3)

html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>旋转页面</title><link rel"sty…

【线性代数\矩阵论】矩阵逆引理证明、应用

矩阵逆引理证明、应用 矩阵求逆引理要解决的问题是&#xff1a;减少矩阵求逆的计算量。已知一个矩阵 A A A及其逆矩阵 A − 1 A^{-1} A−1&#xff0c;当矩阵产生了变化时&#xff0c;例如增加一个扰动 P P P&#xff0c;能不能根据已知的逆矩阵 A − 1 A^{-1} A−1&#xff0c…

1111111111待修改--大流量分析(三)-BUUCTF

总结摘要 题目来来源URL https://buuoj.cn/challenges#%E5%A4%A7%E6%B5%81%E9%87%8F%E5%88%86%E6%9E%90%EF%BC%88%E4%B8%89%EF%BC%89 答题过程 这道题是看大佬写着说查找phpinfo&#xff0c;我现在也不知道为什么能够一下子就定位到这里了 这里先按照phpinfo进行&#xff…