深度学习自编码器 - 去噪自编码器篇

news2024/11/17 3:04:28

序言

在深度学习的广阔天地中,自编码器作为一种强大的无监督学习工具,通过重构输入数据的方式,不仅实现了数据的有效压缩,还探索了数据的内在表示。而去噪自编码器( Denoising Autoencoder, DAE \text{Denoising Autoencoder, DAE} Denoising Autoencoder, DAE),作为自编码器的一个变种,更是以其独特的去噪能力,在众多应用中脱颖而出。去噪自编码器在训练过程中,会故意向输入数据中添加噪声,然后迫使模型从这种被“污染”的数据中恢复出原始的纯净数据。这一过程不仅锻炼了模型的鲁棒性,还促进了模型学习到更加稳健和本质的数据特征,从而提高了其在噪声环境下的泛化能力。

去噪自编码器(Denoising Autoencoders)

  • 去噪自编码器 ( denoising autoencoder, DAE \text{denoising autoencoder, DAE} denoising autoencoder, DAE) 是一类接受损坏数据作为输入,并训练来预测原始未被损坏数据作为输出的自编码器。
  • DAE \text{DAE} DAE的训练过程如图例1中所示。
    • 我们引入一个损坏过程 C ( x ~ ∣ x ) C(\tilde{\mathbf{x}}\mid\mathbf{x}) C(x~x),这个条件分布代表给定数据样本 x \mathbf{x} x 产生损坏样本 x ~ \tilde{\mathbf{x}} x~ 的概率。
    • 自编码器则根据以下过程,从训练数据对 ( x , x ~ ) (\boldsymbol{x},\tilde{\boldsymbol{x}}) (x,x~) 中学习重构分布 ( reconstruction distribution \text{reconstruction distribution} reconstruction distribution) p reconstruct ( x ∣ x ~ ) p_{\text{reconstruct}}(\mathbf{x}\mid\tilde{\mathbf{x}}) preconstruct(xx~)
      • 从训练数据中采一个训练样本 x \boldsymbol{x} x
      • C ( x ~ ∣ x = x ) C(\tilde{\mathbf{x}}\mid \mathbf{x}=\boldsymbol{x}) C(x~x=x)采一个损坏样本 x ~ \tilde{x} x~
      • ( x , x ~ ) (\boldsymbol{x},\tilde{\boldsymbol{x}}) (x,x~)作为训练样本来估计自编码器的重构分布 p reconstruct ( x ∣ x ~ ) = p decoder ( x ∣ h ) p_{\text{reconstruct}}(\boldsymbol{x}\mid\tilde{\boldsymbol{x}})=p_{\text{decoder}}(\boldsymbol{x}\mid\boldsymbol{h}) preconstruct(xx~)=pdecoder(xh),其中 h \boldsymbol{h} h是编码器 f ( x ~ ) f(\tilde{\boldsymbol{x}}) f(x~)的输出, p decoder p_{\text{decoder}} pdecoder根据解码函数 g ( h ) g(\boldsymbol{h}) g(h)定义。
  • 通常我们可以简单地对负对数似然 − log ⁡ p decoder ( x ∣ h ) -\log p_{\text{decoder}}(\boldsymbol{x}\mid\boldsymbol{h}) logpdecoder(xh)进行基于梯度如minibatch梯度下降)的近似最小化。只要编码器是确定性的,去噪自编码器就是一个前馈网络,并且可以使用与其他前馈网络完全相同的方式进行训练。
  • 因此我们可以认为DAE是在以下期望下进行随机梯度下降:
    − E x ∼ p ~ data ( x ) E x ~ ∼ C ( x ~ ∣   x ) log ⁡ p decoder ( x ∣ h = f ( x ~ ) ) -\mathbb{E}_{\mathbf{x}\sim\tilde{p}_{\text{data}}(\mathbf{x})}\mathbb{E}_{\tilde{x}\sim C(\tilde{\mathbf{x}}\mid\ \boldsymbol{x})} \log p_{\text{decoder}}(\boldsymbol{x}\mid\boldsymbol{h}=f(\tilde{\boldsymbol{x}})) Exp~data(x)Ex~C(x~ x)logpdecoder(xh=f(x~)) — 公式1 \quad\textbf{---\footnotesize{公式1}} 公式1

