ML_LEE_2022_hw5

  • 本次作業使用judgeboi

  • translate english to chinese

作業講解

datasets

  • (en,zh-tw) paired data

Evaluation

  • BLEU score
  • 本次會需要對training data做一些preprocessing(norm,刪除極端資料)

技巧

  • label smoothing
  • tokenize
  • lr scheduling (warm-up , 遞減lr)
  • back translation (中英,英中都train)
    • 不同語言的data需要保持在同一個維度
         - backward model的表現很重要
         - model capacity will increase,since data amount increased

Baselines

Simple: Train RNN seq2seq (Sample code)
Medium: add lr scheduler, train longer
Strong: 使用transformer, tuning hyperparameter
Boss: Apply back-translation

Note: 助教的ppt有建議hyperparameter

Report

  • 問題一:要visualize positional embedding,用一個2維matrix表示 (cosine similarity)
    • 可以從decoder得到,使用pos_emb = model.decoder.embed_positions.weights.cpu().detech()
        - torch.size([1026,256]) (256維)
         - 推薦使用cosine similarity
  • 問題二:實作Clipping Gradient norm 並顯示出gradient norm
    • 避免梯度爆炸
    • Gradient norm: 把每個參數的gradient收集起來變成vector,對他們計算p-norm
    • 作法:
            1. 設定一個最大值max_norm
            2. 收集paras,並計算他們的p-norm,命結果為Lnorm
            3. 如果Lnorm > max_norm,則計算scale_factor = max_norm / Lnorm,並對每個gradient乘上scale_factor
      • 設定max_norm = 1.0
      • Apply plot of “gradient norm v.s step”,並圈出Lnorm > max_norm的地方
    • 助教的code已經有算出gnorm了,我們要把它儲存起來,才能在training結束的時候具現化它

寫作業歷程

這份作業無法繳交了,因為judgeboi已經關起來了qq,只能直接在本機用test data去驗證BLEU分數

觀察Sample Code

首先,來研究一下助教的code,整個notebook分為幾大片段:

  1. 下載資料集以及import packages

    • 資料集來自fairseq
  2. 對資料集內容做前處理(clean_corpus)

    • 移除一些垃圾字元
      • 移除特殊符號
      • 如果是中文,把全形轉換成半形
    • 移除過長或過短的字詞
      • min = 1
      • max = 1000
    • 輸出train_dev.clean.zh/en
  3. 切割valid/training set

    • 1:99
    • 輸出 train.clean.zh/en , valid.clean.zh/en 4檔案
  4. 處理OOV問題

至此資料處理完成

  1. 模型定義

    • fairseq?
    • 預設RNN的encoder,decoder
    • 大模型class由seq2seq包裝

    實際instance長這樣:

1
2
3
4
5
6
7
8
9
# HINT: TODO: switch to TransformerEncoder & TransformerDecoder
encoder = RNNEncoder(args, src_dict, encoder_embed_tokens)
decoder = RNNDecoder(args, tgt_dict, decoder_embed_tokens)
# encoder = TransformerEncoder(args, src_dict, encoder_embed_tokens)
# decoder = TransformerDecoder(args, tgt_dict, decoder_embed_tokens)

# sequence to sequence model
model = Seq2Seq(args, encoder, decoder)

所以要做的就是自己做一如下面的TransformerEncoder/Decoder,取代原本的RNN
助教強調對於seq2seq任務來說,init非常重要,下方的初始化會需要做出相對應的調整

  1. Optimizer & learning rate schaduling

    • lr這塊需要套公式,公式有給

    至此模型初始化完成

  2. Traing step

    • 這裡沒什麼要注意的了
    • 觀察一下要如何完成report

First Approach

直接run sample code,觀察運作方式
BLEU score = 16.08

1
2
3
2022-08-04 07:04:07 | INFO | hw5.seq2seq | BLEU = 16.08 43.4/21.3/11.4/6.3 (BP = 1.000 ratio = 1.009 hyp_len = 112803 ref_len = 111811)
2022-08-04 07:04:07 | INFO | hw5.seq2seq | saved epoch checkpoint: /content/checkpoints/rnn/checkpoint15.pt
2022-08-04 07:04:07 | INFO | hw5.seq2seq | end of epoch 15

Second Approach

  • 把encoder, decoder註解拿掉,由RNN改成Transformer

hyperparameter修正


其中:

  • $P_{drop}$ = Residual Drop
  • $d_{ff/v/k/model}$ = dimension of fast-forward/key/value/model
  • N = layer數
  • $\epsilon_{ls}$ = label smoothing rate

我照著Base版修改hp

  • encoder/decoder_embed_dim = 512
  • encoder/decoder_ffn_embed_dim = 2048
  • encoder/decoder_layers = 6
  • args.encoder/decoder_attention_head = 8 (太高也不好)

修改learning rate 公式

lr = pow(d_model,-0.5)*min( pow(step_num,-0.5), step_num* pow(warmup_step,-1.5) )

Result

1
2
3
2022-08-04 16:04:59 | INFO | hw5.seq2seq | BLEU = 25.50 59.7/34.3/20.6/13.0 (BP = 0.937 ratio = 0.939 hyp_len = 105012 ref_len = 111811)
2022-08-04 16:05:00 | INFO | hw5.seq2seq | saved epoch checkpoint: /content/checkpoints/rnn/checkpoint15.pt
2022-08-04 16:05:00 | INFO | hw5.seq2seq | end of epoch 15

有達到strong base line了,不過還沒做報告

Third Approach

之前沒有為完成report寫一些額外的code,這次把他補上了

Prob1:visualize positional embedding

參考了這篇網誌中的Report 1,自己做雖然有成功detach,但並不知道後續該怎麼做…對於CosineSimilarity與tensor dimention的掌握度不足..完全沒想到要用unsqueeze

Prob2:實作Clipping Gradient norm 並顯示出gradient norm

其實clipping gradient norm助教已經寫好了,我做的只是把每個step的gnorm存到一個list gnormList裡面,然後再把它丟進圖表裡面印出來

Mount google drive

有鑑於上次的大暴死,這次決定把epoch的cache保存在自己的雲端硬碟而非放在colab裡面
不然連線階段一個過期,整個檔案會被刪除,就算有save model都沒救…

Result

BLEU score = 25.63

1
2
3
4
5
2022-08-05 13:10:14 | INFO | hw5.seq2seq | example source: so we're hoping that's what they'll do .
2022-08-05 13:10:14 | INFO | hw5.seq2seq | example hypothesis: 我們希望他們能做到這點 。
2022-08-05 13:10:14 | INFO | hw5.seq2seq | example reference: 所以 , 我們希望它們能夠幫忙 。
2022-08-05 13:10:14 | INFO | hw5.seq2seq | validation loss: 3.2599
2022-08-05 13:10:14 | INFO | hw5.seq2seq | BLEU = 25.63 57.9/32.9/19.6/12.3 (BP = 0.986 ratio = 0.986 hyp_len = 110246 ref_len = 111811)

Report

Prolem 1

Problem 2


Reference

梯度爆炸

梯度爆炸:在error surface平坦的地方,設的lr過大,導致整個參數大跑

OOV (out of vacabulary)

  • 類似人類會的英語字彙不足,不足以表達意涵
  • 字彙過長,不好處理
  • 本作業中使用subwords來解決這個問題,Reference

Google雲端

本次作業的模型參數檔、gnorm軌跡與預測結果連結