深度学习优化算法

2023-05-16

深度学习各类优化器

借用古代炼丹的一些名词,我们可以把训练模型中的数据比做炼丹药材,模型比做炼丹炉,火候比做优化器。那么我们知道,同样的药材同样的炼丹炉,但是火候不一样的话,炼出来的丹药千差万别,同样的对于深度学习中训练模型而言,有时候模型性能不好,也许不是数据或者模型本身的原因,而是优化器的原因。由此可见优化器对于深度学习来说是多么重要了,那么今天小编就带大家了解一些常见的优化器。

优化算法设计原理

深度学习中的优化算法采用的原理是梯度下降法,即最小化目标函数 J ( θ ) J(\theta) J(θ),最优化的求解过程,首先求解目标函数的梯度 ∇ J ( θ ) \nabla J(\theta) J(θ),然后将参数 θ \theta θ 向负梯度方向更新, θ t = θ t − 1 − η ∇ J ( θ ) \theta_{t}=\theta_{t-1}-\eta\nabla J(\theta) θt=θt1ηJ(θ) η \eta η 为学习率,表明梯度更新的步伐的大小,最优化的过程依赖的算法称为优化器,可以看出深度学习优化器的两个核心是梯度与学习率,前者决定参数更新的方向,后者决定参数的更新程度。

我们定义 θ \theta θ 为待优化的参数, J ( θ ) J(\theta) J(θ) 为目标函数,初始学习率为 η \eta η。再进行一次梯度下降过程中优化算法的执行框架如下:

1、计算目标函数关于当前参数的梯度:

g t = ∇ J ( θ t ) g_t = \nabla J(\theta_t) gt=J(θt)

2、根据需要计算历史梯度的一阶和二阶动量:

m t = ϕ ( g 1 , g 2 , ⋅ ⋅ ⋅ , g t ) m_t = \phi(g_1, g_2,···,g_t) mt=ϕ(g1,g2,,gt)

V t = ψ ( g 1 , g 2 , ⋅ ⋅ ⋅ , g t ) V_t = \psi(g_1, g_2,···,g_t) Vt=ψ(g1,g2,,gt)

3、计算当前时刻的下降梯度:

p = η ∗ m t / V t ( 自 适 应 优 化 器 ) p = \eta * m_t / \sqrt{V_t}(自适应优化器) p=ηmt/Vt ()

p = η ∗ g t ( 非 自 适 应 优 化 器 ) p = \eta * g_t(非自适应优化器) p=ηgt()

4、进行梯度下降更新

θ t + 1 = θ t − p \theta_{t+1} = \theta_t - p θt+1=θtp

对于各种优化器而言,步骤 3 3 3 和步骤 4 4 4 都是一样的,主要差别是体现在步骤 1 1 1 和步骤 2 2 2,下面我们就来具体讲解这些优化器的设计思路。

非自适应优化器

在优化过程中,学习率全程不变,或者按照一定的 l e a r n i n g learning learning s c h e d u l e schedule schedule 随时间变化,称之为非自适应优化器,这类包括最常见的 S G D SGD SGD(随机梯度下降法),带 M o m e n t u m Momentum Momentum S G D SGD SGD、带 N e s t e r o v Nesterov Nesterov S G D SGD SGD 等。

1、 B G D BGD BGD( B a t c h Batch Batch g r a d i e n t gradient gradient d e s c e n t descent descent)

其梯度更新公式为:

θ = θ − η ∗ ∇ θ J ( θ ) \theta = \theta - \eta * \nabla_{\theta} J(\theta) θ=θηθJ(θ)

B G D BGD BGD 在每次更新梯度的时候,采用整个训练集的数据来计算 l o s s loss loss 对参数的梯度,所以计算起来非常慢,遇到很大量的数据集也会非常棘手,而且不能投入新数据实时更新模型。

2、 S G D SGD SGD 随机梯度下降法( S t o c h a s t i c Stochastic Stochastic g r a d i e n t gradient gradient d e s c e n t descent descent)

其梯度更新公式和 B G D BGD BGD 类似。

