梯度下降算法是到目前为止最主流的优化大规模神经网络的算法。近些年来,涌现出了很多基于梯度下降法的优化算法,对推动深度学习的发展起到了重要的作用。本文旨在回顾经典的,当下主流的以及最新出现的梯度下降算法。简单介绍了梯度下降法的三个变种(批梯度下降法、随机梯度下降法以及小批量随机梯度下降法),常见的学习率自适应随机梯度下降算法和其最进的研究进展(带冲量的梯度下降法、Nesterov加速的梯度下降法、AdaGrad、RMSProb、AdaDelta、Adam和Radam)。通过在mnist手写数字数据集上训练全连接神经网络和卷积神经网络进行了测试。读者在阅读过程中若产生任何疑惑,欢迎互相交流。(总结不易,转载请声明,并征得原作者同意)

目录

  • 1 概述
  • 2 梯度下降法
    • 2.1 批梯度下降法
    • 2.2 随机梯度下降法
    • 2.3 小批量(mini-batch)随机梯度下降法
  • 3 自适应随机梯度下降法
    • 3.1 Momentum and Nesterov accelerated gradient
    • 3.2 Adagrad
    • 3.3 RMSProb
    • 3.4 AdaDelta
    • 3.5 Adam
    • 3.6 Radam
  • 4 实验
    • 4.1 全连接神经网络
    • 4.2 卷积神经网络
  • 5 总结与展望

1 概述

梯度下降算法是到目前为止最主流的优化深度学习的算法。因为通过设置合适的损失函数,我们很容易使神经网络模型变得可微。而对于可微目标函数的优化问题,梯度下降是一个很高效的方法,因为它只需要计算一阶导数,所有的参数都会有相同的计算复杂度。
但是深度学习中优化神经网络模型的问题是高度非凸非线性的。而连续空间中基于梯度的优化算法大多数只适用于凸问题。所以要得到神经网络模型的全局最优,往往要比支持向量机、logistic回归这样的机器学习问题困难很多。在实际应用中,人们常用随机梯度下降法(SGD)来优化神经网络,主要是因为深度学习实际应用中往往数据规模很大,随机算法可以通过减少每次迭代的复杂度进而减少总的复杂度,提升效率。随机梯度下降算法的一个推广就是小批量随机梯度下降。
但是日益增大的数据量以及越来越复杂的神经网络模型,随机梯度下降也显得收敛不够快。近年来,科学家们发现了一类比随机梯度下降法更为复杂并且更加适合训练神经网络的算法。这类算法在更新模型时,不只利用当前的梯度,还会利用历史上的梯度信息或是下一次迭代的信息,并且自适应地调整步长,因而也被称为Ada系列算法。包括带有冲量的随机梯度算法[1]; Nesterov加速的SGD[2];利用历史梯度大小,针对每一维调整步长,进而适用稀疏数据的AdaGrad算法[3], 类似AdaGrad,并且结合了冲量思想的RMSProb算法[4]以及Adadelta[5]和十分流行的Adam算法[6]。这其中以Adam为代表,使用十分广泛。这类算法相较于传统的SGD,在收敛速度上有了大幅的提升,但是遗憾的是在收敛性能上都很难与SGD打成平手。于是人们迫切希望能够找到一种算法,既和Adam等算法一样快,又能收敛到SGD一样好的位置。
自从Reddi et al.[7]在2018年指出了Adam文章中的证明错误之后,自适应地算法研究领域又涌现出了很多优秀算法,如AdaShift[8],NosAdam[9],AdaBound[10],以及最新的Radam[11]。但是大多数算法在收敛性上和SGD还是稍逊一筹。
本文先从SGD算法开始介绍,随后介绍Adam系列算法以及Adam之后的一些Ada算法,并着重介绍Adam算法。

2 梯度下降法

目前主要有三种梯度下降的算法,分别为批梯度下降,随机梯度下降,小批量梯度下降三种。其区别在于使用多少数据对目标函数计算梯度。根据使用数据量的不同会造成我们参数更新得准确性和其使用的时间产生差别。

2.1 批梯度下降法

