机器学习笔记之优化算法(二)线搜索方法(方向角度)

机器学习笔记之优化算法——线搜索方法[方向角度]

引言

上一节对优化问题进行了简单描述,并从逻辑认知的角度介绍了线搜索方法信赖域方法。本节将关注线搜索方法,并重点关注它的方向部分。

回顾:线搜索方法

线搜索方法是一种通过求解数值解来计算最优解的方法。其特点是:在数值解的迭代求解过程中,分为方向步长分别执行,并且先定方向,后定步长。对应的数学符号表达如下:
x k + 1 = x k + α k ⋅ P k x_{k+1} = x_k + \alpha_k \cdot \mathcal P_k xk+1=xk+αkPk
其中 α k \alpha_k αk表示步长, P k \mathcal P_k Pk表示方向。并且步长的重要程度高于方向

从方向角度观察线搜索方法

我们首先对优化问题(场景)进行一系列的假设以达到简化作用。

场景构建

假设1:目标函数结果的单调性

关于变量 X \mathcal X X目标函数 f ( X ) f(\mathcal X) f(X),我们最终目标是选择一个合适的 X = x \mathcal X = x X=x,使得目标函数达到最值。这里以最小值为例,对应数学符号表示如下:
min ⁡ X ∈ R n f ( X ) \mathop{\min}\limits_{\mathcal X \in \mathbb R^n} f(\mathcal X) XRnminf(X)

迭代之前,我们给定关于 X \mathcal X X初始化信息 x 0 x_0 x0,并在迭代过程中通过策略得到一系列数值解 { x k } k = 1 ∞ \{x_k\}_{k=1}^{\infty} {xk}k=1,它们对应的目标函数结果表示如下:
{ f ( x k ) } k = 0 ∞ \{f(x_k)\}_{k=0}^{\infty} {f(xk)}k=0

上一节介绍过,目标函数结果所描述的数列存在单调性,但这个单调性可能是不严格的

  • 如果数列满足严格的单调性,有:
    f ( x k + 1 ) < f ( x k ) f ( x k ) , f ( x k + 1 ) ∈ { f ( x k ) } k = 0 ∞ f(x_{k+1}) < f(x_k) \quad f(x_k),f(x_{k+1}) \in \{f(x_k)\}_{k=0}^{\infty} f(xk+1)<f(xk)f(xk),f(xk+1){f(xk)}k=0
  • 相反,如果数列的单调性不严格,有:
    f ( x k + 1 ) < f ( x k − m ) f ( x k + 1 ) , f ( x k − m ) ∈ { f ( x k ) } k = 0 ∞ ; m ∈ [ 0 , k ] f(x_{k+1}) < f(x_{k-m}) \quad f(x_{k+1}),f(x_{k-m}) \in \{f(x_k)\}_{k=0}^{\infty};m \in [0,k] f(xk+1)<f(xkm)f(xk+1),f(xkm){f(xk)}k=0;m[0,k]

也就是说,严格的单调性需要数列中的元素按照顺序严格递减;而不严格的单调性仅需要趋势递减即可,局部元素之间的大小关系并不是关注的重点。
在真实情况下,单调性的严格/不严格并不是绝对的。在迭代之前,初始化信息 x 0 x_0 x0一般是随机初始化,从而导致 x 0 x_0 x0到最优解 x ∗ x^* x的距离是随机的。因此在迭代初期,我们通常会采用不严格的递减方式,随着数值解 x k x_k xk逐步逼近最优解 x ∗ x^* x,我们会调整参数 m m m,使其逐步地向严格的递减方式转化。

方向角度观察线搜索方法之前,为简化运算,设定 { f ( x k ) } k = 0 ∞ \{f(x_k)\}_{k=0}^{\infty} {f(xk)}k=0服从严格的单调性
其中 N N N表示非负整数,描述数值解的编号。
∀ k ∈ N ⇒ f ( x k + 1 ) < f ( x k ) \forall k \in N \Rightarrow f(x_{k+1}) < f(x_k) kNf(xk+1)<f(xk)

假设2:屏蔽步长 α k \alpha_k αk对线搜索方法过程的影响

上一节同样介绍了:线搜索方法对于步长的要求比较严格,较大或者较小的步长都会对线搜索方法产生负面影响

