IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 【论文阅读翻译】A STRUCTURED SELF - ATTENTIVE SENTENCE EMBEDDING -> 正文阅读

[人工智能]【论文阅读翻译】A STRUCTURED SELF - ATTENTIVE SENTENCE EMBEDDING

Abstruct

  • 这篇论文通过介绍self-attention提出了一个提取可解释句子的嵌入模型。除了使用vector,该论文使用一个2-D矩阵表达该嵌入,矩阵的每一行代表句子的不同部分。
  • 该论文也提出了一个self-attention机制和一个特殊的正则项
  • 作为一个副作用,嵌入提供了一种简单的方法来可视化句子的哪些特定部分被编码到嵌入中
  • 改论文在3个不同的任务评估了提出的模型:
    • author profiling 作者简介
    • sentiment classification 情感分类
    • textual entailment 文本蕴含

1. Introducion

  • 在学习有意义的单个单词的语义分布式表示方面已经取得了很大进展,也就是大家熟知的word embeddings。

  • 在另一方面,在获得段落或者句子方面的满意表达还有很多工作要做。

  • 现有的方法一般有两个策略

    • 第一种是通过无监督学习训练得到一般性句子嵌入,包括SkipThought向量,ParagraphVector,recursive auto-encode,SequentialDenoisingAutoencoders,FashSent等等
    • 另一种是由特定任务训练的特定模型。他们通常与下流的应用结合并且由有监督学习的方式训练得到。人们普遍发现经过专门训练的句子嵌入比通用的表现更好,尽管通用的可以在半监督环境中使用,利用大型未标记语料库。跟随这条线一些模型被提出,recursive networks、convolutional networks作为创建句子表示以解决包括分类和排名在内的各种任务的中间步骤。在之前的方法中的一个普遍方法是通过使用RNN最后的隐藏状态或者RNN的最大池化状态或者convolved n-grams。在利用语言结构(例如解析树和依赖树)来改进句子表示方面也有学者进行了其他工作。
  • 对于一些任务,有学者提出在CNN或者LSTM模型上部使用attention机制去引入外部信息源来指导句子embedding的提取。然而,会与一些其他任务,例如情感分类,这不是好的因为情感分析没有额外信息:这个模型仅仅被给出一个单独的句子作为输入。在这种情况下,最普遍的方法是在所有的时间步长中添加一个最大池化或者平均池化步骤,或者只是在最后一个时间步骤中提取隐藏表示作为编码嵌入。

  • 许多上述方法中的一种常见方法包括通过使用 RNN 的最终隐藏状态或来自 RNN 隐藏状态或卷积 n-gram 的最大(或平均)池化来创建一个简单的向量表示。该论文假设在循环模型的所有时间步骤中携带语义相对困难且没有必要。该论文为以上序列模型提出一个self-attention机制来代替max pooling或者averaging step

  • 不同于之前的方法

    • self-attention机制允许将句子的不同方面提取到多个向量表示中
  • 在本论文的模型中,self-attention位于LSTM的顶部。这使得注意力机制被应用于没有额外输入的情况。另外,由于它可以直接访问先前时间步骤中的隐藏表示,因此减轻了 LSTM 的一些长期记忆负担。作为该self-attentive sentence embedding模型的附带产物,解释提取出的embedding变得非常容易和明显

  • 文章构造

    • Section 2 详细说明了该论文提出的self-attentive sentence embedding model
    • Section 2.2 说明了为该模型提出的正则项
    • Section 2.3 提供了可视化sentence embedding 的方法
    • Section 4 在作者介绍、情感分类和文本蕴含任务评估了该模型

2. Approach

2.1 Model
  • 该句子嵌入模型由两部分组成
    • 第一部分是一个双向LSTM
    • 第二部分是self-attention机制,为LSTM的隐藏状态提供了一系列求和权重向量,这些求和权重向量被LSTM隐藏状态点乘,所得加权 LSTM 隐藏状态被视为句子的嵌入。它可以组合,例如,它可以与应用于下游应用程序的多层感知器结合使用
  • 图1 展示了一个例子,该模型与一个全连接层和一个softmax层组合,被应用于情感分析。

