Traffine I/O

日本語

2023-02-03

Hugging Face Transformers:Model

Hugging Face Transformers Model

Hugging Face Transformersライブラリは、多くの事前トレーニング済みモデルを提供しており、これらのモデルを簡単に使用して、新しいタスクに適用することができます。同時に、自分自身のトレーニング済みモデルを Model Hub に登録して、他のユーザーと共有することもできます。

この記事では、Modelについて解説します。

Transformer の派生モデル

Transformer のアーキテクチャは下図のようになっています。

Encoder and  Decoder in Transformer

Transformerの派生モデルとして、EncoderとDecoderを切り離して個別に使用した以下のようなモデルがあります。

  • Encoder モデル
    • BERT
    • ALBERT
    • RoBERTa
    • DistilBERT
    • XLM
    • XLM-RoBERTa
    • ELECTRA
  • Decoder モデル
    • GPT
    • GPT-2
    • CTRL
    • Reformer
    • XLNet
  • Encoder-Decoder モデル
    • BART
    • T5
    • MBart

Encoder モデル

Encoderモデルは、TransformerのEncoder部分のみを使ったモデルです。Attention 層は入力系列データに含まれる全ての単語に対して注目することができ、各単語の前後にある単語にも注目できる双方向のAttentionとなっています。

入力系列データの一部をマスキングし、元の単語を予測させるという穴埋め問題を解くタスクを設定して学習が行われます。Encoderモデルは入力系列データの特徴表現を出力するので、それを分類器に渡す形でモデリングが可能なタスクに適しています。例えば文書分類、固有表現認識、対象の文書内から回答部分を抽出するタイプの質問応答などが得意です。

BERT

BERTWikipediaBookcorpus で構成される大規模なコーパスを使って事前トレーニングされた双方向Transformerです。

https://huggingface.co/docs/transformers/model_doc/bert

ALBERT

ALBERTはBERTに対して以下の微調整をしたモデルです。

  • トークンの埋め込み次元を隠れ層の次元から切り離し、埋め込み次元を削減
  • 全ての層で同じパラメータを共有することによりパラメータ数が減少
  • 次文予測を文の順序予測に置き換えて学習

https://huggingface.co/docs/transformers/model_doc/albert

RoBERTa

RoBERTaはBERTをベースにより多くの学習データと大きなバッチで長時間学習させたモデルです。

https://huggingface.co/docs/transformers/model_doc/roberta

DistilBERT

DistilBERT は事前学習フェーズでKnowledge Distillationを使うことで、BERTを蒸留したモデルです。BERTの性能の97%を達成しつつ、40%少ないメモリ使用量と60%の高速化を達成しています。

https://huggingface.co/docs/transformers/model_doc/distilbert

XLM

XLMは複数の言語で学習されたTransformerです。このモデルの学習には以下の3つの異なるタイプがあります。

  • 因果言語モデル(Causal language modeling, CLM)
  • マスク付き言語モデル(Masked language modeling, MLM)
  • MLMと翻訳言語モデル(Translation language modeling, TLM)の組み合わせ

https://huggingface.co/docs/transformers/model_doc/xlm

XLM-RoBERTa

XLM-RoBERTaは Common Crawl コーパスを用いて2.5TBのデータセットを用いて学習させたモデルです。このデータセットには翻訳が含まれていないため、XLMで用いられた翻訳言語モデルは削除されています。

https://huggingface.co/docs/transformers/model_doc/xlm-roberta

ELECTRA

ELECTRAは生成器(Generator)と識別器(Discriminator)の2つの変換器を学習させる新しい事前学習アプローチです。Generatorの役割はシーケンス中のトークンを置き換えることであり、従ってマスクされた言語モデルとして学習されます。一方、Discriminatorは、シーケンス中のどのトークンがGeneratorによって置き換えられたかを識別しようとするモデルです。

https://huggingface.co/docs/transformers/model_doc/electra

Decoder モデル

Decoderモデルは、TransformerのDecoder部分のみを使ったモデルです。入力系列データに含まれる単語に対して、次に続く単語を予測するタスクを設定して学習を進めます。

Attention層は入力データに含まれる単語のうち、それぞれの単語の前にある単語にのみ注目します。Decoderモデルはテキスト生成のようなタスクに適したモデルとなっています。

GPT

GPTはOpenAIが2018年に提案したGenerative Pre-trained Transformerという大規模な言語モデルで、タスクに特化した学習をしなくても自然な文章を生成できることが特徴です。GPTでは前の単語を元に次の単語を予測することでモデルを事前学習をします。

GPTでは Book Corpus データセットで事前学習されています。

https://huggingface.co/docs/transformers/model_doc/openai-gpt

GPT-2

GPT-2はOpenAIが2019年に提案したGPTの後継モデルです。GPTのモデルと学習データセットをスケールアップすることでGPT2が誕生しました。

https://huggingface.co/docs/transformers/model_doc/gpt2

CTRL

CTRLは、系列の先頭にコントロールトークンを追加することで、生成される系列のスタイルを制御することができるモデルです。

https://huggingface.co/docs/transformers/model_doc/ctrl

Reformer

Reformerは、メモリフットプリントと計算時間を削減するための多くの改良を加えたDecoderモデルです。

https://huggingface.co/docs/transformers/model_doc/reformer

XLNet

XLNetは、自己回帰法を用いて事前学習を行い、入力シーケンスの分解順序の全ての並べ換えに対して期待尤度を最大化することで双方向の文脈を学習するモデルです。

https://huggingface.co/docs/transformers/model_doc/xlnet

Encoder-Decoder モデル

