ํ๋ก์ ํธ ๊ธฐ๊ฐ : 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