S G D SGD SGD 的梯度下降过程,类似于一个小球从山坡上滚下,它的前进方向只于当前山坡的最大倾斜方向一致(最大负梯度方向),每一个时刻的初速度为 0。梯度更新规则为: 每次更新时对一个 b a t c h batch batch 内每个样本进行梯度更新,这样使得网络更新参数速度很快。但是其缺点也很明显,因为 S G D SGD SGD 更新梯度非常频繁,会造成 c o s t cost cost f u n c t i o n function function 会有严重的震荡,有可能在全局最小值处来回震荡跳出全局最优值。

3、 M B G D MBGD MBGD( M i n i − b a t c h Mini-batch Minibatch g r a d i e n t gradient gradient d e s c e n t descent descent)

其实我们更多时候把 M B G D MBGD MBGD 称之为 S G D SGD SGD,其梯度更新公式和 B G D BGD BGD 类似。梯度更新规则为: M B G D MBGD MBGD 每一次利用一个 b a t c h batch batch 样本,即 n n n 个样本进行计算,这样它可以降低参数更新时的方差,收敛更稳定,另一方面可以充分地利用深度学习库中高度优化的矩阵操作来进行更有效的梯度计算。和 2 2 2 S G D SGD SGD 的区别是每一次循环梯度更新的时候不是使用每个样本,而是一个 b a t c h batch batch 内的 n n n 个样本。在下面文章中提到的 S G D SGD SGD 就指代这里的 M B G D MBGD MBGD

在这里插入图片描述

优点:

1、虽然看起来在更新过程中 M S G D MSGD MSGD c o s t cost cost f u n c t i o n function function 波动非常大,会走很多弯路,但是对梯度的要求很低(计算梯度快),而且对于引入噪声,大量的理论和实践工作证明,只要噪声不是特别大, M S G D MSGD MSGD 都能很好地收敛。

2、应用大型数据集时,训练速度很快。比如每次从百万数据样本中,取几百个数据点,算一个 M S G D MSGD MSGD 梯度,更新一下模型参数。相比于标准梯度下降法的遍历全部样本,每输入一个样本更新一次参数,要快得多。

缺点:

1、不能保证很好的收敛性; m i n i mini mini- b a t c h batch batch 每次仅使用数据集中的一部分进行梯度下降,所以每次下降并不是严格按照朝最小方向下降,只是总体下降趋势是朝着最小方向,极度容易陷于局部最小值。

2、 l r lr lr 如果太小,收敛速度会很慢,如果太大, l o s s loss loss f u n c t i o n function function 就会在极小值处不停地震荡甚至偏离。(有一种措施是先设定大一点的学习率,当两次迭代之间的变化低于某个阈值后,就减小 l e a r n i n g learning learning r a t e rate rate,不过这个阈值的设定需要提前写好,但这样的话就不能够适应数据集的特点)。

3、对于非凸函数,还要避免陷于局部极小值处,或者鞍点处,因为鞍点周围的梯度都接近于 0 0 0 M S G D MSGD MSGD 很容易被困在这里。在这里解释一下鞍点就是:一个光滑函数的鞍点邻域的曲线,曲面,或超曲面,都位于这点的切线的不同边。如下图 2 2 2 所示。

图  鞍点示意图

4、 S G D M SGDM SGDM(带有 M o m e n t u m Momentum Momentum 动量的 S G D SGD SGD)

为了解决在上面的优化算法中容易出现的问题, S G D M SGDM SGDM 应用而生,在原有的 S G D SGD SGD 上加入了一阶动量,从直观理解就是加入了一个惯性,在坡度比较陡的地方,会有较大的惯性,下降的就会比较快;坡度平缓的地方,惯性较小,下降的会比较慢。

其梯度更新公式为:

v t = γ v t − 1 + η ∇ θ J ( θ ) v_t = \gamma v_{t-1} + \eta \nabla_{\theta}J(\theta) vt=γvt1+ηθJ(θ)

θ = θ − v t \theta = \theta - v_t θ=θvt