不否认的是:较大的步长可能会影响方向,从而使线搜索方法失效;但较小的步长仅会使计算(迭代)代价提升,从而在真实情况中不太可用,但并不会使算法失效,也不会对其收敛性产生太大影响。

  • 较小的步长仅仅使收敛速度慢了,而不是不收敛了。
  • ‘较大步长可能影响方向’示例见文章末尾。

由于这里仅讨论方向角度的线搜索方法,因此这里关于步长的假设是:在线搜索方法的迭代过程中,其步长 α k \alpha_k αk足够小,小到可以忽略不计
由于‘步长’ α k \alpha_k αk的实际意义,因而它一定是一个正值。

假设3:限定向量 P k \mathcal P_k Pk的大小

向量 P k \mathcal P_k Pk既包含大小,也包含方向。而观察方向角度的线搜索方法中, P k \mathcal P_k Pk的大小同样不是我们关注的对象。因此我们需要将 P k \mathcal P_k Pk简化为单位向量。即:
∣ ∣ P k ∣ ∣ = 1 k = 1 , 2 , 3 , ⋯ ||\mathcal P_k|| = 1 \quad k=1,2,3,\cdots ∣∣Pk∣∣=1k=1,2,3,
关于向量大小的约束我们早在支持向量机——模型构建思路中关于约束条件消除等比例缩放对函数间隔 ( Functional Margin ) (\text{Functional Margin}) (Functional Margin)的影响时使用的方法:
y ( i ) ( W T x ( i ) + b ) > 0 ⇒ y ( i ) ( W T x ( i ) + b ) ≥ 1 y^{(i)} \left(\mathcal W^T x^{(i)} + b\right) > 0 \Rightarrow y^{(i)} \left(\mathcal W^T x^{(i)} + b\right) \geq 1 y(i)(WTx(i)+b)>0y(i)(WTx(i)+b)1
实际上,假设 2 2 2与假设 3 3 3可以进行合并。当 P k \mathcal P_k Pk化简为相应的单位向量时,该向量一定与 P k \mathcal P_k Pk线性相关。化简后产生的标量系数可以与步长做乘法,从而被忽略掉

下降方向的推导过程

