【通览一百个大模型】XLNet(Google)

news2024/12/24 10:19:29

XLNet

欢迎订阅阅读【大模型&NLP&算法】。

  • 作者:王嘉宁
  • 本文章内容为转载或整理;
  • 仓库链接:https://github.com/wjn1996/LLMs-NLP-Algo

【通览一百个大模型】XLNet(Google)

作者:王嘉宁,本文章内容为原创,仓库链接:https://github.com/wjn1996/LLMs-NLP-Algo

订阅专栏【大模型&NLP&算法】可获得博主多年积累的全部NLP、大模型和算法干货资料大礼包,近200篇论文,300份博主亲自撰写的markdown笔记,近100个大模型资料卡,助力NLP科研、学习和求职。


XLNet大模型基本信息资料卡

序号大模型名称归属推出时间规模预训练语料评测基准模型与训练方法开源论文模型地址相关资料
1XLNetGoogle2019-06<1B预训练语料:Wikipedia和BookCorpus共13GB。
Giga5(16GB)、ClueWeb 2012-B、Common Crawl
GLUE、SuperGLUE、SQuAD、RACE等NLU数据集(1)排序语言模型目标:假设排列组合方式为 x4 -> x3 -> x1 -> x2,那么在预测 x3 的时候,可以看到 x4 的信息,并 mask 掉 x1 和 x2 这两个单词;当排列组合方式为 x2 -> x4 -> x3 -> x1时,在预测 x3 的时候,可以看到 x2、x4 的信息,mask 掉 x1 单词。不管选择哪一种排列组合方式,实际句子输入时单词的顺序并没有改变,只是通过 mask 的方法,将排列组合顺序中需要预测的位置之后的全部内容屏蔽掉,等价于自回归语言模型,但利用了上下文中的信息。
(2)双流自注意力:内容流(content stream) 指的是单词的全部信息可见,包括单词本身的内容和位置信息;查询流 (query stream)实际上也可理解为位置流,只包含单词的位置信息。
image.png
GithubXLNetxlnet-large-cased查看

XLNet 模型是在 2019 年 10 年由 CMU 和 Google 大脑团队在 NIPS 顶会上联合发布,是 Bert 模型不到一年之后又一刷爆榜单的模型。XLNet 一共在 20 个 NLP 任务上超越了 Bert,并且其中 18 个任务在当时取得了 SOTA 的成绩。
在 XLNet 出现之前,NLP 领域的两大预训练语言模型阵营分别是 AR 和 AE 模型,我们先看下面这张图关于两种模型的对比。

AR模型 VS AE模型
AR (Auto-regressive LM) 即自回归语言模型,任务是根据句子中前面已知的单词信息,来预测后面的单词,典型代表是 RNN/LSTM。比如在句子 “New York is a city" 中预测 “a” 这个单词,需要用到 “New York is” 来预测,也就是预测的词与前面的词有依赖关系。AR 模型的目标函数是根据句子前面的单词预测后面单词的似然概率最大,具有严格的数学公式表达。
AE (Auto-encoding LM) 即自编码语言模型,典型代表是 Bert 模型,其任务是在句子中随机 Mask 掉一些单词,并通过上下文来重新预测这些被标记为 [MASK] 的单词。因此 Bert 这种在输入中加入所谓的噪声并进行单词还原的模型也被称为降噪 (Denoising) 的自编码模型。AE 模型的目标函数是根据句子中的上下文预测 [MASK] 单词的似然概率最大。从数学公式中细心一点我们可以发现采用了“≈”号,这是因为 Bert 模型是假设所有 [MASK] 单词之间是没有关系的,即预测 MASK 时丢失了来自其他 [MASK] 的信息,因此数学表达相比 AR 模型没有那么严格。

两种语言模型的优缺点对比

