Combining Induction and Transduction for Abstract Reasoning
结合归纳和转换进行抽象推理
https://arxiv.org/pdf/2411.02272
摘要
在从极少数示例中学习输入-输出映射时,是先推断出一个解释示例的潜在函数更好,还是直接预测新的测试输出(例如使用神经网络)更好?我们在ARC-AGI上研究了这个问题,通过训练神经模型进行归纳(推断潜在函数)和转导(直接预测给定测试输入的测试输出)。我们在合成生成的Python程序变体上进行训练,这些程序解决了ARC-AGI训练任务。我们发现,尽管具有相同的训练问题和共享相同的神经架构,归纳和转导模型解决了不同类型的测试问题:归纳程序合成在精确计算和组合多个概念方面表现出色,而转导在模糊的感知概念上成功。将它们集成起来接近ARC-AGI上的人类水平表现。
1 引言
从少数示例中进行鲁棒泛化仍然是人类智能超越AI的最重要方式之一。最近许多工作将这种泛化视为一种抽象推理形式:给定少量训练输入-输出xtrain, ytrain,以及测试输入xtest,想法是使用类比推理、思维链、归纳程序合成或转导预测等推理策略预测相应的测试输出ytest(Thoms等人,2023;Wang等人,2024;Witt等人,2023;Lee等人,2024;Tang等人,2024a;Hocquette & Cropper,2024;Butt等人,2024)。抽象推理语料库(Chollet(2019),以下简称ARC-AGI)是一个少样本学习基准,测试快速学习各种新技能并将它们应用于新情况的能力。每个ARC-AGI任务都以彩色网格上的输入-输出形式呈现,但可以涉及遮挡、路径寻找、碰撞、对称性、重力、反弹、计数等概念,使ARC-AGI本质上成为许多推理数据集的复合体,也是更引人注目的未解决基准之一,强调了广泛覆盖的少样本学习(图1)。
在这里,我们研究了使用ARC-AGI中的少样本学习问题作为测试平台的归纳和转导的神经方法。归纳意味着首先找到一个函数f,其中f(xtrain) ≈ ytrain,然后预测ytest = f(xtest)。转导则直接输出ytest,而不显式构造中间函数f。直观地说,归纳捕捉了学习者应首先解释训练数据,然后使用该解释进行预测的概念。归纳学习者可以通过花费更多时间优化或搜索更好的解释来表现更好,使用训练示例xtrain, ytrain来评分候选函数。转导则捕捉了训练示例本身应直接参与生成新预测的直觉,并且成功的预测不一定需要显式解释。参见图2。
我们通过生成大量合成问题来训练神经网络进行归纳和转导。我们发现,归纳和转导的神经模型是强互补的。我们认为这是令人惊讶的:尽管任何一对模型通常会解决略有不同的问题,但通常这可以归因于不同的先验、数据或架构。相反,我们发现,即使控制了先验、数据和架构,大多数由归纳解决的问题并未被转导解决,反之亦然。此外,归纳和转导可以通过使用归纳生成候选函数f,直到找到一个满意的函数(例如或达到测试时计算预算,此时转导作为备用介入来进行简单集成:它们的互补性具有实际意义。
我们的研究与程序合成紧密相关。我们将函数f表示为Python代码,这意味着归纳合成程序。我们在LLM生成的Python脚本上训练转导模型,这意味着转导在符号代码的输入-输出上进行训练。尽管程序学习长期以来一直是通用AI如何工作的流行愿景(Solomonoff,1964;Schmidhuber,2004;Hutter,2004),主导理论一直是显式代码生成(归纳),而不是隐式教导神经网络模仿代码(转导)。我们的工作对此假设进行了测试。
测试这些神经方法需要大量函数学习问题数据集,这具有挑战性,因为不仅必须生成新函数,还必须生成这些函数的好输入。考虑图1中的变换范围:一个函数的好输入不太可能适用于另一个函数。为了应对这一挑战,我们的数据生成器首先生成一个确定性的Python函数f,然后生成一个概率程序来采样f的输入,最后执行这些程序以生成输入-输出。这有助于生成适合底层变换的函数输入,并将xtrain, ytest限制为可由确定性映射解释。
我们贡献如下:
1. 研究发现,即使在对相同问题进行训练时,归纳和转导的神经模型也是强互补的。这与开创性的神经程序合成工作(Devlin等人(2017),发现归纳更优越)相矛盾,也与领先的ARC团队(Cole等人(2024),主张转导与测试时训练)的发现相矛盾。
2. 一种自动数据生成方法,从100-160个ARC训练任务的程序解决方案开始,并扩展它们以生成40万对新问题和Python解决方案。
3. 对这些方法如何扩展的研究。我们发现,当增加手动标记数据时,性能很快饱和,但在训练和测试时都随计算量扩展。
4. 对每种方法解决的问题家族的分析,以及它们与人类的比较。
2 归纳和转导的神经模型
我们考虑少样本监督学习问题,其中学习者被训练将输入空间X的成员映射到输出空间Y。对于K-shot学习,我们接收K个训练输入-输出,以及一个测试输入xtest ∈ X,并预测ytest ∈ Y。我们的K-shot学习的神经模型使用进一步注释了真实函数f : X → Y的元学习数据进行元学习(Mishra等人,2017,等等),该函数监督归纳模型。下面我们定义这些模型的训练和使用。
结合归纳和转导。归纳允许根据训练示例检查候选假设。因此,我们知道归纳何时找到了一个合理的解决方案——但有时它无法找到任何解决方案。转导具有相反的特性:我们无法检查其预测是否与训练示例匹配,但它总是提供一个候选答案。因此,我们通过首先尝试归纳,然后在候选假设都无法解释示例时使用转导来进行集成:
实例化ARC-AGI的框架。X中的每个输入和Y中的每个输出都是一个2D网格,每边范围从1到30像素,每个像素包含十种颜色之一。由于ARC-AGI任务高度多样化,但通常具有类似抽象程序的结构,我们将底层函数f表示为Python代码,这在计算上是通用的,因此在原则上可以解决任何ARC-AGI任务。因此,归纳模型必须生成Python代码,因此我们使用Llama3.1-8B-instruct(Dubey等人,2024)初始化我们的模型,因为它在源代码上进行了预训练。1我们将2D彩色网格编码为字符串,每个像素使用1个标记,并使用换行符分隔行(附录B.1)。然后,我们通过进一步微调Llama3.1-8B-instruct进行归纳或转导,使用合成生成的包含问题的语料库,如下所述。
3 生成归纳和转导的数据集
生成ARC风格的任务具有挑战性,因为ARC-AGI中可能出现的概念多样性。生成这些任务也具有挑战性,因为我们不仅需要生成一个函数,还需要生成作为该函数良好示例的输入。
从高层次来看,我们的数据集源自100个手动编写的Python程序,每个程序都解决了一个给定的任务(函数f),并随机生成新的输入网格。我们称这些100个手动编写的程序为种子。每个种子都用自然语言注释,描述了问题背后的核心直觉。然后,我们使用大型语言模型对种子进行变异和重组,生成数千个程序(图3)。
种子的结构。每个种子由三部分组成:
1. 特定ARC任务的自然语言描述——包括如何解决该任务——在种子的顶部表示为Python注释。
2. 一个Python函数transform_grid,对应于手稿中的函数f,它将特定ARC任务的每个输入网格映射到其相应的输出网格。
3. 一个Python函数generate_input,它不带参数,并随机生成f的新输入(transform_grid的新输入)。
先验知识。种子通过展示解决训练任务的良好程序,向系统传递了先验。我们将其中许多先验进一步编码到一个Python库中,该库包含我们在许多种子中发现的实用代码,例如生成随机精灵、检测对称性或提取对象的子程序(附录A.2)。合成问题可以使用相同的库。
然而,这种先验知识与之前的ARC-AGI领域特定语言(Butt等人,2024;Wind,2020;Ainooson等人,2023)不同。领域特定语言通过仅允许领域特定原语的刻板组合来限制允许的程序类。我们仍然允许任意Python代码,这有助于覆盖多样任务的长尾。
混合种子。为了生成更大的合成数据集,我们使用LLMs“混合”种子。每个新的合成ARC问题通过一个三阶段管道生成(图11):
1. 通过使用种子自然语言描述提示LLM,采样一个新的自然语言描述,有效地使用上下文学习来重组和变异不同问题的元素,以自我指导的精神(Wang等人,2023)。
2. 通过检索增强生成(RAG:Lewis等人,2020)为该新描述生成代码。我们的RAG管道检索具有相似描述的种子,并提示LLM在给定检索到的种子的情况下为新描述生成代码。
3. 执行新创建的generate_input以生成输入,这些输入传递给transform_grid以生成输入-输出网格。
图4展示了我们的管道生成的示例问题,更多示例在此链接中可视化。除非另有说明,我们使用GPT4o-mini和ada-002创建合成数据集。
4 归纳和转导的实证研究
我们训练归纳和转导模型,目的是理解(1)方法的比较;(2)性能如何随训练时间努力扩展;(3)性能如何随测试时间计算扩展(仅对归纳而言,因为它允许在测试时抽取更多样本以提高性能)。我们在ARC-AGI的400个问题的公开验证分割上报告性能,这比训练分割更难。本节描述的系统从训练分割的100个问题的子集中学习,特别是我们创建种子的那些问题。
归纳和转导是强互补的。尽管在完全相同的问题上进行训练,归纳和转导模型解决了不同任务,并且没有一种方法明显比另一种更有效。尽管这些方法的整体解决率相似,但大多数由归纳解决的问题并未被转导解决,反之亦然(图5A)。
另一种解释是,归纳和转导实际上并不互补,而是由于训练或测试时的随机性,两个具有不同随机初始化的神经网络简单地解决了不同的问题。为了测试这种替代解释,我们训练了许多具有不同随机初始化的模型。我们发现,归纳/转导解决的问题在这些不同运行中出奇地稳定(图5B)。换句话说,有些问题对归纳更友好,而另一些对转导更友好(图6)。
性能随数据集大小扩展,但随着种子数量的增加迅速饱和。我们训练模型,同时系统地改变我们使用的人工创建的种子数量,并改变从这些种子生成的合成数据量(图7)。随着微调训练数据的增加(增加合成数据),性能提高,但随着人工创建种子数量的增加而饱和。我们推测这种饱和发生是因为每个种子引入了几个核心概念,并且在足够多的种子之后,基本上所有重要的概念都已被展示。这表明,超过临界种子数量阈值后,该方法可以随计算量的增加而扩展,而不需要进一步的人工数据标注。展望ARC-AGI之外,这意味着我们的方法可能可以应用于其他少样本函数学习问题,使用适度的手动数据标注。
归纳性能随测试时间计算扩展。我们改变归纳的测试时间采样预算,发现解决率几乎单调增加(图8,左)。原则上,抽取额外样本存在发现“假阳性”解决方案的风险,这意味着它们适合训练示例,但未能正确预测测试输出。实际上,约9%的适合训练示例的样本是假阳性。图8(右)显示,这9%中约一半对应于大多数概率质量仍放在正确输出上的问题,这意味着简单的多数投票方案将消除任何假阳性(例如,AlphaCode中的聚类Li等人(2022))。附录D显示了假阳性的示例。
图8:左:Sample+Oracle假设一个选择采样程序的预言机。它上限了随机选择一个与训练示例一致的程序的准确性(Sample+Filter)。用100k gpt4-description-gpt4omini-codegen数据训练的归纳模型。CodeIt(Butt等人,2024)是最近用于ARC-AGI的神经程序归纳模型。右:假阳性率的直方图。在有假阳性问题中,约一半的假阳性率小于0.5,这意味着大多数(过滤后的)样本预测正确的测试输出。
更强的LLM生成更好的合成数据,归纳对数据质量更敏感。为了节省成本,之前的结果都使用GPT4o-mini生成合成数据。为了理解更强模型的价值,我们使用GPT4生成自然语言问题描述(但仍使用GPT4o-mini生成代码)生成了100k合成问题。GPT4生成的更丰富和更多样化的合成问题显著提高了性能,但主要对归纳有提升,而转导对数据质量不太敏感(表1)。
5 扩展我们的方法
受迄今为止的发现驱动,我们通过生成两个更大的数据集扩展了我们的方法:
ARC-Heavy:从160个种子生成的200k问题。ARC-Heavy的目的是以可重复的方式扩展我们的方法,同时填补其在训练分割掌握中的任何空白。我们首先在训练分割上运行第4节中的模型,以识别它们仍难以解决的60个问题,为此我们生成了60个新种子,总共160个种子。从这些种子中,我们使用GPT4生成自然语言描述,使用GPT4o-mini生成相应的Python代码,生成了200k合成问题。
ARC-Potpourri:来自异质来源的400k问题。ARC-Potpourri的目的是组装我们能做的最大的数据集,即使它来自一个混乱的混合来源。从ARC-Heavy开始,我们添加了第4节中的所有合成数据。我们进一步添加了ReARC(Hodel,2024)中的100k仅转导训练示例。
测试时间改进。我们通过测试时训练(简称TTT;Sun等人(2020))和重新排序方案改进了转导,该方案扩充每个问题并在多个扩充下预测最可能的输出(附录E-F)。我们将采样预算扩展到20k程序。
我们将结果系统称为BARC。表2显示了各种BARC模型的性能。转导和归纳都有效,归纳解决的问题略多,直到添加测试时训练/重新排序,之后转导表现略好。一个集成得分56.75%,超过了之前发表的方法。稍后发布此工作使Akyürek等人(2024)通过更好地训练我们的转导模型,同时使用我们的归纳模型,将得分提高到61.9%。但没有我们的模型——包括程序合成器——他们的得分较低,这表明复杂的测试时训练并不能完全替代程序合成。我们最好的模型表现几乎与普通人相当(56.75% vs. 60.2%),但远不如最好的人类(98%)。模型输出在此可视化。
缩小我们的方法。我们的旗舰模型在Kaggle托管的私人测试集上运行成本过高。我们通过省略测试时训练,仅采样336个程序,并将转导波束大小减少到3来缩小规模。这在Kaggle上得分19%,在验证集上得分36.5%。表3显示,在这个较小的搜索预算下,程序合成的效果较差。鉴于程序合成的大计算效率,这表明更智能的神经程序搜索有很强的回报。
6 哪些问题对模型和人类来说更容易?
挑战人类的问题是否也挑战模型,反之亦然?我们使用LeGris等人(2024)的数据,将ARC-AGI验证问题按难度分为5个同等大小的类别。图9展示了人类和模型准确性之间的奇特关系:所有模型在最困难的问题上超越了人类的表现,但在最简单的问题上表现不佳。由于我们的模型在简单的Python程序上进行训练,这表明有些问题在代码中很简单,可以被变压器学习,但对人来说非常困难——反之亦然,人们拥有先验知识,可以轻松解决我们的Python程序生成器无法生成的问题。对于典型难度的问题,模型的表现大致与人类相当,并且在所有难度级别上,转导和归纳都发挥互补作用,即使在添加测试时训练后也是如此。
哪些概念对模型来说更容易?我们在ConceptARC(Moskvichev等人,2023)上进行测试,这是一个替代的ARC风格测试集,将其任务分类为“概念组”,每个组例示一个单一的孤立高级概念,如“相同性”或“上方与下方”。我们使用在ARC-Potpourri上训练的模型,发现特定的概念类别对归纳或转导更容易(图10)。我们发现两种方法之间有一个直观的分工:诸如计数的概念组最好用符号代码解决,而转导更好地处理诸如判断形状是更水平还是更垂直,或更上/下的感知过程。
ConceptARC揭示了转导和归纳不同的另一个维度:因为ConceptARC每个问题只展示一个概念,所以不需要将许多概念组合在一起。因此,具有符号组合独特能力的归纳模型失去了一个关键优势。转导的组合能力有限,但可以用灵活的子符号方式实例化单个概念,这可能解释了为什么它在ConceptARC上表现出色。
7 相关工作
ARC-AGI最初设计用于挑战传统深度学习并推动替代范式的进展(Chollet,2019)。第一波成功的方法使用领域特定编程语言的离散程序搜索,包括最初的Kaggle获胜者(Wind,2020)。这些符号方法在与GPT-4(Wang等人,2024)的竞争中保持了自己的地位,但最近被使用测试时训练的转导架构(Cole等人,2024)和LLM引导的程序生成(Greenblatt,2024)超越。ARC-AGI迄今为止抵制了传统神经和符号方法,但对于成年人来说是可以解决的,并且在某种程度上,儿童也可以解决(LeGris等人,2024;Opielka等人,2024)。
通过LLM进行代码生成在许多最近的工作中进行(Li等人,2022;Gao等人,2023;Chen等人,2021;Austin等人,2021)。我们最直接建立在Li & Ellis(2024)和Greenblatt(2024)的基础上。前者使用LLM生成的变体对人类编写的程序进行微调,以进行归纳程序合成。虽然有许多技术差异,但关键因素是我们通过合成input_generator函数生成函数输入,而不是让LLM直接生成可能的输入。这很重要,因为仅靠LLM无法生成复杂、精确正确的输入,如ARC网格。这可能使我们的工作适用于其他具有复杂输入空间的少样本泛化问题,如网页、机器人规划等。Greenblatt(2024)从GPT4o中采样许多Python程序:与我们的归纳模型相当,但不是微调,而是使用提示。微调迫使我们创建了一个新问题数据集,这为探索转导模型创造了机会。
神经程序合成的经典工作之前比较了归纳和转导(RobustFill:Devlin等人(2017))。我们在这里探索了一个更丰富的函数空间,得出了与RobustFill定性不同的结论:我们发现它们是互补的,而不是发现转导不如归纳。更广泛地说,转导-归纳的划分位于监督学习的核心。归纳方法,如线性回归,首先构造一个函数f,其中f(xtrain) ≈ ytrain,然后预测ytest = f(xtest)。转导方法,如支持向量机和上下文学习,通过直接与训练数据进行比较来输出其预测。我们使用相同的神经网络架构和数据集来执行这两项任务,允许对这些范式进行受控比较。
ARC-AGI的数据集。ReARC(Hodel,2024)是一个手写程序的数据集,解决了所有ARC-AGI训练任务,并为其生成新输入。ReARC使用领域特定语言实现,缺少自然语言注释,难以与LLM混合。其他工作使用自然语言(Acquaviva等人,2022)或Python程序(Huang等人,2024)注释ARC-AGI,这些可能作为我们工作的种子程序。Acquaviva等人(2022)启发了我们的自然语言描述,Huang等人(2024)影响了我们的种子程序格式。我们的新种子更适合这种方法,因为它们在Python库中编码了共享先验(附录A.2),并且有一个明确的input_generator描述了一个精确结构的无限有效输入空间。
8 讨论
我们从鲁棒的样本高效泛化中学到了什么。显式的符号假设和隐式的神经表示都不足以解决所有问题:每个都有其适用的领域,简单地将专门于每个领域的模型集成并不能覆盖所有情况。设计更聪明的神经程序搜索,或用更多数据训练转导预测器,不太可能会有成果。相反,我们需要不可简化为纯粹神经或符号形式的表示,这些表示交织了归纳和转导推理。实现这一想法的一种方法是使用原子基元是非符号的语言进行程序合成,并预训练这些基元以封装核心知识的基本原子。虽然已有工作朝着相关方向迈出了步伐(Reed & De Freitas,2015;Alet等人,2018;Tang & Ellis,2023;Li等人,2024),如何设计和扩展这一想法仍然是一个开放问题。
这一方法论在多大程度上适用于ARC-AGI之外?少样本函数学习是一个非常灵活的框架,但我们的特定方法最适用于目标泛化可以用符号代码描述的情况。作为一个立即具体的例子,网页抓取和其他形式的数据处理可以适应我们的框架。作为一个更宏伟的目标,符号代码是定义世界如何运作的精确模型的特别好的媒介。这在自然科学(Schmidt & Lipson,2009)和AI中都是如此,例如机器人策略(Liang等人,2023)、规划器(Wong等人,2023)和更广泛的世界模型(Das等人,2023;Tang等人,2024b;Evans等人,2021;Liang等人,2024)。这些不是LLM预训练数据中经常出现的程序类型——因此仅提示不太可能表现良好——但仍然可以通过策划约100个种子来展示系统应该学习的内容。
理论上,归纳和转导不应该如此互补。归纳和转导之间的等价性是众所周知的,例如允许将参数化函数拟合转化为转导问题的“核技巧”。我们的元学习模型,在无限元训练数据的情况下,应该类似地收敛,因为变压器是通用函数逼近器。存在差异之所以有趣,正是因为它偏离了理论上的预期。
我们是否通过在400k合成问题上训练作弊?ARC-AGI的精神是从少数示例中泛化。然而我们却在许多示例上进行微调。在我们看来,真正的训练数据是160个种子,而不是400k“混合”,后者类似于摊销推理或唤醒-睡眠中的“梦境数据”(Le等人,2017;Ritchie等人,2016;Hinton等人,1995)。换句话说,我们的系统输入160个训练集问题的注释解决方案,并进行预先计算,将其转化为能够解决新问题的神经网络。从这个角度来看,这是一种学习解决ARC-AGI的样本高效方式——尽管它不是计算高效的。
对ARC-AGI努力的影响。发布我们的代码和数据帮助Akyürek等人(2024)实现了第一个达到人类平均水平的开源系统。ARC-AGI '24的第二名团队(Franzen等人,2024)也从我们的数据中受益。我们希望其他人将继续在我们的工作基础上继续努力。我们还打算我们的发现鼓励研究离散程序搜索作为当前社区中占主导地位的测试时训练的替代方案,并将我们的实验设计为展示这一其他路径的价值。
从领域特定语言到领域特定库。许多进行程序搜索的工作依赖于精心调优的领域特定语言,而不是使用Python等通用目的语言(Butt等人,2024;Wind,2020;Alford等人,2022;Ainooson等人,2023)。然而,我们认为通用目的编程语言可以提供更广泛的覆盖范围,并且试图设计受限语言不可避免地会牺牲在开放式学习领域(如ARC)中可能出现的程序空间区域。相反,我们在这里提倡领域特定库,它为通用目的语言配备了额外的先验知识,但不限制它仅使用这些先验知识。
如何表示输入-输出映射。我们的种子包括:(1)一个网格变换程序,(2)一个输入生成器,以及(3)对(1)和(2)的自然语言描述。实际上,这种表示允许我们为训练采样一致的输入-输出示例对,而自然语言描述帮助LLM将种子混合成新问题。这进一步捕捉了输入和输出的潜在自然语言描述,从中推导出函数及其原像。
生物智能和唤醒-睡眠提示的下一步。我们的工作在心理学中有一个直接的类比,即双过程模型,它根据人类思维是否依赖于快速非语言直觉或深思熟虑的意识思维进行分类(Smith & DeCoster,2000;Kahneman,2011)。尽管初步,我们的结果可能表明这种划分实际上是规范的,并且来自正在解决的问题的属性,而不是求解器本身的属性。然而,人类的思维在如何结合这些模式方面更为复杂:快速直觉可以通过深思熟虑的符号处理进一步重新处理,这可以触发进一步的直觉,依此类推。我们的方法没有类似的方式来交织这两种策略,但更深入地整合归纳和转导是一个自然的下一步。
我们的方法也可以看作是一种唤醒-睡眠或梦境学习的形式(Hinton等人,1995;Fosse等人,2003;Rasch & Born,2013),其中生成模型的样本训练推理网络。这里的生成模型是一个带有种子的提示,而推理网络是我们微调的模型。将类比延伸到唤醒-睡眠提示了两个方向。首先,我们可以通过使用这些新解决的测试问题作为种子生成新的合成数据(在“梦境/睡眠”期间)来从最近解决的测试问题(在“清醒”期间)中学习。其次,我们还可以实现一种抽象学习形式,自动扩展我们的自定义ARC库(附录A.2),或在库学习和模块化元学习的精神中向该库添加新的神经基元(Bowers等人,2023;Ellis等人,2021;Alet等人,2018)。
局限性。我们的系统通过解决新问题不会变得更擅长少样本学习:相反,它从种子中手动编码的知识中引导,通过LLM训练/推理管道将其转化为少样本学习者。一种更有说服力的方法应该是系统自己发现我们在种子中为其编译的知识,例如通过在训练任务上练习,而不在真实解决方案上进行监督。
我们的工作仅在ARC-AGI上进行了评估。然而,ARC-AGI设计为包含许多嵌入其中的概念和问题,因此可以被视为不同学习问题的开放式复合体。由于这种多样性,它也以极其具有挑战性而闻名,尽管一系列高调的竞赛,它仍然抵制解决方案。因此,我们相信尽管在多个基准上进行评估是可取的,但ARC-AGI是一个适合作为实验评估中心基准的基准。
Code & Data Availability. Our code, data, and model weights are freely available at https:
//github.com/xu3kev/BARC. Interactive visualizations of our dataset and model outputs are
available at this link.
附录请参考原文
https://arxiv.org/pdf/2411.02272
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.