详解机器学习最优化算法

前言

对于几乎所有机器学习算法,无论是有监督学习、无监督学习,还是强化学习,最后一般都归结为求解最优化问题。因此,最优化方法在机器学习算法的推导与实现中占据中心地位。在这篇文章中,小编将对机器学习中所使用的优化算法做一个全面的总结,并理清它们直接的脉络关系,帮你从全局的高度来理解这一部分知识。

机器学习要求解的数学模型

几乎所有的机器学习算法最后都归结为求一个目标函数的极值,即最优化问题,例如对于有监督学习,我们要找到一个最佳的映射函数f (x),使得对训练样本的损失函数最小化(最小化经验风险或结构风险):

图片

在这里,N为训练样本数,L是对单个样本的损失函数,w是要求解的模型参数,是映射函数的参数,xi为样本的特征向量,yi为样本的标签值。

或是找到一个最优的概率密度函数p(x),使得对训练样本的对数似然函数极大化(最大似然估计):

图片

在这里,θ是要求解的模型参数,是概率密度函数的参数。

对于无监督学习,以聚类算法为例,算法要是的每个类的样本离类中心的距离之和最小化:

图片

在这里k为类型数,x为样本向量,μi为类中心向量,Si为第i个类的样本集合。

对于强化学习,我们要找到一个最优的策略,即状态s到动作a的映射函数(确定性策略,对于非确定性策略,是执行每个动作的概率):

图片

使得任意给定一个状态,执行这个策略函数所确定的动作a之后,得到的累计回报最大化:

图片

这里使用的是状态价值函数。

总体来看,机器学习的核心目标是给出一个模型(一般是映射函数),然后定义对这个模型好坏的评价函数(目标函数),求解目标函数的极大值或者极小值,以确定模型的参数,从而得到我们想要的模型。在这三个关键步骤中,前两个是机器学习要研究的问题,建立数学模型。第三个问题是纯数学问题,即最优化方法,为本文所讲述的核心。

最优化算法的分类

对于形式和特点各异的机器学习算法优化目标函数,我们找到了适合它们的各种求解算法。除了极少数问题可以用暴力搜索来得到最优解之外,我们将机器学习中使用的优化算法分成两种类型(本文不考虑随机优化算法如模拟退火、遗传算法等):

  • 公式求解  
  • 数值优化

 前者给出一个最优化问题精确的公式解,也称为解析解,一般是理论结果。后者是在要给出极值点的精确计算公式非常困难的情况下,用数值计算方法近似求解得到最优点。除此之外,还有其他一些求解思想,如分治法,动态规划等。我们在后面单独列出。一个好的优化算法需要满足:

  • 能正确的找到各种情况下的极值点
  • 速度快

下图给出了这些算法的分类与它们之间的关系:

图片

接下来我们将按照这张图来展开进行讲解。

费马定理

对于一个可导函数,寻找其极值的统一做法是寻找导数为0的点,即费马定理。微积分中的这一定理指出,对于可导函数,在极值点处导数必定为0:

图片

对于多元函数,则是梯度为0:

图片

导数为0的点称为驻点。需要注意的是,导数为0只是函数取得极值的必要条件而不是充分条件,它只是疑似极值点。是不是极值,是极大值还是极小值,还需要看更高阶导数。对于一元函数,假设x是驻点:

  • 如果f''(x)>0,则在该点处去极小值

  • 如果f''(x)<0,则在该点处去极大值

  • 如果f''(x)>=0,还要看更高阶导数

对于多元函数,假设x是驻点:

  • 如果Hessian矩阵正定,函数在该点有极小值

  • 如果Hessian矩阵负定,函数在该点有极大值

  • 如果Hessian矩阵不定,还需要看更(此处误)

在导数为0的点处,函数可能不取极值,这称为鞍点,下图是鞍点的一个例子(来自SIGAI云端实验室):

图片

除鞍点外,最优化算法可能还会遇到另外一个问题:局部极值问题,即一个驻点是极值点,但不是全局极值。如果我们对最优化问题加以限定,可以有效的避免这两种问题。典型的是凸优化,它要求优化变量的可行域是凸集,目标函数是凸函数。

