conda env create -f enviroment.yml
conda activate nlp-aicup
data/length
: 存放 id 對 q、r Token 長度的映射表data/multi_target
: 存放 Multi-Target 資料集data/span
: 存放 Span 資料集data/splitted
: 存放切分的 Train、Val、Test 資料集data/full.csv
: 官方提供的訓練資料data/submission.csv
: 官方提供的測試資料
處理腳本
scripts/split_dataset.py
: 分割原始資料集scripts/generate_span_dataset.py
: 由原始資料集生成 Span 資料集scripts/generate_mutli_target_dataset.py
: 由原始資料集生成 Multi-Target 資料集
提供訓練腳本來演示各模型架構的訓練
- 分離式 + Token Classification:
train_siamese_token_classification.py
- 分離式 + Span Prediction:
train_siamese_span_prediction.py
- 分離式 + Span Prediction + LSTM:
train_siamese_span_prediction_with_lstm.py
- 合併式 + Token Classification:
train_token_classification.py
- 合併式 + Span Prediction:
train_span_prediction.py
提供 Jupyter Notebook 來演示各個模型架構進行預測的具體流程
- 分離式 + Span Prediction:
notebooks/predict_span_prediction_model.ipynb
- 分離式 + Token Classification + LSTM:
notebooks/predict_siamese_span_prediction_model_with_lstm.ipynb
- 分離式 + Token Classification:
notebooks/predict_siamese_token_classification_model.ipynb
- 合併式 + Span Prediction:
notebooks/predict_span_prediction_model.ipynb
- 合併式 + Token Classification:
notebooks/predict_token_classification_model.ipynb
Span Prediction 模型在預測時可以調整以下參數
- top_k: 考慮機率最大的 K 個 Span
- max_tokens: 每個 Span 最多可以包含幾個 Token
Answer 格式: 型態為 Dict,格式如下所示,用來表示一筆資料的答案(q'、r')
{
'id': '...',
'q': '...',
'r': '...'
}
此模組實現官方提供的計分公式,用來初步評估模型效能
Function | Input | Output |
---|---|---|
compute_score |
輸入一個 List,內容為 Answer | 輸出評分 |
compute_csv |
輸入一個 CSV 檔案路徑,格式同官方規定 | 輸出評分 |
Class | Description | Input File |
---|---|---|
RawDataset |
用來讀取原始資料集 | data/full.csv data/splitted/*.csv |
PredictionDataset |
預測時使用此資料集進行讀取及前處理 | data/full.csv data/splitted/*.csv |
SpanDataset |
用來讀取 Span 資料集及前處理 | data/span/*.jsonl |
MultiTargetDataset |
用來讀取 Multi-Target 資料集及前處理 | data/multi_target/*.jsonl |
上表所列的 Class 僅供合併式的模型使用,而分離式的模型需使用後綴為 ForSiamese
的 Class,如:分離式 + TokenClassification 的模型需使用 MultiTargetDatasetForSiamese
進行訓練,並使用 PredictionDatasetForSiamese
進行預測
Class | Description | Dataset Class For Training | Dataset Class For Predicting |
---|---|---|---|
SpanPredictionModel |
合併式 + Span Prediction | SpanDataset |
PredictionDataset |
SiameseSpanPredictionModel |
分離式 + Span Prediction | SpanDatasetForSiamese |
PredictionDatasetForSiamese |
SiameseSpanPredictionModelWithLSTM |
分離式 + Span Prediction + LSTM | SpanDatasetForSiamese |
PredictionDatasetForSiamese |
TokenClassificationModel |
合併式 + Token Classification | MultiTargetDataset |
PredictionDataset |
SiameseTokenClassificationModel |
分離式 + Token Classification | MultiTargetDatasetForSiamese |
PredictionDatasetForSiamese |
Function | Description |
---|---|
write_answers |
輸出官方規定上傳格式的檔案 |
select_starts_ends |
Span Prediction 的後處理函數之一,只先對 Logits 做初步處理,主要邏輯在 decode_spans 和 nms |
decode_spans |
Span Prediction 的後處理函數之一,計算 Span 機率,並過濾無效的 Span |
nms |
Span Prediction 的後處理函數之一,對 decode_spans 的結果進行 NMS 處理 |
indices_to_spans |
將連續的 index 轉為 Span,用於 Token Classification 的後處理函數 |
Model Type | Epoch | Public Score | Private Score | URL |
---|---|---|---|---|
分離式 + Span Prediction + LSTM | 1 (full) | 0.836781 | 0.898072 | Download |
合併式 + Span Prediction | 1 (full) | 0.845039 | 0.895501 | Download |
分離式 + Span Prediction | 2 (full) | 0.842063 | 0.890389 | 因遭誤刪,無法提供此權重 |
分離式 + Span Prediction | 1 (full) | 0.836294 | 0.887342 | Download |
分離式 + Token Classification | 2 (train) | x | x | Download |
合併式 + Token Classification | 2 (train) | x | x | Download |
- 為節省儲存空間,在進行實驗時我們會定期清理一些權重,因此部分權重並沒有保留下來。上表所提供的部分權重可能並非當初保留下來,而是由後來進行重新訓練得到,所以部分權重的實際分數可能與上表所示不同
- 建議將下載好的權重存放至
weights
資料夾,演示預測流程的 Jupyer Notebook 預設會從此資料夾載入權重