AR 模型的训练过程是单向的,只能从前往后预测或者从后往前预测,不能充分利用上下文的信息,因此模型的性能不能进一步的提升。而优点是生成类的任务是自左向右的,与 AR 模型的结构有很好的匹配,因此在生成类任务上 AR 模型的表现是更优异的。AE 模型的优点是双向训练,预测时充分考虑了上下文的内容。而缺点在于一方面做了独立假设,基于 [MASK] 单词之间相互独立,因此目标函数是近似的计算。另一方面在预训练阶段引入了 [MASK] 标签,而在 fine-tuning 阶段这个标签是不存在的,导致两个阶段存在差异。

模型改进

改进方向

结合 AR 模型和 AE 模型的优缺点,我们希望改进后的模型既具备生成能力,又能双向训练,同时可以避免预训练和 fine-tuning 之间的 discrepancy,由此引申出来两个改进思路。第一种是以 Bert 模型为基础进行改进,第二种是以 LM 模型为基础的改进。XLNet 的提出更多的是为了提升模型的生成能力,因此最终改进的方向是围绕 LM 模型为基础,并使模型具备双向训练的能力。

改进1 - 排列组合 Permutation

借鉴 NADE (Neural autoregressive distribution estimation) 的思想,在XLNet模型中引入排列组合方法,使得 AR 模型也能够学习到上下文的信息。排列组合的思想是,对于一个长度为 n 的序列,对每个单词打乱顺序,一共可以得到 n! 种排列组合的分解因子 (Factorization order) 方式。举个简单的例子,假如一个句子原始顺序是 x=x1x2x3x4,随机打乱后选择其中一种排序为 x1 -> x4 -> x2 -> x3,那么预测第三个位置为 x3 单词的概率可以用公式表示为 p(x) = p(x3|x1,x4,x2) p(x2|x1,x4) p(x4|x1),其中 p(x3|x1,x4,x2) 表示已知第一个词是 x1,第二个词是 x2,第四个词是 x4 的条件下,第三个词是 x3 的概率。这样一来,虽然 x4 的位置是在 x3 的后面,但是在预测 x3 时可以用到后面的信息,也就是上下文的信息都可以利用起来。
如下图所示,第一种排列组合方式为 x4 -> x3 -> x1 -> x2,那么在预测 x3 的时候,可以看到 x4 的信息,并 mask 掉 x1 和 x2 这两个单词;第二种排列组合方式为 x2 -> x4 -> x3 -> x1,在预测 x3 的时候,可以看到 x2、x4 的信息,mask 掉 x1 单词。不管选择哪一种排列组合方式,本质上句子输入时单词的顺序并没有改变,只是通过 mask 的方法,将排列组合顺序中需要预测的位置之后的全部内容屏蔽掉,等效成使用自回归语言模型的训练方法,但同时利用了上下文中的信息。

Factorization order diagram
排列组合语言模型的目标函数可以表示成以下公式:其中 ZT 表示所有排列组合方式的集合,z 表示选择其中一种排列组合方式,即已知该排列组合前面 t-1 个位置内容的条件下,预测 t 位置单词为 XZT 的最大似然概率。

PLM objective function
而在实际训练的时候,考虑到句子很长的情况下,排列组合的数量 n! 会非常大,如果每个组合都训练一次需要的计算量极大。因此对于一个句子只采样一种排列组合的方式进行训练。另外一个句子中不是所有位置都需要预测,XLNet 采用的是部分预测的方法,即如果取位置靠前面的单词来预测,由于可利用的上下文信息很有限,训练效率也不高。因此只选择位置在最后 1/K 的单词来预测,这样利用的上下文的单词更多了,训练的收敛更快。K 的值一般取 6~7 (14%~16%),与 Bert 模型 mask 掉 15% 的单词也是差不多的。

改进2 - 双流注意力机制 Two-stream attention

