03.SELF-INSTRUCT+Alpaca

news2024/11/20 6:15:48

文章目录

  • 前言
  • 泛读
    • 储备知识
      • 提示学习
      • 提示工程Promt Engineering
      • 答案工程
    • 背景介绍
      • 研究SELF-INSTRUCT的动机
      • 研究意义&贡献
  • 精读
    • Overview
      • 种子任务
      • 步骤1:定义指令数据
      • 步骤2:自动指令数据生成
        • 步骤2.1指令生成
        • 步骤2.2指令分类
        • 步骤2.3实例生成
        • 步骤2.4筛选和后处理
    • 实验分析和讨论
      • 多样性分析
      • 生成质量
      • 应用结果
  • ALpaca
    • LoRA
    • LoRA的优点
    • 实操
      • 注意事项
      • 训练(微调)
      • 预测
    • 核心代码

前言

首发公众号:学姐带你学AI
本课程来自深度之眼《大模型——前沿论文带读训练营》公开课,部分截图来自课程视频。
文章标题:SELF-INSTRUCT: Aligning Language Model with Self Generated Instructions
自指导:将语言模型与自生成的指令相结合
作者:Yizhong Wang等
单位:华盛顿大学
发表时间:ACL 2023

泛读

储备知识

提示学习

第一篇大模型LLaMA里面就有提到过这个概念,这里再详细讲解一下。这个技术是用在大模型上的,因为大模型参数比较多,因此调整参数非常困难,经研究发现调整输入亦可以达到提高模型表现的目的,因此提示学习孕育而生。
白话:大模型相当于: y = f ( x ) y=f(x) y=f(x)中的 f f f函数包含非常复杂,难以调整以使得 y y y得到更好的表现,但修改输入 x x x同样能影响 y y y,且修改 x x x非常简单,无需修改模型的参数。
因此,为了更好的发掘预训练语言模型的潜力,利用其不同的能力,研究趋势如下:

预训练模型提示学习
预训练+微调 → \rightarrow 预训练+提示+预测

具体来说,提示学习是研究者们为了下游任务设计出来的一种输入形式或模板(或者说一种表现形式),它的目的是能够帮助预训练模型“回忆”起自己在预训练时“学习”到的东西,它是一种激活预训练模型知识的技术手段。例如:
输入为:我喜欢这部电影。
输出模板为:我喜欢这部电影,总的来说,它是一部_______的电影。
那么模型可能会在下划线处填上:很棒、不错、值得一看…

目前prompt的一般方法:pre-train, prompt, and predict,新的范式
上面的例子就是预训练任务属于Masked Language Model,可让预训练语言模型 (下面简称为PLM) 用表示情感的答案填空。

对于其他任务,prompt的方法也可以通过设计不同的模板,通过选取合适的prompt,控制模型预测输出。适用于下游各种任务。不需要修改PLMs的结构,能够充分利用PLMs所学习到的知识。大量研究表明,prompt的微小差别,可能会造成效果的巨大差异。这也就引发可后续如何自动构造prompt一系列工作,因此就有了提示工程(autoGPT就是类似工具)。

提示工程Promt Engineering

Prompt 工程是创建 prompting 函数 f p r o m p t ( x ) f_{prompt}(x) fprompt(x),根据需要填充的文字[Z]的位置,可以分成两种Prompt 工程:

前缀Prompt完形填空Prompt
应用场景延续字符串前缀填充文本中空白的字符串
对应任务主要针对关生成的任务或使用标准自回归 LM 解决的任务使用掩码 (Mask) LM 解决的任务(如:BERT)
原因生成方式与模型从左到右的性质刚好吻合生成方式与预训练任务的形式非常匹配

答案工程

答案工程的目的是搜索一个 answer 空间 Z 和一个到原始输出 Y 的映射,从而得到一个有效的预测模型。
在这里插入图片描述

背景介绍

研究SELF-INSTRUCT的动机

