ホーム » 「HuggingFace Transformers 3.4」タグがついた投稿

タグアーカイブ: HuggingFace Transformers 3.4

HuggingFace Transformers 3.4 : 訓練と再調整

HuggingFace Transformers 3.4 : 訓練と再調整 (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 11/22/2020 (3.4.0)

* 本ページは、HuggingFace Transformers の以下のドキュメントを翻訳した上で適宜、補足説明したものです:

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

無料セミナー開催中 クラスキャット主催 人工知能 & ビジネス Web セミナー

人工知能とビジネスをテーマにウェビナー (WEB セミナー) を定期的に開催しています。スケジュールは弊社 公式 Web サイト でご確認頂けます。
  • お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。
  • Windows PC のブラウザからご参加が可能です。スマートデバイスもご利用可能です。

お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。

株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
E-Mail:sales-info@classcat.com ; WebSite: https://www.classcat.com/
Facebook: https://www.facebook.com/ClassCatJP/

 

HuggingFace Transformers : 訓練と再調整

Transformers のモデルクラスは native PyTorch と TensorFlow 2 と互換であるように設計されそしていずれと共にシームレスに利用可能です。このクイックスタートでは、いずれのフレームワークでも利用可能な標準訓練ツールを使用してモデルをどのように再調整するか (or スクラッチから訓練するか) を示します。含まれる Trainer() クラスをどのように使用するかも示します、これは訓練の複雑さの大半を貴方のために処理します。

このガイドは推論のためにモデルをロードして使用することに既に馴染みがあることを仮定します : そうでないなら タスクの概要 を見てください。貴方が PyTorch か TF2 のいずれかの深層ニューラルネットワークの訓練に馴染みがあることも仮定し、 Transformers の訓練のためのニュアンスとツールに特にフォーカスします。

 

native PyTorch で再調整する

TF で始まらない Transformers のモデルクラスは PyTorch モジュールで、これは推論と最適化の両者のために丁度 PyTorch の任意のモデルのようにそれらを利用できることを意味します。

シークエンス分類データセット上で BERT のようなマスク付き言語モデルを再調整する一般的なタスクを考えましょう。モデルを from_pretrained() でインスタンス化するとき、モデルを初期化するために指定されたモデルのモデル configuration と事前訓練重みが使用されます。ライブラリはまた幾つかのタスク固有の最終層や「ヘッド」も含みます、それらの重みは指定された事前訓練モデルに存在しないときランダムにインスタンス化されます。例えば、BertForSequenceClassification.from_pretrained(‘bert-base-uncased’, num_labels=2) によるモデルのインスタンス化は bert-base-uncased モデルからコピーされたエンコーダ重みとエンコーダの上に 2 の出力サイズを持つランダムに初期化されたシークエンス分類ヘッドで BERT モデルインスタンスを作成します。モデルはデフォルトでは eval モードで初期化されます。それを train モードに置くために model.train() を呼び出すことができます。

from transformers import BertForSequenceClassification
model = BertForSequenceClassification.from_pretrained('bert-base-uncased', return_dict=True)
model.train()

これは有用です、何故ならばそれは事前訓練された BERT エンコーダを利用してそれを選択するどのようなシークエンス分類データセットの上でも容易に訓練することを許容するからです。任意の PyTorch optimizer を利用できますが、ライブラリはまた AdamW() optimizer も提供します、これは重み減衰に加えて勾配バイアス補正 (= gradient bias correction) を実装しています。

from transformers import AdamW
optimizer = AdamW(model.parameters(), lr=1e-5)

optimizer は特定のパラメータグループのために異なるハイパーパラメータを適用することを許容します。例えば、重み減衰をバイアスと層正規化項以外の総てのパラメータに適用できます :

no_decay = ['bias', 'LayerNorm.weight']
optimizer_grouped_parameters = [
    {'params': [p for n, p in model.named_parameters() if not any(nd in n for nd in no_decay)], 'weight_decay': 0.01},
    {'params': [p for n, p in model.named_parameters() if any(nd in n for nd in no_decay)], 'weight_decay': 0.0}
]
optimizer = AdamW(optimizer_grouped_parameters, lr=1e-5)

今では __call__() を使用して単純なダミー訓練バッチをセットアップすることができます。これは BatchEncoding() インスタンスを返します、これはモデルに渡す必要があるかもしれない総てを準備します。

from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
text_batch = ["I love Pixar.", "I don't care for Pixar."]
encoding = tokenizer(text_batch, return_tensors='pt', padding=True, truncation=True)
input_ids = encoding['input_ids']
attention_mask = encoding['attention_mask']

分類モデルを labels 引数で呼び出すとき、最初の返される要素は予測と渡されたラベルの間んほ交差エントロピーです。optimizer を既にセットアップしていますので、それから backwards を行ない重みを更新することができます :

labels = torch.tensor([1,0]).unsqueeze(0)
outputs = model(input_ids, attention_mask=attention_mask, labels=labels)
loss = outputs.loss
loss.backward()
optimizer.step()

代わりに、単にロジットを得て損失を貴方自身で計算することもできます。次は前のサンプルと同値です :

from torch.nn import functional as F
labels = torch.tensor([1,0])
outputs = model(input_ids, attention_mask=attention_mask)
loss = F.cross_entropy(outputs.logits, labels)
loss.backward()
optimizer.step()

もちろん、通常のようにモデルと入力上で to(‘cuda’) を呼び出して GPU 上で訓練することができます。

2, 3 の学習率スケジューリング・ツールも提供します。以下によって、スケジューラのセットアップができます、これは num_warmup_steps の間ウォームアップしてから訓練の終わりまでに 0 に線形に減衰します。

from transformers import get_linear_schedule_with_warmup
scheduler = get_linear_schedule_with_warmup(optimizer, num_warmup_steps, num_train_steps)

それから行なわなければならないことの総ては optimizer.step() の後で scheduler.step() を呼び出すことです。

loss.backward()
optimizer.step()
scheduler.step()

下で議論されるように、Trainer() を使用することを強く勧めます、これは混合精度と容易な tensorboard ロギングのような特徴とともに Transformers モデルを訓練する可動部を便利に処理します。

 

エンコーダを凍結する

ある場合には、事前訓練されたエンコーダの重みを凍結し続けてヘッド層の重みだけを最適化することに関心があるかもしれません。そのためには、エンコーダ・パラメータ上で単純に requires_grad 属性を False に設定します、これはライブラリの任意のタスク固有モデル上 base_model サブモジュールでアクセスできます :

for param in model.base_model.parameters():
    param.requires_grad = False

 

native TensorFlow 2 で再調整する

モデルはまた TensorFlow 2 でもネイティブに訓練できます。ちょうど PyTorch でのように、TensorFlow モデルはエンコーダの重みをロードするために from_pretrained() でインスタンス化できます。

from transformers import TFBertForSequenceClassification
model = TFBertForSequenceClassification.from_pretrained('bert-base-uncased')

GLUE からの MRPC データセット をロードするために tensorflow_datasets を使用しましょう。それから MRPC をトークン化してそれを TensorFlow Dataset オブジェクトに変換するために組込み glue_convert_examples_to_features() を利用できます。tokenizer はフレームワーク不可知ですので、事前訓練された tokenizer 名に TF を先頭に追加する必要はありません。

from transformers import BertTokenizer, glue_convert_examples_to_features
import tensorflow as tf
import tensorflow_datasets as tfds
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
data = tfds.load('glue/mrpc')
train_dataset = glue_convert_examples_to_features(data['train'], tokenizer, max_length=128, task='mrpc')
train_dataset = train_dataset.shuffle(100).batch(32).repeat(2)

そしてモデルは任意の Keras モデルとしてコンパイルされて訓練できます :

optimizer = tf.keras.optimizers.Adam(learning_rate=3e-5)
loss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
model.compile(optimizer=optimizer, loss=loss)
model.fit(train_dataset, epochs=2, steps_per_epoch=115)

TensorFlow と PyTorch モデル間の緊密な相互運用性により、モデルをセーブしてからそれを PyTorch モデルとして再ロードすることさえできます (or vice-versa) :

from transformers import BertForSequenceClassification
model.save_pretrained('./my_mrpc_model/')
pytorch_model = BertForSequenceClassification.from_pretrained('./my_mrpc_model/', from_tf=True)

 

Trainer

Trainer()TFTrainer() を通して単純ですが feature-complete な訓練と評価インターフェイスもまた提供します。広範囲の訓練オプションとロギング、勾配集積 (= accumulation) と混合精度のような組込み特徴で任意の Transformers モデルを訓練し、再調整し、そして評価することができます。

TensorFlow

from transformers import TFBertForSequenceClassification, TFTrainer, TFTrainingArguments

model = TFBertForSequenceClassification.from_pretrained("bert-large-uncased")

training_args = TFTrainingArguments(
    output_dir='./results',          # output directory
    num_train_epochs=3,              # total # of training epochs
    per_device_train_batch_size=16,  # batch size per device during training
    per_device_eval_batch_size=64,   # batch size for evaluation
    warmup_steps=500,                # number of warmup steps for learning rate scheduler
    weight_decay=0.01,               # strength of weight decay
    logging_dir='./logs',            # directory for storing logs
)

trainer = TFTrainer(
    model=model,                         # the instantiated 🤗 Transformers model to be trained
    args=training_args,                  # training arguments, defined above
    train_dataset=tfds_train_dataset,    # tensorflow_datasets training dataset
    eval_dataset=tfds_test_dataset       # tensorflow_datasets evaluation dataset
)

PyTorch

from transformers import BertForSequenceClassification, Trainer, TrainingArguments

model = BertForSequenceClassification.from_pretrained("bert-large-uncased")

training_args = TrainingArguments(
    output_dir='./results',          # output directory
    num_train_epochs=3,              # total # of training epochs
    per_device_train_batch_size=16,  # batch size per device during training
    per_device_eval_batch_size=64,   # batch size for evaluation
    warmup_steps=500,                # number of warmup steps for learning rate scheduler
    weight_decay=0.01,               # strength of weight decay
    logging_dir='./logs',            # directory for storing logs
)

trainer = Trainer(
    model=model,                         # the instantiated 🤗 Transformers model to be trained
    args=training_args,                  # training arguments, defined above
    train_dataset=train_dataset,         # training dataset
    eval_dataset=test_dataset            # evaluation dataset
)

今では単純に訓練するために trainer.train() をそして評価するために trainer.evaluate() を呼び出します。貴方自身のモジュールもまた使用できますが、forward から返される最初の引数は最適化することを望む損失でなければなりません。

Trainer() はバッチを順番に並べてそれらをモデルに供給されるように準備するために組込みのデフォルト関数を使用します。必要であれば、貴方自身の collator 関数を渡すために data_collator 引数も使用できます、これは貴方のデータセットにより提供される形式のデータを取りそしてモデルに供給される準備ができたバッチを返します。TFTrainer は渡されたデータセットが tensorflow_datasets からのデータセット・オブジェクトであることを想定していることに注意してください。

損失に加えて追加のメトリクスを計算するために、貴方自身の compute_metrics 関数も定義してそれを Trainer に渡すこともできます。

from sklearn.metrics import accuracy_score, precision_recall_fscore_support

def compute_metrics(pred):
    labels = pred.label_ids
    preds = pred.predictions.argmax(-1)
    precision, recall, f1, _ = precision_recall_fscore_support(labels, preds, average='binary')
    acc = accuracy_score(labels, preds)
    return {
        'accuracy': acc,
        'f1': f1,
        'precision': precision,
        'recall': recall
    }

最後に、指定された logging_dir ディレクトリで tensorboard を起動することにより任意の計算されたメトリクスを含む結果を見ることができます。

 

追加リソース

  • 軽量 colab デモ、これは IMDb センチメント分類のために Trainer を使用します。
  • Transformers サンプル、これは GLUE, SQuAD と幾つかの他のタスク上の訓練と再調整のためのスクリプトを含みます。
  • 言語モデルをどのように訓練するか、詳細な colab ノートブック、これは Esperanto 上でスクラッチからマスク付き言語モデルを訓練するために Trainer を使用します。
  • Transformers ノートブック、これは
    様々のタスク上 Transformers の訓練と利用のためのコミュニティからの数十のサンプル・ノートブックを含みます。
 

以上






HuggingFace Transformers 3.4 : データを前処理する

HuggingFace Transformers 3.4 : データを前処理する (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 11/20/2020 (3.4.0)

* 本ページは、HuggingFace Transformers の以下のドキュメントを翻訳した上で適宜、補足説明したものです:

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

無料セミナー開催中 クラスキャット主催 人工知能 & ビジネス Web セミナー

人工知能とビジネスをテーマにウェビナー (WEB セミナー) を定期的に開催しています。スケジュールは弊社 公式 Web サイト でご確認頂けます。
  • お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。
  • Windows PC のブラウザからご参加が可能です。スマートデバイスもご利用可能です。

お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。

株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
E-Mail:sales-info@classcat.com ; WebSite: https://www.classcat.com/
Facebook: https://www.facebook.com/ClassCatJP/

 

HuggingFace Transformers : データを前処理する

このチュートリアルでは、 Transformers を使用して貴方のデータをどのように前処理するかを探求します。このための主要ツールは私達が tokenizer と呼ぶものです。貴方が使用したいモデルに関係する tokenizer クラスを使用するか、あるいは直接 AutoTokenizer クラスでそれを構築できます。

クイックツアーで見たように、tokenizer は与えられたテキストを最初にトークンと呼ばれる単語 (or 単語の部分、句読点記号, etc.) に分割します。それからそれはそれらから tensor を構築できるようにトークンを数字に変換してそしてそれらをモデルに供給します。それはまたモデルが正しく動作するために想定するかもしれない任意の追加入力も追加します。

Note: 事前訓練モデルを使用する計画を立てているならば、関連する事前訓練 tokenizer を使用することは重要です : それは貴方がそれに与えるテキストを事前訓練コーパスのためのと同じ方法でトークンを分割してそしてそれはインデックスするために事前訓練の間と同じ correspondence トークン (それは通常は vocab と呼称します) を使用します。

与えられたモデルを事前訓練か再調整する間に使用された vocab を自動的にダウンロードするためには、from_pretrained() メソッドを利用できます :

from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained('bert-base-cased')

 

Base 使用方法

PreTrainedTokenizer は多くのメソッドを持ちますが、前処理のために覚えておく必要がある唯一のものはその __call__ です : センテンスを tokenizer オブジェクトに供給する必要があるだけです。

encoded_input = tokenizer("Hello, I'm a single sentence!")
print(encoded_input)
{'input_ids': [101, 138, 18696, 155, 1942, 3190, 1144, 1572, 13745, 1104, 159, 9664, 2107, 102],
 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}

これは int のリストへの辞書文字列を返します。input_ids はセンテンスの各トークンに対応するインデックスです。下で attention_mask が何のために使用されるか、そして次のセクションtoken_type_ids の目的を見ます。

tokenizer はトークン id のリストを正しいセンテンスでデコードできます :

tokenizer.decode(encoded_input["input_ids"])
"[CLS] Hello, I'm a single sentence! [SEP]"

見れるように、tokenizer はモデルが想定する幾つかの特殊トークンを自動的に追加しました。総てのモデルが特殊トークンを必要とはしません ; 例えば、tokenizer を作成するために bert-base-cased の代わりに `gtp2-medium` を使用した場合、ここで元の一つと同じセンテンスを見るでしょう。add_special_tokens=False を渡すことによりこの挙動を無効にできます (これは貴方自身で特殊トークンを追加した場合にのみ勧められます)。

処理することを望む幾つかのセンテンスを持つ場合、リストとしてそれらを tokenizer に送ることにより効率的にこれを行なうことができます :

batch_sentences = ["Hello I'm a single sentence",
                   "And another sentence",
                   "And the very very last one"]
encoded_inputs = tokenizer(batch_sentences)
print(encoded_inputs)
{'input_ids': [[101, 8667, 146, 112, 182, 170, 1423, 5650, 102],
               [101, 1262, 1330, 5650, 102],
               [101, 1262, 1103, 1304, 1304, 1314, 1141, 102]],
 'token_type_ids': [[0, 0, 0, 0, 0, 0, 0, 0, 0],
                    [0, 0, 0, 0, 0],
                    [0, 0, 0, 0, 0, 0, 0, 0]],
 'attention_mask': [[1, 1, 1, 1, 1, 1, 1, 1, 1],
                    [1, 1, 1, 1, 1],
                    [1, 1, 1, 1, 1, 1, 1, 1]]}

再度辞書を入手して、今回は int のリストのリストである値を持ちます。

一度に幾つかのセンテンスを tokenizer に送る目的がモデルに供給するバッチを構築することであるならば、貴方は多分以下を望むでしょう :

  • バッチで最大長に各センテンスをパッドする。
  • モデルが受け取れる最大長に各センテンスを truncate する (妥当な場合)。
  • tensor を返す。

センテンスのリストを tokenzier に供給するとき以下のオプションを使用してこれの総てを行なうことができます :

TensorFlow

batch = tokenizer(batch_sentences, padding=True, truncation=True, return_tensors="tf")
print(batch)
{'input_ids': tf.Tensor([[ 101, 8667,  146,  112,  182,  170, 1423, 5650,  102],
                      [ 101, 1262, 1330, 5650,  102,    0,    0,    0,    0],
                      [ 101, 1262, 1103, 1304, 1304, 1314, 1141,  102,    0]]),
 'token_type_ids': tf.Tensor([[0, 0, 0, 0, 0, 0, 0, 0, 0],
                           [0, 0, 0, 0, 0, 0, 0, 0, 0],
                           [0, 0, 0, 0, 0, 0, 0, 0, 0]]),
 'attention_mask': tf.Tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1],
                           [1, 1, 1, 1, 1, 0, 0, 0, 0],
                           [1, 1, 1, 1, 1, 1, 1, 1, 0]])}