采用排列组合的方法后,通过 mask 掉句子中的一部分单词来等效实现了利用上下文信息预测这些 mask 单词的内容,相当于结合了语言模型和 Bert 的优点。但是如果只用 Permutation 方法会存在一个问题,在一个排列组合顺序中,已知前面 t-1 个位置单词,来预测下一个位置的单词,那么对于同一个真实值,似然概率都是一样的,与真实值在原始句子顺序中的位置是没有关系的。
举个简单的例子,“I love China very much"这个句子中,原始顺序表示为 [1, 2, 3, 4, 5]。如果打乱顺序为 z = [2, 4, 1, xxx, xxx],即已知 “love”, “very”, “I” 这三个单词,那么预测下一个单词为 “China” 时,不管它在原始顺序处在位置3还是位置5,其预测概率都是相同的,也就是等同于 “I love much very China”。而显然 “China” 放在 “love” 后面的概率要更高。
由此进一步改进,对于预测目标,除了需要知道前面位置的单词外,还需要加入目标的位置信息。比如下图中的排列组合顺序 x3 -> x2 -> x4 -> x1,预测 x4 时需要知道 x3、x2 的位置和内容(下图中用实线表示),还需要知道 x4 的位置(下图中用虚线表示),但不能提前暴露 x4 的内容。为此 XLNet 引入双流自注意力机制的方法,其中双流分别指的是内容流 (content stream) 和 查询流 (query stream)。内容流指的是单词的全部信息可见,包括单词本身的内容和位置信息;查询流实际上也可理解为位置流,只包含单词的位置信息。

具体实现上,内容流做 self-attention 时,Q 取当前位置的全部信息(用 h(m-1) 表示),K 和 V 取所有位置的全部信息(图 a 所示)。查询流做 self-attention 时, Q 取当前位置的位置信息(用 g(m-1) 表示),K 和 V 取其他位置的全部信息(图 b 所示)。

Content-stream and Query-stream
XLNet 将两种 stream 组合在一起使用,每一层的每个位置的都分别求出内容流 h(m-1) 和查询流 g(m-1) 。当某个位置的单词需要被预测时,则该位置只用到 g(m-1) 的隐藏编码;反之如果某个位置的单词是已知的信息,那么该位置用到 h(m-1) 的隐藏编码。完整训练过程如下图所示。

Two-stream co-work and attention masks
综合上述,优化后的 XLNet 目标函数中增加了预测位置的信息,如下公式中 zt 表示预测目标的位置。这种方法也称为 target-aware prediction。

PLM optimized objective function

改进3 - 借鉴 Transformer-XL 的思想

我们知道 Transformer 相比于 RNN 模型的优势在于长距离依赖的问题,但缺点是需要的内存非常大。假如一段输入文本长度为 N,那么 Transformer 内部的 self-attention 由于是两两单词之间计算,即需要 N 平方的计算量。因此 Transformer 在空间复杂度上的问题比较突出,需要考虑将内存分散到不同的机器。在 Transformer-XL 出来之前,解决方法是将长文本拆分成几个等长的短文本,并单独训练。虽然解决了计算量的问题,但是也打断了短文本之间的联系。
而 Transformer-XL 提出的解决方法是,将长文本拆分成几个 segment,每个 segment 再通过 RNN 的方法串联起来从而学习到相互间的关系。下图展示了在 Transformer 模型结构基础上做的改进,首先有两个已经拆分好的 segment t 和segment t+1,输入阶段都进行了 word embedding + positional embedding 并输出给第一层 encoder block。对于 segment t,每一层 encoder block 的隐状态输出,一方面用作下一层 encoder block 的输入,另一方面作为segment t 的 “Memory” 信息输出给 segment t+1 的同一层 encoder block,两个 segment 同一层 encoder block 的隐状态输出进行拼接,并且每一层都重复同样的操作,从而实现了将两个 segment 之间的信息关联起来,与此同时计算所需的内存也大大降低。

Segment recurrence mechanism

改进4 - Relative positional encoding

将长文本拆成几个 segment 之后,随着而来出现了另外一个问题。采用 Transformer 的绝对位置编码方式,每个 segment 的同一个位置编码是一样,导致 segments 之间同一个位置无法区分先后顺序。因此 Transformer-XL 还需引入相对位置编码方式。
采用绝对位置编码时,Transformer 的 attention score 可以分解为下面左图的形式。其中,i、j 分别表示 query 和 key 的位置,E 表示 word embedding,U 表示 positional encoding,因此实际上下面的公式由 (Exi+Ui)WqWk(Exj+Uj) 按乘法分配律分解成 4 个多项式的。可以发现 (a) 项是关于两个词向量之间的相关性,(b) © 项都是关于一个位置的词向量与另一个位置的位置编码之间相关性,(d) 项是关于两个位置编码之间相关性。

