【导言】这篇综述是复旦大学的邱锡鹏教授对近两年的预训练语言模型(PTM)做的综述,全文有25页,文章很全面,边读边译。文章太长了,一次性读太多有点消化不了,慢慢更新吧。

原文链接:Pre-trained Models for Natural language Processing: A Survey

Pre-trained Models for Natural language Processing: A Survey

摘要:最近,预训练模型(PTM)的出现将自然语言处理(NLP)带入了一个新的领域。在这篇综述中,我们为自然语言预训练模型提供了一个全面概述。我们首先简短介绍一下语言表示学习与其研究历程。然后我们基于四种观点对现有的PTM进行了系统的分类。接下来,我们描述了如何将PTM应用到下游任务。最后,我们概述了PTM的未来的一些潜在发展方向。这篇综述旨在为理解、使用和开发各种适用于NLP任务的PTM提供实践指南。

关键字:深度学习,神经网络,自然语言处理,预训练模型,分布式表示,词嵌入,自监督学习,语言建模

1 介绍

随着深度学习的发展,各种神经网络已广泛用于解决自然语言处理(NLP)任务,例如卷积神经网络(CNN),递归神经网络(RNN) ,图论神经网络(GNN)和注意力机制。这些神经模型的优点之一是它们减轻特征工程问题的能力。非神经NLP方法通常很大程度上依赖于离散的手工特征,而神经方法通常使用低维和密集向量(又称为分布式表示)来隐式表示语言的语法语义特征。 这些表示是在特定的NLP任务中学习的。 因此,神经方法使人们易于开发各种NLP系统。

尽管用于NLP任务的神经模型取得了成功,但与“计算机视觉”(CV)领域相比,性能改进的重要性可能较低。 主要原因是大多有数与监督的NLP任务的当前数据集非常小(机器翻译除外)。 深度神经网络通常具有大量参数,这会使它们过度拟合这些小的训练数据,并且不能很好地推广实践。 因此,许多NLP任务的早期神经模型相对较浅,通常仅包含1-3个神经层。

最近,大量的工作表明,大型语料库上的预训练模型(PTM)可以学习通用语言表示,这对于下游NLP任务很有帮助,并且可以避免从头开始训练新模型。 随着计算能力的发展,深层模型(即Transformer )的出现以及训练手段的不断增强,PTM的体系结构已从浅层发展到深层。第一代PTM可以学习良好的词嵌入。 由于下游任务不再需要这些模型本身,因此对于计算效率而言,它们通常很浅,例如Skip-Gram和GloVe。 尽管这些预先训练的嵌入可以捕获单词的语义,但它们没有上下文,也无法捕获上下文中的高级概念,例如多义歧义消除,句法结构,语义角色,指代。第二代PTM专注于学习上下文词嵌入,例如CoVe,ELMo,OpenAI GPT和BERT。下游任务仍然需要这些学习过的编码器来表示上下文中的单词。 此外,还提出了各种预训练任务来学习PTM,以达到不同的目的。

本篇综述的贡献如下:

1.全面概述。我们为自然语言PTM提供了一个全面概述,包括背景知识、模型架构、预训练任务、各种扩展、适应方法和应用。

2.新分类。我们提出了用于NLP的PTM分类法,该分类法从四个不同的角度对现有PTM进行了分类:1)表示类型;2)模型架构; 3)预训练任务的类型; 4)特定类型场景的扩展。

3.丰富的资源。我们在PTM上收集了丰富的资源,包括PTM的开源实现,可视化工具,语料库和论文清单。

4.未来方向。我们讨论并分析现有PTM的局限性。 另外,我们建议可能的未来研究方向。

其余的章节安排如下。 第2节概述了PTM的背景概念和常用符号。 第3节简要概述了PTM,并阐明了PTM的分类。 第4节提供了PTM的扩展。 第5节讨论如何将PTM的知识转移到下游任务。 第6节提供了PTM的相关资源。 第7节介绍了各种NLP任务中的应用集合。 第8节讨论了当前的挑战并提出了未来的方向。 第9节总结了论文。

2 背景

2.1 语言表示学习

一个好的表示应该表达不是特定任务的通用先验,而是可能对于学习机解决AI任务很有用。在语言方面,良好的表示应能捕捉文本数据中隐含的语言规则和常识知识,例如词汇含义,句法结构,语义角色,甚至语用学。