得分估计

  • 得分匹配( Hyv a ¨ rinen, 2005a \text{Hyvärinen, 2005a} Hyva¨rinen, 2005a) 是最大似然的代替。它提供了概率分布的一致估计,鼓励模型在各个数据点 x \boldsymbol{x} x 上获得与数据分布相同的得分 ( score \text{score} score)。在这种情况下,得分是一个特定的梯度场:
    ∇ x log ⁡ p ( x ) \nabla_x \log p(\boldsymbol{x}) xlogp(x) — 公式2 \quad\textbf{---\footnotesize{公式2}} 公式2

  • 我们将在后续篇章:得分匹配和比率匹配中更详细地讨论得分匹配。对于现在讨论的自编码器,理解学习 log ⁡ p data \log p_{\text{data}} logpdata 的梯度场是学习 p data p_{\text{data}} pdata 结构的一种方式就足够了。

  • DAE \text{DAE} DAE的训练准则(条件高斯 p ( x ∣ h ) p(\boldsymbol{x}\mid\boldsymbol{h}) p(xh))能让自编码器学到能估计数据分布得分的向量场 ( g ( f ( x ) ) − x ) (g(f(\boldsymbol{x}))-\boldsymbol{x}) (g(f(x))x) ,这是 DAE \text{DAE} DAE的一个重要特性。具体如图例2所示。

  • 去噪地训练一类采用高斯噪声和均方误差作为重构误差的特定去噪自编码器( sigmoid \text{sigmoid} sigmoid隐藏单元,线性重构单元),与训练一类特定的被称为 RBM \text{RBM} RBM的无向概率模型是等价的 ( Vincent, 2011 \text{Vincent, 2011} Vincent, 2011)。

    • 这类模型将在后续给出更详细的介绍;对于现在的讨论,我们只需知道这个模型能显式的给出 p model ( x ; θ ) p_{\text{model}}(\boldsymbol{x};\boldsymbol{\theta}) pmodel(x;θ)
    • RBM \text{RBM} RBM使用去噪得分匹配 ( denoising score matching \text{denoising score matching} denoising score matching) ( Kingma and LeCun, 2010a \text{Kingma and LeCun, 2010a} Kingma and LeCun, 2010a) 训练时,它的学习算法与训练对应的去噪自编码器是等价的。
    • 在一个确定的噪声水平下, 正则化的得分匹配不是一致估计量;相反它会恢复分布的一个模糊版本。
    • 然而,当噪声水平趋向于 0 0 0且训练样本数趋向与无穷时,一致性就会恢复。我们将会在后续更新篇章:去噪得分匹配更详细地讨论去噪得分匹配。
  • 自编码器和 RBM \text{RBM} RBM还存在其他联系。

    • 得分匹配应用于 RBM \text{RBM} RBM后,其代价函数将等价于重构误差结合类似 CAE \text{CAE} CAE惩罚的正则项 ( Swersky et al., 2011 \text{Swersky et al., 2011} Swersky et al., 2011)。
    • Bengio and Delalleau(2009) \text{Bengio and Delalleau(2009)} Bengio and Delalleau(2009) 指出自编码器的梯度是对 RBM \text{RBM} RBM对比散度训练的近似。
  • 对于连续的 x \boldsymbol{x} x,高斯损坏和重构分布的去噪准则得到的得分估计适用于一般编码器和解码器的参数化 ( Alain and Bengio, 2013 \text{Alain and Bengio, 2013} Alain and Bengio, 2013)。

    • 这意味着一个使用平方误差准则:
      ∥ g ( f ( x ~ ) ) − x ∥ 2 \Vert g(f(\tilde{\boldsymbol{x}}))-\boldsymbol{x}\Vert^2 g(f(x~))x2 — 公式3 \quad\textbf{---\footnotesize{公式3}} 公式3
      和噪声方差 σ 2 \sigma^2 σ2的损坏:
      C ( x ~ = x ~ ∣ x ) = N ( x ~ ; μ = x , ∑ = σ 2 I ) C(\tilde{x}=\tilde{\boldsymbol{x}}\mid\boldsymbol{x})=N(\tilde{\boldsymbol{x}};\mu=\boldsymbol{x},\sum=\sigma^2 I) C(x~=x~x)=N(x~;μ=x,=σ2I) — 公式4 \quad\textbf{---\footnotesize{公式4}} 公式4
      的通用编码器-解码器架构可以用来训练估计得分。
    • 图例3展示其中的工作原理。
  • 一般情况下,不能保证重构函数 g ( f ( x ) ) g(f(\boldsymbol{x})) g(f(x)) 减去输入 x \boldsymbol{x} x 后对应于某个函数的梯度,更不用说得分 。

    • 这是早期工作 ( Vincent, 2011 \text{Vincent, 2011} Vincent, 2011) 专用于特定参数化的原因(其中 g ( f ( x ) ) − x g(f(\boldsymbol{x}))-\boldsymbol{x} g(f(x))x 能通过另一个函数的导数获得)。
    • Kamyshanska and Memisevic (2015) \text{Kamyshanska and Memisevic (2015)} Kamyshanska and Memisevic (2015)通过标识一类特殊的浅层自编码器家族,使 g ( f ( x ) ) − x g(f(\boldsymbol{x}))-\boldsymbol{x} g(f(x))x 对应于这个家族所有成员的一个得分,以此推广 Vincent, 2011 \text{Vincent, 2011} Vincent, 2011的结果。
  • 目前为止我们所讨论的仅限于去噪自编码器如何学习表示一个概率分布。

    • 更一般的,我们可能希望使用自编码器作为生成模型,并从该分布中进行采样。
    • 这将在后续篇章:从AE采样中讨论。