批梯度下降法又被称为朴素梯度下降法,是最古老的一阶算法,于1847年由Cauchy提出。梯度下降法的基本思想是:最小化目标函数在当前状态的一阶泰勒展开,从而近似地优化目标函数本身。对函数JJ,将其在当前状态θt\theta_{t}处求解下述问题:minθJ(θ)=minθJ(θt)+J(θt)T(θθt)\min \limits_{\theta} J(\theta)=\min \limits_{\theta} J(\theta_{t})+\nabla J(\theta_{t})^{T}(\theta-\theta_{t})在机器学习中,是指使用整个训练集的数据来计算目标函数J(θ)J(\theta)关于参数θ\theta的梯度θJ(θ)\nabla_{\theta}J(\theta),批梯度下降的参数更新如下:θt=θt1η×θJ(θ;x,y)\theta_{t}=\theta_{t-1}-\eta \times \nabla_{\theta}J(\theta;x,y)
参数更新得伪代码如下:

for i in range(0,epochs):params_grad = get_gradient(loss,data,params)params = params-learning_rate * params_grad

批梯度下降法存在以下三点问题:1、参数更新速度慢;2、无法在数据大小超过内存大小时无法使用;3、没法在线上部署。但是批梯度下降的优点在于,如果目标函数是凸函数,那么可以收敛到全局最优。批梯度下降的收敛速度针对不同性质的目标函数是不同的。

2.2 随机梯度下降法

随机梯度下降是使用训练集中的单个元素来计算目标函数J(θ)J(\theta)关于参数θ\theta的梯度θJ(θ)\nabla_{\theta}J(\theta),随机梯度下降的参数更新如下:θt=θt1ηθJ(θ;x(i),y(i))\theta_{t}=\theta_{t-1}-\eta \nabla_{\theta}J(\theta;x^{(i)},y^{(i)})这里的η\eta是学习率。
参数更新得伪代码如下:

for i in range(0,epochs):np.random.shuffle(data)for j in data:params_grad = get_gradient(loss,data[j],params)params = params-learning_rate * params_grad

随机梯度下降用随机采样的数据来计算梯度,是对全部数据来计算梯度的一个无偏估计,如下EitJit(θ)=θJ(θ)\mathbb{E}_{i_{t}}\nabla J_{i_{t}}(\theta)=\nabla_{\theta}J(\theta)批梯度下降的收敛速度针对不同性质的目标函数是不同的。随机梯度下降每次只随机抽取一个样本,随机梯度中的计算量大大减少。解决了上述批梯度下降存在的一些问题。如果目标函数是凸函数,那么可以收敛到全局最优。但是随机梯度下降法的收敛速度往往比较慢,这是因为随机梯度虽然是全体度的无偏估计,但是这种估计存在一定的方差,会引入不确定性,导致算法收敛速度下降。

2.3 小批量(mini-batch)随机梯度下降法

mini-batch随机梯度下降是对随机梯度下降的一个推广。不同之处在于,SGD的每一次抽样值选取一个样本,而mini-batch SGD每次迭代随机抽取n个样本。
mini-batch随机梯度下降的参数更新如下:θt=θt1η×θJ(θ;x(i+n),y(i+n))\theta_{t}=\theta_{t-1}-\eta \times \nabla_{\theta}J(\theta;x^{(i+n)},y^{(i+n)})
参数更新得伪代码如下:

for i in range(0,epochs):np.random.shuffle(data)for batch in get_batches(data,batch_size):params_grad = get_gradient(loss,batch,params)params = params-learning_rate * params_grad

mini-batch随机梯度下降是一种广泛应用在神经网络训练的方法。该方法有效减少了无偏估计的方差,从而提高了收敛速率。

3 自适应随机梯度下降法

自适应随机梯度下降法是一类算法的总称。在模型参数更新时,不只利用当前的梯度,还会用到之前的梯度信息,并且自适应地调整步长。

3.1 Momentum and Nesterov accelerated gradient

带冲量的方法最早于1964年由Polyak提出,被称为传统Classical Momentum(CM)是一种通过累积来梯度进而加速梯度下降的方法。其参数更新方式如下:vt=μvt1ηJ(θt1)v_{t}=\mu v _{t-1}-\eta \nabla J(\theta_{t-1})θt=θt1+vt\theta_{t}=\theta_{t-1}+v_{t}这里的μ\mu是冲量系数(mo-
mentum coeffcient)。
Nesterov加速梯度法(NAG)是Nesterov于1983年提出的。和冲量的方法一样,NAG是一个既能保证收敛性并且具有很好的收敛速度的一阶方法。对于一个光滑的凸问题,使用确定性梯度,那么NAG的收敛速率是O(1/T2)O(1/T^{2})(梯度下降法是O(1/T)O(1/T))。NAG的更新方式如下:vt=μvt1ηJ(θt1+μvt1)v_{t}=\mu v _{t-1}-\eta \nabla J(\theta_{t-1}+\mu v_{t-1})θt=θt1+vt\theta_{t}=\theta_{t-1}+v_{t}
这两种方法是十分比较相似的,不同之处在于带冲量的随机梯度下降法利用θt1\theta_{t-1}处的梯度进行更新,而NAG是利用θt1+μvt1\theta_{t-1}+\mu v_{t-1}处的梯度进行更新。所以从实现上看,后者前者更加简单。
可以通过图1来直观理解两者之间的区别。
图1
其中上面的是冲量加速梯度法,下面的是Nesterov加速梯度法。