以上介绍的prompt称之为:指令。
各种研究表明:对大模型进行指令微调,可使的模型对于新任务具有0-shot的卓越能力(摘要第一句)。但指令微调很大程度上依赖于人类(专家)编写的指令数据,这些些数据在数量、多样性和创造性方面都是有限的,阻碍了调整后的模型的通用性。(摘要第二句)
因此,有研究开始尝试建立能够遵循自然语言指令的模型。工作主要有两个:大预训练语言模型和人类编写的Instruction。(Introduction第二句)
这里原文提到两篇文献,涉及到两个数据集,它们使用了大量的人工注释来收集指令:
PromptSource: An Integrated Development Environment and Repository for Natural Language Prompts
SUPER-NATURAL INSTRUCTIONS: Generalization via Declarative Instructions on 1600+ NLP Tasks

使用人工注释使得成本很高,而且很倾向于主流的NLP任务,没有涵盖真正的各种任务和描述它们的不同方式。鉴于这些限制,就需要继续提高指令调整模型的质量,来实现更好的LLMS。(Introduction最后一部分)
这篇文章的Alpaca指令微调模型,展现出了较强指令遵循能力,有类似于chatGPT的能力展现。其指令微调数据集都是通过本篇文章提出的SELF-INSTRUCT方法,并通过Open AI的API进行提取的。

问题:为什么要使用Open AI的API?
答:指令微调实际上是调整模型的输入 X X X,要想提高模型效果必须要获得输入对应的输出 Y Y Y才能进行对应调整,获取输出就必须调用Open AI的API。

研究意义&贡献

它提出了一种框架:Self-Instruct,可以利用语言模型自己的生成能力,来提高其遵循指令的能力,而不需要大量的人工标注数据。这种方法可以降低指令微调的成本和难度,同时提高模型的泛化性和创造性。(摘要第三句)

贡献:(Introduction最后一段)
它提出了一种自动生成指令、输入和输出样本的流程,然后对它们进行筛选和后处理,再用它们来微调原始的语言模型。
它在vanilla GPT3上应用了该方法,并在Super-NaturalInstructions数据集上取得了与InstructGPT_001(人工标注结果)相当的性能,后者是使用私有的用户数据和人工标注来训练的。
它提供了一种几乎无需标注的方法,来使预训练的语言模型与指令对齐,并且发布了它生成的大规模合成数据集,以促进未来对指令微调的研究。
发布了一个包含52k条指令的大型合成数据集和一组手工编写的新任务,用于建立和评估未来的指令模型

精读

Overview

在这里插入图片描述
原文:A high-level overview of SELF-INSTRUCT. The process starts with a small seed set of tasks (one instruction and one input-output instance for each task) as the task pool. Random tasks are sampled from the task pool, and used to prompt an off-the-shelf LM to generate both new instructions and corresponding instances, followed by filtering low-quality or similar generations, and then added back to the initial repository of tasks. The resulting data can be used for the instruction tuning of the language model itself later to follow instructions better. Tasks shown in the figure are generated by GPT3. See Table 10 for more creative examples.
简单解释:整个过程是半自动(需要初始化种子任务)的迭代引导算法,该算法利用模型本身的指令信号对预训练的LM进行指令调整。
seed task:种子任务
task pool:任务池
instruction generation:指令生成
Classification task identification:是否分类任务

种子任务

原始的、最早定义的一批数据(175个),实际上就是有固定字段格式的文本:
id,name,instruction,instances(包括可为空的input,output),is_classification
样式如下:

{"id":"seed_task_0", "name": "breakfast_suggestion","instruction": "Is there anything I can eat for a breakfast that doesn't include eggs, yet includes protein, and has roughly 700-1000 calories?""instances"[{"input": "", "output": "Yes, you can have 1 oatmeal banana protein shake and 4 strips of bacon. The oatmeal banana protein shake may contain 1/2 cup oatmeal,60 grams whey protein powder,1/2 medium banana,1tbsp flaxseed oil and 1/2 cup watter, totalling about 550 calories. The 4 strips of bacon contains about 200 calories."}],"is_classification":false}

步骤1:定义指令数据