历史观点

  • 采用 MLP \text{MLP} MLP去噪的想法可以追溯到 LeCun (1987) \text{LeCun (1987)} LeCun (1987) Gallinari et al. (1987) \text{Gallinari et al. (1987)} Gallinari et al. (1987) 的工作。
    • Behnke (2001) \text{Behnke (2001)} Behnke (2001) 也曾使用循环网络对图像去噪。
    • 在某种意义上,去噪自编码器仅仅是被训练去噪的 MLP \text{MLP} MLP
    • 然而, “去噪自编码器’’ 的命名指的不仅仅是学习去噪,而且可以学到一个好的内部表示(作为学习去噪的副效用)。
    • 这个想法提出较晚 ( Vincent et al., 2008b, 2010 \text{Vincent et al., 2008b, 2010} Vincent et al., 2008b, 2010)。学习到的表示可以被用来预训练更深的无监督网络或监督网络。
    • 与稀疏自编码器、稀疏编码、收缩自编码器等正则化的自编码器类似, DAE \text{DAE} DAE的动机是允许使用容量非常大的编码器,同时防止在编码器和解码器学习一个毫无用处的恒等函数。
  • 在引入现代 DAE \text{DAE} DAE之前, Inayoshi and Kurita (2005) \text{Inayoshi and Kurita (2005)} Inayoshi and Kurita (2005) 探讨了与一些相同的方法和相同的目标。
    • 他们在监督目标的情况下最小化重构误差,并在监督 MLP \text{MLP} MLP的隐藏层注入噪声,通过引入重构误差和注入噪声提升泛化能力。
    • 然而,他们的方法基于线性编码器,因此无法学习到现代 DAE \text{DAE} DAE能学习的强大函数族。

  • 图例1:去噪自编码器代价函数的计算图。
    • 去噪自编码器代价函数的计算图。
      在这里插入图片描述

    • 说明:

      • 去噪自编码器被训练为从损坏的版本 x ~ \tilde{\boldsymbol{x}} x~ 重构干净数据点 x \boldsymbol{x} x
      • 这可以通过最小化损失 L = − log ⁡ p decoder ( x ∣ h = f ( x ~ ) ) L=-\log p_{\text{decoder}}(\boldsymbol{x}\mid\boldsymbol{h}=f(\tilde{\boldsymbol{x}})) L=logpdecoder(xh=f(x~)) 实现,其中 x ~ \tilde{\boldsymbol{x}} x~ 是样本 x \boldsymbol{x} x 经过损坏过程 C ( x ~ ∣ x ) C(\tilde{\boldsymbol{x}}\mid\boldsymbol{x}) C(x~x) 后得到的损坏版本。
      • 通常,分布 p decoder p_{\text{decoder}} pdecoder 是因子的分布(平均参数由前馈网络 g g g 给出)。

  • 图例2:去噪自编码器被训练为将损坏的数据点 x ~ \tilde{\boldsymbol{x}} x~ 映射回原始数据点 x \boldsymbol{x} x
    • 去噪自编码器被训练为将损坏的数据点 x ~ \tilde{\boldsymbol{x}} x~ 映射回原始数据点 x \boldsymbol{x} x
      在这里插入图片描述

    • 说明:

      • 我们将训练样本 x ~ \tilde{\boldsymbol{x}} x~ 表示为位于低维流形(粗黑线)附近的红叉。
      • 我们用灰色圆圈表示等概率的损坏过程 C ( x ~ ∣ x ) C(\tilde{\boldsymbol{x}}\mid\boldsymbol{x}) C(x~x)
      • 灰色箭头演示了如何将一个训练样本转换为经过此损坏过程的样本。
      • 当训练去噪自编码器最小化平方误差 ∥ g ( f ( x ~ ) ) − x ∥ 2 \Vert g(f(\tilde{\boldsymbol{x}}))-\boldsymbol{x}\Vert^2 g(f(x~))x2 的平均值时,重构 g ( f ( x ~ ) ) g(f(\tilde{\boldsymbol{x}})) g(f(x~)) 估计 E x , x ∼ p data ~ ( x ) C ( x ~ ∣ x ) [ x ∣ x ~ ] \mathbb{E}_{\mathbf{x},\tilde{\mathbf{x}\sim p_{\text{data}}}(\mathbf{x})C(\tilde{\mathbf{x}}\mid\mathbf{x})}[\mathbf{x}\mid\tilde{\boldsymbol{x}}] Ex,xpdata~(x)C(x~x)[xx~]
      • g ( f ( x ~ ) ) g(f(\tilde{\boldsymbol{x}})) g(f(x~)) 对可能产生 x ~ \tilde{\boldsymbol{x}} x~ 的原始点 x \boldsymbol{x} x 的质心进行估计,所以向量 g ( f ( x ~ ) ) − x ~ g(f(\tilde{\boldsymbol{x}}))-\tilde{\boldsymbol{x}} g(f(x~))x~ 近似指向流形上最近的点。
      • 因此自编码器可以学习由绿色箭头表示的向量场 g ( f ( x ) ) − x g(f(\boldsymbol{x}))-\boldsymbol{x} g(f(x))x
      • 该向量场估计得分 ∇ x log ⁡ p data ( x ) \nabla_x \log p_{\text{data}}(\boldsymbol{x}) xlogpdata(x) 为乘法因子,即平均均方根重构误差。

  • 图例3:由去噪自编码器围绕 1 1 1弯曲流形学习的向量场,其中数据集中在 2 2 2 维空间中。
    • 由去噪自编码器围绕 1 1 1弯曲流形学习的向量场,其中数据集中在 2 2 2 维空间中。
      在这里插入图片描述

    • 说明:

      • 每个箭头与重构向量减去自编码器的输入向量后的向量成比例,并且根据隐式估计的概率分布指向较高的概率。
      • 向量场在估计的密度函数的最大值处(在数据流形上)和密度函数的最小值处都为零。
      • 例如,螺旋臂形成局部最大值彼此连接的 1 1 1 维流形。
      • 局部最小值出现在两个臂间隙的中间附近。
      • 当重构误差的范数(由箭头的长度示出)很大时,在箭头的方向上移动可以显著增加概率,并且在低概率的地方大多也是如此。
      • 自编码器将这些低概率点映射到较高的概率重构。
      • 在概率最大的情况下, 重构变得更准确,因此箭头会收缩。
      • Alain and Bengio (2013) \text{Alain and Bengio (2013)} Alain and Bengio (2013) 许可转载此图。

