深入理解神经网络学习率(定义、影响因素、常见调参方法、关键代码实现)

news2024/11/28 10:36:32

目录

什么是学习率?

有哪些影响因素?

常用调整方法?


博主介绍:✌专注于前后端、机器学习、人工智能应用领域开发的优质创作者、秉着互联网精神开源贡献精神,答疑解惑、坚持优质作品共享。本人是掘金/腾讯云/阿里云等平台优质作者、擅长前后端项目开发和毕业项目实战,深受全网粉丝喜爱与支持✌有需要可以联系作者我哦!

🍅文末三连哦🍅

👇🏻 精彩专栏推荐订阅👇🏻 不然下次找不到哟

一、什么是学习率?

深度学习中的学习率(Learning Rate)是一个至关重要的超参数,它决定了模型在训练过程中更新权重参数的速度与方向。在使用梯度下降法(Gradient Descent)或其变种(如随机梯度下降,Stochastic Gradient Descent, SGD)优化模型时,学习率扮演着核心角色。

具体来说,在每次迭代过程中,模型计算损失函数关于各个参数的梯度,这个梯度指示了参数应当朝着哪个方向调整以最小化损失。学习率就是这个调整过程中的“步伐”大小,即参数更新的量。数学表达式通常是这样的:

w_{t+1} = w_t - \eta \cdot \nabla_w J(w_t)

其中:
w_t是在时间步 t 时模型的参数。
\eta是学习率。
\nabla_w J(w_t)是在当前参数下损失函数J 关于参数w的梯度。

如果学习率设置得过大,那么在每一步迭代中,模型参数可能会跨过最优解,导致震荡或者发散,这被称为“振荡现象”或“不稳定性”。相反,如果学习率设置得太小,模型收敛到最优解的速度将会非常慢,而且可能会陷入局部极小点,而不是全局最优解。

二、有哪些常见的影响因素?

  1. 问题的复杂度:问题的复杂度反映了模型在训练过程中需要调整的参数数量和模型的复杂度。通常情况下,更复杂的问题需要更小的学习率来确保模型的稳定性和收敛性。

  2. 数据集的大小:数据集的大小直接影响了模型训练的稳定性和泛化能力。对于较大的数据集,通常可以使用较大的学习率来加快收敛速度;而对于较小的数据集,则需要使用较小的学习率以避免过拟合。

  3. 学习率的初始值:学习率的初始值对模型的训练过程和性能有重要影响。选择合适的初始学习率是一个关键的调参过程,通常需要进行实验和调整来找到最佳的初始学习率。

  4. 优化算法的选择:不同的优化算法对学习率的敏感度不同。一些优化算法(如Adam、Adagrad等)具有自适应学习率调整的能力,可以在训练过程中动态地调整学习率,而另一些算法(如SGD)则需要手动调整学习率。

  5. 学习率衰减策略:学习率衰减策略决定了学习率在训练过程中的变化方式。合适的学习率衰减策略可以提高模型的训练稳定性和泛化能力,对于长时间的训练任务尤为重要。

  6. 初始参数值:初始参数值对于模型的训练过程和学习率的选择也有影响。不同的初始参数值可能会导致模型在训练过程中出现不同的收敛速度和性能。

  7. 训练数据的分布:训练数据的分布对模型的训练过程和学习率的选择有直接影响。如果训练数据是非平稳的或者存在类别不平衡的情况,可能需要采用不同的学习率调整策略来保证模型的训练效果。

  8. 模型架构的选择:不同的模型架构对于学习率的选择和训练过程的稳定性有不同的要求。一些复杂的模型架构可能需要更小的学习率和更复杂的优化算法来进行训练。

三、常用调整方法?

1、固定学习率

这是最简单的学习率调整方法,即在整个训练过程中保持学习率不变。这种方法的优点是简单直观,但缺点是可能无法很好地适应不同阶段的训练过程,导致训练过程不稳定或收敛速度过慢。 如0.1、0.01、0.001等。