S G D M SGDM SGDM 通过加入 g a m m a v t − 1 gamma v_{t-1} gammavt1,将其定义为动量, γ \gamma γ 常用的值为 0.9 0.9 0.9。使用动量后在梯度下降过程中可以使得梯度方向不变的方向上下降速度变快,梯度方向有所改变的方向上的下降速度变慢。在这里我们举一个比较贴近的例子:在原本的梯度下降中一直朝着一个方向去下降,而当遇到山沟的时候(也就是一个拐点),越过山沟此时就在另一边山坡,这个时候梯度方向是跟之前相反的,此时由于之前梯度大小的累加,在两个山坡间的变化就会被互相抵消掉,也就不会一直在两个山坡振荡,容易朝山沟向下走,也就是会减少震荡。 S G D M SGDM SGDM 的梯度更新时的状态如下图 3 3 3 所示,和图 1 1 1 相比,震荡明显减少。

图   更新时的梯度变化

5、 N A G NAG NAG( N e s t e r o v Nesterov Nesterov a c c e l e r a t e d accelerated accelerated g r a d i e n t gradient gradient)

上面介绍的 S G D M SGDM SGDM 的每下降一步都是由前面下降方向的一个累积和当前点的梯度方向组合而成,但当刚好下降到拐点附近时,如果这个时候继续以这样的方式更新参数,我们会有一个较大的幅度越过拐点,即:模型遇到拐点不会自动减弱更新的幅度。NAG 针对上述问题对动量方法进行了改进,其表达式如下:

v t = γ v t − 1 + η ∇ θ J ( θ − γ v t − 1 ) v_t = \gamma v_{t-1} + \eta \nabla_{\theta}J(\theta-\gamma v_{t-1}) vt=γvt1+ηθJ(θγvt1)

θ = θ − v t \theta = \theta - v_t θ=θvt

N A G NAG NAG 利用当前位置处先前的梯度值先做一个参数更新,然后在更新后的位置再求梯度,将此部分梯度跟之前累积下来的梯度值矢量相加,简单的说就是先根据之前累积的梯度方向模拟下一步参数更新后的值,然后将模拟后的位置处梯度替换动量方法中的当前位置梯度。那么这种方式为什么解决了之前说的那个问题呢?因为 N A G NAG NAG 有一个预测后一步位置梯度的步骤,所以当下降到拐点附近时, N A G NAG NAG 预测到会跨过拐点,该项梯度就会对之前梯度有个修正,相当于阻止了其跨度太大。

图

如上图 4 4 4 所示,我们举个例子来简单示意一下 N A G NAG NAG 的更新原理,其中蓝色线表示 S G D M SGDM SGDM方法,蓝色短线表示当前位置梯度更新,蓝色长线表示之前累积的梯度;第一个红色线表示用 N A G NAG NAG 算法预测下一步位置的梯度更新,第一条棕色线表示先前累积的梯度,其矢量相加结果(绿色线)就是参数更新的方向。 N A G NAG NAG 在更新梯度时的状态图如下图 5 5 5 所示,从图中可以看出,相对于 S G D M SGDM SGDM S G D SGD SGD N A G NAG NAG 表现出来的性能更好。

图   更新时的梯度变化

自适应优化器

在优化过程中,学习率随着梯度自适应的变化,并尽可能去消除给定的全局学习率的影响,叫做自适应优化器,常见的包括 A d a g r a d Adagrad Adagrad A d a d e l t a Adadelta Adadelta R M S p r o p RMSprop RMSprop A d a m Adam Adam 等。

1、 A d a g r a d Adagrad Adagrad

A d a g r a d Adagrad Adagrad 其实是对学习率进行了一个约束,对于经常更新的参数,我们已经积累了大量关于它的知识,不希望被单个样本影响太大,希望学习速率慢一些;对于偶尔更新的参数,我们了解的信息太少,希望能从每个偶然出现的样本身上多学一些,即学习速率大一些。而该方法中开始使用二阶动量,意味着“自适应学习率”优化算法时代的到来。

在这里我们说明一下二阶动量 V t V_t Vt 的定义:它是用来度量参数历史更新频率的,二阶动量是迄今为止所有梯度值的平方和。 A d a g r a d Adagrad Adagrad 的表达式为:

