言語処理100本ノック2020 (96, 97)

# はじめに
本記事は言語処理100本ノックの解説です。
100本のノックを全てこなした記録をQiitaに残します。
使用言語はPythonです。

https://nlp100.github.io/2020/ja/

今回は第10章: 機械翻訳(96, 97)の解答例をご紹介します。

# 96. 学習過程の可視化
>Tensorboardなどのツールを用い，ニューラル機械翻訳モデルが学習されていく過程を可視化せよ．可視化する項目としては，学習データにおける損失関数の値とBLEUスコア，開発データにおける損失関数の値とBLEUスコアなどを採用せよ．

```python:コード
%load_ext tensorboard
%tensorboard --logdir logs

!fairseq-train "[PATH]/processed/" 
  --task translation \
  --arch transformer \
  --tensorboard-logdir "logs" \
  --source-lang ja --target-lang en \
  --max-epoch 300 \
  --lr 1e-5 \
  --batch-size 32 \
  --valid-subset valid,train \
  --optimizer adam \
  --save-interval 2 \
  --eval-bleu \
  --max-valid-steps 300 \
  --save-dir "[PATH]/model-96/" \
  --restore-file  "[PATH]/model-96/checkpoint_last.pt" \
| tee -a "[PATH]/log-96/train.log"
```
**出力結果**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579871/51ac5da3-9f4e-5fb5-bc92-7727f9ce94a6.png)


**コメント**
学習データのBLEUスコアの可視化に苦労しました。Tensorboardのbleuの項目にはtrainは表示されていますが、値が妙に低いです。これはmax_valid-stepsを指定しているのが原因ですが、指定しないとtrainのbleu計算に十数時間かかります。
学習されていく過程の可視化なので、lossと同様に増減が分かればいいかなと思っています。

# 97. ハイパー・パラメータの調整
>ニューラルネットワークのモデルや，そのハイパーパラメータを変更しつつ，開発データにおけるBLEUスコアが最大となるモデルとハイパーパラメータを求めよ．

```python:コード
!touch "[PATH]/model-97/ParameterLog.txt"

#ハイパーパラメータ
#arcs = ["fconv", "fconv_iwslt_de_en", "fconv_wmt_en_ro", "fconv_wmt_en_de", "fconv_wmt_en_fr",'transformer_tiny', 'transformer', 'transformer_iwslt_de_en', 'transformer_wmt_en_de', 'transformer_vaswani_wmt_en_de_big', 'transformer_vaswani_wmt_en_fr_big', 'transformer_wmt_en_de_big', 'transformer_wmt_en_de_big_t2t', 'transformer_align', 'transformer_wmt_en_de_big_align', 'lstm', 'lstm_wiseman_iwslt_de_en', 'lstm_luong_wmt_en_de', 'lightconv', 'lightconv_iwslt_de_en', 'lightconv_wmt_en_de', 'lightconv_wmt_en_de_big', 'lightconv_wmt_en_fr_big', 'lightconv_wmt_zh_en_big', 'fconv_self_att', 'fconv_self_att_wp']
arcs = ['lstm', 'transformer']
dropouts = [0, 0.5]
weight_decays = [0, 0.01]

best_bleu = 0
best_arc = ""
best_dropout = 0
best_weight_decay = 0

! mkdir "./97content"
for dropout in dropouts:
  for weight_decay in weight_decays:
    for arc in arcs:
      ! rm -r "./97content"
      ! mkdir "./97content"
      !fairseq-train "[PATH]/processed/" \
        --task translation \
        --arch $arc \
        --source-lang ja --target-lang en \
        --max-epoch 3 \
        --lr 1e-5 \
        --batch-size 32 \
        --optimizer adam \
        --save-interval 3 \
        --dropout $dropout \
        --save-dir "./97content" \
        --weight-decay $weight_decay
      #翻訳結果を出力
      !fairseq-generate "[PATH]/processed/" \
        --path "./97content/checkpoint_last.pt" \
        --task translation \
        --gen-subset test \
      | tee >(grep "^H" | cut -f3 > "./97content/test-transform.txt")\
      | grep "^T" | cut -f2 >  "./97content/test-true.txt"
      #bleuを計算
      score_text = !fairseq-score \
        --sys  "./97content/test-transform.txt"\
        --ref  "./97content/test-true.txt"
      bleu_score = float(score_text[-1].split(",")[0].split(" ")[-1])
      print(bleu_score)
      with open("[PATH]/model-97/ParameterLog.txt", "a+") as f:
        f.write(arc +", "+ str(dropout) +", "+ str(weight_decay) + " :" + str(bleu_score)+"\n")

      if bleu_score > best_bleu:
        best_bleu = bleu_score
        best_arc = arc
        best_dropout = dropout
        best_weight_decay = weight_decay

temp = "[PATH]/model-97/" + best_arc + "_" + str(best_dropout) + "_" + str(best_weight_decay) + ".pt"
!cp "./97content/checkpoint_best.pt" $temp
```
**出力結果**
arch, dropout, weight_decay: bleu
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579871/0c06ddcc-910e-ca08-77c1-4c3132b90009.png)

**コメント**
fairseqで機械翻訳モデルを構築できるリストはコメントアウトしています。GPUと電気を無尽蔵に使える方は回してみてください。

# 他章の解答例

https://qiita.com/Dukapan100knock/items/d418f2aa37b2b3d16428