分布式表示的核心思想是通过低维实值矢量来描述一段文本的含义。并且向量的每个维度都没有相应的意义,而整体则代表一个具体的概念。图1说明了NLP的通用神经体系结构。 词嵌入有两种:非上下文嵌入和上下文嵌入。它们之间的区别在于,单词的嵌入是否会根据其出现的上下文动态变化。

非上下文嵌入   表示语言的第一步是将离散的语言符号映射到分布式嵌入空间中。形式上,对于每一个词汇表中的单词(或子词)x,我们使用一个查找表将它映射到向量,其中是一个超参数,它表示token嵌入的维数。这些嵌入与其他模型参数一起在任务数据上进行训练。

对于这种类型的嵌入有两个主要的限制。第一个问题是嵌入是静态的。单词的嵌入与上下文无关,始终是相同的。因此,这些非上下文嵌入无法建模多义词。第二个问题是词汇量不足问题。为了解决此问题,字符级单词表示或子单词表示在许多NLP任务中得到了广泛使用,例如CharCNN,FastText和字节对编码(BPE)。

上下文嵌入   为解决单词的多义和上下文依赖性的问题,我们需要区分不同上下文中单词的语义。给定一个文本x_{1},x_{2},...,x_{T},其中每个tokenx_{t}\in V是一个单词或子单词,x{_t}的上下文表示依赖整个文本。

[\mathbf{h}_{1},\mathbf{h}_{2},...,\mathbf{h}_{T}]=f_{enc}(x_{1},x_{2},...,x_{T})                    (1)

其中f_{enc}(\cdot )是神经编码器,2.2节会对其进行描述,\mathbf{h}_{t}被称作x{_1}上下文嵌入动态嵌入,因为其中包含了上下文信息。

2.2 神经上下文编码器

大多数神经上下文编码器可以被分为三类:卷积模型,序列模型,图论模型。图2展示了三个模型的结构。

(1)卷积模型。卷积模型利用词在输入句中的词嵌入,通过卷积运算将相邻词的局部信息聚合起来,从而获取词的意义。卷积模型通常易于训练,并且可以捕获本地上下文信息。

(2)序列模型。序列模型通常按顺序捕获单词的上下文表示,例如LSTM和GRU。实际上,双向LSTM和GRU用于从单词的两侧收集信息,但是其性能通常受长期依赖问题的影响。

(3)图论模型。与上述模型不同,图论模型将单词作为节点,并使用单词之间的预定义的语言结构学习上下文表示,例如语法结构或语义关系。

尽管语言意识的图结构可以提供有用的归纳偏差,但是如何构建良好的图结构也是一个具有挑战性的问题。 此外,该结构在很大程度上依赖于专家知识或外部NLP工具,如依赖解析器。

实际上,一个更直接的方法是使用一个全连接图对每两个单词的关系进行建模,然后让模型自己学习结构。通常,连接权重是用自注意力机制来动态计算的,它可以隐含表示词之间的关系。

Transformer是这种想法的成功实现,它采用了完全连接的自我关注架构以及其他有用的设计,例如位置嵌入(position embeddings),层归一化和残差连接。

分析   卷积模型和顺序模型都学习具有局部偏差的单词的上下文表示,并且很难捕获单词之间的远程交互。 相反,Transformer可以直接对序列中每两个单词之间的依赖关系进行建模,这更强大并且更适合于对语言进行建模。然而,由于其结构笨重、模型偏差较小,Transformer通常需要较大的训练语料库,而在小或中等规模的数据集上容易过拟合。

2.3  为什么选择预训练?

随着深度学习的发展,模型参数的数量也在快速增长。需要更大的数据集来完全训练模型参数并防止过度拟合。 但是,由于注释成本极高,对于大多数NLP任务而言,构建大规模的标记数据集是一项巨大的挑战,特别是对于语法和语义相关任务。

相反,相反,大规模的未标记语料库相对容易构建。 为了利用巨大的未标记文本数据,我们可以首先从它们中学习良好的表示形式,然后将这些表示形式用于其他任务。 最近的研究表明,借助于从大型无注释语料库中的PTM中提取的表示形式,在许多NLP任务上都有显着的性能提升。

预训练的优点可被总结如下:

1.对庞大的文本语料库进行预训练可以学习通用语言表示形式,并帮助完成下游任务。