总结

  • 去噪自编码器的出现,为深度学习领域的数据处理和特征学习带来了新的视角和方法。通过引入噪声并尝试去除它,模型不仅学会了如何有效压缩和重构数据,还深刻理解了数据的本质结构和关键特征。这种能力使得去噪自编码器在图像处理、语音识别、自然语言处理等多个领域展现出卓越的性能。
  • 更重要的是,去噪自编码器所体现的学习理念——即通过对抗噪声来强化模型的内在表示能力——为深度学习的发展提供了宝贵的启示,推动了整个领域向更加智能、更加鲁棒的方向迈进。

往期内容回顾

深度学习自编码器 - 引言篇
深度学习自编码器 - 欠完备自编码器篇
深度学习自编码器 - 正则自编码器篇

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

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

相关文章

ES6 -- 2015

学习视频 1. let和const 1.1 let 变量必须先声明再使用同一变量不能重复声明变量有块级作用域 1.2 const 声明常量,常量不能改变常量必须有初始值,不能先声明再赋值 2. 解构 1 数组解构 保持左右的结构一样,安装顺序一一对应 完全解构…

CVE-2024-46101

前言 自己挖的第一个CVE~ 喜提critical 这里简单说一下。 漏洞简介 GDidees CMS < 3.9.1 的版本&#xff0c;存在一个任意文件上传漏洞。允许登录后的攻击者上传webshell获得网站的权限。 影响版本&#xff1a; GDidees CMS < 3.9.1 &#xff08;其它的我没测。。&am…

