天津市今天新闻头条,个人seo怎么赚钱,wordpress批量修改标签,广告公司怎么做新智元报道
来源#xff1a;GitHub
作者#xff1a;Google Research 编辑#xff1a;肖琴
【新智元导读】谷歌AI团队终于开源了最强NLP模型BERT的代码和预训练模型。从论文发布以来#xff0c;BERT在NLP业内引起巨大反响#xff0c;被认为开启了NLP的新时代。
BERT的官方… 新智元报道
来源GitHub
作者Google Research 编辑肖琴
【新智元导读】谷歌AI团队终于开源了最强NLP模型BERT的代码和预训练模型。从论文发布以来BERT在NLP业内引起巨大反响被认为开启了NLP的新时代。
BERT的官方代码终于来了
昨天谷歌在GitHub上发布了备受关注的“最强NLP模型”BERT的TensorFlow代码和预训练模型不到一天时间已经获得3000多星地址
https://github.com/google-research/bert
BERT全称是Bidirectional Encoder Representations from Transformers是一种预训练语言表示的新方法。
新智元近期对BERT模型作了详细的报道和专家解读
NLP历史突破谷歌BERT模型狂破11项纪录全面超越人类
狂破11项记录谷歌年度最强NLP论文到底强在哪里
解读谷歌最强NLP模型BERT模型、数据和训练
BERT有多强大呢它在机器阅读理解顶级水平测试SQuAD1.1中表现出惊人的成绩全部两个衡量指标上全面超越人类并且还在11种不同NLP测试中创出最佳成绩包括将GLUE基准推至80.4绝对改进7.6MultiNLI准确度达到86.7% 绝对改进率5.6等。
以下是BERT模型在SQuAD v1.1问题回答任务的结果在几个自然语言推理任务的结果以及更多其他任务。
而且这些结果都是在几乎没有task-specific的神经网络架构设计的情况下获得的。
如果你已经知道BERT是什么只想马上开始使用可以下载预训练过的模型几分钟就可以很好地完成调优。
预训练模型下载
https://github.com/google-research/bert#pre-trained-models
BERT是什么
BERT是一种预训练语言表示language representations的方法意思是我们在一个大型文本语料库比如维基百科上训练一个通用的“语言理解”模型然后将这个模型用于我们关心的下游NLP任务比如问题回答。BERT优于以前的方法因为它是第一个用于预训练NLP的无监督、深度双向的系统unsupervised, deeply bidirectional system。
无监督意味着BERT只使用纯文本语料库进行训练这很重要因为网络上有大量的公开的纯文本数据而且是多语言的。
预训练的表示可以是上下文无关context-free的也可以是上下文相关contextual的并且上下文相关表示还可以是单向的或双向的。上下文无关的模型比如word2vec或GloVe会为词汇表中的每个单词生成单个“word embedding”表示因此bank在bank deposit银行存款和river bank河岸中具有相同的表示。上下文模型则会根据句子中的其他单词生成每个单词的表示。
BERT建立在最近的预训练contextual representations的基础上——包括半监督序列学习、生成性预训练、ELMo和ULMFit——但这些模型都是单向的或浅双向的。这意味着每个单词只能使用其左边(或右边)的单词来预测上下文。例如在I made a bank deposit 这个句子中 bank的单向表示仅仅基于I made a而不是deposit。以前的一些工作结合了来自单独的left-context和right-context 模型的表示但只是一种“浅层”的方式。BERT同时使用左侧和右侧上下文来表示“bank”—— I made a ... deposit——从深神经网络的最底层开始所以它是深度双向的。
BERT使用一种简单的方法将输入中15%的单词屏蔽mask起来通过一个深度双向Transformer编码器运行整个序列然后仅预测被屏蔽的单词。例如:
Input: the man went to the [MASK1] . he bought a [MASK2] of milk.
Labels: [MASK1] store; [MASK2] gallon
为了学习句子之间的关系我们还训练了一个可以从任何单语语料库生成的简单任务给定两个句子A和B, 让模型判断B是A的下一个句子还是语料库中的一个随机句子?
Sentence A: the man went to the store .
Sentence B: he bought a gallon of milk .
Label: IsNextSentence
Sentence A: the man went to the store .
Sentence B: penguins are flightless .
Label: NotNextSentence
然后我们在大型语料库(Wikipedia BookCorpus)上训练了一个大型模型12-layer 到 24-layer的Transformer花了很长时间100万次更新步骤这就是BERT。
使用BERT的两个阶段预训练和微调
使用BERT分为两个阶段预训练Pre-training和微调Fine-tuning。
预训练Pre-training的成本是相当昂贵的需要4到16个Cloud TPU训练4天但是对于每种语言来说都只需训练一次目前的模型仅限英语的我们打算很快发布多语言模型。大多数NLP研究人员根本不需要从头开始训练自己的模型。
微调Fine-tuning的成本不高。从完全相同的预训练模型开始论文中的所有结果在单个Cloud TPU上最多1小时就能复制或者在GPU上几小时就能复制。例如对于SQUAD任务在单个Cloud TPU上训练大约30分钟就能获得91.0的Dev F1分数这是目前单系统最先进的。
BERT的另一个重要方面是它可以很容易地适应许多类型的NLP任务。在论文中我们展示了句子级例如SST-2、句子对级别例如MultiNLI、单词级别例如NER以及段落级别例如SQuAD等任务上最先进的结果并且几乎没有针对特定任务进行修改。
GitHub库中包含哪些内容
BERT模型架构的TensorFlow代码主体是一个标准Transformer架构。BERT-Base和BERT-Large的lowercase和cased版本的预训练检查点。用于复制论文中最重要的微调实验的TensorFlow代码包括SQuADMultiNLI和MRPC。
这个项目库中所有代码都可以在CPU、GPU和Cloud TPU上使用。
预训练模型
我们发布了论文中的BERT-Base和BERT-Large模型。
Uncased表示在WordPiece tokenization之前文本已经变成小写了例如John Smith becomes john smith。Uncased模型也去掉了所有重音标志。
Cased表示保留了真实的大小写和重音标记。通常除非你已经知道大小写信息对你的任务来说很重要例如命名实体识别或词性标记否则Uncased模型会更好。
这些模型都在与源代码相同的许可(Apache 2.0)下发布。
请在GitHub的链接里下载模型
BERT-Base, Uncased: 12-layer, 768-hidden, 12-heads, 110M parametersBERT-Large, Uncased: 24-layer, 1024-hidden, 16-heads, 340M parametersBERT-Base, Cased: 12-layer, 768-hidden, 12-heads , 110M parametersBERT-Large, Cased: 24-layer, 1024-hidden, 16-heads, 340M parameters (暂时未发布).
每个.zip文件包含三个项目:
一个包含预训练权重的TensorFlow checkpoint (bert_model.ckpt)(实际上是3个文件)。
一个vocab文件(vocab.txt)用于将WordPiece映射到word id。
一个配置文件(bert_config.json)用于指定模型的超参数。
BERT的Fine-tuning
重要提示论文里的所有结果都在单个Cloud TPU上进行了微调Cloud TPU具有64GB的RAM。目前无法使用具有12GB-16GB RAM的GPU复现论文里BERT-Large的大多数结果因为内存可以适用的最大 batch size太小。我们正在努力添加代码以允许在GPU上实现更大的有效batch size。有关更多详细信息请参阅out-of memory issues的部分。
使用BERT-Base的fine-tuning示例应该能够使用给定的超参数在具有至少12GB RAM的GPU上运行。
BERT预训练
我们发布了在任意文本语料库上做“masked LM”和“下一句预测”的代码。请注意这不是论文的确切代码原始代码是用C 编写的并且有一些额外的复杂性但是此代码确实生成了论文中描述的预训练数据。
以下是运行数据生成的方法。输入是纯文本文件每行一个句子。在“下一句预测”任务中这些需要是实际的句子。文件用空行分隔。输出是一组序列化为TFRecord文件格式的tf.train.Examples。
你可以使用现成的NLP工具包如spaCy来执行句子分割。create_pretraining_data.py脚本将连接 segments直到达到最大序列长度以最大限度地减少填充造成的计算浪费。但是你可能需要在输入数据中有意添加少量噪声例如随机截断2的输入segments以使其在微调期间对非句子输入更加鲁棒。
此脚本将整个输入文件的所有示例存储在内存中因此对于大型数据文件你应该对输入文件进行切分并多次调用脚本。可以将文件glob传递给run_pretraining.py例如tf_examples.tf_record *。
max_predictions_per_seq是每个序列的masked LM预测的最大数量。你应该将其设置为max_seq_length * masked_lm_prob脚本不会自动执行此操作因为需要将确切的值传递给两个脚本。
python create_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_seed12345 \--dupe_factor5
以下是如何进行预训练。
如果你从头开始进行预训练请不要包含init_checkpoint。模型配置包括词汇大小在bert_config_file中指定。此演示代码仅预训练少量steps20但实际上你可能希望将num_train_steps设置为10000步或更多。传递给run_pretraining.py的max_seq_lengthand max_predictions_per_seq参数必须与create_pretraining_data.py相同。
python run_pretraining.py \--input_file/tmp/tf_examples.tfrecord \--output_dir/tmp/pretraining_output \--do_trainTrue \--do_evalTrue \--bert_config_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
这将产生如下输出
***** Eval results *****global_step 20loss 0.0979674masked_lm_accuracy 0.985479masked_lm_loss 0.0979328next_sentence_accuracy 1.0next_sentence_loss 3.45724e-05
FAQ
问这次公开的代码是否与Cloud TPU兼容GPU呢
答是的这个存储库中的所有代码都可以与CPUGPU和Cloud TPU兼容。但是GPU训练仅适用于单GPU。
问提示内存不足这是什么问题
答请参阅out-of-memory issues这部分的内容。
问有PyTorch版本吗
答目前还没有正式的PyTorch实现。如果有人创建了一个逐行PyTorch实现可以让我们的预训练checkpoints直接转换那么我们很乐意在这里链接到PyTorch版本。
问是否会发布其他语言的模型
答是的我们计划很快发布多语言BERT模型。我们不能保证将包含哪些语言但它很可能是一个单一的模型其中包括大多数维基百科上预料规模较大的语言。
问是否会发布比BERT-Large更大的模型
答到目前为止我们还没有尝试过比BERT-Large更大的训练。如果我们能够获得重大改进可能会发布更大的模型。
问这个库的许可证是什么
答所有代码和模型都在Apache 2.0许可下发布。
地址
https://github.com/google-research/bert