2. 学习率衰减(Learning Rate Decay)


学习率衰减是一种常用的学习率调整方法,它随着训练的进行逐渐减小学习率,以提高模型训练的稳定性和泛化能力。常见的学习率衰减方法包括:

指数衰减(Exponential Decay):学习率按指数函数衰减,如 $\alpha = \alpha_0 \times e^{-kt}$,其中 $\alpha_0$是初始学习率,$k$是衰减率,$t$是训练的迭代次数。

initial_learning_rate = 0.1
gamma = 0.95  # 衰减率
decay_steps = 100  # 每多少步衰减一次
learning_rate = initial_learning_rate * gamma ** (step / decay_steps)

# 或者在PyTorch中使用内置scheduler
scheduler = torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma=gamma)

余弦衰减(Cosine Decay):学习率按余弦函数衰减,即 $\alpha = \alpha_0 \times (1 + \cos(\frac{t}{T} \times \pi))$,其中 $\alpha_0$是初始学习率,$T$是衰减周期,$t$是当前迭代次数。

initial_learning_rate = 0.1
total_epochs = 100
scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=total_epochs, eta_min=0)

# 或者使用带有余弦重启的版本
scheduler = torch.optim.lr_scheduler.CosineAnnealingWarmRestarts(optimizer, T_0=total_epochs // 2)

线性衰减(Linear Decay):学习率按线性函数衰减,如$\alpha = \alpha_0 - kt$,其中 $\alpha_0$ 是初始学习率,$k$是衰减率,$t$是训练的迭代次数。

class LinearDecayScheduler(torch.optim.lr_scheduler._LRScheduler):
    def __init__(self, optimizer, initial_lr, decay_rate, total_iters):
        self.decay_rate = decay_rate
        self.total_iters = total_iters
        super().__init__(optimizer, last_epoch=-1)

    def get_lr(self):
        current_iter = self.last_epoch + 1  # PyTorch的last_epoch从0开始计数
        lr = self.base_lrs[0] - (self.base_lrs[0] * self.decay_rate * (current_iter / self.total_iters))
        return [lr for _ in self.base_lrs]

# 使用示例
optimizer = optim.SGD(model.parameters(), lr=initial_lr)
scheduler = LinearDecayScheduler(optimizer, initial_lr, decay_rate, total_iters)

# 在训练循环中调用scheduler.step()以更新学习率
for epoch in range(num_epochs):
    for iter in range(num_iters_per_epoch):
        scheduler.step()
        # ... 训练步骤 ...

3、自适应学习率算法

自适应学习率算法是一类可以自动调整学习率的优化算法,它们根据参数的梯度信息动态地调整学习率。常见的自适应学习率算法包括:

  • Adam(Adaptive Moment Estimation)
  • Adagrad(Adaptive Gradient Algorithm)
  • RMSProp(Root Mean Square Propagation)
  • Adadelta(Adaptive Delta) 这些算法通过考虑历史梯度信息或者自适应地调整学习率的大小来提高模型训练的效率和性能。
Adam算法:

Adam(Adaptive Moment Estimation)是一种自适应学习率算法,结合了动量(Momentum)和自适应学习率调整机制,能够在不同参数的梯度变化范围内自适应地调整学习率,从而提高模型的训练速度和性能。

下面是Adam算法的公式:

1. 初始化参数:
   - $m$$v$分别为零向量,与模型参数形状相同
   - $\beta_1$$\beta_2$是动量和梯度平方的指数衰减率
   - $\alpha$ 是学习率
   - $\epsilon$是一个很小的数,避免除以零

2. 在每个迭代步骤$t$中,对每个参数\theta做如下更新:
   - 计算梯度 $g_t$
   - 更新一阶矩估计:$m_t = \beta_1 m_{t-1} + (1 - \beta_1) g_t$
   - 更新二阶矩估计:$v_t = \beta_2 v_{t-1} + (1 - \beta_2) g_t^2$
   - 矫正一阶矩估计:$\hat{m}_t = \frac{m_t}{1 - \beta_1^t}$
   - 矫正二阶矩估计:$\hat{v}_t = \frac{v_t}{1 - \beta_2^t}$
   - 更新参数:$\theta _{t+1} = \theta _t - \frac{\alpha}{\sqrt{\hat{v}_t} + \epsilon} \hat{m}_t$

Python代码示例,实现了Adam算法的应用:

import numpy as np

class AdamOptimizer:
    def __init__(self, learning_rate=0.001, beta1=0.9, beta2=0.999, epsilon=1e-8):
        self.learning_rate = learning_rate
        self.beta1 = beta1
        self.beta2 = beta2
        self.epsilon = epsilon
        self.m = None
        self.v = None
        self.t = 0
        
    def update(self, parameters, gradients):
        if self.m is None:
            self.m = np.zeros_like(parameters)
            self.v = np.zeros_like(parameters)
        
        self.t += 1
        self.m = self.beta1 * self.m + (1 - self.beta1) * gradients
        self.v = self.beta2 * self.v + (1 - self.beta2) * (gradients ** 2)
        
        m_hat = self.m / (1 - self.beta1 ** self.t)
        v_hat = self.v / (1 - self.beta2 ** self.t)
        
        parameters -= self.learning_rate * m_hat / (np.sqrt(v_hat) + self.epsilon)

# 使用示例
# 初始化优化器
optimizer = AdamOptimizer(learning_rate=0.001)
# 定义模型参数和梯度
parameters = np.random.randn(10)
gradients = np.random.randn(10)
# 更新参数
optimizer.update(parameters, gradients)
 Adagrad算法:

Adagrad(Adaptive Gradient Algorithm),它能够根据每个参数的历史梯度信息自适应地调整学习率。Adagrad会为每个参数维护一个学习率,使得在训练过程中,梯度较大的参数拥有较小的学习率,而梯度较小的参数拥有较大的学习率,从而更好地适应不同参数的更新需求。

以下是Adagrad算法的主要步骤:

1. 初始化参数:
   - 初始化参数 \theta为随机值
   - 初始化梯度累积变量 $r$为零向量,与参数 \theta形状相同
   - 初始化全局学习率 $\alpha$
   - 初始化一个很小的常数 $\epsilon$,避免除以零

2. 在每个迭代步骤 $t$中,对每个参数 $\theta _i$做如下更新:
   - 计算梯度$g_t$
   - 将梯度的平方累积到$r$ 中:$r_t = r_{t-1} + g_t^2$
   - 计算参数的学习率:$lr = \frac{\alpha}{\sqrt{r_t} + \epsilon}$
   - 更新参数:$\theta _{t+1} = \theta _t - lr \cdot g_t$

Adagrad的特点是随着训练的进行,由于 $r$中累积了梯度的平方值,学习率会逐渐减小,从而保证了模型在训练过程中的稳定性和收敛性。

Python代码示例,实现了Adagrad算法的应用:

import numpy as np

class AdagradOptimizer:
    def __init__(self, learning_rate=0.01, epsilon=1e-8):
        self.learning_rate = learning_rate
        self.epsilon = epsilon
        self.r = None
        
    def update(self, parameters, gradients):
        if self.r is None:
            self.r = np.zeros_like(parameters)
        
        self.r += gradients ** 2
        lr = self.learning_rate / (np.sqrt(self.r) + self.epsilon)
        
        parameters -= lr * gradients

# 使用示例
# 初始化优化器
optimizer = AdagradOptimizer(learning_rate=0.01)
# 定义模型参数和梯度
parameters = np.random.randn(10)
gradients = np.random.randn(10)
# 更新参数
optimizer.update(parameters, gradients)
RMSProp算法:

RMSProp(Root Mean Square Propagation),它对Adagrad算法进行了改进,解决了Adagrad算法在训练过程中学习率不断减小的问题。RMSProp算法通过使用梯度平方的移动平均来调整学习率,从而实现了对学习率的自适应调整,使得模型的训练更加稳定和高效。

以下是RMSProp算法的主要步骤:

1. 初始化参数:
   - 初始化参数\theta为随机值
   - 初始化梯度平方的指数加权移动平均变量$v$为零向量,与参数 \theta 形状相同
   - 初始化全局学习率 $\alpha$
   - 初始化一个很小的常数$\epsilon$,避免除以零

2. 在每个迭代步骤 $t$ 中,对每个参数 $\theta _i$做如下更新:
   - 计算梯度$g_t$
   - 将梯度的平方累积到 $v$ 中:$v_t = \beta v_{t-1} + (1 - \beta) g_t^2$,其中$\beta$是一个衰减率,通常取0.9
   - 计算参数的学习率:$lr = \frac{\alpha}{\sqrt{v_t} + \epsilon}$
   - 更新参数:$\theta _{t+1} = \theta _t - lr \cdot g_t$

RMSProp算法通过使用梯度平方的指数加权移动平均来调整学习率,使得学习率的调整更加平滑,从而提高了模型训练的稳定性和泛化能力。

Python代码示例,实现了RMSProp算法的应用:

class RMSPropOptimizer:
    def __init__(self, learning_rate=0.01, beta=0.9, epsilon=1e-8):
        self.learning_rate = learning_rate
        self.beta = beta
        self.epsilon = epsilon
        self.v = None
        
    def update(self, parameters, gradients):
        if self.v is None:
            self.v = np.zeros_like(parameters)
        
        self.v = self.beta * self.v + (1 - self.beta) * (gradients ** 2)
        lr = self.learning_rate / (np.sqrt(self.v) + self.epsilon)
        
        parameters -= lr * gradients

# 使用示例
# 初始化优化器
optimizer = RMSPropOptimizer(learning_rate=0.01)
# 定义模型参数和梯度
parameters = np.random.randn(10)
gradients = np.random.randn(10)
# 更新参数
optimizer.update(parameters, gradients)
Adadelta算法 :

Adadelta是对RMSProp算法的改进。与RMSProp不同的是,Adadelta算法不需要手动设置一个全局学习率,而是使用了一个更加简洁的学习率调整策略,使得模型训练过程更加稳定和高效。

以下是Adadelta算法的主要步骤:

1. 初始化参数:
   - 初始化参数\theta为随机值
   - 初始化梯度平方的指数加权移动平均变量$v$为零向量,与参数\theta 形状相同
   - 初始化更新量的指数加权移动平均变量 $s$为零向量,与参数 \theta形状相同
   - 初始化一个很小的常数$\epsilon$,避免除以零
   - 初始化一个很小的常数 $\gamma$,用于控制更新量的调整幅度,通常取0.9

2. 在每个迭代步骤$t$中,对每个参数 $\theta _i$做如下更新:
   - 计算梯度$g_t$
   - 将梯度的平方累积到 $v$ 中:$v_t = \gamma v_{t-1} + (1 - \gamma) g_t^2$
   - 计算参数的更新量:$\Delta \theta _t = - \frac{\sqrt{s_{t-1} + \epsilon}}{\sqrt{v_t} + \epsilon} g_t$
   - 将更新量的平方累积到 $s$中:$s_t = \gamma s_{t-1} + (1 - \gamma) (\Delta \theta _t)^2$
   - 更新参数:$\theta _{t+1} = \theta _t + \Delta \theta _t$

Adadelta算法通过使用更新量的指数加权移动平均来调整学习率,使得学习率的调整更加平滑,从而提高了模型训练的稳定性和泛化能力。

Python代码示例,实现了Adadelta算法的应用:

class AdadeltaOptimizer:
    def __init__(self, gamma=0.9, epsilon=1e-8):
        self.gamma = gamma
        self.epsilon = epsilon
        self.v = None
        self.s = None
        
    def update(self, parameters, gradients):
        if self.v is None:
            self.v = np.zeros_like(parameters)
            self.s = np.zeros_like(parameters)
        
        self.v = self.gamma * self.v + (1 - self.gamma) * (gradients ** 2)
        delta_theta = - np.sqrt(self.s + self.epsilon) / np.sqrt(self.v + self.epsilon) * gradients
        self.s = self.gamma * self.s + (1 - self.gamma) * (delta_theta ** 2)
        
        parameters += delta_theta

# 使用示例
# 初始化优化器
optimizer = AdadeltaOptimizer()
# 定义模型参数和梯度
parameters = np.random.randn(10)
gradients = np.random.randn(10)
# 更新参数
optimizer.update(parameters, gradients)

4、多项式衰减(Polynomial Decay)

多项式衰减(Polynomial Decay)是一种学习率调整策略,通过多项式函数对学习率进行衰减,从而在训练过程中逐渐降低学习率。多项式衰减通常用于训练过程中的学习率衰减策略之一,可以帮助模型在训练后期更好地收敛,并提高模型的泛化能力。

多项式衰减的公式通常表示为:

\alpha = \alpha_0 \times (1 - \frac{t}{T})^p

其中:
- \alpha是当前迭代步骤的学习率;
- \alpha_0是初始学习率;
- t是当前迭代步骤;
- T是总的迭代次数;
- p是多项式衰减的指数,控制衰减的速率。

多项式衰减策略通过调整指数 p的大小来控制学习率的衰减速率。当p > 1时,学习率将以多项式函数形式缓慢衰减;当p = 1时,学习率以线性方式衰减;当0 < p < 1时,学习率将以多项式函数形式快速衰减。

Python代码示例,演示了如何实现多项式衰减策略:

def polynomial_decay(initial_learning_rate, current_step, decay_steps, power):
    """
    多项式衰减函数
    Args:
    - initial_learning_rate: 初始学习率
    - current_step: 当前迭代步骤
    - decay_steps: 衰减步数
    - power: 多项式衰减的指数
    Returns:
    - 当前迭代步骤的学习率
    """
    return initial_learning_rate * (1 - current_step / decay_steps) ** power

# 使用示例
initial_learning_rate = 0.01
decay_steps = 1000
power = 0.5

for step in range(1, 1001):
    current_learning_rate = polynomial_decay(initial_learning_rate, step, decay_steps, power)
    print("Step {}: Learning Rate = {:.6f}".format(step, current_learning_rate))

总结

学习率作为深度学习模型训练过程中的关键调控变量,其重要性不言而喻。在今天的讨论中,我们深入剖析了学习率的概念及其在优化算法中的作用机制。学习率代表了参数更新的步伐大小,直接影响模型收敛的速度和结果的质量。当学习率设定过高时,可能导致模型在寻找最优解的过程中产生剧烈振荡,甚至无法收敛;反之,过低的学习率虽能确保稳定性,却会导致收敛速度过于缓慢,浪费大量计算资源。

针对这一问题,我们探讨了多种动态调整学习率的方法。首先,介绍了传统固定学习率之外的指数衰减、多项式衰减以及步长衰减等策略、还有自适应学习率方法如AdaGrad、RMSprop和Adam因其能够根据各参数的历史梯度信息自动调整学习率而备受青睐,它们有效地解决了传统学习率调整方法存在的诸多局限性。

最后,创作不易!非常感谢大家的关注、点赞、评论啦!谢谢三连哦!好人好运连连,学习进步!工作顺利哦! 

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

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

相关文章

自动化图像标注是否可靠?人人可尝试的方案

一、背景 随着大模型的崛起&#xff0c;多模态模型如雨后春笋一样快速发展。我们可以借助多模态大模型理解物理世界中的物体&#xff0c;在上篇文章大模型时代&#xff0c;图像描述生成&#xff08;image caption&#xff09;怎么走&#xff1f;中提到基于大模型的图像描述生成…

ADB的基本语法及常用命令

学习网址 ADB命令的基本语法如下&#xff1a; adb [-d|-e|-s <serialNumber>] <command> 如果有多个设备/模拟器连接&#xff0c;则需要为命令指定目标设备。 参数及含义如下&#xff1a; 常用命令如下&#xff1a; 1. 启动ADB服务 adb start-server 2. 停止…

上网方法介绍

注册 https://www.cordcloud.biz/user 注册后先充值&#xff0c;充值后还要购买套餐&#xff0c; 充值之后&#xff0c;就可以看到流量了&#xff0c;然后复制订阅地址&#xff0c;到客户端去自动下载 URL拷贝到这个地方&#xff0c;然后点击下载

Vue.js前端开发零基础教学(六)

学习目标 了解什么是路由&#xff0c;能够说出前端后端路由的原理 掌握多种路由的使用方法&#xff0c;能够实现路由的不同功能 掌握Vue Router的安装及基本使用方法 5.1 初始路由 提到路由&#xff08;Route),一般我们会联想到网络中常见的路由器&#xff08;Router),…

清明三天,用Python赚了4万?

每年4月&#xff0c;是Python圈子里接私活的旺季&#xff0c;特别是在节假日这种数据暴增的时间段&#xff0c;爬虫采集、逆向破解类的私活订单会集中爆发&#xff0c;量大价高。几乎所有的圈内人都在趁着旺季接私活。 正好&#xff0c;我昨天就做了一单爬虫逆向私活&#xff…

Python统计分析库之statsmodels使用详解

概要 Python statsmodels是一个强大的统计分析库,提供了丰富的统计模型和数据处理功能,可用于数据分析、预测建模等多个领域。本文将介绍statsmodels库的安装、特性、基本功能、高级功能、实际应用场景等方面。 安装 安装statsmodels库非常简单,可以使用pip命令进行安装:…

SGI_STL空间配置器源码剖析(六)deallocate函数

deallocate函数是内存释放函数。源码及注释如下&#xff1a; /* __p may not be 0 */static void deallocate(void* __p, size_t __n) // __p指向要回收的内存起始地址&#xff0c;__n表示其大小{if (__n > (size_t) _MAX_BYTES)// 大于128字节&#xff0c;普通方式开辟和回…

男生穿什么裤子最百搭?适合男生穿的裤子品牌测评分享

每个伙伴们想必经常都会选择一些裤子&#xff0c;但现在市面上的裤子品牌也实在太多了&#xff0c;好不容易选到了几件好看的裤子&#xff0c;结果质量却很不好。主要就是因为现在有太多商家为了利润而使用一些舒适性、质量差的面料&#xff0c;那么今天就给大家分享一些质量上…

RAG 如何消除大模型幻觉

什么是大模型幻觉 假设我们有一个基于大型生成模型&#xff08;如GPT-3&#xff09;的问答系统&#xff0c;该系统用于回答药企内部知识库中的问题。我们向其提出一个问题&#xff1a;“阿司匹林的主要药理作用是什么&#xff1f;” 正确的答案应该是&#xff1a;“阿司匹林主…

无人棋牌室软硬件方案

先决思考 软件这一套确实是做一套下来&#xff0c;可以无限复制卖出&#xff0c;这个雀氏是一本万利的买卖。 现在肯定是有成套的方案&#xff0c;值不值得重做&#xff1f;为什么要重做&#xff1f; 你想达到什么效果&#xff1f;还是需要细聊的。 做这个东西难度不高&…

✌粤嵌—2024/3/18—搜索插入位置

代码实现&#xff1a; 二分法&#xff1a; 方法一&#xff1a;非递归&#xff0c;左闭右闭 int searchInsert(int *nums, int numsSize, int target) {int l 0, r numsSize - 1; // 左闭右闭int mid;while (l < r) {mid (l r) / 2;if (nums[mid] target) {return mid;}…

plc数据采集网关

在信息化与工业化深度融合的今天&#xff0c;数据采集成为了推动制造业智能化转型的重要基石。其中&#xff0c;PLC数据采集网关作为连接PLC设备与上层管理系统的桥梁&#xff0c;扮演着至关重要的角色。 一、PLC数据采集网关&#xff1a;定义与重要性 PLC数据采集网关是一种…

3D视觉引导麻袋拆垛破包 | 某大型化工厂

客户需求 此项目为大型化工厂&#xff0c;客户现场每日有大量麻袋拆垛破包需求&#xff0c;麻袋软包由于自身易变形、码放垛型不规则、运输后松散等情况&#xff0c;无法依靠机器人示教位置完成拆垛。客户遂引入3D视觉进行自动化改造。 工作流程&#xff1a; 3D视觉对紧密贴合…

论文略读:Window Attention is Bugged: How not to Interpolate Position Embeddings

iclr 2024 reviewer 打分 6666 窗口注意力、位置嵌入以及高分辨率微调是现代Transformer X CV 时代的核心概念。论文发现&#xff0c;将这些几乎无处不在的组件简单地结合在一起&#xff0c;可能会对性能产生不利影响问题很简单&#xff1a;在使用窗口注意力时对位置嵌入进行插…

基于ARX结构(模加运算循环移位异或运算)的密码杂凑算法Lemon512

基于ARX结构(模加运算&循环移位&异或运算)的密码杂凑算法Lemon512 黄金龙 QQ1435271638 密码杂凑算法 密码杂凑算法也称作“散列算法”或“哈希算法”,现在的密码行业标准统称其为密码杂凑算法,简称“杂凑算法”或“杂凑函数”。密码杂凑算法对任意长度的消息进行…

鱼哥推荐书籍第18期:《推荐系统》算法 案例与大模型

鱼哥推荐书籍第18期&#xff1a;《推荐系统》算法 案例与大模型 什么是推荐系统&#xff1f;推荐系统解决了哪些问题&#xff1f;推荐系统的应用领域常用的推荐算法&#xff1a;基于内容的推荐算法协同过滤算法&#xff1a; 如何系统学习推荐系统&#xff1a;第一部分&#xff…

【Java探索之旅】数组使用 初探JVM内存布局

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; Java编程秘籍 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一、数组的使用1.1 元素访问1.2 数组遍历 二、JVM的内存布局&#x1f324;️全篇总结 …

聚道云软件连接器助力企业实现滴滴出差报销自动化

一、客户介绍 某机械有限公司是一家在机械设备制造领域拥有深厚底蕴和卓越实力的企业。自公司成立以来&#xff0c;该公司始终秉承创新、务实、高效的发展理念&#xff0c;专注于机械设备的研发、生产和销售。经过多年的发展&#xff0c;公司已成为国内机械行业的佼佼者&#…

PyQt介绍——弹框介绍和使用

PyQt介绍——弹框介绍和使用 一、QMessageBox QMessageBox是一种通用的弹出式对话框&#xff0c;用于显示消息&#xff0c;允许用户通过单击不同的标准按钮对消息进行反馈 QMessageBox类提供了许多常用的弹出式对话框&#xff0c;如提示、警告、错误、询问、关于等对话框。这…

软考证书有用吗?软考证书的含金量大吗?

一、以考代评 通过考试并获得相应级别计算机专业技术资格&#xff08;水平&#xff09;证书的人员&#xff0c;表明其已具备从事相应专业岗位工作的水平和能力&#xff0c;用人单位可根据《工程技术人员职务试行条例》有关规定和工作需要&#xff0c;从获得计算机专业技术资格…