LoginSignup
35
35

More than 3 years have passed since last update.

transformers(ライブラリ)

Last updated at Posted at 2019-11-14

ネット上で発見したライブラリ
有名な方が公開している様子ですが、githubのスターも17000個もついてるのでみんな使ってると思われます。
huggingfaceという企業でした。

As easy to use as pytorch-transformers
As powerful and concise as Keras
High performance on NLU and NLG tasks
Low barrier to entry for educators and practitioners

のとおり、
BERT,GPT,GPT-2,Transformer-XL,XLNet,XLM,RoBERTa,DistliBERTの8つが似たような書き方で実行できます!DistliBERTなど論文でしか見たことないので使い易い形で組み込んでくれていてありがたい。
20200508記載追加:
CTRL,CamemBERT,ALBERT,XLM-RoBERTa,FlauBERT,Bart,T5,ELECTRA,DialoGPT,Reformer と、どんどん追加されている模様

BERT

!pip install transformers
!git clone https://github.com/huggingface/transformers.git
!mkdir output

と作って

!python /content/transformers/examples/run_lm_finetuning.py \
    --output_dir=/content/output \
    --model_type=bert \
    --model_name_or_path=bert-base-cased \
    --do_train \
    --train_data_file=****_train.raw \
    --do_eval \
    --eval_data_file=****_test.raw \
    --mlm

とやれば、自分のデータでfinetuningしたBERTモデルを作成できます。
train_data_file、eval_data_fileの場所をいじるのと、model_typeを指定すれば(少しパラメータが変わりますが)他のモデルでもほぼ同じように設定可能です。

GPT-2

昔苦労して実行させたGPT-2も、このtransfomerを使えばわずか3行で。

!python /content/transformers/examples/text-generation/run_generation.py \
    --model_type=gpt2 \
    --model_name_or_path=gpt2

色々と試せそうなので発見があれば追記していこうと思います。

RoBERTaを使ったメモ

embedding層を取り出すためのconfigの設定の注意点があったのでメモ。

#@title RoBERTa(モデル読み込み)
from transformers import RobertaTokenizer, RobertaForMaskedLM, RobertaConfig
import torch

#modelが入っているフォルダ指定
folder = '/output'

#embedding層を取り出すため
config = RobertaConfig.from_pretrained(folder)
config.output_hidden_states = True #これ
#config.output_attentions=True

tokenizer = RobertaTokenizer.from_pretrained(folder, config=config)
model = RobertaForMaskedLM.from_pretrained(folder, config=config)
#model = torch.nn.Sequential(model, torch.nn.Linear(768,144))

デフォルトだと、embedding層の重みを出してくれない。(文章数×vocab_sizeの行列が取り出されてしまう。)
config.output_hidden_states=Trueにすればよい。
そうすると、文章数*embedding層の数=768列の各層(12層)が12×文章数×768のtensorで取り出せた。
層の情報のどれを使うかで、
・最終層を使う
・最後の4層をconcate(768*4列になる)/sum/mean
など色々あるそうで。詳細はこの記事参照
自分はmeanを使った。

ちなみにconfig.output_attentions=Trueとすると、Attentoinが取り出せるみたいだけど未実験。

インポートエラー

finetuningを実行しようとしたらエラーが。

!python /content/transformers/examples/language-modeling/run_language_modeling.py \
    --train_data_file=$TEXT_FILE \
    --output_dir=$OUTPUT_DIRECTORY \
    --model_type=gpt2 \
    --model_name_or_path=gpt2 \
    --do_train

などとやると

ImportError: cannot import name 'DataCollatorForPermutationLanguageModeling'

というエラーが出た。
ネット上をうろうろさまよい、して、結局transformesをディレクトリ事消して、下記のコマンドを実行して再実行したらいけた。

!rm -f transformers
!git clone https://github.com/huggingface/transformers
%cd transformers
!pip install .
%cd ..
35
35
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
35
35