PyTorch

batch = tokenizer(batch_sentences, padding=True, truncation=True, return_tensors="pt")
print(batch)
{'input_ids': tensor([[ 101, 8667,  146,  112,  182,  170, 1423, 5650,  102],
                      [ 101, 1262, 1330, 5650,  102,    0,    0,    0,    0],
                      [ 101, 1262, 1103, 1304, 1304, 1314, 1141,  102,    0]]),
 'token_type_ids': tensor([[0, 0, 0, 0, 0, 0, 0, 0, 0],
                           [0, 0, 0, 0, 0, 0, 0, 0, 0],
                           [0, 0, 0, 0, 0, 0, 0, 0, 0]]),
 'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1],
                           [1, 1, 1, 1, 1, 0, 0, 0, 0],
                           [1, 1, 1, 1, 1, 1, 1, 1, 0]])}

それは文字列キーと tensor 値を持つ辞書を返します。今では attention_mask が何かを総て見ることができます : それはモデルがどのトークンに注意を払うべきか、そしてどれに注意を払うべきでないかを指摘します (何故ならばこの場合それらはパディングを表すからです)。

モデルがそれに関連する最大長を持たない場合には、上のコマンドは警告を投げることに注意してください。それを安全に無視することができます。その種類の警告を投げることを tokenzier にやめさせるために verbose=False を渡すこともできます。

 