2.预训练提供了更好的模型初始化,通常可以带来更好的泛化性能,并加快目标任务的收敛速度。

3.可以将预训练视为一种正则化,以避免对小数据过度拟合。

2.4 NLP的PTM简史

预训练一直是学习深度神经网络参数的有效策略,然后对这些参数进行微调。 早在2006年,深度学习的突破到来,一同出现的是贪婪的分层无监督预训练然后进行有监督的微调。在CV领域,实际上已经在大型图片网络库上对模型进行了预训练,然后针对不同的任务在较小的数据上进一步进行微调。 这比随机初始化好得多,因为该模型可以学习一般的图像特征,然后可以将其用于各种视觉任务中。

在NLP中,从浅词嵌入到深度神经模型,大型语料库上的PTM也被证明对下游NLP任务有益。

2.4.1 第一代PTM:预训练词嵌入

将词表示成稠密向量有很长的历史[59]。“现代”词嵌入是在神经网络语言模型(NNLM)中被引入的[12]。Collobertet等人[26]表明,将预训练的词嵌入到未标记的数据上可以显著改善许多NLP任务。为解决计算复杂性,他们学习了成对排序任务而不是语言建模的词嵌入。 他们的工作是从未标记的数据中获得对其他任务有用的通用词嵌入的首次尝试。Mikolov等人[123]表明,不需要深度神经网络来构建良好的词嵌入。 他们提出了两种浅层架构:连续词袋(CBOW)和Skip-Gram(SG)模型。 尽管它们很简单,但是它们仍然可以学习高质量的单词嵌入,以捕获单词之间潜在的句法和语义相似性。 Word2vec是这些模型中最受欢迎的实现之一,它使NLP中的不同任务可以访问经过预训练的词嵌入。此外,GloVe [127]也是一种广泛使用的模型,用于获得预训练的词嵌入,该词嵌入是通过从大型语料库中的全局词-词共现统计来计算的。

尽管预训练词嵌入在NLP任务中已显示出效果,但它们与上下文无关,并且大多受浅层模型训练。 在下游任务中使用时,整个模型的其余部分仍需要从头开始学习。

在同一时期,许多研究人员还尝试学习段落,句子或文档的嵌入,例如段落向量[94],“跳过思想”向量 [87],Context2Vec [121]。 这些句子嵌入模型与它们的现代的继承者不同,它们尝试将输入的句子编码为固定维度的矢量表示形式,而不是每个token的上下文表示形式。

2.4.2 第二代PTM:预训练上下文编码器

由于大多数NLP任务都超出单词级别,因此很自然地将神经编码器预训练为句子级别或更高级别。神经编码器输出向量被称作上下文词向量,因为它们根据上下文来表示单词的语义。

McCann等人[120]利用机器翻译(MT)从注意序列到序列模型预训练了一个深度LSTM编码器。通过预训练编码器输出的上下文向量(CoVe)可以提高多种常见NLP任务的性能。Peters等人[129]采用双向语言模型(BiLM)预训练的2层LSTM编码器,包括前向LM和后向LM。通过预先训练的BiLM输出的上下文表示,ELMo(来自语言模型的嵌入),在NLP任务的广泛范围内显示出了巨大的改进。

但是,这些PTM通常用作特征提取器来生成上下文词嵌入,这些词嵌入被用到下游任务的主要模型中。 它们的参数是固定的,而主模型的其余参数仍从头开始训练。

Ramachandran等人[140]发现,可以通过无监督的预训练显著改善Seq2Seq模型。 编码器和解码器的权重都使用两种语言模型的预训练权重进行初始化,然后使用标记的数据进行微调。 ULMFiT(通用语言模型微调)[66]尝试微调用于文本分类(TC)的预训练LM,并在六种广泛使用的TC数据集上取得了最新的成果。 ULMFiT包括三个阶段:1)在通用数据上对LM进行预训练; 2)在目标数据上微调LM; 3)针对目标任务进行微调。 ULMFiT还研究了一些有效的微调策略,包括区分性微调,倾斜的三角学习率和逐渐解冻。 自从ULMFiT以来,微调已成为使PTM适应下游任务的主流方法。

最近,深层的PTM在学习通用语言表示形式方面显示出了强大的能力:例如,OpenAI GPT(生成式预训练)[136]和BERT (Transformer的双向编码器标识)[35]。 除了LM外,还提出了越来越多的自监督任务(请参阅第3.1节),以使PTM从大规模文本语料库中获取更多知识。