Encoder-Decoderモデルは、Transformerのアーキテクチャを全体的に活用したモデルです。

Encoder部分は入力系列データの単語全てに注目し、Decoder部分はそれぞれの単語よりも前に出てくる単語のみに注目します。Encoderモデルでの穴埋め問題を解くタスクと、Decoderモデルで次に続く単語を予測するタスクの両方を設定して学習を進めます。

Encoder-Decoderモデルは機械翻訳や対話システムなど、テキストを入力してその内容に応じて別のテキストを出力するといったタスクへの応用に適しています。

BART

BARTは、BERTとGPTの事前学習をEncoder、Decoderのアーキテクチャの中で組み合わせたものです。

https://huggingface.co/docs/transformers/model_doc/bart

T5

T5はGoogleが2020年に提案したモデルで、Text-to-Text Transfer Transformerの略です。T5は全ての自然言語理解と自然言語生成のタスクをテキストの変換タスクに変換して統一的に解くことができます。

https://huggingface.co/docs/transformers/model_doc/t5

MBart

MBARTは、25言語の大規模モノリンガルコーパスにBARTの目的語を用いて事前学習させたモデルです。MBARTは複数の言語の完全なテキストをノイズ除去することで、完全なシーケンス間のモデルを事前学習する最初の方法の一つです。

https://huggingface.co/docs/transformers/model_doc/mbart

Model の使い方

Transformerライブラリをインストールします。

$ pip install transformers

Model の読み込み

AutoModelクラスにより、使いたいモデルのcheckpointを指定することで簡単にモデルを使うことができます。以下の例ではbert-base-uncasedというモデルを指定しています。

from transformers import AutoModel

checkpoint = 'bert-base-uncased'
model = AutoModel.from_pretrained(checkpoint)

Hugging Face Transformersでは多くの事前学習済みモデルが公開されています。モデルの詳細は以下のリンクから確認することができます。

https://huggingface.co/models

モデルの構造

例えばBERTを使う場合は以下のように読み込むこともできます。

from transformers import BertConfig, BertModel
config = BertConfig()
model = BertModel(config)
print(config)
BertConfig {
  "attention_probs_dropout_prob": 0.1,
  "classifier_dropout": null,
  "hidden_act": "gelu",
  "hidden_dropout_prob": 0.1,
  "hidden_size": 768,
  "initializer_range": 0.02,
  "intermediate_size": 3072,
  "layer_norm_eps": 1e-12,
  "max_position_embeddings": 512,
  "model_type": "bert",
  "num_attention_heads": 12,
  "num_hidden_layers": 12,
  "pad_token_id": 0,
  "position_embedding_type": "absolute",
  "transformers_version": "4.24.0",
  "type_vocab_size": 2,
  "use_cache": true,
  "vocab_size": 30522
}

それぞれの属性の意味は以下のリンクから確認することができます。

https://huggingface.co/docs/transformers/model_doc/bert#bertconfig

モデルの保存

以下のコードでモデルを保存することができます。保存先のディレクトリが存在しない場合には、フォルダが自動的に作成されます。

model.save_pretrained("./tmp")

保存をすると以下の2種類のファイルが保存されます。

  • config.json
  • pytorch_model.bin

保存したモデルの読み込み

保存したモデルを読み込むには以下のようにコードを記述します。

saved_model = model.from_pretrained("./tmp")

事前学習済み Transformer モデル利用時の注意点

学習済みモデルは一定のバイアスが含まれていることに注意をする必要があります。

BERTのfill-mask Pipelineを使って、職業に関する文において、主語を男性とした場合と女性とした場合の2種類を用意し、それぞれ職業名にあたる部分をマスクして当てはまる単語の候補をモデルに出力させてみます。

from transformers import pipeline

unmasker = pipeline("fill-mask", model="bert-base-uncased")

result = unmasker("This man works as a [MASK].")
print("man:", [r["token_str"] for r in result])

result = unmasker("This woman works as a [MASK].")
print("woman:", [r["token_str"] for r in result])
man: ['carpenter', 'lawyer', 'farmer', 'businessman', 'doctor']
woman:  ['nurse', 'maid', 'teacher', 'waitress', 'prostitute']

いずれの結果も主語の性別に紐づいた職業名が候補として出力されていますが、重複しているものはなく、性別により差があることが分かります。さらに、主語が女性の場合の5番目の候補で、prostituteという蔑称としての意味合いを含んでいる単語が出力されています。

BERTモデルは WikipediaBookcorpus という偏見などをあまり含まないであろうデータセットで事前学習されていますが、このような結果を出力してしまうケースもあります。

参考

https://huggingface.co/docs/transformers/model_summary
https://huggingface.co/docs/transformers/model_doc/bert
https://huggingface.co/docs/transformers/model_doc/albert
https://huggingface.co/docs/transformers/model_doc/roberta
https://huggingface.co/docs/transformers/model_doc/distilbert
https://huggingface.co/docs/transformers/model_doc/xlm
https://huggingface.co/docs/transformers/model_doc/xlm-roberta
https://huggingface.co/docs/transformers/model_doc/electra
https://huggingface.co/docs/transformers/model_doc/openai-gpt
https://huggingface.co/docs/transformers/model_doc/gpt2
https://huggingface.co/docs/transformers/model_doc/ctrl
https://huggingface.co/docs/transformers/model_doc/reformer
https://huggingface.co/docs/transformers/model_doc/xlnet
https://huggingface.co/docs/transformers/model_doc/bart
https://huggingface.co/docs/transformers/model_doc/t5
https://huggingface.co/docs/transformers/model_doc/mbart
https://zenn.dev/ttya16/articles/329ec9e7c79634893271

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!