ヘルプKaggleにTensorFlowグレートバリアリーフを保護チャレンジに参加

TensorFlowLiteモデルメーカーを使用したBERTの質問への回答

TensorFlow.orgで表示 GoogleColabで実行 GitHubでソースを表示 ノートブックをダウンロード

TensorFlowライトモデルメーカーのライブラリは、オンデバイスMLアプリケーション用にこのモデルを展開するとき、特定の入力データにTensorFlowモデルを適応と変換するプロセスを単純化します。

このノートブックは、Model Makerライブラリを利用して、質問回答タスクで一般的に使用される質問回答モデルの適応と変換を説明するエンドツーエンドの例を示しています。

BERT質問回答タスクの概要

このライブラリでサポートされているタスクは、抽出的な質問回答タスクです。つまり、パッセージと質問が与えられた場合、回答はパッセージのスパンです。下の画像は、質問の回答の例を示しています。

回答は、通路(:画像クレジットでスパンされているチームのブログ

質問回答タスクのモデルに関しては、入力はすでに前処理されたパッセージと質問のペアである必要があり、出力はパッセージ内の各トークンの開始ロジットと終了ロジットである必要があります。入力のサイズは、パッセージと質問の長さに応じて設定および調整できます。

エンドツーエンドの概要

次のコードスニペットは、数行のコード内でモデルを取得する方法を示しています。全体的なプロセスには、(1)モデルの選択、(2)データの読み込み、(3)モデルの再トレーニング、(4)評価、(5)TensorFlowLite形式へのエクスポートの5つのステップが含まれます。

# Chooses a model specification that represents the model.
spec = model_spec.get('mobilebert_qa')

# Gets the training data and validation data.
train_data = DataLoader.from_squad(train_data_path, spec, is_training=True)
validation_data = DataLoader.from_squad(validation_data_path, spec, is_training=False)

# Fine-tunes the model.
model = question_answer.create(train_data, model_spec=spec)

# Gets the evaluation result.
metric = model.evaluate(validation_data)

# Exports the model to the TensorFlow Lite format with metadata in the export directory.
model.export(export_dir)

次のセクションでは、コードについて詳しく説明します。

前提条件

この例を実行するには、より型式メーカパッケージを含め、必要なパッケージをインストールGitHubのレポ

pip install -q tflite-model-maker

必要なパッケージをインポートします。

import numpy as np
import os

import tensorflow as tf
assert tf.__version__.startswith('2')

from tflite_model_maker import model_spec
from tflite_model_maker import question_answer
from tflite_model_maker.config import ExportFormat
from tflite_model_maker.question_answer import DataLoader
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/pkg_resources/__init__.py:119: PkgResourcesDeprecationWarning: 0.18ubuntu0.18.04.1 is an invalid version and will not be supported in a future release
  PkgResourcesDeprecationWarning,
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/numba/core/errors.py:168: UserWarning: Insufficiently recent colorama version found. Numba requires colorama >= 0.3.9
  warnings.warn(msg)

「エンドツーエンドの概要」は、単純なエンドツーエンドの例を示しています。次のセクションでは、例を段階的に説明して、詳細を示します。

質問回答のモデルを表すmodel_specを選択します

model_specオブジェクトは、質問の答えのための特定のモデルを表しています。モデルメーカーは現在、MobileBERTおよびBERT-Baseモデルをサポートしています。

サポートされているモデルmodel_specの名前モデルの説明
MobileBERT 'mobilebert_qa' BERT-Baseより4.3倍小さく、5.5倍高速でありながら、デバイス上のシナリオに適した競争力のある結果を達成します。
MobileBERT-SQuAD 'mobilebert_qa_squad' MobileBERTモデルと初期モデルと同じモデルのアーキテクチャは、すでに上で再学習さSQuAD1.1
BERT-Base 'bert_qa' NLPタスクで広く使用されている標準のBERTモデル。

このチュートリアルでは、 MobileBERT-チームは例として使用されます。モデルはすでに上で再訓練されているのでSQuAD1.1 、それはより速く、質問の回答タスクの報道でした。

spec = model_spec.get('mobilebert_qa_squad')

オンデバイスMLアプリに固有の入力データを読み込み、データを前処理します

TriviaQAは650K以上の質問の回答、証拠のトリプルを含む読解のデータセットです。このチュートリアルでは、このデータセットのサブセットを使用して、ModelMakerライブラリの使用方法を学習します。

データをロードするには、TriviaQAデータセットは、に変換SQuAD1.1の実行することにより、フォーマットコンバータのPythonスクリプト--sample_size=8000とのセットwebデータを。次の方法で変換コードを少し変更します。

  • コンテキストドキュメントで回答が見つからなかったサンプルをスキップします。
  • 大文字または小文字を使用せずに、コンテキストで元の回答を取得します。

すでに変換されたデータセットのアーカイブバージョンをダウンロードします。

train_data_path = tf.keras.utils.get_file(
    fname='triviaqa-web-train-8000.json',
    origin='https://storage.googleapis.com/download.tensorflow.org/models/tflite/dataset/triviaqa-web-train-8000.json')
validation_data_path = tf.keras.utils.get_file(
    fname='triviaqa-verified-web-dev.json',
    origin='https://storage.googleapis.com/download.tensorflow.org/models/tflite/dataset/triviaqa-verified-web-dev.json')
Downloading data from https://storage.googleapis.com/download.tensorflow.org/models/tflite/dataset/triviaqa-web-train-8000.json
32571392/32570663 [==============================] - 0s 0us/step
32579584/32570663 [==============================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/download.tensorflow.org/models/tflite/dataset/triviaqa-verified-web-dev.json
1171456/1167744 [==============================] - 0s 0us/step
1179648/1167744 [==============================] - 0s 0us/step

独自のデータセットを使用してMobileBERTモデルをトレーニングすることもできます。このノートブックをColabで実行している場合は、左側のサイドバーを使用してデータをアップロードします。

ファイルをアップロードする

あなたはクラウドにデータをアップロードしたくない場合は、以下により、ライブラリをオフラインで実行することができ、ガイドを

使用DataLoader.from_squad負荷方法及び前処理するチーム形式特定のに応じてデータをmodel_spec 。 SQuAD2.0またはSQuAD1.1形式のいずれかを使用できます。パラメータを設定version_2_with_negativeとしてTrue手段書式はSQuAD2.0です。それ以外の場合、形式はSQuAD1.1です。デフォルトではversion_2_with_negativeFalse

train_data = DataLoader.from_squad(train_data_path, spec, is_training=True)
validation_data = DataLoader.from_squad(validation_data_path, spec, is_training=False)

TensorFlowモデルをカスタマイズする

ロードされたデータに基づいてカスタムの質問回答モデルを作成します。 create機能は、以下の工程を含みます:

  1. 応じて質問の答えのためのモデルを作成しますmodel_spec
  2. 質問回答モデルをトレーニングします。デフォルトのエポックとデフォルトのバッチサイズは、2つの変数のに応じて設定されているdefault_training_epochsdefault_batch_sizemodel_specオブジェクト。
model = question_answer.create(train_data, model_spec=spec)
INFO:tensorflow:Retraining the models...
INFO:tensorflow:Retraining the models...
Epoch 1/2
1067/1067 [==============================] - 423s 350ms/step - loss: 1.1349 - start_positions_loss: 1.1323 - end_positions_loss: 1.1374
Epoch 2/2
1067/1067 [==============================] - 373s 350ms/step - loss: 0.7937 - start_positions_loss: 0.7928 - end_positions_loss: 0.7946

詳細なモデル構造をご覧ください。

model.summary()
Model: "model"
__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_word_ids (InputLayer)     [(None, 384)]        0                                            
__________________________________________________________________________________________________
input_mask (InputLayer)         [(None, 384)]        0                                            
__________________________________________________________________________________________________
input_type_ids (InputLayer)     [(None, 384)]        0                                            
__________________________________________________________________________________________________
hub_keras_layer_v1v2 (HubKerasL {'end_logits': (None 24582914    input_word_ids[0][0]             
                                                                 input_mask[0][0]                 
                                                                 input_type_ids[0][0]             
__________________________________________________________________________________________________
start_positions (Lambda)        (None, None)         0           hub_keras_layer_v1v2[0][1]       
__________________________________________________________________________________________________
end_positions (Lambda)          (None, None)         0           hub_keras_layer_v1v2[0][0]       
==================================================================================================
Total params: 24,582,914
Trainable params: 24,582,914
Non-trainable params: 0
__________________________________________________________________________________________________

カスタマイズされたモデルを評価する

バリデーションデータにモデルを評価し、含めたメトリクスの辞書取得f1スコアをし、 exact match指標がSQuAD1.1とSQuAD2.0のために異なっていることを注意など。

model.evaluate(validation_data)
INFO:tensorflow:Made predictions for 200 records.
INFO:tensorflow:Made predictions for 200 records.
INFO:tensorflow:Made predictions for 400 records.
INFO:tensorflow:Made predictions for 400 records.
INFO:tensorflow:Made predictions for 600 records.
INFO:tensorflow:Made predictions for 600 records.
INFO:tensorflow:Made predictions for 800 records.
INFO:tensorflow:Made predictions for 800 records.
INFO:tensorflow:Made predictions for 1000 records.
INFO:tensorflow:Made predictions for 1000 records.
INFO:tensorflow:Made predictions for 1200 records.
INFO:tensorflow:Made predictions for 1200 records.
{'exact_match': 0.5918367346938775, 'final_f1': 0.6650690579262007}

TensorFlowLiteモデルにエクスポート

訓練されたモデルが持つTensorFlow Liteのモデル形式に変換するメタデータ後でオンデバイスMLアプリケーションで使用できるようにします。語彙ファイルはメタデータに埋め込まれています。デフォルトTFLiteのファイル名ですmodel.tflite

多くのオンデバイスMLアプリケーションでは、モデルサイズが重要な要素です。したがって、モデルを小さくして実行速度を上げる可能性があるように、クオンタイズを適用することをお勧めします。デフォルトのトレーニング後の量子化手法は、BERTおよびMobileBERTモデルのダイナミックレンジ量子化です。

model.export(export_dir='.')
2021-11-02 12:02:44.147451: W tensorflow/python/util/util.cc:348] Sets are not currently considered sequences, but this may change in the future, so consider avoiding using them.
INFO:tensorflow:Assets written to: /tmp/tmpn2lze71h/saved_model/assets
INFO:tensorflow:Assets written to: /tmp/tmpn2lze71h/saved_model/assets
2021-11-02 12:03:15.381028: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:351] Ignored output_format.
2021-11-02 12:03:15.381073: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:354] Ignored drop_control_dependency.
2021-11-02 12:03:15.381080: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:360] Ignored change_concat_input_ranges.
INFO:tensorflow:Vocab file is inside the TFLite model with metadata.
INFO:tensorflow:Vocab file is inside the TFLite model with metadata.
INFO:tensorflow:Saved vocabulary in /tmp/tmpz6v1li70/vocab.txt.
INFO:tensorflow:Saved vocabulary in /tmp/tmpz6v1li70/vocab.txt.
INFO:tensorflow:Finished populating metadata and associated file to the model:
INFO:tensorflow:Finished populating metadata and associated file to the model:
INFO:tensorflow:./model.tflite
INFO:tensorflow:./model.tflite
INFO:tensorflow:The associated file that has been been packed to the model is:
INFO:tensorflow:The associated file that has been been packed to the model is:
INFO:tensorflow:['vocab.txt']
INFO:tensorflow:['vocab.txt']
INFO:tensorflow:TensorFlow Lite model exported successfully: ./model.tflite
INFO:tensorflow:TensorFlow Lite model exported successfully: ./model.tflite

あなたは中TensorFlow Liteのモデルファイルを使用することができますbert_qaの使用リファレンスアプリをBertQuestionAnswererのAPIをTensorFlow Liteのタスク・ライブラリーコラボの左のサイドバーから、それをダウンロードして。

許可されるエクスポート形式は、次の1つまたはリストのいずれかです。

デフォルトでは、メタデータを使用してTensorFlowLiteモデルをエクスポートするだけです。異なるファイルを選択的にエクスポートすることもできます。たとえば、次のように語彙ファイルのみをエクスポートします。

model.export(export_dir='.', export_format=ExportFormat.VOCAB)
INFO:tensorflow:Saved vocabulary in ./vocab.txt.
INFO:tensorflow:Saved vocabulary in ./vocab.txt.

あなたはまた、とtflite機種評価できるevaluate_tflite方法を。このステップには長い時間がかかると予想されます。

model.evaluate_tflite('model.tflite', validation_data)
INFO:tensorflow:Made predictions for 100 records.
INFO:tensorflow:Made predictions for 100 records.
INFO:tensorflow:Made predictions for 200 records.
INFO:tensorflow:Made predictions for 200 records.
INFO:tensorflow:Made predictions for 300 records.
INFO:tensorflow:Made predictions for 300 records.
INFO:tensorflow:Made predictions for 400 records.
INFO:tensorflow:Made predictions for 400 records.
INFO:tensorflow:Made predictions for 500 records.
INFO:tensorflow:Made predictions for 500 records.
INFO:tensorflow:Made predictions for 600 records.
INFO:tensorflow:Made predictions for 600 records.
INFO:tensorflow:Made predictions for 700 records.
INFO:tensorflow:Made predictions for 700 records.
INFO:tensorflow:Made predictions for 800 records.
INFO:tensorflow:Made predictions for 800 records.
INFO:tensorflow:Made predictions for 900 records.
INFO:tensorflow:Made predictions for 900 records.
INFO:tensorflow:Made predictions for 1000 records.
INFO:tensorflow:Made predictions for 1000 records.
INFO:tensorflow:Made predictions for 1100 records.
INFO:tensorflow:Made predictions for 1100 records.
INFO:tensorflow:Made predictions for 1200 records.
INFO:tensorflow:Made predictions for 1200 records.
{'exact_match': 0.5884353741496599, 'final_f1': 0.6645399573971004}

高度な使用法

create機能は、ここで、このライブラリの重要な部分であるmodel_specパラメータは、モデルの仕様を定義します。 BertQASpecクラスは、現在サポートされています。 MobileBERTモデルとBERT-Baseモデルの2つのモデルがあります。 create関数が以下のステップを含みます。

  1. 応じて質問の答えのためのモデルを作成しますmodel_spec
  2. 質問回答モデルをトレーニングします。

このセクションでは、モデルの調整、トレーニングハイパーパラメータの調整など、いくつかの高度なトピックについて説明します。

モデルを調整する

あなたはパラメータのようにモデルのインフラストラクチャを調整することができseq_lenquery_lenBertQASpecクラス。

モデルの調整可能なパラメーター:

  • seq_len :モデルへの供給への通路の長さ。
  • query_len :モデルへの供給への質問の長さ。
  • doc_stride :文書のチャンクを取るためにスライディングウィンドウアプローチをしてストライドを。
  • initializer_range :すべての重み行列を初期化するためのtruncated_normal_initializerのSTDEV。
  • trainable :ブール、事前に訓練を受けた層が学習可能であるかどうか。

トレーニングパイプラインの調整可能なパラメーター:

  • model_dir :モデルのチェックポイントファイルの場所。設定されていない場合、一時ディレクトリが使用されます。
  • dropout_rate :ドロップアウト率。
  • learning_rate :アダムの初期学習率。
  • predict_batch_size :予測のためのバッチサイズ。
  • tpu :TPUアドレスに接続します。 tpuを使用する場合にのみ使用されます。

たとえば、より長いシーケンス長でモデルをトレーニングできます。あなたがモデルを変更する場合は、まず新しい構築しなければならないmodel_spec

new_spec = model_spec.get('mobilebert_qa')
new_spec.seq_len = 512

残りの手順は同じです。あなたは両方の再実行する必要があることに注意dataloaderしてcreate別のモデルのスペックとして、部品が異なる前処理ステップを有することができます。

トレーニングハイパーパラメータを調整する

また、チューニングのようなトレーニングハイパーできepochsbatch_sizeモデルのパフォーマンスに影響します。例えば、

  • epochs :より多くのエポックは、より良い性能を達成できましたが、オーバーフィッティングにつながる可能性があります。
  • batch_size :1つのトレーニング段階で使用するサンプルの数。

たとえば、次のように、より多くのエポックとより大きなバッチサイズでトレーニングできます。

model = question_answer.create(train_data, model_spec=spec, epochs=5, batch_size=64)

モデルアーキテクチャを変更する

あなたはベースモデルに変更することによって、上のデータ列に変更することができmodel_spec 。たとえば、BERT-Baseモデルに変更するには、次のコマンドを実行します。

spec = model_spec.get('bert_qa')

残りの手順は同じです。

TensorFlowLiteモデルでトレーニング後の量子化をカスタマイズする

訓練後の量子化はまた、CPUとハードウェアアクセラレータ推論速度を向上させながら、モデル精度の劣化の少ない、モデルサイズと推論待ち時間を低減することができる変換技術です。したがって、モデルを最適化するために広く使用されています。

モデルメーカーライブラリは、モデルをエクスポートするときに、デフォルトのトレーニング後の量子化手法を適用します。あなたは訓練後の量子化をカスタマイズしたい場合は、モデルのメーカーが使用して複数の訓練後の量子化オプションをサポートQuantizationConfigをうまくように。たとえば、float16量子化を取り上げましょう。まず、量子化構成を定義します。

config = QuantizationConfig.for_float16()

次に、そのような構成でTensorFlowLiteモデルをエクスポートします。

model.export(export_dir='.', tflite_filename='model_fp16.tflite', quantization_config=config)

続きを読む

あなたは私たちの読むことができるBERTの質問をし、回答の技術的な詳細を学ぶために例を。詳細については、以下を参照してください。