从上面的例子可以看到,每条指令都用自然语言定义了一个任务task。每个任务都有一个或多个输入输出实例instance(X,Y)
模型的期望输出可以表示为:
Y = M ( t a s k , X ) Y=M(task,X) Y=M(task,X)
很多情况下,指令和实例输入并没有严格的边界。举个例子:
“写一篇关于人工智能的文章 ”可以是一个指令,希望模型能够直接响应,输出一篇文章。而它也可以被表述为 “写一篇关于XXXX的文章 ”作为任务指令,而 "人工智能"作为实例输入填入XXXX。
注意:X可以为空。
可以将输入看做指令的补充说明,以达到更具体的效果。

步骤2:自动指令数据生成

在这个步骤,模型被提示生成新的任务指令。这一步是利用现有的指令集来创造更广泛的指令任务,通常是新的任务。
生成指令数据的流程由四个步骤组成。
1)指令生成,
2)识别指令是否代表分类任务,
3)根据是否分类任务选择用输入优先或输出优先的方法生成实例,
4)过滤低质量数据。

步骤2.1指令生成

已有研究发现:大型预训练的语言模型在遇到上下文中的一些现有指令时,可以被提示生成新的指令。这个发现提供了一种从一小部分人类编写的指令种子中扩充指令数据的方法,也是本文SELF-INSTRUCT的思想。

利用人工编写的175个任务(1个指令+1个实例)作为任务池,用引导的方式产生多样化的指令集。具体方法是:先从种子池中随机抽取6个人工编写的指令,再随机抽取2个之前步骤中模型生成的指令,总共8个指令(就是让大模型进行few shots的生成)。输入给模型,让模型输出一个新的指令。

这里第一次迭代的时候没有生成指令,则直接选取8条人工指令,这里选用人工指令是保证模型的正确性;
这里加入生成指令目的是为了增强模型的泛化性和随机性

这里对应overview中的:
在这里插入图片描述

步骤2.2指令分类

使用GPT3 few-shot去识别生成的指令是否是分类任务。
处理分类和非分类任务,需要两种不同的方法。所以接下来要识别生成的指令是否代表分类任务。 文中使用种子任务中的12条分类指令和19条非分类指令,提示预训模型进行区分,提示模板如下图所示:
在这里插入图片描述

步骤2.3实例生成

针对分类和非分类任务,使用两种不同的Prompt构造方法:
■输入优先:主要针对生成类任务,优先生成实例中的X,在产生相应的Y。
■输出优先:主要针对分类任务,给定指令,先生成输出Y,再生成输入。避免先生成输入,再生成输出时结果单一。通俗的说就是正样本较多的情况下,避免模型把所有输入都标记(瞎蒙)为正样本(结果单一)。

步骤2.4筛选和后处理

筛选的标准:
新生成的指令只有与种子池中的指令的 ROUGE-L 小于0.7时才会添加进入种子池;
排除一些无法被语言模型处理的指令,比如涉及图像、图片、图形的指令;
在给指令生成实例时,过滤掉那些完全相同的实例。

附录C中给出了生成得比较好的指令示例:
在这里插入图片描述
也给出了一些生成失败的实例:

在这里插入图片描述
在这里插入图片描述
将合格的指令加入指令池,并反复迭代。

实验分析和讨论

生成的指针统计数据如下表所示:
在这里插入图片描述
由于一个指令可以对应多个实例,所以指令数量52K,对应实例数量为82K,比例约为1:1.5。

多样性分析

在这里插入图片描述
这个漂亮的图就是多层环形饼图,相当于两个系列,分两层显示。
图中内圈是动词,外圈是动词对应的名词。图中绘制了前20个最常见的根动词和它们的前4个直接名词对象,这占了整个集合的14%。例如,write后面常接letter、essay、paragraph以及function。

计算生成指令与种子指令的ROUGE-L重叠度(这个指标用来评价摘要的共现度的):
在这里插入图片描述

生成质量

