riow1983 / Kaggle-chaii

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Kaggle-chaii

input file image
https://www.kaggle.com/c/chaii-hindi-and-tamil-question-answering
どんなコンペ?:
開催期間: 2021-08-11 ~ 2021-11-15
結果





実験管理テーブル

commitSHA comment Local CV Public LB
- - - 0.010
6bb70140768d5dec90205db8b0568746124f5568 for loop incorporated in the function for memory efficiency - Error
8c807fec919722adf8eacb7822ddbfd3c0627487 sentence seperation deprecated - 0.002
aa0b23e093ebbc085a56e354e764d95c3b31bb9f replaced pipeline w/ torch-native way in the inference loop - 0.005
9c381dbda9b2e142ab2ea1f32fcda596f4eb28d0 replaced pipeline w/ torch-native way in the inference loop - 0.005
c85cec65d19ea00a6942e63934cd7f1288bc2460 pre-trained model (mBERT) w/ fine-tuning being done on this notebook - 0.005
f4d2f7179bc1bc0c11bb03558ccf19a6a0ee3a00 indi-bert w/o fine-tuning - 0.006
d421e45e0d00c77123ed61e7fef6b680aae9f19d xlm-roberta-large-squad2 w/o fine-tuning - 0.571
652b874625c0200035e39a79ab8144469b174a58 xlm-roberta-large-squad2 w/ fine-tuning (pipeline inference) - 0.008
495c5de2a4b7582eccc3da4e1831572255e11004 xlm-roberta-large-squad2 w/ fine-tuning (naive torch inference) - Error
30955f14a9a0da8823b9e68df53443505ccacd96 copy & paste - 0.792
5097e95f17ac09bb806088ba626ddb33f180ce5e huggingface trainer API example reproduced faithfully 0.654 0.728
e316f40c44c52d204978b2c34a7b66320cb7687e inference using fine-tuned model trained on Colab w/ 3 epochs 0.655 0.696
89a9c10ef578370e83f6ed05d86c24fa9fd4b262 --max_length 512 --doc_stride 80 --num_train_epochs 1 0.650 0.719
3c37a320af36ffe503d4839805c0cb7435601946 --drop_tamil_train true --CV 0.685 --LB 0.708 0.685 0.708
8c3d0c8487e6e7f99dc2277b7cc120259acb80a2 --max_seq_length 512 --doc_stride 80 - 0.775
7a15ddf4444426ad241d591b48610ec83311674a --ensemble [2,1,1,1,1] - 0.789
84a040e7d17bb3831a5f9ca5a7d9aa8081352043 --ensemble [1,2,1,1,1] - 0.787
7495f69317823feeb8824da564a2d3bafad89479 riow1983/chaii-qa-5-fold-xlmroberta-torch-fit-7 used - 0.770
1fae73a8fca470057b8650a6dbc8cd79fbbc2fc0 external data concatenated before 5-fold splitting - 0.779
5f4c5aa7bb7bfe98f17a61f8ec1704d133a7987d Models updated (tamil from train dropped) - 0.771
356b83219e70108a9f6b47e850d640ac4c47e19b Models updated (2 epochs for all folds) - 0.783
71fb5c9d5a887da73c784cb70926f8a2b9ba8480 Models updated (1 epoch for all folds) - 0.772

Late Submissions

commitSHA comment Local CV Private LB Public LB

My Assets

[notebook命名規則]

  • kagglenb001-hoge.ipynb: Kaggle platform上で新規作成されたKaggle notebook (kernel).
  • localnb001-hoge.ipynb: localで新規作成されたnotebook.
  • k2lnb001-hoge.ipynb: kagglenb001-hoge.ipynbをlocalにpullしlocalで変更を加えるもの.
  • l2knb001-hoge.ipynb: localnb001-hoge.ipynbをKaggle platformにpushしたもの.

Code

作成したnotebook等の説明

