论文阅读-基于one-shot的NAS

hello,这是鑫鑫鑫的论文分享站,今天分享的文章是Understanding and Simplifying One-Shot Architecture Search,这是一篇理解one-shot的NAS的论文,我们一起看看吧~

摘要:

神经网络架构设计的自动化越来越引起人们的兴趣。 现有的体系结构搜索方法需要从零开始训练数千种不同的体系结构,在计算上价格很昂贵。 最近的工作探索了跨模型的权重共享,以摊销培训成本。 虽然以前的方法降低了架构搜索的成本数量级,但它们仍然很复杂,需要超网络或增强学习控制器。 我们的目标是了解一次性架构搜索的权重共享。 通过仔细的实验分析,我们证明了在没有超网络或RL的情况下,从复杂的搜索空间中有效地识别出有前途的体系结构是可能的。

1.介绍:

设计神经网络是一个劳动密集型的过程,需要专家进行大量的试验和错误。人们对自动寻找良好的神经网络架构越来越感兴趣。例如,卓普等人表明,我们可以找到一种在CIFAR-10、imagenet和COCO数据集上同时实现最先进性能的架构。然而,这些搜索方法非常急需资源。卓等人使用了450GPU来运行一个实验,他们提出了一种基于RL的方法,其中一个神经网络(控制器)列举了一组需要评估的架构,每个架构都在CIFAR-10上从零开始训练一个固定数量的时代,然后在一个验证集上进行评估。控制器的权重随后会根据所训练的模型的验证精度进行更新。

对于一个典型的机器学习实践者来说,训练成千上万的模型是困难的或不可能的。 为了解决架构搜索的这一弱点,新方法已经被提出,一个有希望的方向是在模型之间共享权重,与其从零开始训练数千个单独的模型,不如训练一个能够模拟搜索空间中任何体系结构的大型网络。

一个简单的例子如图1所示,
在这里插入图片描述
其中我们可以选择在网络中的特定位置应用3x3卷积、5x5卷积或最大池化层,而不是训练三个独立的模型,我们可以训练一个包含所有三个操作的单一模型(一次性模型)。 在评估时,我们有选择地将三个操作中的两个输出归零,以确定哪一个操作导致最佳的预测精度。 在更复杂的例子中,搜索空间可能包括网络中许多不同位置的选择。 搜索空间的大小随着选择的数量呈指数增长,而一次模型的大小仅呈线性增长。 同样的权重被用来评估许多不同的体系结构,减少了运行体系结构搜索所需的资源数量级。

尽管效率有所提高,但很自然地会怀疑在不同型号之间的权重共享是否存在固有的限制。 为什么异构体系结构集能够共享一组权重? 一次性模型通常只用于对搜索空间中的体系结构进行排序;性能最好的体系结构在搜索完成后从零开始重新培训。 但是,即使有了这种限制,一个固定的权重集可以在广泛的体系结构中很好地工作的想法也是违反直觉的。 SMASH的方法试图通过使用超网络在每个候选体系结构中生成很大一部分权重来解决这一问题。

尽管高效的架构搜索(ENAS)通过交替训练共享模型权重和训练控制器来解决同样的问题,这些控制器从搜索空间中识别出要关注的架构子集。

我们在本文中的目标是了解权重共享在高效架构搜索方法中的作用。 也许令人惊讶的是,我们表明,无论是超网络还是RL控制器都不需要获得良好的结果。 为了做到这一点,我们训练了一个包含搜索空间中所有可能操作的大型一次性模型。 然后,我们将一些操作归零,并测量对模型预测精度的影响。 当仔细训练时,我们表明网络自动将其能力集中在对产生良好预测最有用的操作上。 将不太重要的操作归零只会对模型的预测产生很小的影响。 相反,将更重要的操作归零对模型的预测及其验证集的准确性都有夸大的影响。 事实上,通过从训练集中查看未标记的示例,可以预测体系结构的验证集的准确性。这种行为是权重共享的隐式结果,既不需要超网络,也不需要显式控制器。

2.相关工作

使用元学习来改进机器学习有着悠久的历史,除了架构搜索,元学习还被用来优化学习算法的其他组件,如更新规则和激活函数。

