GPT   - Overview / Execution


# GPT2, GPT3   (Decoder)
<!-- タイトルとアンカー名を編集 -->
1. [GPT3-概要](#gpt3-概要)
1. [GPT2-概要](#gpt2-概要)
1. [実行手順](#実行手順)
1. [Fine Tuning](#fine-tuning)
1. [参考文献](#参考文献)

<!-- 各チャプター -->
<a id="#GPT3-概要"></a>
# GPT3-概要

- 事前学習:約45TB
- トークン数: 約500B
   - 主にwebからのスクレイピング
- ファインチューニングの必要なし
- GPTのトレーニングがどれだけ大きいか:
  　　 　　　- 例えば日本語Wikpediaコーパスだけだとサイズは1.8GBくらい
  　　 　　　- 対してGPT2/3は400GB〜1.5TB	
  　　 　　　   - 有名な日本語の大規模コーパス：現代日本語書き言葉均衡コーパス(BCCWJ)
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1089224/1e5df3e4-0805-a25b-0d6d-2ebd61251434.png"width=90%>


- パラメータ: 約1750億(175B)個
 <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1089224/5787815c-28d1-285b-9bc2-3b41b571448a.png"width=70%>


- ベース：transformer

- 微調整方法
  - Fine-tuning:一般的なファインチューニング。タスク固有のデータが必要。過学習に注意。
  - Few-Shot:モデルのパラメータは固定したまま、少量のデモンストレーションから予測を行う。（データ少量・過学習なし・ファインチューニングには劣る。）
  - One-shot:デモンストレーション１つのみ
  - Zero-shot:タスクの支持のみ与える。最も汎用で最も難しい。
   <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1089224/83b592ff-7670-1ab9-6d6c-66cd31932240.png"width=90%>

- GPT-3 README
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1089224/38dce187-6cb5-f48d-176f-c30ac7615f65.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1089224/bd2710e0-41aa-f938-6c21-3c0b35f046d2.png)


<a id="#GPT2-概要"></a>
# GPT2-概要
- 事前学習： 8 million web pages
- パラメーター：15億
- ベース：transformer

---
- GPT-2<==>GPT-3
    - 同じ点：モデル/アーキテクチャ
    - 違う点：GPT-3は、計算量を削減したtransformerレイヤを用いている
    　　　　　（：Sparse Transformersに似ているもの。）


<a id="#実行手順"></a>
# 実行手順
- MODEL: tanreinama/gpt2-japanese – mediumモデルに（ライセンスフリーの日本語文章生成モデル）  
    https://github.com/tanreinama/gpt2-japanese

- about pre-trained model: https://github.com/tanreinama/gpt2-japanese/blob/master/report/models.md
- copus used for pre-training: https://github.com/tanreinama/gpt2-japanese/blob/master/report/corpus.md


1. 作業ディレクトリを作成しgpt2をGITをクローン
    ```
    mkdir gpt2
    cd gpt2
    /gpt2# git clone https://github.com/tanreinama/gpt2-japanese
    ```
1. gpt2jaモデル(middle size)をネットワーク経由でダウンロード
    ```
    /gpt2# mkdir models
    /gpt2# cd models
    /gpt2/models#  wget https://www.nama.ne.jp/models/gpt2ja-medium.tar.bz2
    ```

1. 解凍
    ```
    /gpt2/gpt2-japanese/models# tar xvfj gpt2ja-medium.tar.bz2
    /gpt2/gpt2-japanese/models# ls                                                                                                     gpt2ja-medium  gpt2ja-medium.tar.bz2  special_thanks.txt  
    ```

1. 依存関係にあるライブラリをインストール
    - libraries to be installed:
    ```
    /gpt2/gpt2-japanese# less requirements.txt 
    numpy
    jaconv
    tensorflow
    ```
   - install necessary libraries all at once:
    ```
    /gpt2/gpt2-japanese# python -m pip install -r requirements.txt
    ```
   - tensorflowやnumpyがインストールされていないorバージョン違いの場合は、エラー指示参照

1. 日本語生成 (the most simple way) 
    ```
    /gpt2/gpt2-japanese# python gpt2-generate.py --model models/gpt2ja-medium --num_generate 3         
    ```

1. 日本語生成 (feed initial texts)
    ```
     /gpt2/gpt2-japanese# python gpt2-generate.py --model gpt2ja-medium –-context="ねえねえ今後の経済不安だね！"         
    ```

1. 日本語生成 (novel-like auto generated texts)
    ```
     /gpt2/gpt2-japanese# python gpt2-generate.py --model gpt2ja-medium --min_length 200 --max_length 400         
    ```
---

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

---
						





<a id="#fine-tuning"></a>
# Fine Tuning


1. 作業ディレクトリを作成
    ```
    /gpt2/gpt2-japanese/# mkdir fineTuning
    /gpt2/gpt2-japanese/# cd fineTuning         
    ```

1. Japanese-BPEEncoderをダウンロード
    ```
    /gpt2/gpt2-japanese/fineTuning# git clone https://github.com/tanreinama/Japanese-BPEEncoder.git   
    ```
1. コーパス文のファイル作成
    ```
    /fineTuning# vi data_1.txt   
    ```


1. Encode / Embedding
    ```
    /gpt2/gpt2-japanese# python ./fineTuning/Japanese-BPEEncoder/endcode_bpe.py --src_dir fineTuning --dst_file AfterFineTuned          
    ```
   - パラメータの詳細；						
	・-h, --help : ヘルプ					
	・--src_dir SRC_DIR : ソースフォルダ					
	・--dst_file DST_FILE : 出力フォルダ					
	・--num_process NUM_PROCESS : プロセス数					
	・--combine COMBINE : 
区切り文字を使用してファイルをこの最小サイズのチャンクに連結
					
1. fine tuning
    ```
    /gpt2/gpt2-japanese# python run_finetune.py --base_model gpt2ja-medium --dataset AfterFineTuned.npz --run_name gpt2ja-finetun     
    ```
   - パラメータ											
	・--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')										


---
- npy / npz　			
: Numpy独自のバイナリ形式。			
np.save関数では、ndarrayを npy という拡張子を付けて保存する。			
この形式だと、配列のshapeやdtypeなどの情報も保存するので、np.loadで情報を保ったまま読み込むことが出来る。			
複数のndarrayを保存するときは np.savez 関数を用いて、npz という拡張子で保存する。			
npz形式の場合のロードも np.load 関数を使う（拡張子で判断される）。			



<a id="#参考文献"></a>
# 参考文献
- GPT3 論文Language Models are Few-Shot Learners
   https://arxiv.org/abs/2005.14165

- GPT2　論文Language Models are Unsupervised Multitask Learners
　https://d4mucfpksywv.cloudfront.net/better-language-models/language-models.pdf

- GPT3 GitHub
  https://github.com/openai/gpt-3

- GPT2 GitHub
  https://github.com/openai/gpt-2