name url input output status comment
localnb001-export-transformers URL - localnb001-export-transformers Done bert-base-multilingual-casedのファイルをKaggle Datasetとしてexport
kagglenb001-chaii-eda URL localnb001-export-transformers
indic-bert
submission.csv Done bert-base-multilingual-casedによる予測 (w/o fine-tuning)
localnb002-fine-tune URL ../input/chaii-hindi-and-tamil-question-answering/train.csv localnb002 Done bert-base-multilingual-casedのfine-tuning
l2knb001-fine-tune URL localnb001, localnb002 submission.csv 作成中 fine-tuned bert-base-multilingual-casedによるinference
kagglenb002-fine-tune URL localnbf001, localnb002 submission.csv 作成中 kagglenb001をベースにしたfine-tuned bert-base-multilingual-casedによるinference
reproduction-of-0-792-notebook URL kishalmandal/5foldsroberta, nguyenduongthanh/xlm-roberta-large-squad-v2 submission.csv Done Reproduction of 0.792 notebookのコピー
ChAII - EDA & Baseline URL thedrcat/hf-datasets, nbroad/xlm-roberta-squad2 chaii-bert-trained, chaii-qa, runs, submission.csv Done ChAII - EDA & Baselineのコピー
k2lnb001-chaii-eda-baseline-train - ./input/hf-datasets, ./input/xlm-roberta-squad2 ./notebooks/k2lnb001-chaii-eda-baseline-train/chaii-bert-trained, ./notebooks/k2lnb001-chaii-eda-baseline-train/chaii-qa, ./notebooks/k2lnb001-chaii-eda-baseline-train/runs Done ChAII - EDA & Baselineからinference部分を除外したもの
kagglenb003-chaii-eda-baseline-inference - thedrcat/hf-datasets, nbroad/xlm-roberta-squad2, riow1983/k2lnb001-chaii-eda-baseline-train submission.csv Done ChAII - EDA & Baselineからtrain部分を除外したもの


参考資料

Snipets

# huggingface modelをPyTorch nn.Moduleで訓練した後save (& load) する方法:
# reference: https://github.com/riow1983/Kaggle-Coleridge-Initiative#2021-04-25
model = MyModel(num_classes).to(device)
optimizer = AdamW(model.parameters(), lr=2e-5, weight_decay=1e-2)
output_model = './models/model_hoge.pth'

# save
def save(model, optimizer):
    # save
    torch.save({
        'model_state_dict': model.state_dict(),
        'optimizer_state_dict': optimizer.state_dict()
    }, output_model)

save(model, optimizer)

# load
checkpoint = torch.load(output_model, map_location='cpu')
model.load_state_dict(checkpoint['model_state_dict'])
optimizer.load_state_dict(checkpoint['optimizer_state_dict'])
# オーバーラップを確保しながら特定長のシーケンスを得るためのポジションを取得するループ

max_len = 512
context_len = 5121
overlap=60

for i in range(0, context_len, max_len-overlap):
    print("start_position:", i)
    print("end_position:", min(i + max_len, context_len-1))
    print()
# ip_addressごとの最頻出malware_typeを表示するSeriesを取得する方法

def md(s):
    c = Counter(s)
    return c.most_common(1)[0][0]

df.groupby('ip_address')['malware_type'].agg(md)

Papers

name url status comment
BERT Based Multilingual Machine Comprehension in English and Hindi URL 未読 -
Unsupervised Cross-lingual Representation Learning at Scale URL 未読 XLM-RoBERTaの論文
RETHINKING EMBEDDING COUPLING IN PRE-TRAINED LANGUAGE MODELS URL 未読 mBERTの改良版"RemBERT"の論文.
XLM-RoBERTaを凌駕. ディスカッションで取り上げられている.
WECHSEL: Effective initialization of subword embeddings for cross-lingual transfer of monolingual language models URL Done 単言語モデルとしてソース言語からターゲット言語に転移させる新方式.多言語モデルを凌駕.
本コンペでも終盤に上位チームが採用. 今後のデファクトスタンダードになるか注目.
A Discrete Hard EM Approach for Weakly Supervised Question Answering URL Reading 答えだけ与えられ, 導出論理が欠損した不完全データとしてのQAタスクを,
弱学習器による導出論理の予測結果をhard-EMアルゴリズムで収束させる手法が提案されており
本コンペでも本提案手法がフィットするとした上位チームが存在した.
A Mutual Information Maximization Approach for the Spurious Solution Problem in Weakly Supervised Question Answering URL Reading QAタスクにおいて答えのみが与えられ, 導出論理は与えられない状況を弱教師あり学習だとして,
間違った導出論理のもとたまたま正解するようなモデルの誕生を回避する手法を提案.
こちらも上位チームが参考にしようとしたが実装できたわけではない.

Blogs / Qiita / etc.

