From 4bed44949ac2577c314deeb1dccb959a08636cd1 Mon Sep 17 00:00:00 2001 From: ChenXin Date: Wed, 25 Sep 2019 19:32:41 +0800 Subject: [PATCH] add bert_embedding tutorial --- .../tutorials/extend_1_bert_embedding.rst | 82 +++++++++++++++++++ .../source/tutorials/tutorial_3_embedding.rst | 5 +- .../tutorials/tutorial_6_datasetiter.rst | 4 +- docs/source/user/tutorials.rst | 4 + tutorials/README.md | 6 +- 5 files changed, 90 insertions(+), 11 deletions(-) create mode 100644 docs/source/tutorials/extend_1_bert_embedding.rst diff --git a/docs/source/tutorials/extend_1_bert_embedding.rst b/docs/source/tutorials/extend_1_bert_embedding.rst new file mode 100644 index 00000000..2f207c0e --- /dev/null +++ b/docs/source/tutorials/extend_1_bert_embedding.rst @@ -0,0 +1,82 @@ +============================== +BertEmbedding的各种用法 +============================== + +fastNLP的BertEmbedding以pytorch-transformer.BertModel的代码为基础,是一个使用BERT对words进行编码的Embedding。 + +使用BertEmbedding和fastNLP.models.bert里面模型可以搭建BERT应用到五种下游任务的模型。 + +预训练好的Embedding参数及数据集的介绍和自动下载功能见 :doc:`/tutorials/tutorial_3_embedding` 和 +:doc:`/tutorials/tutorial_4_load_dataset` + +1. BERT for Squence Classification +---------------------------------- + +在文本分类任务中,我们采用SST数据集作为例子来介绍BertEmbedding的使用方法。 + +.. code-block:: python + + import warnings + import torch + warnings.filterwarnings("ignore") + + # 载入数据集 + from fastNLP.io import SSTPipe + data_bundle = SSTPipe(subtree=False, train_subtree=False, lower=False, tokenizer='raw').process_from_file() + data_bundle + + # 载入BertEmbedding + from fastNLP.embeddings import BertEmbedding + embed = BertEmbedding(data_bundle.get_vocab('words'), model_dir_or_name='en-base-cased', include_cls_sep=True) + + # 载入模型 + from fastNLP.models import BertForSequenceClassification + model = BertForSequenceClassification(embed, len(data_bundle.get_vocab('target'))) + + # 训练模型 + from fastNLP import Trainer, CrossEntropyLoss, AccuracyMetric, Adam + trainer = Trainer(data_bundle.get_dataset('train'), model, + optimizer=Adam(model_params=model.parameters(), lr=2e-5), + loss=CrossEntropyLoss(), device=[0], + batch_size=64, dev_data=data_bundle.get_dataset('dev'), + metrics=AccuracyMetric(), n_epochs=2, print_every=1) + trainer.train() + + + + # 测试结果并删除模型 + from fastNLP import Tester + tester = Tester(data_bundle.get_dataset('test'), model, batch_size=128, metrics=AccuracyMetric()) + tester.test() + +2. BERT for Sentence Matching +----------------------------- + +在Matching任务中,我们采用RTE数据集作为例子来介绍BertEmbedding的使用方法。 + +.. code-block:: python + + # 载入数据集 + from fastNLP.io import RTEBertPipe + data_bundle = RTEBertPipe(lower=False, tokenizer='raw').process_from_file() + + # 载入BertEmbedding + from fastNLP.embeddings import BertEmbedding + embed = BertEmbedding(data_bundle.get_vocab('words'), model_dir_or_name='en-base-cased', include_cls_sep=True) + + + # 载入模型 + from fastNLP.models import BertForSentenceMatching + model = BertForSentenceMatching(embed, len(data_bundle.get_vocab('target'))) + + # 训练模型 + from fastNLP import Trainer, CrossEntropyLoss, AccuracyMetric, Adam + trainer = Trainer(data_bundle.get_dataset('train'), model, + optimizer=Adam(model_params=model.parameters(), lr=2e-5), + loss=CrossEntropyLoss(), device=[0], + batch_size=16, dev_data=data_bundle.get_dataset('dev'), + metrics=AccuracyMetric(), n_epochs=2, print_every=1) + trainer.train() + + + diff --git a/docs/source/tutorials/tutorial_3_embedding.rst b/docs/source/tutorials/tutorial_3_embedding.rst index 521992ec..07a55cea 100644 --- a/docs/source/tutorials/tutorial_3_embedding.rst +++ b/docs/source/tutorials/tutorial_3_embedding.rst @@ -220,10 +220,7 @@ Bert在针对具有两句话的任务时(如matching,Q&A任务),句子 在多个[SEP]的情况下,将会使token_type_id不断0,1循环。比如"first sentence [SEP] second sentence [SEP] third sentence", 它们的 token_type_id将是[0, 0, 0, 1, 1, 1, 0, 0]。但请注意[SEP]一定要大写的,不能是[sep],否则无法识别。 -更多 :class:`~fastNLP.embedding.BertEmbedding` 的使用,请参考BertEmbedding的使用教程 - -.. todo:: - 找人写一篇BertEmbedding的使用教程 +更多 :class:`~fastNLP.embedding.BertEmbedding` 的使用,请参考 :doc:`/tutorials/extend_1_bert_embedding` ----------------------------------------------------- Part VI: 使用character-level的embedding diff --git a/docs/source/tutorials/tutorial_6_datasetiter.rst b/docs/source/tutorials/tutorial_6_datasetiter.rst index 9ace3b4f..12b2659a 100644 --- a/docs/source/tutorials/tutorial_6_datasetiter.rst +++ b/docs/source/tutorials/tutorial_6_datasetiter.rst @@ -72,7 +72,7 @@ DataSetIter初探之前的内容与 :doc:`/tutorials/tutorial_5_loss_optimizer` :class:`~fastNLP.io.SST2Pipe` 类的 :meth:`~fastNLP.io.SST2Pipe.process_from_file` 方法在预处理过程中还将训练、测试、验证集 的 `words` 、`seq_len` :mod:`~fastNLP.core.field` 设定为input,同时将`target` :mod:`~fastNLP.core.field` 设定为target。 我们可以通过 :class:`~fastNLP.core.Dataset` 类的 :meth:`~fastNLP.core.Dataset.print_field_meta` 方法查看各个 - :mod:`~fastNLP.core.field` 的设定情况,代码如下: + :mod:`~fastNLP.core.field` 的设定情况,代码如下: .. code-block:: python @@ -91,7 +91,7 @@ DataSetIter初探之前的内容与 :doc:`/tutorials/tutorial_5_loss_optimizer` 其中is_input和is_target分别表示是否为input和target。ignore_type为true时指使用 :class:`~fastNLP.DataSetIter` 取出batch数 据时fastNLP不会进行自动padding,pad_value指对应 :mod:`~fastNLP.core.field` padding所用的值,这两者只有当 - :mod:`~fastNLP.core.field` 设定为input或者target的时候才有存在的意义。 + :mod:`~fastNLP.core.field` 设定为input或者target的时候才有存在的意义。 is_input为true的 :mod:`~fastNLP.core.field` 在 :class:`~fastNLP.DataSetIter` 迭代取出的 batch_x 中, 而 is_target为true的 :mod:`~fastNLP.core.field` 在 :class:`~fastNLP.DataSetIter` 迭代取出的 batch_y 中。 diff --git a/docs/source/user/tutorials.rst b/docs/source/user/tutorials.rst index 85049463..2733ceb5 100644 --- a/docs/source/user/tutorials.rst +++ b/docs/source/user/tutorials.rst @@ -19,3 +19,7 @@ fastNLP 详细使用教程 使用Callback自定义你的训练过程 使用fitlog 辅助 fastNLP 进行科研 +.. toctree:: + :maxdepth: 1 + + 拓展阅读:BertEmbedding的各种用法 diff --git a/tutorials/README.md b/tutorials/README.md index 83df2bb9..2c228af2 100644 --- a/tutorials/README.md +++ b/tutorials/README.md @@ -1,7 +1,3 @@ # fastNLP 教程 -### 上手教程 Quick Start -`quickstart.ipynb` [Click Here](https://github.com/fastnlp/fastNLP/tree/master/tutorials/quickstart.ipynb) - -### 详细教程 Tutorial 1 -十分钟上手:`tutorial_1.ipynb` [Click Here](https://github.com/fastnlp/fastNLP/tree/master/tutorials/tutorial_1.ipynb) +这里只保留了部分的 \ No newline at end of file