机器学习笔记之优化算法(十)梯度下降法铺垫:总体介绍

news2024/11/17 3:44:52

机器学习笔记之优化算法——梯度下降法铺垫:总体介绍

引言

从本节开始,将介绍梯度下降法 ( Gradient Descent,GD ) (\text{Gradient Descent,GD}) (Gradient Descent,GD)

回顾:线搜索方法

线搜索方法作为一种常见优化问题的策略,该方法的特点是:其迭代过程中,将数值解的方向和步长分开执行。对应数学符号表达如下:

  • 其中 P k \mathcal P_k Pk是一个向量,描述更新方向; α k \alpha_k αk是一个 > 0 >0 >0的实数,表示步长。
  • 由于我们更关注向量 P k \mathcal P_k Pk的方向性,因而通常将其表示为单位向量,即 ∣ ∣ P k ∣ ∣ = 1 ||\mathcal P_k|| = 1 ∣∣Pk∣∣=1
    x k + 1 = x k + α k ⋅ P k x_{k+1} = x_k + \alpha_k \cdot \mathcal P_k xk+1=xk+αkPk

线搜索方法的方向 P k \mathcal P_k Pk

在线搜索方法——方向角度中介绍过:关于目标函数 f ( ⋅ ) f(\cdot) f()终极目标 min ⁡ X ∈ R n f ( X ) \mathop{\min}\limits_{\mathcal X \in \mathbb R^n} f(\mathcal X) XRnminf(X),如果数值解序列 { x k } k = 0 ∞ \{x_k\}_{k=0}^{\infty} {xk}k=0对应的目标函数结果 { 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+1}) < f(x_k) f(xk+1)<f(xk)
那么必然有:

  • 其中 [ ∇ f ( x k ) ] [\nabla f(x_k)] [f(xk)]表示数值解 x k x_k xk对应目标函数的梯度向量,详细推导过程见上方链接。
  • P k \mathcal P_k Pk化为单位向量产生的常数系数合并到 α k \alpha_k αk中。
    f ( x k + 1 ) − f ( x k ) ≈ [ ∇ f ( x k ) ] T P k ⋅ α k < 0 f(x_{k+1}) - f(x_k) \approx [\nabla f(x_k)]^T \mathcal P_k \cdot \alpha_k < 0 f(xk+1)f(xk)[f(xk)]TPkαk<0

从而将满足该条件的 P k \mathcal P_k Pk称作下降方向 ( Descent Direction ) (\text{Descent Direction}) (Descent Direction)。将上式展开有:

  • 其中 θ k \theta_k θk表示向量 ∇ f ( x k ) \nabla f(x_k) f(xk)与向量 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)影响的情况下,将 α k \alpha_k αk忽略,不改变不等号方向。
    ∣ ∣ ∇ f ( x k ) ∣ ∣ ⋅ ∣ ∣ P k ∣ ∣ ⋅ cos ⁡ θ k < 0 ||\nabla f(x_k)|| \cdot ||\mathcal P_k|| \cdot \cos \theta_k <0 ∣∣∇f(xk)∣∣∣∣Pk∣∣cosθk<0

其中 ∣ ∣ ∇ f ( x k ) ∣ ∣ , ∣ ∣ P k ∣ ∣ ||\nabla f(x_k)||,||\mathcal P_k|| ∣∣∇f(xk)∣∣,∣∣Pk∣∣均表示向量的(均为固定的正值),因而 cos ⁡ θ k ∈ [ − 1 , 0 ) \cos \theta_k \in [-1,0) cosθk[1,0)。当 cos ⁡ θ k = − 1 \cos \theta_k = -1 cosθk=1时, 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与梯度方向 ∇ f ( x k ) \nabla f(x_k) f(xk)方向相反。因此也称此时的 P k \mathcal P_k Pk最速下降方向
其中 ∣ ∣ ∇ f ( x k ) ∣ ∣ ||\nabla f(x_k)|| ∣∣∇f(xk)∣∣是关于上一次迭代结果 x k x_k xk的函数,因而是已知信息。
P k = − ∇ f ( x k ) \mathcal P_k = -\nabla f(x_k) Pk=f(xk)

线搜索方法的步长 α k \alpha_k αk