虽然驻点只是函数取得极值的必要条件而不是充分条件,但如果我们找到了驻点,再判断和筛选它们是不是极值点,比之前要容易多了。无论是理论结果,还是数值优化算法,一般都以找驻点作为找极值点的目标。对于一元函数,先求导数,然后解导数为0的方程即可找到所有驻点。对于多元函数,对各个自变量求偏导数,令它们为0,解方程组,即可达到所有驻点。这都是微积分中所讲授的基础方法。幸运的是,在机器学习中,很多目标函数都是可导的,因此我们可以使用这套方法。

拉格朗日乘数法

费马定理给出的不带约束条件下的函数极值的必要条件。对于一些实际应用问题,一般还带有等式或者不等式约束条件。对于带等式约束的极值问题,经典的解决方案是拉格朗日乘数法。

对于如下问题:

图片

构造拉格朗日乘子函数:

图片

在最优点处对x和乘子变量λi的导数都必须为0:

图片

解这个方程即可得到最优解。对拉格朗日乘数法更详细的讲解可以阅读任何一本高等数学教材。机器学习中用到拉格朗日乘数法的地方有:

  • 主成分分析

  • 线性判别分析

  • 流形学习中的拉普拉斯特征映射

  • 隐马尔可夫模型

KKT条件

KKT条件是拉格朗日乘数法的推广,用于求解既带有等式约束,又带有不等式约束的函数极值。对于如下优化问题:

图片

和拉格朗日对偶的做法类似,KKT条件构如下乘子函数:

图片

λ和μ称为KKT乘子。在最优解处x*应该满足如下条件:

图片

等式约束hj (x*)=0和不等式约束gk (x*)<=0是本身应该满足的约束,▽xL(x*)=0和之前的拉格朗日乘数法一样。唯一多了关于gi (x)的条件:

图片

KKT条件只是取得极值的必要条件而不是充分条件。在机器学习中用到KKT条件的地方有:

  • 支持向量机(SVM)

数值优化算法

前面讲述的三种方法在理论推导、某些可以得到方程组的求根公式的情况(如线性函数,正态分布的最大似然估计)中可以使用,但对绝大多数函数来说,梯度等于0的方程组是没法直接解出来的,如方程里面含有指数函数、对数函数之类的超越函数。对于这种无法直接求解的方程组,我们只能采用近似的算法来求解,即数值优化算法。这些数值优化算法一般都利用了目标函数的导数信息,如一阶导数和二阶导数。如果采用一阶导数,则称为一阶优化算法。如果使用了二阶导数,则称为二阶优化算法。

工程上实现时通常采用的是迭代法,它从一个初始点x0开始,反复使用某种规则从xk移动到下一个点xk+1,构造这样一个数列,直到收敛到梯度为0的点处。即有下面的极限成立:

图片

这些规则一般会利用一阶导数信息即梯度;或者二阶导数信息即Hessian矩阵。这样迭代法的核心是得到这样的由上一个点确定下一个点的迭代公式:

图片

梯度下降法


梯度下降法沿着梯度的反方向进行搜索,利用了函数的一阶导数信息。梯度下降法的迭代公式为:

图片

根据函数的一阶泰勒展开,在负梯度方向,函数值是下降的。只要学习率设置的足够小,并且没有到达梯度为0的点处,每次迭代时函数值一定会下降。需要设置学习率为一个非常小的正数的原因是要保证迭代之后的xk+1位于迭代之前的值xk的邻域内,从而可以忽略泰勒展开中的高次项,保证迭代时函数值下降。

梯度下降法及其变种在机器学习中应用广泛,尤其是在深度学习中。

 

动量项

为了加快梯度下降法的收敛速度,减少震荡,引入了动量项。动量项累积了之前迭代时的梯度值,加上此项之后的参数更新公式为:

图片

其中Vt+1是动量项,它取代了之前的梯度项。动量项的计算公式为:

图片

它是上一时刻的动量项与本次梯度值的加权平均值,其中α是学习率,μ是动量项系数。如果按照时间t进行展开,则第t次迭代时使用了从1到t次迭代时的所有梯度值,且老的梯度值安μt的系数指数级衰减:

图片

动量项累积了之前迭代时的梯度值,使得本次迭代时沿着之前的惯性方向向前走。

AdaGrad算法

AdaGrad算法是梯度下降法最直接的改进。梯度下降法依赖于人工设定的学习率,如果设置过小,收敛太慢,而如果设置太大,可能导致算法那不收敛,为这个学习率设置一个合适的值非常困难。