在这里插入图片描述

  • 除了使用全连接层,该论文还提出了一种利用矩阵句子嵌入的二维结构来修剪权重连接的方法,详见附录 A

  • 算法

    • 假设有一个句子,其中有n个tokens,使用word embeddings表示如下在这里插入图片描述
      其中 w i w_i wi?是一个vector,代表第i-th个词的d维词嵌入。因此,S 是一个表示为二维矩阵的序列,它将所有词嵌入连接在一起。S的形状应该是 n × d n\times d n×d
    • 现在在序列S中的每一个entry是相互独立的。该论文使用一个双向LSTM处理句子,来获得一个单独句子中邻接词的一些依赖,在这里插入图片描述
      之后该论文拼接 h t → \overrightarrow {h_t} ht? ? h t ← \overleftarrow {h_t} ht? ?来获得隐藏层状态 h t h_t ht?。对于每个单向LSTM,它的隐藏单元数是u。为了简化表示,标记n个 h t h_t ht?作为H,H的形状是 n × 2 u n\times 2u n×2u在这里插入图片描述
    • 模型的目的是将可变长度的句子encode为固定大小的embedding。通过在H中选择一个n LSTM隐藏向量的线性组合在实现这个目的,计算这个线性组合需要使用self-attention机制。
    • 该注意力机制将整个LSTM的隐藏状态H作为输入输出一个向量权重a在这里插入图片描述
      这里 W s 1 W_{s1} Ws1?是一个形状为 d a × 2 u d_a\times 2u da?×2u的权重矩阵, w s 2 w_{s2} ws2?是一个形状为 1 × d a 1\times d_a 1×da?的向量参数。** d a d_a da?**是可以任意设置的超参数。因此,注释向量a的大小为 1 × n 1\times n 1×nSoftmax()确保了所有被计算的权重落入(0,1)
    • 最后通过a提供的权重来求和LSTM隐藏状态H,得到一个输入句子的向量表示 m ? R 1 × 2 u m\epsilon R^{1\times 2u} m?R1×2u
  • 这种向量表示通常侧重于句子的特定组成部分,例如一组特殊的相关单词或短语。 因此,它应该反映句子中语义的一个方面或组成部分。 然而,一个句子中可以有多个成分共同构成整个句子的整体语义,尤其是长句。 因此,为了表示句子的整体语义,需要多个 m 专注于句子的不同部分因此,需要执行multiple hops of attention

    • 需求:想要从句子中提取r个不同的部分
    • 实现:扩展 w s 2 ? R 1 × d a w_{s2}\epsilon R^{1\times d_a} ws2??R1×da? W s 2 ? R r × d a W_{s2}\epsilon R^{r\times d_a} Ws2??Rr×da?,因此,标记向量 a 的变为了一个矩阵 A ? R r × n , H ? R n × 2 u A\epsilon R^{r\times n},H\epsilon R^{n\times 2u} A?Rr×n,H?Rn×2u:在这里插入图片描述
    • 注意这里的softmax()沿着矩阵的第二维度(也就是对每一行计算softmax)
    • 可以把公式6视为一个没有偏置的MLP,隐藏单元数量是 d a d_a da?,参数是 { W s 2 , W s 1 } \{W_{s2},W_{s1}\} {Ws2?,Ws1?}
    • 最终,经过变动,之前的嵌入向量 m ? R 1 × 2 u m\epsilon R^{1\times 2u} m?R1×2u变为了 M ? R r × 2 u M\epsilon R^{r\times 2u} M?Rr×2u。我们通过将注释矩阵 A 和 LSTM 隐藏状态 H 相乘来计算 r 个加权和,结果矩阵是句子嵌入:在这里插入图片描述