3.2 Adagrad

The Adaptive Gradient 算法是John Duch等人于2011年提出[3]。该算法的直觉是,一般梯度比较小的维度对达到最优点也有重要的贡献,但是因为其梯度小,所以更新慢,进而容易到达一个鞍点或者局部最优。所以Adagrad对历史信息(梯度值的平方)进行了累加,并且根据历史梯度逐维度调整步长,使得梯度较小的维度获得更大的步长,其更新公式如下:gt=gt1+(J(θt1)2)g_{t}=g_{t-1}+(\nabla J(\theta_{t-1})^{2})θt=θt1η(gt+ϵ)12J(θt1)\theta_{t}=\theta_{t-1}-\frac{\eta}{(g_{t}+\epsilon)^{\frac{1}{2}}}\nabla J(\theta_{t-1})其中的ϵ\epsilon是一个光滑项,防止分母为零。这个算法更适合优化具有很多局部最优点和鞍点的神经网络模型。而且这种自动调整步长的方法可以使得随机梯度下降法变得更加稳定。
该方法的缺点在于,因为更新公式中的分母项(gt+ϵ)12(g_{t}+\epsilon)^{\frac{1}{2}}随着不断地训练不断变大,所以步长会越来越趋近于零,这一方面会导致最后的收敛速率很低,另一方面会使得无法收敛到足够小的极值。

3.3 RMSProb

RMSProb是Geoff Hinton在他的cs321课程中提出的一个自适应学习率的方法。RMSProb和AdaGrad类似,
区别在于该方法还借鉴了带冲量的随机梯度下降法的思路,对历史信息进行了指数递减平均。其更新公式如下:
E[gt2]=γE[gt12]+(1γ)J(θt1)2\mathbb{E}[g_{t}^{2}]=\gamma \mathbb{E}[g_{t-1}^{2}]+(1-\gamma) \nabla J(\theta_{t-1})^{2}θt=θt1η(E[gt2]+ϵ)12J(θt1) \theta_{t} = \theta_{t-1}-\frac{\eta}{(\mathbb{E}[g_{t}^{2}]+\epsilon)^{\frac{1}{2}}}\nabla J(\theta_{t-1})
gtg_{t}的更新公式可以看出,RMSProb算法类似于对历史信息γgt1\gamma g_{t-1}和当下的梯度信息J(θt1)2\nabla J(\theta_{t-1})^{2}做了一个加权
平均,减少了历史信息所占的比重,加强了当前梯度的占比,避免了AdaGrad步长随着迭代次数增加逐渐趋于0的问题。
而权重γ\gamma推荐设置为0.9。
RMSProb方法之所以这样命名的原因是,我们观察参数迭代公式中的分母项可以发现其刚好是梯度gg的均方根误差(root mean square error),所以我们将该方法命名为RMSProb。

3.4 AdaDelta

AdaDelta算法于2012年由Zeiler M D等人提出,在RMSProb的基础上进一步对累加的历史信息根据梯度的大小进行调整。在RMSProb中,每一次参数更新得大小是:
Δθt=η(E[gt2]+ϵ)12J(θt1)=ηRMS[gt2]J(θt1)\begin{aligned}\Delta \theta_{t} &=-\frac{\eta}{(\mathbb{E}[g_{t}^{2}]+\epsilon)^{\frac{1}{2}}}\nabla J(\theta_{t-1})\\&=-\frac{\eta}{RMS[g^{2}_{t}]}\nabla J(\theta_{t-1}) \end{aligned}作者认为上述的更新单元的分子和分母不是很匹配,没有相同的假设。为了克服这一点,他们定义了新的指数衰减的参数更新。
E[Δθt2]=γE[Δθt12]+(1γ)(Δθt)2\begin{aligned} \mathbb{E}[\Delta \theta_{t}^{2}] & =\gamma \mathbb{E}[\Delta \theta_{t-1}^{2}]+(1-\gamma) (\Delta \theta_{t})^{2} \end{aligned}RMS[Δθ]t=(E[gt2]+ϵ)12RMS[\Delta \theta]_{t}=(\mathbb{E}[g_{t}^{2}]+\epsilon)^{\frac{1}{2}}Δθt=RMS[Δθ]t1RMS[gt2]J(θt)\Delta \theta_{t}=-\frac{RMS[\Delta \theta]_{t-1}}{RMS[g^{2}_{t}]}\nabla J(\theta_{t})θt+1=θt+Δθt\theta_{t+1}=\theta_{t}+\Delta \theta_{t}在AdaGrad方法中,对学习率也进行了迭代更新,所以不需要设置学习率。