文章随机抽取了200条指令,并在每个结构中随机选择一个实例。请一位专家标注(文章的共同作者)从指令、实例输入和实例输出的角度来标注每个实例是否正确,结果如表2所示:
在这里插入图片描述
结论:大多数生成的指令是有意义的,而生成的实例可能包含更多的噪音(在合理的范围内)

应用结果

在这里插入图片描述
①箭头表示 SELF-INSTRUCT加持后GPT3性能暴涨33.1%
②箭头表示SELF-INSTRUCT加持后基本与InstructGPT001持平
③箭头表示它与标记指令集结合能进一步提升性能3

在这里插入图片描述

ALpaca

使用方法见:https://github.com/pengwei-iie/alpaca-lora

LoRA

LoRA(Low-Rank Adaptation of Large Language Models)中文含义是大语言模型的低阶适应,是一种PEFT(Parameter-Efficient Fine-Tuning)参数高效微调技术,是微软提出用来解决大语言模型参数微调的技术。其基本原理是冻结预训练好的模型权重参数,在冻结原模型参数的情况下,通过往模型中加入额外的网络层,并只训练这些新增的网络层参数。由于这些新增参数数量较少,这样不仅finetune的成本显著下降,还能获得和全模型微调类似的效果。

在这里插入图片描述
原来的输出可表示为:
h ′ = W 0 x h' = W_0x h=W0x
为了微调模型,给他加上额外的网络层,训练时 W 0 W_0 W0不变只训练 Δ W \Delta W ΔW,则变成:
h = W 0 x + Δ W x h= W_0x+\Delta Wx h=W0x+ΔWx
Δ W \Delta W ΔW可以进一步用矩阵分解的方式来表示:
h = W 0 x + Δ W x = W 0 x + B A x B ∈ R d × r , A ∈ R r × k , rank  r < < min ⁡ ( d , k ) h=W_0x+\Delta Wx=W_0x+BAx\\ B\in \R^{d\times r},A\in \R^{r\times k},\text{rank }r<<\min (d,k) h=W0x+ΔWx=W0x+BAxBRd×r,ARr×k,rank r<<min(d,k)
分解后参数量变少(从 d × k d\times k d×k个变成 d × r + r × k d\times r+r\times k d×r+r×k个),具体实作上可以看为:
原来的模型是(忽略图中参数的维度和上面不一样):

在这里插入图片描述
现在给他加上额外的网络层,则变成:

在这里插入图片描述
将输入 x x x复制一份,分别丢进两边,左边参数不变,右边参数调整:

在这里插入图片描述
将得到结果相加:

在这里插入图片描述
原理:预训练语言模型具有较低的“本征维度“,尽管随机投影到一个较小的子空间,仍然可以有效地学习。

LoRA的优点

1.从LoRA的原理可以看到,LoRA可以使得大模型更方便的共享了,我们把大模型看做多用螺丝刀的底座,然后把多个A和B矩阵看做不同的批头,只要我们训练好多个A和B矩阵,就可以使用一个底座完成不同任务,从而大大减少存储需求和任务切换开学。

在这里插入图片描述
2.LoRA使训练更加有效(即使是与prefix的方法相比也是一样),在在使用自适应优化器时,硬件门槛降低了3倍,因为我们不需要计算梯度或维护参数优化器的状态。相反,我们只优化注入的、小得多的低秩矩。
3.LoRA与许多先前的方法是不相关的,并且可以与许多方法相结合,例如前缀微调。

实操

注意事项

1.安装环境

pip install -r requirements.txt

需要注意的是peft安装对网速要求比较高,比较容易安装失败,如提示克隆超时,可将zip格式的peft项目下载到本地后再安装。此时需要修改requirement.txt的内容,将peft修改为本地路径即可,就是下面代码中加井号那里。

accelerate
appdirs
loralib
bitsandbytes
black
black[jupyter]
datasets
fire
git+https://github.com/huggingface/peft.git # /hy-tmp/peft 
transformers>=4.28.0
sentencepiece
gradio