3 PTM概述

PTM之间的主要区别是上下文编码器的用法,预训练任务和目的。 我们在第2.2节中简要介绍了上下文编码器的体系结构。 在本节中,我们重点介绍预训练任务,并给出PTM的分类法。

3.1 预训练任务

预训练任务对于学习语言的通用表示形式至关重要。 通常,这些预训练任务应具有挑战性,并具有大量的训练数据。 在本节中,我们将预训练任务概括为三类:有监督学习,无监督学习和自监督学习。

1.有监督学习(SL)是基于由输入-输出对组成的训练数据学习将输入映射到输出的功能。

2.无监督学习(UL)是从未标记的数据中找到一些内在的知识,例如聚类,密度,潜在表示。

3.自监督学习(SSL)是有监督学习和无监督学习的混合。SSL的学习范式与监督学习完全相同,但是训练数据的标签是自动生成的。 SSL的关键思想是以某种形式根据来自输入的其他部分来预测输入的任何部分。 例如,掩蔽语言模型(MLM)是一种自我监督的任务,它会尝试在给定句子其余单词的情况下预测被掩盖的单词。

在CV中,许多PTM均在大型监督训练集(如ImageNet)上进行训练。 但是,在NLP中,大多数监督任务的数据集不足以训练一个好的PTM。唯一的例外是机器翻译(MT)。 大规模的MT数据集WMT 2017包含超过700万个句子对。 此外,MT是NLP中最具挑战性的任务之一,经过MT培训的编码器可以使各种下游NLP任务受益。 作为成功的PTM,CoVe [120]是针对MT任务进行预训练的编码器,可改进各种常见的NLP任务:情感分析(SST,IMDb),问题分类(TREC),蕴涵度(SNLI)和问题解答( SQuAD)。

在本节中,我们介绍一些在现有PTM中广泛使用的预训练任务。 我们可以将这些任务视为自主学习。 表1还总结了它们的损失函数。

3.1.1 语言模型(LM)

NLP中最常见的无监督任务是概率语言建模(LM),这是一个经典的概率密度估计问题。 尽管LM是一个笼统的概念,但在实践中,LM通常特别是指自回归LM或单向LM。

给定一个文本序列\mathbf{x}_{1:T}=[x_{1},x_{2},...,x_{T}],它的联合概率p(x_{1:T})可被分解如下:

p(\mathbf{x}_{1:T})=\prod_{t=1}^{T}p(x_{t}|\mathbf{x}_{0:t-1})                              (2)

其中x_{0}是表示序列开头的特殊token。

条件概率p(x_{t}|\mathbf{x}_{0:t-1})可以通过给定语言环境\mathbf{x}_{0:t-1}下词汇的概率分布来建模。环境\mathbf{x}_{0:t-1}是通过神经编码器f_{enc}(\cdot )进行建模的,条件概率为:

p(x_{t}|\mathbf{x}_{0:t-1})=\textrm{g}_{LM}(f_{enc}(\mathbf{x}_{0:t-1}))                   (3)

其中\textrm{g}_{LM}(\cdot)是一个预测层。

给定一个大型语料库,我们可以使用最大似然估计(MLE)训练整个网络。

单向LM的一个缺点是每个token的表示仅对左上下文token及其本身进行编码。 但是,更好的文本上下文表示应该从两个方向对上下文信息进行编码。一种改进的解决方案是双向LM(BiLM),它由两个单向LM组成:向前的从左到右的LM和向后的从右到左的LM。 对于BiLM,Baevski等人[6]提出了一个双塔模型,即前塔操作左向右LM,后塔操作右向左LM。

3.1.2 掩蔽语言模型(MLM)

掩蔽语言建模(mask language modeling, MLM)最早是由Taylor[172]在文献中提出的,他将其称为完形填空任务。Devlin等人将此任务改编为一种新的训练前任务,以克服标准单向LM的缺点。简单地说,MLM首先从输入语句中屏蔽掉一些标记,然后训练模型用其他标记来预测掩码标记。然而,这种预训练方法将在预训练阶段和微调阶段之间产生不匹配,因为掩码token不会在微调阶段出现。根据经验,为了处理这个问题,Devlin等人使用特殊的[MASK]token的时间占80%,随机token的时间占10%,初始token的时间占10%来执行掩蔽。

