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 |
commitSHA | comment | Local CV | Private LB | Public LB |
---|
[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したもの.
作成した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部分を除外したもの |
# 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)
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タスクにおいて答えのみが与えられ, 導出論理は与えられない状況を弱教師あり学習だとして, 間違った導出論理のもとたまたま正解するようなモデルの誕生を回避する手法を提案. こちらも上位チームが参考にしようとしたが実装できたわけではない. |
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 | - |
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両者の例がシンプルにまとまっている |
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] としてやる必要あり |
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を使った実験管理方法が参考になりそう |
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 を使用していることがこちらで確認できる |
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を必要としないほど柔軟性がありそう. |
name | url | status | comment |
---|---|---|---|
xlm roberta squad2 | URL | Done | deepset/xlm-roberta-large-squad2をダウンロードしたもの |
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によるアンサンブルを採用. |
コンペ参加.
kagglenb001-chaii-edaを作成.
kagglenb001-chaii-edaによるsubmit完了.
localnb002-fine-tuneのpreprocessingコードがようやくひと段落し, train開始.
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
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 | trainしていたと思いきやしていなかった |
No | pipeline | 0.005 |
kagglenb001-chaii-edaについては2回submitしているがいずれもfine-tuningしていないものである. にも関わらずLBが異なっているのはモデルのランダム性が起因しているものと思われる. (pre-trainedモデルをロードする度にoutput(answer span)が変化することは確認した.)
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を除外してみようか.
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 _| ̄|○
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
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+ 契約する.