2.跑到200 steps就出现OOM (out of memory)错误,解决方法:
upgrading transformers to the dev version pip install git+https://github.com/huggingface/transformers seems to have resolved it. bitsandbytes==0.37.2 also work

训练(微调)

启动服务器,打开终端,新建一个目录

git clone https://github.com/pengwei-iie/alpaca-lora.git

把llama7b模型down下来进行(下载地址在这里,大约26G)。
下载llama的代码如下:

git lfs install
git clone https://huggingface.co/decapoda-research/llama-7b-hf

然后用SELF-INSTRUCT微调
在finetune.py文件中有几行代码是设置训练的几个路径参数的,第一个设置基础大模型,这里选用huggingface集成了的llama(对应上面精读LoRA原理中蓝色部分,也就是多功能螺丝刀的底座,所以最好是下载到本地,便于匹配不同的批头),然后设置SELF-INSTRUCT的指令集,最后设置输出的目录。

python finetune.py \
    --base_model 'decapoda-research/llama-7b-hf' \
    --data_path 'yahma/alpaca-cleaned' \
    --output_dir './lora-alpaca'

这里需要自己手工修改为本地存放对应文件的路径。
当然,还有两个size:

# training hyperparams
    batch_size: int = 128,
    micro_batch_size: int = 4,

第一个batch_size是保存梯度累积的大小(这里实际值为:128÷4=32),第二个才是在GPU中训练的batch_size大小,这个直接会影响GPU内存的占用,如果显存不够就把它改成2(对应16G显存)。

然后可以运行run.py开始训练,并显示运行参数及过程

bash run.sh
tail train_fine.out -f

这里需要对run.sh进行编辑,路径、size含义和上面一样,这里nohup可以使得系统后台不挂断地运行这个命令,毕竟炼丹时间需要12h以上。

nohup python finetune.py \
    --base_model './path_to_llama-7b-hf' \
    --data_path './alpaca_data_cleaned_archive.json' \
    --batch_size '32' \
    --micro_batch_size '2' \
    --output_dir './lora-alpaca' > train_fine.out 2>&1 &

预测

一种是等炼丹完毕进行预测,也可以将别人微调好的lora下载(不大10多M)下来进行预测,这里主要讲后者。

编辑一个down.py文件

from huggingface_hub import snapshot_download 
snapshot_download(repo_id="tloen/alpaca-lora-7b",cache_dir="./lora")

具体的repo_id可以看老师网站的说明,后面的cache_dir表示将模型参数下载到哪个路径。

在这里插入图片描述
运行down.py就会得到alpaca-lora这个文件夹。
然后编辑generate.py文件,这里面也有几个参数需要注意:

python generate.py \
    --load_8bit \
    --base_model 'decapoda-research/llama-7b-hf' \
    --lora_weights 'tloen/alpaca-lora-7b'

base_model 是指定大模型底座,lora_weights 是指定批头,这里要把下载下来的snapshots的jason文件指定进来。
运行generate.py后会得到一个url,放到浏览器打开就可以进行预测了:

在这里插入图片描述

核心代码

主要看finetune.py

这里导入huggingface的peft,它集成了许多参数微调的方法,里面当然包含LoRA

from peft import (
    LoraConfig,
    get_peft_model,
    get_peft_model_state_dict,
    prepare_model_for_int8_training,
    set_peft_model_state_dict,
)

train函数中定义了许多参数,
lora_r: int = 8这个表示精讲中提到的矩阵分解后的秩
实例化了prompt,原来是jason格式,这里转化为文本格式:

prompter = Prompter(prompt_template)

generate_and_tokenize_prompt函数对指令进行处理

model = get_peft_model(model, config)表示将大模型和微调部分网络层合并

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

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

相关文章

19.组件之间传递数据

不同组件传递数据的时候&#xff0c;最好不要直接传递复杂数据类型(比如对象&#xff0c;数组) 前端需要处理的数据层级一般不会很多&#xff0c;需要在多处使用的数据一般会被放到数据库中 目录 1 组件的关系 2 父向子传递数据-props 3 子向父传递数据-自定义事件 4 …