name url status comment
BERT入門 URL Done Kaggle inference時 (=internetオフ時),
🤗 transformersのメタファイルを取得する方針が参考になった
Unicode block URL Done 各言語文字のblock rangeが示されている
(正規表現) iHateRegex URL Done 正規表現の動作確認がブラウザ上でできる
The Unicode Standard, Version 13.0 > Devanagari URL Done Devanagariのunicodeの解説書
Adapting BERT question answering for the medical domain URL Done Dealing with a long contextセクションに512トークン長以内にcontextを分割する手法が言葉で説明されている
Question Answering with a fine-tuned BERT URL Done fine-tunedということでfine-tuneする実装例ではなく, fine-tune済みのモデルの利用例になっていることに注意
【突然GitHubにpushできなくなった】 トークン生成で解決:The requested URL returned error: 403 URL Done GitHub連携にパスワード方式が使えなくなった2021年8月13日以降はこのトークン方式になる
(:hugs:) ValueError: char_to_token() is not available when using Python based tokenizers URL Done 🤗 char_to_tokenメソッドを使うならfast tokenizerを使うべし
(pandas) pandasでDataFrameのセルにlistを代入する URL Done object型のSeriesに対して.atメソッドを使うべし
HTML 特殊文字 URL Done 矢印やギリシア文字などの記法集
pandasでjsonlを扱いたい時 URL Done jsonlとは
エラーを出さずに最頻値を得たいとき URL Done statistics.modeではエラーになる局面もcollections.Counterで解決可能
EMアルゴリズム徹底解説 URL Reading -
Soft and Hard EM (Expectation Maximization) URL Done -

Official Documentation or Tutorial

name url status comment
(:hugs:) Fine-tuning a pretrained model URL 参照中 Trainer APIや素のPyTorchによる:hugs: pretrained modelのfine-tuning実装例
(:hugs:) Fine-tuning with custom datasets URL 参照中 IMDb(Sequence Classification), W-NUT(Token Classification = NER), SQuAD2.0(QA) それぞれについてのfine-tuning実装例
(PyTorch) DATASETS & DATALOADERS URL 参照中 PyTorch Dataset, DataLoaderの公式実装解説
(PyTorch) Custom loss functions URL Done PyTorchでCustom loss functionを実装する方法
(:hugs:) BERT URL 参照中 🤗BERTメインページ
(:hugs:) RoBERTa URL 参照中 🤗RoBERTaメインページ
(:hugs:) XLM-RoBERTa URL 参照中 🤗XLM-RoBERTaメインページ
(:hugs:) Tokenizer URL 参照中 🤗Tokenizerメインページ
(:hugs:) Preprocessing data URL 参照中 tokenizerにbatch sentence Aとbatch sentence Bを入力した場合に出力されるものを確認できる
(:hugs:) Extractive Question Answering URL Done pipelineによるinferenceとtorchによるinference両者の例がシンプルにまとまっている

StackOverflow

name url status comment
BERT tokenizer & model download URL Done 🤗 transformersのメタファイルをダウンロードする例.
ただし最近は格納先がHugging Face Platformに変更になった模様.
python pandas: apply a function with arguments to a series URL Done apply対象の関数への引数の渡し方
Python: Find a substring in a string and returning the index of the substring URL Done string型のfindメソッドでできる
(pandas) Pandas drop duplicates on one column and keep only rows with the most frequent value in another column URL Done 出現回数が最頻のものを残してdrop duplicatesする方法
(:hugs:) Transformers v4.x: Convert slow tokenizer to fast tokenizer URL Done XLMRobertaTokenizerを使用するためにはpip install transformers[sentencepiece]としてやる必要あり

GitHub

name url status comment
Kaggle-Coleridge-Initiative URL Done Coleridgeコンペ時につけていたKagge日記
個人アクセストークンを使用する URL Done GitHub連携にパスワード方式が使えなくなった2021年8月13日以降はこのトークン方式になる
(PyTorch) How to slice a BatchEncoding object into desired batch sizes? URL Done tokenizerはbatchにしたtextを受け取れる仕様
IndicBERT URL 未確認 ai4bharat/indic-bertにfine-tuneing cliが付いたもの(?)
Visualize your 🤗 Hugging Face data with 🏋‍♀️ Weights & Biases URL 実行エラー Colabで実行してみたがデータのロードでエラーが出る
guchio3/kaggle-chaii-2021 URL 確認中 Dockerを使った分析環境, W&Bを使った実験管理方法が参考になりそう

Hugging Face Platform

name url status comment
bert-base-multilingual-cased URL Done config.json, pytorch_model.bin, vocab.txtを取得
kagglenb001-chaii-edaにて使用
ai4bharat/indic-bert URL Done kagglenb001-chaii-edaにて使用
deepset/xlm-roberta-large-squad2 URL Done kagglenb001-chaii-edaにて使用.
tokenizerにはXLMRobertaTokenizerを使用していることがこちらで確認できる

Kaggle Notebooks