序列到序列MLM(Seq2Seq MLM)MLM通常被当作分类问题解决。我们将masked序列馈送到神经编码器,其输出向量进一步馈送到softmax分类器中以预测masked token。或者,我们可以使用MLM的编码器-解码器(也称为序列到序列)体系结构,在该体系结构中,masked序列被馈送给编码器,而解码器以自回归的方式顺序生成masked token。我们称这种MLM为序列到序列MLM(Seq2Seq MLM),它被用在MASS[154]和T5[138]中。Seq2SeqMLM可用于类似于seq2seq的下游任务,如问题回答、摘要和机器翻译。

增强掩蔽语言模型(E-MLM)目前,有多项研究提出了不同的MLM增强版本以进一步改进BERT。RoBERTa[111]通过使用动态掩模代替静态掩模来改进BERT。

UniLM [38,8]将掩码预测的任务扩展到三种类型的语言建模任务:单向,双向和序列到序列的预测。 XLM [27]在一个平行双语句子对的连接上执行MLM,称为翻译语言建模(TLM)。 Span-BERT [76]将MLM替换为随机连续词屏蔽跨度边界目标(SBO),以将结构信息集成到预训练中,这要求系统根据跨度边界来预测屏蔽跨度。 此外,StructBERT [187]引入了跨预定恢复任务以进一步整合语言结构。丰富MLM的另一种方法是整合外部知识(请参见第4.1节)。

3.1.3 置换语言模型(PLM)

尽管MLM任务在预训练中被广泛使用,Yang等人[202]声称在MLM的预训练中使用了一些特殊的token,例如[MASK],当模型被应用在下游任务中时是不会出现的,这会导致预训练和微调之间出现间隙。为了克服这一问题,置换语言模型(PLM)被提出来代替MLM。简而言之,PLM是一种对输入序列进行随机排列的语言建模任务。 从所有可能的排列中随机抽取排列。 然后选择排列序列中的一些token作为目标,然后根据其余token和目标的自然位置,训练模型以预测这些目标。 请注意,此排列不会影响序列的自然位置,而只是定义了token预测的顺序。 实际上,由于收敛速度较慢,仅预测了排列序列中的最后几个token。 并引入了特殊的双流自注意力以进行目标感知表示。

3.1.4 去噪自动编码器(DAE)

去噪自动编码器(DAE)采用部分损坏的输入,目的是恢复原始的未失真输入。具体到语言,使用序列到序列的模型,如标准Transformer,来重建原始文本。有几种方法可以破坏文本[98]:

(1)Token Masking(token掩蔽):性输入中随即取样token并用[MASK]元素替换它们。

(2)Token Delection(token删除):从输入中随机删除token。与token掩蔽不同的是,模型需要确定丢失输入的位置。

(3)Text Infiling(文本填充):类似SpanBERT,对多个文本跨度进行采样,并用一个[MASK]替换。每个跨度长度是由泊松分布(\lambda =3)得出的。该模型需要预测一个跨度中丢失了多少token。

(4)Sentence Permutation(句子排列):根据句号将文档分为多个句子,并以随机顺序对这些句子进行改组。

(5)Document Rotation(文件旋转):随机地均匀地选择一个token并旋转文档,使其以该token开始。模型需要识别文档的实际起始位置。

3.1.5 对比学习(CTL)

对比学习[147]假定一些观察到的文本对在语义上比随机采样的文本更相似。