Attention score of absolute and relative positional encoding
为了用相对位置编码的方式替换绝对位置编码,在原有的分解式做了3处改进(右图的公式表示):

  1. 将所有的 Uj 项统一改成 Ri-j,也就是将 Key 的绝对位置表示替换成 Key 和 query 之间的相对位置表示;
  2. 由于 key 的绝对位置表示已经换成了相对位置表示,那么 query 的绝对位置表示 Ui 也就没有意义了,因此两处的 Ui 只需用一个可学习的参数 u 和 v 分别表示即可。
  3. Transformer 中的 word embedding 和 positional encoding 都采用了相同的线性变换。因此进一步细化,可以对两种编码分别采用两个不同的线性变换,将 Wk 项拆分成 Wk,E 和 Wk,R。

采用新的参数定义后,每一项有了更加直观的含义:(a) 项完全是内容相关的表征,(b) 项是内容相关的位置偏置,© 项全局内容的表征,(d) 项是全局的内容偏置。

改进5 - Relative segment encoding

对于句子对任务,BERT 的输入结构为 [CLS, 句子A, SEP, 句子B, SEP],因为需要区分两个句子,Bert 引入了 absolute segment encoding 的方式,句子前面的部分 [CLS, 句子A, SEP] 为 segment A,按值 0 进行编码;句子后面的部分为 segment B,按值 1 进行编码。
借鉴 relative positional encoding 的思想,XLNet 采用了 relative segment encoding 方法,即 segment 不是各自独立地进行编码,而是根据 segment 之间相对关系来编码。在计算 attention 时,如果两个位置 i, j 属于同一个 segment,那么编码统一取为 sij=s+;如果两个位置 i, j 属于不同的 segment,那么编码统一取为 sij=s-。计算 i, j 之间的 attention 时,在常规的 attention 分数基础上,再加上一个 aij 分量:aij=(qi+b)Tsij,其中 qi 是位置 i 的 query 向量,b 是偏移量。
引入 relative segment encoding 方法后,使得 segment 之间的关系表征更加泛化,同时下游任务不局限于句子对任务,还适用于多个 segmnt 的任务。

试验结果

在同等模型参数大小和数据规模的条件下,XLNet 的性能几乎全面超越了 Bert。以 XLNet-Large 和 BERT-Large 两个模型为例进行对比,对于阅读理解任务 SQuAD 和 RACE,XLNet 的性能提升是最明显的,平均有 2 个点的分数提高。而对于 GLUE 系列任务上的性能测试,XLNet 相比 BERT 平均也有 1 个点的分数提高。

Fair comparision between BERT and XLNet
由于 XLNet 采用了多个模型改进方法,为了更清楚了解每项改进贡献了多大的性能提升,论文做了以下消融实验。首先我们发现移除了缓存机制后 (memory 项),模型在所有任务中的分数降幅最大 (平均下降 0.6 )。其次是移除双向训练功能,分数平均降幅为 0.4。而移除 span-based 预测的功能后,分数平均降幅为 0.3。最后再 XLNet 模型中加入了 NSP 任务,结果发现除了在 RACE 任务有轻微提升外,在其余任务上的结果都是变差的。

XLNet ablation test result

总结

从宏观来看,XLNet 实现了站在巨人 BERT 肩膀上的新的突破,将 AR 模型和双向训练有机地结合在一起。从微观来看,XLNet 引入的几个改进方法各有所长:Permutation LM 使得语言模型在训练时可以充分利用上下文的信息;Two-stream encoding 很好地区分了预测目标和非预测目标的 attention 的计算使结果更训练更加合理;Transformer-XL 极大减少了运算内存及解决了模型长距离依赖的问题,而 relative-positional encoding 又有效避免了两个 segment 之间的位置冲突。此外,XLNet 以 AR 为基础的结果与生俱来匹配生成类的 NLP 任务,因此 XLNet 必然会推动在文本摘要、机器翻译、问答系统等领域下进一步改进模型的出现。