基于上述假设,我们可以对数值解 x k + 1 x_{k+1} xk+1对应的目标函数结果 f ( x k + 1 ) f(x_{k+1}) f(xk+1)通过泰勒公式进行展开
仅展开至 2 2 2阶。
f ( x k + 1 ) = f ( x k + α k ⋅ P k ) = f ( x k ) + 1 1 ! [ ∇ f ( x k ) ] T ⋅ ( x k + 1 − x k ) + 1 2 ! ( x k + 1 − x k ) T [ ∇ 2 f ( x k ) ] ( x k + 1 − x k ) \begin{aligned} f(x_{k+1}) & = f(x_k + \alpha_k \cdot \mathcal P_k) \\ & = f(x_k) + \frac{1}{1!} \left[\nabla f(x_k)\right]^T \cdot (x_{k+1} - x_k) + \frac{1}{2!} (x_{k+1} - x_k)^T \left[\nabla^2 f(x_k)\right](x_{k+1} - x_k) \end{aligned} f(xk+1)=f(xk+αkPk)=f(xk)+1!1[f(xk)]T(xk+1xk)+2!1(xk+1xk)T[2f(xk)](xk+1xk)
x k + 1 − x k = α k P k x_{k+1} - x_k = \alpha_k \mathcal P_k xk+1xk=αkPk代入,化简有:
f ( x k + 1 ) = f ( x k ) + [ ∇ f ( x k ) ] T ⋅ α k P k + 1 2 ( α k P k ) T [ ∇ 2 f ( x k ) ] α k P k \begin{aligned} f(x_{k+1}) = f(x_k) + \left[\nabla f(x_k)\right]^T \cdot \alpha_k\mathcal P_k + \frac{1}{2} (\alpha_k \mathcal P_k)^T \left[\nabla^2 f(x_k)\right] \alpha_k\mathcal P_k \end{aligned} f(xk+1)=f(xk)+[f(xk)]TαkPk+21(αkPk)T[2f(xk)]αkPk
观察后一项: 1 2 ( α k P k ) T [ ∇ 2 f ( x k ) ] α k P k \begin{aligned}\frac{1}{2} (\alpha_k \mathcal P_k)^T \left[\nabla^2 f(x_k)\right] \alpha_k\mathcal P_k\end{aligned} 21(αkPk)T[2f(xk)]αkPk,其中 α k P k \alpha_k\mathcal P_k αkPk n × 1 n \times 1 n×1的向量,这意味着:该项的结果是一个标量。并且是与 ∣ ∣ α k P k ∣ ∣ ||\alpha_k\mathcal P_k|| ∣∣αkPk∣∣相关的一个标量(这里将 1 2 \begin{aligned}\frac{1}{2}\end{aligned} 21与标量 α k \alpha_k αk合并到一起),我们直接将其记作 O ( ∣ ∣ α k P k ∣ ∣ ) \mathcal O(||\alpha_k\mathcal P_k||) O(∣∣αkPk∣∣)。又因为上述假设 2 2 2与假设 3 3 3的合并,这里直接将 O ( ∣ ∣ α k P k ∣ ∣ ) \mathcal O(||\alpha_k\mathcal P_k||) O(∣∣αkPk∣∣)忽略掉,简化为如下形式:
这里的 O ( ∣ ∣ α k P k ∣ ∣ ) \mathcal O(||\alpha_k\mathcal P_k||) O(∣∣αkPk∣∣)指与 α k P k \alpha_k\mathcal P_k αkPk相关的复杂项。
f ( x k + 1 ) = f ( x k ) + [ ∇ f ( x k ) ] T ⋅ α k P k + O ( ∣ ∣ α k P k ∣ ∣ ) ≈ f ( x k ) + [ ∇ f ( x k ) ] T ⋅ α k P k \begin{aligned} f(x_{k+1}) & = f(x_k) + \left[\nabla f(x_k)\right]^T \cdot \alpha_k\mathcal P_k + \mathcal O(||\alpha_k\mathcal P_k||) \\ & \approx f(x_k) + \left[\nabla f(x_k)\right]^T \cdot \alpha_k\mathcal P_k \end{aligned} f(xk+1)=f(xk)+[f(xk)]TαkPk+O(∣∣αkPk∣∣)f(xk)+[f(xk)]TαkPk
从而有:
f ( x k + 1 ) − f ( x k ) ≈ [ ∇ f ( x k ) ] T ⋅ α k P k f(x_{k+1}) - f(x_k) \approx \left[\nabla f(x_k)\right]^T \cdot \alpha_k\mathcal P_k f(xk+1)f(xk)[f(xk)]TαkPk
又因为假设 1 1 1:严格的单调性,因而有:
∀ k ∈ N ⇒ f ( x k + 1 ) < f ( x k ) ⇒ [ ∇ f ( x k ) ] T ⋅ α k P k < 0 \forall k \in N \Rightarrow f(x_{k+1}) < f(x_k) \Rightarrow \left[\nabla f(x_k)\right]^T \cdot \alpha_k\mathcal P_k < 0 kNf(xk+1)<f(xk)[f(xk)]TαkPk<0
由于 α k \alpha_k αk自身是一个正值,因而可以不等号两侧同时除以 α k \alpha_k αk,不改变不等号的方向。因而有:
[ ∇ f ( x k ) ] T ⋅ P k < 0 \left[\nabla f(x_k)\right]^T \cdot \mathcal P_k < 0 [f(xk)]TPk<0
可以观察: ∇ f ( x k ) \nabla f(x_k) f(xk)数值解 x k x_k xk对应的目标函数的梯度向量;而 P k \mathcal P_k Pk数值解 x k x_k xk在当前迭代步骤中更新的方向向量(单位向量)。根据上式,我们就可以反过来对 P k \mathcal P_k Pk的约束条件进行描述

基于上述假设,如果存在这样的 P k \mathcal P_k Pk,使得 [ ∇ f ( x k ) ] T ⋅ P k < 0 \begin{aligned}\left[\nabla f(x_k)\right]^T \cdot \mathcal P_k < 0\end{aligned} [f(xk)]TPk<0,那么该 P k \mathcal P_k Pk一定满足 f ( x k + 1 ) < f ( x k ) f(x_{k+1}) < f(x_k) f(xk+1)<f(xk)

并满足条件的 P k \mathcal P_k Pk方向称作下降方向 ( Descent Direction ) (\text{Descent Direction}) (Descent Direction)

下降方向的几何意义

