《谷歌最强NLP模型BERT如约开源12小时GitHub标星破1500即将支持中文.docx》由会员分享,可在线阅读,更多相关《谷歌最强NLP模型BERT如约开源12小时GitHub标星破1500即将支持中文.docx(17页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、谷歌最强NLP模型BERT如约开源,12小时GitHub标星破1500,即将支持中文夏乙晓查乾明问耕发自凹非寺量子位报道|公众号QbitAIBERT终于来了今天谷歌研究团队终于在GitHub上发布了万众期待的BERT。代码放出不到一天就已经在GitHub上获得1500多星。工程地址s:/github/google-research/bert#fine-tuning-with-bert就在半个月前谷歌才发布这个NLP预训练模型的论文s:/arxiv.org/abs/1810.04805。BERT一出现就技惊四座碾压了竞争对手在11项NLP测试中刷新了最高成绩甚至全面超越了人类的表现。BERT的出
2、现可以讲是NLP领域最重大的事件谷歌团队的ThangLuong认为BERT标志着NLP新时代的开场。BERT是什么BERT全称BidirectionalEncoderRepresentationsfromTransformers是预训练语言表示的方法可以在大型文本语料库如维基百科上训练通用的“语言理解模型然后将该模型用于下游NLP任务比方机器翻译、问答。BERT是第一个无监视的用于预训练NLP的深度双向系统。无监视意味着BERT仅使用文本语料库进展训练也就是讲网络上有大量多种语言文本数据可供使用。NLP预训练的表示可以以是无语境的可以以是语境关联的而且语境表示可以是单向的可以以是双向的。诸如w
3、ord2vec或者GloVe之类的无语境模型由词汇表中的每个单词生成单个“单词嵌入表示因此像“bank这样的单词会有“银行以及“河岸两种表示。而语境模型那么会根据句子中其他单词来生成每个单词的表示。BERT建立在最近的预训练语境表示工作的根底上包括半监视序列学习生成预训练ELMo以及ULMFit但关键的是这些模型都是单向或者浅双向的。这意味着每个单词仅使用前面或者后面的单词进展语境化。例如在“Imadeabankdeposit的句子中做出“bank的单向表示可能仅仅基于前文“Imade而不是后文“deposit。前人的一些工作确实结合了来自单独的前文或后文模型的表示但这种方式很“浅。而BERT
4、表示“bank从深度神经网络的最底层开场同时结合了上下文“Imadeadeposit因此双向的联络很“深。BERT使用一种简单的方法屏蔽输入中15的单词通过深度双向Transformer编码器运行整个序列然后预测被屏蔽的单词。例如Input:themanwenttotheMASK1.heboughtaMASK2ofmilk.Labels:MASK1store;MASK2gallon为了学习句子之间的关系还训练一个可以从任何单语语料库生成的简单任务给出两个句子A以及B让机器判断B是A的下一句还是语料库中的随机句子SentenceA:themanwenttothestore.句子A男人走进商店Se
5、ntenceB:heboughtagallonofmilk.句子B他买了一加仑牛奶Label:IsNextSentence是下一句SentenceA:themanwenttothestore.句子A男人走进商店SentenceB:penguinsareflightless.句子B企鹅不会飞Label:NotNextSentence不是下一句然后Google在大型语料库维基百科以及BookCorpus上训练了一个大型模型12层到24层Transformer花费了很长时间100万晋级步骤这就是BERT。使用BERT分为两步预训练以及微调。预训练的代价非常高昂需要4到16个云TPU训练4天但是每种语
6、言都是训练一次就够了。谷歌大脑团队发布了一些预训练的模型目前仅限英语但不久后也会发布多语言模型。大多数NLP研究人员根本不需要从头开场训练他们自己的模型。与预训练不同微调那么比拟容易。从完全一样的预训练模型开场本文中的所有结果只需最多在单个云TPU上运行1小时或在GPU上运行几小时。例如目前最先进的单系统SQuAD在单个云TPU上训练大约30分钟就能获得91.0的DevF1分数。BERT的另一个重要特性是它能适应许多类型的NLP任务。它的论文里就展示了句子级别如SST-2句对级别如MultiNLI单词级别如NER以及小段级别如SQuAD的最新结果几乎没有针对特定任务进展修改。支持汉语吗目前放出
7、的预训练模型是英语的不过谷歌大脑团队打算11月底之前放出经更多语言预训练的多语种模型。更多语言终究包括哪些官方没有给出准确信息不过BERT一作JacobDevlin回应排队求中日韩德甚至马其顿语版本的群众们时讲他正在用维基百科规模最大的60种语言训练模型汉语、韩语、日语、德语、西班牙语等等都包含在其中。就是这里列出的1-60号语言s:/meta.wikimedia.org/wiki/List_of_Wikipedias#All_Wikipedias_ordered_by_number_of_articles另外他们对中文做了一点比拟特殊的处理就是把CJKUnicode字符集里的所有字符toke
8、n化。工程库中发布了哪些内容用于BERT模型架构的TensorFlow代码主要是标准的Transformer架构。BERT-Base以及BERT-Large模型小写以及Cased版本的预训练检查点。论文里微调试验的TensorFlow代码比方SQuADMultiNLI以及MRPC。此工程库中的所有代码都可以直接用在CPUGPU以及云TPU上。预训练模型这里发布的是论文中的BERT-Base以及BERT-Large模型。其中Uncased的意思是文本在经过WordPiecetoken化之前全部会调整成小写比方“JohnSmith会变成“johnsmith。Uncased模型也会剔除任何的重音标记
9、。Cased意味着文本的真实情况以及重音标记都会保存下来。通常情况下Uncased模型更好除非文本的原始信息会对你的任务来讲非常重要。比方讲识别命名实体或者对局部语音标记。这些模型与源代码Apache2.0的受权一样。在下面的模型介绍中沿袭论文中的简称层数即Transformer块表示为L将隐藏尺寸表示为H将自注意力头self-attentionheads的数量表示为A。复制下方链接到阅读器中即可下载BERT-Base,UncasedL12H768A12总参数110Ms:/storage.googleapis/bert_models/2018_10_18/uncased_L-12_H-768_
10、A-12.zipBERT-Large,UncasedL24,H1024,A16,总参数340Ms:/storage.googleapis/bert_models/2018_10_18/uncased_L-24_H-1024_A-16.zipBERT-Base,CasedL12H768A12总参数110Ms:/storage.googleapis/bert_models/2018_10_18/cased_L-12_H-768_A-12.zipBERT-Large,CasedL24,H1024,A16,总参数340Ms:/storage.googleapis/bert_models/2018_10
11、_18/cased_L-12_H-768_A-12.zip每个.zip文件都包含3个东西一个TensorFlow检查点bert_model.ckpt一个vocab文件vocab.txt以及一个配置文件bert_config.json。假如你想对这些预训练模型进展端到端的微调参见这份详细操作s:/github/google-research/bert/blob/master/README.md#fine-tuning-with-bert使用BERT提取固定特征向量(如ELMo)有时候与对整个预训练模型进展端到端的微调相比直接获得预训练模型的语境嵌入会更好一些。预训练模型的语境嵌入是由预训练模型的
12、隐藏层生成的每个token的固定语境表示。这应该可以减轻大局部内存缺乏的问题。比方脚本extract_features.py可以这样使用#SentenceAandSentenceBareseparatedbythe|delimiter.#Forsinglesentenceinputs,dontusethedelimiter.echoWhowasJimHenson?|JimHensonwasapuppeteer/tmp/input.txtpythonextract_features.py-input_file/tmp/input.txt-output_file/tmp/output.jsonl-
13、vocab_file$BERT_BASE_DIR/vocab.txt-bert_config_file$BERT_BASE_DIR/bert_config.json-init_checkpoint$BERT_BASE_DIR/bert_model.ckpt-layers-1,-2,-3,-4-max_seq_length128-batch_size8这将创立一个JSON文件每行输入一行包含由layers指定的每个Transformer层的BERT激活-1是Transformer的最后隐藏层等等请注意这个脚本将产生非常大的输出文件默认情况下每个输入token产生大约15kb输出。假如你预测训练标
14、签需要保持原始词汇以及token词之间的一致性。详细请参阅下面的Token化局部。Token化对于句子层级的任务token化非常简单。按照run_classifier.py以及extract_features.py中的代码运行就行了。句子层级任务的根本流程是实例化。tokenizertokenization.FullTokenizer将原始文本token化。tokenstokenizer.tokenize(raw_text).截断句子长度。最大序列你最多可以使用512但因为内存以及速度的原因短一点可能会更好在正确的位置添加CLS以及SEPtoken。 CLS是分类输出的特殊符号SEP是别离非连
15、续token序列的特殊符号。单词级别以及跨度级别的任务例如SQuAD以及NER更为复杂因为你需要保证输入文本以及输出文本之间对齐以便你可以映射训练标签。SQuAD是一个非常复杂的例子因为输入的标签是基于字符的而且段落的长度也经常会超过默认的最大序列。查看run_squad.py中的代码可以看到Google是怎样处理这个问题的。在介绍处理单词级别任务的通用方法之前解析分词器tokenizers到底在做什么非常重要。它主要有三个步骤文本标准化将所有的空白字符转换为空格在Uncased模型中要将所有字母小写并剔除重音标记。例如JohnJohansons,johnjohansons,标点符号别离把标点
16、符号分为两个局部也就是讲在所有的标点符号字符周围添加空格。标点符号的定义是(a)任何具有p*Unicode类的东西(b)任何非字母/数字/空格ASCII字符例如$这样的字符技术上不是标点符号。例如johnjohansons,johnjohansons,WordPiecetoken化将空白token化应用到上述经过的输出中并对每个token分别应用WordPiece。这个实现直接基于tensor2tensor。例如johnjohansons,johnjohan#sons,这个方案的优点在于它与大多数英语分词器兼容。例如假设你有一个类似这样的标记局部语音任务Input:JohnJohansonsh
17、ouseLabels:NNPNNPPOSNN所有的token化输出都是这样的Tokens:johnjohan#sonshouse至关重要的是这与输入JohnJohansonshouse的输出是一样的在之前也没有空格。假如你有一个带有单词级别注释的预token化表示你可以独立地对每个输入单词进展简单的分析并确保原始文本到token化文本之间是对齐的#Inputorig_tokensJohn,Johanson,s,houselabelsNNP,NNP,POS,NN#Outputbert_tokens#Tokenmapwillbeanint-intmappingbetweentheorig_toke
18、nsindexand#thebert_tokensindex.orig_to_tok_maptokenizertokenization.FullTokenizer(vocab_filevocab_file,do_lower_caseTrue)bert_tokens.append(CLS)fororig_tokeninorig_tokens:orig_to_tok_map.append(len(bert_tokens)bert_tokens.extend(tokenizer.tokenize(orig_token)bert_tokens.append(SEP)#bert_tokensCLS,jo
19、hn,johan,#son,s,house,SEP#orig_to_tok_map1,2,4,6如今orig_to_tok_map能用来将labels映射到token化表示上。有一些常见的英语训练方案会导致BERT的训练方式之间出现细微的不匹配。例如假如你输入的是缩写单词而且又别离开了比方dont将会出现错误匹配。假如可能的话你应该预先处理数据将其转换为原始的文本。假如不处理这种错误匹配也不是什么大问题。预训练BERT假如你想自己预训练BERT可以看看这份资源中在任意文本语料库上完成“maskedLM以及“预测下一句任务的代码。注意这不是论文中的原始代码但是同样能生成论文中所描绘的预训练数据。
20、原始代码是C写成的更复杂。首先是数据生成环节输入每句一行的纯文本文件用空行分隔文件会得到一组TFRecord文件格式的tf.train.Example。pythoncreate_pretraining_data.py-input_file./sample_text.txt-output_file/tmp/tf_examples.tfrecord-vocab_file$BERT_BASE_DIR/vocab.txt-do_lower_caseTrue-max_seq_length128-max_predictions_per_seq20-masked_lm_prob0.15-random_see
21、d12345-dupe_factor5这段脚本能把整个输入文件中的所有样例存储到内存所以假如输入文件比拟大你要把它分割开屡次调用这个脚本。max_predictions_per_seq是每个序列能获得maskedLM预测的最大值应该设置到以及max_seq_length乘masked_lm_prob差不多。数据生成之后就可以运行预训练了。pythonrun_pretraining.py-input_file/tmp/tf_examples.tfrecord-output_dir/tmp/pretraining_output-do_trainTrue-do_evalTrue-bert_confi
22、g_file$BERT_BASE_DIR/bert_config.json-init_checkpoint$BERT_BASE_DIR/bert_model.ckpt-train_batch_size32-max_seq_length128-max_predictions_per_seq20-num_train_steps20-num_warmup_steps10-learning_rate2e-5注意假如你要从头开场预训练的话就去掉代码里的init_checkpoint。模型的设置在bert_config_file里。这段代码只能预训练20步左右但实际使用中你可能需要训练10000步以上在n
23、um_train_steps这里设置数字就可以。另外max_seq_length以及max_predictions_per_seq传递给run_pretraining.py的参数必须以及create_pretraining_data.py.一样。得到的输出会是这样的*Evalresults*global_step20loss0.0979674masked_lm_accuracy0.985479masked_lm_loss0.0979328next_sentence_accuracy1.0next_sentence_loss3.45724e-05这里还有一些预训练考前须知假如你的任务有大型特定域
24、语料库可用比方电影评论、科研论文等等那么从BERT检查点开场对语料库执行额外的预训练步骤可能会有用。论文中使用的学习率是1e-4。但是假如你从现有BERT检查点开场执行额外的预训练步骤那么应使用较小的学习率例如2e-5。如今BERT模型只支持英语但是Google打算在“不久的将来发布经太多种语言预训练的多语种模型。这个不久他们祈望是11月底之前。注意力是序列长度的平方所以长序列非常昂贵消耗计算力。一批64个长度为512的序列比一批256个长度为128的序列要昂贵的多它们的全连接、卷积本钱一样但是512长度的序列注意力本钱要高很多。不过有时候确实需要长序列比方要学习位置嵌入的时候用长序列就学得非
25、常快。这时候可以先用短序列比方长度128训练90000步再用长序列比方长度512训练10000步。注意这需要用不同的max_seq_length值生成两次数据。假如从头开场预训练请注意本钱很高在GPU上本钱尤其高。Google推荐先用单个可抢占preemptible的云TPUv2预训练BERT-Base。这需要两周时间500美元还需要缩小批次大小。预训练数据论文用的预处理数据集SorryGoogle讲不公布了。不过他们提供了一些让你自己搞定数据集的途径。假如想用维基百科从这里下载s:/dumps.wikimedia.org/enwiki/latest/enwiki-latest-pages-a
26、rticles.xml.bz2然后用WikiExtractor.py提取文本s:/github/attardi/wikiextractor然后进展必要的清理转换成纯文本。假如想用BookCorpus数据集它已经不提供开放下载了可以用比拟小的ProjectGuttenberg数据集替代s:/web.eecs.umich.edu/lahiri/gutenberg_dataset.html还有一个大型文本资源叫CommonCrawl可以以清理一下提取出预训练BERT要用的语料库:/commoncrawl.org/在Colab里使用BERTGoogle还提供了更贴心的使用方式在他们的Colab全称Co
27、laboratory里翻开这个名叫“BERTFineTuningwithCloudTPUs的笔记本就可以开工了s:/colab.research.google/github/tensorflow/tpu/blob/master/tools/colab/bert_finetuning_with_cloud_tpus.ipynb假如你想免费薅一把谷歌云TPU资源如今Colab是个不错的途径。FAQ问这次放出的代码适用于云TPU么GPU能用么答没问题。这个仓库中的所有代码都能在CPU、GPU以及云TPU上跑。但是GPU训练仅适用于单GPU。问提示内存缺乏这是什么问题答可以参考相关条目解决。官方地址s
28、:/github/google-research/bert#out-of-memory-issues问会有PyTorch版本发布么答没有官网的PyTorch实现。假如有人搞出一个逐行的PyTorch实现可以直接转换我们预先训练好的检查点我们很乐意帮助推广。问模型是否会支持更多语言答会我们方案很快发布多语言的BERT模型会是一个单一模型。如今还无法确定将包括哪些语言不过在维基百科上语料规模比拟大的语言应该都有。问还会有比BERT-Large更大的模型么答截至目前我们还没尝试过更大的训练。假如我们可以获得重大的改良可能会发布更大的模型。问这个库使用什么答应证答所有代码以及模型都在Apache2.0答应证之下。点击下方“浏览原文解析【人工智能效劳器】深度学习世界