m t = g t m_t = g_t mt=gt

V t = ∑ i = 1 t g i 2 V_t = \sum_{i=1}^{t}{g_i}^2 Vt=i=1tgi2

θ t + 1 = θ t − η m t V t \theta_{t+1} = \theta_t - \eta \frac{m_t}{\sqrt{V_t}} θt+1=θtηVt mt

其中 g t g_t gt t t t 时刻参数梯度,下面来讲解为什么 a d a g r a d adagrad adagrad 可以实现不同频率特征对其参数学习率改变。首先,我们看到二阶动量 V t V_t Vt,它是梯度平方累加和,对于训练数据少的特征,自然对应的参数更新就缓慢,也就是说他们的梯度变化平方累加和就会比较小,所以对应于上面参数更新方程中的学习速率就会变大,因而对于某个特征数据集少,相应参数更新速度就快。为了防止上述分母为 0 0 0,所以往往添加一个平滑项参数 ϵ \epsilon ϵ,参数更新方程也就变成:

θ t + 1 = θ t − η m t V t + ϵ \theta_{t+1} = \theta_t - \eta \frac{m_t}{\sqrt{V_t+\epsilon}} θt+1=θtηVt+ϵ mt

但是 a d a g r a d adagrad adagrad 同样也有问题,就是其分母随着训练数增加,也会跟着增加,这样会导致学习速率越来越小,最终无限接近于 0 0 0,从而无法有效更新参数。

2、 A d a d e l t a Adadelta Adadelta

针对于 A d a g r a d Adagrad Adagrad 的缺点, A d a d e l t a Adadelta Adadelta 对二阶动量 V t V_t Vt 进行了改进,和 A d a g r a d Adagrad Adagrad 相比,就是分母换成了过去的梯度平方的衰减平均值,这个分母相当于梯度的均方根值 R M S RMS RMS( r o o t root root m e a n mean mean s q u a r e d squared squared)。其表达式如下:

m t = g t m_t = g_t mt=gt

V g , t = γ V g , t − 1 + ( 1 − γ ) g t 2 V_{g,t} = \gamma V_{g,t-1} + (1-\gamma){g_t}^2 Vg,t=γVg,t1+(1γ)gt2

V Δ θ , t = γ V Δ θ , t − 1 + ( 1 − γ ) Δ θ t 2 V_{\Delta \theta,t} = \gamma V_{\Delta \theta,t-1} + (1-\gamma){\Delta \theta_t}^2 VΔθ,t=γVΔθ,t1+(1γ)Δθt2

R M S [ g ] t = V g , t + ϵ RMS[g]_t = \sqrt{V_{g,t}+\epsilon} RMS[g]t=Vg,t+ϵ

R M S [ Δ θ ] t = V Δ θ , t + ϵ RMS[\Delta \theta]_t = \sqrt{V_{\Delta \theta,t}+\epsilon} RMS[Δθ]t=VΔθ,t+ϵ

θ t + 1 = θ t − R M S [ Δ θ ] t − 1 R M S [ g ] t m t \theta_{t+1} = \theta_{t} - \frac{RMS[\Delta \theta]_{t-1}}{RMS[g]_t}m_t θt+1=θtRMS[g]tRMS[Δθ]t1mt

其中对梯度的二阶动量变化为 R M S [ g ] t RMS[g]_t RMS[g]t;对变量的变化量的二阶动量为 R M S [ Δ θ ] t RMS[\Delta \theta]_t RMS[Δθ]t,并使用其将其替换学习率。通过 a d a d e l t a adadelta adadelta 优化算法,我们甚至可以不需要设置一个默认的学习率,因为在新的规则中已经移除了这项。

3、 R M S p r o p RMSprop RMSprop

R M S p r o p RMSprop RMSprop A d a d e l t a Adadelta Adadelta 都是为了解决 A d a g r a d Adagrad Adagrad 学习率急剧下降问题而被提出来的。 R M S p r o p RMSprop RMSprop A d a d e l t a Adadelta Adadelta 的计算公式非常相似,只不过在相同的时间内被独立的提出,其表达式为:

