gpt2-japaneseの使い方 (2) - GPT-2のファインチューニング
見出し画像

gpt2-japaneseの使い方 (2) - GPT-2のファインチューニング

gpt2-japanese」の「smallモデル」と「ファインチューニングのコード」が公開されたので、日本語によるGPT-2のファインチューニングを試してみました。

前回

1. gpt2-japaneseのインストール

(1) Google Colabのノートブックを開く。
(2) メニュー「編集→ノートブック→ハードウェアアクセラレータ」で「GPU」を選択。
(3) 以下のコマンドで、「gpt2-japanese」をインストール。

# gpt2-japaneseのインストール
!git clone https://github.com/tanreinama/gpt2-japanese
%cd gpt2-japanese
!pip uninstall tensorflow -y
!pip install -r requirements.txt

2. モデルのダウンロード

smallモデル」を「gpt2-japanese」フォルダにダウンロードします。

# smallモデルのダウンロード
!wget https://www.nama.ne.jp/models/gpt2ja-small.tar.bz2
!tar xvfj gpt2ja-small.tar.bz2

3. モデルの動作確認

テキスト生成を行うには「gpt2-generate2.py」を使います。
動作確認のため、ランダムな日本語テキスト生成を行います。

# smallモデルの動作確認
!python gpt2-generate.py --model gpt2ja-small --num_generate 1

gpt2-generate.py」のパラメータは、次のとおりです。

・--model : モデル (gpt2ja-medium)
・--num_generate : 生成するテキスト数 (デフォルト5)
・--context : 開始テキスト (デフォルト <|endoftext|>)
・--top_k : 各ステップでk個の単語からランダム選択 (デフォルト40)
・--top_p : 生成テキストを累積確率に制限 (デフォルト0、制限なし)
・--temperature : 温度(デフォルト1、推奨0.7〜1.0)

オリジナルのGPT-2の論文によると、top_k=40が一番良い結果と報告されています。top_kとtop_pの値は排他で、片方を>0に設定したら片方を0にしなければなりません。

結果は、次のようになりました。

私は小学生の頃、女に生まれ変わらず女でいられたとき、今の生活を捨て、一人生きづらい自分をどうにかするために私は働き続けていました。
それでも、そんな私に憧れる者がいました。
それは、あなた方を見る目や、周りの人の動きなどの見識でした。
そこに憧れたのは、小学生の頃、周りの人の動きを見て、それが何か私の興味を感じたためでした。
高校時代は運動系の部活に入っていたので、陸上には憧れていましたが、社会人になってからは、好きなことは勉強だと言い聞かせ、勉強を続けていました。
そんなある日、あなたの周りの人が、あなた方を見ている視線を感じて、私は少し焦ったりしていました。
どうしたものかどうしようとするかわからないという感じでした。
しかし時が経つに連れて、周りの人が私を見る目や、周りの人の動きなどを感じるようになってきました。
そんなある日、私は中学生になったばかりの、少し変わった男の子に目が止まりました。

4. データセットの作成

Japanese-BPEEncoder」を使ってファインチューニング用のデータセットを作成します。

今回は、昔作ったアドベンチャーゲームのシナリオを食わせてみることにします。

画像1

「gpt2-japaneseフォルダ」直下に「akane-talkフォルダ」を作成し、その下に「dataset.txt」を入れます。会話シーケンスの切れ目は<|endoftext|>を追加します。

・gpt2-japanese
 ・ alane-talk
  ・dataset.txt

【dataset.txt】