センテンスのペアを前処理する

時に貴方のモデルにセンテンスのペアを供給する必要があります。例えば、ペアの 2 つのセンテンスが類似しているか分類することを望んだり、コンテキストと質問を取る質問応答モデルについてです。BERT モデルに対しては、入力はこのように表されます : [CLS] Sequence A [SEP] Sequence B [SEP]

2 つの引数として 2 つのセンテンスを供給することによりモデルにより想定される形式でセンテンスのペアをエンコードできます (リストではありません、何故ならば 前に見たように、2 つのセンテンスのリストは 2 つの単一のセンテンスのバッチとして解釈されるからです)。これは再度 int のリストへの辞書文字列を返します :

encoded_input = tokenizer("How old are you?", "I'm 6 years old")
print(encoded_input)
{'input_ids': [101, 1731, 1385, 1132, 1128, 136, 102, 146, 112, 182, 127, 1201, 1385, 102],
 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1],
 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}

これは token_type_ids が何のためであるかを示します : それらはモデルに入力のどの部分が最初のセンテンスに対応してそしてどの部分が 2 番目のセンテンスに対応するかを示します。token_type_ids は総てのモデルにより必要とされたり処理されたりするわけではないことに注意してください。デフォルトでは、tokenizer は関連モデルが想定する入力を返すだけです。return_input_ids か return_token_type_ids を使用してそれらの特別な引数のいずれかの return (or non-return) を強制できます。