name url status comment
coleridge_regex_electra URL 参考 Coleridgeコンペの47th solution.
transformers pipelineを使ったQA実装例が非常に分かりやすく, 本コンペでも参考とした.
chaii-QA: multi-lingual pretrained baseline URL 参照中 🤗製マルチリンガル系pre-trainedモデルをpipelineメソッドで実行のうえsubmitしてみた結果xlm-roberta-large-squad2が最良とのこと
Intro to Hugging Face datasets 🤗 URL 読了 入力データはtensorを格納した辞書({'input_ids':tensor(), 'attention_mask':tensor(), 'offset_mapping':tensor(), start_positions':tensor(), 'end_positions':tensor()})であれば良い.
🤗 datasetsはデータ加工にpandasを必要としないほど柔軟性がありそう.

Kaggle Datasets

name url status comment
xlm roberta squad2 URL Done deepset/xlm-roberta-large-squad2をダウンロードしたもの

Kaggle Discussion

name url status comment
Recipe for winning? URL Done 学習データのラベルが適当(特にtタミル語)かつデータ量が少ない件について手動アノテーションの有利性に言及したもの.
もしくは学習データを一切使わず外部データだけでfine-tuneしたほうがいいという意見も.
Hindi & Tamil QA papers / datasets URL 未確認 使えそうな外部データやpre-trainedモデルの紹介
Useful Resources for the competition URL Done タイトルとは裏腹に学習データのラベルがいい加減だという指摘まとめとそこに起因する倫理的問題についてのディスカッションまとめが秀逸
Comparison of the solutions of the top five teams! URL Done 上位5チーム中4チームが(XLM-R,Muril,Rembert)の組合せを採用. 3チームがcharacter logits mappingによるアンサンブルを採用.


Diary

2021-08-21

コンペ参加.


2021-08-22

kagglenb001-chaii-edaを作成.


2021-08-24

kagglenb001-chaii-edaによるsubmit完了.


2021-09-13

localnb002-fine-tuneのpreprocessingコードがようやくひと段落し, train開始.


2021-09-14

fine-tuned mBERTでsubmitするもzero-shotよりもLB悪化(0.010 ⇒ 0.002).
inferenceをpipelineで実施していたが, torch-nativeな方法も試したい.
その次何するか:

  • pipeline方式でtrainする際, HindiモデルとTamilモデルに分けてそれぞれでinferenceする ⇒ issue#2
  • Jaccard関数などloss関数に組み込んでちゃんとtrainする ⇒ issue#3
  • mBERTの枠組みで, Hindi Question - Tamil Answer など自動翻訳などを利用してdata augmentationしてtrainする
  • Hindi - Tamil に特化したpre-trainedモデルが利用できる形でどこかに落ちてないか
  • 諦めてホストのtutorial notebookの軍門に下るか ⇒ issue#4



2021-09-15

inferenceをpipelineで実施していたが, torch-nativeな方法も試したい.

について実行した. 結果は以下の通り:

Notebook fine-tuning方式 inference時コンテキスト分割してるか inference方式 Public LB
kagglenb002-fine-tune torch-native(コンテキスト分割) No pipeline 0.002
kagglenb002-fine-tune torch-native(コンテキスト分割) No torch-native 0.005
l2knb001-fine-tune torch-native(コンテキスト分割) Yes pipeline Error
l2knb001-fine-tune torch-native(コンテキスト分割) Yes torch-native 0.005
kagglenb001-chaii-eda - No pipeline 0.010
kagglenb001-chaii-eda pipeline(コンテキストそのまま) -
trainしていたと思いきやしていなかった
No pipeline 0.005

kagglenb001-chaii-edaについては2回submitしているがいずれもfine-tuningしていないものである. にも関わらずLBが異なっているのはモデルのランダム性が起因しているものと思われる. (pre-trainedモデルをロードする度にoutput(answer span)が変化することは確認した.)


2021-10-05

It seems like the data is generated by a model. especially for Tamil where even the answer text and start index are incorrect. So, what are we actually learning here? what are we learning?

とのことで特にTamil語のtrainの教師ラベルはいい加減らしい. fine-tuningでTamil trainを除外してみようか.


2021-10-19

notebooks/chaii-qa-5-fold-xlmroberta-torch-fit.ipynbでfoldごとのvalid lossを確認. fold 5でvalid lossが0になっているのはなぜか.
inference notebookでfold 5の結果を使用しないsubmitをしてみる. -> LB: 0.783 _| ̄|○

--------------------------------------------------
FOLD: 1
--------------------------------------------------
----Validation Results Summary----
Epoch: [0] Valid Loss: 0.62316
0 Epoch, Best epoch was updated! Valid Loss: 0.62316

----Validation Results Summary----
Epoch: [1] Valid Loss: 0.71733


--------------------------------------------------
FOLD: 2
--------------------------------------------------
----Validation Results Summary----
Epoch: [0] Valid Loss: 0.57144
0 Epoch, Best epoch was updated! Valid Loss: 0.57144

----Validation Results Summary----
Epoch: [1] Valid Loss: 0.70074


--------------------------------------------------
FOLD: 3
--------------------------------------------------
----Validation Results Summary----
Epoch: [0] Valid Loss: 0.63953
0 Epoch, Best epoch was updated! Valid Loss: 0.63953

----Validation Results Summary----
Epoch: [1] Valid Loss: 0.77846


--------------------------------------------------
FOLD: 4
--------------------------------------------------
----Validation Results Summary----
Epoch: [0] Valid Loss: 0.62968
0 Epoch, Best epoch was updated! Valid Loss: 0.62968

----Validation Results Summary----
Epoch: [1] Valid Loss: 0.73707


--------------------------------------------------
FOLD: 5
--------------------------------------------------
----Validation Results Summary----
Epoch: [0] Valid Loss: 0.00000
0 Epoch, Best epoch was updated! Valid Loss: 0.00000

----Validation Results Summary----
Epoch: [1] Valid Loss: 0.00000

またepoch数は1で充分なのかもしれない. これももう一回やってみる? -> 0.772 _| ̄|○


2021-10-27

chaii-qa-5-fold-xmroberta-torch-fit.jpynbについて
fold 5のときvalid lossが0になる問題を解消するため,
max_seq_lengthとdoc_strideを変えて各foldごとのvalid lossを確認する作業に着手.

# max_seq_length = 32*13, doc_stride = 32*5
Fold 1 Valid Loss: 0.59709
Fold 2 Valid Loss: 0.56930
Fold 3 Valid Loss: 0.62795
Fold 4 Valid Loss: 0.62015
Fold 5 Valid Loss: 0.00000

# max_seq_length = 32*14, doc_stride = 32*6
Cuda out of memory

# max_seq_length = 32*14, doc_stride = 32*5
Cuda out of memory

# max_seq_length = 32*14, doc_stride = 32*4
Cuda out of memory

# max_seq_length = 32*14, doc_stride = 32*3
Cuda out of memory

# max_seq_length = 32*14, doc_stride = 32*2
Cuda out of memory

# max_seq_length = 32*14, doc_stride = 32*1
Cuda out of memory

# max_seq_length = 32*14, doc_stride = 32*0.5
Cuda out of memory

# max_seq_length = 32*13, doc_stride = 32*6
Fold 1 Valid Loss: 0.56667
Fold 2 Valid Loss: 0.54488
Fold 3 Valid Loss: 0.57748
Fold 4 Valid Loss: 0.58417
Fold 5 Valid Loss: 0.00000

2021-11-16

408/959という結果に終わった.
なんとsubmitしていたものの中に銅メダル圏内のもの(private LB: 0.738, public LB: 0.783)があったにも関わらずfinal submitに選ぶことができなかった. というのもdead lineの直前(日本時間11月16日午前8時台)にfinal submitをどれにするか考えようと決めていたにも関わらず, 仕事に没入してしまい気付いた時は午前9時30分を回っていたという体たらく.
9割がた諦めていたとはいえ, こういう経緯でこういう結果になると想像以上の悔しさがあるということが分かった.

3ヶ月という自分の時間の重みと初のsoloメダルを逃してしまった恨みは大きい. この失敗と反省は無駄にできない. Kaggleへの取り組み方が甘かったと言わざるを得ない. 最終週の土日もKaggleをしなかった. 直前までfinal submitにチェックを付けていなかった. なるようにしてなった結果だと言わざるを得ない. 食らいついてさえいれば銅メダルくらいはどんなコンペでも取れるだろうということも分かった以上, 生活を見直して自分をKaggleラインのライン作業員に仕立て上げなければならない. Kaggle Masterを今後2年以内に取得するための自分の誓約は以下の通りだ:

  • 休憩時間の活動を, 目を使わない活動と目を使う活動に二分する
  • 休憩時間に目を使う活動をする場合, その冒頭はどんな状態であっても必ずKaggleをやる. その後気が散って別のことをやり出すのは一向に構わない.
  • Kaggleをやる気がしない場合は, 休憩時間であっても目を使う活動はしない.
  • Colab Pro+ 契約する.

About


Languages

Language:Jupyter Notebook 100.0%