【pytorch系列】优化器optimizer的使用与常用优化器

news2024/11/15 13:44:15

1 optimizer类实例


1.1 介绍

属性

  • 【default】该实例的类型为 dict,元素为初始化时候的学习率等,具体的keys为
     ['lr','momentum',  'dampening',  'weight_decay',  'nesterov']
    
  • 【state】保存参数更新过程中的一些中间变量,如momentum的缓存(使用前几次的梯度进行平均)
  • 【params_groups】该实例的类型为 list,可以将神经网络中需要更新的参数分组管理,list中每个元素为一组数据,包括:优化器中需要更新的参数,以及default中超参数在当前的对应数据。数据格式为
    [
    {'lr': **, 'momentum': **,  'dampening':**,  'weight_decay':**,  'nesterov':**, 'params':[**]} ,
     ...
    ]
    

方法

  • 【step()】进行一次梯度更新
  • 【zero_grad()】清零优化器中模型参数的梯度。主要在 .step() 后使用。注意pytorch主张 张量梯度不自动清零
  • 【add_param_group()】入参类型为字典,即要添加参数组,以及对该组参数需设置的超参,如未设置默认使用default中的。添加的参数组会存放在 param_group属性当中。优化器可管理多组数据,该方法在finetune模型时经常使用。
  • 【state_dict()】获取优化器当前状态信息,我们去到源码可看到,该方法的返回值如下 在这里插入图片描述
  • 【load_state_dict()】加载状态信息。这两个方法用于模型断点的一个继续训练,所以我们在训练时,隔一段时间应保存一次该信息。

1.2 例子

这里使用个小例子来说明优化器的使用:

import torch
import torch.nn as nn
import torch.optim as optim

def geneWeight():
    weight = torch.randn((2,2),requires_grad=True)
    weight.grad = torch.ones((2,2))
    return weight
torch.manual_seed(0)
a = geneWeight()
b = geneWeight()

optimizer = optim.SGD([a], lr=0.1)
optimizer.add_param_group({'params': [b], 'weight_decay': 0.005})

optimizer.step()
optimizer.zero_grad()

可有以下分析

  • 1 【optimizer的属性】在实例化后进行debug,可看到【defaultparam_groupsstate
    在这里插入图片描述

  • 2 optimizer.add_param_group()运行之后的optimizer的内容如下,可以看到【.add_param_group()】的操作将新的参数组添加到优化器中
    在这里插入图片描述

    • 【optimizer.param_groups中的参数】与【变量(在工程中就是网络模型中的参数)】的关系:
      打印两者的id,可以看到是完全一致的,说明optimize.param_groups中的参数存的是网络中参数的引用,这样操作也是为了节省内存
      在这里插入图片描述
  • 3【optimizer.step()optimizer.zero_grad()

    • 使用debug模式,在该.step()命令运行前后分别打印变量的data和grad,可以看到权重进行了更新,对于SGD优化器的更新公式为【weight = weight - lr * grad】
    • .zero_grad() 命令前后运行分别打印参数信息,可以看到梯度置零
    • 可以看到,权重的更新和梯度的置零是分开操作的。当资源有限的情况下,就可以多次进行梯度计算(这里涉及到loss.backward)求梯度均值,再进行权重更新 和 梯度置零,这就是 梯度累计操作。这样在资源有限的情况下,约等于增大了前向传播的batch。
      在这里插入图片描述
  • 4【.state_dict().load_state_dict()
    这两种方法,是用于保存和加载优化器的一个状态信息,经常用于训练中间断掉后的继续训练。
    在第一次运行保存结果时的 optimizer,和第二次运行加载模型后的optimizer,可查看两次的优化器当中的 state_dict()的内容,这里不截图展示。

     import torch
     import torch.nn as nn
     import torch.optim as optim
     import os
      
     def geneWeight():
         weight = torch.randn((2,2),requires_grad=True)
         weight.grad = torch.ones((2,2))
         return weight
     
     torch.manual_seed(0)
     a = geneWeight()
     b = geneWeight()
     
     optimizer = optim.SGD([a], lr=0.1)
     optimizer.add_param_group({'params': [b]})
     
     ckpt = "optimizer_state_dict.pt"
     pretrained = True
     if pretrained and os.path.exit(ckpt):
         state_dict = torch.load(ckpt)
         optimizer.load_state_dict(state_dict)
     
     for i in range(100):
         optimizer.step()
         torch.save(optimizer.state_dict(), ckpt)
    

