-
本文介绍一篇发表于 EMNLP 2020 的论文《Convolution over Hierarchical Syntactic and Lexical Graphs for Aspect Level Sentiment Analysis》,简称 BiGCN。该工作提出了一种新颖的体系结构,其目标在于更好地利用语料库级别的单词共现信息以及不同类型的句法依存关系。为此,该文首先创造性地提出了句法和词汇的概念层次,并以此为基础建立了层次句法图和层次词汇图,随后设计了双层交互式图卷积网络以充分融合层次句法和词汇图。论文在五个基准数据集上进行了大量实验,结果表明 BiGCN 方法达到了最佳性能。论文标题:Convolution over Hierarchical Syntactic and Lexical Graphs for Aspect Level Sentiment Analysis论文链接:https://www.aclweb.org/anthology/2020.emnlp-main.286.pdf代码链接:https://github.com/NLPWM-WHU/BiGCN一、背景简介ASC (Aspect-based Sentiment Classification):目的在于确定针对特定方面的情感极性。例如:great food but the service was dreadful.给定两个方面词的术语“food”和“service”,目标是推断方面的情感极性:对 food 是 positive,对 service 是 negative。1.1 Existing StudiesASC 的最新进展集中在开发各种类型的深度学习模型上。我们简要回顾了不考虑语法的神经模型,然后转到基于语法的模型。1.1.1 Neural models without considering syntax不考虑语法模型的神经模型主要可以分为几种类型:基于 LSTM,基于 CNN,基于 memory 和其他混合方法。缺点:这些模型将句子表示为一个单词序列,而忽略了单词之间的句法关系,因此,此类方法很难找到远离 aspect 的意见单词。1.1.2 Neural models considering syntax句法信息可以使依赖性信息保留在冗长的句子中,并有助于缩短方面词和观点词之间的距离。最近的一些研究(Zhang 等人,2019;Huang 和 Carley,2019; Sun 等人,2019)利用基于图的模型来集成句子的句法结构,并且表现出更好的性能。缺点:尽管上述方法取得了一定的效果,但其忽略语料库级别的单词共现信息。对语法依赖的不同类型也没有加以区分。二、问题与动机2.1 Task Definition给定由n个单词和从第(a + 1)个位置开始、长度为m的方面组成的句子2.2 Motivations2.1.1 频繁出现的词对代表着语言学中的固定搭配。例如,在句子“food was okay, nothing special”中,单词“nothing special”对在 SemEval 训练集中出现了 5 次,表示负极性。如果没有这样的全局信息来抵消“okay”的正面影响,基于语法的方法将对“food”做出错误的预测。2.1.2 每种类型的句法依存关系都表示一种特定的关系。例如,在“i like hamburgers”中,“i like”是 nsubj(名词主语)关系,而“like hamburgers”是 dobj(直接宾语)关系。如果 nsubj 关系和 dobjs 关系得到同等对待,我们将无法区分动作“like”的主语和宾语。2.3 Our solution为了解决上述限制,我们提出了一种新颖的网络模型,用于有效地融合词对共现信息和句法依存信息。我们建立了用于训练语料库的全局词汇图,和每个句子的局部层次句法图和局部层次词汇图。(1)全局词汇图是我们首次提出来用于 ASC 任务:对语料库级别的单词共现信息进行编码,其中节点是单词,边表示训练语料库中两个单词节点之间的频率。(2)我们还在局部句法图和词汇图上建立概念层次结构,以区分不同类型的依存关系或词对共现关系图1显示了一个带有其依赖关系树的示例句子,其它现有模型句法图,以及我们改进的局部层次句法图和独创的局部层次词汇图。对比图 1(b)和(c)可以看到:现有句法图的每条边仅表示两个节点之间存在关系,而无法区分各种类型的依赖关系,而我们的层次句法图中每条边都附加有概念层次类型的标签,句法概念层次包含名词、动词、形容词、副词、其它;图 1(d)是我们独创的局部层次词汇图,由于单词频度服从 log-normal 分布,我们将词对按其共现频三、BiGCN - Architecture我们提出的 BiGCN 模型架构包含三个模块,如图 2 所示:1)首先将全局词汇图和单词序列作为输入来获得初始句子表示。2)随后引入 HiarAgg 模块,让局部层次词汇图和层次句法图交互以精化句子表示。3)最后通过 mask 和门控机制获得面向方面的表示,以更好地预测句子中特定方面的情感极性。3.1 Getting Initial Sentence Representation我们提出了两种类型的文本表示形式改进句子的 embedding。一种是基于我们的全局词汇图的 GCN embedding;另一个是基于双向 LSTM 的 Bi-LSTM embedding。首先,我们希望将语料库特有的词汇信息编码进句子的表示形式中。我们对全局词汇图执行 GCN,获得整个训练集的词汇嵌入矩阵。然后,通过该矩阵得到序列 S 的 GCN embedding,在图 2(a)中用 x 表示。其次,更接近方面词的词汇可能会对判断其情感做出更大的贡献。我们计算从每个上下文词到相应方面词的绝对距离,并获得 S 的位置序列。S 中的每个单词都含有预训练单词 embedding 和位置 embedding。具有上述表示形式的句子 S 发送到 Bi-LSTM 层以获得 Bi-LSTM embedding,在图 2(a)中用 y 表示。3.2 Refining Sentence Representation以上述 GCN embedding 和 Bi-LSTM embedding 作为初始句子表示,我们进一步利用局部层次词汇图和层次句法图以获得句子 S 的更好表示。基本思想是让这两个图在经过精心设计的 HierAgg 模块中深入交互。HierAgg 是一个多层结构,其中每层包括一个交叉网络以融合 GCN 和 Bi-LSTM embedding,以及一个双层 GCN 以在层次句法和局部层次词汇图上进行卷积。多层结构确保了在不同级别执行的不同类型信息的协作。本节详细介绍了 HierAgg 中的一层,如下图所示。(1)Cross Network为了深入融合 GCN embedding(x)和 Bi-LSTM embedding(y),我们采用了简单但有效的交叉网络结构。在跨网络的每一层中,我们使用以下公式更新融合的嵌入。每层中的融合嵌入将用作 Bi-level GCN 中两个图的输入节点表示。(2)Bi-level GCN由于我们的局部句法图和词汇图包含概念层次结构,因此普通 GCN 无法在带有标记边的图上卷积。为了解决该问题,我们提出了一个用于合并不同关系类型的双层 GCN。给定一个带有两个图的句子,我们将使用两个聚合操作执行双层卷积。第一次聚合(低级):将具有相同关系类型的节点聚合到虚拟节点,然后在 GCN 中使用相同的归一化隐藏特征总和作为聚合函数来获取虚拟节点嵌入 。第二次聚合(高级):将所有虚拟节点及其特定关系聚合在一起。使用平均聚合函数针对不同关系类型(虚拟节点)更新目标词 t 的表示形式:(3)Finally aggregated embedding我们分别在局部层次词汇图和层次句法图上进行第一次和第二次聚合以获得精炼的句子表示形式,将其用作下一层的输入。在 Hier-Agg 模块的最后一层中,我们将 x 和 y 组合在一起以形成聚集嵌入。3.3 Generating Aspect-oriented Representation为了更好地预测一个方面的情感极性,我们使用门控机制以过滤面向特定 aspect 的情感信息流:接下来在门控嵌入 h 中对非方面词进行 mask,并使方面词保持不变,并且得到 zero-mask 的嵌入:最后,我们检索与方面单词在语义上相关的重要特征,并使用自注意力机制为每个上下文单词设置基于检索的注意力权重,将其加权求和之后即可获得面向方面的句子表示 z。3.4 Model Training我们将上述 z 输入一个全连接层和一个 softmax 层,得到样本句 s 的预测值:模型的训练目标为最小化所有训练样本的交叉熵损失,我们采用标准梯度下降算法训练模型:四、实验与分析4.1 Datasets我们在五个基准数据集上评估了我们提出的模型。一种是 Twitter 数据集。它由推特帖子组成。其他四个数据集(Lap14,Rest14,Rest15,Rest16)全部来自 SemEval 任务,其中包含有关笔记本电脑和餐厅的评论,其统计信息如下表 1 所示。4.2 Result我们与八种最经典或性能最好的方法进行了比较,其中前四种方法是具有典型神经结构(如注意力,LSTM,CNN,memory 和 RNN)的模型,中间的 AF-LSTM 则利用单词共现信息(但是没有表示成图结构),其余三种方法是基于图和语法关系集成的。我们采用 Accuracy 和 Macro-F1 作为评估指标,其结果是对随机初始化的三次运行结果求平均值。所有方法的比较结果显示在表 2 中。由表 2 可知,我们提出的 BiGCN 模型在所有数据集上的 Macro-F1 得分均达到了最佳结果。4.3 Ablation Study为了检查 BiGCN 模型中每个组件的影响,我们进行了一项分离实验,并将结果显示在表 3 中。我们首先研究局部层次词汇(M1)和句法图(M2)的影响。然后,我们进一步从 M1 和 M2 中删除关系类型来显示概念层次结构的影响,从而得到基本的词汇(M3)和句法图(M4)。表 3 的结果清楚地证明了我们提出的概念层次和词汇图的有效性。4.4 Case Study为了更好地了解 BiGCN 的工作原理,我们通过三个测试示例对几种方法进行了对比,如下图所示。BiGCN 对三个句子都能作出正确的判断,其它方法则或对或错。其中:由于缺少语法和词汇共现信息,RAM 对所有三个句子都做出错误的判断。由于相同的原因,AF-LSTM 在第一和第二句话中也会做出错误的预测。对于第三个句子,集成了语法的方法 TD-GAT,ASGCN 和 CDT 过于依赖解析的结果,将“great” 和 “pad”, “needed” 和 “feature”联系到一起,从而做出了错误的判断。相反地,AF-LSTM 和我们的 BiGCN 通过利用单词共现信息,能够正确地预测 cooling pad 的情感极性。五、结论本文为方面级情感分析任务提出了一种结合层次句法和词汇图的新型网络结构。其主要贡献在于首次使用词汇图来捕获全局单词共现信息,其次,在局部词汇和句法图上建立概念层次,用于区分不同类型的依存关系或词对共现关系的独特贡献;最后设计了一个深度融合模块,使得局部层次词汇图和句法图能够更好地协同工作。大量实验表明本文方法达到了 SOTA 的性能。转自:PaperWeeklyhttps://www.jiqizhixin.com/columns/paperweekly
-
论文名称:Revisiting Pre-trained Models for Chinese Natural Language Processing论文作者:崔一鸣,车万翔,刘挺,秦兵,王士进,胡国平 原创作者:崔一鸣 论文链接:https://www.aclweb.org/anthology/2020.findings-emnlp.58 转载须标注出处:哈工大SCIR1. 简介以BERT为代表的预训练语言模型在众多自然语言处理任务中取得了显著性能提升,并且随后涌现出一批效果更优的预训练语言模型。在本文中,我们将经典的预训练语言模型应用在中文场景并使用相同的实验设置去验证它们在中文领域的性能表现。同时,我们创新地提出了一种基于文本纠错的预训练语言模型MacBERT,应用纠错型掩码语言模型(MLM as correction,Mac)解决了预训练模型中“预训练-精调”不一致的问题。为了验证实验效果,我们选择了8个经典的中文自然语言处理任务,包括阅读理解、单句文本分类、句对文本分类等。大量实验结果表明所提出的MacBERT能够在大多数任务上取得显著性能提升。我们已将所有本文涉及到的中文预训练资源进行开源,希望能够进一步促进中文信息处理的研究与发展。2. 构建中文预训练系列模型首先,我们提出了一整套的中文预训练系列模型,以构建较为完整的基线系统并为后续工作提供相对标准的参照数据。我们主要训练了以下几种预训练语言模型:BERT-wwm:我们在谷歌原版中文BERT-base[1]的基础上,将全词掩码技术(Whole Word Masking,wwm)应用在中文环境,即在掩码语言模型(Masked Language Model,MLM)中使用词粒度进行掩码。我们使用了LTP[2]作为中文分词工具。需要注意的是,虽然掩码粒度为词,但模型的输入仍然以字为粒度(使用WordPiece分词)进行切分,即与原版BERT并无差别。XLNet:Yang等人提出基于Transfromer-XL构建了XLNet模型[3],解决了BERT的“预训练-精调”不一致的问题,提出了Permutation Language Model。与BERT不同的是,XLNet采用了sentencepiece进行分词,因此分词粒度更大。RoBERTa-wwm:RoBERTa模型[4]由Liu等人提出,进一步挖掘了BERT的潜力。我们训练的RoBERTa-wwm与BERT-wwm类似,但从中删除了Next Sentence Prediction(NSP)预训练任务,并使用了全词掩码技术。需要注意的是,与英文RoBERTa不同,这里我们同样使用了WordPiece分词。通过后续实验发现WordPiece相比sentencepiece在中文预训练模型中更有效。ELECTRA:Clark等人提出一套全新的生成器-判别器架构的预训练模型ELECTRA[5],其中生成器是一个小型的MLM,用于替换输入文本。而判别器则是判断输入文本是否经过替换。由于判别器只需进行二分类,相比传统MLM来说效率更高。在下游任务精调中,我们只使用判别器。3. MacBERT为了解决预训练模型中的“预训练-精调”不一致的问题,我们巧妙地修改了掩码语言模型,并提出基于文本纠错的掩码语言模型(MLM as correction,Mac)。该方法不需要对现有结构进行任何改动,只需针对掩码方式进行改变,因此极大程度地保留了BERT的原始特性,并可以无缝迁移到任何使用BERT的下游任务精调代码中。 具体地,针对掩码语言模型任务,我们进行了如下修改:我们使用全词掩码技术以及N-gram掩码技术来选择待掩码的token,其中unigram至4-gram的概率分别为40%、30%、20%、10%。为了解决[MASK]标记在下游任务中不会出现的问题,我们提出使用相似词来替换[MASK]标记。我们使用Synonyms库[6]来获取待掩码单词的相似词。在N-gram掩码时,我们针对N-gram中的每个词均进行相似词替换。在少数情况下,当相似词不存在时,我们将使用词表中的随机词进行替换。与原版BERT类似,我们对输入序列总长度15%的token进行掩码,其中80%的情况下会替换为相似词,10%的情况下会替换为随机词,剩余10%则不进行任何替换(负样本)。下表给出了几种不同的掩码方式的对比示例。表1 不同掩码方式的对比除此之外,由于ALBERT模型[7]在众多自然语言处理任务上获得显著性能提升,我们采用了其中的Sentence Order Prediction(SOP)预训练任务来替换BERT中的Next Sentence Prediction(NSP)任务。在SOP任务中,正样本由相邻的两个片段构成,而负样本则是将两个片段的顺序进行倒置。4. 实验4.1. 预训练模型设置接下来简要介绍预训练模型的训练设置,详细内容请参考论文的4.1节。预训练数据:我们采用了中文维基百科数据(同时保留简体和繁体中文)以及额外爬取的中文数据(包括百科、问答、新闻等),总词数达到了5.4B。在模型中我们以ext标记采用扩展数据的BERT或RoBERTa模型。基本参数:我们对所有模型(除XLNet)采用了统一预训练词表,与原版中文BERT-base相同,包含21128个token。序列最大长度设置为512。训练设备:根据模型规模大小,我们采用了单个TPU v3或者TPU v3-32进行训练。4.2. 下游精调数据集我们选用了以下8个中文自然语言处理数据集:阅读理解:CMRC 2018[8],DRCD[9],CJRC[10] 单句文本分类:ChnSentiCorp[11],THUCNews[12] 句对文本分类:XNLI[13],LCQMC[14],BQ Corpus[15]为了保证结果的稳定性,对于每一组实验结果,我们均运行10次,并汇报其平均值和最大值。相关实验超参设置请参考论文的表2。4.3. 实验结果本文涉及的预训练模型的部分实验结果如下表所示(详细结果请参考论文4.3节)。可以看到MacBERT在多数任务上取得了显著性能提升,尤其在机器阅读理解的各项任务中的提升更为明显。表2 CMRC 2018中文阅读理解结果4.4. 消融实验为了进一步了解性能提升的来源,我们对MacBERT-large进行了消融实验。可以看到,整个模型中最重要的部分是纠错型掩码语言模型(Mac)和N-gram掩码语言模型(NM),而相对来说模型使用NSP还是SOP预训练任务并没有对模型性能造成很大影响,因此后续工作应进一步将重点放在掩码语言模型及其变种模型的设计上。表4 MacBERT模型上的消融实验结果5. 讨论前面提到MLM任务是这类预训练语言模型最重要的组成部分。MLM类任务包括两个方面:1)如何选择需要掩码的token;2)待掩码的token替换成什么。在前面的章节中,我们已经展示了不同的选择掩码token的方法,例如全词掩码、N-gram掩码等。现在我们将探索第二个方面,即探索“待掩码的token替换成什么”。我们在CMRC 2018和DRCD数据集上进行了验证。在15%的整体掩码比例下,其中的10%将保持不变(负样例),而剩余的90%将采取如下4类方案进行对比。MacBERT:80%的词替换成相似词,10%替换为随机词;随机替换:90%的词替换为随机词;部分MASK:(BERT原始MLM)80%替换为[MASK],10%替换为随机词;全部MASK:90%的词替换为[MASK]。实验结果如下图所示。可以看到依赖于替换成[MASK]的实验设置(例如部分MASK和全部MASK)下效果相对较差,说明“预训练-精调”不一致的确会为下游任务带来一定的性能下降。而简单地将所有待掩码的词替换为随机词后,其性能显著优于依赖[MASK]的MLM方法。最后,我们使用相似词进行进一步优化后,其性能还会得到显著提升,说明MacBERT设计是有效的。6. 结论在本文中,我们回顾了经典预训练语言模型在中文场景下的性能表现,以验证这些模型在非英文语种上的通用性。同时我们提出了一种基于文本纠错的预训练语言模型MacBERT,解决了预训练模型中的“预训练-精调”不一致的问题。大量实验结果表明所提出的MacBERT能够在多数任务上带来显著性能提升。我们已将所有与本文相关的中文预训练语言模型开源,并希望能够进一步促进中文信息处理的研究与发展。基于我们在文章最后的分析讨论,未来我们将探索一种有效调整掩码比例的方法以取代手工设置的方案,从而进一步提升预训练语言模型的性能表现。7. 参考文献[1] Jacob Devlin, Ming-Wei Chang, Kenton Lee, and Kristina Toutanova. BERT: Pre-training of deep bidirectional transformers for language understanding. In NAACL 2019. [2] Wanxiang Che, Zhenghua Li, and Ting Liu. LTP: A chinese language technology platform. In COLING 2010. [3] Zhilin Yang, Zihang Dai, Yiming Yang, Jaime Carbonell, Ruslan Salakhutdinov, and Quoc V Le. Xlnet: Generalized autoregressive pretraining for language understanding. arXiv preprint arXiv:1906.08237. [4] Yinhan Liu, Myle Ott, Naman Goyal, Jingfei Du, Mandar Joshi, Danqi Chen, Omer Levy, Mike Lewis, Luke Zettlemoyer, and Veselin Stoyanov. Roberta: A robustly optimized bert pretraining approach. arXiv preprint arXiv:1907.11692. [5] Kevin Clark, Minh-Thang Luong, Quoc V. Le, and Christopher D. Manning. ELECTRA: Pretraining text encoders as discriminators rather than generators. In ICLR. [6] Zhenzhong Lan, Mingda Chen, Sebastian Goodman, Kevin Gimpel, Piyush Sharma, and Radu Soricut. Albert: A lite bert for self-supervised learning of language representations. arXiv preprint arXiv:1909.11942. [7] Hailiang Wang and Yingxi Hu. 2017. Synonyms. https://github.com/huyingxi/Synonyms [8] Yiming Cui, Ting Liu, Wanxiang Che, Li Xiao, Zhipeng Chen, Wentao Ma, Shijin Wang, and Guoping Hu. A Span-Extraction Dataset for Chinese Machine Reading Comprehension. In EMNLP 2019. [8] Chih Chieh Shao, Trois Liu, Yuting Lai, Yiying Tseng, and Sam Tsai. Drcd: a chinese machine reading comprehension dataset. arXiv preprint arXiv:1806.00920. [9] Xingyi Duan, Baoxin Wang, Ziyue Wang, Wentao Ma, Yiming Cui, Dayong Wu, Shijin Wang, Ting Liu, Tianxiang Huo, Zhen Hu. Cjrc: A reliable human-annotated benchmark dataset for chinese judicial reading comprehension. In CCL 2019. [10] Songbo Tan and Jin Zhang. 2008. An empirical study of sentiment analysis for chinese documents. Expert Systems with applications, 34(4):2622–2629. [11] Jingyang Li and Maosong Sun. Scalable term selection for text categorization. In EMNLP 2007. [12] Alexis Conneau, Ruty Rinott, Guillaume Lample, Adina Williams, Samuel R. Bowman, Holger Schwenk, and Veselin Stoyanov. Xnli: Evaluating crosslingual sentence representations. In EMNLP 2018. [13] Xin Liu, Qingcai Chen, Chong Deng, Huajun Zeng, Jing Chen, Dongfang Li, and Buzhou Tang. Lcqmc: A large-scale chinese question matching corpus. In COLING 2018. [14] Jing Chen, Qingcai Chen, Xin Liu, Haijun Yang, Daohe Lu, and Buzhou Tang. The BQ corpus: A large-scale domain-specific Chinese corpus for sentence semantic equivalence identification. In EMNLP 2018.
-
作者:Frank转自:https://zhuanlan.zhihu.com/p/1724793061、动机如今,我们利用AI算法解决实际问题的时候,需要面临的第一个并且是最重要的一个问题就是进行大规模的数据采集和标注。众所周知,使用监督学习方法做分类任务时,往往训练样本规模越大,分类器的性能就越高。但是在面临实际问题时,我们接触到的大量的来自互联网或其他来源(如学术界或商业界)的都是未标注的数据。然而标记样本通常是代价比较大的,比如海量标注需要耗费大量时间和人力(海量的语料和图像标注);又比如一些数据需要领域内的专家来进行人工标注(一家数据驱动的医疗公司有很多MRI扫描,他们需要聘请一位专家来帮助他们解释这些扫描),这样数据标注便成了人工智能算法商用的一个难题。 业界也有一些专门进行数据标注的公司[1],比如Google可以提供不同任务的数据标注服务(其中视频类的标注费用最高,最高可到$686/500min),如Figure1示:根据上表,考虑到数据标注的代价以及有限的资源,人们无法解释或标记所有数据;这就是他们决定使用主动学习(Active Learning)的原因。主动学习的核心思想之一就是通过一定的查询策略,选取“最不确定”或者“携带最大信息”的样本进行标注供算法学习,然后通过模型迭代更新可以实现与使用完全受监督的数据集类似的或更高的[2]性能,而不需要对所有的数据进行标注。通过这种方式,决定使用多少数据或者期望模型达到某种性能就变成了一种资源管理决策;换言之,就变成了一种商业决策(Business Planning)。2、主动学习介绍主动学习(Active learning or query learning)作为机器学习的一个分支(Semi-supervised Learning)其主要是针对数据标签较少或打标签代价较高这一场景而设计的。主动学习背后的关键思想是,如果允许从学习的数据中选择数据,则机器学习算法可以通过较少的训练标签来实现期望的准确性。主动学习主要方式是模型(Learner)通过与用户或专家(Oracle)进行交互(如Figure 2所示),根据某种采样规则,抛出query让专家确定数据的标签,如此反复迭代,以期让模型利用较少的标记数据获得较好的性能。一般情况下,模型抛出的未标注数据为hard sample(可以是模型最难区分的样本;可以是对模型提升最大的样本,如梯度提升最大;可以是方差减小等等)。可以看出active learning与passive(supervised) learning最大的不同是其不需要大量的专家标注样本训练模型。 主动学习是利用少量标注样本,然后由模型(Learner)主动选择hard sample返回给用户或专家(Oracle)打标签,进而不断迭代以获得较好的模型(如Figure 3所示)[3],该过程必须要有Oracle的参与,这也是active learning区别于semi-supervised learning的不同之处。如上图所示,Figure3(a)是一个二分类数据集的GroundTruth。由于样本过多,Figure3(b)随机选择了其中20%的数据进行标注,通过训练得到如图所示的回归模型。可以看出,由于样本选择是随机的且标注的样本数量过少致使采样后的分布和GroudTruth真实分布相差较大,因此回归模型无法在真实数据集上得到较好的表现。图Figure3(c)采用了主动学习的方法,首先采用比如15%的数据训练出一个基学习器,然后基学习器基于某种查询策略主动在真实数据集中挑选基学习器难以区分的样本,交给Oracle进行标注,然后一步步迭代更新模型,最终采用较少的数据便可以训练出一个回归模型使得其在真实数据集上得到较好的表现。3、主动学习学术研究综述“Settles, B. 2009. Active Learning Literature Survey”[3]作为主动学习领域的经典论文,介绍了主动学习在2010年及以前的综述,Figure4的思维导图[4][5]结合该Survey以及近几年各大顶会中主动学习的研究展示了一些主动学习领域的一些Milestones。4、主动学习场景Membership Query SynthesisMembership Query Synthesis[5]可查询任意样本或随机生成(例如对图片样本进行旋转或添加“噪声”等,类似样本增强的策略),然后将其送给Oracle进行判断,其过程如图所示,由于在样本的随机生成过程中,其有较大的不确定性,因此在某些应用,专家也无法标记样本,故这种方法对于某些应用场景有一定的局限性。Stream-Based Selective SamplingStream-Based Selective Sampling或Sequential active learning,其核心假设为样本的获得是“免费的”或代价较小的,因此基学习器每次基于某种查询策略选择一个样本给专家进行标记,如图所示,模型通过某种“informative measure”确定是否由专家标注样本,或舍弃该样本。该方法支持在线学习(online learning)Pool-Based Sampling与Stream-Based Sampling最大的区别即为Pool-Based Sampling每次确定一批unlabeled data,由专家标记,如图4所示,Pool-Based Sampling是active learning中应用最为广泛的一种framework,同时支持在线学习。5、主动学习查询策略根据主动学习场景所述,Active learner在迭代中需要根据一定的策略选择most informative unlabeled sample去让Oracle进行标注,然后更新模型,在active learning中其主要包括以下几种Query Stategy:Uncertainty SamplingLeast confident sampling基学习器根据每一个样本所属类别输出概率最大值,选择一个最不确定的样本Margin sampling基学习器根据每一个样本所属第一个和第二个最可能类别概率差,选择一个最不确定的样本Entropy Sampling基学习器根据每一个样本所属类别概率的熵,选择一个最不确定的样本下面的热力图显示了通过三种查询策略后,在一个三分类任务中,不同的查询策略倾向于查询到的最不确定的样本。下面的例子展示如何具体运用三种查询策略:假设有一个三分类任务,训练好一个基学习器后,基学习器要在剩余样本的pool中选择一个最不确定的样本进行模型迭代更新,这个pool中有三个未标注的样本,输入基学习器后,基学习器输出了三个样本分别属于三个类别的概率:proba = np.array([[0.1 , 0.85, 0.05],[0.6 , 0.3 , 0.1 ],[0.39, 0.61, 0.0 ]])通过Least confident sampling:1 - proba.max(axis=1) = [0.15, 0.4 , 0.39]可以得到most uncertain样本为第二个样本通过Margin sampling:part = np.partition(-proba, 1, axis=1)margin = - part[:, 0] + part[:, 1]margin = [0.75, 0.3 , 0.22]可以得到most uncertain样本为第三个样本通过Entropy sampling:Entropy = entropy(proba.T)Entropy = [0.51818621, 0.89794572, 0.66874809]可以得到most uncertain样本为第二个样本Other Query Strategies除了Uncertainty Sampling之外,还有Query-by-Committee, Expected Model Change, Expected Error Reduction, Variance Reduction, Density-Weighted Methods等Query Method和相对应的变体,具体可阅读参考文献[3]的chapter 3以获取其余查询策略。6、主动学习算法流程最后,以一张流程图展示主动学习的算法流程,完成本次主动学习算法的介绍。其中红色部分的模块为算法流程的超参数,可以根据具体的场景进行调节。
-
近日,华为云 AI 团队获得第 9 届国际自然语言处理与中文计算会议 NLPCC 2020 轻量级预训练中文语言模型测评第一名。NLPCC 由中国计算机学会主办,是自然语言处理(NLP)和中文计算(CC)领域的顶级国际前沿会议,每年会议都秉承国际化和一流化的严格标准来进行自然语言处理任务的开放评测,推动相关任务的研究和发展。NLPCC 2020 吸引了康奈尔大学、伦敦大学、普林斯顿大学等海内外近 600 位自然语言处理领域的专家及学者参加大会,其中 400 余位专家学者在现场共同见证开放评测任务第一名的诞生。当下,预训练语言模型已经成为 NLP 的主流方法,在多项 NLP 任务上都取得了明显的效果提升。但是预训练语言模型往往比较大,限制了预训练语言模型的应用场景。因此,如何构建轻量级的预训练语言模型就成了一个关键问题。预训练语言模型出现以来发展得非常迅速,目前已经演化形成了一个家族中文轻量级预训练语言模型能力评测任务的目的在于让参赛团队减少语言模型大小的同时尽可能保证模型效果。本次比赛包含四个任务,分别是指代消解,关键词识别两个句子级别分类任务,实体识别序列标注任务,MRC 阅读理解任务,从不同角度评测模型的语义表达能力。同时,比赛要求模型的参数量低于 bert-base 模型的 1/9,模型推理速度达到 bert-base 模型的 8 倍,这就要求模型运行快,体积小,效果好。一般来说,可以通过量化、剪枝、蒸馏等方法来压缩大预训练语言模型来获得轻量级模型。华为云与诺亚方舟实验室联合团队基于自研的 NEZHA 中文预训练模型通过知识蒸馏得到 tiny-NEZHA 轻量级模型摘得桂冠。相比其他模型,华为的模型在结构上找到了一个较好的平衡点,采用 TinyBERT 两步蒸馏的方式让模型更好地学到任务相关的知识,蒸馏过程中用语言模型预测并替换部分 token 的方式进行数据增强可以使小模型拥有更强泛化性。TinyBERT 知识蒸馏的损失函数中一个重要环节是让中间层去学习隐藏状态和 attention 向量同时,华为自研的 NEZHA 预训练语言模型采用相对位置编码替换 BERT 的参数化绝对位置编码,能更直接地建模 token 间的相对位置关系,从而提升语言模型的表达能力。在即将过去的 2020 年里,华为云 AI 在人工智能领域的研发成绩斐然,斩获十二项包含 WSDM、WebVision、CCKS 篇章级事件抽取技术评测冠军、人工智能金炼奖、德国红点在内的国际国内榜单冠军和奖项。面向未来,华为云 AI 希望可以继续保持技术优势,做智能世界的「黑土地」,持续践行普惠 AI,将 AI 服务触及更多开发者和企业,助力各行各业进入人工智能新时代。本文来源:https://www.jiqizhixin.com/articles/2020-12-31
-
来自华为诺亚方舟实验室、北京邮电大学以及香港科技大学的研究者们提出了一个新的轻量模型范式TinyNet。相比于EfficientNet的复合放缩范式(compound scaling),通过TinyNet范式得到的模型在ImageNet上的精度要优于相似计算量(FLOPs)的EfficientNet模型。例如, TinyNet-A的Top1准确率为76.8% ,约为339M FLOPs,而EfficientNet-B0类似性能需要约387M FLOPs。另外,仅24M FLOPs 的TinyNet-E的准确率达到59.9%,比之前体量相当的MobileNetV3高约1.9%。注:上图部分来源于:https://link.zhihu.com/?target=https%3A//www.youtube.com/watch%3Fv%3DmqOdIYxxNCs转载自Mindspore首席架构师金雪锋:https://zhuanlan.zhihu.com/p/325923211论文链接:https://link.zhihu.com/?target=https%3A//arxiv.org/pdf/2010.14819.pdfhttps://https://link.zhihu.com/?target=https%3A//arxiv.org/pdf/2010.14819.pdfhttps://link.zhihu.com/?target=https%3A//arxiv.org/pdf/2010.14819.pdfhttps://link.zhihu.com/?target=https%3A//arxiv.org/pdf/2010.14819.pdfhttps://link.zhihu.com/?target=https%3A//arxiv.org/pdf/2010.14819.pdf0开源地址:https://link.zhihu.com/?target=https%3A//gitee.com/mindspore/mindspore/tree/master/model_zoo/research/cv/tinynet简介深度卷积神经网络(CNN)在许多视觉任务中取得了很大成功。然而,如果要在移动设备上部署AI模型,我们需要持续调整网络深度(模型层数)、宽度(卷积通道的数量)和图像分辨率这些网络结构要素来优化内存使用并减少延迟。EfficientNet在模型深度,宽度,图像分辨率这三个维度复合缩放来调整神经网络结构。然而EfficientNet更多关注在如何产生大体量的模型,轻量模型的设计有待更好的发掘。一个直接的方法是应用EfficientNet的缩放公式。例如,我们可以进一步缩小EfficientNet-B0,并得到一个具有200M FLOPs的EfficientNet-B-1。然而这种策略无法得到最有效的模型。我们随机生成了100个通过改变基线模型EfficientNet-B0的三维(模型深度,宽度,图像分辨率)得到的网络模型。这些模型的计算量小于或等于基线模型(图1)。我们发现这其中最佳模型的精度比用EfficientNet缩放公式得到的模型高出约2.5%。本文研究的是模型精度和三个维度(模型深度,宽度,图像分辨率)的关系并希望探索出比EfficientNet更优的模型压缩范式。首先,我们发现对于轻量模型,图像分辨率和模型深度比宽度更重要。然后我们指出,EfficientNet的复合放缩方法不再适合为移动设备设计轻量网络。因此,我们通过对于前沿模型(图1中的红线)的大量实验和观察探索了一个新的压缩模型的范式‘Tiny Formula’。具体来说,给定FLOPs上限,我们通过在前沿模型上进行高斯过程回归,并用‘Tiny Formula’计算最佳输入图像分辨率和模型深度。然后根据最大FLOPs的约束来确定模型的宽度。论文中所提出的‘Tiny Formula’简单有效:例如, TinyNet-A的Top1准确率为76.8% ,计算量约为339M FLOPs,而EfficientNet-B0类似性能需要约387M FLOPs。另外,仅24M FLOPs 的TinyNet-E在ImageNet上图像分类的准确率达到59.9%,比当前体量相当的MobileNetV3高约1.9%。该文章原创地研究了如何通过同时改变分辨率、深度和宽度来生成微小且有效的神经网络。图像分辨率,模型深度和宽度对精度的影响我们发现,高精度模型的输入图像分辨率大约在0.8到1.4之间。当r < 0.8时,分辨率越大,精度越高,而当r > 1.4时精度略微下降。在深度方面,高性能的模型深度从0.5到2不等。当固定计算量时,模型宽度与精度大致呈负相关。好模型主要分布在w < 1处。从图2中我们也发现EfficientNet-B-1精度只有75.8%,精度比相同计算量下的最佳模型要差很多。因此我们需要探索一种新的模型放缩公式,在计算量的约束下获得更好的模型。探索最优Tiny Formula为了寻找这样的函数,我们从[0.25,4]这个区间内对r, d, w进行随机采样,采样出n个参数组合。根据参数组合对基础模型的r, d, w进行改变,得到n个新模型,同时计算出n个新模型的计算量。我们根据计算量和精度,从这n个新模型中选出在帕累托前沿的m个模型(m <= n),这m个模型是我们需要的优秀模型,从而得到其r, d, w与计算量之间的关系。比如,我们得到三个关系如下所示:我们使用高斯过程回归来拟合上述3张图的3个曲线。以分辨率r为例,图中的m个点的横纵坐标分别为计算量FLOPs和分辨率其他2个曲线公式也可以通过类似的方式得到。得到了上述拟合曲线公式,用户只要输入想要的计算量c*,就可以得到预测的r*,d*,w*值。通过(r*,d*,w*)对基础模型EfficientNet的宽度、深度和输入分辨率进行改变,就可以得到计算量为c*的TinyNet模型。实验结果通过改变计算量系数c的值(c = {0.9, 0.5, 0.25, 0.13, 0.06})我们生成了5个轻量模型,TinyNet-A 到E。跟已有的方法相比,在同等计算量量的情况下,我们的方法能够得到性能更优的模型。其中,RA表示Random Augmentation, 一种自动数据增强的方法。MindSpore 代码实现相关训练与推理代码,以及使用方法已经开源在:https://link.zhihu.com/?target=https%3A//gitee.com/mindspore/mindspore/tree/master/model_zoo/research/cv/tinynet为了方便大家验证我们的结果,以及创新,我们将模型的结构,以及超参数的设置汇总到了相关代码仓的/script文件夹,我们同时提供了多卡分布式训练的启动脚本。参数设置以单卡训练脚本train_1p_gpu.sh为例:如果想切换其他的TinyNet模型,只需在—model的位置将模型从tinynet_c更改即可。相关模型结构定义在/src/tinynet.py中:其中EfficientNet-B0为基线模型,它的输入图像分辨率,宽度和深度三维值为(1,1,1)。TinyNet模型沿用了EfficientNet的模块化设计,其中又分为DepthwiseSeparableConv , InvertedResidual,SqueezeExcite,DropConnect,这些模块等。每一个模块都衍生自mindspore.nn.Cell。这些模块统一在GenEfficientNet中被调用,并依据用户给出的图像分辨率,宽度和深度三个数值生成神经网络。MindSpore的网络定义请参考:https://www.mindspore.cn/tutorial/training/zh-CN/master/use/defining_the_network.html数据集的加载定义在了/src/dataset.py中,主要使用了MindSpore强大的数据集加载和处理工具mindspore.dataset。具体使用方法大家可以参考:https://www.mindspore.cn/tutorial/training/en/master/use/load_dataset_image.html模型权重的指数移动平均(Exponential Moving Average),模型精度验证和训练数据的记录定义在了/src/callback.py。利用mindspore.train.callback模块,用户可以灵活地选择每一步训练或每一轮epochs后希望进行的操作,例如模型验证,Loss打印,模型保存,权重平均等。具体使用方法大家可以参考:https://www.mindspore.cn/doc/api_python/zh-CN/master/mindspore/mindspore.train.html最后,我们使用MindSpore Lite工具转换了模型权重,并测试了EfficientNet和TinyNet在华为P40上的推理时延。TinyNet-A比EfficientNet-B0的运行速度快15%,但其精度与EfficientNet-B0相似。TinyNet-E与EfficientNet-B-4相比,在同等时延下,精度提升3.2%。端测模型转换,部署等请参考:https://link.zhihu.com/?target=https%3A//www.mindspore.cn/lite本文转自:https://zhuanlan.zhihu.com/p/326022740
-
作为自然语言处理领域的主流模型,Transformer 近期频频出现在计算机视觉领域的研究中。例如 OpenAI 的 iGPT、Facebook 提出的 DETR 等,这些跨界模型多应用于图像识别、目标检测等高层视觉任务。而华为、北大、悉大以及鹏程实验室近期提出了一种新型预训练 Transformer 模型——IPT(Image Processing Transformer),用于完成超分辨率、去噪、去雨等底层视觉任务。该研究认为输入和输出维度相同的底层视觉任务更适合 Transformer 处理。预训练模型能否在视觉任务上复刻在自然语言任务中的成功?华为诺亚方舟实验室联合北京大学、悉尼大学、鹏城实验室提出底层视觉 Transformer,使用 ImageNet 预训练,在多项视觉任务上达到 SOTA。与自然语言任务相比,视觉任务在输入形式上有很大差别。Transformer 等模型在自然语言处理任务上展现出了强大的特征学习能力,使用大量数据进行预训练的策略获得了成功。因此,很多研究都在考虑如何在计算机视觉领域发挥 Transformer 模型与预训练的潜力。近日,华为、北大、悉大以及鹏程实验室的研究者提出了一个名为 IPT(Image Processing Transformer)的预训练 Transformer 模型,用于完成超分辨率、去噪、去雨等底层视觉任务。IPT 具备多个头结构与尾结构用于处理不同的任务,不同的任务共享同一个 Transformer 模块。预训练得到的模型经过微调即可在多个视觉任务上大幅超越对应任务上的当前最好模型。 论文链接:https://arxiv.org/pdf/2012.00364.pdfTransformer 真的比 CNN 要好吗?卷积神经网络(CNN)是计算机视觉领域中的常用模型,自然语言处理领域中出类拔萃的 Transformer 模型在应用到计算机视觉任务中时,真的能比 CNN 更好吗?该研究通过一系列实验回答了这个问题。首先,研究者展示了经过预训练的 IPT 模型在不同任务上微调后达到的性能。如图 1 所示,在多项底层视觉任务中,IPT 模型均取得了巨大的性能提升。例如,对于不同倍率的超分辨率任务,IPT 普遍能够提升 0.4dB,而对于去噪和去雨任务则提升更多,提升了 1.6-2.0dB。图 1:IPT 模型与当前各项任务最好结果的对比情况。为了更好地说明为什么要用 Transformer,研究者还设计了一个基于 CNN 的预训练模型作为对照,并在 DIV2K 数据集 2 倍超分辨率的任务上探索了不同预训练数据量对模型性能的影响。图 2 展示了不同的数据量对 CNN 和 Transformer 模型的影响。结果显示,在预训练数据有限时,CNN 模型能获得更好的性能。随着数据量的增大,基于 Transformer 模块的 IPT 模型获得了显著的性能提升,曲线趋势也展现了 IPT 模型令人期待的潜力。图 2:预训练数据量对 CNN 与 IPT 模型的影响。可以看出,Transformer 模型能够更充分地发挥大规模训练数据的优势。自然语言处理领域的成功经验在底层视觉任务上得到了验证。底层视觉任务如何使用 Transformer在自然语言任务中,Transformer 的输入是单词序列,图像数据无法作为输入。解决如何使用 Transformer 处理图像的问题是将 Transformer 应用在视觉任务的第一步。不同于高层视觉语义任务的目标是进行特征抽取,底层视觉任务的输入和输出均为图像。除超分辨率任务之外,大多数底层视觉任务的输入和输出维度相同。相比于高层视觉任务,输入和输出维度匹配这一特性使底层视觉任务更适合由 Transformer 处理。具体而言,研究者在特征图处理阶段引入 Transformer 模块,而图像维度匹配则交给了头结构与尾结构,如图 3 所示:图 3:IPT 模型结构。研究者首先将图片经过一个头结构变换为特征图:这些输出特征再经过整形和拼接操作,还原为与输入相同维度的特征图。如此处理得到的特征图会被送入一个尾结构,被解码为目标图像。有了头结构和尾结构负责维度变换,Transformer 模块可以专心地做特征处理。这使得多任务的扩展变得简单:对于不同的任务,只需要增加新的头结构与尾结构即可,多种任务之间的 Transformer 模块是共享的。为了适应多任务,研究者在 Transformer 的解码模块中加入了一个可学习的任务编码。底层视觉任务的预训练与微调Transformer 的成功离不开大量数据预训练带来的性能提升。在这篇论文中,针对底层视觉任务,研究者提出一种使用 ImageNet 数据集对模型进行预训练的方法。结果显示,经过预训练的模型只需要做一些简单微调即可适用于多种下游任务。研究者使用 ImageNet 数据集生成多种退化图像,构成多种底层视觉任务训练集。具体来说,对 ImageNet 数据集中的自然图像进行下采样即可得到用于超分辨率任务的训练数据;加入噪声可生成用于去噪任务的训练数据;加入雨痕可产生用于去雨任务的训练集等。利用这些人工合成的数据,配以对应任务的多头多尾结构,多个任务的训练数据同时进行训练,整个模型可以通过监督损失函数进行训练:除此之外,为了提升模型在未曾预训练过的任务上的性能(如不同倍率的超分辨率、不同噪声强度的去噪任务),研究者根据特征块之间的相关性引入了对比学习方法作为自监督损失函数。具体来说,来自于同一图像的特征块之间的特征应当相互接近,来自于不同图像的特征块应当远离。这一自监督损失函数如下所示:研究者表示,通过引入这一对比损失函数,模型能够在未经预训练的任务上展现超越传统方法的性能。经过预训练的 IPT 模型,只需要在特定任务的数据集上进行微调,即可在此任务上达到很好的效果。在微调阶段,只有特定任务所对应的头尾结构以及 Transformer 模块被激活训练,与此任务无关的头尾模块被暂时冻结。IPT 刷榜多项底层视觉任务为了证明 IPT 的有效性,研究者在多种底层视觉任务上测试了模型效果,包括 2 倍、3 倍和 4 倍的超分辨率任务、两种强度的去噪任务以及去雨任务。每个具体任务所采用的 IPT 模型均为同一个预训练模型在特定任务上微调得到的。另外,研究者还做了一系列对照实验来确定 Transformer、对比学习损失函数等不同模块的重要性。所有实验都是在英伟达 Tesla V100 GPU 和 PyTorch 上完成的。首先对于超分辨率任务,其预训练样本是将图像进行 bicubic 下采样得到的。研究者报告了在 Set5、Set14、B100 以及 Urban100 四个数据集上的结果,如表 1 所示。表 1:超分辨率任务实验结果。可以看出,IPT 模型在所有设定下均取得了最好的结果。尤其是在 Urban100 数据集上,对比当前最好的超分辨率算法,IPT 模型展现出了大幅度的优势。如表 2 和表 3 所示,在去噪和去雨任务上,IPT 模型也展现出了类似的性能。表 2:去噪任务实验结果。表 3:去雨任务实验结果。下图展示了不同方法在去噪、去雨任务中的处理结果,从中可以看出 IPT 模型的输出结果更接近真值图像:泛化性能随后研究者进一步测试了预训练模型的泛化性能。具体做法是,将 IPT 模型在没有预训练过的任务上进行微调后测试。在表 4 中,对于噪声强度为 10 和 70 的设定下(预训练为 20 和 50),IPT 模型依旧展现出巨大的优势,展示了预训练模型良好的泛化性。表 4:未经预训练任务上的实验结果。控制变量研究除此之外, 为了探究对比损失函数对模型学习表示能力的影响,研究者在 2 倍超分辨率任务上测试了对比损失函数占不同比例时模型的性能。表 5 展示了模型在 Set4 数据集上不同的对比损失函数权重得到的 PSNR。结果显示,相比不加入此损失(λ=0)的情况,对比损失函数能够进一步提升模型学习表示的能力。表 5:对比损失函数的影响。从实验效果中可以看出,Transformer 模型在底层视觉任务上展现出了超过 CNN 的实力,说明 Transformer 在视觉任务中是可行的。不仅如此,它所表现出的因大量训练数据而带来的性能提升,展现出更大数据量、更大的模型在视觉领域的巨大潜力。这一方向值得更多的研究者做更多深入探索。表 5:对比损失函数的影响。从实验效果中可以看出,Transformer 模型在底层视觉任务上展现出了超过 CNN 的实力,说明 Transformer 在视觉任务中是可行的。不仅如此,它所表现出的因大量训练数据而带来的性能提升,展现出更大数据量、更大的模型在视觉领域的巨大潜力。这一方向值得更多的研究者做更多深入探索。
-
声明:本文首发于华为NAIE《网络人工智能园地》微信公众号,如有转载,请注明出处。微信公众号二维码为:http://weixin.qq.com/r/yx385OnEb7QQra2H90jZweixin.qq.com本文介绍一种特殊场景下的迁移算法:隐私保护下的迁移算法。首先,本文稍微回顾一下传统迁移算法的流程、特性和局限之处,然后文章介绍几种解决当源域数据有某些访问限制的场景下实现迁移的算法。具体包括:ADDA-CVPR2017,FADA-ICLR2020,SHOT-ICML2020。传统迁移算法UDDA首先说明这里说的传统迁移算法,主要指深度域适应(Deep Domain Adaptation),更具体的是无监督深度域适应(Unsupervised Deep Domain Adaptation, UDDA)。因为UDDA是最为常见,也是大家广泛关注的设定,因此这方面的工作远远多于其余迁移算法的设定。先介绍一下UDDA具体是做什么的:给定一个目标域(Target Domain),该域只有无标记数据,因此不能有监督地训练模型,目标域通常是一个新的局点、场景或者数据集;为了在目标域无标记数据的情况下建立模型,可以借助源域(Source Domain)的知识,源域通常是已有局点、场景或者数据集,知识可以是源域训练好的模型、源域的原始数据、源域的特征等。借助有标记信息的源域,目标域上即便没有标记数据,也可以建立一个模型。使得该模型对目标域数据有效的关键难点在于源域和目标域存在数据分布的差异,称之为域漂移(Domain Shift),如何去对齐源域和目标域的数据是UDDA解决的主要问题。UDDA通常包含下面的三种框架:首先,源域和目标域的数据(圆柱)会经过特征提取器(Encoder)提取特征(矩形),然后各种办法会对源域和目标域的特征进行操作,使得源域和目标域上数据的特征对齐。这里值得一提的是,UDDA通常假设源域和目标域的类别是一样的,比如源域和目标域都是去分类0-9十个手写数字,只不过源域和目标域的手写风格不一样。对源域和目标域特征进行操作的办法包括三种类别:基于统计对齐:使用各种统计量对齐源域和目标域特征的分布,比如对齐核空间均值(MMD Loss)、对齐协方差矩阵(CORAL Loss)等;基于对抗对齐:建立一个域分类器(Domain Classifier)作为判别器(Discriminator),目的要尽可能将源域和目标域的特征区分开来,使用梯度反转(Gradient Reversal Gradient,GRL)可以促使特征提取器提取和领域无关(Domain Invariant)的特征;基于重构对齐:将源域和目标域的特征通过同一个生成网络进行生成相应的数据,通过假设只有分布接近的样本才可以使用同一个网络生成数据对齐源域和目标域特征。关于以上几种UDDA的具体算法可以参加以前的文章:https://zhuanlan.zhihu.com/p/205433863zhuanlan.zhihu.com这里本文只给出UDDA的几个特性:源域数据可获得:UDDA假设源域数据存在并且可以获得;源域目标域数据可混合:UDDA通常假设源域和目标域数据可以在一起处理,即可以放在同一个设备上进行运算;训练预测过程是Transductive的:目标域数据必须和源域数据一同训练才可以使得特征提取器提取领域无关的特征,才可以将源域的模型迁移到目标域,因此当一批新的目标域的数据到来的话,并不能直接使用源域模型进行预测。总的来说,传统的UDDA方法假设源域数据可获得、源域目标域数据可混合、训练过程Transductive。然而,有一些场景下,源域数据不可获得,或者源域数据不可以外传,这种情况下如何进行迁移呢?首先,这里需要注意的是,源域数据不能外传和源域数据不可获得是两种情况,前者假设源域数据存在,但是不可以和目标域数据放在一起,后者是源域数据根本就不存在了。ADDAADDA是CVPR2017的一篇工作,来自论文《Adversarial Discriminative Domain Adaptation》,作者信息截图如下:一作Eric Tzeng来自于加利福尼亚大学伯克利分校,代表作有DDC和ADDA;二作Judy Hoffman来自斯坦福大学,代表作CyCADA,以及多篇在多领域迁移方面的理论文章,比如NeurIPS 2018的《Algorithms and Theory for Multiple-Source Adaptation》;三作Kate Saenko是波斯顿大学计算机科学计算机视觉组(Computer Vision and Learning Group,CVL)的Leader,是一名女性学者,Baochen Sun,Xingchao Peng,Kuniaki Saito等人都在该组深造或者深造过。CVL代表作有(个人评定,以下文章个人在学习DA的过程中或多或少阅读或者研究过):Xingchao Peng, Zijun Huang, Yizhe Zhu, Kate Saenko: Federated Adversarial Domain Adaptation. ICLR 2020Xingchao Peng, Yichen Li, Kate Saenko: Domain2Vec: Domain Embedding for Unsupervised Domain Adaptation. ECCV (6) 2020: 756-774Shuhan Tan, Xingchao Peng, Kate Saenko: Generalized Domain Adaptation with Covariate and Label Shift CO-ALignment. CoRR abs/1910.10320 (2019)Xingchao Peng, Zijun Huang, Ximeng Sun, Kate Saenko: Domain Agnostic Learning with Disentangled Representations. ICML 2019: 5102-5112Xingchao Peng, Qinxun Bai, Xide Xia, Zijun Huang, Kate Saenko, Bo Wang: Moment Matching for Multi-Source Domain Adaptation. ICCV 2019: 1406-1415Kuniaki Saito, Donghyun Kim, Stan Sclaroff, Trevor Darrell, Kate Saenko: Semi-Supervised Domain Adaptation via Minimax Entropy. ICCV 2019: 8049-8057Kuniaki Saito, Yoshitaka Ushiku, Tatsuya Harada, Kate Saenko: Adversarial Dropout Regularization. ICLR (Poster) 2018Xingchao Peng, Ben Usman, Neela Kaushik, Dequan Wang, Judy Hoffman, Kate Saenko: VisDA: A Synthetic-to-Real Benchmark for Visual Domain Adaptation. CVPR Workshops 2018: 2021-2026Eric Tzeng, Judy Hoffman, Kate Saenko, Trevor Darrell: Adversarial Discriminative Domain Adaptation. CVPR 2017: 2962-2971Baochen Sun, Kate Saenko: Deep CORAL: Correlation Alignment for Deep Domain Adaptation. ECCV Workshops (3) 2016: 443-450Baochen Sun, Jiashi Feng, Kate Saenko: Return of Frustratingly Easy Domain Adaptation. AAAI 2016: 2058-2065Eric Tzeng, Judy Hoffman, Trevor Darrell, Kate Saenko: Simultaneous Deep Transfer Across Domains and Tasks. ICCV 2015: 4068-4076回归正题,ADDA的训练流程图如下:首先是预训练阶段(Pre-training Stage),源域上利用有标记数据训练,采用交叉熵损失:其中 为源域的特征提取器, 为源域的分类器。然后是对抗对齐阶段(Adversarial Adaptation Stage),将源域的特征提取器拷贝给目标域 ,并且将分类器 固定住迁移到目标域。然后就是对 根据目标域数据进行微调,当且仅当目标域特征提取器 在目标域提取的特征和源域特征提取器 在源域数据提取的特征相似时,源域的分类器才可以很好地适应目标域,即下面几个公式的目的主要是使得 。简单的方法仍然是使用对抗进行训练。第一步训练域判别器(Discriminator)将源域的特征和目标域的特征进行区分开, 代表域判别器:第二步,训练 ,使得 让判别器尽可能分不开:重复以上两步,直到收敛。可以看出以上过程中, 源域特征提取器 只在源域预训练阶段使用到,然后拷贝给目标域,目标域微调特征提取器。换句话说,源域训练好的模型,包括特征提取器和分类器,传输到目标域之后,目标域只微调特征提取器,使得特征提取器提取的特征单向向源域的特征对齐,分类时使用的仍然是源域的分类器。为什么说这个方法可以推广到隐私保护呢?因为可以看到,源域的数据只在预训练阶段利用到,且后面对齐的过程中只用到了源域的特征 ,而不是 ,后者需要访问到源域原始数据。总的来说,ADDA容许源域和目标域的特征提取器不一致,将 参数解耦开来,并且训练过程中其实只用到了源域的特征。如果,源域数据和目标域数据不在同一设备上,假设源域数据的特征可以发送出去的话,该方案可以做到隐私保护。FADA正如上述介绍的CVL组,Xingchao Peng将ADDA扩充到多域版本,并且提出了FADA。FADA来自ICLR2020的《Federated Adversarial Domain Adaptation》,论文首页截图如下:该文提出了一个新的场景FADA,即联邦学习下的多域迁移。假设有很多个源域,每个源域的数据分布在单独的设备上,原始数据不能外传,如何在这种情况下将其模型复用到目标域呢?简而言之,如何在数据不能被发送出去的约束下进行特征对齐呢?该文假设各个领域的特征可以被发送出去,和ADDA假设一致。假设有 个源域,每个源域上都训练了一个特征提取器 和分类器 ,首先对于目标域的特征提取器 和分类器 ,使用联邦学习(Federated Learning)里面的加权平均方法:其中 衡量了每个源域对目标域的贡献,一般需要满足 。FADA中提到了一种动态加权(Dynamic Attention)的方式,这里不过多介绍,主要是通过源域当前模型融合到目标域之后对目标域特征区分度的提升幅度作为衡量的标准。简单的情况下,可以取 。总之,目标域上由于没有标记,不可能训练出 ,需要通过源域的模型进行加权平均得到。接下来,FADA使用特征提取器在各个域上提取特征,即 ,然后假设这些特征可以传输到同一个设备上,就可以在该设备上训练一个域判别器(Domain Identifier, DI),注意这里的判别器和ADDA中不一样,因为涉及到多个域,此处的域判别器是多分类器,具体而言是 分类。训练域判别器的损失函数如下:其中 是向量的第 项,即上述目标会训练域判别器使得第 源域的数据会被预测为第 类别,且目标域样本被预测为第 类。训练好域判别器之后,将 发送到各个源域所在的设备,然后训练各自的特征提取器 去混淆 :FADA总的框架图如下,该框架融合了很多方法,还包括特征解耦(Feature Disentangle)等等,这里不过多介绍。总的来说,FADA将多个源域和目标域的特征发送到一个指定的设备,在该设备上训练一个域判别器,然后将域判别器下发到各个源域作为对抗项促使相应的特征提取器提取领域无关的特征。可以说,FADA是ADDA的多领域扩展版本。SHOTSHOT是比较有意思的一篇工作,名称是《Do We Really Need to Access the Source Data? Source Hypothesis Transfer for Unsupervised Domain Adaptation》,来自ICML2020,作者信息截图如下:如果说ADDA和FADA都是假设源域数据不可以被发送出设备的话,SHOT假设源域数据获取不到,即源域数据丢失或者不存在。那么在只有源域模型和目标域众多无标记数据的情况下,如何迁移呢?SHOT解决了这个问题。首先SHOT指的是Source Hypothesis Transfer,Source Hypothesis指的是源域模型的分类器。SHOT和ADDA有一个一致的地方就是,都固定住了源域模型的分类器,微调源域的特征提取器。ADDA通过对抗损失(假设可以访问到源域数据的特征)进行微调目标域特征提取器,而SHOT则是通过伪标签(Pseudo Label)自监督地训练。首先,SHOT对源域模型进行有监督地训练,源域模型可以记为 ,其中 分别是源域的特征提取器和分类器,训练时采用标记平滑(Label Smoothing),促使训练的模型具有更好的可迁移性、泛化性。然后,将源域模型拷贝到目标域, ,固定住 ,微调 。SHOT首先采用一个常见的信息最大化(Information Maximization, IM)损失,促使目标域上每个样本的分类概率的熵尽可能小,所有样本预测的概率平均值尽可能均匀。假设目标域样本 预测的结果为 ,其中 是一个Softmax的函数。那么记 为目标域样本预测概率的平均值(可以计算一个Batch的样本预测概率的平均值)。那么IM损失为:这一项损失并不能完全让目标域的特征提取器完全训练得当,因此需要使用下面的伪标签技术进行训练。伪标签技术很直观,就是利用当下的模型对无标记样本打标签,然后取预测结果置信度最高的部分样本来打标签,然后用这些伪标签的数据来继续训练这个模型。比如,对于目标域样本 ,根据模型预测概率的最大值 进行排序,选择最大的一部分对其打标签为 。直接使用伪标签训练很容易带来误差累计问题,因此需要尽可能使得伪标签打得准确,可以使用一个标签精炼(Label Refinery)的过程。具体而言包括:其中 是第 类样本的类中心, 是距离函数。以上几个公式可以看作是几步K-Means操作,第一个公式根据模型输出的概率值和每个样本的特征向量进行Soft加权得到类别中心,第二个公式根据每个样本和各个类中心的距离打标签,第三个公式是Hard加权更新类中心,第四个公式是根据距离打标签。该迭代可以重复很多次,但是一般来说使用这两步迭代之后的伪标签就会比较准确了。以上就是标签精炼的过程,主要是指使用目标域样本的关系(聚簇结果)来对伪标签进行进一步调整,而不仅仅是利用模型的预测结果。打了伪标签之后,模型可以根据交叉熵损失进行训练,综合IM损失,可以将模型性能提升至很高。总结总结一下,传统UDDA以及本文主要介绍的ADDA、FADA和SHOT可以使用下图来区分:参考文献Eric Tzeng, Judy Hoffman, Kate Saenko, Trevor Darrell: Adversarial Discriminative Domain Adaptation. CVPR 2017: 2962-2971Xingchao Peng, Zijun Huang, Yizhe Zhu, Kate Saenko: Federated Adversarial Domain Adaptation. ICLR 2020Jian Liang, Dapeng Hu, Jiashi Feng: Do We Really Need to Access the Source Data? Source Hypothesis Transfer for Unsupervised Domain Adaptation. CoRR abs/2002.08546 (2020)
-
本文来源:https://mp.weixin.qq.com/s/H1zg3ezZDdXQ-IQ7ki0Mtw国际人工智能顶级会议NeurIPS 2020(Conference on Neural Information Processing Systems, 神经信息处理系统大会)在12月6日至12日举行。本届会议无论是论文投稿数量还是接受率都创下了历史记录。随着卷积神经网络的广泛使用和在视觉类应用的巨大成功,如何克服计算和存储资源限制将卷积神经网络部署到智能手机和穿戴设备等端侧设备的模型轻量化技术越发重要。本文将对华为诺亚方舟实验室入选NeurIPS 2020的模型轻量化技术工作进行介绍,涵盖了剪枝、结构蒸馏以及量化等几个方向,并且放出对应MindSpore首发端侧模型获取链接↓https://www.mindspore.cn/resources/hubSCOP:Scientific Control for Reliable Neural Network Pruning 现有的剪枝方法基于各种假设条件近似估计神经网络节点对整体网络的重要性然后进行节点剪枝,往往存在结果不可靠而导致网络精度下降。 华为诺亚方舟实验室和北京大学联合提出了一种科学控制机制最小化剪枝节点对网络输出的影响。采用这种剪枝方法,能够实现ImageNet数据集上仅损失ResNet101网络0.01%的top-1准确率,模型参数量和计算量分别减少57.8%和60.2%,显著优于SOTA方法[1]。 原理对于剪枝方法,最重要的过程是评估卷积神经网络节点的重要性,在尽量不影响预训练网络性能的前提下删除不重要的网络节点。一种典型的节点重要性评估假设是权重Norms越小节点重要性低进而被剪掉[2][3]。考虑到输入数据,有的剪枝方法评估网络节点和最终损失函数之间的关系并用泰勒展开进行近似,保留与最终损失函数关系更密切的节点[4]。但是这些方法都会不可避免的引入大量潜在影响因子,最终影响剪枝过程,例如不同信道之间的相互依赖可能误导基于权重Norms的方法,因为一些不含重要信息的节点权重Norms很大,基于输入数据的方法的权重重要性对数据很敏感,剪枝结果不稳定。结果将本文提出的SCOP在公开数据集ImageNet上进行实验,对ResNet系列网络预训练模型进行剪枝验证了SCOP的有效性,实验结果如下表1.1。相比于现有SOTA剪枝方法GAL[5]和PFP[6],SCOP方法得到的剪枝后网络无论是网络精度还是模型大小即参数量减少比例都表现出很大的优势。使用SCOP算法在Oxford-IIIT Pet数据集对ResNet50网络剪枝的网络resnet-0.65x_v1.0_oxford_pets已基于MindSpore首发,可分别从MindSpore modelzoo 和Hub获取训练代码和模型。论文链接:https://proceedings.neurips.cc/paper/2020/file/7bcdf75ad237b8e02e301f4091fb6bc8-Paper.pdf代码链接:https://gitee.com/mindspore/mindspore/tree/master/model_zoo/research/cv/resnet50_adv_pruning模型链接:https://www.mindspore.cn/resources/hub/details?noah-cvlab/gpu/1.0/resnet-0.65x_v1.0_oxford_pets ResNet通过引入残差连接,使得我们可以有效地训练几十到上百层的网络结构。但与此同时,也不可避免的引入了额外的计算消耗。比如当进行在线推理时,ResNet50中的残差占据了特征图整体内存消耗的大约40%,因为之前网络层的特征结果无法被释放,直到后续的残差计算结束。华为诺亚方舟实验室提出了一种新的CNN模型训练方法—基于残差蒸馏的联合训练框架Joint-training framework based on Residual Distillation(JointRD),希望在训练的时候引入残差连接保证训练效果,但在部署时去掉残差提升推理速度。通过在ImageNet/CIFAR10/CIFAR100等数据上的实验表明,利用JointRD训练得到的没有残差连接的plainCNN能够达到和ResNet相同精度的同时,性能提升1.4倍,内存消耗降低1.25倍。预训练plain-CNN在MIT 67和Caltech 101的fine-tuning结果也证明了特征的迁移泛化性。联合训练框架介绍 主要动机CNN模型当中引入残差连接的主要动机是避免梯度消失及降低优化难度,在最近的多篇研究中已经证明了残差连接在训练过程中对梯度的影响。因此我们认为没有残差的plain-CNN模型表现差是因为优化方法差而非模型本身的表达能力的限制。通过在mobile NPU上对比去掉残差的plain-CNN 50和保留残差的ResNet50内存消耗和时延,我们发现去掉残差后内存消耗降低19%,时延降低30%。基于以上结论,我们提出了一种可能的解决方案,利用ResNet为plain CNN的训练过程提供更好的梯度。因此我们提出了JointRD (Joint-training framework based on Residual Distillation),在这个框架中我们通过将plain CNN中的一个stage同时连接到它之后的stage和ResNet之后的stage达成上述训练目标。联合训练框架保证了残差连接使梯度更易反传的效果,但残差连接还有另外一个功能就是保护从前一层提取到的特征。为了达成相同的效果,我们采用Dirac delta初始化方法[8]来初始化student网络的权重。对于teacher网络的权重,我们使用预训练好的ResNet模型来进行初始化,并在整个训练过程中停止对这部分权重的更新。实验结果通过三种规模的网络plain-CNN18, plain-CNN34, plain-CNN50在CIFAR-10和CIFAR-100上的实验证明了联合训练方法JointRD有效性。如表2.1所示,JointRD可以将Plain-CNN训练达到和对应的ResNet相同的精度。同时我们还对比了单纯训练plain-CNN(见"Naive"列)以及只使用KD (MSE) loss和plain-CNN的交叉熵loss(见"KD (MSE) +Dirac"列)。在表2.2中,我们对比了利用JointRD训练得到的plain-CNN50,利用剪枝方法[9]剪枝40%后的ResNet50,以及ResNet50本身的精度、时延和内存消耗。可以看出在plain-CNN50在各个维度均优于直接剪枝(实验细节请参考论文原文[7])。目前由JointRD训练得到的plain-CNN18/ plain-CNN34/plain-CNN50 MindSpore端侧模型均已上线MindSpore Hub,感兴趣的可以下载体验。论文链接:https://proceedings.neurips.cc/paper/2020/file/657b96f0592803e25a4f07166fff289a-Paper.pdfPlain-CNN18模型链接:https://www.mindspore.cn/resources/hub/details?noah-cvlab/gpu/1.0/plain-CNN-resnet18_v1.0_cifar_10Plain-CNN34模型链接:https://www.mindspore.cn/resources/hub/details?noah-cvlab/gpu/1.0/plain-CNN-resnet34_v1.0_cifar10Plain-CNN50模型链接:https://www.mindspore.cn/resources/hub/details?noah-cvlab/gpu/1.0/plain-CNN-resnet50_v1.0_cifar10Searching for Low-Bit Weights in Quantized Neural Networks神经网络量化因为可以减少计算消耗和内存占用,在模型部署特别是端侧设备部署中被广泛应用,例如相较于传统的32-bit模型网络,二值化网络可以直接将模型压缩32倍,同时如果采用二值运算可以大大降低计算复杂度(如XNORNet 可以达到57倍加速[10])。 传统的量化方法通常不是直接可导的,而是通过近似梯度进行训练,这增加了量化网络的优化难度以及量化网络和原始网络间的精度差距。相较于全精度(32-bit 浮点数)权值,低比特权值只有很小的数值空间,如4-bit量化只有2^4=16种可能的量化取值。 因此,我们提出了一种全新的可导的量化方法Searching for Low-Bit Weights (SLB),将权值量化转变为可能量化取值的搜索。具体来讲就是将每个权值表示成所有可能取值空间的概率分布,在训练过程中优化这个概率分布,在推理过程中选取概率最大的值作为量化后的值。在图像分类和超分任务的多个benchmark上的实验证明,通过SLB方法量化后的网络性能超越已有SOTA结果。 方法介绍 实验结果表3.1和表3.2比较了我们的方法和其他SOTA量化方法BNN, XNORNet, DoReFa, DSQ, SQ, and LQ-Net在VGG-Small和ResNet20两个不同模型上的效果。如表中结果所示,W/A分别表示weight和activation的量化位宽,在不同量化位宽下,我们的方法都超越了其他SOTA方法。具体的实验细节请参考论文原文[12]。VGG-Small在CIFAR10上基于2-bit weight和2-bit activation的量化端侧模型目前已在MindSpore Hub开源首发,感兴趣的可以下载体验。论文链接:https://proceedings.neurips.cc/paper/2020/file/2a084e55c87b1ebcdaad1f62fdbbac8e-Paper.pdf模型链接:https://www.mindspore.cn/resources/hub/details?noah-cvlab/gpu/1.0/VGG-Small-low%20bit_cifar10参考文献[1] Yehui Tang,Yunhe Wang,Yixing Xu,Dacheng Tao, Chunjing Xu,Chao Xu,Chang Xu. SCOP:Scientific Control for Reliable Neural Network Pruning. In 34th Conference on Neural Information Processing Systems (NeurIPS 2020), 2020. [2] Hao Li, Asim Kadav, Igor Durdanovic, Hanan Samet, and Hans Peter Graf. Pruning filters for efficient convnets. In 5th International Conference on Learning Representations, ICLR 2017, Toulon, France, April 24-26, 2017, Conference Track Proceedings. OpenReview.net, 2017. [3] Yang He, Guoliang Kang, Xuanyi Dong, Yanwei Fu, and Yi Yang. Soft filter pruning for accelerating deep convolutional neural networks. In Proceedings of the 27th International Joint Conference on Artificial Intelligence, pages 2234–2240, 2018. [4] Pavlo Molchanov, Arun Mallya, Stephen Tyree, Iuri Frosio, and Jan Kautz. Importance estimation for neural network pruning. In Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition, pages 11264–11272, 2019. [5] Shaohui Lin, Rongrong Ji, Chenqian Yan, Baochang Zhang, Liujuan Cao, Qixiang Ye, Feiyue Huang, and David Doermann. Towards optimal structured cnn pruning via generative adversarial learning. In Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition, pages 2790–2799, 2019. [6] Lucas Liebenwein, Cenk Baykal, Harry Lang, Dan Feldman, and Daniela Rus. Provable filter pruning for efficient neural networks. In International Conference on Learning Representations, 2020. [7] Guilin Li, Junlei Zhang, Yunhe Wang, Chuanjian Liu, Matthias Tan, Yunfeng Lin, Wei Zhang, Jiashi Feng, Tong Zhang. Residual Distillation: Towards Portable Deep Neural Networks without Shortcuts. Accepted by NeurIPS 2020 [8] Sergey Zagoruyko and Nikos Komodakis. Diracnets: Training very deep neural networks without skip-connections. arXiv preprint arXiv:1706.00388, 2017. [9] Zhuang Liu, Jianguo Li, Zhiqiang Shen, Gao Huang, Shoumeng Yan, and Changshui Zhang. Learning efficient convolutional networks through network slimming. In Proceedings of the IEEE International Conference on Computer Vision, pages 2736–2744, 2017. [10] Mohammad Rastegari, Vicente Ordonez, Joseph Redmon, and Ali Farhadi. Xnor-net: Imagenet classification using binary convolutional neural networks. ECCV, 2016 [11] Matthieu Courbariaux, Yoshua Bengio, and Jean-Pierre David. Binaryconnect: training deep neural networks with binary weights during propagations. NeurIPS, 2015 [12] Zhaohui Yang, Yunhe Wang, Kai Han, Chunjing Xu, Chao Xu, Dacheng Tao, Chang Xu. Searching for Low-Bit Weights in Quantized Neural Networks. Accepted by NeurIPS 2020.
-
华为云大赛资讯:【限时训练营】华为云联合深度之眼官方平台,为本次参赛学员提供比赛指导和基础课程带学服务。报名课程 【2020精彩大赛回顾】感谢您与我们一起成长,华为云大赛战队风采展播。展播查看【前沿快讯】华为云最新力作入选AAAI 2021:揭秘个性化联邦学习框架。文章链接【技术干货】AI顶会连发7篇论文,华为云实现人工智能多领域新突破。文章链接
-
近日,北京智源人工智能研究院和清华大学研究团队联合发布了以中文为核心的大规模预训练语言模型 CPM-LM,参数规模达 26 亿,预训练中文数据规模 100 GB。自 2018 年谷歌发布 BERT 以来,预训练模型在自然语言处理(NLP)领域逐渐成为主流。今年 5 月份,OpenAI 推出的史上最大 AI 模型 GPT-3更是引起了大量讨论。但是,目前 NLP 领域的预训练模型多针对英语语言,以英语语言数据为训练数据,例如 GPT-3:用于训练 GPT-3 的数据集。近日,北京智源人工智能研究院和清华大学研究团队合作开展了一项名为「清源 CPM (Chinese Pretrained Models)」的大规模预训练模型开源计划,旨在构建以中文为核心的大规模预训练模型。首期开源内容包括预训练中文语言模型和预训练知识表示模型,可广泛应用于中文自然语言理解、生成任务以及知识计算应用,所有模型免费向学术界和产业界开放下载,供研究使用。清源 CPM 主页:https://cpm.baai.ac.cn/清源 CPM Github 托管代码主页:https://github.com/TsinghuaAI/模型特点根据清源 CPM 主页介绍,该计划发布的预训练模型具备以下特点:模型规模大:本次发布的CPM-LM 参数规模达 26 亿,预训练中文数据规模 100 GB,使用了 64 块 V100 GPU,训练时间约为 3 周;CPM-KG 的参数规模为 217 亿,预训练结构化知识图谱为 WikiData 全量数据,包含近 1300 个关系、8500 万实体、4.8 亿个事实三元组,使用了 8 块 V100 GPU 训练时间约为 2 周。语料丰富多样:收集大量丰富多样的中文语料,包括百科、小说、对话、问答、新闻等类型。学习能力强:能够在多种自然语言处理任务上进行零次学习或少次学习,并达到较好的效果。行文自然流畅:基于给定上文,模型可以续写出一致性高、可读性强的文本,达到现有中文生成模型的领先效果。在模型训练方面,CPM 模型预训练过程分布在多块 GPU 上,采用层内并行的方法进行训练,并基于当前已有的成熟技术,减少同步提高通讯速率。在硬件设施方面,为训练该 CPM 模型,共有 64 块 V100 显卡投入使用。经过预训练的 CPM 模型可以用来促进诸多下游中文任务,如对话、论文生成、完形填空和语言理解等。为了促进中文自然语言处理研究的发展,该项目还提供了 CPM-LM (2.6B) 模型的文本生成代码,可用于文本生成的本地测试,并以此为基础进一步研究零次学习 / 少次学习等场景,详情参见项目 GitHub 主页。模型性能清源 CPM 使用新闻、百科、对话、网页、故事等不同类型的中文语料数据进行预训练。在多个公开的中文数据集上的实验表明,清源 CPM 在少样本或无样本的情况下均能够实现较好的效果。中文成语填空 ChIDChID 是 2019 年清华大学对话交互式人工智能实验室(CoAI)收集的中文成语填空数据集,其目标是对于给定的段落,在 10 个候选项中选择最符合段意的成语进行填空。其中有监督设定是指在 ChID 的训练集上进行训练,随后在测试集上测试;无监督设定是指不经过任何额外训练,直接使用预训练模型进行测试。具体做法是,将候选项依次填入段落中,计算填充后段落的困惑度 (Perplexity),选择困惑度最小的候选项作为预测结果。表中汇报了预测的准确率,可以看到,CPM (大) 在无监督设定下甚至达到了比有监督 CPM (小) 更好的结果,反映出清源 CPM 强大的中文语言建模能力。对话生成 STCSTC 是 2015 年华为诺亚方舟实验室提出的短文本对话数据集,要求在给定上文多轮对话的条件下预测接下来的回复。其中 CDial-GPT 是清华大学对话交互式人工智能(CoAI)实验室 2020 年提出的中文对话预训练模型。用于衡量多样性的 Dist-n 指标的两个数字分别是所有不重复的 N-Gram 的数量及占所有 N-Gram 的比例。可以看到,在无监督的设定下,清源 CPM 具有更好的泛化性,在有监督设定下,清源 CPM 能达到比 CDial-GPT 更优的效果,尤其在多样性指标上表现更佳。文本分类清源 CPM 使用头条新闻标题分类(TNEWS,采样为 4 分类)、IFLYTEK 应用介绍分类(IFLYTEK,采样为 4 分类)、中文自然语言推断(OCNLI,3 分类)任务作为文本分类任务的基准。具体做法是,先输入分类样本,再输入「该文章的类别为 / 该介绍的类别为 / 两句话的关系为」,要求模型直接生成标签,四个标签中概率最高的标签作为预测结果。在无监督设定下,不同规模的清源 CPM 在文本分类任务上的精确度如下表所示:清源 CPM 能够在无监督的设定下达到比随机预测好得多的精确度(TNEWS/IFLYTEK/OCNLI 随机预测精确度分别为 0.25/0.25/0.33)。自动问答CPM 使用 DuReader 和 CMRC2018 作为自动问答任务的基准,要求模型从给定段落中抽取一个片段作为对题目问题的答案,其中 DuReader 由百度搜索和百度知道两部分数据组成。在无监督的设定下,不同规模的 CPM 模型的表现如下表所示:其中单样本是指在测试时,从数据集中随机抽取一个正确的「(段落,问题,答案)」三元组,插入到用于评价的样例前,作为 CPM 模型生成答案的提示;零样本是指直接使用 CPM 模型预测给定段落和问题的答案。在单样本设定下,CPM 能从给定的样本中学习到生成答案的模式,因此效果总是比零样本设定更好。由于模型的输入长度有限,多样本输入的场景将在未来进行探索。模型效果展示我们可以从以下示例中,观察 CPM 预训练中文语言模型的效果。比如基于对单个常识性问题的学习,依照规律进行提问和正确回答:根据前文真实的天气预报,继续报道天气预报(不保证正确性):执行数理推理:甚至续写《红楼梦》片段:据了解,清源 CPM 未来计划开源发布更大规模的预训练中文语言模型、以中文为核心的多语言预训练模型、融合大规模知识的预训练语言模型等。本文转载自:https://news.51cto.com/art/202011/632184.htm?pc
-
前面我们通过对论文中的公式详细解读,一步步推导了XGBoost的优化目标以及建树方法。下面我们就来动手实践,拿真实的数据来手动计算,并且使用python来实现一个简易的XGBoost。01 手动计算还原xgboost的过程XGBoost的建树过程包括下面几个关键步骤。计算分裂前样本的G,H(每个样本的g,h求和)贪心枚举每个特征每个值做为分隔条件计算分隔后左右节点的G_l,H_l,G_r,H_r,算出Gain更新最大增益Gain_max,更新分隔点。最终得到最优分隔点。根据上述过程递归建树直到终止条件。计算叶节点的权重w在建完一个树后,再建下棵树时,注意G/H/Gain的计算用到的预测值要进行更新,对之前的所有树的预测值求和可以得到建下棵树时的。这里我们使用一个简单的UCI数据集 http://archive.ics.uci.edu/ml/datasets/Container+Crane+Controller+Data+Set数据集的样本条数只有15条,2个特征。具体如下:import pandas as pddf = pd.read_csv('1.csv',index_col=0)# df = pd.read_clipboard(index_col=0) 可以直接复制下面这个表格后使用read_clipboard读成DataFrame对于二分类问题概率是预测值经过Sigmoid函数变换后得到的,默认预测概率为0.5,也就是默认的预测值为0。def log_loss_obj(preds, labels): preds = 1.0 / (1.0 + np.exp(-preds)) grad = preds - labels hess = preds * (1.0 - preds) return grad, hessbase_predict = np.zeros_like(df.y)g,h = log_loss_obj(base_predict,df.y.values) # 计算每个样本的g和hdf['g'], df['h'] = g,hdf首先对特征x1上的不同的值进行枚举分裂增益。特征一总共有以下几个取值:sorted(df.x1.unique())# [1, 2, 3, 6, 7, 8, 9, 10]对x1的取值进行排序后,最小值为1,显然没有样本的x1特征值<1,以x1划分相当于没有进行划分,因此从x1=2进行划分。def split_data(df, split_feature, split_value): left_instance = df[df[split_feature] < split_value] right_instance = df[df[split_feature] >= split_value] return left_instance, right_instanceleft_instance, right_instance = split_data(df,'x1',2)left_instance.index.tolist(),right_instance.index.tolist()# ([1, 4], [2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15])可以看到样本1,4被划分到了左侧,其余样本划分到了右侧。对划分后的数据计算G/H,并求出分裂后的增益Gain为0.055727554179566596。reg_lambda = 1G,H = df.g.sum(), df.h.sum() # 分裂前全部样本的G/Hfor thresh_values in sorted(df.x1.unique())[1:]: G_left, H_left = left_instance[['g', 'h']].sum() # 分裂后的G_l,H_l G_right, H_right = right_instance[['g', 'h']].sum() # 分裂后的G_r,H_r Gain = G_left**2/(H_left+reg_lambda)+G_right**2 / \ (H_right+reg_lambda)-G**2/(H+reg_lambda) # 分裂后的增益计算对x1每个取值进行划分,得到下面不同划分下的增益值。同样,对于特征x2每个取值的分裂情况:我们可以看到当最大的增益为特征x1=10时,增益为0.615205,因此将x1<10作为第一个分裂条件。接下来开始进行第2个分裂条件的选择:对于特征x1:对于特征x2:因此最优的划分为特征x2<2。通过不断的对上述过程迭代,即可递归地建出第一棵树。02简易版XGBoost实现我们首先使用XGBoost的开源实现来构建模型,和下面我们的实现做对比。import xgboost as xgbmodel = xgb.XGBClassifier(n_estimators=2,max_depth=3,learning_rate=0.1,random_state=1,reg_lambda=1,gamma=0,objective='binary:logistic',min_child_weight=0,)model.fit(df[['x1','x2']],df.y)xgb.to_graphviz(model,num_trees=0)可以看到第一棵树的结构如下:下面我们来用Python实现自己的简易版XGBoost。首先创建节点类,通过节点的递归构建出一棵树。from graphviz import Digraphclass Node(object): """结点 leaf_value : 记录叶子结点值 split_feature :分裂节点对应的特征名 split_value : 分裂节点对应的特征的值 left : 左子树 right : 右子树 """ def __init__(self, leaf_value=None, split_feature=None, split_value=None, left=None, right=None): self.leaf_value = leaf_value self.split_feature = split_feature self.split_value = split_value self.left = left self.right = right def show(self): print( f'weight: {self.leaf_value}, split_feature: {self.split_feature}, split_value: {self.split_value}.') def visualize_tree(self): """ 使用graphviz递归绘制树 """ def add_nodes_edges(self, dot=None): if dot is None: dot = Digraph() dot.node(name=str(self), label=f'{self.split_feature}<{self.split_value}') # Add nodes if self.left: if self.left.leaf_value: dot.node(name=str(self.left), label=f'leaf={self.left.leaf_value:.10f}') else: dot.node(name=str(self.left), label=f'{self.left.split_feature}<{self.left.split_value}') dot.edge(str(self), str(self.left)) dot = add_nodes_edges(self.left, dot=dot) if self.right: if self.right.leaf_value: dot.node(name=str(self.right), label=f'leaf={self.right.leaf_value:.10f}') else: dot.node(name=str(self.right), label=f'{self.right.split_feature}<{self.right.split_value}') dot.edge(str(self), str(self.right)) dot = add_nodes_edges(self.right, dot=dot) return dot dot = add_nodes_edges(self) return dot注意这里我们写了一个visualize_tree方法,使用graphviz来绘制建好的树的结构,在XGBoost的开源实现中也是使用类似的方案。该方法不是必须的,但是却对我们了解建树过程有着很好的帮助。同时我们使用show方法将节点的信息也字符形式显示出来。下面来看一下损失函数和建树过程的实现:# 树的结构参数reg_lambda = 1 # 叶节点权重L2正则系数min_samples_split = 1 # 分裂所需的最小样本个数max_depth = 3 # 树的深度# 建树过程参数learning_rate = 0.1 # 学习率n_estimators = 2 # 树的个数# log损失函数def log_loss_obj(preds, labels): # preds是建该树之前模型的输出,对于二分类问题需要的是概率,因此将该值经过Sigmoid转换 probs = 1.0 / (1.0 + np.exp(-preds)) grad = probs - labels hess = probs * (1.0 - probs) return grad, hessdef build_tree(df, feature_names, depth=1): df = df.copy() df['g'], df['h'] = log_loss_obj(df.y_pred, df.y) G, H = df[['g', 'h']].sum() Gain_max = float('-inf') # 终止条件 当前节点个数小于分裂所需最小样本个数,深度大于max_depth,叶节点只有一类样本无需再分 if df.shape[0] > min_samples_split and depth <= max_depth and df.y.nunique() > 1: for feature in feature_names: # 遍历每个特征 thresholds = sorted(set(df[feature])) # 特征取值排序 for thresh_value in thresholds[1:]: # 遍历每个取值 left_instance = df[df[feature] < thresh_value] # 划分到左右节点的样本 right_instance = df[df[feature] >= thresh_value] G_left, H_left = left_instance[['g', 'h']].sum() G_right, H_right = right_instance[['g', 'h']].sum() Gain = G_left**2/(H_left+reg_lambda)+G_right**2 / \ (H_right+reg_lambda)-G**2/(H+reg_lambda) # 评价划分的增益效果 if Gain >= Gain_max: Gain_max = Gain split_feature = feature # 最大增益对应的分裂特征 split_value = thresh_value # 最大增益对应的分裂值 left_data = left_instance # 最大增益对应的分裂后左节点样本 right_data = right_instance # 最大增益对应的分裂后右节点样本 left = build_tree(left_data, feature_names, depth+1) # 递归建左子树 right = build_tree(right_data, feature_names, depth+1)# 递归建右子树 return Node(split_feature=split_feature, split_value=split_value, left=left, right=right) # 返回分裂节点 return Node(leaf_value=-G/(H+reg_lambda)*learning_rate) # 分裂终止,返回叶节点权重对于单棵树的预测,我们使用predict函数,根据树的分裂条件以及当前数据的信息来确认每个样本被分到当前这棵树的哪个叶节点,得到对应叶节点的权重。def predict(x, tree): # 递归每个分裂点直到样本对应的叶节点 # 终止条件:叶节点 if tree.leaf_value is not None: return tree.leaf_value if x[tree.split_feature] < tree.split_value: return predict(x, tree.left) else: return predict(x, tree.right)根据已建好的树来更新预测结果,进而确定新建树的结构,不断迭代最终得到全部的树:trees = []y_pred = 0 # 初始预测值for i in range(n_estimators): df['y_pred'] = y_pred tree = build_tree(df, feature_names=['x1', 'x2']) data_weight = df[['x1', 'x2']].apply( predict, tree=tree, axis=1) y_pred += data_weight trees.append(tree)对于已建好的树,使用我们前面定义的visualize_tree函数,可以方便的看到树的结构。第一棵数的结构:trees[0].visualize_tree()trees[1].visualize_tree()可以看到,我们自己实现的XGBoost与开源的XGBoost得到的树的结构是一致的。03封 装import numpy as npimport pandas as pdimport xgboost as xgbfrom graphviz import Digraphclass Node(object): """结点 leaf_value : 记录叶子结点值 split_feature :特征i split_value : 特征i的值 left : 左子树 right : 右子树 """ def __init__(self, leaf_value=None, split_feature=None, split_value=None, left=None, right=None): self.leaf_value = leaf_value self.split_feature = split_feature self.split_value = split_value self.left = left self.right = right def show(self): print( f'weight: {self.leaf_value}, split_feature: {self.split_feature}, split_value: {self.split_value}.') def visualize_tree(self): """ 递归查找绘制树 """ def add_nodes_edges(self, dot=None): if dot is None: dot = Digraph() dot.node(name=str(self), label=f'{self.split_feature}<{self.split_value}') # Add nodes if self.left: if self.left.leaf_value: dot.node(name=str(self.left), label=f'leaf={self.left.leaf_value:.10f}') else: dot.node(name=str(self.left), label=f'{self.left.split_feature}<{self.left.split_value}') dot.edge(str(self), str(self.left)) dot = add_nodes_edges(self.left, dot=dot) if self.right: if self.right.leaf_value: dot.node(name=str(self.right), label=f'leaf={self.right.leaf_value:.10f}') else: dot.node(name=str(self.right), label=f'{self.right.split_feature}<{self.right.split_value}') dot.edge(str(self), str(self.right)) dot = add_nodes_edges(self.right, dot=dot) return dot dot = add_nodes_edges(self) return dotdef log_loss_obj(preds, labels): preds = 1.0 / (1.0 + np.exp(-preds)) grad = preds - labels hess = preds * (1.0 - preds) return grad, hessdef mse_obj(preds, labels): grad = labels-y_pred hess = np.ones_like(labels) return grad, hessclass XGB: def __init__(self, n_estimators=2, learning_rate=0.1, max_depth=3, min_samples_split=0, reg_lambda=1, base_score=0.5, loss=log_loss_obj): # 学习控制参数 self.n_estimators = n_estimators self.learning_rate = learning_rate self.base_score = base_score # 树参数 self.max_depth = max_depth self.min_samples_split = min_samples_split self.loss = loss self.reg_lambda = reg_lambda self.trees = [] self.feature_names = None def sigmoid_array(self, x): return 1 / (1 + np.exp(-x)) def _predict(self, x, tree): # 循环终止条件:叶节点 if tree.leaf_value is not None: return tree.leaf_value if x[tree.split_feature] < tree.split_value: return self._predict(x, tree.left) else: return self._predict(x, tree.right) def _build_tree(self, df, depth=1): df = df.copy() df['g'], df['h'] = self.loss(df.y_pred, df.y) G, H = df[['g', 'h']].sum() Gain_max = float('-inf') if df.shape[0] > self.min_samples_split and depth <= self.max_depth and df.y.nunique() > 1: for feature in self.feature_names: thresholds = sorted(set(df[feature])) for thresh_value in thresholds[1:]: left_instance = df[df[feature] < thresh_value] right_instance = df[df[feature] >= thresh_value] G_left, H_left = left_instance[['g', 'h']].sum() G_right, H_right = right_instance[['g', 'h']].sum() Gain = G_left**2/(H_left+self.reg_lambda)+G_right**2 / \ (H_right+self.reg_lambda)-G**2/(H+self.reg_lambda) if Gain >= Gain_max: Gain_max = Gain split_feature = feature split_value = thresh_value left_data = left_instance right_data = right_instance # print(feature,'Gain:',Gain,'G-Left',G_left,'H-left',H_left,'G-Right',G_right,'H-right',H_right,'----',thresh_value) # print(Gain_max,split_feature,split_value) left = self._build_tree(left_data, depth+1) right = self._build_tree(right_data, depth+1) return Node(split_feature=split_feature, split_value=split_value, left=left, right=right) return Node(leaf_value=-G/(H+self.reg_lambda)*self.learning_rate) def fit(self, X, y): y_pred = -np.log((1/self.base_score)-1) df = pd.DataFrame(X) df['y'] = y self.feature_names = df.columns.tolist()[:-1] for i in range(self.n_estimators): df['y_pred'] = y_pred tree = self._build_tree(df) data_weight = df[['x1', 'x2']].apply( self._predict, tree=tree, axis=1) y_pred += data_weight self.trees.append(tree) def predict(self, X): df = pd.DataFrame(X) y_pred = -np.log((1/self.base_score)-1) for tree in self.trees: df['y_pred'] = y_pred data_weight = df[['x1', 'x2']].apply( self._predict, tree=tree, axis=1) y_pred += data_weight return self.sigmoid_array(y_pred) def __repr__(self): return 'XGBClassifier('+', '.join(f'{k}={v}' for k, v in self.__dict__.items() if not k.startswith('_'))+')'使用前面同样的方法,调用我们自己封装好的代码,可以看到很简洁的实现了跟官方开源实现类似的效果。df = pd.read_csv('1.csv',index_col=0)model = XGB()model.fit(df[['x1', 'x2']], df.y)model.predict(df[['x1', 'x2']])model.trees[0].visualize_tree()当然这里只是一个DEMO,来帮助我们更好的理解论文中的公式以及XGBoost的实现过程,更多的细节优化可以参考官方实现:https://github.com/dmlc/xgboost04参 考https://xgboost.readthedocs.io/en/latest/tutorials/model.htmlhttps://blog.csdn.net/qq_22238533/article/details/79477547https://github.com/dmlc/xgboost/blob/master/demo/guide-python/custom_objective.pyhttps://github.com/lxmly/machine-learning/blob/master/decision_tree.py文章来源:网络人工智能园地
-
https://competition.huaweicloud.com/information/1000032499/introduction?track=107本大赛是在华为云人工智能平台(华为云一站式AI开发平台ModelArts、端云协同多模态AI开发应用平台HiLens)及无人驾驶小车基础上,全面锻炼和提高赛队的AI解决方案能力及无人驾驶编程技巧的赛事。举办方:华为技术有限公司、上海交通大学【赛事介绍】人工智能作为战略新兴产业,已经开始广泛应用于多个领域,无人驾驶及机器人是其中的重要载体。此次大赛是在华为云人工智能平台(华为云一站式AI开发平台ModelArts、端云协同解决方案HiLens)及无人驾驶小车基础上,全面锻炼和提高赛队的AI解决方案能力及无人驾驶编程技巧的赛事。比赛选手将拥有与华为云人工智能平台技术专家导师和上海交通大学创新中心专家导师团队进行深入沟通交流的机会,了解并动手实践华为云提供的智能硬件及人工智能平台等服务。【奖项设置】冠 军:1支队伍(获奖队伍将获得奖金10万现金+10万代金券,颁发获奖证书)亚 军:2支队伍(每支队伍奖金5万现金+5万代金券,颁发获奖证书)季 军:3支队伍(每支队伍奖金2万+3万代金券,颁发获奖证书)优胜奖:4支队伍(每支队伍奖金1万+1万代金券,颁发获奖证书)参赛将有机会得到大礼包:华为云代金券HC2020入场券华为云纪念T恤实物奖品将在现场发放,其他形式的奖品的发放以主办方通知的方式为准。对于根据国家法律法规规定,需要代扣代缴所得税的获奖者,华为云将根据相关规定进行代扣代缴。【参赛对象】计算机、自动化、电子信息、软件工程等相关专业(非必要条件)的全日制专科、本科、研究生等皆可。【参赛要求】1、为了更好参加比赛,建议赛队成员可预先在图像感知,物体检测方面了解基本知识,熟悉基本深度学习框架如caffe, tensorflow等、及熟悉机器人操作系统ROS;另外赛委会也会提供完整的海选赛赛前培训资料和半决赛前的线上培训,包括ModelArts、HiLens和ROS在无人车上的应用。2、组队规模:每个队伍须由1名指导老师(必须)和2-5名学生组成。本次大赛不提供现场组队,请在参赛前提前组队。对不符合组队要求的赛队,赛务组有对其取消晋级资格的权利。3、未满 18 周岁的报名者,请在报名前征得有法定监护权的监护人的同意。4、参赛开发平台采用华为云提供的人工智能开发平台及合作伙伴提供的比赛用车。5、参赛资料命名请以“无人车挑战杯+队名+队长联系电话+队长姓名”,并按照【报名要求】中说明,发送至指定邮箱。【报名要求】请在报名截止时间内,完成如下任务:(1)请按照无人车大赛报名表格格式,填写相关有效资料发送到邮箱competition@huaweicloud.com,邮件命名方式“无人车挑战杯+队名+队长联系电话+队长姓名”(包含:指导老师介绍及联系方式、成员介绍及联系方式、是否参过类似比赛,机器人、AI相关开发作品视频网址、网站、图片展示等相关链接),资料形式不限。点击下载无人车大赛报名表格(2)7月6日大赛平台开放无人车挑战杯海选赛题,选手需要先在大赛平台上学习ModelArts、HiLens、ROS等相关知识,然后可以使用最简单的基本数据集和预置算法进行训练,也可以手动或自动扩充训练集,并使用自定义算法。【报名流程】1、报名方式:点击右上方“立即报名”按钮进行报名,已有华为云账号的用户直接登录华为云账号即可报名成功,还未注册华为云账号的用户需要完成注册,然后填写报名信息完成报名。2、如果是多人组队参赛,参赛选手在报名成功之后在页面详情中选择创建队伍或加入已有团队,创建团队的人即为队长,队长拥有添加团队成员、审批队员申请加入等权限。3、赛过程中如果有任何疑问,可以进入讨论交流版块,在挑战赛讨论区中查看参赛指引手册、组队详情指引等;也可在讨论区进行留言、发帖提出疑问,大赛承办方会有工作人员及时答疑。讨论区:请点击左侧【讨论交流】进入【资源支持】海选赛:华为云为每位参赛选手提供价值500元的华为云EI代金券(仅支持ModelArts及OBS);半决赛:华为云为每支晋级赛队提供价值3000元的华为云EI代金券(仅支持ModelArts及OBS);总决赛:华为云为每支晋级赛队提供价值2000元的华为云EI代金券(仅支持ModelArts及OBS);【特别说明】比赛为免费报名,不需要向主办方华为云缴纳参赛费。获得资格参与半决赛的参赛赛队需要自行承担包括往返交通费以及其他相关费用;获得资格参与决赛的参赛赛队,决赛期间的往返交通费、住宿费将由主办方提供,具体补贴形式及补贴费用将针对决赛选手公布。
-
描述GFocal loss- Generalized Focal Loss1.概述此模型基于Generalized Focal Loss: Learning Qualified and Distributed Bounding Boxes for Dense Object Detection中提出的模型结构实现。该算法基于任意one-stage 检测器上,调整框本身与框质量估计的表示,同时用泛化版本的GFocal Loss训练该改进的表示,无cost提升AP(约1%的提升)。本算法使用COCO2017trainval数据集进行训练和验证,测试数据集为COCO2017test-dev数据集,数据集详情参考COCOdataset官网,最终在CODALAB官网在线测试论文table4中最后一行模型的复现结果如下表所示。APAP50AP75APsmallAPmediumAPlarge0.4820.6720.5240.2930.5150.604本算法其他信息如下表所示项目说明参考论文Generalized Focal Loss: Learning Qualified and Distributed Bounding Boxes for Dense Object Detection使用框架pytorch训练集coco2017 trainval训练总epoch数24训练batch_size2*8,其中2为训练参数中的samples_per_gpu每个GPU承担的图像数量,8为GPU_num即训练用到的GPU数目训练硬件8 * Tesla V100训练耗时32h 26min测试集coco2017 test-dev推理硬件1 * Tesla V100推理速度10.1 pic/s,此为在单GPUTesla-V100下,backbone为https://github.com/open-mmlab/mmdetection/blob/master/configs/gfl/gfl_x101_32x4d_fpn_dconv_c4-c5_mstrain_2x_coco.py2.训练2.1算法基本信息任务类型:目标检测支持的框架引擎:PyTorch-1.4.0-python3.6算法输入:存储在OBS上的数据集,必须按照COCO2017数据集的格式进行存储,详情请查看下文案例指导算法输出:用于Pytorch推理的pth模型,GPU推理速度:10.1s/pic2.2代码结构src |- pre-trained_weights |- checkpoints #主干网络预训练文件夹 |- trained_model |- model |- config.json |- customize_service.py |- best_model.pth |- start_alg_ctrl.py # 训练和预测启动文件 |- configs # mmdetection模型配置文件 |- ... |- gfl |- ... # GFocal模型配置文件 |- ... #mmdetection其他配置文件###2.3训练参数说明|参数 |类型 |是否可调整|默认值|是否必须|说明|| ------------ | ------------ | ------------ | ------------ |------------ ||train_epoch|Integer|true|1|true|数据集迭代次数||GPU_num|Integer|true|1|true|训练使用的GPU数量||samples_per_gpu|Integer|true|2|true|每个GPU承担的任务数,batchsize为其和GPU数的乘积||load_weight|String|true|trained_model/best_model.pth|true|load_weight参数有以下两种取值:(1)固定的默认路径,默认加载本算法源码目录中的trained_model/model/best_model.pth继续训练,加载成功会打印日志;(2)可变的OBS路径,用户可指定OBS上的一个模型文件路径,然后本算法会加载该模型继续训练,加载成功会打印日志。|eval|String|true|False|true|eval参数有以下两种取值:(1)False,本算法执行模型训练过程;(2)True,本算法加载load_weight参数指定的模型,然后执行模型评估过程。模型评估需要支持以下三种输入情况:2a) 创建训练作业时指定的数据存储位置data_url目录下,如果同时有图片和ground_truth,则模型评估过程输出pred_results目录和eval_result.txt文件,前者存放所有图片的预测结果,后者存放模型评估的精度指标;2b) 创建训练作业时指定的数据存储位置data_url目录下,如果只有图片,则模型评估过程输出pred_results目录,存放所有图片的预测结果;2c) 创建训练作业时指定的数据存储位置data_url目录下,如果没有图片,则模型评估过程报错;||warmup_ratio|String|true|0.001|true|初始学习率||lr|String|true|0.01|true|最终学习率|注意:如果eval为true,train_input中可以不需要train2017.zip和val2017.zip如果eval为false,train_input中可以不需要test2017.zip###2.4训练输出文件|- model |- customize_service.py |- config.json |- latest.pth # 训练所得模型 |- GFocal # mmdetection 和 GFocal配置文件3.GPU推理“元模型来源”从训练中选择,和从输出的OBS中选择均可。训练输出文件夹可直接用于导入模型部署各种服务###4.案例指导本算法的详细使用方法,请查看《ModelArts AI Gallery算法GFocal使用指导》交付交付方式华为云ModelArts交付区域华北-北京一、华北-北京四、华东-上海一、华南-广州、亚太-**
-
描述1. 概述此模型基于Attention and Language Ensemble for Scene Text Recognition with Convolutional Sequence Modeling中提出的模型结构实现,该算法会载入在MJSynth上的预训练模型,在用户数据集上做迁移学习。我们提供了训练代码和可用于训练的模型,用于实际场景的微调训练。训练后生成的模型可直接在ModelArts平台部署成在线服务。场景文本识别的常用评估手段为词级别的正确率。即以词为基本单位,统计正确预测词数量与所有词数量的比例。本算法的其他信息如下表所示:项目说明参考论文Attention and Language Ensemble for Scene Text Recognition with Convolutional Sequence Modeling使用框架Tensorflow-1.13.1训练集MJSynth (训练集部分)训练总step数30万 + 30万 = 60万训练batch_size单卡128训练硬件及耗时V100, 17.5小时 + 17.5小时 = 35小时测试集Street View Text (SVT)推理硬件及速度GPU, 47ms/pic输入图像尺寸32*100*3原论文准确率word accuracy = 83.9本算法准确率word accuracy = 84.2注:本算法复现中,前30W step(17.5小时)使用0.01学习率,后30W step(17.5小时)使用0.001学习率。2. 训练2.1 算法基本信息任务类型: 场景文本识别支持的框架引擎:Tensorflow-1.13.1-Python2.7算法输入:存储在OBS上的数据集,必须按照TF-Record格式及MJSynth目录结构进行存储。详情请查看下文第4节案例指导。MJSynth预训练模型,在SVT上的识别精度为84.2算法输出:用于Tensorflow推理的模型,GPU推理速度:47ms/pic(TitanX)代码结构:src ├── LICENSE # 开源协议 ├── README.md # 开源代码的原版介绍 ├── pylintrc ├── config.py # 配置文件 ├── convert.py # 用于将ckpt模型转换成pb模型 ├── datasets.py # 数据集定义文件 ├── demo.py # 从ckpt中读取模型,直接从图片读入,输出识别结果的demo ├── demo_pb.py # 从pb中读取模型,直接从图片读入,输出识别结果的demo ├── eval_one_pass.sh # 推理阶段直接在整个数据集上测试精度的脚本 ├── train.py # 模型训练代码 ├── evaluation.py # 模型评估代码 ├── model # 以下目录分编码器,解码器实现网络结构 │ ├── __init__.py │ ├── decoder_conv.py │ ├── encoder_resnet.py │ ├── model.py │ └── resnet_v2.py ├── tools │ └── make_tfrecord_datasets.py # 生成tfrecord格式数据集的工具。 ├── utils # 模型实现中用的工具代码 │ ├── __init__.py │ ├── beam_search.py │ ├── hooks.py │ ├── inception_preprocessing.py │ ├── metrics.py │ └── utils.py ├── trained_model │ ├── model # 用于存放复现的模型,可以用于进一步预训练 │ │ ├── config.json │ │ ├── customize_service.py │ │ ├── Iteration_30w_accuracy_84.pb │ │ ├── variables │ │ │ ├── checkpoint │ │ │ ├── variables.ckpt.index │ │ │ ├── variables.ckpt.meta │ │ │ └── variables.ckpt.data-00000-of-00001 ├── pre-trained_weights # 用于复现阶段的初始化模型,未使用因而未空2.2 主要训练参数说明名称默认值类型是否必填是否可修改描述train_urlNonestring是是设置训练输出位置后会自动生成该参数值,为OBS上训练的输出位置data_urlNonestring是是设置数据存储位置后会自动生成该参数值,为OBS上数据来源位置output_dir./train_outputstring是是设置模型、日志等的输出路径train_steps300000int否是训练的step总数。dataset_dirNonestring否是训练数据集路径。checkpointNonestring否是预训练模型路径(当基于某模型进一步训练时需要)learning_rate0.01float否是初始学习率设置。本算法中需要在第二个训练周期手动将学习率设置为0.001继续训练evalFalsebool是是程序运行的阶段。若为训练阶段则必须为False,评估为True。注:设置预训练模型时,需设置checkpoint为预训练模型的目录。2.3 其他可配置的训练参数(config.py中定义)名称默认值类型是否必填是否可修改描述debugFasleboolean否是使用tfdbg进行调试beam_width5int否是推理阶段的beam search大小。若值为0则表示关闭beam searchoptimizerMomentumstring否是模型的优化方法,支持Tensorflow常用的优化方式clip_gradients20.0float否是梯度的clip值,用于训练初期的稳定训练。momentum0.9float否是优化方法中的momentum值。use_nesterovTrueboolean否是优化方法中是否使用nesterov。batch_size128int否是训练的batch size值。train_steps300000int否是训练的step总数。tf_random_seedNoneint否是Tensorflow初始化随机种子。save_checkpoints_secs900int否是保存训练模型的间隔时间,单位为秒。也可以用save_checkpoints_steps代替。save_checkpoints_stepsNoneint否是保存训练模型的间隔步数。也可以用save_checkpoints_secs代替。keep_checkpoint_max5int否是保存的checkpoint模型最大数量。如果为None或者0,所有的checkpoint模型都将被保存。keep_checkpoint_every_n_hours4int否是除了保存最近的keep_checkpoint_max个模型外,额外保存模型。该参数设置训练间隔时间保存的模型数量,单位为小时。gpu_memory_fraction1.0float否是设置训练进程能够占用该显卡的显存比列。gpu_allow_growthFalseboolean否是是否允许Tensorflow动态地增长内存。log_step100int否是每log_step步保存一次日志信息。summaryTrueboolean否是是否使用Tensorboard保存训练信息。max_outputs4int否是Tensorboard中在一个batch里保存图像及文本的数量。2.4 训练输出文件训练完成后的输出文件如下:train_output ├── events.out.tfevents.*.* # Tensorboard日志文件 ├── checkpoint # tensorflow记录当前checkpoint的文件 ├── graph.pbtxt # tensorflow计算图信息 ├── statistics.log # 记录tensorflow operation及网络参数大小文件 ├── saved_model.pb # 训练最后步骤模型导出的推理图文件,用于部署在线模型 ├── model.ckpt-300000.index # 训练步数为300000的输出模型 ├── model.ckpt-300000.meta # 训练步数为300000的输出模型 ├── model.ckpt-300000.data-00000-of-00001 # 训练步数为300000的输出模型 ├── ... # 其他步数的输出模型注:输出结果保存多个时间步的模型,可挑选效果更好的模型作为最终输出模型。3. GPU推理元模型从训练结果中的输出模型中选择,选择训练作业及版本。代码中,提供两种数据格式的评估:1) 若格式为.jpg以及.png的图像,使用train.py --eval=True的方式进行评估2) 若格式为tfrecord,使用evaluation.py使用了评估功能;eval_one_pass提供调用evaluation.py的功能及样例。4. 案例指导本算法的详细使用方法,请查看《ModelArts AI Gallery算法conv-ensemble-str使用指导》。交付交付方式华为云ModelArts交付区域华北-北京一、华北-北京四、华东-上海一、华南-广州、亚太-**
-
Auto-Scheduling and Efficient Deep-RL 架构,支持MOBA、FPS、ACT、RTS、TBS等多种游戏类型描述ASED: Auto-Scheduling and Efficient Deep-RL 架构1. 效果展列中国象棋SPG足球-5v5FPS-vizdoom-basic环境趣味游戏-flappybird三消游戏-easy_candycrush 2. 框架简介基于ModelArts计算集群,以ray为技术底座搭建的ASED强化学习框架,由Learner和Actor构成,可运行在同构和异构集群上。ASED采用ray自动调度actor收集数据,统一在learner处理,并实时输出当前模型的ELO分,以评价模型效果。目前该框架支持MOBA、FPS、ACT、RTS、TBS等多种游戏类型,支持pve、multi-agent和selfplay的训练方式。ASED架构图3. 快速入门快速入门视频ASED视频对应文档本框架其他示例(vizdoom,spoof,multi-agent cartpole,Atari-breakout)见 Github3.1 Google Research Football pve示例开始训练前,您必须准备env_config.py、algorithm_config.json、game_interface.py三个基础文件,并放入同一个文件夹,作为游戏数据输入。如果环境是pypi包,请在pip-requirements.txt中指定。env_config.pyimport numpy as npfrom gym.spaces import Discrete, Boxaction_space = Discrete(19)observation_space = Box(-np.inf, np.inf, shape=(115,), dtype=np.float)algorithm_config.json{ "algorithm": "ppo", "hyper_params": { "framework": "tf2", "seed": 123, "num_gpus": 1, "num_workers": 500, "observation_filter": "NoFilter", "model": { "vf_share_layers": true }, "rollout_fragment_length": 128, "num_sgd_iter": 10, "train_batch_size": 64000, "sgd_minibatch_size": 16000, "lr": 0.0008 }}game_interface.pyimport shutilimport numpy as npfrom gfootball import env as feclass GameInterface: def __init__(self, *args): n_vs_n = 1 auto_GK = True logdir = "/home/work/modelarts/outputs/train_url_0/football/" shutil.rmtree(logdir) add_checkpoint = True dump_frequency = 1 self.env = self._create_football_env(n_vs_n=n_vs_n, auto_GK=auto_GK, logdir=logdir, add_checkpoint=add_checkpoint, dump_frequency=dump_frequency) self.reward_range = np.array((-np.inf, np.inf)) self.spec = None self.epi_num = 0 def reset(self, *args): return self.env.reset() def step(self, action, *args): o, r, d, i = self.env.step(action) return o, r, d, i def _create_football_env(self, n_vs_n=1, auto_GK=True, logdir="", add_checkpoint=True, dump_frequency=1): """ Returns a custom gfootball environment n_vs_n=1 # 1...5 number of players auto_GK=True # let the computer control the GK """ n_control = max(1, n_vs_n - int(auto_GK)) reward_type = 'checkpoint,scoring' if add_checkpoint else 'scoring' env = fe.create_environment( env_name="1_vs_1_easy", stacked=False, representation='simple115v2', rewards=reward_type, logdir=logdir, write_goal_dumps=False, write_full_episode_dumps=True, render=False, write_video=True, dump_frequency=dump_frequency, extra_players=None, number_of_left_players_agent_controls=n_control, number_of_right_players_agent_controls=0) return envpip-requirements.txtgfootball3.2 pve训练结果envtrain_modealgorithmconfigurationstepsscoretime_costfootball-1v1-PPOpvePPOASED 1-leaner 17-actors 500-workers~40M~1.8~1.2h训练曲线训练视频4. 详细使用方式参数配置algorithm_config.json说明env_config.py说明game_interface.py说明Benchmark实验数据5. 更多信息强化学习入门课程案例使用强化学习AlphaZero算法训练中国象棋AI与中国象棋AI对战!使用强化学习AlphaZero算法训练五子棋AI使用DQN算法玩2048游戏使用PPO算法玩超级马里奥兄弟使用DPPO算法控制倒立摆使用A2C算法控制登月器着陆使用SAC算法训练连续CartPole使用A3C算法玩乒乓球游戏使用DDPG算法训练连续MountainCar基于强化学习做电影推荐交付交付方式华为云ModelArts交付区域华北-北京一、华北-北京四、华东-上海一、华南-广州、亚太-**
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第三期2026/08/21 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;念擎-华为云AI开发者运营案例开发专家
本期直播内容:AI六层能力首次详细解读 + 新一代华为云开发者空间亮相 + 校园案例直播带练
回顾中
热门标签