m t = g t m_t = g_t mt=gt

V t = γ V t − 1 + ( 1 − γ ) g t 2 V_t = \gamma V_{t-1} + (1-\gamma){g_t}^2 Vt=γVt1+(1γ)gt2

θ t + 1 = θ t − η m t V t + ϵ \theta_{t+1} = \theta_{t} - \eta \frac{m_t}{\sqrt{V_t + \epsilon}} θt+1=θtηVt+ϵ mt

由此可以看出, R M S p r o p RMSprop RMSprop 还需要自己手动设置一个初始的学习率 η \eta η。作者建议将 ϵ \epsilon ϵ 设置为 0.9,学习率 η \eta η 设置为 0.001。

4、 A d a m Adam Adam( A d a p t i v e Adaptive Adaptive M o m e n t Moment Moment E s t i m a t i o n Estimation Estimation)

A d a m Adam Adam 算法是另一种计算每个参数的自适应学习率的方法。它是一种将动量 M o m e n t u m Momentum Momentum R M S p r o p RMSprop RMSprop 结合起来的办法方法,同时引入了两个参数 β 1 \beta_1 β1 β 2 \beta_2 β2,其表达式为:

m t = β 1 m t − 1 + ( 1 − β 1 ) g t ( 一 阶 动 量 ) m_t = \beta_1m_{t-1} + (1-\beta_1)g_t(一阶动量) mt=β1mt1+(1β1)gt()

V t = β 2 V t − 1 + ( 1 − β 2 ) g t 2 ( 二 阶 动 量 ) V_t = \beta_2V_{t-1} + (1-\beta_2){g_t}^2(二阶动量) Vt=β2Vt1+(1β2)gt2()

m ~ t = m t 1 − β 1 t \tilde{m}_t = \frac{m_t}{1-\beta_1^t} m~t=1β1tmt

V ~ t = V t 1 − β 2 t \tilde{V}_t = \frac{V_t}{1-\beta_2^t} V~t=1β2tVt

θ t + 1 = θ − η m ~ t V ~ t + ϵ \theta_{t+1} = \theta - \eta \frac{\tilde{m}_t}{\sqrt{\tilde{V}_t + \epsilon}} θt+1=θηV~t+ϵ m~t

其中 β 1 \beta_1 β1 默认值为 0.9 0.9 0.9 β 2 \beta_2 β2 默认值为 0.999 0.999 0.999, ϵ \epsilon ϵ 1 0 − 8 10^{-8} 108 A d a m Adam Adam 集合了动量和 R M S p r o p RMSprop RMSprop 两者的优点,从经验中表明 A d a m Adam Adam 在实际中表现很好,同时与其他自适应学习算法相比,更有优势。

总结

我们来看一下上面几种优化算法在鞍点和等高线上的表现:

在这里插入图片描述
在这里插入图片描述

从图 6 和图 7 都可以看出, A d a g r a d Adagrad Adagrad A d a d e l t a Adadelta Adadelta R M S p r o p RMSprop RMSprop 几乎很快就找到了正确的方向并前进,收敛速度也相当快,而其它方法要么很慢,要么走了很多弯路才找到。

关于优化器如何选择的问题上,小编也综合网上的办法给出以下建议:

1、首先,各大算法孰优孰劣并无定论。如果是刚入门,优先考虑 S G D SGD SGD+ N e s t e r o v Nesterov Nesterov M o m e n t u m Momentum Momentum 或者 A d a m Adam Adam

2、 A d a m Adam Adam 等自适应学习率算法对于稀疏数据具有优势,且收敛速度很快;但精调参数的 S G D M SGDM SGDM 往往能够取得更好的最终结果。

3、根据你的需求来选择——在模型设计实验过程中,要快速验证新模型的效果,可以先用 A d a m Adam Adam 进行快速实验优化;在模型上线或者结果发布前,可以用精调的 S G D SGD SGD 系列优化算法进行模型的极致优化。