AdaGrad算法根据前几轮迭代时的历史梯度值动态调整学习率,且优化变量向量X的每一个分量xi都有自己的学习率。参数更新公式为:

图片

其中α是学习因子,gt是第t次迭代时参数的梯度向量,ε是一个很小的正数,为了避免除0操作,下标i表示向量的分量。和标准梯度下降法唯一不同的是多了分母中的这一项,它累积了到本次迭代为止梯度的历史值信息用于生成梯度下降的系数值。根据上式,历史导数值的绝对值越大分量学习率越小,反之越大。虽然实现了自适应学习率,但这种算法还是存在问题:需要人工设置一个全局的学习率α,随着时间的累积,上式中的分母会越来越大,导致学习率趋向于0,参数无法有效更新。

RMSProp算法

RMSProp算法是对AdaGrad的改进,避免了长期累积梯度值所导致的学习率趋向于0的问题。具体做法是由梯度值构造一个向量RMS,初始化为0,按照衰减系数累积了历史的梯度平方值。更新公式为:

图片

AdaGrad直接累加所有历史梯度的平方和,而这里将历史梯度平方值按照δt衰减之后再累加。参数更新公式为:

图片

其中δ是人工设定的参数,与AdaGrad一样,这里也需要人工指定的全局学习率α。

AdaDelta算法

AdaDelta算法也是对AdaGrad的改进,避免了长期累积梯度值所导致的学习率趋向于0的问题,另外,还去掉了对人工设置的全局学习率的依赖。假设要优化的参数为x,梯度下降法第t次迭代时计算出来的参数梯度值为gt。算法首先初始化如下两个向量为0向量:

图片

其中E[g2]是梯度平方(对每个分量分别平分)的累计值,更新公式为:

图片

在这里g2是向量每个元素分别计算平方,后面所有的计算公式都是对向量的每个分量进行。接下来计算如下RMS量:

图片

这也是一个向量,计算时分别对向量的每个分量进行。然后计算参数的更新值:

图片

RMS[Δx]t-1的计算公式和这个类似。这个更新值同样通过梯度来构造,只不过学习率是通过梯度的历史值确定的。更新公式为:

图片

参数更新的迭代公式为:

图片

Adam算法

Adam算法整合了自适应学习率与动量项。算法用梯度构造了两个向量m和v,前者为动量项,后者累积了梯度的平方和,用于构造自适应学习率。它们的初始值为0,更新公式为:

图片

其中β1,β2是人工指定的参数,i为向量的分量下标。依靠这两个值构造参数的更新值,参数的更新公式为:

图片

在这里,m类似于动量项,用v来构造学习率。

随机梯度下降法

假设训练样本集有N个样本,有监督学习算法训练时优化的目标是这个数据集上的平均损失函数:

图片

其中L(w,xi,yi )是对单个训练样本(xi,yi )的损失函数,w是需要学习的参数,r(w)是正则化项,λ是正则化项的权重。在训练样本数很大时,如果训练时每次迭代都用所有样本,计算成本太高,作为改进可以在每次迭代时选取一批样本,将损失函数定义在这些样本上。

批量随机梯度下降法在每次迭代中使用上面目标函数的随机逼近值,即只使用M《N个随机选择的样本来近似计算损失函数。在每次迭代时要优化的目标函数变为:

图片

随机梯度下降法在概率意义下收敛。

牛顿法

牛顿法是二阶优化技术,利用了函数的一阶和二阶导数信息,直接寻找梯度为0的点。牛顿法的迭代公式为:

图片

其中H为Hessian矩阵,g为梯度向量。牛顿法不能保证每次迭代时函数值下降,也不能保证收敛到极小值点。在实现时,也需要设置学习率,原因和梯度下降法相同,是为了能够忽略泰勒展开中的高阶项。学习率的设置通常采用直线搜索(line search)技术。

在实现时,一般不直接求Hessian矩阵的逆矩阵,而是求解下面的线性方程组:

图片

其解d称为牛顿方向。迭代终止的判定依据是梯度值充分接近于0,或者达到最大指定迭代次数。

牛顿法比梯度下降法有更快的收敛速度,但每次迭代时需要计算Hessian矩阵,并求解一个线性方程组,运算量大。另外,如果Hessian矩阵不可逆,则这种方法失效。

牛顿法在logistic回归,AdaBoost算法等机器学习算法中有实际应用。

拟牛顿法