分布式任务调度平台 XXL-JOB 实战

❤ 作者主页&#xff1a;欢迎来到我的技术博客&#x1f60e; ❀ 个人介绍&#xff1a;大家好&#xff0c;本人热衷于Java后端开发&#xff0c;欢迎来交流学习哦&#xff01;(&#xffe3;▽&#xffe3;)~* &#x1f34a; 如果文章对您有帮助&#xff0c;记得关注、点赞、收藏、…

Scrum敏捷估算

无论是团队研发一款产品或者开发某一个项目&#xff0c;我们都需要回答“我们大概什么时间能够完成&#xff1f;”&#xff0c; 或者到某一个时间点&#xff0c;我们能够做到什么程度&#xff0c; 因此和传统的开发模式一样&#xff0c;我们在工作开始之前需要对我们需要做的事…

Linux Vim基本操作(文件的打开和编辑)完全攻略(有图有真相)

首先学习如何使用 Vim 打开文件。 Vim 打开文件 使用 Vim 打开文件很简单&#xff0c;例如在命令行模式下打开一个自己编写的文件 /test/vi.test&#xff0c;打开方法如下&#xff1a; [rootitxdl ~]# vim /test/vi.test 刚打开文件时 Vim 处于命令模式&#xff0c;此时文件…

CTFshow-pwn入门-前置基础pwn26-pwn28

什么是ASLR 大多数的攻击都基于这样一个前提&#xff0c;即攻击者知道程序的内存布局&#xff0c;需要提前知道shellcode或者其他一些数据的位置。因此&#xff0c;引入内存布局的随机化能够有效增加漏洞利用的难度&#xff0c;其中一种技术就是ASLR&#xff08;Address Space…

无线wifi视频传输方案|基于qca9531方案SKW99的无线视频流云端推送方案

为满足物联网智慧校园&#xff0c;智能家居&#xff0c;智慧工厂&#xff0c;智能交通、智慧博物馆、培训机构等不同行业实时直播的需求。本篇以集成200万高清摄像头功能的高通方案qca9531 wifi模块SKW99为为例&#xff0c;简单介绍基于WiFi技术的无线视频流云端推送方案。 1、…

上位机与两台PLC之间无线PPI通信

在实际系统中&#xff0c;人机界面与PLC通常不在一起&#xff0c;中心计算机一般放置在控制室&#xff0c;而PLC安装在现场车间&#xff0c;二者之间距离往往从几十米到几千米。如果布线的话&#xff0c;需要挖沟施工&#xff0c;比较麻烦&#xff0c;这种情况下比较适合采用无…

0基础学习VR全景平台篇第47篇:底部菜单-场景/分组复制功能

大家好&#xff0c;欢迎观看蛙色VR官方系列——后台使用课程&#xff01; 本期为大家带来蛙色VR平台&#xff0c;底部菜单—场景/分组复制功能操作。 功能位置示意 一、本功能将用在哪里&#xff1f; 平台用户在编辑作品时可以使用本功能将作品中的某一分组或者某一场景进行复…

岩土工程监测案例:完整链条的振弦传感器、采集仪和在线监测系统

岩土工程监测案例&#xff1a;完整链条的振弦传感器、采集仪和在线监测系统 在岩土工程监测中&#xff0c;振弦传感器被广泛应用于测量土体或岩体的振动情况&#xff0c;以了解地震或其他振动事件对结构物或地基的影响。振弦传感器具有高精度、快速响应、易于安装和低成本等优…

django校园宿舍管理系统-计算机毕设 附源码84831

django校园宿舍管理系统 摘 要 本论文主要论述了如何使用Django开发一个校园宿舍管理系统&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述校园宿舍管理系统的当…

RocketMQ部署之动态设置JVM启动参数

这里是weihubeats,觉得文章不错可以关注公众号小奏技术&#xff0c;文章首发。拒绝营销号&#xff0c;拒绝标题党 背景 线上的RocketMQ集群有运行一段时间了。比如测试环境和线上环境的RocketMQ集群部署的机器内存大小肯定不一样。所以可能要写多个部署脚本。非常麻烦 官方的部…