日志系统扩展二:日志服务器的实现

日志系统扩展二&#xff1a;日志服务器的实现 一、设计1.为何要这么扩展&#xff1f;2.应用层协议的选择1.HTTP&#xff1f;2.自定义应用层协议 二、自定义应用层协议的实现1.声明日志器1.服务器和客户端这里日志器的关联2.枚举类型的定义3.sinks数组的定义 2.打印日志1.logMes…

MySQL record 06 part

事务、存储过程 事务&#xff1a; MySQL的同步&#xff0c;同步是指 together done&#xff0c;要么一起前进&#xff0c;要么一起后退的意思。 注意&#xff0c;回滚 rollback 对已经提交 commit 的数据是无效的&#xff0c;也就是说&#xff0c;只能对没有被提交 commit …

CSS 布局三大样式简单学习

目录 1. css 浮动 1.1 效果1 1.2 效果2 1.3 效果3 1.4 效果4 2. css 定位 2.1 absolute 2.2 relative 2.3 fixed 3. css 盒子模型 3.1 效果1 3.2 效果2 3.3 效果3 3.4 效果4 1. css 浮动 1.1 效果1 1.2 效果2 1.3 效果3 1.4 效果4 2. css 定位 2.1 absolute 2.2 …

thinkphp 做分布式服务+读写分离+分库分表(分区)(后续接着写)

thinkphp 做分布式服务读写分离分库分表&#xff08;分区&#xff09; 引言 thinkphp* 大道至简一、分库分表分表php 分库分表hash算法0、分表的方法&#xff08;thinkphp&#xff09;1、ThinkPHP6 业务分表之一&#xff1a;UID 发号器2、ThinkPHP6 业务分表之二&#xff1a;用…

希尔排序(C语言实现)

目录 1.希尔排序( 缩小增量排序 ) 2.动图 ​编辑 3.代码实现 预排序实现 子序列排列实现 单趟排序实现 对整组数进行子排序 希尔排序代码 代码测试 时间复杂度分析 希尔排序的特性总结&#xff1a; 1.希尔排序( 缩小增量排序 ) 基本思想&#xff1a; 1.先选定一个…

QTCreator 调试:unknown debugger type “No engine“

QTCreator 调试&#xff1a;unknown debugger type "No engine" - kaizenly - 博客园 (cnblogs.com) 一开始Debuggers---Auto-detected这里第一row第一个项是标红的&#xff0c;然后没改东西&#xff0c;点完应用Apply以后&#xff0c;就可以调试了...&#xff08;不…

在python爬虫中xpath方式提取lxml.etree._ElementUnicodeResult转化为字符串str类型

简单提取网页中的数据时发现的 当通过xpath方式提取出需要的数据的text文本后想要转为字符串&#xff0c;但出现lxml.etree._ElementUnicodeResult的数据类型不能序列化&#xff0c;在网上查找到很多说是编码问题Unicode编码然后解码什么的&#xff1b;有些是(导入的xml库而不…

深度学习之概率论预备知识点(3)

在深度学习中&#xff0c;概率论和数理统计是理解许多算法背后的理论基础。这些知识在处理不确定性、估计模型参数、理解数据分布等方面非常关键 1、概率 一种用来描述随机事件发生的可能性的数字度量&#xff0c;表示某一事件发生的可能性。 概率并不客观存在&#xff0c;是…