2.2 Penalization Term
  • 如果注意力机制总是为所有 r 跳提供相似的求和权重,则嵌入矩阵 M 可能会遇到冗余问题。因此需要一个惩罚项在贯穿注意力hops中去鼓励求和权重向量的多样性

  • 评估多样性的最佳方法绝对是任意两个求和权重向量之间的 Kullback Leibler 散度,然而在该模型中不是很稳定。

    • 不稳定的原因:推测这是因为论文正在最大化一组 KL 散度(而不是仅最小化一个,这是通常的情况),模型在优化注释矩阵 A 以在不同的 softmax 输出单元上有很多足够小甚至为零的值 ,而这些大量的零使训练不稳定

    KL 没有提供我们想要的另一个功能,即我们希望每一行都专注于语义的一个方面,因此我们希望注释 softmax 输出中的概率质量更加集中。 但是对于 KL 处罚,不能支持这样做。

  • 因此论文介绍了一个新的惩罚项,它克服了之前提到的缺点。与KL散度惩罚相比,这个惩罚项只消耗 1 3 \frac{1}{3} 31?的计算量。

    • 算法:A与A的转置点乘,并减去一个单位矩阵,用于评测冗余在这里插入图片描述
    • ∣ ∣ ? ∣ ∣ F ||·||_F ?F?代表一个矩阵的Frobenius norm。与添加一个L2正则项相似,惩罚项P将与一个系数相乘,模型将把惩罚项与最初的loss一同最小化,这依赖于下流的应用。
  • 来考虑求和权重矩阵A中的两个不同求和向量 a i a^i ai a j a^j aj。因为softmax,所以在矩阵A中的所有求和向量的元素和是1(也就是说每一行加起来是1,因为之前说过是在第二维度上softmax)。因此,它们可以被视为离散概率分布中的概率质量。对于 A A T AA^T AAT矩阵中的任何非对角线元素,它对应于两个分布的元素乘积的总和。
    在这里插入图片描述
    公式中的 a k i a_k^i aki? a k j a_k^j akj?分别是 a i 和 a j a^i和a^j aiaj向量的第k个元素。

    • 在最极端的情况下,两个概率分布 a i 和 a j a^i和a^j aiaj之间没有重叠, a i , j = 0 a_{i,j}=0 ai,j?=0,否则为正值。
    • 在另一种极端的情况下,如果两个分布相同并且都集中在同一个单词上(这时候对角线元素就是1,举个列子,某一条向量为[0,0,1,0]集中于一个单词,那么 a 3 , 3 = 1 a_{3,3}=1 a3,3?=1),则体现为最大值1。
  • A A T AA^T AAT中减去一个单位矩阵,从而迫使 A A T AA^T AAT对角线上的元素逼近1,这鼓励每个求和向量 a i a^i ai关注尽可能少的单词,迫使每个向量关注单个方面 ,以及所有其他元素为 0,这会惩罚不同求和向量之间的冗余。

    • **如何迫使对角线上的元素逼近1?**训练的时候会最小化该正则项,又因为外面还套了个平方,所以对角线为0的时候惩罚项最小,此时 a i , j = 1 a_{i,j}=1 ai,j?=1,通过神经网络的一系列自动调参达到此目的
2.3 Visualization
  • 由于标记矩阵A的存在,句子嵌入的可解释性是非常直接的。在句子嵌入矩阵M中每一行,有其对应的标记向量 a i a^i ai。此向量中的每个元素对应于该位置上token的 LSTM 隐藏状态的贡献程度。因此可以为嵌入矩阵M的每一行画出一个heat map这种可视化方式暗示了嵌入的每个部分中编码的内容,增加了额外的解释层。如图3a和3b

  • 第二种可视化方法是求和所有的标记向量,然后把结果归一化至和为1。因为它求和了一个句子的所有方面(所有token),所以生成一个嵌入最关注的一般性视图。可以找出embedding更多考虑了哪些单词,跳过了哪些单词

  • 在这里插入图片描述

