查看原文
其他

从Deepmind火烈鸟看多模态研究发展趋势

胡鹏博 Mindverse Research 2022-08-05

近期,随着单模态的研究出现了瓶颈,多模态的研究开始逐渐吸引了大家的注意。在多模态任务中,往往要求模型能够同时理解多种不同类型的信息,并且利用他们来提升推理效果。尽管在实际场景中,模态类型众多,但是视觉-语言类多模态任务却倍受关注。在该方向,近期出现了很多有意思的工作,这些工作也代表了当前该领域的发展趋势。本文以DeepMind 最新出的火烈鸟(Flamingo)多模态大模型为核心,介绍几个当前视觉与语言方向有意思的几个趋势。   


目 录

  1. 大模型统治世界

  2. 新的微调范式:Prompt & Adapter

  • Prompt

  • Adapter

  • 多模态模型中的Prompt和Adapter

  • 以语言模型为中心的多模态预训练模型

    • 语言模型类别

    • 基于Encoder-Decoder的多模态预训练模型

    • 将视觉信息“嵌入”到语言模型中

  • 火烈鸟模型详解

    • 简介

    • 模型架构

    • Visual Encoder 模块

    • Perceiver Resampler模块

    • 语言模型与Adapter模块

    • 输入处理

  • 总结


  • 大模型统治世界


    随着 Transformer模型 的出现,预训练模型在近年来开始以惊人的速度发展,从 Bert 开始到 GPT-3 到 MAE ,预训练模型在 NLP 和 CV 领域的一系列任务上取得巨大成功。由于大规模预训练模型往往蕴含着丰富的知识,仅仅通过对特定任务进行微调,即可取得非常好的效果。因此,这两个领域中,绝大多数任务都已经被预训练模型所统治。


    单模态预训练模型分类[1]



    在多模态领域,超大规模预训练模型也已经进入了白热化阶段,各种大规模预训练模型层出不穷。最常见的多模态预训练大模型往往是通过图像-文本对进行联合训练,从而让模型能够学到更好的跨模态表征。


    以ViLT[2]模型为例,该模型首先将图像和语言的 Embedding 进行拼接,同时加入位置编码以及模态类型编码,之后直接喂入到 Transformer Encoder 模块。在输出端,一般多模态预训练模型会采取类似于 Bert 模型的遮蔽掩码 Loss,在加上一个图文匹配 Loss 来使模型学习跨模态表征。在 ViLT模型中,作者还加入了单词-图像区域匹配的 Loss,来帮助学习更加细粒度的图文匹配表征。


    ViLT模型架构


    不同于 ViLT 这种在早期就将图像-文本对进行拼接的思路,OpenAI 在2021年所提出的 CLIP模型[3],则采用的是对比损失函数来学习图像-文本的跨模态表征,其目标是当图像和文本匹配的时候拉进其表征的距离,而当不匹配的时候,拉远其距离。基于这种方法训练的模型使得 CLIP 具有几个非常有意思的特征:

    1. 通过这种方法学习到的Encoder模块具有很好的多模态表征能力;

    2. CLIP可以通过计算图文相似度来实现强大的zero-shot推理能力。


    CLIP模型架构


    此外,CLIP 最大的优势是,其结构是松散耦合的,在保证学到了多模态表征的基础上,还可以进行随意拆分,从而将 Encoder模块 很好的用到其他模型或者任务上。有相关工作表明,将 CLIP 的 Visual Encoder 嵌入到其他下游任务中,代替原有的视觉Encoder模块,可以显著的改善下游任务的表现[4]


    CLIP Visual Encoder模块可以替换其他多模态模型中的视觉编码器部分


    可以发现,不管是单模态领域,还是多模态领域,大模型逐渐开始成为核心,顺从这一大趋势,李飞飞等学者将大规模预训练模型统一命名为基础模型(Foundation Models) [5],这一命名特地强调了大规模预训练模型在当前深度学习领域的中心地位,而在多模态领域,这一趋势也是非常明显的。

    大规模预训练模型成为基础模型


    新的微调范式:Prompt & Adapter


    随着大模型开始成为基础模型,预训练-微调 这一范式开始成为了标配,这一方法也被广泛的使用在各种下游任务中。然而,在传统大模型微调范式中,往往会对整个预训练模型进行微调,这在一定程度上“损坏”了预训练模型中本身蕴含的“知识”,同时随着模型尺寸的增大,直接对模型微调也逐渐变得不太现实。因此,Prompt 和 Adapter 也逐渐开始被重视,通过仅仅训练少量参数(连续型 Prompt & Adapter),甚至直接使用显示文本作为 Prompt(无需微调)就可以让大规模预训练模型适应下游任务,并且表现出出色的效果。


    在多模态领域,更加需要 Prompt 和 Adapter,由于多模态预训练模型往往都是通过 图像-文本匹配 来学习的,然而,多模态下游任务实际上跟图文匹配任务具有很大的差异,例如 VQA,Visual Grounding,V-SNLI,GQA 等。然而,直接微调完整多模态模型成本很高,而且会破坏所学到的图文表征。因此,通过Prompt & Adapter ,让下游数据来适应模型,是最节省成本和高效的。


    总的来说,Prompt 和 Adapter 代表着当前大规模预训练模型在应用上的一种思维的转变,从传统 预训练 → 微调(模型适应下游任务)的思维,转变到这种 预训练 → Prompt&Adapter(下游任务适应模型)的思维。这种转变在NLP领域早已显现,而在多模态领域,也逐渐开始了这种转变,因此,这也是当前多模态领域的一个大的发展趋势。在这一部分,将会对这两个技术进行简要的介绍。


    Prompt

    在NLP领域,Prompt 已经几乎“家喻户晓”,其特点是,通过引入一段“指令”来引导模型进行下游任务的推理,在无需训练,或者只训练这一段的“指令”的情况下,就能使得模型取得接近于全部微调模型的效果。

    prompt示例。通过给输入增加 Prompt,让模型“回忆”之前的知识,从而做出更好的预测。


    近期一个有意思的例子就是 GPT-3 上 prompt 的应用,仅仅通过给输入端增加 “Let's think step by step” 这样的Prompt,就能大幅调高 GPT-3 在一些任务上的推理表现[7]



    Adapter

    下游任务中,数据的分布往往千奇百怪,当预训练的语料库和任务与下游任务的分布具有巨大差别的时候,只微调 Prompt 也很难取得很好的效果, 而直接微调大模型又是成本很高的事情。因此,一个很好的解决方案就是使用 Adapter。通过给预训练模型中插入一个小的模块(Adapter),既可以保留预训练模型中的知识,有能够将下游数据的分布“转换”成预训练模型更能理解的方式,同时避免了去微调整个预训练模型的成本。


    下图是一个使用Adapter的例子,左边是一个正常Transformer Encoder模块,可以看到 Adapter 是直接插入到模块中间的,同时在训练阶段,其他模块参数保持不动,只训练 Adapter模块 [8]


    Adapter模块的一种使用方法


    Adapter的另外一个巨大的好处就是可插拔,仅仅通过给大模型插入一个训练好的 Adapter,就可以赋予大模型在某一个下游任务上的突出表现 。同时,Adapter 非常适合进行社区分享,使用者只需要分享 Adapter模块的参数即可,无需分享整个模型参数,这样既减少了存储成本,又使得模型的分享变得更加便捷。


    实际上,早在2020年,Adapter这种可插拔的特点已经被 DeepMind 所重视。为此,DeepMind 专门开发了一个 Adapter分享网站:https://adapterhub.ml/ 。用户可以使用统一的接口为大模型制作适配下游任务的Adapter,之后在社区中,仅仅分享 Adpater 即可。


    Adapter的制作与分享流程[9]


    多模态模型中的Prompt和Adapter

    在多模态领域,也已经开始有部分工作尝试将 Prompt & Adapter 引入进来。最常见的模型就是 CLIP,其本身自带基于 Prompt 的 zero-shot推理能力。然而,也有工作尝试将连续型 Prompt 引入到 CLIP 中,如下图,在文本端,使用M个连续的可学习的向量(Prompt) 代替显式的文本描述,仅仅调节这M个向量,就能显著增强 CLIP 在下游任务的分类效果 [10]


    在CLIP中使用连续型Prompt


    同时,也有工作将 Adapter 引入到 CLIP 模型中,通过增加一个 Adapter,来把 CLIP Encoder 模块 所输出的表征,进行“转换”,使得下游数据更贴合 CLIP学习的表征, 从而使得模型能够更好的执行下游任务推理[11]

    将 Adapter 嵌入到 CLIP 中


    以语言模型为中心的多模态预训练模型


    语言模型类别

    在NLP领域,语言模型往往分成了三类:

    • 自编码模型(Autoencoding):Bert,RoBerta等。

    • 自回归模型(Autoregressive):GPT系列

    • 编码器-解码器模型(Encoder-Decoder):BART,PaLM等。

    在这些类别中,自编码模型对各种文本分类任务都比较擅长,而不擅长生成任务。自回归模型比较序列生成任务,同时编码器-解码器模型非常适合做翻译或者摘要类任务。在这些类别中,由于自回归模型和编码器-解码器模型都具有序列生成能力,相当于自带“序列推理”的基因。


    类比到多模态领域,实际上大多数多模态预训练模型都是属于自编码模型(例如: VisualBert, LXMERT, VL-Bert, UNITER, ImageBert, Oscar, VILLA, ERNIE-ViL, UNIMO等),导致其非常不擅长做序列推理任务,虽然很多下游任务都可以建模成分类任务,例如VQA、Image Caption (一篇工作将 Image Caption 建模成了zero-shot分类任务,效果也非常好[12]等,但是基于图像-文本匹配所训练的模型,从任务上就和下游任务具有很大的鸿沟,尤其是对于 Visual Dialog 这类需要生成的任务,现有的基于图文匹配训练的多模态模型都需要进行大幅度微调才能适应这类任务,使其浪费了预训练模型的特性。


    相对来说,自回归语言模型,可以很好的学习蕴含在自然语言语料库中的序列知识,而自回归的特性使得其“天然”适合利用序列知识进行推理。通过合适的训练样本够造,甚至可以实现非常好的 zero-shot推理能力,例如 GPT-3。因此,为了让多模态模型也具有强大的序列推理能力,有两种解决方案:1. 使用Encoder-Decoder架构作为多模态预训练基础模型;2. 通过将视觉信息“嵌入”到自回归语言模型中,或者编码器-解码器模型中的解码器模块中。 


    基于Encoder-Decoder的多模态预训练模型

    阿里在今年新出的OFA模型[13],则是以 Encoder-Decoder 作为基础框架来训练多模态模型,该模型在图像描述、图像生成、视觉问答、图文推理、物体定位等任务中均取得了当时最好的效果。然而,这类模型的训练成本非常高,在数据集的够造上,也非常消耗人力成本。

    OFA模型架构


    将视觉信息“嵌入”到语言模型中

    与基于 Encoder-Decoder 框架不同的是,直接将视觉信息“嵌入”到语言模型,既降低了模型的训练的成本(语言模型部分无需训练),又可以非常好地利用已有的预训练语言模型中的知识,是两全其美的方法。此外,其数据集构造也非常简单,最重要的是,这种方法可以无缝地将语言模型的特性迁移到多模态模型上,例如可以赋予多模态模型和 GPT-3 一样的 In-context 的 few-shot推理能力。基于这种“嵌入”思路,这里介绍两个重要的工作,值得注意的是,火烈鸟模型也是受到这两篇工作的启发而产生的。


    第一篇工作来自于微软,使用的是 VQA任务 来实验这种“嵌入”的思路。为了利用 GPT-3 强大的推理能力,作者将 VQA任务 构造成了一个文本问答任务,具体来说,作者将图像通过转换成文本,然后结合问题,一起喂入到 GPT-3 中。通过这一操作,相当于将图像信息“嵌入”到了语言模型中,从而可以利用 GPT-3 里面的知识,来实现复杂推理 [14]


      将视觉信息通过转换“嵌入”到GPT-3的流程


    从结果来看,对于 OK-VQA 这种需要外部知识才能回答的任务中,该方法在不需要微调的情况下就能达到惊人的 48%,而且还避免了传统的需要检索外部知识的复杂步骤,这也证明 GPT-3 确实包含了很多常识知识,而这种方法也很好的利用了这一特性。



    然而,这种直接将图像信息转换成文本信息的方法,在转换步骤就会损失一部分信息,即使这样确实取得了很好的效果。一个更好的方式是,直接使用 Adapter模块,将视觉信息通过可学习的方式,“嵌入”到语言模型中。而DeepMind之前的一篇工作就对这种方式进行了相关的探索。


    如下图所示,通过一个可以训练的Visual Encoder(本质上是一个Adapter),来将视觉信息 “嵌入” 到一个自回归语言模型中,在训练的过程中,只调整这个 Visual Encoder 的参数,这样,就可以充分地利用语言模型里面的知识来做推理 [15]


      通过 Adapter 将视觉信息 “嵌入” 到语言模型中


    值得一提的是,在该工作中,使用交叉图片和文本的形式进行训练,这样就赋予了模型和 GPT-3 一样的 In-context Few-shot 推理的能力。在测试阶段,只需要给与一些图文的例子,就可以实现 zero-shot推理,而这篇工作也是火烈鸟的前身。

    通过交叉图片和文本的输入来训练模型,赋予其Few-shot推理能力。


    火烈鸟模型详解


    在上文中,我们介绍了几个多模态领域有意思的发展趋势,而火烈鸟模型则是集这些趋势为一身而产生的,因此在这一部分,我们将会对火烈鸟模型进行详细的介绍,并以此将上述提到的趋势进行串联。


    简 介

    火烈鸟模型是 DeepMind 近期刚出的一个工作,其最大的特点是不需要微调,同时在大部分多模态任务上,都能实现和 GPT-3 一样的 In-context few-shot推理能力,因此,也可以将其看做是多模态领域的 GPT-3。同时,其效果也非常好,在16个任务中,在few-shot的评测上击败了其他所有模型,值得注意的是,在其中4项任务中,甚至打败了基于微调的模型。



    看火烈鸟的效果,其能够完成的任务包括:

    • 文本描述补全

    • VQA / Text-VQA

    • OCR

    • 数学计算

    • 文本描述(支持多语言)

    • 物体计数

    • 语言文本混合理解

    • 人物常识

    • ……


    同时,还支持 Zero-shot Visual Dialog 任务



    模型架构

    从整体架构来看,火鸟有几个组件:

    1. Visual Encoder 模块;

    2. Perceiver Resampler 模块;

    3. 通过门控注意力机制 GATED XATTN-DENSE 实现的 Adapter 模块;

    4. 语言模型 ChinChilla;


    模型整体运行流程如下图所示,首先通过Visual Encoder 来采集视觉信息,这里视觉信息包括 图像和视频,然后使用 Perceiver Resampler 将视觉信息进行汇总,形成统一输出。紧接着,通过 Adapter模块(GATED XATTN-DENSE)将视觉信息 “嵌入” 到语言模型中,这样,就可以利用语言模型的优势来做多模态任务了。在后面会对这些模块进行系统的介绍。



    Visual Encoder 模块

    Visual Encoder模块使用的是 NormalizerFree ResNet (NFNet) [17],这个模块使用和 CLIP 一样的训练方法进行训练。之后,在火烈鸟模型中,该模块的权重会被冻结,只起到一个视觉特征提取功能,注意,上文中提到,将 CLIP 的 Visual Encoder 用在其他任务中作为特征提取模块,效果非常好,相信同样采用 CLIP 训练方法训练的 NFNet 也能具有同样的效果。


    Perceiver Resampler模块

    这个模块的作用是将图片以及不同尺寸的视频,进行统一的表征建模,从而确保其具有统一维度的输出,这样最大的好处就是模型既可以支持图片和视频,也可以保证在训练的时候,可以进行批量训练。


    具体来说,Perceiver Resampler 模块使用的是Transformer Encoder 模块来学习视觉信息的表征,但这里与传统 Transformer Encoder 模块具有三个不同的地方:一、该模块设定了一个可学习的查询向量(Learned latent queries),通过这个可以学习的查询变量,来统一查询各种视觉信息。为了方便理解,其实也可以直接将其类比为 Bert 里面的 [CLS] token, 只不过这使用的是N个token;二、只有在计算注意力的时候,才会去查询视觉信息,在FFW模块中,只对查询向量进行操作;三、在每一层的注意力机制计算过程中,都只用最原始的视觉信息进行计算。通过这样的处理,最终,图片和视频信息都可以用一个统一的表征来代替了。



    语言模型与Adapter模块

    语言部分使用的是DeepMind之前提出的具有70B参数的自回归语言模型ChinChilla[18]。该模型和GPT系列一样,使用的是Transformer 的Decoder作为基础框架来训练的。同时在训练过程中,也借鉴了GPT系列的思路,可以实现非常强大的序列推理能力。


    Adapter模块基于Transfomer Encoder模块,同时加入了门控机制,这里作者将其称为:GATED XATTN-DENSE。公式上来看,注意力机制是通过通过语言的输入y 来查询视觉的输入信息x,同时加上了一个门控来控制多少视觉信息被输入进来,需要注意的是,如果这里的门控值为0,那么等于模型没有使用视觉信息。因此,这里的 Adapter模块的作用本质上是起到了一个动态整合的功能,来帮助判断是否需要或者整合多少视觉部分的信息。之后,整合后的信息会被一起喂到一个语言模型对应的模块中,通过语言模型来实现推理。


    在上文中提到,这样做的好处是,在不破坏预训练语言模型内部“知识”的情况下,可以无缝的将视觉信息“嵌入”进来,从而可以有效的利用语言模型强大的推理能力,帮助实现多模态推理。



    输入处理

    为了让此模型具有像 GPT-3 一样的 In-context 的 few-shot 推理能力,需要将输入改造成 图像/视频-文本-图像/视频-文本,这样的交叉结构,相当于把 图像/视频 也当成了语言序列的一部分。


    同时,为了控制模型在每个时间步只能看到该时间步之前的信息,这里还专门设置了一个改造版本的 Mask机制,其目的是控制那些语言序列可以看到那些图像信息。 如下图所示,<BOS><EOC> 中间的序列会被当做是一段完整的输入序列,而如果序列中有图像信息的输入时,会插入一个 <image> 的 token 来作为标记,这个时候,<image> 所处的序列区间的 mask 就会被设置成 None(深蓝色部分),经过这样处理之后,图像输入信息只会被其所处位置的序列看到,其他序列是看不到的,这样的好处是图像信息和文本信息的关系在整个序列输入中就变得非常清晰了。


    值得注意的是,训练过程中,最多使用5张图片来够造交叉输入序列,但是评估的时候,作者发现该模型能够泛化到 32个shots 上,这也说明了自回归语言模型的强大序列推理能力。



    最后对火烈鸟模型做一个总结:

    1. 将视觉 “嵌入” 到语言模型中,这样就可以利用语言模型的知识来进行推理。

    2. 通过 Pereciver Resampler模块,为图片和不同时长的视频提供了一个统一的表征维度。

    3. 使用Adapter,在训练时,只调整Adapter,保证在不破坏语言模型所存储的知识的同时,利用语言模型进行推理,同时,由于无需调整语言模型参数,该方法非常节省计算资源。

    4. 通过交叉输入图片(视频)和文本的方式,训练模型,使其具有 few-shot 的多模态序列推理能力。


    总 结


    在本文中,对DeepMind新出的火烈鸟模型做了详细的介绍,同时以此为核心,介绍了多模态领域几个近期发展趋势,具体如下:

    1. 在多模态领域,大模型也逐渐开始统一天下,这一趋势也将会一直延续。同时,大模型会逐渐变成“基础模型”,称为下游任务核心支撑。

    2. Prompt & Adapter 也在多模态领域开始流行,代表了当前大模型应用的思路,从传统 预训练 → 微调(模型适应下游任务),转变到 预训练 → Prompt & Adapter(下游任务适应模型)。同时,由于未来模型参数会越来越多,传统的微调早已超出小团队承受范围,在这种趋势下,Prompt & Adapter 必将成为未来主流微调范式。

    3. 通过将视觉信息“嵌入”到大规模预训练语言模型中,借用语言模型强大的序列推理能力来实现在在多模态任务上的推理能力,则是多模态领域的另外一个大趋势,这就像是站在巨人的肩膀上来做事,既节省了巨大训练成本,又利用了语言模型强大的推理特性。


    此外,由于多模态领域包含任务繁多,本文只对视觉-语言方向做了简要介绍,在其他方向,也有非常多有意思的趋势, 例如Google近期提出了 统一多模态、多任务、多路径、多专家 的多模态大模型Pathway 的思想,Deepmind提出了将一切任务都建模成序列任务的Gato等。这些模型的出现不仅仅是参数越来越多,模型越来越大,而是尝试进行“范式迁移”,相信在未来,多模态领域会出现越来越有意思的范式。


    参考文献

    [1] Han X, Zhang Z, Ding N, et al. Pre-trained models: Past, present and future[J]. AI Open, 2021, 2: 225-250.

    [2] Kim W, Son B, Kim I. Vilt: Vision-and-language transformer without convolution or region supervision[C]//International Conference on Machine Learning. PMLR, 2021: 5583-5594.

    [3] Radford A, Kim J W, Hallacy C, et al. Learning transferable visual models from natural language supervision[C]//International Conference on Machine Learning. PMLR, 2021: 8748-8763.

    [4] Shen S, Li L H, Tan H, et al. How Much Can CLIP Benefit Vision-and-Language Tasks?[J]. arXiv preprint arXiv:2107.06383, 2021.

    [5] Bommasani R, Hudson D A, Adeli E, et al. On the opportunities and risks of foundation models[J]. arXiv preprint arXiv:2108.07258, 2021.

    [6] Liu P, Yuan W, Fu J, et al. Pre-train, prompt, and predict: A systematic survey of prompting methods in natural language processing[J]. arXiv preprint arXiv:2107.13586, 2021.

    [7] Kojima T, Gu S S, Reid M, et al. Large Language Models are Zero-Shot Reasoners[J]. arXiv preprint arXiv:2205.11916, 2022.

    [8] Houlsby N, Giurgiu A, Jastrzebski S, et al. Parameter-efficient transfer learning for NLP[C]//International Conference on Machine Learning. PMLR, 2019: 2790-2799.

    [9] Pfeiffer J, Rücklé A, Poth C, et al. Adapterhub: A framework for adapting transformers[J]. arXiv preprint arXiv:2007.07779, 2020.

    [10] Zhou K, Yang J, Loy C C, et al. Learning to prompt for vision-language models[J]. arXiv preprint arXiv:2109.01134, 2021.

    [11] Gao P, Geng S, Zhang R, et al. Clip-adapter: Better vision-language models with feature adapters[J]. arXiv preprint arXiv:2110.04544, 2021.

    [12] Su Y, Lan T, Liu Y, et al. Language Models Can See: Plugging Visual Controls in Text Generation[J]. arXiv preprint arXiv:2205.02655, 2022.

    [13] Wang P, Yang A, Men R, et al. Unifying architectures, tasks, and modalities through a simple sequence-to-sequence learning framework[J]. arXiv preprint arXiv:2202.03052, 2022.

    [14] Yang Z, Gan Z, Wang J, et al. An empirical study of gpt-3 for few-shot knowledge-based vqa[J]. arXiv preprint arXiv:2109.05014, 2021.

    [15] Tsimpoukelli M, Menick J L, Cabi S, et al. Multimodal few-shot learning with frozen language models[J]. Advances in Neural Information Processing Systems, 2021, 34: 200-212.

    [16] Alayrac J B, Donahue J, Luc P, et al. Flamingo: a visual language model for few-shot learning[J]. arXiv preprint arXiv:2204.14198, 2022.

    [17] Andrew Brock, Soham De, Samuel L. Smith, and Karen Simonyan. High-performance largescale image recognition without normalization. arXiv:2102.06171, 2021.

    [18] Jordan Hoffmann, Sebastian Borgeaud, Arthur Mensch, Elena Buchatskaya, Trevor Cai, Eliza Rutherford, Diego de Las Casas, Lisa Anne Hendricks, Johannes Welbl, Aidan Clark, Eric Noland Tom Hennigan, Katie Millican, George van den Driessche, Bogdan Damoc, Aurelia Guy, Simon Osindero, Karen Simonyan, Erich Elsen, Jack W. Rae, Oriol Vinyals, and Laurent Sifre. Training compute-optimal large language models. arXiv:2203.15556, 2022.


    作者:胡鹏博

    排版:朱思嘉

    审校:十三维


    Mindverse Research

    心识研究院



    心识宇宙研究院,致力于在即将到来的元宇宙数字时代,研究和创造真正等价于人类意识水平的数字生命,目前已经综合多种研究进路和方法规划出一条通向AGI和人工意识的道路。在后续内容运营上,我们也会介绍和创造更多有关人工智能、意识科学、元宇宙方面最新的研究成果和原创内容。


    欢迎有志者关注和加入我们的研究!

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存