我们的工作与SMASH最密切相关,这反过来又受到NAS的激励。 在NAS中,使用神经网络控制器来搜索良好的体系结构。 NAS控制器的训练需要一个循环:控制器提出子模型体系结构,并对其进行训练和评估。 然后,通过策略梯度更新控制器(Williams,1992),以随着时间的推移采样更好的体系结构。 一旦控制器完成训练,最好的架构被选择和训练更长的时间,以提高他们的准确性。 NAS的主要瓶颈是对子模型架构的培训;SMASH旨在摊销这一成本。 在SMASH中,对超网络进行先验训练,为搜索空间中的每个子模型体系结构生成合适的权重。 然后使用相同的固定超网络来评估许多不同的子模型体系结构。

NAS和SMASH两者都将架构搜索视为一个黑盒优化问题,可以使用现成的技术进行优化。在超参数优化中,还在基于人口的培训中探索了模型之间共享参数的想法(Jaderberg等人,2017年)。

遗传和神经进化算法也被用于设计良好的神经网络结构,对于这些方法,模型之间的参数共享,也称为权重继承,具有积极影响。

黑盒方法在一个被搁置的验证集上测量经过训练的体系结构的准确性。 相反,MorphNets(Gordon等人,2017年)直接在训练集上进行架构决策,应用L1正则化来诱导稀疏性。 像Morph Nets一样,我们从一个过于完备的网络体系结构开始,然后修剪最不有用的部分。 但戈登等人关注过滤器的大小,我们关注修剪操作和跳接。 从SMASH和ENAS的实验表明,我们的方法可以扩展到对滤波器大小的搜索。 我们还可以将Morph Net应用于我们的体系结构搜索中发现的模型

3.one-shot结构搜索

提出的一次体系结构搜索方法包括四个步骤:(1)设计一个搜索空间,允许我们使用单个一次模型来表示各种各样的体系结构。 (2)培训一次性模型,使其能够预测架构的验证准确性。 (3)使用预先训练的一枪模型评估验证集上的候选架构。 (4)从头开始重新训练最有前途的架构,并评估它们在测试集上的性能。 我们在本节的其余部分中描述了这些步骤

3.1 搜索空间设计

搜索是一个具有挑战性的问题,因为它要求我们平衡一些相互竞争的需求。 首先:搜索空间应该足够大,足够有表现力,以捕获一组不同的有趣的候选架构。 第二:一次模型产生的验证集精度必须预测独立模型训练产生的精度。 第三:一次性模型必须足够小,可以使用有限的计算资源(即内存和时间)进行训练)。 搜索空间中最好的体系结构也必须具有竞争性的准确性。 然而,由于我们的主要目标是了解权重共享的作用,我们的搜索空间还没有完全优化质量,我们相信进一步的改进是可能的。

我们从一个搜索空间的例子开始(如图3.1所示)包含关于网络结构和在网络内不同位置应用的操作的重要决策。
在这里插入图片描述

在训练时,一次性模型包含三个不同的输入,它们连接在一起。然而,在评估时,我们可以通过调零或从训练网络删除输入1和输入3删除输入连接来模拟只包含输入2的网络。

更一般地,我们可以选择启用或禁用传入连接的任何组合。 这样,搜索空间的大小随着传入的跳接次数呈指数增长,而一次模型的大小仅呈线性增长。 连接总是伴随着1x1卷积;卷积中的输出滤波器的数量保持不变,无论有多少传入跳接。 然后,一次模型将几个不同的操作应用于1x1卷积的输出,并将结果相加。 在评估时,我们将这些操作中的一些清零或从网络中删除。 在我们的运行示例中,我们有四个可能的操作:一对3x3卷积、一对5x5卷积、最大池层或标识操作。 然而,在评估体系结构时,只使用5x5卷积输出。

这种方法应用于更大的模型,如图3所示,我们的网络由几个相同的单元组成,它们相互叠加在一起。 每个单元格被分成固定数量的选择块。 给定选择块的输入来自(1)前一个单元格的输出,(2)前一个选择块在同一单元格中的输出。 每个单元格中的选择块数,Nchoice,是搜索空间的超参数。 在我们的实验中,我们设置了Nchoice=4。 每个选择块都可以消耗网络中两个最近的单元格的输出。 这意味着每个选择块可以从最多五个可能的输入中选择:从以前的单元格中选择两个,从同一单元格中的先前选择块中选择最多三个。