3. Related Work

  • Section 1 提到了多种有监督和无监督模型。与这些方法不同,该论文提出的方法使用了一种新的自注意力机制,可以将句子的不同方面提取到多个向量表示中。矩阵结构与惩罚项一起使模型具有**更大的能力从输入句子中解开潜在信息。**该论文也不使用语言结构来指导句子表示模型。另外,使用该方法可以容易地创建可视化图帮助解释学习到的表达(因为self-attention的副产品具有很好的模型解释性)

  • 最近的一些工作也提出了使用intra/self-sentence attention的有监督方法。

    • **Ling et al **提出了基于word embedding 的注意力机制模型,该模型在上下文窗口中为每个单词的每个可能位置计算了一个attention权重。然而这种方法不能扩展至句子水平的嵌入(只能词嵌入),因为无法详尽的枚举所有可能的句子。
    • **Liu et al **提出一个sentence level的注意力机制,它有相似的动机,却又有不同。他们利用 LSTM 状态上的平均值池化层作为注意力源,并使用它来重新加权句子的池化向量表示。
  • 除了以上提到的两种变体,该作者注意到 Li et al 等人。 在他们的 factoid QA 模型中为问题编码提出了一个相同的自我注意机制,它与该论文的工作是并行的。不同之处在于

    • 他们的编码仅仅表示为一个向量,该论文的注意力机制生成了一个矩阵表示并且有一个特殊的惩罚项设计。
    • 该论文应用模型在句子分析和蕴含,他们的模型用于事实性问答
  • LSTMN模型也提出了一个非常成功的句子内部水平的注意力机制。本文作者认为该模型的注意力和他们的注意力具有不同的粒度。

    • LSTMN 在循环迭代期间为其每个隐藏状态生成一个注意力向量,这是一种“在线更新”注意力,它更细粒度,旨在发现某个单词与其前一个单词之间的词汇相关性。
    • 相反,该论文的注意力机制仅仅执行一次,直接关注对区分目标有意义的语义。更少的关注单词之间的关系,而是更多的关注每个单词对整个句子语义的贡献。在计算上,该论文的方法还可以更好地扩展句子长度,因为它不需要 LSTM 像LSTMN一样,每次计算其下一步时都计算其先前所有单词的注释向量。

4. Experimental Results

本论文首先将句子嵌入模型应用至三个不同的数据集:Age,Yelp,Stanford Natural Language Inference Corpus。这三个数据集分别对应三个不同的任务,作者简介、情感分析,文本蕴含。然后,该论文还进行了一组探索性实验,以验证该模型的句子嵌入模型各个方面的属性。

4.1 Author Profiling
  • 该Author Profiling数据集由包含英语、西班牙语和荷兰语的 Twitter 推文组成。对于某些推文,它还提供了撰写推文时用户的年龄和性别。

    • 年纪的范围在被划分为5个区间[18-24],[25-34],[35-49],[40-64],[64+]

    该论文使用英文tweets作为输入,使用这些推文来预测用户的年纪范围。由于论文正在预测用户的年龄,因此在论文的其余部分将其称为年龄数据集。

  • 随机的选择68485条推文作为训练集,4000条作为验证集,4000条作为测试集。性能也被选择为分类精度

  • 将此论文模型与两个baseline模型进行比较:biLSTM和CNN

    • biLSTM模型使用一个双向LSTM,在每个方向有300维度,使用最大池化贯穿LSTM隐藏状态来得到句子嵌入向量,之后使用一个2-layer ReLU的有3000隐藏状态的MLP输出分类结果
    • CNN模型使用相同的方案,但是用一个一层的1-D卷积网络代替biLSTM。
  • 训练过程中

    • 0.5 dropout在MLP0.0001 L2正则化
    • 随机梯度下降作为优化器,学习率=0.06,batch_size=16
    • 对于 biLSTM,将梯度范数剪裁在 -0.5 和 0.5 之间。 作者在广泛的范围内搜索了超参数,发现上述超参数集产生了最高的准确度。
  • 对于本文提出的模型,使用与biLSTM相同的设置,也使用一个2-layer ReLU的MLP输出分类结果,但是隐藏状态是2000。**此外,此论文的 self-attention MLP 有一个 350 个单元的隐藏层(Section 2 的 d a d_a da?),模型矩阵嵌入有 30 行(r),惩罚项的系数为 1。 **