牛顿法在每次迭代时需要计算出Hessian矩阵,并且求解一个以该矩阵为系数矩阵的线性方程组,Hessian矩阵可能不可逆。为此提出了一些改进的方法,典型的代表是拟牛顿法。拟牛顿法的思路是不计算目标函数的Hessian矩阵然后求逆矩阵,而是通过其他手段得到一个近似Hessian矩阵逆的矩阵。具体做法是构造一个近似Hessian矩阵或其逆矩阵的正定对称矩阵,用该矩阵进行牛顿法的迭代。

所有这些主要的数值优化算法都可以在SIGAI云端实验室上免费完成实验:

www.sigai.cn

通过构造目标函数,指定优化算法的参数与初始化迭代值,可以可视化的显示出算法的运行过程,并对不同参数时的求解结果进行比较。

图片

可信域牛顿法

标准牛顿法可能不会收敛到一个最优解,也不能保证函数值会按照迭代序列递减。解决这个问题可以通过调整牛顿方向的步长来实现,目前常用的方法有两种:直线搜索和可信区域法。可信域牛顿法是截断牛顿法的一个变种,用于求解带界限约束的最优化问题。在可信域牛顿法的每一步迭代中,有一个迭代序列xk,一个可信域的大小Δk,以及一个二次目标函数:

图片

这个式子可以通过泰勒展开得到,忽略二次以上的项,这是对函数下降值:

图片

的近似。算法寻找一个sk,在满足约束条件||S||<=Δk下近似最小化qk(S)。接下来检查如下比值以更新wk和Δk:

图片

这是函数值的实际减少量和二次近似模型预测方向导致的函数减少量的比值。根据之前的计算结果,再动态调整可信域的大小。

可信域牛顿法在logistic回归,线性支持向量的求解时有实际的应用,具体可以阅读liblinear开源库。

分治法

分治法是一种算法设计思想,它将一个大的问题分解成子问题进行求解。根据子问题解构造出整个问题的解。在最优化方法中,具体做法是每次迭代时只调整优化向量的一部分分量,其他的分量固定住不动。

坐标下降法

坐标下降法的基本思想是每次对一个变量进行优化,这是一种分治法。假设要求解的优化问题为;

图片

坐标下降法求解流程为每次选择一个分量xi进行优化,将其他分量固定住不动,这样将一个多元函数的极值问题转换为一元函数的极值问题。如果要求解的问题规模很大,这种做法能有效的加快速度。

坐标下降法在logistic回归,线性支持向量的求解时有实际的应用,具体可以阅读liblinear开源库。

SMO算法

SMO算法也是一种分治法,用于求解支持向量机的对偶问题。加上松弛变量和核函数后的对偶问题为:

图片

SMO算法的核心思想是每次在优化变量中挑出两个分量αi 和 αj进行优化,让其他分量固定,这样能保证满足等式约束条件。之所以要选择两个变量进行优化而不是选择一个变量,是因为这里有等式约束,如果只调整一个变量的值,将会破坏等式约束。

假设选取的两个分量为αi 和 αj,其他分量都固定即当成常数。对这两个变量的目标函数是一个二元二次函数。这个问题还带有等式和不等式约束条件。对这个子问题可以直接求得公式解,就是某一区间内的一元二次函数的极值。

分阶段优化

分阶段优化的做法是在每次迭代时,先固定住优化变量X一部分分量a不动,对另外一部分变量b进行优化;然后再固定住b不动,对b进行优化。如此反复,直至收敛到最优解处。

AdaBoost算法是这种方法的典型代表。AdaBoost算法在训练时采用了指数损失函数:

图片

由于强分类器是多个弱分类器的加权和,代入上面的损失函数中,得到算法训练时要优化的目标函数为:

图片

这里将指数损伤函数拆成了两部分,已有的强分类器Fj−1,以及当前弱分类器f对训练样本的损失函数,前者在之前的迭代中已经求出,因此可以看成常数。这样目标函数可以简化为:

图片

其中:

图片

这个问题可以分两步求解,首先将弱分类器权重β看成常数,得到最优的弱分类器f。得到弱分类器之后,再优化它的权重系数β。

动态规划算法

动态规划也是一种求解思想,它将一个问题分解成子问题求解,如果整个问题的某个解是最优的,则这个解的任意一部分也是子问题的最优解。这样通过求解子问题,得到最优解,逐步扩展,最后得到整个问题的最优解。