每个选择块最多可以从a中选择两个操作分层可分离3x3卷积,(3)一对分层可分离5x5卷积,(4)一对分层可分离7x7卷积,(5)1x7卷积后7x1卷积,(6)最大池层,(7)平均池层。搜索共享空间的大小。搜索空间中的每个架构都由一堆相同的单元格组成;我们现在估计了搜索空间中可能的单元格的数量。每个单元格都有四个选择块。对于i=0、1、2、3,ii选择块至少需要1和最多2+i输入。这意味着对第i选择块有2^(2+i)−1可能的输入组合。此外,每个选择块都可以在7个可能的选项中应用一个或两个不同的操作。因此,我们可以在每个块中应用!71“!72”=721=28
可能的操作组合。因此,在整个搜索空间中,就会有(22−1)·(23−1)·(24−1)·(25−1)·284⇡6.109个可能的单元格

3.2 训练神经网络模型

许多体系结构搜索方法使用代理度量来有效地找到有前途的模型。 如果代理度量提供了模型的强相对排序,这使得在训练到收敛时能够发现高性能模型。 例如,一个常见的代理度量是经过短时间的培训后验证集的准确性。 该代理度量已成功地应用于原始NAS论文中。 在本工作中,以及在SMASH和ENAS中,代理度量是通过激活独立模型中的单个体系结构获得的验证精度。

一次模型是一个标准的大型神经网络训练使用SGD与动量。 为了确保特定体系结构的一次性模型精度与独立模型精度有很好的相关性,我们必须考虑下面讨论的方面。

  • 对共同适应的鲁棒性
    在评估时,我们去掉了一次性模型的大部分内容来评估特定的架构。如果我们天真地训练一次性的架构,这些组件就可以协同适应。从网络中删除操作(即使是不重要的操作)也会导致模型的预测的质量严重降低。一次性模型和独立模型精度之间的相关性也会降低
    我们在模型训练时间引入了路径退出,以确保模型对这些变化具有鲁棒性。当训练一次性模型时,我们随机去掉每批例子操作的子集。我们通过在训练开始时禁用dropout率,并使用线性时间表随时间逐渐增加dropout率,从而取得了良好的结果。训练结束时的dropout率设置为r的1/k次方,其中0 在单个单元格中,不同的操作相互独立地退出。 但是,如果一个模型包含多个单元格,则每个单元格都将退出相同的操作。 我们发现在同一细胞内独立地退出不同的路径是有益的,但没有研究跨细胞退出的行为。

  • 稳定模型训练
    单次模型训练在早期实验中是高度不稳定的。 我们发现,仔细应用批量归一化可以用来稳定训练。 我们实验了BN-ReluConv和Relu-BN-Conv。 虽然两者都显示出了希望,但我们将前者用于本文报道的实验。 当使用一次模型从搜索空间评估候选体系结构时,我们将其操作的子集归零。 这样做会更改每个层的批处理统计数据。 由于我们事先不知道候选体系结构的批处理统计,批处理规范化在评估时间的应用与在培训期间完全相同-快速计算批处理统计。
    鬼批归一化的变体(霍弗等人,2017)进一步稳定训练。如果我们在单批中为每个示例删除出相同的路径子集,一次性模型训练往往会变得不稳定。然而,我们发现,如果我们在例子的不同子集上删除不同的路径,它就可以稳定下来。我们最初尝试为批处理中的每个示例独立地删除不同的路径。然而,这种方法并太有效,使用批处理规范化,当对多个示例删除相同的路径时,它可以更好地计算批处理统计信息。作为一种妥协,我们将每个训练批划分为多个鬼魂批。单个训练批可能包含1024个示例,可以划分为32个大小为32的幽灵批。我们为一个幽灵批中的每个示例弹出相同的路径,但为不同的幽灵批弹出不同的路径。

  • 防止过度正规化
    一个给定的卷积层只能用于搜索空间中的体系结构的一个子集。在训练过程中,L2正则化只应用于当前架构所使用的模型的部分内容。如果没有这种变化,经常退出的层就会更正则化。

3.3 评价候选结构

一旦训练了一次性模型,我们就会使用它来评估许多不同架构在一个持久的验证集上的性能。在我们的实验中,架构的采样独立于一个固定的概率分布,遵循布洛克等人。(2017)。我们注意到,随机搜索可以被其他搜索方法所取代,如进化算法或基于神经网络的强化学习。

