νλ‘μ νΈ κΈ°κ° : 2021.05.24 ~ 2021.06.15
νλ‘μ νΈ μ£Όμ : Deep Knowledge Tracing
- [Deep Knowledge Tracing μκ°]
- [Installation]
- [Usage]
- [File Structure]
- [Input CSV File]
- [Feature]
- [Contributors]
- [Collaborative Works]
- [Reference]
DKTλ Deep Knowledge Tracingμ μ½μλ‘ μ°λ¦¬μ "μ§μ μν"λ₯Ό μΆμ νλ λ₯λ¬λ λ°©λ²λ‘ μ λλ€.
λνμμλ νμ κ°κ°μΈμ μ΄ν΄λλ₯Ό κ°λ¦¬ν€λ μ§μ μνλ₯Ό μμΈ‘νλ μΌλ³΄λ€λ, μ£Όμ΄μ§ λ¬Έμ λ₯Ό λ§μΆμ§ νλ¦΄μ§ μμΈ‘νλ κ²μ μ§μ€ν©λλ€.
- torch
- pandas
- sklearn
- pycaret
- tqdm
- wandb
- easydict
- pytorch-tabnet
pip install -r requirements.txt
νμ΅μ νμν λ°μ΄ν°λ₯Ό λ§λ€κΈ° μν΄ λ κ°μ .py
νμΌμ μμ°¨μ μΌλ‘ μ€νν΄μΌ ν©λλ€.
$ p4-dkt-no_caffeine_no_gain# python make_elapsed.py
$ p4-dkt-no_caffeine_no_gain# python make_fixed_data.py
λͺ¨λΈμ νμ΅νκΈ° μν΄μλ train.py
λ₯Ό μ€νμν΅λλ€.
μλ Arguments μ μλ argument μ€ νμν argumet λ₯Ό λ°κΏ μ¬μ©νλ©΄ λ©λλ€.
$ p4-dkt-no_caffeine_no_gain# python train.py
μ΄ 7κ°μ§μ λͺ¨λΈμ μ νν μ μμ΅λλ€.
- TABNET
- LASTQUERY
- SAINT
- LGBM
- BERT
- LSTMATTN
- LSTM
νμ΅λ λͺ¨λΈλ‘ μΆλ‘ νκΈ° μν΄μλ inference.py
λ₯Ό μ€νμν΅λλ€.
νμν argument λ β-model_name
κ³Ό β-model_epoch
μ
λλ€.
$ p4-dkt-no_caffeine_no_gain# python inference.py --model_name "νμ΅ν λͺ¨λΈ ν΄λ μ΄λ¦" --model_epoch "μ¬μ©νκ³ ν λͺ¨λΈμ epoch"
train κ³Ό inference μμ νμν argument μ λλ€.
# Basic
--model: model type (default:'lstm')
--scheduler: scheduler type (default:'plateau')
--device: device to use (defualt:'cpu')
--data_dir: data directory (default:'/opt/ml/input/data/train_dataset')
--asset_dir: asset directory (default:'asset/')
--train_file_name: train file name (default:'add_FE_fixed_train.csv')
--valid_file_name: validation file name (default:'add_FE_fixed_valid.csv')
--test_file_name: test file name (default:'add_FE_fixed_test.csv')
--model_dir: model directory (default:'models/')
--num_workers: number of workers (default:1)
--output_dir: output directory (default:'output/')
--output_file: output file name (default:'output')
--model_name: model folder name (default:'')
--model_epoch: model epoch to use (default:1)
# Hyperparameters
--seed: random state (default:42)
--optimizer: optimizer type (default:'adamW')
--max_seq_len: max sequence length (default:20)
--hidden_dim: hidden dimension size (default:64)
--n_layers: number of layers (default:2)
--n_epochs: number of epochs (default:20)
--batch_size: batch size (default:64)
--lr: learning rate (default:1e-4)
--clip_grad: clip grad (default:10)
--patience: for early stopping (default:5)
--drop_out: drop out rate (default:0.2)
--dim_div: hidden dimension dividor in model to prevent too be large scale (default:3)
# Transformer
--n_heads: number of heads (default:2)
--is_decoder: use transformer decoder (default:True)
# TabNet
--tabnet_pretrain: Using TabNet pretrain (default:False)
--use_test_to_train: to training includes test data (default:False)
--tabnet_scheduler: TabNet scheduler (default:'steplr')
--tabnet_optimizer: TabNet optimizer (default:'adam')
--tabnet_lr: TabNet learning rate (default:2e-2)
--tabnet_batchsize: TabNet batchsize (default:16384)
--tabnet_n_step: TabNet n step(not log step) (default:5)
--tabnet_gamma: TabNet gamma (default:1.7)
--tabnet_mask_type: TabNet mask type (default:'saprsemax')
--tabnet_virtual_batchsize: TabNet virtual batchsize (default:256)
--tabnet_pretraining_ratio: TabNet pretraining ratio (default:0.8)
# Sliding Window
--window: Using Sliding Window augmentation (default:False)
--shuffle: shuffle Sliding Window (default:False)
--stride: Sliding Window stride (default:20)
--shuffle_n: Shuffle times (default:1)
# T-Fixup
--Tfixup: Using T-Fixup (default:False)
--layer_norm: T-Fixup with layer norm (default:False)
# Pseudo Labeling
--use_pseudo: Using Pseudo Labeling (default:False)
--pseudo_label_file: file path for Pseudo Labeling (default:'')
# log
--log_steps: print log per n steps (default:50)
# wandb
--use_wandb: if you want to use wandb (default:True)
μ 체μ μΈ File Structure μ λλ€.
code
βββ README.md
βββ .gitignore
βββ args.py
βββ make_custom_data
β βββ make_elapsed.py - time κ΄λ ¨ feature μμ±
β βββ make_fixed_data.py - user μ λ΅λ₯ κΈ°λ°μΌλ‘ valid μμ±
β βββ make_original_fixed_data.py - shuffleν΄μ valid μμ±
β
βββ dkt
β βββ criterion.py
β βββ dataloader.py
β βββ metric.py
β βββ model.py
β βββ optimizer.py
β βββ scheduler.py
β βββ trainer.py
β βββ utils.py
βββ ensemble.py
βββ inference.py
βββ requirements.txt - dependencies
βββ train.py
-
sequence dataλ₯Ό λ€λ£¨κΈ° μν LSTM λͺ¨λΈμ λλ€.
-
ꡬν
model.py βββ class LSTM β βββ init() βββ βββ forward() : return predicts args.py βββ args.max_seq_len(default : 20) βββ args.n_layers(default : 2) βββ args.n_heads(default : 2) βββ args.hidden_dim(default : 64)
-
LSTM λͺ¨λΈμ Self-Attentionμ μΆκ°ν λͺ¨λΈμ λλ€.
-
ꡬν
model.py βββ class LSTMATTN β βββ init() βββ βββ forward() : return predicts args.py βββ args.max_seq_len(default : 20) βββ args.n_layers(default : 2) βββ args.n_heads(default : 2) βββ args.hidden_dim(default : 64)
-
Huggingface
μμ BERT ꡬ쑰λ₯Ό κ°μ Έμμ μ¬μ©ν©λλ€. λ€λ§, pre-trained λͺ¨λΈμ΄ μλκΈ° λλ¬Έμ Transformer-encoder μ κ°μ΅λλ€. -
νμ¬ λͺ¨λΈμμλ bert_config μ is_decoder λ₯Ό True λ‘ μ£Όμ΄ Transformer-decoder λ‘ μ¬μ©νκ³ μμ΅λλ€.
-
ꡬν
model.py βββ class Bert β βββ init() βββ βββ forward() : return predicts args.py βββ args.max_seq_len(default : 20) βββ args.n_layers(default : 2) βββ args.n_heads(default : 2) βββ args.is_decoder(default : True) βββ args.hidden_dim(default : 64)
-
tabular dataμμ μ’μ μ±λ₯μ 보μ΄λ Machine Learning λͺ¨λΈμ λλ€.
-
ꡬν
model.py βββ class LGBM β βββ init() βββ βββ fit() : return trained model
-
Kaggle Riiid AIEd Challenge 2020μ Hostκ° μ μν solution μ λλ€.
-
Transformerμ λΉμ·ν ꡬ쑰μ λͺ¨λΈλ‘ Encoderμ Decoderλ₯Ό κ°μ§κ³ μμ΅λλ€.
-
μΈμ½λλ feature μλ² λ© μ€νΈλ¦Όμ self-attention λ μ΄μ΄λ₯Ό μ μ©νκ³ λμ½λμμ self-attention λ μ΄μ΄μ μΈμ½λ-λμ½λ attention λ μ΄μ΄λ₯Ό μλ΅ μλ² λ©κ³Ό μΈμ½λμ μΆλ ₯ μ€νΈλ¦Όμ λ²κ°μ μ μ©νλ ꡬ쑰μ λλ€.
-
Paper Review : [Saint λͺ¨λΈ λΆμ]
-
ꡬν
model.py βββ class Saint β βββ init() βββ βββ forward() : return predicts args.py βββ args.max_seq_len(default : 20) βββ args.n_layers(default : 2) βββ args.n_heads(default : 2) βββ args.hidden_dim(default : 64)
-
Kaggle Riiid AIEd Challenge 2020μ 1st place solutionμ λλ€.
-
transformer encoderμ μ λ ₯μΌλ‘ sequenceμ λ§μ§λ§ queryλ§ μ¬μ©νμ¬ μκ°λ³΅μ‘λλ₯Ό μ€μ΄κ³ , encoderμ outputμ LSTMμ λ£μ΄ νμ΅νλ λ°©μμ λͺ¨λΈμ λλ€.
-
Paper Review : [Last Query Transformer RNN for knowledge tracing 리뷰]
-
ꡬν
model.py βββ class LastQuery β βββ init() βββ βββ forward() : return predicts args.py βββ args.max_seq_len(default : 20) βββ args.n_layers(default : 2) βββ args.n_heads(default : 2) βββ args.hidden_dim(default : 64) βββ args.Tfixup(default : False)
-
tabular dataμμ MLλͺ¨λΈλ³΄λ€ λ μ°μν μ±λ₯μ 보μ΄λ Deep-learning modelμ λλ€.
-
dataμμ Sparse instance-wise feature selectionμ μ¬μ©νμ¬ μ체μ μΌλ‘ μ€μν feature μ λ³ν΄λΈ ν νμ΅νλ λ°©μμ μ¬μ©νλ©°, feature μ λ³μ non-linearν processingμ μ¬μ©νμ¬ learning capacityλ₯Ό ν₯μμν΅λλ€.
-
Sequentialν multi-step architectureλ₯Ό κ°μ§κ³ μμΌλ©°, feature maskingμΌλ‘ Unsupervised νμ΅λ κ°λ₯ν©λλ€.
-
Paper Review : [Tabnet λ Όλ¬Έ 리뷰]
-
ꡬν
model.py βββ class TabNet β βββ TabNetPreTrainer β βββ TabNetClassifier β βββ get_scheduler() β βββ get_optimizer() βββ βββ forward() : return models trainer.py βββ tabnet_run(args, train_data, valid_data) βββ get_tabnet_model(args) βββ tabnet_inference(args, test_data) train.py βββ tabnet_run() args.py βββ args.tabnet_pretrain(default : False) βββ args.use_test_to_train(default : False) βββ args.tabnet_scheduler(default:'steplr') βββ args.tabnet_optimizer(default:'adam') βββ args.tabnet_lr(default:2e-2) βββ args.tabnet_batchsize(default:16384) βββ args.tabnet_n_step(default:5) βββ args.tabnet_gamma(default:1.7) βββ args.tabnet_mask_type(default:'saprsemax') βββ args.tabnet_virtual_batchsize(default:256) βββ args.tabnet_pretraining_ratio(default:0.8)
λ°μ΄ν°λ μλμ κ°μ ννμ΄λ©°, ν νμ ν μ¬μ©μκ° ν λ¬Ένμ νμμ λμ μ 보μ κ·Έ λ¬Ένμ λ§μ·λμ§μ λν μ λ³΄κ° λ΄κ²¨μ Έ μμ΅λλ€. λ°μ΄ν°λ λͺ¨λ Timestamp κΈ°μ€μΌλ‘ μ λ ¬λμ΄ μμ΅λλ€.
userID
μ¬μ©μμ κ³ μ λ²νΈμ λλ€. μ΄ 7,442λͺ μ κ³ μ μ¬μ©μκ° μμΌλ©°, train/testμ μ μ΄userID
λ₯Ό κΈ°μ€μΌλ‘ 90/10μ λΉμ¨λ‘ λλμ΄μ‘μ΅λλ€.assessmentItemID
λ¬Ένμ κ³ μ λ²νΈμ λλ€. μ΄ 9,454κ°μ κ³ μ λ¬Ένμ΄ μμ΅λλ€.testId
μνμ§μ κ³ μ λ²νΈμ λλ€. λ¬Ένκ³Ό μνμ§μ κ΄κ³λ μλ κ·Έλ¦Όμ μ°Έκ³ νμ¬ μ΄ν΄νμλ©΄ λ©λλ€. μ΄ 1,537κ°μ κ³ μ ν μνμ§κ° μμ΅λλ€.
answerCode
μ¬μ©μκ° ν΄λΉ λ¬Ένμ λ§μ·λμ§ μ¬λΆμ λν μ΄μ§ λ°μ΄ν°μ΄λ©° 0μ μ¬μ©μκ° ν΄λΉ λ¬Ένμ νλ¦° κ², 1μ μ¬μ©μκ° ν΄λΉ λ¬Ένμ λ§μΆ κ²μ λλ€.Timestamp
μ¬μ©μκ° ν΄λΉλ¬Ένμ νκΈ° μμν μμ μ λ°μ΄ν°μ λλ€.KnowledgeTag
λ¬Έν λΉ νλμ© λ°°μ λλ νκ·Έλ‘, μΌμ’ μ μ€λΆλ₯ μν μ ν©λλ€. νκ·Έ μ체μ μ 보λ λΉμλ³ν λμ΄μμ§λ§, λ¬Ένμ κ΅°μ§ννλλ° μ¬μ©ν μ μμ΅λλ€. 912κ°μ κ³ μ νκ·Έκ° μ‘΄μ¬ν©λλ€.
elapsed: μ μ κ° λ¬Έμ λ₯Ό νΈλλ°μ μμν μκ°
time_bin: λ¬Έμ λ₯Ό νΌ μκ°λ(μμΉ¨, μ μ¬, μ λ
, μλ²½)
classification: λλΆλ₯(νλ
)
paperNum: μνμ§ λ²νΈ
problemNum: λ¬Έμ λ²νΈ
user_total_acc: μ μ μ μ΄ μ λ΅λ₯
test_acc: κ° μνμ§μ νκ· μ λ΅λ₯
assessment_acc: κ° λ¬Έμ μ νκ· μ λ΅λ₯
tag_acc: κ° νκ·Έμ νκ· μ λ΅λ₯
total_used_time: μ μ κ° νλμ μνμ§λ₯Ό λ€ νΈλλ°μ μμν μκ°
past_correct: μ μ λ³ κ³Όκ±° λ§μΆ λ¬Έμ μ μ
past_content_count: μ μ -λ¬Έμ λ³ κ³Όκ±°μ λμΌ λ¬Έμ λ₯Ό λ§λ νμ
correct_per_hour: μκ°(hours)λ³ μ λ΅λ₯
same_tag: λμΌ νκ·Έλ₯Ό μ°μμΌλ‘ νμλμ§ μ 무(T/F)
cont_tag: μ°μμΌλ‘ νΌ λμΌ νκ·Έ κ°μ(0~)
etc...
- μ ν¬μ (Heeseok-Jeong)
- μ΄μ λ (Anna-Lee)
- μ΄μ°½μ° (changwoomon)
- μμ μ§ (dkswndms4782)
- μ μ¬μ° (JAEWOOSUN)
Gitflow λΈλμΉ μ λ΅
β 92κ°μ Commits, 26κ°μ Pull Requests
Github issues & projects λ‘ μΌμ κ΄λ¦¬
β 28κ°μ Issues
β Modeling Project μμ κ΄λ¦¬
Notion μ€νλ ΈνΈλ‘ μ€ν 곡μ
β 39κ°μ μ€νλ
ΈνΈ
Notion μ μΆκΈ°λ‘μΌλ‘ μ μΆ λ΄μ 곡μ
β 155κ°μ μ μΆκΈ°λ‘
νΌμ΄λ€μ Ground Rule
, μ€νλ
ΈνΈ
, νΌμ΄μΈμ
λ± νλ¬ κ°μ ν보λ₯Ό νμΈνμλ €λ©΄ λ€μ λ§ν¬λ₯Ό ν΄λ¦νμΈμ.
- Deep Knowledge Tracing (Piech et al., arXiv 2015)
- Last Query Transformer RNN for Knowledge Tracing (Jeon, S., arXiv 2021)
- Towards an Appropriate Query, Key, and Value Computation for Knowledge Tracing (Choi et al., arXiv 2021)
- How to Fine-Tune BERT for Text Classification? (Sun et al., arXiv 2020)
- Improving Transformer Optimization Through Better Initialization (Huang et al., ICML 2020)
- i-Scream edu Dataset