观察上面的公式:
[ ∇ f ( x k ) ] T ⋅ P k < 0 \begin{aligned}\left[\nabla f(x_k)\right]^T \cdot \mathcal P_k < 0\end{aligned} [f(xk)]TPk<0
不等式左侧的本质上就是向量 ∇ f ( x k ) \nabla f(x_k) f(xk)向量 P k \mathcal P_k Pk之间的内积结果。将其继续展开:
∣ ∣ ∇ f ( x k ) ∣ ∣ ⋅ ∣ ∣ P k ∣ ∣ ⋅ cos ⁡ θ < 0 ||\nabla f(x_k)|| \cdot ||\mathcal P_k|| \cdot \cos \theta <0 ∣∣∇f(xk)∣∣∣∣Pk∣∣cosθ<0
其中 ∣ ∣ ∇ f ( x k ) ∣ ∣ , ∣ ∣ P k ∣ ∣ = 1 ||\nabla f(x_k)||,||\mathcal P_k||=1 ∣∣∇f(xk)∣∣,∣∣Pk∣∣=1分别表示上述两向量的大小,均恒正;这意味着 cos ⁡ θ < 0 \cos \theta < 0 cosθ<0,而 θ \theta θ表示向量 ∇ f ( x k ) \nabla f(x_k) f(xk)与向量 P k \mathcal P_k Pk之间的夹角。这意味着:向量 ∇ f ( x k ) \nabla f(x_k) f(xk)与向量 P k \mathcal P_k Pk的夹角范围在 ( π 2 , 3 π 2 ) \begin{aligned}\left(\frac{\pi}{2},\frac{3 \pi}{2}\right)\end{aligned} (2π,23π)之间
梯度方向与更新方向之间的关系
观察上述图像:

  • 其中蓝色虚线表示 X \mathcal X X变量空间中,过点 x k x_k xk与目标函数等高线的切线
  • 蓝色虚线垂直,并向远离目标函数的黑色箭头梯度方向 ∇ f ( x k ) \nabla f(x_k) f(xk),与其相反的黑色箭头就是梯度的负方向
  • x k x_k xk为圆心, 1 1 1为半径作圆(因为 P k \mathcal P_k Pk单位向量),在蓝色虚线上方并且落在圆上的点(橙色点)与 x k x_k xk相连接构成的向量就是 P k \mathcal P_k Pk可能选择的向量。图中的红色弧线表示夹角。

在优化算法——无约束优化概述中提到线搜索方法方向中的与负梯度方向相关的方向就是与负梯度方向夹角在 ( − π 2 , π 2 ) \begin{aligned}\left(-\frac{\pi}{2},\frac{\pi}{2}\right)\end{aligned} (2π,2π)之间的方向(与梯度方向的情况正好相反)。

  • 继续观察上图,如果方向在蓝色虚线或者是蓝色虚线以下的范围内,那么更新后的梯度目标函数结果必然大于当前等高线的数值结果。
  • 可以想象一下:如果更新的 P k \mathcal P_k Pk方向与切线方向非常接近(例如图中最右侧的橙黄色点),如果稍微控制不好步长从而使步长过大,那么最终同样导致更新后的目标函数结果大于之前的结果,从而导致本次迭代无效。从侧面也能看出合理步长的重要性。

同理,如果 P k \mathcal P_k Pk方向恰好与 ∇ f ( x k ) \nabla f(x_k) f(xk)之间的夹角为 π \pi π(与 ∇ f ( x k ) \nabla f(x_k) f(xk)方向完全相反),那么此时的 cos ⁡ θ = − 1 \cos \theta = -1 cosθ=1,对应更新后的 f ( x k + 1 ) f(x_{k+1}) f(xk+1)相比 f ( x k ) f(x_k) f(xk)减小的程度是最强烈的,也是当前迭代步骤最优的优化方向
f ( x k + 1 ) − f ( x k ) ≈ α k ⋅ ∣ ∣ ∇ f ( x k ) ∣ ∣ ⋅ ∣ ∣ P k ∣ ∣ ⋅ cos ⁡ θ = − α k ⋅ ∣ ∣ ∇ f ( x k ) ∣ ∣ ⋅ 1 ⋅ ( − 1 ) = − α k ⋅ ∣ ∣ ∇ f ( x k ) ∣ ∣ \begin{aligned} f(x_{k+1}) - f(x_k) & \approx \alpha_k \cdot ||\nabla f(x_k)|| \cdot ||\mathcal P_k|| \cdot \cos \theta \\ & = - \alpha_k \cdot ||\nabla f(x_k)|| \cdot 1 \cdot (-1) \\ & = -\alpha_k \cdot ||\nabla f(x_k)|| \end{aligned} f(xk+1)f(xk)αk∣∣∇f(xk)∣∣∣∣Pk∣∣cosθ=αk∣∣∇f(xk)∣∣1(1)=αk∣∣∇f(xk)∣∣