隐马尔可夫模型的解码算法(维特比算法),强化学习中的动态规划算法是这类方法的典型代表,此类算法一般是离散变量的优化,而且是组合优化问题。前面讲述的基于导数的优化算法都无法使用。动态规划算法能高效的求解此类问题,其基础是贝尔曼最优化原理。一旦写成了递归形式的最优化方程,就可以构造算法进行求解。

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

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

相关文章

SpringCloud——服务注册——Eureka

1.Eureka概述 2.Eureka架构&#xff1a; Eureka中80服务要实现对8001和8002服务访问的负载均衡&#xff0c;需要在80服务的RestTemplate上面加LoadBalanced注解&#xff0c;默认采用的是轮询的策略。 3.Eureka自我保护 当一个EurekaClient注册进EurekaServer&#xff0c;Eurek…

Pycharm-community-2021版安装和配置

一、下载Pycharm-community-2021 1.从官网下载pycharm-community Pycharm 版本官网 二、安装PyCharm 1.打开下载完成的安装包&#xff0c;点击Next 2.安装PyCharm到其他位置,点击Next 3.一定把更新PATH变量勾上,可以创建桌面快捷方式&#xff0c;创建关联&#xff0c;最后…

卓越进行时 | 赛宁助力职业院校实践“岗课赛证训创”育人模式

11月7日&#xff0c;赛宁网安邀请南京城市职业学院网络安全学科师生走进网络安全卓越中心&#xff0c;为大一新生提供“职业导学” 和“岗位认知”的综合性实践课程&#xff0c;帮助学生提升对于网络安全专业和未来职业的认知水平&#xff0c;进一步深化校企合作人才培养的持续…

基于SSM的高校疫情防控出入信息管理系统(有报告)。Javaee项目。

演示视频&#xff1a; 基于SSM的高校疫情防控出入信息管理系统&#xff08;有报告&#xff09;。Javaee项目。 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 项目介绍&#xff1a; 采…

CodeWhisperer--轻松使用一个超级强大的工具!

CodeWhisperer 简介 CodeWhisperer 是亚⻢逊出品的一款基于机器学习的通用代码生成器&#xff0c;可实时提供代码建议。 CodeWhisperer 有以下几个主要用途&#xff1a; 解决编程问题&#xff0c;提供代码建议&#xff0c;学习编程知识等等&#xff0c;并且 CodeWhisperer 会…

MySQL(7):单行函数

不同DBMS函数的差异 内置函数&#xff1a; 系统内置的通用函数。 自定义函数&#xff1a; 根据自己的需要编写的函数。 大多数 DBMS 使用&#xff08;||&#xff09;或者&#xff08;&#xff09;来做拼接符&#xff0c;而在 MySQL 中的字符串拼接函数为concat()。 大部分 D…

【java】【MyBatisPlus】【四】【完】MyBatisPlus一些实战总结(枚举、翻页、sql、组合条件、自增主键、逻辑删除)

目录 一、枚举 1、数据库type字段是Integer 类型枚举 2、创建一个该字段的枚举类 TypeEnum 3、修改实体类 4、配置文件新增mybatis-plus的配置 5、检验&#xff1a; 5.1 查询显示 5.3 库里验证 二、自增主键不是id字段处理 三、逻辑删除字段不是delete字段处理 1、实…

Android - 编译 openssl 踩坑之路

一、简述 如果你想快速在项目中使用上 openssl,可以使用网上其他开发者提供好的预编译库: OpenSSL(All):https://builds.viaduck.org/prebuilts/openssl/OpenSSL(3.1.*) :https://github.com/217heidai/openssl_for_android以上的预编译库可能最低只支持 API 21(即 Andro…

基于Kinect 动捕XR直播解决方案 - 技术实现篇

一 安装与部署 1. 安装与部署Kinect-v2设备: 安装硬件: Kinect-v2设备带线一台; Kinect-v2 原装适配器适配器组合件设备一台; Kinect-v2 USB 3.0 WIndows PC 一天&#xff0c;原主板支持USB3.0接口; Windows PC 系统 Win10( Win 10 Version 21H2更新, 基于x64系统), 特别…

必看:一组WhatsApp2023年数据合集,助你深入洞察WS营销