4.2 Sentiment Analysis
  • 选择Yelp数据集来做情感分析任务。由2.7M条yelp评论组成,模型将评论作为输入,并预测撰写评论的用户分配给相应商家的星数
  • 随机选择500K条[评论-星级]对作为训练集,2000条作为验证集,2000条作为测试集。
  • 使用Stanford tokenizer来序列化评论文本,使用100维度的word2vec作为初始化词嵌入,并且在整个实验过程中调整嵌入。
  • 评分级别为[1,5],将此任务视为分类任务,分为5类。使用分类精确度作为评判指标
  • 对于两个baseline模型,设置与Author Profiling时相同,只需要把batch size改为32。
  • 对于本论文的模型,也使用相同的模型设置,除了MLP的隐藏单元数量改为3000
  • 实验可视化结果
    • 随机从测试集中选择5个1 star样本和5个5 stars样本,样本的置信度要在0.8以上
    • 图2所示,模型可以指出句子中带有强烈情感的关键词
    • 对于大多数简短评论,该模型设法捕获了导致极端分数的所有关键因素,但对于较长的评论,该模型仍然无法捕获所有相关因素???????????。
4.3 Textual Entailment
  • 使用最大的数据集在文本蕴含,SNLI corpus(语料库)用于该任务。
  • SNLI 是 57 万个人工书写的英语句子对的集合,手动标记以进行平衡分类,标签包含蕴涵、矛盾和中性。该模型将给出一对句子,分别称为假设和前提,并要求判断这两个句子中的语义是否相互矛盾,这也是一个分类任务,所以用精确性来进行评价。
  • 该论文独立处理假设和前提,然后通过使用Memisevic (2013) 中提出的乘法交互来提取两个句子嵌入之间的关系(详见附录 B),并使用具有 4000 个隐藏单元的 2 层 ReLU 输出 MLP 将隐藏表示映射到分类结果中 。biLSTM 和注意力 MLP 的参数在假设和前提之间共享。biLSTM 在每个方向上都是 300 维,注意力 MLP 有 150 个隐藏单元,假设和前提的句子嵌入都有 30 行(r)。惩罚项系数=0.3。使用300维的GloVe word embedding初始化word embeddings。使用AdaGrad作为优化器,学习率=0.01。不使用任何正则方法。在4个Epochs后就获得了收敛,速度很快。
  • 这个任务与前两个任务有一点不同,该任务有两个句子作为输入。有很多方法可以添加句间级别的注意力,而这些注意力带来了很多好处。为了使比较集中和公平,我们只比较属于基于句子编码的模型的方法。 也就是假设和前提在被编码成某种分布式编码之前没有信息交换
4.4 Exploratory Experiments

在本小节中,将进行一组探索性实验来研究模型中每个组件的相对影响