论文阅读|Pre-trained Models for Natural language Processing: A Survey相关推荐

  1. 论文阅读:Pre-trained Models for Natural Language Processing: A Survey 综述:自然语言处理的预训练模型

    Pre-trained Models for Natural Language Processing: A Survey 综述:自然语言处理的预训练模型 目录 Pre-trained Models f ...

  2. [论文解读] Adversarial Attacks on Deep Learning Models in Natural Language Processing: A Survey

    Adversarial Attacks on Deep Learning Models in Natural Language Processing: A Survey 文章目录 Adversaria ...

  3. 预训练综述 Pre-trained Models for Natural Language Processing: A Survey 阅读笔记

    原文链接:https://arxiv.org/pdf/2003.08271.pdf 此文为邱锡鹏大佬发布在arXiv上的预训练综述,主要写了预训练模型(PTM)的历史,任务分类,PTM的扩展,将PTM ...

  4. 论文阅读:A Primer on Neural Network Models for Natural Language Processing(1)

    前言 2017.10.2博客园的第一篇文章,Mark. 由于实验室做的是NLP和医疗相关的内容,因此开始啃NLP这个硬骨头,希望能学有所成.后续将关注知识图谱,深度强化学习等内容. 进入正题,该文章是 ...

  5. Efficient Methods for Natural Language Processing: A Survey自然语言处理有效方法综述

    Efficient Methods for Natural Language Processing: A Survey 关于自然语言处理有效方法的一个综述,近来关于自然语言处理已经取得了非常显著的结果 ...

  6. 论文阅读笔记|NNLP: A Primer on Neural Network Models for Natural Language Processing - Yoav Goldberg 2015

    书籍简介 本篇综述可看作神经网络模型应用于自然语言处理的启蒙读物.由于时间跨度较大,文中提到的模型比较古早,但此文包含该领域需要掌握的基础概念,且篇幅不长,通俗易懂,有一定价值,适合初学者阅读.以下是 ...

  7. 论文阅读 Learning Transferable Visual Models From Natural Language Supervisio

    Learning Transferable Visual Models From Natural Language Supervision Computer Vision and Pattern Re ...

  8. CLIP论文翻译、Learning Transferable Visual Models From Natural Language Supervision翻译

    CLIP论文翻译.Learning Transferable Visual Models From Natural Language Supervision翻译 文章目录 CLIP论文翻译.Learn ...

  9. 【论文模型讲解】CLIP(Learning Transferable Visual Models From Natural Language Supervision)

    文章目录 前言 0 摘要 1 Introduction and Motivating Work 2 Approach 2.0 模型整体结构 2.1 数据集 2.2 选择一种高效的预训练方法 2.3 模 ...

  10. 论文阅读:Natural Language Processing Advancements By Deep Learning: A Survey

    文章目录 一.介绍 二.背景 1.人工智能和深度学习 (1)多层感知机 (2)卷积神经网络 (3)循环神经网络 (4)自编码器 (5)生成对抗网络 2.NLP中深度学习的动机 三.NLP领域的核心概念 ...

最新文章

  1. 2018-3-19李宏毅机器学习笔记八--HomeWork1-PM2.5 Predicition
  2. 提高你开发效率的十五个Visual Studio 2010使用技巧
  3. 【分布式】通过Numpy创建Dask.array
  4. java nextday_Nextday 参数化单元测试(测试用例)设计
  5. 【渝粤教育】国家开放大学2018年秋季 1133t文献检索 参考试题
  6. 计算机程序备份,将应用程序快照备份到计算机
  7. Docker实战 (docker swarm的应用,docker集群的构建,在docker集群中部署服务)
  8. 使用VS2010+OpenCV2.4.9简单图像水印代码
  9. 地图样式自定义_用地图做数据分析,地图可视化更显高级
  10. 阿里云GIS曾志明:空间数据中台是什么,怎么用
  11. c语言求解二元一次方程,c语言,求解二元一次方程
  12. mysql with rollup_MySQL-with rollup函数运用 _20160930
  13. 洛雪音乐助手(五音版)
  14. 对封装、继承、多态的简单理解
  15. Node的文件操作、文件系统、数据流
  16. 【逆向入门】 CrackMe160-005 分析思路
  17. 谷歌:民主国家搜索引擎的消费监控
  18. ps快速切图,文件命名图片自动导出
  19. 新手学习MAYA的几个建议
  20. 【软件教程】如何将夸克网盘挂载为本地磁盘【Docker+AList+RaiDrive】

热门文章

  1. Android大话设计模式 第二章----单一职责原则 乔峰VS慕容复
  2. matlab的雷劈数算法,寻找雷劈数
  3. 【计算机游戏开发】游戏交互界面设计
  4. Maxima函数的不完全列表
  5. 【论文调研】IJCAI-2019 论文投稿与录用调研报告
  6. springboot系列(5) -- 整合 logback 彩色日志输
  7. 分析Padavan的代码一
  8. n维向量积(3维向量积的推广,向量算法)
  9. 彻底关闭Win10自动更新(Win10企业版或专业版)
  10. 1106 Lowest Price in Supply Chain (25分)