关于当前迭代步骤的最优步长 α k \alpha_k αk通常有两种求解方式:

  • 精确搜索:在 P k \mathcal P_k Pk固定的情况下,选择使得 f ( x k + 1 ) f(x_{k+1}) f(xk+1)达到最小的步长结果作为当前迭代步骤的最优步长
    其中 x k , P k x_k,\mathcal P_k xk,Pk是确定的信息,因此可将 f ( x k + 1 ) f(x_{k+1}) f(xk+1)视作关于 α \alpha α的函数 ϕ ( α ) \phi(\alpha) ϕ(α)
    α k = arg ⁡ min ⁡ α > 0 f ( x k + 1 ) = arg ⁡ min ⁡ α > 0 f ( x k + α ⋅ P k ) = arg ⁡ min ⁡ α > 0 ϕ ( α ) \begin{aligned}\alpha_k & = \mathop{\arg\min}\limits_{\alpha > 0} f(x_{k+1}) \\ & = \mathop{\arg\min}\limits_{\alpha > 0} f(x_k + \alpha \cdot \mathcal P_k) \\ & = \mathop{\arg\min}\limits_{\alpha > 0} \phi(\alpha) \end{aligned} αk=α>0argminf(xk+1)=α>0argminf(xk+αPk)=α>0argminϕ(α)
    具体求解方式就是: α \alpha α求导,从而获取极值。但真实情况下,这种方式并不可取
    • 关于目标函数 f ( ⋅ ) f(\cdot) f()的复杂程度我们一无所知。关于梯度 ∇ f ( x k + α ⋅ P k ) \nabla f(x_k + \alpha \cdot \mathcal P_k) f(xk+αPk)可能非常复杂。
    • 这仅仅是一次迭代步骤的解。也就是说:每次迭代都要求解精确解。这无疑增加了迭代的计算代价,我们仅希望迭代产生的步长能够收敛到 lim ⁡ k ⇒ ∞ f ( x k ) ⇒ f ∗ \mathop{\lim}\limits_{k \Rightarrow \infty}f(x_{k}) \Rightarrow f^* klimf(xk)f,它的中间过程是否准确并不在乎。
      { ∂ ϕ ( α ) ∂ α = ϕ ′ ( α ) = [ ∇ f ( x k + α ⋅ P k ) ] T P k ϕ ′ ( α ) = 0 ⇒ α k \begin{cases}\begin{aligned} & \frac{\partial \phi(\alpha)}{\partial \alpha} = \phi'(\alpha)= [\nabla f(x_k + \alpha \cdot \mathcal P_k)]^T \mathcal P_k \\ & \phi'(\alpha) = 0 \Rightarrow \alpha_k \end{aligned}\end{cases} αϕ(α)=ϕ(α)=[f(xk+αPk)]TPkϕ(α)=0αk
  • 非精确搜索:相比于精确搜索,我们不计较迭代产生的步长结果是否最优,仅需要该结果能够帮助 f ( x k ) f(x_k) f(xk)有效收敛即可:
    lim ⁡ k ⇒ ∞ f ( x k ) ⇒ f ∗ \mathop{\lim}\limits_{k \Rightarrow \infty}f(x_{k}) \Rightarrow f^* klimf(xk)f
    常见的非精确方法有: Armijo \text{Armijo} Armijo准则,对 Armijo \text{Armijo} Armijo准则进行优化的 Glodstein \text{Glodstein} Glodstein准则,以及基于 Armijo \text{Armijo} Armijo准则,对 Armijo,Glodstein \text{Armijo,Glodstein} Armijo,Glodstein准则进行优化的 Wolfe \text{Wolfe} Wolfe准则
    这里不再赘述。

梯度下降方法整体介绍

梯度下降法是一种典型的线搜索方法。并且它的更新方向 P k \mathcal P_k Pk就是最速下降方向 − ∇ f ( x k ) - \nabla f(x_k) f(xk)

  • 梯度下降法也被称作最速下降法
  • 这个最速下降方向仅仅是每一个迭代步骤中向量 x k x_k xk所在位置的最速下降方向,而不是全局最速下降方向。这与贪心算法类似,是一个局部最优。如下图:
    迭代最优方向与全局最优方向
    很明显,蓝色实线是指本次迭代步骤中的最优方向;而蓝色虚线是指全局最优方向。上图描述的是二维权重特征对应的迭代过程。如果权重特征只有一维特征(一维向量;标量),对应图像表示如下:
    一维特征梯度示例
    此时函数关于 x k x_k xk的梯度 ∇ f ( x k ) = [ f ′ ( x k ) ] 1 × 1 \nabla f(x_k) = [f'(x_k)]_{1 \times 1} f(xk)=[f(xk)]1×1,在迭代过程中寻找最优方向时,仅存在两个方向进行选择:沿着坐标轴与逆着坐标轴(红色箭头)。而此时 f ′ ( x k ) > 0 f'(x_k) >0 f(xk)>0,因而我们将数轴的正方向视作梯度方向;对应地,将数轴的反方向视作负梯度方向针对当前的斜率信息,我们沿着负梯度方向更新到 x k + 1 x_{k+1} xk+1

关于梯度下降法的步长:

  • 在后续过程中将介绍梯度下降法中如何求解精确步长,以及相应的限制条件。这里加一个传送门;

  • 关于非精确搜索求解步长,这里补充一点关于各非精确搜索方法之间的一些逻辑上的关系。

    简单认识 Wolfe Condition \text{Wolfe Condition} Wolfe Condition的收敛性证明一节中介绍了使用 Zoutendijk \text{Zoutendijk} Zoutendijk定理,验证了作用于 Wolfe \text{Wolfe} Wolfe准则的步长结果可以使 { f ( x k ) } k = 1 ∞ \{f(x_k)\}_{k=1}^{\infty} {f(xk)}k=1收敛。但实际上: Zoutendijk \text{Zoutendijk} Zoutendijk定理同样可以作用于 Armijo,Glodstein \text{Armijo,Glodstein} Armijo,Glodstein准则,并证明其步长能够使 { f ( x k ) } k = 1 ∞ \{f(x_k)\}_{k=1}^{\infty} {f(xk)}k=1收敛。

    由于 Wolfe \text{Wolfe} Wolfe准则是基于 Armijo \text{Armijo} Armijo准则提出的,其本质就是: Armijo \text{Armijo} Armijo准则的基础上,那些梯度结果 ∇ f ( x k + 1 ) \nabla f(x_{k+1}) f(xk+1)过小 ϕ ( α ) \phi(\alpha) ϕ(α)点对应的 α \alpha α通过参数 C 2 \mathcal C_2 C2消除掉了
    Armijo Condition :  { ϕ ( α ) < f ( x k ) + C 1 ⋅ [ ∇ f ( x k ) ] T P k ⋅ α C 1 ∈ ( 0 , 1 ) Wolfe Condition :  { ϕ ( α ) ≤ f ( x k ) + C 1 ⋅ [ ∇ f ( x k ) ] T P k ⋅ α ϕ ′ ( α ) ≥ C 2 ⋅ [ ∇ f ( x k ) ] T P k C 1 ∈ ( 0 , 1 ) C 2 ∈ ( C 1 , 1 ) \begin{aligned} & \text{Armijo Condition : }\begin{cases} \phi(\alpha) < f(x_k) + \mathcal C_1 \cdot [\nabla f(x_k)]^T \mathcal P_k \cdot \alpha \\ \quad \\ \mathcal C_1 \in (0,1) \end{cases} \\ & \text{Wolfe Condition : }\begin{cases} \phi(\alpha) \leq f(x_k) + \mathcal C_1 \cdot [\nabla f(x_k)]^T \mathcal P_k \cdot \alpha \\ \phi'(\alpha) \geq \mathcal C_2 \cdot [\nabla f(x_k)]^T \mathcal P_k \\ \mathcal C_1 \in (0,1) \\ \mathcal C_2 \in (\mathcal C_1,1) \end{cases} \end{aligned} Armijo Condition :  ϕ(α)<f(xk)+C1[f(xk)]TPkαC1(0,1)Wolfe Condition :  ϕ(α)f(xk)+C1[f(xk)]TPkαϕ(α)C2[f(xk)]TPkC1(0,1)C2(C1,1)
    反过来说: Armijo \text{Armijo} Armijo准则相当于 Wolfe \text{Wolfe} Wolfe准则的一种极端情况:在 C 1 \mathcal C_1 C1确定划分边界的基础上,一个 α \alpha α都不去除,即: C 2 = 1 \mathcal C_2 = 1 C2=1
    同理, Glodstein \text{Glodstein} Glodstein准则也是 Wolfe \text{Wolfe} Wolfe准则中的一种情况。与 Armijo \text{Armijo} Armijo这种极端情况不同的是, Glodstein \text{Glodstein} Glodstein准则更像是一种取巧情况:在 C 1 ∈ ( 0 , 1 2 ) \begin{aligned}\mathcal C_1 \in \left(0,\frac{1}{2} \right)\end{aligned} C1(0,21)确定划分边界的基础上,选择一个合适的 C 2 ∈ ( 1 2 , 1 ) \begin{aligned}\mathcal C_2 \in \left(\frac{1}{2},1\right)\end{aligned} C2(21,1)使得斜率分别为 C 1 ⋅ [ ∇ f ( x k ) ] T P k \mathcal C_1 \cdot [\nabla f(x_k)]^T \mathcal P_k C1[f(xk)]TPk C 2 ⋅ [ f ( x k ) ] T P k \mathcal C_2 \cdot [f(x_k)]^T \mathcal P_k C2[f(xk)]TPk的直线关于斜率为 1 2 [ ∇ f ( x k ) ] T P k \begin{aligned}\frac{1}{2} [\nabla f(x_k)]^T \mathcal P_k\end{aligned} 21[f(xk)]TPk直线对称
    因为在 C 1 ∈ ( 0 , 1 2 ) \mathcal C_1 \in \begin{aligned} \left(0,\frac{1}{2}\right)\end{aligned} C1(0,21)情况下, Wolfe \text{Wolfe} Wolfe准则关于 C 2 \mathcal C_2 C2的描述范围 ( C 1 , 1 ) (\mathcal C_1,1) (C1,1)必然大于 ( 1 2 , 1 ) \begin{aligned}\left(\frac{1}{2},1\right)\end{aligned} (21,1)。因此必然能够找到这个合适的点,从而使该点情况下 Wolfe \text{Wolfe} Wolfe准则等价于 Glodstein \text{Glodstein} Glodstein准则。

关于梯度下降法的收敛速度:相比梯度下降法的收敛性,我们更关心在已知收敛的情况下,它的收敛速度情况。在上一节中对收敛速度进行了简单认识:

  • 从收敛速度判别标准的角度划分,介绍了 Q \mathcal Q Q-收敛速度与 R \mathcal R R-收敛速度;
  • 从收敛速度强度的角度划分(以 Q \mathcal Q Q-收敛速度为例),介绍了 Q \mathcal Q Q-次线性收敛/线性收敛/超线性收敛/二次收敛

而在梯度下降法中,它的收敛速度取决于目标函数 f ( ⋅ ) f(\cdot) f()自身的性质

  • 关于目标函数 f ( ⋅ ) f(\cdot) f()的基础条件:向下有界,在定义域内可微(至少局部可微)
    如果不可微,我们甚至没有办法求解梯度,更不要说梯度的更新了。

  • 要求 f ( ⋅ ) f(\cdot) f()至少是局部凸函数,并且其梯度 ∇ f ( ⋅ ) \nabla f(\cdot) f()必然服从利普希兹连续。而利普希兹连续的作用在于:目标函数梯度 ∇ f ( ⋅ ) \nabla f(\cdot) f()变化量被常数 L \mathcal L L限制住。或者说: ∇ f ( ⋅ ) \nabla f(\cdot) f()的变化不会过于剧烈

    相反,如果不对 ∇ f ( ⋅ ) \nabla f(\cdot) f()进行约束,很容易会出现梯度爆炸。因为可能存在:目标函数梯度在某一点飙升至极大

在综上条件下,可达到次线性收敛级别的收敛速度。

在上述条件的基础上,如果 f ( ⋅ ) f(\cdot) f()是一个强凸函数 ( Strong Convex Function ) (\text{Strong Convex Function}) (Strong Convex Function),可达到线性收敛级别的收敛速度。
关于凸函数的强度性质:凸函数 < < <严格凸函数 < < <强凸函数。在后续进行介绍。传送门

在第二种条件的基础上:如果 f ( ⋅ ) f(\cdot) f()仍然是一个强凸函数,并且 f ( ⋅ ) f(\cdot) f()在其定义域内二阶可微,其对应的 Hession Matrix ∇ 2 f ( ⋅ ) \text{Hession Matrix} \nabla^2 f(\cdot) Hession Matrix2f()存在并满足:

  • 其中 L \mathcal L L依然是利普希兹连续中的具有限制作用的常数; ≼ \preccurlyeq 表示矩阵小于等于; I \mathcal I I表示单位矩阵。
  • 关于 ∣ ∣ ∇ f ( x ) − ∇ f ( y ) ∣ ∣ ∣ ∣ x − y ∣ ∣ = ∇ 2 f ( ξ ) \begin{aligned}\frac{||\nabla f(x) - \nabla f(y)||}{||x - y||} = \nabla^2 f(\xi)\end{aligned} ∣∣xy∣∣∣∣∇f(x)f(y)∣∣=2f(ξ)详见拉格朗日中值定理。
    ∀ x , y ∈ R n : ∣ ∣ ∇ f ( x ) − ∇ f ( y ) ∣ ∣ ∣ ∣ x − y ∣ ∣ = ∇ 2 f ( ξ ) ≼ L ⋅ I \forall x,y \in \mathbb R^n :\begin{aligned}\frac{||\nabla f(x) - \nabla f(y)||}{||x - y||} = \nabla^2 f(\xi) \preccurlyeq \mathcal L \cdot \mathcal I \end{aligned} x,yRn:∣∣xy∣∣∣∣∇f(x)f(y)∣∣=2f(ξ)LI

同样可以达到线性收敛级别的收敛速度。

相关参考:
【优化算法】梯度下降法-总体介绍

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

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

相关文章

vue2-组件和插件的区别

1、组件是什么&#xff1f; 组件就是把图形、非图形的各种逻辑均抽象为一个统一的概念&#xff08;组件&#xff09;来实现开发的模式&#xff0c;在vue中每一个.vue文件都可以被视为一个组件。 组件的优势&#xff1a; 降低整个系统的耦合度&#xff0c;在保持接口不变的情况下…

学C的第三十二天【动态内存管理】

相关代码gitee自取&#xff1a;C语言学习日记: 加油努力 (gitee.com) 接上期&#xff1a; 学C的第三十一天【通讯录的实现】_高高的胖子的博客-CSDN博客 1 . 为什么存在动态内存分配 学到现在认识的内存开辟方式有两种&#xff1a; 创建变量&#xff1a; int val …

ardupilot 中坐标变换矩阵和坐标系变换矩阵区别

目录 文章目录 目录摘要1.坐标变换矩阵与坐标系变换矩阵摘要 本节主要记录ardupilot 中坐标变换矩阵和坐标系变换矩阵的区别,这里非常重要,特别是进行姿态误差计算时,如果理解错误,很难搞明白后面算法。 1.坐标变换矩阵与坐标系变换矩阵 坐标变换矩阵的本质含义:是可以把…

webpack基础知识八:说说如何借助webpack来优化前端性能?

一、背景 随着前端的项目逐渐扩大&#xff0c;必然会带来的一个问题就是性能 尤其在大型复杂的项目中&#xff0c;前端业务可能因为一个小小的数据依赖&#xff0c;导致整个页面卡顿甚至奔溃 一般项目在完成后&#xff0c;会通过webpack进行打包&#xff0c;利用webpack对前…

Django实现音乐网站 ⑸

使用Python Django框架制作一个音乐网站&#xff0c; 本篇主要是配置媒体资源设置。 目录 配置介绍 设置媒体资源 创建媒体资源目录 修改settings.py 注册媒体资源路由 总结 配置介绍 静态资源是指项目配置的js/css/image等系统常用文件。对于一些经常变动的资源&#x…

华为云交付

文章目录 一、华为云-公有云架构华为公有云的主要服务1.华为云服务—计算类2.华为云服务——存储类3.华为云服务—网络类4.华为云服务—管理和监督类5.华为云数据库 二、待续 一、华为云-公有云架构 华为公有云的主要服务 ECS&#xff1a;弹性云服务器&#xff08; Elastic Cl…

Node.js爬虫只会Cheerio?来试试Puppeteer!

简介 上篇文章我们学习了如何通过 Cheerio 来爬取静态页面&#xff0c;但是我们没有办法处理动态渲染页面的数据 关于 Cheerio 的学习请查看 都 2023 年了还不会 Node.js 爬虫&#xff1f;快学起来&#xff01; 今天我们学习如何使用 Puppeteer 来轻松地完成我们解决不了的爬虫…

webpack基础知识六:说说webpack的热更新是如何做到的?原理是什么?

一、是什么 HMR全称 Hot Module Replacement&#xff0c;可以理解为模块热替换&#xff0c;指在应用程序运行过程中&#xff0c;替换、添加、删除模块&#xff0c;而无需重新刷新整个应用 例如&#xff0c;我们在应用运行过程中修改了某个模块&#xff0c;通过自动刷新会导致…

(三)Node.js - 模块化

1. Node.js中的模块化 Node.js中根据模块来源不同&#xff0c;将模块分为了3大类&#xff0c;分别是&#xff1a; 内置模块&#xff1a;内置模块由Node.js官方提供的&#xff0c;例如fs、path、http等自定义模块&#xff1a;用户创建的每个.js文件&#xff0c;都是自定义模块…

Godot 4 练习 - 制作粒子

演示项目dodge_the_creeps中&#xff0c;有一个Trail&#xff0c;具体运行效果 想要看看咋实现的&#xff0c;看完也不清晰&#xff0c;感觉是要设置某些关键的属性 ChatGPT说&#xff1a;以下是一些重要的属性&#xff1a; texture&#xff1a;用于渲染粒子的纹理。您可以使用…

windows docker部署

windows docker部署 使用 Docker Desktop for Windows安装Docker问题&#xff1a;Update the WSL kernel by running "wsl --update" or follow instructions at https://docs.microsoft.com/windows/wsl/wsl2-kernel.问题描述&#xff1a;解决办法&#xff0c;升级W…

【小沐学前端】GitBook制作在线电子书、技术文档(gitbook + Markdown + node)

文章目录 1、简介1.1 工具简介1.2 使用费用 2、安装2.1 安装node2.2 安装gitbook 3、测试3.1 编辑文档3.2 编译工程3.3 预览工程 结语 1、简介 官网地址&#xff1a; https://www.gitbook.com/1.1 工具简介 什么是 GitBook&#xff1f; GitBook 是一个现代文档平台&#xff…

微信小程序真机防盗链referer问题处理

公司使用百度云存储一些资源&#xff0c;然后现在要做防盗链&#xff0c;在CDN加入Referer白名单后发现PC是正常的&#xff0c;微信小程序无法正常访问资源了。然后是各种查啊&#xff0c;然后发现是微信小程序不支持Referer的修改&#xff0c;且在小程序开发工具是Referer是固…

WIN大恒工业相机SDK开发

大恒工业相机SDK开发概览 一、开发环境搭建1、C# 环境配置&#xff08;VS2019&#xff09;2、C 环境配置&#xff08;VS2019&#xff09;3、python 环境配置&#xff08;Pycharm&#xff09; 二、相机二次开发流程三、相机相机属性参数配置四、图像采集单帧采集回调采集 注意事…

基于边缘无线协同感知的低功耗物联网LPIOT技术:赋能智慧园区方案以及数字工厂领域

回到2000年左右&#xff0c;物联网的底层技术支撑还是“ZigBee”&#xff0c;虽然当时ZigBee的终端功耗指标其实也并不庞大&#xff0c;但是&#xff0c;“拓扑复杂导致工程实施难度大”、“网络规模小导致的整体效率低下”都成为限制其发展的主要因素。 LPWAN&#xff0c;新一…

自学(黑客)技术,入门到入狱!

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高&#xff1b; 二、则是发展相对成熟入…

【数据结构篇】手写双向链表、单向链表(超详细)

文章目录 链表1、基本介绍2、单向链表2.1 带头节点的单向链表测试类&#xff1a;链表实现类&#xff1a; 2.2 不带头节点的单向链表2.3 练习测试类&#xff1a;链表实现类&#xff1a; 3、双向链表测试类&#xff1a;双向链表实现类&#xff1a; 4、单向环形链表**测试类**&…

初级web前端开发工程师的岗位职责描述(合集)

初级web前端开发工程师的岗位职责描述1 职责&#xff1a; 1. 根据功能需求设计编写页面原型; 2. 前后端联调保证功能流畅; 3. 提高页面易用性、美观提出合理建议。 4、与后台工程师配合开发联调并交付产品; 5、持续优化前端页面体验和访问速度&#xff0c;保证页面精美高效…

命令行快捷键Mac Iterm2

原文:Jump forwards, backwards and delete a word in iTerm2 on Mac OS iTerm2并不允许你使用 ⌥← 或 ⌥→ 来跳过单词。 你也不能使用 ⌥backspace 来删除整个单词。 下面是在Mac OS上如何配置iTerm2以便能做到这一点的方法。 退格键 首先&#xff0c;你需要将你的左侧 ⌥…

kubernetes基于helm部署gitlab

kubernetes基于helm部署gitlab 这篇博文介绍如何在 Kubernetes 中使用helm部署 GitLab。 先决条件 已运行的 Kubernetes 集群负载均衡器&#xff0c;为ingress-nginx控制器提供EXTERNAL-IP&#xff0c;本示例使用metallb默认存储类&#xff0c;为gitlab pods提供持久化存储&…