2 常用优化器的计算

损失函数:深度学习模型通过引入损失函数,用来计算目标预测的错误程度。根据损失函数计算得到的误差结果,需要对模型参数(即权重和偏差)进行很小的更改,以期减少预测错误。
优化器:使损失函数最小化的方式更改可训练参数,损失函数指导优化器朝正确的方向移动。


优化器的发展历程:SGD -> SGDM -> NAG —>AdaGrad -> AdaDelta -> Adam -> Nadam–>…
从AdaGrad之后提出的为 自适应学习率的优化算法。其思想:经常更新的参数,需要学习速度慢一些,偶尔更新的参数,需要学习率大一些。


2.1 SGD

BGD (Batch gradient descent) 批量梯度下降法】:每次的梯度的更新 使用所有的样本。每一次的梯度更新都使用所有样本,更新100次遍历所有数据100次

  • 优点:每次迭代都计算了全部的样本,获取到的是全局最优解
  • 缺点
    1)要对实际数据同时计算梯度,就会非常的耗时;
    2)同事实际使用中数据量都很大,无法进行一次完成所有数据的迭代。

SGD(Stochastic gradientdescent)随机梯度下降法】:每次的梯度的更新 使用一个样本。

  • 优点:速度快
  • 缺点
    1)噪声大,波动大;
    2)非常容易陷入局部最优解;
    3)结果具有随机性,因为可能只使用到部分的样本,就已经迭代到局部最优解了

MBGD(Mini-batch gradient descent)小批量梯度下降】:每次的梯度的更新 使用batch个样本。

  • 优点
    1)相较SGD收敛更稳定;
    2)另一方面可以充分地利用深度学习库中高度优化的矩阵操作来进行更有效的梯度计算。
  • 缺点
    1)SGD的学习受 学习率影响,如果lr偏大,lossfunction 会在极小值处不停地震荡;lr偏小,收敛速度就会变慢。
    这种情况一般解决方法,训练开始使用较大lr,随着迭代过程逐步降低lr,这样我们需要多尝试 lr降低策略,直到找到最优的)
    2)对于非凸函数,容易陷入局部最优解。因为在鞍点周围的所有维度的梯度都约等于0,就很容易困在这里在这里插入图片描述

但在实际的论文或工程中,所说的使用优化器SGD,其实指代的MBGD。这样强调的重点是参数更新的计算方式,而不是batch数量。所以在本博客接下来的表述中,SGD就指代MBGD。

SGD的表达式为: θ t = θ t − 1 − l r ∗ ▽ t J ( θ t ) \theta^{t}=\theta^{t-1}-lr*\bigtriangledown _{t}J(\theta^{t}) θt=θt1lrtJ(θt)


2.2 SGD+Momentum

为了优化SGD的问题,提出了SGDM(使用动量的随机梯度下降)。
动量方法是为了加速学习(加速梯度下降),特别的是处理高曲率、小但一致的梯度,或带噪声的梯度。动量累积了之前梯度指数级衰减的移动平均,并继续沿该方向移动。
这里约等于是对动量进行了加权平均。

具体的数学表达式如下: v t = γ v t − 1 + l r ∗ ▽ J ( θ t ) v^{t} = \gamma v^{t-1} + lr*\bigtriangledown J(\theta^{t}) vt=γvt1+lrJ(θt) θ t = θ t − 1 − v t \theta^{t}=\theta^{t-1}-v^{t} θt=θt1vt
其中, g t g^t gt为本次计算的梯度, l r lr lr 为学习率, θ \theta θ为当前的参数。
γ \gamma γ为动量因子,通常被设置为0.9~0.99之间。

SGDM】好处:

  • 减小震荡,加速收敛: 在前后两次梯度方向改变时,momentum能够降低参数更新速度,从而减少震荡;在两次梯度方向相近时,momentum可以加速参数更新, 从而加速收敛
  • 离开鞍点,离开局部最优: 如果运行到了鞍点,不会立马停下来,即使当前的方向为水平,因为会借用上一时刻的动量,从而离开鞍点,离开局部最优值。

在pytorch中,SGDM的公式调整为 v t = γ v t − 1 + ▽ J ( θ t ) v^{t} = \gamma v^{t-1} + \bigtriangledown J(\theta^{t}) vt=γvt1+J(θt) θ t = θ t − 1 − l r ∗ v t \theta^{t}= \theta^{t-1}-lr*v^{t} θt=θt1lrvt