原文:https://zhuanlan.zhihu.com/p/477860047

  博客记录着学习的脚步,分享着最新的技术,非常感谢您的阅读,本博客将不断进行更新,希望能够给您在技术上带来帮助。


【大模型&NLP&算法】专栏

近200篇论文,300份博主亲自撰写的markdown笔记。订阅本专栏【大模型&NLP&算法】专栏,或前往https://github.com/wjn1996/LLMs-NLP-Algo即可获得全部如下资料:

  • 机器学习&深度学习基础与进阶干货(笔记、PPT、代码)
  • NLP基础与进阶干货(笔记、PPT、代码)
  • 大模型全套体系——预训练语言模型基础、知识预训练、大模型一览、大模型训练与优化、大模型调优、类ChatGPT的复现与应用等;
  • 大厂算法刷题;

在这里插入图片描述

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

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

相关文章

lua脚本语言学习笔记

Lua 是一种轻量小巧的脚本语言&#xff0c;用标准C语言编写并以源代码形式开放&#xff0c; 其设计目的是为了嵌入应用程序中&#xff0c;从而为应用程序提供灵活的扩展和定制功能。 因为我们使用redis的时候一般要写lua脚本&#xff0c;这篇文章就介绍一下lua脚本语言的基础用…

Python 算法基础篇:时间复杂度和空间复杂度简介

Python 算法基础篇&#xff1a;时间复杂度和空间复杂度简介 引言 1. 时间复杂度 a ) 常见的时间复杂度 b ) 时间复杂度示例 2. 空间复杂度 a ) 常见的空间复杂度 b ) 空间复杂度示例 结论 引言 在学习和分析算法时&#xff0c;时间复杂度和空间复杂度是两个关键概念。它们帮助…

【Python】类型注解 ④ ( 函数类型注解 | 函数形参类型注解语法 | 函数返回值类型注解 )

文章目录 一、函数形参类型注解1、函数中由于类型缺省导致的提示问题2、函数形参类型注解语法3、代码示例 - 函数形参类型注解 二、函数返回值类型注解1、函数返回值类型注解语法2、代码示例 - 函数返回值类型注解 一、函数形参类型注解 1、函数中由于类型缺省导致的提示问题 由…

LSTM对比Bi-LSTM的电力负荷时间序列预测(Matlab)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

小程序api的promise化

小程序根目录cmd运行安装命令 npm install --save miniprogram-api-promise1.0.4 安装完成之后先到根目录中删除miniprogram_npm文件夹(不删除构建npm时可能会出现问题) 删除之后再在工具中点击构建npm 构建成功之后会看到根目录中重新出现了miniprogram_npm文件夹 在app.j…

P1747 好奇怪的游戏

好奇怪的游戏 题目背景 《爱与愁的故事第三弹shopping》娱乐章。 调调口味来道水题。 题目描述 爱与愁大神坐在公交车上无聊&#xff0c;于是玩起了手机。一款奇怪的游戏进入了爱与愁大神的眼帘&#xff1a;***&#xff08;游戏名被打上了马赛克&#xff09;。这个游戏类似…

修复漏洞(三)升级Docker里面的镜像(MySQL、Nginx等)

前言 因原版本检测出来存在漏洞&#xff0c;故需升级底层镜像 步骤 先看看自己现在的是什么版本&#xff0c;教你们一个骚操作&#xff0c;查看Docker里面的Mysql或者其他容器版本都不用百度出来的这么麻烦首先docker images&#xff0c;查看镜像ID然后docker inspect 镜像I…

2、Java入门教程【IDEA】

1、下载 IDEA社区版&#xff1a;下载地址 IDEA管理JAVA程序的结构&#xff1a; project 项目、工程module 模块package 包class 类 2、创建工程 创建【project】 点击【create】后&#xff0c;项目结构如下&#xff1a; 创建【package】 我们继续在【src】目录下创建【pack…

Python中的break和continue语句应用举例