4、考虑不同算法的组合。先用 A d a m Adam Adam 进行快速下降,而后再换到 S G D SGD SGD 系列优化算法进行充分的调优。

引用

  • https://www.jianshu.com/p/a63858bcf455
  • https://www.cnblogs.com/guoyaohua/p/8542554.html
  • https://blog.csdn.net/u013385018/article/details/92377371
  • https://blog.csdn.net/qq_42109740/article/details/105401197
  • https://blog.csdn.net/tsyccnh/article/details/76673073
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深度学习优化算法 的相关文章

  • Kafka,ZK集群开发或部署环境搭建及实验

    本文属于原创 xff0c 转载注明出处 xff0c 欢迎关注微信小程序小白AI博客 微信公众号小白AI或者网站 https xiaobaiai net 或者我的CSDN http blog csdn net freeape 文章目录 1 前
  • Spring Boot 基于Spring Integration 实现MQTT客户端简单订阅发布功能

    本文属于翻译 xff0c 转载注明出处 xff0c 欢迎关注微信小程序小白AI博客 微信公众号小白AI或者网站 https xiaobaiai net TOC 1 简介 Spring Integration 提供入站 inbound 和出站
  • php 获取今天开始的时间戳

    一天86400秒 time 61 time date 61 date 39 Y m d 39 time 今天的年月日 startTime 61 strtotime date 39 Y m d 39 time 今天开始时间的时间戳 endTi
  • Spring Boot Kafka概览、配置及优雅地实现发布订阅

    本文属于原创 xff0c 转载注明出处 xff0c 欢迎关注微信小程序小白AI博客 微信公众号小白AI或者网站 https xiaobaiai net 文章目录 1 前言2 Spring Kafka功能概览2 1 自动创建主题2 2 发送消
  • An Ota Package Tool

    文章目录 OtaPackageToolInstallationBinary InstallationInstalling Tool from Source UsagePreparationExamplesFull UpdatesIncrem
  • [开源]OTA打包工具

    文章目录 OTA打包工具 96 ota packer 96 安装二进制安装源码编译安装 使用准备示例全量包增量包生成关于OTA包版本之间文件变更类型说明 96 ota packer 96 使用条件License OTA打包工具 ota pa
  • [golang]包管理

    文章目录 1 GOPATH vs Go Modules2 Go Modules Go Module Proxy 和 goproxy cn3 Go Modules 相关知识3 1 语义化版本控制规范3 2 go mod3 3 go sum3
  • 【名名的Bazel笔记】自定义规则实现将多个静态库合并为一个动态库或静态库

    文章目录 1 前言2 自定义规则实现2 1 规则功能2 2 实现规则的理论基础2 3 规则代码实现 3 总结4 参考资料 1 前言 为了实现如标题所述的将多个静态库合并为一个动态库 xff0c 内置的 Bazel 规则是没有这个功能的 xf
  • 【名名的Bazel笔记】自定义工具链实现交叉编译

    文章目录 1 前言2 Non Platform 方式3 Platform 方式3 1 平台3 1 1 概述3 1 2 定义约束和平台3 1 3 通用的约束和平台3 1 4 指定平台构建 3 2 工具链3 3 Platform 43 Tool
  • PX4/Pixhawk---uORB深入理解和应用

    The Instructions of uORB PX4 Pixhawk 软件体系结构 uORB 主题发布 主题订阅 1 简介 1 1 PX4 Pixhawk的软件体系结构 PX4 Pixhawk的软件体系结构主要被分为四个层次 xff0c
  • join函数

    Python中我们经常会用到join函数 join函数的基本格式是 xff1a span class token string 39 39 span span class token punctuation span join span c
  • Glance详解

    Glance简介 Glance是OpenStack平台中负责镜像服务的组件 xff0c 其功能包括系统镜像的查找 注册和获取等 简单来说glance的功能就是用户可以通过其提供的REST API查询和获取镜像元数据 xff0c 通过Glan
  • 深入理解k8s中的service概念

    文章目录 service的概念kube proxy的作用kube proxy的三种模式Userspace Proxy ModeIptables Proxy ModeIPVS proxy mode service的概念 在k8s集群中 xff
  • Java_Save could not be completed. Try File> Save As. if the problem persists.

    所以最好不要用 开头的符号作为变量名 xff0c 变量名中含有一些奇怪的字符也会产生编码问题
  • Cinder详解

    文章目录 理解cindercinder架构cinder apicinder volumecinder schedulervolume providercinder DB cinder设计思想 理解cinder 操作系统得到存储空间一般有两种
  • shell:重启&&关机

    文章目录 shutdownhaltpoweroffrebootinitsync shutdown 关机重启命令 shutdown h 10十分钟后关机shutdown h 0马上关机shutdown h now马上关机shutdown c取
  • 基于docker的Jenkins-Gitlab-Ansible实现自动化部署

    环境准备 安装docker xff0c 略 拉取Jenkins Gitlab镜像 docker pull jenkins docker pull gitlab ce 部署 Jenkins 生成Jenkins span class token
  • SSH远程登录出现的常见问题与解决方法

    运维工程师经常会使用ssh远程登录主机 ssh的使用并不复杂 xff0c 但是也有可能会遇到各种各样的错误 xff0c 我在本篇博文中总结了一些常见的ssh报错信息与解决方法 Connection refused 可能原因 xff1a 网络
  • 从两个角度理解Kubernetes基本概念

    想要理解Kubernetes集群首先要思考两个问题 xff1a 它是由什么组成的 它是怎样工作的 而想要搞清楚这两个问题我们可以在两个不同的层面寻找答案 从物理层面看 从直观的层面来看 xff0c Kubernetes将多个物理机或虚拟机汇