3.5 Adam

自适应动量估计法是另一种逐维度调节步长的算法。Adam同时以下两个辅助变量,并且分别按照指数衰减形式来累加梯度和梯度的平方:
mt=β1mt1+(1β1)gtm_{t}=\beta_{1}m_{t-1}+(1-\beta_{1})g_{t}vt=β2vt1+(1β2)gt2v_{t}=\beta_{2}v_{t-1}+(1-\beta_{2})g_{t}^{2}
mtm_{t}vtv_{t}可以看做是对梯度的均值和偏心方差的一个估计,并且作者提出可以通过以下的才做来消除估计的误差:
mt^=mt1β1t\hat{m_{t}}=\frac{m_{t}}{1-\beta_{1}^{t}}vt^=vt1β2t\hat{v_{t}}=\frac{v_{t}}{1-\beta_{2}^{t}}则参数值的更新就会变为如下:θt=θt1ηmt1^v^t112+ϵ \theta_{t}=\theta_{t-1}-\frac{\eta \hat{m_{t-1}}}{\hat{v}_{t-1}^{\frac{1}{2}}+\epsilon} 作者对于参数β1\beta_{1}β2\beta_{2}推荐设置为0.9和0.99,ϵ\epsilon设置为10810^{-8}β1\beta_{1}β2\beta_{2}之所以这样设置是因为作者发现在刚开始的时间点,估计有较大偏差,所以要尽快逃出。一般在实践中,Adam是效果最好的。这是因为Adam结合了带冲量的随机梯度下降法、AdaGrad、RMSProb以及AdaDelta等算法中的所有因素:

  1. 更新方向由历史梯度决定。
  2. 对步长运用累加梯度的平方值进行修正。
  3. 信息累加按照指数形式衰减。
    但是Radam也不是完美的,在训练的初期因为样本的缺少, Adam中的vtv_{t}方差会非常大。而vtv_{t}起到修正更新方向的作用,因此 Adam 参数的更新量的方差也会很大,进而容易落入一些局部最小值。

3.6 Radam

Radam是2019年由Liyuan Liu提出的,一种能够在训练初始阶段避免方差的方法。该方法直觉上可以看成一种‘预热’。所谓预热,是指训练的学习率在最初保持很小,然后逐渐增加的过程。这是因为在训练初期存在一个较大的方差,为了避免进入局部极值,或者造成‘过拟合’,需要用小一些的学习率,但是随着方差逐渐变小,就可以使得学习率增大。Radam的思路就是先找到一个Var(vt)Var(v_{t})的函数,随后计算其线性插值权重rtr_{t},然后根据rtr_{t}对学习率进行修正。作者定义了ρ=21β201\rho_{\infty}=\frac{2}{1-\beta_{2}^{0}}-1,参数更新方式如下:
mt=β1mt1+(1β1)gtm_{t}=\beta_{1}m_{t-1}+(1-\beta_{1})g_{t}vt=β2vt1+(1β2)gt2v_{t}=\beta_{2}v_{t-1}+(1-\beta_{2})g_{t}^{2}mt^=mt1β1t\hat{m_{t}}=\frac{m_{t}}{1-\beta_{1}^{t}}ρt=ρ2tβ2t1β2t\rho_{t}=\rho_{\infty}-\frac{2t\beta_{2}^{t}}{1-\beta_{2}^{t}}
当方差是可控的时,即ρt>4\rho_{t}>4:
rt=((ρt4)(ρt2)ρ(ρ4)(ρ4)ρt)12r_{t}=(\frac{(\rho_{t}-4)(\rho_{t}-2)\rho_{\infty}}{(\rho_{\infty}-4)(\rho_{\infty}-4)\rho_{t}})^{\frac{1}{2}}θt=θt1ηrtmt^(1β2tvt)12\theta_{t}=\theta_{t-1}-\eta r_{t}\hat{m_{t}}(\frac{1-\beta_{2}^{t}}{v_{t}})^{\frac{1}{2}}
否则直接按照带冲量随机梯度下降法:
θt=θt1ηmt^\theta_{t} = \theta_{t-1}-\eta \hat{m_{t}}
该方法在一些应用场景下收敛性可以优于Adam,并且该方法具有很好的稳定性。