Python中的break和continue语句应用举例 在进行Python编程时候&#xff0c;有时需要&#xff0c;对循环中断或跳过某部分语句&#xff0c;此时常会用到break语句或continue语句。本文将通过实际例子阐述这两个语句的用法。 1.break语句 break语句是实现在某个地方中断循环&a…

js逆向补环境-b站志远二期最后8节课笔记

目录 一、基础知识1、什么是纯净V82、什么是BOM和DOM3、node环境/浏览器环境/V8引擎区别4、如何本地调试js补环境5、补环境相对于逆向算法的好处6、vm和vm2介绍 二、8个视频内容笔记概括1、补环境基本知识/头条案例手动插桩补2、Proxy代理/toString函数保护介绍3、补环境框架设…

安卓UI:Switch和ToggleButton

目录 一、Switch和ToggleButton介绍 Switch常用属性&#xff1a; ToggleButton属性&#xff1a; 二、Switch和ToggleButton常用方法 Switch常用方法&#xff1a; ToggleButton常用方法&#xff1a; 三、Switch和ToggleButton的使用 MainActivity: activity_main&#xff1…

【代码随想录 | Leetcode | 第四天】数组 | 螺旋矩阵 | 59

前言 欢迎来到小K的Leetcode|代码随想录|专题化专栏&#xff0c;今天将为大家带来螺旋矩阵的分享✨ 目录 前言59. 螺旋矩阵 II总结 59. 螺旋矩阵 II 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 …

【C语言进阶(八)】动态内存管理

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C语言学习分享⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多C语言知识   &#x1f51d;&#x1f51d; 动态内存规划 1. 前言2. 为什么要学…

ElasticSearch索引(index)当中的增删改查操作

文章目录 一、创建索引&#xff08;Create Index&#xff09;&#xff1a;二、更新索引的设置&#xff08;Update Index Settings&#xff09;&#xff1a;三、获取当前索引的设置&#xff08;Get Index Settings&#xff09;&#xff1a;四、删除索引&#xff08;Delete Index…

Python(十三)数据类型——整数类型

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

N!9个OA高危漏洞利用工具v1.1.6

工具介绍 该工具使用了ExpDemo-JavaFX项目&#xff0c;保留了核心的数据包请求接口&#xff0c;使用jdk1.8环境开发。目前只编写了oa系列&#xff0c;对相关漏洞进行复现和分析&#xff0c;极力避免exp的误报和有效性。 关注【Hack分享吧】工众号&#xff0c;回复关键字【2305…

基于linux下的高并发服务器开发(第一章)- fcntl函数

13 / fcntl函数 #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd, ...); 参数&#xff1a; fd : 表示需要操作的文件描述符 cmd: 表示对文件描述符进行如何操作 - F_DUPFD : 复制文件描述符,复制的是第一个参数fd&#xff0c; …

【运维工程师学习六】LAM部署搭建个人Discuz论坛

【运维工程师学习六】LAM部署搭建个人Discuz论坛 1、先卸载Mariadb再安装Mysql2、MySQL官网rpm包下载3、在rpm包路径下安装 YUM Repo 文件4、更新软件仓库本地数据库信息5、开始部署——php的安装6、搜索yum包7、开始部署——配置apache以支持php&#xff08;1&#xff09;配置…

Spring MVC 运行原理 【深度理解】

什么是MVC&#xff1f; MVC 是 Model、View 和 Controller 的缩写&#xff0c;分别代表 Web 应用程序中的 3 种职责&#xff0c;MVC是一种软件设计规范。它将业务逻辑、数据、显示分离的方法来组织代码&#xff0c;降低了视图与业务逻辑之间的双向耦合。 Model(模型)&#xf…

newMap和newSet

newMap Map 对象存有键值对&#xff0c;其中的键可以是任何数据类型。Map字典是以[键&#xff0c;值]的形式存储** 1:键值对的键类型比较灵活 可以用任意类型的变量来做键名&#xff0c; 2 遍历键值对 for … in循环还有一些限制&#xff1a;它仅仅遍历可枚举属性、非Symb…