这里图示简单示意SGDM是如何减小震荡的。横轴为权重参数,纵轴为该操作的输出,我们想由起始点开始优化迭代,直至目标输出target。

  • 使用SGD的收敛曲线 (图一),进行了7次的梯度更新后,到达target。使用SGDM的收敛曲线 (图二),进行4次的梯度更新后,到达target。
    对与某一次的迭代,若上次和本次的梯度方向相反(夹角大于90),则会减弱本次的梯度,使其减小震荡,加速收敛 (图三);若上次和本次的梯度方向相近(夹角小于90度),动量项产生一个加速的作用,从而加速收敛(图略)。最后给出个动图模拟两者的收敛
    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述
    请添加图片描述

2.3 NAG

牛顿加速梯度动量优化方法(NAG, Nesterov accelerated gradient):沿着上一步的速度方向先走一小步,再看当前的梯度然后再走一步。简化的理解是:

  • SGD:在点B时,直接沿着点B的梯度进行更新即可
  • SGDM:在点B时,先沿着动量项的方向更新到B’,然后在按照点B的梯度方向更新。
  • NAG:在点B时,先沿着动量项的方向更新到 B’,然后计算B’ 位置的梯度,再沿着 B’ 的梯度方向进行更新。具体公式为 θ ′ = θ t − 1 − γ v t − 1 \theta^{'}=\theta^{t-1}-\gamma v_{t-1} θ=θt1γvt1 v t = γ v t − 1 + l r ∗ ▽ J ( θ ′ ) v_{t}=\gamma v_{t-1}+lr*\bigtriangledown J(\theta^{'}) vt=γvt1+lrJ(θ) θ t = θ t − 1 − v t \theta^{t}=\theta^{t-1}-v_t θt=θt1vt在这里插入图片描述

在pytorch内,对需要训练的参数只维护一组参数的,而且是自动求导。这也就意味着,我们每次的梯度更新是需要走到 θ ′ \theta^{'} θ,下一次的backward才能在 θ ′ \theta^{'} θ处求导。虽然最后得到的是“多跨了一步动量”的参数,但是由于到最后靠近极值点的时候动量已经很小了,所以有一点误差也并无大碍。
经推导,上面可修改为 v t = γ v t − 1 + ▽ J ( θ t − 1 ′ ) v_t=\gamma v_{t-1} + \bigtriangledown J(\theta^{'}_{t-1}) vt=γvt1+J(θt1) θ t ′ = θ t − 1 ′ − l r ∗ ( ▽ J ( θ t − 1 ′ ) + γ v t ) \theta^{'}_{t} = \theta^{'}_{t-1} - lr * (\bigtriangledown J(\theta^{'}_{t-1}) + \gamma v_{t}) θt=θt1lr(J(θt1)+γvt)


2.4 AdaGrad

二阶动量:可以度量历史更新频率。使⽤⼀个小批量随机梯度 g t g_t gt按元素平⽅的累加变量 的所有历史累计值 n t n_t nt。 可以解释为以往所有梯度值的平方和,越大表示经常跟新,越小表示不经常更新。
n 0 = g 0 2 n_0=g^{2}_0 n0=g02
n 1 = g 0 2 + g 1 2 n_1=g^{2}_0+g^{2}_1 n1=g02+g12
n 2 = g 0 2 + g 1 2 + g 2 2 n_2=g^{2}_0+g^{2}_1+g^{2}_2 n2=g02+g12+g22