实际上,梯度下降法 ( Gradient Descent,GD ) (\text{Gradient Descent,GD}) (Gradient Descent,GD),它每一次迭代(更新步骤)中总会选择最优的优化方向(与梯度方向相反的方向)作为下降方向,因为在当前迭代步骤中,该方向目标函数下降的效果最明显。因此梯度下降法也被称作最速下降法

相关参考:
【优化算法】线搜索方法-方向

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

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

相关文章

0基础学习VR全景平台篇 第76篇:全景相机-圆周率全景相机如何直播推流

圆周率科技&#xff0c;成立于2012年&#xff0c;是中国最早投身嵌入式全景算法研发的团队之一&#xff0c;亦是全球市场占有率最大的全景算法供应商。相继推出一体化智能屏、支持一键高清全景直播的智慧全景相机--Pilot Era和Pilot One&#xff0c;为用户带来实时畅享8K的高清…

PyTorch代码实战入门

人这辈子千万不要马虎两件事 一是找对爱人、二是选对事业 因为太阳升起时要投身事业 太阳落山时要与爱人相拥 一、准备数据集 蚂蚁蜜蜂数据集 蚂蚁蜜蜂的图片&#xff0c;文件名就是数据的label 二、使用Dataset加载数据 打开pycharm&#xff0c;选择Anaconda创建的pytorch环…

《工具箱-VNCServer》配置VNCServer,使用VNCViewer实现局域网内页面共享

VNCServer设置 通过VNCServer配置&#xff0c;与VNCviewer配套使用 1.下载并安装VNCServer 2.邮箱密码注册后用户登录 3.设置VNC密码 4.设置viewer不能控制本机 5.打开VNClicensewiz&#xff0c;选择“Enter a license key …” BQ24G-PDXE4-KKKRS-WBHZE-F5RCA BQ24G-PDXE4-…

Java中集合容器详解:简单使用与案例分析

目录 一、概览 1.1 Collection 1. Set 2. List 3. Queue 1.2 Map 二、容器中的设计模式 迭代器模式 适配器模式 三、源码分析 ArrayList 1. 概览 2. 扩容 3. 删除元素 4. 序列化 5. Fail-Fast Vector 1. 同步 2. 扩容 3. 与 ArrayList 的比较 4. 替代方案…

服务器介绍

本文章转载与b战up主谈三国圈&#xff0c;仅用于学习讨论&#xff0c;如有侵权&#xff0c;请联系博主 机架型服务器 堆出同时服务百万人次机组 刀型服务器 服务器炸了 比如用户访问量暴增 超过机组的峰值处理能力&#xff0c;进而导致卡顿或炸服&#xff0c; 适合企业的塔式…

同样是跨端框架,React会不会被VUE取代?

看到知乎上有比较多的类似问题&#xff0c;正好这两个框架在以往的一些项目中都有实践过&#xff0c;就借着本篇文章说说我个人的看法。 先摆个结论&#xff1a;不会&#xff0c;毕竟各有千秋&#xff0c;除非跨端框架有被更好的概念所替代&#xff0c;又或者App已经彻底过气了…

Pandas进阶修炼120题-第三期(金融数据处理,51-80题)

目录 往期内容&#xff1a;第一期&#xff1a;Pandas基础&#xff08;1-20题&#xff09;第二期&#xff1a;Pandas数据处理&#xff08;21-50题&#xff09; 第三期 金融数据处理51.使用绝对路径读取本地Excel数据方法一&#xff1a;双反斜杠绝对路径方法二&#xff1a;r 拓展…

【Docker】Docker安装Kibana服务_Docker+Elasticsearch+Kibana

文章目录 1. 什么是Kibana2. Docker安装Kibana2.1. 前提2.2. 安装Kibana 点击跳转&#xff1a;Docker安装MySQL、Redis、RabbitMQ、Elasticsearch、Nacos等常见服务全套&#xff08;质量有保证&#xff0c;内容详情&#xff09; 1. 什么是Kibana Kibana 是一款适用于Elasticse…