3.4.最终的选择和训练

搜索的输出是按一次精确排序的候选体系结构列表。 在完成搜索之后,可以从头开始重新培训性能最好的体系结构。 根据可用计算资源的数量和模型精度要求,还可以筛选和超参数调整许多性能最好的模型作为后处理步骤。 然而,其他有效的体系结构搜索方法忽略了这一提高精度的步骤,为了与这些方法进行比较,我们也遵循了这一步骤。 为了评估一次模型的使用,我们对搜索中发现的性能最好的体系结构进行了采样。 在CIFAR-10上,每个体系结构从零开始在完整的训练集上训练300个时代,然后在测试集上进行评估。 在Image Net上,每个体系结构都被训练了200个时代。 使用TensorFlow实现了实验(Abadi等人,2016年)。

可以扩展架构(以提高其准确性)或缩小架构(以降低其推理成本)。 在我们的实验中,我们通过增加过滤器的数量来扩大体系结构。 可能会增加模型中的细胞数量,以进一步提高性能,但我们在所有CIFAR-10实验中使用固定深度的6个细胞,在我们的Image Net实验中使用8个细胞。

4.one-shot模型实验

在这一部分中,我们解释和分析了架构搜索的步骤。 目标有两个:(1)表明我们的方法与现有的OneHot体系结构搜索方法具有竞争力;(2)提供关于什么使一次性体系结构搜索成为可能的见解。 在CIFAR-10上,我们使用了45,000个元素训练集、5,000个元素验证集和10,000个元素测试集。 图像网被划分为1,281,167个训练集、50,046个元素验证集和50,000个元素测试集。 在验证集上计算了简化训练的一次模型精度和精度,在测试集上计算了体系结构的最终精度。