AdaGrad 的操作为:根据梯度的情况自适应的调整学习率,从而避免统⼀的学习率难以适应所有维度的问题。在第t次时,有公式: n t = n t − 1 + g t 2 n_{t}=n_{t-1}+g^{2}_{t} nt=nt1+gt2 Δ θ t = − l r n t + ε ∗ g t \Delta \theta_{t}=-\frac{lr}{\sqrt{n_{t}+\varepsilon }}*g_{t} Δθt=nt+ε lrgt
特点:

  • n t n_t nt单调递增, l r ′ lr^{'} lr单调递减。
  • 前期 n t n_t nt较小的时候,学习率较大,能够放大梯度。
    后期 n t n_t nt 较大的时候,学习率较小,能够缩小梯度
    中后期,分母上梯度平方的累加会越来越大,使gradient→0,使得训练提前结束。

2.5 RMSProp算法 / Adadelta算法

两者都是为了解决 AdaGrad 学习率下降过快的问题,提出了 n t n_t nt的计算使用加权的方式,只关注过去一段时间内的变化。

  • 对于RMSProp,更新的梯度为 n t = γ n t − 1 + ( 1 − γ ) g t 2 n_{t}=\gamma n_{t-1}+(1-\gamma)g^{2}_{t} nt=γnt1+(1γ)gt2 Δ θ t = − l r n t + ε ∗ g t \Delta \theta_{t}=-\frac{lr}{\sqrt{n_{t}+\varepsilon }}*g_{t} Δθt=nt+ε lrgt
  • 对于Adadelta,没有学习率这个超参数。它会维护一个新的变量 Δ x t \Delta x_{t} Δxt,初始为0,用其来带替学习率的设置。
    n t = γ n t − 1 + ( 1 − γ ) g t 2 n_{t}=\gamma n_{t-1}+(1-\gamma)g^{2}_{t} nt=γnt1+(1γ)gt2 Δ θ t = − Δ x i − 1 + ε n t + ε ∗ g t \Delta \theta_{t}=-\frac{\sqrt{\Delta x_{i-1}+\varepsilon }}{\sqrt{n_{t}+\varepsilon }}*g_{t} Δθt=nt+ε Δxi1+ε gt Δ x i = ρ Δ x i − 1 + ( 1 − ρ ) g t 2 \Delta x_{i}=\rho \Delta x_{i-1}+(1-\rho )g^{2}_{t} Δxi=ρΔxi1+(1ρ)gt2

2.6 Adam

Adam(Adaptive Moment Estimation)自适应矩估计。adam–> SGDM + RMSProp,也就是结合了动量加权、自适应学习率的系数加权(梯度的平方)。公式为 v t = β 1 v t − 1 + ( 1 − β 1 ) g t v_t=\beta_{1}v_{t-1} + (1-\beta_1)g_t vt=β1vt1+(1β1)gt n t = β 2 n t − 1 + ( 1 − β 2 ) g t 2 n_t=\beta_2n_{t-1} + (1-\beta_2)g^2_t nt=β2nt1+(1β2)gt2作者发现一阶和二阶值初始训练时很小,接近为0,所以作者重新计算了个偏差进行校正,降低偏差对训练初期的影响。训练前期时, 1 / ( 1 − β t ) 1/(1-\beta^t) 1/(1βt)起到校正作用,训练后期,该项约定于1,不起作用。 v ^ t = v t 1 − β 1 t \hat{v}_t=\frac{v_t}{1-\beta^t_1} v^t=1β1tvt n ^ t = n t 1 − β 2 t \hat{n}_t=\frac{n_t}{1-\beta^t_2} n^t=1β2tnt 最终的梯度更新为 θ t + 1 = θ t − l r n ^ t + ε v ^ t \theta_{t+1}=\theta_t-\frac{lr}{\sqrt{\hat{n}_t+\varepsilon}}\hat{v}_t θt+1=θtn^t+ε lrv^t其中 β 1 t \beta^t_1 β1t β 2 t \beta^t_2 β2t β \beta β的t次方。超参通常选择 β 1 = 0.9 \beta_1=0.9 β1=0.9 β 2 = 0.999 \beta_2=0.999 β2=0.999 ε = 1 0 8 \varepsilon=10^8 ε=108

adam中 1 / ( 1 − β t ) 1/(1-\beta^t) 1/(1βt)的参数的推导:
n 1 = ( 1 − β 2 ) g 1 2 n_1=(1-\beta_2)g^2_1 n1=(1β2)g12
n 2 = β 2 v 1 + ( 1 − β ) g 2 2 n_2=\beta_2 v_1+(1-\beta)g^2_2 n2=β2v1+(1β)g22
   = β 2 ( 1 − β 2 ) g 1 2 + ( 1 − β 2 ) g 2 2 =\beta_2(1-\beta_2)g^2_1+(1-\beta_2)g^2_2 =β2(1β2)g12+(1β2)g22
   = ( 1 − β 2 ) ( β 2 g 1 2 + g 2 2 ) =(1-\beta_2)(\beta_2g^2_1+g^2_2) =(1β2)(β2g12+g22)
   = ( 1 − β 2 ) ( β 2 2 − 1 g 1 2 + β 2 2 − 2 g 2 2 ) =(1-\beta_2)(\beta^{2-1}_2g^2_1+\beta^{2-2}_2g^2_2) =(1β2)(β221g12+β222g22)
   = ( 1 − β 2 ) ∑ i = 1 2 β 2 2 − i g 2 2 =(1-\beta_2)\sum^2_{i=1}\beta^{2-i}_2g^2_2 =(1β2)i=12β22ig22
n t = ( 1 − β 2 ) ∑ i = 1 t β 2 t − 1 g i 2 n_t=(1-\beta_2)\sum^t_{i=1}\beta^{t-1}_2 g^2_i nt=(1β2)i=1tβ2t1gi2
E ( n t ) = ( 1 − β 2 ) E ( ∑ i = 1 t β 2 t − i g i 2 ) + ξ E(n_t)=(1-\beta_2) E(\sum^{t}_{i=1}\beta^{t-i}_2 g^2_i)+\xi E(nt)=(1β2)E(i=1tβ2tigi2)+ξ
    = ( 1 − β 2 ) ( 1 + β 2 1 + β 2 2 + . . . + β 2 t − 1 ) E ( g i 2 ) + ξ =(1-\beta_2)(1+\beta^1_2+\beta^2_2+...+\beta^{t-1}_2)E(g^2_i)+\xi =(1β2)(1+β21+β22+...+β2t1)E(gi2)+ξ
    = ( 1 − β 2 ) ( 1 − β 2 t 1 − β 2 ) E ( g i 2 ) + ξ =(1-\beta_2)(\frac{1-\beta^t_2}{1-\beta_2})E(g^2_i)+\xi =(1β2)(1β21β2t)E(gi2)+ξ
    = ( 1 − β 2 t ) E ( g i 2 ) + ξ =(1-\beta^t_2)E(g^2_i)+\xi =(1β2t)E(gi2)+ξ
我们实际需要的是梯度的二阶矩估计 E ( g i 2 ) E(g^2_i) E(gi2),但当前是对 v t v_t vt求期望 E ( v t ) E(v_t) E(vt),因此要得到 E ( g i 2 ) E(g^2_i) E(gi2),就需要除以前面的系数。
公式推导是OK的,但这里的个人理解还是有点不明确。只需要把握住:重新计算了个偏差进行校正,可以降低偏差对训练初期的影响。

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

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

相关文章

网络安全-kali配置ssh服务+敏感文件泄+dirsearch脚本

网络安全-kali配置ssh服务敏感文件泄dirsearch脚本 seccure shell 就是加密的telnet 远程用的 service ssh start 开启ssh服务metstat -tpan |gerp 22 监听这个端口是否开启 可以看到本地的22端口这个文件是/etc/ssh/sshd_config 输入 set number 找到第57行 把这个前面的#注…

Smartbi电子表格软件产品的由来

思迈特软件(以下简称“Smartbi”)自2022年11月以来发布的「Smartbi Spreadsheet 电子表格软件」产品(以下简称“电子表格软件”或"Spreadsheet")。 这个软件就是报表工具,那为什么不叫 Report,而…

java 自习室找座系统 mysql

自习室座位管理系统采用B/S结构、结合网络数据库开发技术来设计本系统。开发语言采用JSP,数据库使用Mysql数据库。完成以下基本功能: 功能: 1界面(管理员登录、学生登录) 2管理员更新自习室剩余座位情况 3学生查询自习…

误差与精度

整理自《误差理论与数据处理》——合肥工业大学 机械专业用于教授学生误差与精度概念的课程叫做《公差与测量》,而公差的本质含义就是误差,所以这门课其本质教授的还是误差理论。当时在学校并没有好好学习这么课程,工作之后才发现这个课程的重…

云原生时代,不可不知的基础设施即代码(IaC)

💡 IaC 是 DevOps 的必要支撑。 近日,在极狐TechTalk 直播上,极狐(GitLab) 高级网站可靠性工程师SRE 戚加欣,从 SRE 视角出发,与大家分享了 IaC 基础知识、工具和方法和基于极狐GitLab 的具体实践经验。 以下内容整理自…

路由反射器、联邦

路由反射器 RFC4456 IBGP水平分割:路由器无法将从IBGP对等体学习到的路由信息传递给其他IBGP对等体。 IBGP水平分割解决了AS内部环路的问题,但是产生了新的问题----BGP路由在AS内部只能传递一跳,会造成lBGP路由无法被正常传递,造成通讯障碍。…

使用计算机视觉实战项目精通 OpenCV:6~8

原文:Mastering OpenCV with Practical Computer Vision Projects 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 计算机视觉 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 当别人说你没有底线…

Vue3PDF预览(vue3-pdf-app)

vue3-pdf-app 插件 可自定义设置以下属性: pdf地址(src),类型:string,必传,默认 预览容器宽度(width),类型:number | string,默认 …

数字化转型框架如何搭建?

根据GetSmarter对来自128个国家/地区的5808名专业人士进行关于数字化转型的调查,揭示了几个重要的发现。 首先是所有行业和工作角色对数字化转型的看法不同。它不仅仅专注于集成和利用新技术,例如机器学习(ML)、人工智能(AI)、大数据和自动化。它是关于…

云原生之在kubernetes集群下部署Mysql应用

云原生之在kubernetes集群下部署mysql应用 一、Mysql介绍二、kubernetes集群介绍1.k8s简介2.k8s架构图 三、本次实践介绍1.本次实践简介2.本次环境规划 三、检查本地k8s集群环境1.检查k8s各节点状态2.检查k8s版本3.检查k8s系统pod状态 四、编辑mysql.yaml文件五、创建mysql应用…

STM32G070 onchip移植FlashDB

一、Onchip Flash 特性 在STM32G070 的片内 Flash写入数据之前必须先对目标地址进行擦除后才能写入数据数据写入:G070 Flash 写入数据必须保证8字节对齐,一次写入双字数据64bit 8Byte数据读取:使用地址直接读取 二、移植FAL 1. 添加以下文…

全面详解Java多线程基础-2:线程的状态

相关阅读: 全面详解Java多线程基础-1:Thread类及其基本用法 操作系统里的进程,自身是有一个状态的。而Java的Thread类是对系统线程的封装,它把这里的“状态”又进一步精细化了。 理解线程状态,意义是能够让我们更好地…

当ChatGPT遇上StableDiffusion ChatGPT指导StableDiffusion绘画

ChatGPT指导StableDiffusion 前言开始使用场景1:繁华的街道场景2:桥上的女生 项目及教程地址,附GPT访问地址安装教程及安装包地址:点我下载开源项目:点我下载GPT访问地址,点我访问 前言 Stable Diffusion …

java下

双列集合的特点 双列集合一次需要存一对数据,分别为键和值键不能重复,值可以重复键和值是一一对应的,每一个键只能找到自己对应的值键+值这个整体我们称之为“键值对”或者“键值对对象”,在Java中叫做“Entry对象” …

git及vs2019代码量统计的方法

git 在工程下打开git bash //替换username,查看个人代码量 git log --author"username" --prettytformat: --numstat | awk { add $1; subs $2; loc $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", ad…

基于matlab之NR SSB 光束扫描仿真

一、前言 此示例说明如何在 5G NR 系统的发射器 (gNB) 和接收器 (UE) 端使用波束扫描。本示例使用同步信号块 (SSB) 说明了初始访问期间使用的一些波束管理程序。为了完成声束扫描,该示例使用了…

人工智能全球发展趋势、经济影响和未来挑战

人工智能(AI)作为一种新兴技术,正在引领世界经济和社会的变革。在过去几年中,全球范围内对人工智能的投资和研究持续增长,这使得人工智能成为了各行各业的关注焦点。本文将介绍人工智能的基础知识和应用场景&#xff0…

3个问题!验明GPT-4真身;基于GPT科研加速技巧汇总;Midjourney神仙教程;印象笔记有AI功能啦 | ShowMeAI日报

👀日报&周刊合集 | 🎡生产力工具与行业应用大全 | 🧡 点赞关注评论拜托啦! 🤖 『GPT-4 验明真身的三个经典问题』快速区分 GPT-3.5 与 GPT-4,快来对答案 这里收集了几个免费使用 GPT-4 的工具&#xff…

LVDS为汽车应用提供可靠的视频接口

摘要:汽车视频应用中,降低视频干扰的途径是用数字信号替代模拟信号。最有效的视频传输方案是采用低电压差分信号(LVDS)接口,因为它具有较低的信号幅度(0.35V)和差分架构,可大大降低电磁辐射。 新型汽车电子信号格式变化最快的是视…

如何在 iPhone 上恢复永久删除的照片?

iPhone永久删除的照片是否永远消失了? 你想知道永久删除的照片在 iPhone 上放在哪里吗?通常情况,操作系统会将已删除照片的存储空间进行标记为准备好覆盖(还未实际删除)。iPhone 也是如此。 如果互联网连接良好&a…