Java三大特征之继承【超详细】

文章目录 一、继承概念二、继承的语法三、父类成员访问3.1子类中访问父类的成员变量3.2子类和父类成员变量同名3.3子类中访问父类的成员方法 四、super关键字五、子类构造方法六、super和this七、再谈初始化八、protected 关键字九、继承方式十、final 关键字十一、继承与组合 …

C++学习day--18 空指针和函数指针、引用

1、void 类型指针 void > 空类型 void* > 空类型指针&#xff0c; 只存储地址的值&#xff0c;丢失类型&#xff0c;无法访问&#xff0c;要访问其值&#xff0c;我们必须对这个指 针做出正确的类型转换&#xff0c;然后再间接引用指针 。 所有其它类型的指针都可以隐…

郑州https数字证书

很多注重隐私的网站都注重网站信息的安全&#xff0c;比如购物网站就需要对客户的账户信息以及支付信息进行安全保护&#xff0c;否则信息泄露&#xff0c;客户与网站都有损失&#xff0c;网站也会因此流失大量客户。而网站使用https证书为客户端与服务器之间传输的信息加了一个…

python学到什么程度算入门,python从入门到精通好吗

本篇文章给大家谈谈python学到什么程度算入门&#xff0c;以及python从入门到精通好吗&#xff0c;希望对各位有所帮助&#xff0c;不要忘了收藏本站喔。 学习 Python 之 进阶学习 一切皆对象 1. 变量和函数皆对象2. 模块和类皆对象3. 对象的基本操作 (1). 可以赋值给变量(2). …

保护云数据库实用指南

在数字化转型时代&#xff0c;越来越多的企业将运营转移到云端&#xff0c;导致对云数据库的依赖越来越大。虽然它们提供了可扩展性和可访问性等显着优势&#xff0c;但它们也带来了独特的安全挑战&#xff0c;需要解决这些挑战以保护敏感数据免受各种威胁。 在本文中&#x…

【MybBatis高级篇】MyBatis 拦截器

【MybBatis高级篇】MyBatis 拦截器 拦截器介绍实现拦截器注册拦截器应用ymlDynamicSqlDao 层代码xml启动类拦截器核心代码代码测试 拦截器应用场景 MyBatis 是一个流行的 Java 持久层框架&#xff0c;它提供了灵活的 SQL 映射和执行功能。有时候我们可能需要在运行时动态地修改…

超细详解,接口自动化测试-JSON和JsonPath提取数据(实战)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 JSON(JavaScript …

kafka总结

Kafka是一种高吞吐量的分布式发布订阅消息系统&#xff08;消息引擎系统&#xff09;&#xff0c;它可以处理消费者在网站中的所有动作流数据。 消息队列应用场景 缓存/削峰 :处理突然激增的大量数据&#xff0c;先放入消息队列&#xff0c;再按照速度去处理&#xff0c; 解…

Redis中的缓存雪崩、击穿、穿透的原因以及解决办法

redis的缓存 雪崩 击穿1.缓存雪崩双11访问很大,比如说redis设置缓存时间为3小时&#xff0c;当购物超过3小时之后 首页redis 在一瞬间全部失效,导致所有请求都打在db上.造成db在响应不及时直接就挂掉了 这个时候首页就不能立马对外响应服务了redis的key大面积失效 导致前端直接…

一个完整的http请求响应过程

一、 HTTP请求和响应步骤 图片来自&#xff1a;理解Http请求与响应 以上完整表示了HTTP请求和响应的7个步骤&#xff0c;下面从TCP/IP协议模型的角度来理解HTTP请求和响应如何传递的。 二、TCP/IP协议 TCP/IP协议模型&#xff08;Transmission Control Protocol/Internet Pr…

windows基础命令

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一.目录和文件的操作 1.cd 命令 切换到d盘 2.目录分为相对路径和绝对路径 3. dir命令 用于显示目录和文件列表 4. md 或 mkdir 创建目录 5. rd 用于删…

数据结构——AVL树

文章目录 一.AVL树的定义二.AVL树的插入三.插入后更新平衡因子四.AVL树的旋转1.左单旋2.右单旋3.先左单旋再右单旋4.先右单旋再左单旋 五.检查是否满足AVL树六.源码 一.AVL树的定义 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支…