随机推荐

  • 基于CentOS 7.6搭建Kubernetes 1.17.3集群demo

    本demo仅涉及基本的Kubernetes功能实践与介绍 xff0c 无高可用配置 部署版本为当前时间阿里开源镜像站提供的最新版本1 17 3 文章目录 部署环境安装准备域名解析关闭SELinux和防火墙配置yum源时间同步禁用swap加载
  • 为Kubernetes部署dashboard组件

    dashboard是Kubernetes社区中一个很受欢迎的开源项目 xff0c 它可以为使用者提供一个可视化web界面来进行Kubernetes的管理和使用 环境信息 组件版本Kubernetesv1 17 3dashboardv2 0
  • linux UIO驱动实践

    linux UIO驱动实践 环境搭建platform 设备驱动UIO驱动 环境搭建 Ubuntu20地址 虚拟机安装与配置见博客开头 xff1a 驱动虚拟环境搭建记录 一直以为用镜像直接安装的Ubuntu没有内核源码 xff0c 不能用来编
  • STM32F429+FreeRTOS队列 串口DMA双缓存数据接收

    前言 最近做项目需要用到数据大量数据处理的应用场景 xff0c 本来想使用串口空闲中断 43 DMA传输 43 FreeRTOS队列的方式接收数据 xff0c 然而实际使用中发现效果不理想 xff0c 经常丢包 最后查明原因为在空闲中断频繁
  • 世界上最经典的25句话

    1 记住该记住的 xff0c 忘记该忘记的 改变能改变的 xff0c 接受不能改变的 2 能冲刷一切的除了眼泪 xff0c 就是时间 xff0c 以时间来推移感情 xff0c 时间越长 xff0c 冲突越淡 xff0c 仿佛不断稀释的茶 3
  • Makefile详解——从入门到精通

    转自ChinaUnix xff0c 作者gunguymadman xff0c 陈皓 链接地址 xff1a http www chinaunix net jh 23 408225 html 陈皓 CSDN 博客 xff1a http blog
  • FreeRTOS事件标志组与事件标志位使用

    事件标志位 事件位用于指示事件是否发生 也叫做事件标志位 可用位表示 xff1a 当信息收到且准备好处理时 xff0c 设置为1 xff1b 当没有收到信息且等待处理时 xff0c 设置为0 事件标志组 事件标志组是一组事件位 xff0c
  • 结合图片看常用串口通信UART

    结合图片看常用串口通信UART UART是一种通用串行数据总线 xff0c 用于异步通信 该总线双向通信 xff0c 可以实现全双工传输和接收 在嵌入式设计中 xff0c UART用于主机与辅助设备通信 xff0c 如汽车音响与外接AP之间
  • 浅谈面向对象设计思想,以及在Linux内核中的体现

    面向对象编程 xff08 OOP xff09 xff0c 是一种设计思想或者架构风格 OO语言之父Alan Kay xff0c Smalltalk的发明人 xff0c 在谈到OOP时是这样说的 xff1a OOP应该体现一种网状结构 xff
  • STM32F4移植FreeRTOS

    在之前的文章 xff1a FreeRTOS全解析 2 源码结构与移植 中我们已经讲解过FreeRTOS移植的方法 xff0c 并且给出了一个在ARM9上移植的例子 xff0c 今天再来看一个例子 xff1a 板子的芯片为STM32F407
  • 彻底掌握FreeRTOS中的任务

    FreeRTOS是个操作系统 xff0c FreeRTOS的任务 task 其实就是像我们电脑中的一个独立程序 xff0c 表现在源码中 xff0c 其实就是一个函数 本文从学会使用任务 task 到理解逐步深入 参考资料 xff1a Ma
  • FreeRTOS任务之调度器中的三种调度算法

    本文主要讲解FreeRTOS调度器中的三种调度算法 xff1a 基于时间片的抢占式调度 不带时间片的抢占式调度和协同调度 前导文章 xff1a FreeRTOS全解析 3 任务 xff08 task xff09 参考资料 xff1a Mas
  • 彻底理解FreeRTOS中的队列(Queue)

    队列 xff08 Queue xff09 提供了任务与任务之间通信的机制 在这样的场景 xff1a 一个或多个其他的任务产生数据 xff0c 主任务要依次处理数据 xff0c 队列就显得非常有用了 参考资料 xff1a Mastering
  • 简单路由器DIY

    一 关于路由器 路由器 xff08 Route xff09 是一种负责寻径的系统 xff0c 在互连网络中从多条路径中寻找通讯量最少的一条网络路径提供给用户通信 它使用寻径协议来获得网络信息 xff0c 采用基于 34 寻径矩阵 34 的寻
  • DOS那一代的程序员现在都干嘛呢?

    亿友论坛 DOS那一代的程序员现在都干嘛呢 xff1f xff08 几年前的老帖子 xff09 作者 xff1a 包子夹蛋 发布时间 xff1a 2005 5 10 14 01 00 DOS那一代的程序员现在都干嘛呢 xff1f xff08
  • switch case的用法

    switch case的用法如下 1 Switch用在编程中 xff0c 如C语言中它经常跟Case一起使用 xff0c 是一个判断选择代码 其功能就是控制流程流转的 直线翻译 xff1a switch语句 xff0c 即 切换 语句 xf
  • Rust嵌入式:只使用寄存器为STM32点灯;从查手册开始

    为什么是 只使用寄存器 网上很多教程都是直接调用对应芯片的HAL库 xff0c 让初学者认为操作都被Rust嵌入式开源组封装好了 xff0c 直接调就好 这在目前Rust嵌入式生态还不成熟的情况下可能是个误解 实际上Rust嵌入式有自己独特
  • epoll_wait 中timeout参数的损耗和如何避免

    ccd 100qps xff0c dcc 4wqps
  • ubuntu和windows双系统默认启动顺序

    在安装了双系统后 xff0c 一般的默认启动ubuntu xff0c 但我实际可能使用windows会比较多 xff0c 为解决这个问题 xff0c 必须要更改默认顺序 xff0c 以达到方便我们使用的效果 方法 xff1a 开机界面会有显
  • 深度学习优化算法

    深度学习各类优化器 借用古代炼丹的一些名词 xff0c 我们可以把训练模型中的数据比做炼丹药材 xff0c 模型比做炼丹炉 xff0c 火候比做优化器 那么我们知道 xff0c 同样的药材同样的炼丹炉 xff0c 但是火候不一样的话 xff