作为一款遍布全球的超级应用&#xff0c;WhatsApp以高人气、广覆盖和高效便利收获了几十亿用户&#xff0c;也无数次连接了用户与企业。对于WhatsApp运营布局&#xff0c;客观数据能为企业提供多方面的依据和判断。本文将从多个维度展示WhatsApp2023年数据&#xff0c;希望能为…

Spring Boot 统一处理功能

目录 1.用户登陆权限验证 1.1 每个方法验证 1.2 Spring AOP 用户统一登陆验证 1.3 拦截器 1.3.1 自定义拦截器 1.3.2 将自定义拦截器配置到系统设置中&#xff0c;并且设置拦截规则 1.3.3 排除所有的静态资源 1.4 登录拦截器&#xff08;练习&#xff09; 1.5 拦截器原…

全网短视频平台视频下载神器软件,可以下载网页上的视频、音频、直播、回放、课程 【视频下载脚本+教程】

软件介绍&#xff1a; 这是一款可以下载全网大多数平台视频的软件&#xff0c;可以帮助用户轻松下载网页上的视频、直播、回放、课程等&#xff0c;也可以支持下载MP3音乐文件、图片。 目前支持的平台有&#xff1a;淘宝、抖音、快手、哔哩哔哩、虎牙、斗鱼、京东、京喜、小红…

《安富莱嵌入式周报》第326期:航空航天级CANopen协议栈,开源USB PD电源和功耗分析,开源EtherCAT伺服驱动板,时序绘制软件,现代机器人设计

周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 更新一期视频教程&#xff1a; BSP视频教程第28期&#xff1a;CANopen协议栈专题&#xff0c;CANopen主从机组网实战&a…

Oracle Primavera Unifier 23.10 新特征

根据官方的说法&#xff0c;Unifier 23.7 ~ 23.9 更多为对功能bug的修复&#xff0c;以下将对23.10进行重点介绍 Cost Sheets Cost Sheets Support Conditional Formatting Conditional formatting of table data is now supported in cost sheets with features such as ce…

基于单片机智能加湿器控制系统仿真设计

**单片机设计介绍&#xff0c; 698【毕业课设】基于单片机智能加湿器控制系统仿真设计 文章目录 一 概要系统组成总结 二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 单片机智能加湿器控制系统仿真设计介绍 单片机智能加湿器控制系统是一种利用微…

建链时,please install openssl! use “openssl version“ command to check.

please install openssl! use “openssl version” command to check. 但是我已经安装了 编辑build_chain.sh文件 也可以用vi或者gedit命令 将 [ ! -z “ ( o p e n s s l v e r s i o n ∣ g r e p 1.0.2 ) " ] ∣ ∣ [ ! − z " (openssl version | grep 1.0.2)…

目标检测算法 - YOLOv1

文章目录 1. 作者简介2. 目标检测综述3. YOLOv1算法3.1 预测阶段3.2 预测阶段后处理3.3 训练阶段 YOLO的全称是you only look once&#xff0c;指只需要浏览一次就可以识别出图中的物体的类别和位置。 YOLO是目标检测模型。目标检测是计算机视觉中比较简单的任务&#xff0c;用…

社区治理进化史!拓世法宝化身“虚拟社工”,点亮智能社区的每一个角落

时光流转、技术猛进&#xff0c;社区不再只是在制度层面作为城市治理的最小单元&#xff0c;更是在民生层面成为政府联系、服务群众的“神经末梢”。城市的脚步越来越匆忙&#xff0c;人们对于社区的服务期待也愈发高涨。面对日益复杂的社区治理和服务需求&#xff0c;我们迫切…

商越科技:渗透测试保障平台安全,推动线上采购高效运转

商越科技是数字化采购解决方案提供商&#xff0c;在同赛道企业中始终保持前列。商越科技通过自主研发的智能采购中台、SaaS应用及运营服务等为企业搭建专属的互联网采购平台&#xff0c;帮助企业实现采购数字化以及智能化转型&#xff0c;提高工作效率、降低采购成本。 打造数字…

12、填写NGINX配置部署前端;运行jar部署后端

后端可以部署的方式&#xff0c;首先直接运行jar是肯定可以的。此外&#xff0c;可以单独开docker容器运行在容器中。 但是这里运行在容器中必要性&#xff0c;其实并不大。 当前我们直接运行jar来运行后端。后面推出集成docker。 直接运行jar包的方式&#xff0c;首先需要打…