4.4.1 Effect of Penalization Term
  • 因为介绍正则项的目的主要是阻止嵌入的冗余,首先直接可视化模型的每一行句子表示。

  • 使用Section 4.1 设计的模型分别在有惩罚项和无惩罚项的条件下在Age数据集进行训练。随机的从测试集中选出一条推文,通过画出在注意力的每一hop的heat map来比较模型。因为有30个hop,全部画出来比较冗余,只画出其中的六个,这六个hops已经反映了30个hops的情况。

  • 从图中可以看出没有惩罚项的模型在不同的注意力hops之间有很大的冗余(图 3a),表现在很多集中在单词“it”(图 3c),这对于作者的年纪来说是不相干的。在右侧,模型展示了在不同hops中的更多变化,表现在整个embedding集中在"mail-replies spam"(图 3d)。在这里插入图片描述

  • 对于Yelp数据集,也观察到了相似的现象。为了让实验更具有扩展性,不再对一个单独的句子画出heat map,而是对更多的样本画出heat map。图 4展示了在三个不同评论的整体句子嵌入集中。观察到有惩罚项的更集中在评论的重要部分。作者认为这是因为在对角线矩阵 A A T AA^T AAT鼓励其被集中。

  • 为了验证这些差异是否会导致性能差异,我们评估了在 Yelp 和 Age 数据集上训练的四个模型,无论有没有惩罚项。 结果如表 3 所示。与预期一致,使用惩罚项训练的模型优于未训练的模型。 在这里插入图片描述

  • 在SNLI数据集中,虽然我们观察到引入惩罚项仍然有助于鼓励矩阵句子嵌入中不同行的多样性,并迫使网络更加关注句子,但这个惩罚项的量化效果在 SNLI 数据集上并不那么明显。 两种模型产生相似的测试集精度。

4.4.2 Effect of Multiple Vectors
  • 句子嵌入中的多行有望提供有关编码内容的更丰富的信息。因此评估由r带来的提升是很有意义的。以用于 Age 和 SNLI 数据集的模型为例,将每个任务的r 从 1 变化到 30,并独立训练生成的 10 个模型(图 5)。 注意当 r = 1 时,句子嵌入简化为标准向量形式(不是矩阵了)。在这里插入图片描述

从这个图中我们可以发现,在没有多行的情况下,该模型的性能与使用其他形式的向量句子嵌入的竞争对手相当。但是在仅仅使用一行向量完成句子嵌入和多行向量完成句子嵌入之间有很大的差别。这些模型对于r也是相当不变的,因为在这两个图中,10到30之间的大范围值都产生了可比较的曲线。

5. Conclusion And Discussion

  • 该论文中,引入了具有自注意力机制固定大小矩阵句子嵌入。由于这种注意力机制,可以深入解释我们模型中的句子嵌入。 3 个不同任务的实验结果表明,该模型明显优于其他句子嵌入模型。

  • 引入注意力机制允许最后的句子嵌入直接地通过注意力求和来访问之前的LSTM隐藏状态。因此,LSTM 不需要将每条信息都带到最后的隐藏状态。取而代之的是,每个 LSTM 隐藏状态只期望提供围绕每个单词的短期上下文信息,而需要长期依赖的高级语义可以由注意力机制直接获取。此设置减轻了 LSTM 进行长期依赖的负担。实验也支持了这个观点,模型在文本内容较长时有更好的优点??????????(前后矛盾??????)。此外,在注意力机制中汇总元素的概念非常原始,它可以比这更复杂,这将允许对 LSTM 的隐藏状态进行更多操作。

  • 这个模型能够编码任何可变长度的序列为固定大小的表达,不用经历长期依赖问题。这给模型带来了很多可扩展性:

    • 无需任何修改,它可以直接应用于较长的内容,如段落、文章等。

    虽然这超出了本文的重点,但作为未来的工作,它仍然是一个值得探索的有趣方向

  • 作为我们提出的模型的一个缺点,当前的训练方法严重依赖下游应用程序,因此我们无法以无监督的方式训练它。在这个模型中实现无监督学习的主要障碍是在解码过程中,我们不知道嵌入中的不同行应该如何划分和重组。使用神经网络探索所有这些可能的划分很容易导致过度拟合。 尽管我们仍然可以通过在句子嵌入之上使用顺序解码器对所提出的模型进行无监督学习,但找到一些其他结构作为解码器更有价值。

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-08-26 12:06:37  更:2021-08-26 12:09:04 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 18:50:10-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码