一张图秒懂嵌入式Linux系统的启动流程

一图胜千言&#xff01;看图&#xff1a; 上图是嵌入式系统启动流程图&#xff0c;图中红色的数字圆点表示启动的先后顺序。主要分为 4 个阶段&#xff0c;分别是&#xff1a;第一阶段 bootloader&#xff0c;第二阶段uboot&#xff0c;第三阶段内核启动&#xff0c;第四阶段 a…

【数据管理架构】OLAP 与 OLTP:有什么区别?

这些术语经常相互混淆&#xff0c;那么它们的主要区别是什么&#xff1f;您如何根据自己的情况选择合适的术语&#xff1f; 我们生活在一个数据驱动的时代&#xff0c;使用数据做出更明智决策并更快响应不断变化的需求的组织更有可能脱颖而出。您可以在新的服务产品&#xff08…

理想吹响城市NOA号角:激光雷达车型又火了

作者 | 德新编辑 | 王博 2023下半年&#xff0c;以华蔚小理为代表的智能驾驶头部厂商&#xff0c;其高阶辅助驾驶全面进城。 在过去短短一周时间里&#xff0c;蔚来、华为、理想、小鹏紧锣密鼓悉数公布了新进展。此外据HiEV了解&#xff0c;比亚迪、智己、飞凡等品牌的智驾团队…

excel爬虫相关学习2:vba 爬虫相关xmlhttp

目录 前言&#xff1a;vba 爬虫相关xmlhttp的方法 1 什么是xmlhttp 1.1 定义 1.2 特点 1.3 创建xmlhttp对象的过程 1.4 XMLHTTP对象创建的几种方法&#xff1a; 2 XMLHTTP方法&#xff1a; 2.1 xmlhttp.open(Method, Url, Async, User,Password) 2.1.1 xmlhttp.open(…

再谈JWT

什么是JWT JSON Web Token是一个开发标准&#xff08;RFC 7519&#xff09;,定义了一个紧凑且独立的方式&#xff0c;可以将各方之间的信息作为JSON对象进行安全传输,该信息可以验证和信任&#xff0c;因为是经过数字签名的。 JWT是JSON Web Token的缩写&#xff0c;是一种轻…

第39步 深度学习图像识别:Inception V3建模(Tensorflow)

基于WIN10的64位系统演示 一、写在前面 &#xff08;1&#xff09;Inception V1 Inception是一种深度学习模型&#xff0c;也被称为GoogLeNet&#xff0c;因为它是由Google的研究人员开发的。Inception模型的主要特点是它的“网络中的网络”结构&#xff0c;也就是说&#x…

编译原理笔记6:从正规式到词法分析器(3):DFA最小化、词法分析器的构造、Lex 使用示例

目录 从 DFA 到最小 DFA等价可区分划分算法&#xff1a;最小化 DFA 的状态数&#xff08;DFA化简&#xff09;手写 DFA 词法分析器的构造Lex 使用示例 从 DFA 到最小 DFA 关于星闭包的补充&#xff1a;一个语言被认为是所有可能字的子集。所有可能字的集合可以被认为是所有可能…

手机操作系统的沉浮往事(下)

接上篇&#xff1a;手机操作系统的沉浮往事&#xff08;上&#xff09; 2007年&#xff0c;是手机市场发生历史性转折的一年。 这一年的1月9日&#xff0c;在Macworld 2007大会上&#xff0c;史蒂夫乔布斯正式发布了第一代iPhone。 改变人类科技史的一天 iPhone的问世&#xff…

LeetCode - #83 删除排序链表中的重复元素

文章目录 前言1. 描述2. 示例3. 答案关于我们 前言 我们社区陆续会将顾毅&#xff08;Netflix 增长黑客&#xff0c;《iOS 面试之道》作者&#xff0c;ACE 职业健身教练。&#xff09;的 Swift 算法题题解整理为文字版以方便大家学习与阅读。 LeetCode 算法到目前我们已经更新…