4.1. 在CIFAR-10上的实验

  • 训练one-shot模型。
    -考虑到上一节中详细介绍的搜索空间,我们首先在CIFAR-10上训练一次模型。 每个一次性模型在一个由16个P100GPU组成的集群上进行了5,000到10,000步(113-225个时代)的训练。 每个工人使用的批次大小为64,分为两个鬼批大小为32。 我们使用的全局学习率为0.1和Nesterov动量0.9.1,增加训练步骤的数量,改善了我们实验中一次射击和独立模型精度之间的相关性,但仅略有提高。 因此,我们在最初的超参数调优实验中使用了较短的训练周期,在大规模架构搜索中使用的模型使用了较长的训练周期。
  • dropout率的影响。
    与香草SGD相比,一次模型训练只引入了一个新的超参数:辍学率。然而,这个超参数的值是重要的,必须仔细调整它,以实现一次性和独立模型精度之间良好的相关性。
    为了证明它的重要性,我们训练了具有不同辍学率的一次性模型。按照本节开始时描述的设置,每个单镜头模型使用具有16名工人的同步SGD训练5000步(113个时代)。这些实验中的辍学率在整个训练过程中都保持不变。我们的实验结果如图4所示。当退出率非常低时(即热点模型中的大多数路径在每个训练步骤中保留),相关图形成“陷阱”。搜索空间中的一些架构从一次性模型获得相对较高的精度。但是,虽然这些架构通常都很好,但接收精度最高的架构并不一定是搜索空间中最好的架构。然而,大多数体系结构的准确性都非常低。由于训练时的辍学率较低,一次性模型不能准备在评估时将大部分模型归零。
    当辍学率很高时(即在每个训练步骤中,一次模型中的大多数路径都被丢弃),我们遇到了一个不同的问题:OneHot模型将其能力集中在网络中最有用的路径上的程度大大降低。 一枪模型的精度现在在0.66到0.78之间,而不是从0.3到0.9不等。 在早期的实验中,我们发现,当一次性模型相对较浅(例如包含网络)时,高辍学率会产生令人尊敬的结果,总共12层)。 然而,随着搜索空间变得更加复杂,一次性模型变得更加深入,使用高辍学率变得越来越成问题。
  • one-shot模型训练与评估
    -对于我们在大规模架构搜索实验中使用的OneHot模型,我们从上面描述的小规模实验中做了两个改变。 第一:我们将培训步骤的数量从5,000个增加到10,000个。 第二:我们允许辍学率随着时间的推移而增加。 在培训开始时,辍学实际上是残疾的,而在培训结束时,我们的辍学率由系数r=0.1决定。 在这两点之间,网络中每个操作的辍学率在训练过程中线性增加。
    使用一个经过校准的单镜头模型,我们从搜索空间中随机采样了大约20,000个架构,并在单镜头模型上计算了每个架构的准确性。然后,我们根据其准确性将架构划分为桶,并从每个桶中采样四个架构。最后,我们从头开始重新训练了每个采样架构大约28个时代,批大小为64,幽灵批大小为32。这些独立模型的精度平均跨越5次运行。使用一次性模型,每个架构大约需要15秒钟来在P100GPU上进行评估。GPU小时评估了大约80万个架构。然而,我们很少花时间优化代码,而且搜索是简单的可并行的。我们相信,随着更多的工程努力,搜索的成本可能会大幅降低。然后,我们将这些独立的模型精度与一次性的模型精度进行了比较。图5显示了两者之间存在接近单调的相关性。这证实了在我们的实验设置中,这两个代理度量很可能支持类似的网络架构。
    在图5的底部,我们将查看直方图,的一次性模型的准确性。大约34%的架构获得的一次性模型精度为0.8或以上,而只有9%的准确率为0.85或以上,而只有1%的准确率为0.88或以上。性能较好的模型的质量改进适中,但仍然值得注意:经过25个时代的训练,我们的样本中的模型精度在0.8-0.85年代的独立训练后,平均验证集精度约为0.941。同时,一次性精度为0.90或以上的架构的平均验证集精度约为0.944。这表明,真正的高性能架构只占搜索空间的有限部分。这将由一个随机样本来证实,它经过训练,直到在下一个实验中收敛。
  • 最终的选择和训练。
    在用一次性模型筛选了2万种随机架构后,我们进行了另一个选择。从前100个架构中,我们选取了10个架构的分层样本进行进一步评估。然后,我们增加了模型中滤波器的数量,并在没有额外的超参数调整的情况下进行了300次训练。结果见表1“一顶”部分。当根据模型中的参数数量进行比较时,我们的方法与SMASHv2和几乎所有的ENAS变体都有竞争。我们基于F来参数化我们的模型,即第一个滤积层中滤波器的数量。当F=64时,我们得到了大约10M参数的平均精度为95.9%。粉碎的精度为96.0%,有1600万个参数。如果我们使模型更大(F=128),我们就会得到96.1%的精度。最好的模型的精度高达96.5%,约41M参数。我们的结论是,我们的方法与粉碎和除了一个ENAS变体。这表明,我们简化的架构搜索是可靠的,可以用于更好地理解一次性模型的行为。我们将在现在和下一节中进行更详细的分析。
    比较我们的10种顶级体系结构(“一热顶部”)和10种随机抽样体系结构(“随机”)的样本,我们发现顶级体系结构具有更好的准确性。 5%绝对。 然而,它们也有大约1.6倍的参数。 一个自然的后续问题是一次性模型是否总是有利于参数最多的体系结构。 为了回答这个问题,我们搜索了最小的体系结构,它们的一次模型精度超过了一定的阈值(大约在第90百分位数)。 由此产生的体系结构(“一热小”)的精度几乎与顶级模型相同,但参数比顶级模型和随机模型都要少。 基线全在列车上,所有路径都打开了模型。 这种方法可以。 精度高1%,最佳模型获得96.5%。 然而,参数的数量是近2倍的一热顶部和4倍的一热小。 在这方面,我们可以将架构搜索看作是修剪模型中不太有用的部分的一种方法。

4.2.imagenet的实验

为了在更大的数据集上评估我们的方法,我们使用云TPU直接在图像网上运行了一个架构搜索。单镜头模型在4个云TPU(16个芯片)上训练了15k步(约47个时代或6小时),批量大小为4096次。每个候选架构需要1-2TPU芯片分钟进行评估。最终的模型使用224⇥224输入图像进行了训练和评估。表2所示的结果与我们的CIFAR-10实验一致。性能最好的模型会有更好的效果精度比随机模型,但参数也更多。 通过寻找一次精度超过预定阈值的最小模型,我们能够改善质量与模型大小之间的权衡。 我们还发现,虽然我们的模型在相同数量的参数上比NASNet和MobileNet(Howard等人,2017年)有更好的精度,但它们具有更高的推理成本(以乘法ADDS来衡量)。 在附录A的后续实验中,我们调整了我们的顶级模型,以便大致匹配这些移动尺寸模型的计算。