Android Choreographer 监控应用 FPS

Choreographer 是 Android 提供的一个强大的工具类&#xff0c;用于协调动画、绘制和视图更新的时间。它的主要作用是协调应用的绘制过程&#xff0c;以确保流畅的用户体验。Choreographer 也可以帮助我们获取帧时间信息&#xff0c;从而为性能监测和优化提供重要的数据支持。 …

IDEA中Quarkus框架(3.13版本)开发、调试、部署、打包等

code-with-quarkus code-with-quarkus 是使用官网生成的demo项目 这个项目使用Quarkus&#xff08;使用3.13.0版本&#xff0c;该版本支持JDK21&#xff09;&#xff0c;超音速亚原子Java框架。官网地址: https://quarkus.io/. 环境要求 OS: Windows 10.0 jdk 11 maven 3.9…

淘宝扭蛋机小程序,扭蛋机文化下的新体验

在数字化时代中&#xff0c;扭蛋机逐渐从传统的线下机器转移到了线上互联网中&#xff0c;市场得到了创新发展。扭蛋机小程序具有便捷、多样化、个性化的特点&#xff0c;迎合了当下消费者的线上消费习惯&#xff0c;又能够让扭蛋机玩家体验到新鲜有趣的扭蛋。 扭蛋机是一种热…

python简单的小项目-关于央行储蓄占比情况的数据可视化

该数据来源于锐思数据库&#xff0c;如果数据有偏差&#xff0c;可能是本人搜索的问题&#xff0c;希望大家谅解。 数据大纲&#xff1a; 其中我们制作折现统计图需要用到的是截止日期&#xff0c;表达数据最后获取的日期&#xff0c;而更新时间则是数据时效性的表示&#xff…

django项目添加测试数据的三种方式

文章目录 自定义终端命令Faker添加模拟数据基于终端脚本来完成数据的添加编写python脚本编写shell脚本执行脚本需要权限使用shell命令来完成测试数据的添加 添加测试数据在工作中一共有三种方式&#xff1a; 可以根据django的manage.py指令进行[自定义终端命令]可以采用第三方…

pthread_cond_signal 和pthread_cond_wait

0、pthread_join()函数作用&#xff1a; pthread_join() 函数会一直阻塞调用它的线程&#xff0c;直至目标线程执行结束&#xff08;接收到目标线程的返回值&#xff09;&#xff0c;阻塞状态才会解除。如果 pthread_join() 函数成功等到了目标线程执行结束&#xff08;成功获取…

【C++】list详解及模拟实现

目录 1. list介绍 2. list使用 2.1 修改相关 2.2 遍历 2.3 构造 2.4 迭代器 2.5 容量相关 2.6 元素访问 2.7 操作相关 3. 模拟实现 3.1 节点类 3.1.1 初始结构 3.1.2 节点的构造函数 3.2 迭代器类 3.2.1 初始结构 3.2.2 迭代器 3.2.3 迭代器-- 3.2.4 解引…

1.随机事件与概率

第一章 随机时间与概率 1. 随机事件及其运算 1.1 随机现象 ​ 确定性现象&#xff1a;只有一个结果的现象 ​ 确定性现象&#xff1a;结果不止一个&#xff0c;且哪一个结果出现&#xff0c;人们事先并不知道 1.2 样本空间 ​ 样本空间&#xff1a;随机现象的一切可能基本…

ML 系列:机器学习和深度学习的深层次总结(05)非线性回归

图 1.不同类型的回归 一、说明 非线性回归是指因变量和自变量之间存在非线性关系的模型。该模型比线性模型更准确、更灵活&#xff0c;可以获取两个或多个变量之间复杂关系的各种曲线。 二、关于 当数据之间的关系无法用直线预测并且呈曲线形式时&#xff0c;我们应该使用非线性…

MySQL篇(索引)(持续更新迭代)

目录 一、简介 二、有无索引情况 1. 无索引情况 2. 有索引情况 3. 优劣势 三、索引结构 1. 简介 2. 存储引擎对于索引结构的支持情况 3. 为什么InnoDB默认的索引结构是Btree而不是其它树 3.1. 二叉树&#xff08;BinaryTree&#xff09; 3.2. 红黑树&#xff08;RB&a…