Problemă #286
Autor:Mihai Nan
Dificultate
Maximul tău
N/A
O redacție utilizează un model automat pentru clasificarea articolelor. Modelul inițial a fost antrenat pe două subiecte:
| Etichetă | Subiect | Rol |
|---|---|---|
0 | World | clasă veche |
1 | Sports | clasă veche |
Ulterior, redacția adaugă două subiecte noi:
| Etichetă | Subiect | Rol |
|---|---|---|
2 | Business | clasă nouă |
3 | Sci/Tech | clasă nouă |
Pentru rezolvarea acestei probleme, primiți modelul rezultat după prima fază și date etichetate numai pentru clasele noi. Exemplele utilizate la antrenarea inițială nu sunt disponibile.
Scopul este adaptarea modelului la noile clase fără pierderea excesivă a cunoștințelor despre clasele vechi. Fenomenul prin care un model uită sarcinile anterioare după antrenarea pe date noi se numește catastrophic forgetting.
Pachetul public conține:
pretrained_model/ state.pkl meta.json MODEL_CARD.mddata_public/ phase2_train.csv phase2_val.csv sample_test.csv sample_prediction_format.csv labels.jsonstarter_submission/ solution.py common.py README.mdDirectorul pretrained_model/ conține checkpoint-ul obligatoriu de pornire. Modelul este un clasificator liniar cu softmax peste o reprezentare textuală cu feature hashing.
Fișierul state.pkl conține:
| Câmp | Descriere |
|---|---|
W, b | parametrii modelului după Phase 1 |
theta_W, theta_b | copia parametrilor de referință Phase 1 |
fisher_W, fisher_b | aproximația diagonală a informației Fisher |
Descrierea exactă a reprezentării și dimensiunile tuturor tensorilor se găsesc în pretrained_model/meta.json și pretrained_model/MODEL_CARD.md.
Participanții pot folosi sau ignora statisticile auxiliare, dar evaluatorul apelează întotdeauna adapt pornind de la checkpoint-ul oferit. Nu este permisă înlocuirea checkpoint-ului înaintea acestui apel.
Fișierele phase2_train.csv și phase2_val.csv conțin numai clasele 2 și 3.
| Fișier | Număr de exemple | Etichete |
|---|---|---|
phase2_train.csv | 2000 | 2, 3 |
phase2_val.csv | 400 | 2, 3 |
Formatul este:
| Coloană | Descriere |
|---|---|
datapointID | identificator unic |
subtaskID | pentru această problemă este 1 |
text | titlul și descrierea articolului |
answer | eticheta corectă |
Exemplu:
datapointID,subtaskID,text,answertrain_00003,1,"Exemplu de articol din domeniul economic...",2sample_test.csv este oferit exclusiv pentru verificarea interfeței. Nu este setul folosit la clasament.
Trebuie încărcată o arhivă ZIP. În rădăcina arhivei trebuie să existe obligatoriu:
solution.pyPot fi incluse și alte fișiere sau directoare auxiliare. Spre exemplu, poate avea următorul conținut arhiva:
solution.pycommon.pysrc/ model.pyNu este acceptată structura:
submission/ solution.pypentru că solution.py nu se află direct în rădăcina arhivei.
Arhiva trebuie să aibă cel mult 50 MB, cel mult 500 de fișiere, iar conținutul dezarhivat trebuie să aibă cel mult 100 MB.
Fișierul solution.py trebuie să definească exact următoarele funcții.
def adapt(phase2_train_csv: str, pretrained_model_dir: str, output_dir: str, seed: int) -> str: ...Argumentele sunt:
| Argument | Descriere |
|---|---|
phase2_train_csv | calea către datele etichetate Phase 2 |
pretrained_model_dir | calea read-only către checkpoint-ul Phase 1 |
output_dir | director gol în care trebuie salvat modelul adaptat |
seed | seed-ul impus de evaluator |
Funcția trebuie să returneze calea către un fișier JSON aflat în output_dir.
Manifestul trebuie să aibă forma:
{ "format_version": 1, "model_files": ["state.pkl", "meta.json"]}Toate fișierele modelului final trebuie enumerate în model_files. Modelul rezultat poate avea cel mult 100 MB și cel mult 500 de fișiere.
def predict(test_csv: str, model_dir: str) -> pandas.DataFrame: ...test_csv conține coloanele:
datapointID,subtaskID,textFuncția trebuie să returneze un pandas.DataFrame cu exact coloanele, în această ordine:
datapointID,subtaskID,answerPentru fiecare articol, answer trebuie să fie una dintre valorile:
0123DataFrame-ul trebuie să conțină exact identificatorii primiți în fișierul de test, fără duplicate, lipsuri sau valori suplimentare.
adapt(phase2_train_csv, pretrained_model_dir, output_dir, seed) și predict(test_csv, model_dir).
Evaluatorul problemei primește direct arhiva ZIP și execută automat ambele funcții obligatorii. Participantul nu trebuie să trimită separat un fișier CSV cu predicții.
Evaluatorul apelează:
adapt( phase2_train_csv=..., pretrained_model_dir=..., output_dir=..., seed=20260712,)Evaluatorul apelează:
predict(test_csv=..., model_dir=...)DataFrame-ul returnat este validat și punctat automat.
Setul ascuns conține 1200 de articole, echilibrate între cele patru clase.
Se calculează:
F_old: macro-F1 pentru clasele 0 și 1;F_new: macro-F1 pentru clasele 2 și 3.Metrica finală este media armonică:
metric = 2 * F_old * F_new / (F_old + F_new)Dacă F_old = 0 sau F_new = 0, atunci:
metric = 0Această metrică penalizează o soluție care învață bine clasele noi, dar uită complet clasele vechi.
Punctajul se calculează astfel:
score = 0, dacă metric ≤ 0.50score = 100, dacă metric ≥ 0.66score = 100 × (metric - 0.50) / 0.16, în rest