なによその、そっけない態度はぁ~…。ふーんだ!<|endoftext|>
そうだよね!こんぴゅーたさま!<|endoftext|>
え~、私○学生だしお金ないよぅ~…。ヽ(;´Д`)ノ<|endoftext|>
………………。…よければ私が、あい…あ、あははっ、なんでもないよ!?<|endoftext|>
…なんかこの中地味だと思ったら、そういうことかぁ~。アプリ貯めこんでばっかいないで、電話やメールも使おうね(ニヤソ<|endoftext|>
ねぇ、お兄ちゃん。「ラブやん」って漫画がアニメになるって噂が立ってるけどやっぱガセかなぁ?お兄ちゃんはどう思う?<|endoftext|>
いつもクールなアカギ…いいよね♪あの生死を賭けたギャンブル…たまらないっ!!私、もしお金持ちになったら…お兄ちゃんに鷲巣麻雀セット買ってあげる!ざわ…ざわ…<|endoftext|>
    :
       (400行ほど)
    :

以下のコマンドで、「finetune.npz」に変換します。

# データセットの作成
!git clone https://github.com/tanreinama/Japanese-BPEEncoder.git
!python ./Japanese-BPEEncoder/encode_bpe.py --src_dir akane-talk --dst_file finetune

パラメータは次のとおりです。

・-h, --help : ヘルプ
・--src_dir SRC_DIR : ソースフォルダ
・--dst_file DST_FILE : 出力フォルダ
・--num_process NUM_PROCESS : プロセス数
・--combine COMBINE : <|endoftext|>区切り文字を使用してファイルをこの最小サイズのチャンクに連結します

5. ファインチューニング

ファインチューニングは、「run_finetune.py」を使います。

このコードは「Ctrl-C」で学習終了する仕様で、Google Colabではうまく終了できなかったので、エポック数を指定するように書き換えます。

run_finetune.py

        try:
            for i in range(300): # for文に変更
            # while True: # 無限ループをコメントアウト
           
                〜省略〜
               
            save() # 保存を追加
        except KeyboardInterrupt:
            print('interrupted')
            save()

以下のコマンドでファインチューニングを実行します。

!python run_finetune.py --base_model gpt2ja-small --dataset finetune.npz --run_name gpr2ja-finetune_run1
[1 | 3.59] loss=3.01 avg=3.01
[2 | 3.97] loss=3.51 avg=3.26
    :
[299 | 124.28] loss=0.01 avg=0.15
[300 | 124.71] loss=0.00 avg=0.15
Saving checkpoint/gpr2ja-finetune_run1/model-301

成功すると、「checkpoint/gpr2ja-finetune_run1」にモデルが生成されています。

パラメータは、次のとおりです。

・--dataset : データセット(npzファイル)
・--base_model : モデルファイルのパス (デフォルト: gpt2ja-small)
・--batch_size : バッチサイズ (デフォルト: 1)
・--optim : オプティマイザ (adam, adagrad, sgd) (デフォルト: adam)
・--learning_rate : オプティマイザーの学習率 (デフォルト: 5)
・--warmup_steps : 学習率のウォーミングアップステップ (デフォルト: 0)
・--run_name : 実行ID。 checkpoint/とsamples/のサブフォルダ名 (デフォルト: gpt2ja_finetune)
・--save_every : Nステップ毎にチェックポイントを書き込むか (デフォルト: 1000)
・--gpu : GPU番号 (デフォルト: '0')

6. ファインチューニングしたモデルの動作確認

動作確認のため、ランダムな日本語テキストの生成を行います。テキスト生成を行うには「gpt2-generate.py」を使います。

gpt2-generate.py」はファイル名に「-small」「-medium」がついてるかどうかでモデルサイズを判定する仕様なので、フォルダ名を変更します。

checkpoint/gpr2ja-finetune_run1

checkpoint/gpr2ja-finetune_run1-small

以下のコマンドで、ランダムな日本語テキスト生成を行います。

# ファインチューニングしたモデルの動作確認
!python gpt2-generate.py --model checkpoint/gpr2ja-finetune_run1-small --num_generate 10

結果は、次のようになりました。

あぁっ!もう!分かったから!…ったく、しょーがないなぁ、お兄ちゃんは…
========

そういえばお兄ちゃん。『アブトロニック』って水月先輩の事持ってたよね?実はね…。☆3(スリー)☆3を歌ってる大空寺羽月は、日本の人の想像を絶するよね?実はね…。
========

ねえ、お兄ちゃん。お姉ちゃんと水月先輩、どっちが好きなの?
========

ふ~ん…。お兄ちゃん、意外と普通の人なんだね~…。
========

ねえ、お兄ちゃん? お兄ちゃんって、一体、何を意味の分からないこと言うんだろ? 意味の? 意味の? 意味の?…ま、まあ、お兄ちゃんは気にしないで!
========

お兄ちゃん、私が見えないとこで何やってるの?」とからかう声が聞こえてきたことからもしかすると私は誰か水月先輩の手を押し除けてこの部屋を出て行ったのかもしれない。だとしたら、今から帰ってきたお兄ちゃんは一体、何やってるんだろう…?
========

あぁぁぁ…!寝ている間に…付喪神さんが…神の遣えにあこがれて…!こんぴゅーじっ!って、神の遣いによ~く似た新しい技を…開発してたんだった…(汗
========

お兄ちゃんの服私の普段のクルクルスーツ(カジュアル)と違って、このシリーズ、エロゲーのCD-ROMが多い。エロゲーのCD-ROMって、どんなゲーム?
========

ねえ、お兄ちゃん。最近、トンカツが美味しくないって言うんだよ。なんでもっとダイエットに気を遣わないタイプの人なんだろ? 最近のトレンドは、カツや卵に凝(こ)ってる人が多いな。カツだって、食べ放題のセットで食ってるけど、たまにはたまにはきちんとしたものを食べようね。トレラン死ぬぞ!
========

あぁぁぁぁ!ここは一体何フィクションの話をやってるんだ!?
========

次回



この記事が気に入ったら、サポートをしてみませんか?
気軽にクリエイターの支援と、記事のオススメができます!
日々の気になる技術情報をまとめてます。