5.理解one-shot模型

接下来,我们将讨论为什么在许多不同的架构中可以共享相同的固定模型权重集。图5的一个关键观察结果是,CIFAR-10的一次性模型精度从30%到90%,而独立模型精度从92.0%到94.5%。虽然当我们从独立训练切换到单一训练时,最佳模型的准确率只下降了5-10个百分点,但不那么希望的架构的准确率下降了60个百分点。布洛克等人也表现出了类似的行为。(2017),在CIFAR-100上,一次性模型的准确率在10%到60%之间,而独立模型的准确率在70%到75%之间。为什么一次性模型精度的传播要比独立模型精度的传播要大得多?

我们的假设是,一次性模型学习网络中的哪些操作最有用,并在这些操作可用时依赖于它们。从网络中删除不太重要的操作对模型预测的影响相对较小,对其最终预测精度的影响也相对较小。然而,从网络中删除最重要的操作,可能会导致模型预测的显著变化和预测精度的大幅下降。为了验证这一假设,我们采样了一系列架构,其中几乎所有一次性模型中的所有操作(基本退出率=10−8)。我们比较了这些参考档案的预测与从实际搜索空间中采样的操作较少的候选架构的预测相反。对培训集中的批示例进行比较。如果我们的假设是正确的,那么我们应该期望性能最好的模型所做的预测与当网络中的所有操作都被启用时所做的预测相似。

我们使用对称KL散度来量化候选体系结构的预测在多大程度上不同于给定示例上的参考体系结构。 我们的一次模型是使用逻辑损失函数训练的,因此参考输出可以解释为输出类上的概率分布(p1,p2,…,pn。 与产生输出分布的候选体系结构(Q1、Q2、…、QN)相比,KL散度估计为DKL(p||q)=PNI=1pilogpiqi。 我们使用DKL(p||q) 将DKL(Q||p),p和q之间的KL散度对称化,以量化这两种分布的相似性。 如果当前训练示例的分布几乎相同,那么对称化的KL散度将接近0。 相反,如果分布非常不同,对称KL散度可以增长相当大。 我们从训练集中计算了64个随机例子的KL散度,并报告了平均值。

如图6所示,我们的实验结果非常惊人。在训练集上测量的KL发散度与在验证集上测量的预测精度密切相关。此外,在计算KL发散时,不使用关于例子的训练标签的任何信息。结合图5的结果,这意味着候选架构的预测越接近参考架构的预测(一次性模型中的大多数操作被打开),在独立训练期间的质量就越高。权重共享隐式地迫使一次性模型识别并关注对生成良好预测最有用的操作。

同样的实验表明,我们在使用一次模型时所观察到的验证集精度的夸张差异是一个解释。 如果某些操作对一次性模型特别有用,则在生成预测时将依赖这些操作的输出。 将它们从网络中移除将导致灾难性的损坏和极低的验证集精度。 另一方面,不太有用的操作可以从网络中删除,只会对一次性模型的预测产生轻微的影响

接下来,我们将探讨KL分歧是如何随着时间的推移而演变的。 我们抽样了六种不同的体系结构,并跟踪了它们的对称性,KL在训练过程中的分歧。 结果如图7所示。 最初,所有的KL差异都很低,因为模型的预测最初是低置信度的,每个输出类被分配一个大致相等的概率。 我们的模型在其预测中逐渐变得更加一致,不同体系结构的预测开始分离。 这解释了KL分歧的尖峰。 在训练后期,网络中最有用的操作对模型的预测有很强的影响,并且接收到较低的KL差异。

6. 结论

在包含整个体系结构搜索空间的模型中,我们分析了一类基于权重共享的高效体系结构搜索方法。 我们设计了一种训练方法和搜索空间,以解决使这些方法发挥作用的根本挑战。 通过这个简化的镜头,我们解释了如何使用一次模型中的固定权值集来预测独立体系结构的性能,证明了一次体系结构搜索只需要梯度下降,而不是强化学习或超网络,就能很好地工作。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部