4 实验

我们选用了全连接神经网络和卷积神经网络在mnist数据集上对上述的优化器进行了测试。优化器的参数选择按照了推荐的默认值。

4.1 全连接神经网络

全连接神经网络是十分基础却很重要的模型。这是使用的网络结构主要包括两个隐藏层。batch size统一设置为15。测试集的准确度随着不同epoch的变化如图2所示:
在这里插入图片描述
左图是整个训练的结果,右图是后50个epoch的结果
测试集的损失函数的值随着不同epoch的变化如图3所示:
在这里插入图片描述
通过观察上述结果,最新提出的Radam的方法不论在收敛性还是收敛速度上表现最佳。而adam算法却未曾表现最差,这是因为我们选用的batch size过小,并且选择的学习率较大。这就使得方差较大,进而导致adam优化器进入了局部极小值。观察曲线趋势,可以看到SGD with momentum和NAG表现得十分接近,但是NAG要优于SGD with momentum。RMSProb的收敛速度很快。而AdaGrad和AdaDelta表现得较差,前者可能是因为到最后因为不断累加导致步长较小,而后者可能收敛速度不够,导致还未达到最优点。SGD算法表现出来最慢的收敛速度,直到300个epoch仍然未达到最优点。

4.2 卷积神经网络

这里使用了传统的卷积神经网络对上述的其中优化算法在mnist手写数字数据集上进行了测试。相较于全连接神经网络,结构更加复杂。这里的卷积神经网络使用了两个卷积层加两个全连接层的结构,batch size统一设置为128。测试集的准确度随着不同epoch的变化如图2所示:
在这里插入图片描述
测试集的损失函数的值随着不同epoch的变化如图3所示:
在这里插入图片描述
通过观察上述结果,最新提出的Radam的方法在收敛速度上表现得最佳,其次为Adam和RMSProb,这三者在第一梯队。接着是SGD with momentum和NCG,后者的收敛速度略高于前者。随后是SGD和AdaGrad,前者的收敛速度在前期略慢于后者,但到了后期,SGD的收敛速度慢慢超过AdaGrad,这是因为后者的步长随着不断迭代,逐渐趋近于0。Adadelta的收敛速度在这里表现得最慢。就收敛性来看,理论上SGD是最高的,但是由于收敛速度过慢,未达到最优点,所有的方法中只有第一梯队的三种算法达到最优点,表现的基本近似。需要注意的是,在达到最优点的领域内后,由于这三种算法的步长过大,导致其走出点了最优点,并达到了另一个局部最优。

5 总结与展望

大规模神经网络的优化是一个热门并且很有意义的研究方向,目前实际应用中的主流还是Adam家族算法。但是虽然Adam家族算法在收敛速度上表现很好,但是在收敛性上还是很难与SGD打成平手。但是让人欣喜的是,最近涌现出的一些优化算法在某些特定类型任务上展现出很好的效果。目前对Ada算法进行warmup还缺乏理论基础,这是一个比较大的欠缺。另外还是希望能够看到具有颠覆性的算法出现。

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