私達が得たトークン id をデコードすれば、特殊トークンが正しく追加されたことを見ます。

tokenizer.decode(encoded_input["input_ids"])
"[CLS] How old are you? [SEP] I'm 6 years old [SEP]"

処理することを望むシークエンスのペアのリストを持つ場合、それらを tokenizer に 2 つのリストとして供給するべきです : 最初のセンテンスのリストと 2 番目のセンテンスのリストです :

batch_sentences = ["Hello I'm a single sentence",
                   "And another sentence",
                   "And the very very last one"]
batch_of_second_sentences = ["I'm a sentence that goes with the first sentence",
                             "And I should be encoded with the second sentence",
                             "And I go with the very last one"]
encoded_inputs = tokenizer(batch_sentences, batch_of_second_sentences)
print(encoded_inputs)
{'input_ids': [[101, 8667, 146, 112, 182, 170, 1423, 5650, 102, 146, 112, 182, 170, 5650, 1115, 2947, 1114, 1103, 1148, 5650, 102],
               [101, 1262, 1330, 5650, 102, 1262, 146, 1431, 1129, 12544, 1114, 1103, 1248, 5650, 102],
               [101, 1262, 1103, 1304, 1304, 1314, 1141, 102, 1262, 146, 1301, 1114, 1103, 1304, 1314, 1141, 102]],
'token_type_ids': [[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
                   [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
                   [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1]],
'attention_mask': [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
                   [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
                   [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]}

見れるように、それは各値が int のリストのリストであるような辞書を返します。

何がモデルに供給されるかを二重チェックするために、input_ids の各リストを一つずつデコードできます :

for ids in encoded_inputs["input_ids"]:
    print(tokenizer.decode(ids))
[CLS] Hello I'm a single sentence [SEP] I'm a sentence that goes with the first sentence [SEP]
[CLS] And another sentence [SEP] And I should be encoded with the second sentence [SEP]
[CLS] And the very very last one [SEP] And I go with the very last one [SEP]

再度、入力をバッチの最大センテンス長に自動的にパッドし、モデルが受容できる最大長に truncate してそして以下とともに tensor を直接返すことができます :

TensorFlow

batch = tokenizer(batch_sentences, batch_of_second_sentences, padding=True, truncation=True, return_tensors="tf")

PyTorch

batch = tokenizer(batch_sentences, batch_of_second_sentences, padding=True, truncation=True, return_tensors="pt")

 

パディングと truncation について貴方が常に知りたいことの総て

殆どの場合について動作するコマンドを見ました (バッチを最大センテンス長にパッドし、モデルが受容できる最大長に truncate します)。けれども、API はより多くのストラテジーをサポートします、貴方がそれらを必要とする場合に。このために知る必要がある 3 つの引数は padding, truncation と max_length です。

  • padding はパディングを制御します。それは以下であるべき boolean か文字列であり得ます :
    • True or ‘longest’、バッチの最長のシークエンスにパッドします (単一シークエンスだけを提供する場合にはパディングをしません)。
    • ‘max_length’、max_length 引数か (max_length が提供されない場合 (max_length=None)) モデルにより受容される最大長により指定される長さにパッドします。単一シークエンスだけを提供する場合、パディングは依然としてそれに適用されます。
    • False or ‘do_not_pad’、シークエンスをパッドしません。前に見たように、これはデフォルトの動作です。

  • truncation は truncation を制御します。それは以下であるべき boolean か文字列であり得ます :
    • True or ‘only_first’ は max_length 引数か (max_length が提供されない場合 (max_length=None)) モデルにより受容される最大長により指定される最大長に truncate します。シークエンスのペア (or シークエンスのペアのバッチ) が提供される場合、ペアの最初のセンテンスだけを truncate します。
    • ‘only_second’ は max_length 引数か (max_length が提供されない場合 (max_length=None)) モデルにより受容される最大長により指定される最大長に truncate します。これはシークエンスのペア (or シークエンスのペアのバッチ) が提供される場合、ペアの 2 番目のセンテンスだけを truncate します。
    • ‘longest_first’ は max_length 引数か (max_length が提供されない場合 (max_length=None)) モデルにより受容される最大長により指定される最大長に truncate します。これはトークン毎に truncate し、適切な長さに達するまでペアの最長のシークエンスからトークンを除去します。
    • False or ‘do_not_truncate’ はシークエンスを truncate しません。前に見たように、これはデフォルトの動作です。

  • max_length はパディング/truncation の長さを制御します。それは整数か None であり得て、その場合それはモデルが受容できる最大長をデフォルトとします。モデルは特定の最大入力長を持たない場合、max_length への truncation/パディングは無効にされます。

ここにパディングと tuncation をセットアップするための推奨方法を要約するテーブルがあります。以下のサンプルのいずれかで入力シークエンスのペアを使用する場合、truncation=True を [‘only_first’, ‘only_second’, ‘longest_first’] で選択された STRATEGY で置き換えることができます、i.e. truncation=’only_second’ or truncation= ‘longest_first’ は前に詳述されたようにペアの両者のシークエンスがどのように truncate されるかを制御するかです。

(訳注: テーブルは 原文 参照)

 

Pre-tokenized 入力

tokenizer はまた pre-tokenized 入力も受け取ります。これは固有表現認識 (NER) や品詞タギング (POS タギング) でラベルを計算して予測を抽出することを望むときに特に有用です。

Warning: pre-tokenized は、貴方の入力が既にトークン化されている (その場合にはそれらを tokenizer に渡す必要はありません) ことを意味しませんが、単に単語に分割されています (それはしばしば BPE のような 部分単語トークン化アルゴリズムの最初のステップです)。

pre-tokenized 入力を使用することを望む場合、入力を tokenzier に渡すとき単に is_split_into_words=True を設定します。例えば、以下を持ちます :

encoded_input = tokenizer(["Hello", "I'm", "a", "single", "sentence"], is_split_into_words=True)
print(encoded_input)
{'input_ids': [101, 8667, 146, 112, 182, 170, 1423, 5650, 102],
 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0],
 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1]}

tokenizer は add_special_tokens=False を渡さない限り特殊トークンの id を (妥当な場合) 依然として追加します。

これはセンテンスのバッチやセンテンスのペアのバッチのために前のように正確に動作します。センテンスのバッチをこのようにエンコードできます :

batch_sentences = [["Hello", "I'm", "a", "single", "sentence"],
                   ["And", "another", "sentence"],
                   ["And", "the", "very", "very", "last", "one"]]
encoded_inputs = tokenizer(batch_sentences, is_split_into_words=True)

あるいこのようにペア・センテンスのバッチ :

batch_of_second_sentences = [["I'm", "a", "sentence", "that", "goes", "with", "the", "first", "sentence"],
                             ["And", "I", "should", "be", "encoded", "with", "the", "second", "sentence"],
                             ["And", "I", "go", "with", "the", "very", "last", "one"]]
encoded_inputs = tokenizer(batch_sentences, batch_of_second_sentences, is_split_into_words=True)

そして前のようにパディング、truncation を追加できてそして直接 tensor を返すことができます :

TensorFlow

batch = tokenizer(batch_sentences,
                  batch_of_second_sentences,
                  is_split_into_words=True,
                  padding=True,
                  truncation=True,
                  return_tensors="tf")

PyTorch

batch = tokenizer(batch_sentences,
                  batch_of_second_sentences,
                  is_split_into_words=True,
                  padding=True,
                  truncation=True,
                  return_tensors="pt")
 

以上






HuggingFace Transformers 3.4 : モデルの概要

HuggingFace Transformers 3.4 : モデルの概要 (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 11/12/2020 (3.4.0)

* 本ページは、HuggingFace Transformers の以下のドキュメントを翻訳した上で適宜、補足説明したものです:

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

無料セミナー開催中 クラスキャット主催 人工知能 & ビジネス Web セミナー

人工知能とビジネスをテーマにウェビナー (WEB セミナー) を定期的に開催しています。スケジュールは弊社 公式 Web サイト でご確認頂けます。
  • お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。
  • Windows PC のブラウザからご参加が可能です。スマートデバイスもご利用可能です。

お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。

株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
E-Mail:sales-info@classcat.com ; WebSite: https://www.classcat.com/
Facebook: https://www.facebook.com/ClassCatJP/

 

HuggingFace Transformers : モデルの概要

これは Transformers で利用可能なモデルの概要です。元の transformer モデル に馴染みがあることを仮定しています。優しいイントロダクションのためには annotated transformer を確認してください。ここではモデル間の高位な違いにフォーカスします。それぞれのドキュメントでそれらをより詳細に調べることができます。各タイプのモデルと総ての コミュニティ・モデル のために利用可能なチェックポイントを見るために 事前訓練モデルページ を確認することもできます。

ライブラリのモデルの各一つは以下のカテゴリーの一つに分類されます :

  • 自己回帰モデル
  • オートエンコーダ・モデル
  • sequence-to-sequence モデル
  • ProphetNet
  • Retrieval-based (検索ベース) モデル

自己回帰 (= autoregressive) モデルは古典的な言語モデリング・タスク上で事前訓練されます : 次のトークンを前の総てのものを読んだときに推測します。それらは元の transformer モデルのデコーダに相当し、そして注意ヘッドが後に何があるかではなく前に何があったかだけを見ることができるようにマスクが full センテンスの上に使用されます。これらのモデルは多くのタスク上で再調整されて素晴らしい結果を獲得できますが、最も自然な応用はテキスト生成です。そのようなモデルの典型的な例は GPT です。

※ 訳注: 自己回帰モデルはある時間ステップにおけるモデル出力がそれ以前のモデル出力に依存する確率過程です。

オートエンコーディング・モデルは入力トークンを何らかの方法で corrupt させて元のセンテンスを再構築することを試みることにより事前訓練されます。それらはどのようなマスクもなしで完全な入力にアクセスするという意味で元の transformer モデルのエンコーダに対応します。それらのモデルは通常はセンテンス全体の双方向表現を構築します。それらはテキスト生成のような多くのタスク上で再調整されて素晴らしい結果を獲得できますが、それらの最も自然な応用はセンテンス分類やトークン分類です。そのようなモデルの典型的な例は BERT です。

自己回帰モデルとオートエンコーディング・モデルの唯一の違いはモデルが事前訓練される方法にあることに注意してください。従って自己回帰とオートエンコーディング・モデルの両者のために同じアーキテクチャが利用できます。与えられたモデルが両者のタイプの事前訓練のために使用されたとき、それが最初に紹介された記事に対応するカテゴリーにそれを入れます。

sequence-to-sequence モデルは、翻訳タスクのためか他のタスクを sequence-to-sequence 問題に変換することにより、元の transformer のエンコーダとデコーダの両者を利用します。それらは多くのタスクに再調整できますが、それらの最も自然な応用は翻訳、要約そして質問応答です。元の transformer モデルは (翻訳のためだけの) そのようなモデルの例で、T5 は他のタスク上で再調整できる例です。

マルチモーダル (多様)・モデルはテキスト入力を他の種類 (e.g. 画像) と混在させそして与えられたタスクに対してより固有です。

 

自己回帰モデル

前に言及したように、これらのモデルは元の transformer のデコーダ・パートに依拠していて各位置でモデルが注意ヘッドの前のトークンだけを見れるように注意マスクを利用します。

 

Original GPT

transformer アーキテクチャに基づく最初の自己回帰モデルです、Book Corpus データセット上で事前訓練されました。

このライブラリは言語モデリングとマルチタスク言語モデリング/マルチ選択分類のためのモデルのバージョンを提供します。

 

GPT-2

GPT のより大きくてより良いバージョンです、WebText 上で事前訓練されました (3 karma 以上を持つ Reddit の outgoint リンクからの web ページ)。

このライブラリは言語モデリングとマルチタスク言語モデリング/マルチ選択分類のためのモデルのバージョンを提供します。

 

CTRL

GPT モデルと同じですが、制御コードのアイデアを追加しています。テキストは prompt (empty であり得ます) とテキスト生成に影響を与えるために使用される制御コードの一つ (or 幾つか) から生成されます : wikipedia 記事、本や映画レビューのスタイルで生成します。

このライブラリは言語モデリングのためのモデルのバージョンだけを提供します。

 

Transformer-XL

通常の GPT モデルと同じですが、2 つの連続するセグメントに対してリカレンス機構を導入します (2 つの連続する入力を持つ通常の RNN に類似しています)。このコンテキストでは、セグメントは数多くの連続するトークン (例えば 512) で、これは複数のドキュメントに渡って広がるかもしれません、そしてセグメントは順番にモデルに供給されます。

基本的には、前のセグメントの隠れ状態は attention スコアを計算するために現在の入力に結合されます。これはモデルに現在のセグメントに加えて前のセグメント内の情報に注意を払うことを許容します。マルチ attention 層をスタックすることにより、受容野 (= receptive field) は複数の前のセグメントに増加できます。

これは位置埋め込みを位置相対的 (= relative) 埋め込みに変更します、(何故ならば通常の位置埋め込みは与えられた位置で現在の入力と現在の隠れ状態の同じ結果を与えるからです) そして attention スコアが計算される方法で何某かの調整を行なう必要があります。

このライブラリは言語モデリングのためのモデルのバージョンだけを提供します。

 

Reformer

メモリ使用量と計算時間を削減するために多くのトリックを持つ自己回帰 transformer モデルです。これらのトリックは以下を含みます :

  • axial (軸の) 位置エンコーディング を使用します (より詳細は下を見てください)。それは (シークエンス長が非常に大きいとき) 巨大な位置エンコーディング行列を持つことをそれをより小さい行列に (因数) 分解することにより回避する機構です。
  • 伝統的な attention を LSH (local-sensitive hashing) attention により置き換えます (より詳細は下を見てください)。それは attention 層で full 積 query-key を計算することを回避するテクニックです。
  • 各層の中間結果をストアすることを、backward パスの間にそれらを得るために reversible transformer 層を使用するか (次の層の入力から残差を減算することはそれらを与え戻します)、与えられた層内で結果のためにそれらを再計算することにより (それらをストアするよりも非効率的ですがメモリを節約します) 回避します。
  • バッチ全体上ではなく chunks により feedforward 演算を計算します。

これらのトリックで、モデルは伝統的な transformer 自己回帰モデルよりも遥かに大きなセンテンスが供給できます。

Note: このモデルはオートエンコーディング設定で非常に上手く利用できるでしょう、けれどもそのような事前訓練のためのチェックポイントはまだありません。

このライブラリは言語モデリングのためのモデルのバージョンだけを提供します。

 

XLNet

XLNet は伝統的な自己回帰モデルではありませんが、その上で構築する訓練ストラテジーは利用します。それはセンテンスのトークンを並べ替えて (= permute) から、トークン n+1 を予測するために最後の n トークン(s) を使用することをモデルに許容します。これはマスクで成されますので、センテンスは実際には正しい順序でモデルに供給されますが、n+1 のために最初の n トークンをマスクする代わりに、XLNet は 1,…,シークエンス長のある与えられた並べ替え (= permutation) 内の前のトークンを隠すマスクを使用します。

XLNet はまた長期依存性を構築するために Transformer-XL と同じリカレンス機構も利用します。

このライブラリは言語モデリング、トークン分類、センテンス分類、マルチ選択分類と質問応答のためのモデルのバージョンを提供します。

 

オートエンコーディング・モデル

前に言及したように、これらのモデルは元の transformer のエンコーダ・パートに依拠していてマスクは使用しませんのでモデルは注意ヘッドの総てのトークンを見ることができます。事前訓練については、ターゲットは元のセンテンスで入力はそれらの corrupted バージョンです。

 

BERT

ランダム・マスキングを使用して入力を corrupt します、より正確には、事前訓練の間、トークンの与えられたパーセンテージ (通常は 15%) が以下によりマスクされます :

  • 確率 0.8 で特別なマスクトークン
  • 確率 0.1 でマスクされた一つとは異なるランダムトークン
  • 確率 0.1 で同じトークン

モデルは元のセンテンスを予測しなければなりませんが、2 番目の目標を持ちます : 入力は 2 つのセンテンス A と B です (間には分離トークンを伴います)。確率 50% で、センテンスはコーパス内で連続的です、残りの 50% でそれらは関係ありません。モデルはセンテンスが連続的か否かを予測しなければなりません。

このライブラリは言語モデリング (伝統的 or マスク付き)、次文 (= next sentence) 予測、トークン分類、センテンス分類、マルチ選択分類と質問応答のためのモデルのバージョンを提供します。

 

ALBERT

BERT と同じですが 2, 3 の捻りを伴います :

  • 埋め込みサイズ E は理にかなった隠れサイズ H とは異なります、何故ならば埋め込みはコンテキスト独立である (一つの埋め込みベクトルは一つのトークンを表します) 一方で、隠れ状態はコンテキスト依存である (一つの隠れ状態はトークンのシークエンスを表します) からです、従って H >> E を持つことはより論理的です。また、埋め込み行列は巨大です、何故ならばそれは V x E (V は vocab サイズ) であるからです。E < H であれば、それはより少ないパラメータを持ちます。
  • 層は (メモリを節約するために) パラメータを共有するグループに分割されます。
  • 次文予測はセンテンス順序予測に置き換えられます : 入力では、2 つのセンテンス A と B を持ち (それらは連続的です) A に続いて B か B に続いて A のいずれかを供給します。モデルはそれらがスワップされているか否かを予測しなければなりません。

このライブラリはマスク付き言語モデリング、トークン分類、センテンス分類、マルチ選択分類と質問応答のためのモデルのバージョンを提供します。

 

RoBERTa

BERT と同じですが以下のより良い事前訓練トリックを持ちます :

  • 動的マスキング : トークンは各エポックで異なってマスクされます、その一方で BERT はそれを一度限り行ないます。
  • no NSP (次文予測) 損失そして単に 2 センテンスを一緒に置く代わりに、512 トークンに達するまで連続するテキストのチャンクを一緒にまとめます (従ってセンテンスは幾つかのドキュメントに渡るかもしれない順番どおりです)。
  • より巨大なバッチで訓練する
  • サブユニットとして文字ではなくバイトを持つ BPE を使用します (ユニコード文字ゆえに)。

このライブラリはマスク付き言語モデリング、トークン分類、センテンス分類、マルチ選択分類と質問応答のためのモデルのバージョンを提供します。

 

DistilBERT

BERT と同じですがより小さいです。事前訓練された BERT モデルの蒸留により訓練されます、より大きいモデルと同じ確率を予測するために訓練されたことを意味します。実際の目標は以下の組合せです :

  • 教師モデルと同じ確率を見つける
  • マスクされたトークンを正しく予測する (しかし次文目的ではない)
  • 生徒と教師モデルの隠れ状態の間の cos 類似度

このライブラリはマスク付き言語モデリング、トークン分類、センテンス分類と質問応答のためのモデルのバージョンを提供します。

 

XLM

幾つかの言語上で訓練された transformer モデルです。このモデルのための 3 つの異なるタイプの訓練がありそしてライブラリはそれらの総てのためのチェックポイントを提供します :

  • 因果関係的 (= Causal) 言語モデリング (CLM)、これは伝統的自己回帰訓練です (従ってこのモデルは前のセクションにも入れるかもしれません)。各訓練サンプルのために言語の一つが選択され、そしてモデル入力は 256 トークンのセンテンスで、それらの言語の一つで幾つかのドキュメントに渡るかもしれません。
  • マスク付き言語モデリング (MLM)、これは RoBERTa のようなものです。各訓練サンプルのために言語の一つが選択され、そしてモデル入力は 256 トークンのセンテンスで、トークンの動的マスクを伴い、それらの言語の一つで幾つかのドキュメントに渡るかもしれません。
  • MLM と翻訳言語モデリング (TLM) の組合せ。これはランダム・マスキングを伴い、 2 つの異なる言語のセンテンスを連結することから構成されます。マスクされたトークンの一つを予測するため、モデルは言語 1 の周囲のコンテキストと言語 2 で与えられるコンテキストの両者を利用できます。

チェックポイントはそれらの名前で clm, mlm or mlm-tlm を持つことにより事前訓練のためにどの方法が利用されたかを参照します。位置埋め込みの上にモデルは言語埋め込みを持ちます。MLM/CLM を使用して訓練するとき、これは使用される言語の indication を、そして MLM+TLM を使用して訓練するとき、各パートのために使用される言語の indication をモデルに与えます。

このライブラリは言語モデリング、トークン分類、センテンス分類と質問応答のためのモデルのバージョンを提供します。

 

XLM-RoBERTa

XLM アプローチ上で RoBERTa トリックを利用しますが、翻訳言語モデリング objective は利用しません。それは一つの言語から来るセンテンス上のマスク付き言語モデリングだけを使用します。けれども、モデルはより多くの言語 (100) 上で訓練されて言語埋め込みは使用しませんので、入力言語を自身で検出することができます。

このライブラリはマスク付き言語モデリング、トークン分類、センテンス分類、マルチ選択分類と質問応答のためのモデルのバージョンを提供します。

 

FlauBERT

RoBERTa のように、センテンス順序予測はありません (従って単に MLB objective 上で訓練されます)。

このライブラリはマスク付き言語モデリングとセンテンス分類のためのモデルのバージョンを提供します。

 

ELECTRA

ELECTRA はもう一つの別の (小さい) マスク付き言語モデルの使用で訓練される transformer モデルです。入力はその言語モデルにより corrupt されます、それはランダムにマスクされた入力テキストを取りそしてテキストを出力します、その (出力) テキストでは ELECTRA はどのトークンが元のものでありどれが置き換えられたかを予測しなければなりません。GAN 訓練のためのように、その小さい言語モデルは数ステップの間訓練されてから (しかし目的としての元のテキストで、伝統的な GAN 設定でのように ELECTRA モデルを騙したりはしません)、ELECTRA モデルが数ステップの間訓練されます。

このライブラリはマスク付き言語モデリング、トークン分類、センテンス分類のためのモデルのバージョンを提供します。

 

Funnel Transformer

Funnel Transformer は pooling を使用する transformer モデルで、少し ResNet モデルのようです : 層はブロック内でグループ分けされ、そして (最初の一つを除いて) 各ブロックの最初で、隠れ状態はシークエンス次元内でプーリングされます。この方法で、それらの長さは 2 で除算され、これは次の隠れ状態の計算をスピードアップします。総ての事前訓練モデルは 3 つのブロックを持ち、これは最後の隠れ状態は元のシークエンス長の 4 分の 1 のシークエンス長を持つことを意味します。

分類のようなタスクについては、これは問題ではありませんが、マスク付き言語モデリングやトークン分類のようなタスクについては、元の入力と同じシークエンス長を持つ隠れ状態を必要とします。それらの場合には、最後の隠れ状態は入力センテンス長にアップサンプリングされて 2 つの追加層を通り抜けます。それが各チェックポイントの 2 つのバージョンがある理由です。“-base” でサフィックスされるバージョンは 3 つのブロックだけを含む一方で、そのサフィックスがないバージョンは 3 つのブロックとその追加層を持つアップサンプリング・ヘッドを含みます。

利用可能な事前訓練モデルは ELECTRA と同じ事前訓練 objective を使用しています。

このライブラリはマスク付き言語モデリング、トークン分類、センテンス分類、マルチ選択分類と質問応答のためのモデルのバージョンを提供します。

 

Longformer

高速にするために attention 行列をスパース行列に置き換えた transformer モデルです。しばしば、ローカル・コンテキスト (e.g. 左と右の 2 つのトークンは何でしょう?) は与えられたトークンに対してアクションするために十分です。ある事前選択された入力トークンには依然として global attention が与えられますが、attention 行列はよりパラメータが少ない方法を持ち (訳注: 原文: the attention matrix has way less parameters)、スピードアップという結果になります。より多くの情報については ローカル attention セクション を見てください。

それはさもなければ RoBERTa と同じ方法で事前訓練されます。

Note: このモデルは自己回帰設定で非常に上手く利用できるでしょう、けれどもそのような事前訓練のためのチェックポイントはまだありません。

このライブラリはマスク付き言語モデリング、トークン分類、センテンス分類、マルチ選択分類と質問応答のためのモデルのバージョンを提供します。

 

Sequence-to-sequence モデル

前に言及したように、これらのモデルは元の transformer のエンコーダとデコーダの両者を保持しています。

 

BART

エンコーダとデコーダを持つ sequence-to-sequence モデル。エンコーダはトークンの corrupted バージョンが供給され、デコーダは元のトークンが供給されます (しかし通常の transformer デコーダのように先の単語を隠すマスクを持ちます)。エンコーダについては、事前訓練タスク上、以下の変換の組合せが適用されます :

  • ランダムにトークンをマスクします (BERT のように)
  • ランダムにトークンを削除します
  • 単一のマスクトークンで k トークンのスパンをマスクします (0 トークンのスパンはマスクトークンの挿入です)
  • センテンスを並べ替える (= permute)
  • 特定のトークンで開始されるようにドキュメントを rotate します

このライブラリは条件付き生成とシークエンス分類ためのモデルのバージョンを提供します。

 

Pegasus

BART と同じエンコーダ・デコーダモデルを持つ sequence-to-sequence モデルです。Pegasus は 2 つの自己教師あり objective 関数上で同時に事前訓練されます : マスク付き言語モデリング (MLM) と Gap センテンス生成 (GSG, Gap Sentence Generation) と呼称される、新規の要約固有の事前訓練 objective です。

  • MLM: エンコーダ入力トークンはマスクトークンによりランダムに置き換えられてエンコーダにより予測されなければなりません (BERT のように)。
  • GSG: エンコーダ入力センテンス全体が 2 番目のマスクトークンにより置き換えられてデコーダに供給されますが、それは通常の自己回帰 transformer デコーダのように先の (= future) 単語を隠すために causal マスクを持ちます。

BART と対称的に、Pegasus の事前訓練タスクは意図的に要約に類似しています : 重要なセンテンスはマスクされて残りのセンテンスからの一つの出力センテンスとして一緒に生成されます、抽出型要約に類似しています。

このライブラリは要約のために使用されるべき条件付き生成のためのモデルのバージョンを提供します。

 

MarianMT

翻訳モデルのためのフレームワークです、BART と同じモデルを使用しています。

このライブラリは条件付き生成のためのモデルのバージョンを提供します。

 

T5

伝統的な transformer モデルを使用します (位置埋め込みで僅かな変更を伴います、これは各層で学習されます)。総ての NLP タスク上で動作できるために、それは特定のプレフィックスを使用することによりそれらをテキスト-to-テキスト問題に変換します : “summarize: ”, “question: ”, “translate English to German: ” 等々。

事前訓練は教師ありと自己教師あり訓練の両者を含みます。教師あり訓練は GLUE と SuperGLUE ベンチマークにより提供されるダウンストリーム・タスク上で処理されます (それらを上で説明されたように text-to-text タスクに変換します)。

自己教師あり訓練はトークンの 15% をランダムに除去してそれらを個別の sentinel (見張り) トークンで置き換えることにより (もし幾つかの連続するトークンが除去のためにマークされる場合、グループ全体が単一の sentinel トークンで置き換えられます)、 corrupted トークンを利用します。エンコーダの入力は corrupted センテンスで、デコーダの入力は元のセンテンスでそれからターゲットは sentinel トークンで範囲が定められた落とされた (= dropped out) トークンです。

例えば、センテンス “My dog is very cute .” を持ち、そしてトークン “dog”, “is” と “cute” を取り除くことを決めた場合、エンコーダ入力は “My <x> very <y> .” となりそしてターゲット入力は “<x> dog is <y> cute .<z>” になります。

このライブラリは条件付き生成のためのモデルのバージョンを提供します。

 

MBart

モデル・アーキテクチャと事前訓練 objective は BART と同じですが、MBart は 25 言語上で訓練されてそして教師ありと教師なし機械翻訳が対象とされています。多言語の full テキストをノイズ除去することによる完全な sequence-to-sequence モデルを事前訓練するための最初の方法の一つです。

このライブラリは条件付き生成のためのモデルのバージョンを提供します。

mbart-large-en-ro チェックポイント は英語 -> ルーマニア語翻訳のために利用できます。

mbart-large-cc25 チェックポイントは `examples/seq2seq/` のコードを使用して、他の翻訳と要約タスクのために再調整できますが、再調整なしではそれほど有用ではありません。

 

ProphetNet

ProphetNet は future n-gram 予測と呼ばれる、新規の sequence-to-sequence 事前訓練 objective を導入します。future n-gram 予測では、各時間ステップで前のコンテキスト・トークンに基づいてモデルは (単に単一の次のトークンの代わりに) 次の n トークンを同時に予測します。future n-gram 予測はモデルが future トークンのために計画して強い局所的な相関性上で overfitting を回避することを促進します。モデル・アーキテクチャは元の Transformer に基づきますが、デコーダの「標準的な」self-attention 機構を主要な self-attention 機構と self と n-stream (predict) self-attention 機構と置き換えます。

このライブラリは条件付き生成のためのモデルの事前訓練バージョンと要約のための再調整バージョンを提供します。

 

XLM-ProphetNet

XLM-ProphetNet のモデル・アーキテクチャと事前訓練 objective は ProphetNet と同じですが、XLM-ProphetNet は交差 lingual データセット XGLUE 上で事前訓練されました。

このライブラリは多言語条件付き生成のためのこのモデルの事前訓練バージョンとヘッドライン生成と質問応答のための再調整バージョンをそれぞれ提供します。

 

マルチモーダル・モデル

ライブラリには一つのマルチモーダル・モデルがあります、これは他のもののような自己教師あり流儀での事前訓練はされません。

 

MMBT

マルチモーダル設定では transformers モデルが使用され、予測を行なうためにテキストと画像を連結します。transformer モデルは入力としてトークン化されたテキストの埋め込みと画像上で事前訓練された resnet の (resnet の最後の多くの特徴から transformer の隠れ状態次元へ通り抜けるための) 線形層を通り抜けた (最後のプーリング層の後の) 最後の活性を取ります。

異なる入力は連結されて、そして位置埋め込みの上に入力ベクトルのどのパートがテキストに対応してどれが画像に対応するかをモデルに知らせるためにセグメント埋め込みが追加されます。

事前訓練モデルは分類のためだけに動作します。

 

Retrieval-based (検索ベース) モデル

幾つかのモデルは、例えばオープンドメイン質問応答のために (事前) 訓練と推論の間にドキュメント検索を利用します。

 

DPR

Dense Passage Retrieval (DPR) – 最先端のオープンドメイン質問応答研究のためのツールとモデルのセットです。

DPR は 3 つのモデルにあります :

  • 質問エンコーダ: 質問をベクトルとしてエンコードする
  • コンテキスト・エンコーダ: コンテキストをベクトルとしてエンコードする
  • リーダー (= Reader): 関連 (= relevance) スコア (推論された span が実際に質問に答える場合に高い) と一緒に、検索されたコンテキスト内から質問の答えを抽出する。

DPR のパイプラインはある質問が与えられたときに top k コンテキストを見つけるために検索ステップを使用し、それからそれは回答を得るために質問と検索されたドキュメントとともにリーダーを呼び出します。

 

RAG

  • All モデルページ : rag ; モデル文書 : rag
  • Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks, Patrick Lewis, Ethan Perez, Aleksandara Piktus, Fabio Petroni, Vladimir Karpukhin, Naman Goyal, Heinrich Küttler, Mike Lewis, Wen-tau Yih, Tim Rocktäschel, Sebastian Riedel, Douwe Kiela
    (Knowledge-Intensive NLP タスクのための Retrieval-Augmented 生成)

Retrieval-augmented 生成 (“RAG”) モデルは事前訓練 dense retrieval (DPR) と Seq2Seq モデルのパワーを結合しています。RAG モデルは docs を取得し、それらを seq2seq モデルに渡してから、出力を生成するために周辺化します。ダウンロードストリーム・タスクに適応するために retrieval と生成の両者を許容するために、retriever と seq2seq モジュールは事前訓練モデルから初期化され、同時に再調整されます。

2 つのモデル RAG-Token and RAG-Sequence は生成のために利用可能です。

 

以上






AI導入支援 #2 ウェビナー

スモールスタートを可能としたAI導入支援   Vol.2
[無料 WEB セミナー] [詳細]
「画像認識 AI PoC スターターパック」の紹介
既に AI 技術を実ビジネスで活用し、成果を上げている日本企業も多く存在しており、競争優位なビジネスを展開しております。
しかしながら AI を導入したくとも PoC (概念実証) だけでも高額な費用がかかり取組めていない企業も少なくないようです。A I導入時には欠かせない PoC を手軽にしかも短期間で認知度を確認可能とするサービの紹介と共に、AI 技術の特性と具体的な導入プロセスに加え運用時のポイントについても解説いたします。
日時:2021年10月13日(水)
会場:WEBセミナー
共催:クラスキャット、日本FLOW(株)
後援:働き方改革推進コンソーシアム
参加費: 無料 (事前登録制)
人工知能開発支援
◆ クラスキャットは 人工知能研究開発支援 サービスを提供しています :
  • テクニカルコンサルティングサービス
  • 実証実験 (プロトタイプ構築)
  • アプリケーションへの実装
  • 人工知能研修サービス
◆ お問合せ先 ◆
(株)クラスキャット
セールス・インフォメーション
E-Mail:sales-info@classcat.com