相关文章

  1. 动态链接库信息查询

    通过file name.so可以查询链接库信息so库为x86-64,可以在GNU/Linux平台下使用,此时可以ldd -r name.so看依赖关系so库为ARM交叉编译好的文件,可以readelf -d name.so | grep NEEDED看依赖关系nm -CD name.so | grep "string"...

    2024/4/28 8:00:17
  2. 武钟祥强化课十七

    ...

    2024/4/25 10:11:09
  3. 简单介绍区块链的联盟链

    单群组FISCO BCOS联盟链 联盟链是区块链里面的一种, 简介: :区块链跟传统的B/S,C/S,项目的架构来说不同, 1:传统项目中心化(你付钱→淘宝收款→通知店铺发货→你确认收货→淘宝把钱打给给店铺), 区块链去中心化(你付款→卖家收款后把东西给你→双方对外宣称交易完成)…...

    2024/4/15 20:35:26
  4. 基于以太坊的秘钥管理服务

    之前做了一个秘钥管理工具,整理下方便以后查询功能点 服务端RPC API 5种方法注册 派生 更新dapp 更新账户 查看账户信息Ecsda加密临时会话 HD派生账户 多Root管理员 Root管理多Dapp Dapp管理多账户 访问日志管理 LevelDb存储 私钥管理客户端RPC 签名交易 临时Ecsda公钥加密 多…...

    2024/4/23 14:46:24
  5. SpringBoot 源码阅读(10):AutoConfigurationImportSelector(自动配置)

    AutoConfigurationImportSelector public class AutoConfigurationImportSelectorimplements DeferredImportSelector, BeanClassLoaderAware, ResourceLoaderAware,BeanFactoryAware, EnvironmentAware, Ordered {………… }该类为通过注解@EnableAutoConfiguration引入的类(…...

    2024/5/1 21:27:46
  6. pdf翻译成中文并导出word

    #!/usr/bin/env python # Version = 3.5.2 # __auth__ = 无名小妖 from pdfminer.pdfparser import PDFParser, PDFDocument from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter from pdfminer.layout import LAParams from pdfminer.converter import PD…...

    2024/4/26 17:35:31
  7. 荣耀总裁赵明揭秘华为薪酬制度:不看资历,只看贡献

    正值2019校招季,各大企业都开启了校园招聘。9月28日,荣耀总裁赵明在北京大学的校招说明会上,发布了题为《勇敢新世界》的演讲,与上千名志在加入华为的北大学子一起探讨当下,畅想未来。演讲中,赵明揭秘了华为的薪酬制度,“‘责任结果、绩效贡献’是员工回报分配和晋升的唯…...

    2024/4/25 3:08:25
  8. git版本回退问题

    提交本地分支至远程仓库的版本回退问题 打开“黑匣子”,查看原因 1.下午的15:17,提交修订版本后,此时远程仓库的代码没有任何问题。 commit cd91d900ec3ad53427131558706d349deac95781 (origin/old, origin/branch2) Author: Dennis <Denniswangyongle@126.com> Date…...

    2024/4/24 18:09:07
  9. 保护文档的DRM让文档到期自毁

    公司或者个人有一些重要文件需要被安全保护,但是同时有时候也需要将这些文件分享传输给他人进行阅读。将机密文件随意保存或者转发的后果是不可想象的。在大多数时候,当我将文档发送给他人之后,我们就失去了对文档的控制。 什么是文档安全? 文档安全可以用一些小工具进行保护…...

    2024/4/19 19:30:48
  10. MySQL的慢查询使用与分析

    一、查看慢查询功能状态查看慢查询状态 通过查看MySQL的slow_query_log变量,查看慢查询是否已经开启。 show variables like slow_query_log;示例: mysql> show variables like slow_query_log; +----------------+-------+ | Variable_name | Value | +----------------…...

    2024/4/15 13:30:59
  11. 洛谷:P1439 【模板】最长公共子序列(普及+/提高,dp基础)-------------lower_bound(),upper_bound(),binary_search()

    题目:分析:基础问题,但大佬提出的这个公共转化为上升的思路真的挺秒的。虽然他的lcs和lis没有搞清楚吧!:根据数据范围,典型的dp【】【】的最长公共子序列的模板是不能用了。 顺序查找显然超时: #include<bits/stdc++.h> using namespace std; vector<int> v…...

    2024/4/23 5:50:11
  12. 在SpringBoot中整合使用Netty框架提供WebSocket服务

    在SpringBoot中整合使用Netty框架 Netty是一个非常优秀的Socket框架。如果需要在SpringBoot开发的app中,提供Socket服务,那么Netty是不错的选择。 Netty与SpringBoot的整合,我想无非就是要整合几个地方 让netty跟springboot生命周期保持一致,同生共死 让netty能用上ioc中的…...

    2024/4/15 20:35:26
  13. Visual Studio版本号对应表

    从一个外行角度看,VC/VS有3种版本号,具备一定的迷惑性:(xx表示具体的数字)MSVC++ xx(VC版本 eg. VC6.0)_MSC_VER xxVisualStudio xx(VS版本 eg. VS2012)对照关系整理如下:VC版本_MSC_VERVS版本VC6.01200VS 6.0VC7.01300VS2002VC7.11310VS2003VC8.01400VS2005VC9.01500VS…...

    2024/4/19 18:51:39
  14. 生成GIF动态图

    把图片拼接成一个动态图关键库:import imageioimport os import imageioDURATION = 0.075 #两帧之间的时间间隔,秒为单位 path = os.getcwd() #获取当前的工作路径 # print(path)file_list = os.listdir(path) png_list = file_list.copy() #只保留结尾是png的图片 for file …...

    2024/4/15 20:35:23
  15. HotSpot为什么要分年轻代和老年代

    因为有的对象寿命长,有的对象寿命短,应该将寿命长的对象放在一个区域,寿命短的放在一个区域,进行不同层次的GC,寿命短的叫年轻代GC(minor GC),频率比较快,寿命长的叫老年代GC(Major GC)。堆中放的就是对象实例,就是new出来的都放堆里,堆又划分为年轻代和老年代,年…...

    2024/4/30 0:37:02
  16. WebView支持H5网页下载

    最近在做一个较简单的项目:通过一个webview来显示一个网页的App这个网页有下载的功能,关于这一功能需要用到两个知识点:1、webview监听网页的下载链接。(webview默认情况下是没有开启,在这个情况下,你会发现,在浏览器上可以正常下载的网页里的某个点击。在你的webview里…...

    2024/4/15 20:35:19
  17. task8学习笔记

    模块习题 1、怎么查出通过 from xx import xx导⼊的可以直接调⽤的⽅法? 导入后使用help(),运行会出现下面的情况,help后面直接输入要搜索的内容。 2、了解Collection模块,编写程序以查询给定列表中最常见的元素。 题目说明: 输入:language = [‘PHP’, ‘PHP’, ‘Pyt…...

    2024/4/15 20:35:18
  18. 在线教育平台搭建平台如何选择

    在线教育系统模式已经在教育中呈现爆发式增长,但是在线教育平台搭建该如何做呢?许多教育从业者或者小型培训机构因为资金和技术方面的原因,想找一个合适的平台,市场上有已搭建好的在线教育平台,也有需要开发的系统,那么我们到底该如何选择呢?1、借助直播平台 利用直播软…...

    2024/4/27 21:44:43
  19. c# 基于Redis缓存实现单点登录SSO的实例

    一、基本概念 最近公司的多个业务系统要统一整合使用同一个登录,这就是我们耳熟能详的单点登录,现在就NET基于Redis缓存实现单点登录做一个简单的分享。 单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,…...

    2024/4/15 20:35:16
  20. centos 常见问题

    安装Memcached时,使用phpize命令时报错: configure.ac:3: error: Autoconf version 2.68 or higher is requiredAutoconf是一个用于包以适应多种Unix类系统的 shell脚本的工具。作用:生成可以自动地配置软件源代码。解决:(1)查询当前版本: 命令:rpm -qf /usr/bin/autoc…...

    2024/4/23 14:09:00

最新文章

  1. 全新神经网络架构KAN一夜爆火!200参数顶30万,MIT华人一作 | 最新快讯

    白交衡宇发自凹非寺 量子位公众号 QbitAI 一种全新的神经网络架构 KAN&#xff0c;诞生了&#xff01; 与传统的 MLP 架构截然不同&#xff0c;且能用更少的参数在数学、物理问题上取得更高精度。 比如&#xff0c;200 个参数的 KANs&#xff0c;就能复现 DeepMind 用 30 万参数…...

    2024/5/3 3:28:10
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 权限提升-Linux系统权限提升篇VulnhubRbash绕过DockerLXD容器History泄漏shell交互

    知识点 1、普通用户到Linux-泄漏-History 2、普通用户到Linux-限制-Rbash绕过 3、普通用户到Linux-容器-LXD&Docker 4.Linux系统提权-web/普通用户-docker逃逸&提权&shell交互 章节点&#xff1a; 1、Web权限提升及转移 2、系统权限提升及转移 3、宿主权限提升及…...

    2024/5/1 13:20:00
  4. WKWebView的使用

    一、简介 在iOS中&#xff0c;WKWebView是WebKit框架提供的一个用于展示网页内容的控件&#xff0c;相比UIWebView有更好的性能和功能。 以下是在iOS中使用WKWebView的基本步骤&#xff1a; 1.1 导入WebKit框架 import WebKit1.2 创建WKWebView实例 let webView WKWebVie…...

    2024/5/2 7:33:06
  5. 416. 分割等和子集问题(动态规划)

    题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义&#xff1a;dp[i][j]表示当背包容量为j&#xff0c;用前i个物品是否正好可以将背包填满&#xff…...

    2024/5/2 11:19:01
  6. 【Java】ExcelWriter自适应宽度工具类(支持中文)

    工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...

    2024/5/2 16:04:58
  7. Spring cloud负载均衡@LoadBalanced LoadBalancerClient

    LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon&#xff0c;直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件&#xff0c;我们讨论Spring负载均衡以Spring Cloud2020之后版本为主&#xff0c;学习Spring Cloud LoadBalance&#xff0c;暂不讨论Ribbon…...

    2024/5/2 23:55:17
  8. TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案

    一、背景需求分析 在工业产业园、化工园或生产制造园区中&#xff0c;周界防范意义重大&#xff0c;对园区的安全起到重要的作用。常规的安防方式是采用人员巡查&#xff0c;人力投入成本大而且效率低。周界一旦被破坏或入侵&#xff0c;会影响园区人员和资产安全&#xff0c;…...

    2024/5/2 9:47:31
  9. VB.net WebBrowser网页元素抓取分析方法

    在用WebBrowser编程实现网页操作自动化时&#xff0c;常要分析网页Html&#xff0c;例如网页在加载数据时&#xff0c;常会显示“系统处理中&#xff0c;请稍候..”&#xff0c;我们需要在数据加载完成后才能继续下一步操作&#xff0c;如何抓取这个信息的网页html元素变化&…...

    2024/5/2 9:47:31
  10. 【Objective-C】Objective-C汇总

    方法定义 参考&#xff1a;https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...

    2024/5/2 6:03:07
  11. 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】

    &#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】&#x1f30f;题目描述&#x1f30f;输入格…...

    2024/5/2 9:47:30
  12. 【ES6.0】- 扩展运算符(...)

    【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数&#xff0…...

    2024/5/2 23:47:43
  13. 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?

    文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕&#xff0c;各大品牌纷纷晒出优异的成绩单&#xff0c;摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称&#xff0c;在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁&#xff0c;多个平台数据都表现出极度异常…...

    2024/5/2 5:31:39
  14. Go语言常用命令详解(二)

    文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令&#xff0c;这些命令可以帮助您在Go开发中进行编译、测试、运行和…...

    2024/5/3 1:55:15
  15. 用欧拉路径判断图同构推出reverse合法性:1116T4

    http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b&#xff0c;我们在 a i a_i ai​ 和 a i 1 a_{i1} ai1​ 之间连边&#xff0c; b b b 同理&#xff0c;则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然&#xff0…...

    2024/5/2 9:47:28
  16. 【NGINX--1】基础知识

    1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息&#xff0c;并安装一些有助于配置官方 NGINX 软件包仓库的软件包&#xff1a; apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...

    2024/5/2 9:47:27
  17. Hive默认分割符、存储格式与数据压缩

    目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限&#xff08;ROW FORMAT&#xff09;配置标准HQL为&#xff1a; ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...

    2024/5/3 1:55:09
  18. 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法

    文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中&#xff0c;传感器和控制器产生大量周…...

    2024/5/2 8:37:00
  19. --max-old-space-size=8192报错

    vue项目运行时&#xff0c;如果经常运行慢&#xff0c;崩溃停止服务&#xff0c;报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中&#xff0c;通过JavaScript使用内存时只能使用部分内存&#xff08;64位系统&…...

    2024/5/2 9:47:26
  20. 基于深度学习的恶意软件检测

    恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞&#xff0c;例如可以被劫持的合法软件&#xff08;例如浏览器或 Web 应用程序插件&#xff09;中的错误。 恶意软件渗透可能会造成灾难性的后果&#xff0c;包括数据被盗、勒索或网…...

    2024/5/2 9:47:25
  21. JS原型对象prototype

    让我简单的为大家介绍一下原型对象prototype吧&#xff01; 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定&#xff0c;每一个构造函数都有一个 prototype 属性&#xff0c;指向另一个对象&#xff0c;所以我们也称为原型对象…...

    2024/5/2 23:47:16
  22. C++中只能有一个实例的单例类

    C中只能有一个实例的单例类 前面讨论的 President 类很不错&#xff0c;但存在一个缺陷&#xff1a;无法禁止通过实例化多个对象来创建多名总统&#xff1a; President One, Two, Three; 由于复制构造函数是私有的&#xff0c;其中每个对象都是不可复制的&#xff0c;但您的目…...

    2024/5/2 18:46:52
  23. python django 小程序图书借阅源码

    开发工具&#xff1a; PyCharm&#xff0c;mysql5.7&#xff0c;微信开发者工具 技术说明&#xff1a; python django html 小程序 功能介绍&#xff1a; 用户端&#xff1a; 登录注册&#xff08;含授权登录&#xff09; 首页显示搜索图书&#xff0c;轮播图&#xff0…...

    2024/5/2 7:30:11
  24. 电子学会C/C++编程等级考试2022年03月(一级)真题解析

    C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...

    2024/5/3 1:54:59
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57