사용된 스킬 셋: PyTorch, NumPy, Pandas, Matplotlib, re, Scikit-learn, xgboost, Mecab
- 알라딘 중고도서 가격 예측 프로젝트 [1]에서 정가 column을 학습 데이터에서 제외하면 성능이 급격히 낮아진 것에 착안
- 데이터 셋에 포함된 도서 정보 중, 도서명이 중요한 독립변수 중 하나이므로 자연어 문장의 의미를 파악하는 것이 중요하리라 예상
- Attention을 이용한 Transformer[2]는 자연어 처리에서 맥락적 의미를 수치화하는데 특출난 성능과 연산속도를 보여 인공지능사에 한 획을 그은 모델
- 알라딘 중고도서 가격 예측 프로젝트[1]에서 구축한 데이터 셋을 이용해, 도서 정보로 정가를 예측하는 회귀 모델 개발
- Attention 기반 모델을 PyTorch를 이용해 설계 및 학습 진행
- Attention 및 Transformer에 대해 학습하는 차원에서 Pytorch를 이용해 직접 구현
- 기타 모델과 여러 성능 지표 및 실험을 통하여 Attention 기반 모델의 성능을 적절히 평가
- Random Forest Regressor, XGBoost 등의 Machine learning 모델 및 Multilayer Perceptron 모델과 성능 비교
2. 데이터 셋 [1]
- 알라딘의 주간 베스트셀러 페이지에서 제공한 1~1000위에 대한 xls 파일 데이터를 이용하여 구성
- 2000년 1월 1주차 ~ 2024년 7월 2주차까지의 데이터를 포괄하며, 24-07-10 ~ 24-07-12에 수집 진행
- 총 158,084 종의 도서에 대한 정보로 구성되어 있음
도표.1 알라딘 주간 베스트셀러 페이지 예시
- 총 1,415,586개의 row와 랭킹, 구분, 도서 명, ItemId, ISBN13, 부가기호, 저자, 출판사, 출판일, 정가, 판매가, 마일리지, 세일즈 포인트, 카테고리, 날짜 12개의 column
- 구분 : 국내도서, 외국도서 등으로 구분되어 있음
- ItemId : 알라딘에서 부여한 해당 도서의 id. 숫자로만 구성
- 새 책 기준의 id 값이 기재됐고, 한정판, 개정판 등의 경우도 별도의 id가 부여 됨
- raw data에는 도서 외에도, 당시 베스트셀러였던 MD 굿즈, 강연 등도 포함되어 있음
- 총 158,084 종의 도서에 대한 정보로 구성되어 있음
- 날짜, 랭킹 : 해당 도서가 어떤 주차의 주간 베스트셀러 목록에 몇 위로 올랐는지
- 하나의 도서가 다양한 주 차에서 다양한 랭킹의 베스트셀러로 등장
- ISBN13, 부가기호 : ISBN13은 전세계에서 공통적으로 사용하는 도서에 대한 id. 발행자 등의 정보가 포함되어 있음. 부가기호는 한국 문헌 보호 센터에서 부여하는 번호로, 예상 독자층에 대한 정보 등이 포함 되어 있음
- 카테고리 : 도서가 어떤 장르에 속하는지에 대한 정보. 외국어, 종교, 사회과학, 건강/취미 등 총 24개 유형으로 분류
- 세일즈 포인트
- 판매량과 판매기간에 근거하여 해당 상품의 판매도를 산출한 알라딘만의 판매지수이며, 매일 업데이트 됨
- 날짜 및 랭킹을 제외하고, 판매가, 세일즈 포인트 등은 크롤링 시점에서의 값이 저장됨
도표.2 알라딘 주간 베스트 셀러
목표: 저자, 출판사, 출판일, 제목 등의 값을 이용하여 도서의 정가를 예측
-
종속 변수를 제외한 항목 중에서 총 7개의 독립변수 선정
- BName_sub (도서명에서 괄호 안의 내용), Author_mul (저자 등이 여러 명으로 표기되었는지 여부) 등 파생 항목 포함. 해당 내용은 전처리 파트에서 후술
종속 변수 독립 변수 RglPrice BName, BName_sub, Author, Author_mul, Publshr, Pdate, Category 도표.3 모델의 종속 변수 및 독립 변수
- sklearn을 이용하여 train 64%, validation 16%, test 20% 비율로 분리
- train : 주간 베스트셀러 순위에 오른적 있는 도서에 대한 데이터 101,173건
- valid : 주간 베스트셀러 순위에 오른적 있는 도서에 대한 데이터 25,294건
- test : 주간 베스트셀러 순위에 오른적 있는 도서에 대한 데이터 31,617건
- Transformer의 encoder를 응용하여 도서 정가 예측에 효과적인 모델 설계
- Random Forest Regressor, XGBoost 등의 Machine learning 모델 및 단순한 Multilayer Perceptron 모델과 성능 비교
- RMSE, MAPE, R2 Score 등의 회귀 평가 지표를 사용하여 성능을 각 모델 별로 분석
- 모델의 hyperparameter에 따른 성능의 차이 확인
- 결측치 처리
- 저자 명, 구분, 출판사, 카테고리 등에 결측치가 있는 행의 개수 1,214개
- 실제 도서도 있지만, MD 굿즈, 강연등 도서가 아닌 데이터 다수 존재
- 저자 명, 구분, 출판사, 카테고리 등에 결측치가 있는 행의 개수 1,214개
- 중복 도서 처리 : 베스트 셀러 목록에 여러 번 오른 도서는 하나의 행만 남김
- 도서 명
- 한자 처리
- hanja을 이용해 한자를 한글로 변환. 한글 독음이 이미 있는 경우 중복되지 않게 처리
- 숫자 처리
- 숫자 사이 구분자 "," 정리 : ex) "1,000" -> "1000"
- 로마 숫자를 아랍 숫자로 변환
- 연도 표기 정리 : "`00"의 형태로 표기된 년도를 정리
- ex) "`98 ~ `07 기출문제 모음" -> "1998 ~ 2007 기출문제 모음"
- 특수한 unicode로 기입된 문자를 흔히 쓰이는 특수문자로 변환
- "&#"가 들어가는 token들이 있는지 확인 후 별도 처리
- ex) "세 명의 삶 \ Q. E. D." -> "세 명의 삶 \ Q. E. D."
- 괄호속 내용 추출 후 BName_sub column에 정리
- ex) "전지적 루이 &후이 시점(양장본)" -> "(양장본)"만 BName_sub에 분리
- 한자 처리
- 저자 명
- 여러 명이 제작자로 기재된 경우, 맨 앞의 제작자만 남김
- 여러 명이 기재되어 있었는지 여부를 Author_mul에 bool형태로 기록
- ex) "김려원 글 김이후 그림" -> "김려원 글", True
- 여러 명이 기재되어 있었는지 여부를 Author_mul에 bool형태로 기록
- 이름 뒤에 붙은 기타 문자열 처리
- 역할에 대한 단어 : "글", "시", "역", "지음", "평역" 등 총 72가지
- 다수의 사람이 참여했다는 의미의 단어
- ex) "외 13인", "외 5명", "외"
- 여러 명이 제작자로 기재된 경우, 맨 앞의 제작자만 남김
- 출간일 : DateTime 타입으로 파싱
- ItemId, 정가, 판매가 : 정수 형태로 변환
-
validation 및 test set의 데이터가 전처리에 영향을 주지 않도록 주의하여 진행
- train set을 전처리 하면서 결정된 함수 및 관련 내용들을 validation 및 test set에 일괄적으로 적용
-
Mecab을 사용해 Category, BName,BName_sub 컬럼을 토큰화
-
도서 명(BName, BName_sub)과 카테고리는 하나의 corpus로 통합하여 정수 인코딩
- 줄글의 일부가 아닌 책 제목이므로, train set의 해당 열에 포함 된 최대한 모든 토큰을 데이터 셋에 포함
-
출판사, 판매 지점, 저자 명에 대해서는 빈도 수 혹은 SalesPoint를 고려한 인기를 반영하여 정수 인코딩
-
날짜 관련 데이터 정수형으로 인코딩
-
단어 corpus 관련 열이 아닌 열에 대해 MinMaxScaling 진행
- 도서 명(BName, BName_sub)과 카테고리는 이후 Embedding model에 학습시켜야 하므로 정수형 데이터를 가져야 함
- 그 외의 열에 대해서는 attention layer를 적용하지 않기로 결정하여 scaling 진행
도표.4 전처리, 스케일링 후 최종 데이터 예시
-
INPUT : (batch_size, 64)
$\rightarrow$ OUTPUT : (batch_size, 1) -
self attention layer 기반의 encoder(이하 attention based encoder)에 multilayer perceptron (이하 MLP) layer들을 연장한 모델
- self attention layer는 행렬곱 및 내적의 연장이기 때문에, 병렬계산이 가능하고 parameter 수가 같다면 MLP에 비해 연산이 빠름
- attention layer를 적극적으로 이용한 Transformer[2]는 문장에서 맥락을 수치화하여 파악하는데 효과적인 성능을 보이고 있음
- 이번 과제도 단어가 나열됐을 때 형성되는 맥락과 관련되어 있다 이해할 수 있기 때문에, encoder-only Transformer 모델이 효과적일 수 있을 것이라 예상
-
attention based encoder 내부에 Transformer에서 사용된 encoder submodule을 N=6층 쌓고, 3층의 MLP를 연장
-
attention based encoder : (batch_size, 60)
$\rightarrow$ (batch_size, d_model , 60)-
Transformer의 encoder submodule을 응용해서 단어가 나열된 부분의 문맥 정보를 수치화 하기 위한 의도
-
PyTorch로 Transformer를 layer 레벨부터 구현한 코드[3]를 참고하여 구현
-
corpus에 대한 정수 encoding이 사용된 [0,60] 번째에 해당하는 tensor를 입력받음
- 모델 입력 중 Category, BName, BName_sub 정보를 사용
-
dropout은 encoder submodule의 multi-head self attention layer, feed-forward network layer에 각각 적용됨
-
세부 내용
명칭 입력 형태 설명 embedding model (batch_size, 60) vocab_size 크기의 corpus를 기반으로 한 모델로, d_model 차원의 tenseor에 대응 encoder submodule (batch_size, d_model , 60) multi-head self attention layer, feed forward layer로 이뤄졌고, N 번 반복됨 도표.5 encoder module의 구성
도표.6. a. attention based encoder module, b. scaled dot-product attention, c. multi-head attention [2]
명칭 입력 형태 설명 positional encoding (batch_size, d_model, 60) 삼각함수 이용 multi-head
self attention layer(batch_size, d_model, 60) d_k, d_k, d_v 에 맞는 구조의 scaled dot-product attention이 head 개 add & norm (batch_size, d_model , 60),
(batch_size, d_model , 60)add residual & normalize feed forward layer1 (batch_size, d_model , 60) ReLU가 적용 된 linear layer feed forward layer2 (batch_size, d_model , d_ff) linear layer add & norm (batch_size, d_model , 60),
(batch_size, d_model , 60)add residual & normalize 도표.7 encoder submodule의 구성
d_model vocab_size N head d_k d_v d_ff dropout 60 32050 6 6 10 10 128 0.1 도표.8 encoder submodule 관련 hyperparameter 값
-
-
MLP module : (batch_size, d_model , 60), (batch_size, 4)
$\rightarrow$ (batch_size, 1)-
encoder module의 출력과 corpus와 무관한 feature들을 종합하여 model output 예측
- 해당 feature : Author, Author_mul, Publshr, Pdate
-
concat layer의 output 형태를 (batch_size, d_mlp)라 하면, d_mlp = d_model * 60 + 4
-
활성화 함수, dropout : 각각 ReLU, 0.1 적용
-
세부 내용
입력 형태 설명 (batch_size, d_model , 60), (batch_size, 4) attention based encoder의 output과 model input 중 정수 encoding이 되지 않은 정보를 concat (d_mlp, d_mlp // 2) 활성화 함수 및 dropout이 적용된 linear layer (d_mlp // 2, d_mlp // 2) 활성화 함수 및 dropout이 적용된 linear layer (d_mlp // 2, 1) model output으로 연결되는 linear layer 도표.9 MLP submodule의 layer별 설명
-
-
모델 성능은 RMSE, MAPE,
$R^2$ Score 등을 활용하여 평가 -
두 가지 방법으로 평가 진행
- test 1 : 전체 데이터에 대해서 평가
-
test 2 : 정가가 60,000원 이하인 데이터에 대해서 평가
- 정가 60,000원 이하인 데이터가 99.484%
- Train, Valid, Test 각각 99.481%, 99.541%, 99.450%
-
attention based encoder 모델 및 학습에서의 hyperparameter를 변경하며 학습 성능 평가
-
batch size : 512, 8192, 16384에 대해 실험 진행
-
learning rate : batch size에 맞게 초기 learning rate를 정한 뒤 학습 상황에 따라 감소시켜 적용
-
초기 learning rate를 제외한 학습 hyperparameter는 동일하게 적용
factor adam_eps patience warmup 0.95 5e-7 10 3 epoch clip weight_decay dropout 500 1.0 5e-20 0.1 도표.10 model 학습 hyperparameter
-
-
모델 성능의 평가를 위해 XGBoost, Random Forest Regressor 모델, 간단한 MLP모델과 성능 비교
- Expt.1 : batch_size = 512
-
init_lr :
-
best_epoch :
-
학습 결과
RMSE MAPE R2 SCORE 도표. batch_size = 512 일 때 모델 성능
도표. batch_size = 512 일 때 참 값과 예측 값 사이 산포도
도표. batch_size = 512, 정가 60,000원 이하 일때 참 값에 따른 예측값의 histogram
도표. batch_size = 512, 정가 60,000원 이하 일때 참 값에 따른 절대 오차의 histogram
도표. batch_size = 512, 정가 60,000원 이하 일때 참 값에 따른 상대 오차의 histogram
-
-
동일한 방식으로 전처리한 데이터를 이용하여 회귀 예측 모델 설계
-
Random Forest Regressor (이하 RFR) : 기본 hyperparameter로 진행
-
성능
test1 Train Valid Test RMSE 3175.18 8179.46 9079.71 MAPE 0.106272 0.298254 0.301357 R2_SCORE 0.916681 0.373757 0.376662 도표. 전체 데이터에 대한 RFR model 성능
test2 Train Valid Test RMSE 2215.93 6188.06 6078.94 MAPE 0.105727 0.29688 0.299907 R2_SCORE 0.926039 0.418558 0.444744 도표. 정가 60,000 이하 데이터에 대한 RFR model 성능
-
-
XGBoost Regressor (이하 XGB)
-
독립변수가 동일한 알라딘 중고도서 가격 예측[1]의 Expt.4에서 가장 성능이 좋았던 hyperparameter로 진행
num_boost_round learning_rate max_depth 2500 0.3 6 min_child_weight colsample_bytree subsample 4 1 1 도표. XGBoost 관련 hyperparameter
-
성능
test1 Train Valid Test RMSE 8083.08 8429.75 9544.35 MAPE 0.351907 0.36065 0.366424 R2_SCORE 0.460038 0.334845 0.311233 도표. 전체 데이터에 대한 XGBoost model 성능
test2 Train Valid Test RMSE 5947.53 6333.92 6321.06 MAPE 0.350769 0.359319 0.36484 R2_SCORE 0.467198 0.390825 0.399632 도표. 정가 60,000 이하 데이터에 대한 XGBoost model 성능
-
-
MLP Regressor
-
5개 층으로 구성하여 학습 진행, 활성화 함수는 ReLU
-
세부 사항
입력 출력 비고 64 256 256 32 batch norm과 dropout을 적용 32 32 batch norm과 dropout을 적용 32 8 batch norm과 dropout을 적용 8 1 output 출력 도표. MLP model의 각 layer별 입력 및 출력 tensor의 차원
init_lr factor adam_eps patience warmup 0.015 0.999995 5e-7 15 3 epoch clip weight_decay dropout 700 1.0 5e-9 0.1 도표. MLP model 학습 hyperparameter
-
학습 결과
test1 Train Valid Test RMSE 8638.70 8893.68 10034.56 MAPE 0.37203 0.38830 0.39802 R2 SCORE 0.38263 0.26371 0.23795 도표. 전체 데이터에 대한 MLP model 성능
-
Encoder-only Transformer | RFR | XGB | MLP | |
---|---|---|---|---|
RMSE | 9079.71 | 9544.35 | 10034.56 | |
MAPE | 0.30136 | 0.36642 | 0.39802 | |
R2 SCORE | 0.37666 | 0.31123 | 0.23795 |
도표. 각 실험 별 best model과 성능
- 안녕
- 간단한 Machine-learning 모델과 multilayer perceptron으로는 충분한 성능이 나오지 않음
- 정가가 outlier에 해당하는 데이터를 학습에서 제외했을 때 성능이 개선되는지 확인 필요
- 도서 정가가 보통 1000원 단위로 결정되고, 100원 단위 미만으로는 대부분 값이 비어있는 특징을 encoder based model 학습에는 반영하지 못했음
- parameter 양자화를 하면, 학습 및 추론 속도도 향상될 수 있음
- 정가 예측에 큰 도움을 줄 수 있는 추가적인 정보(제본 형태, 쪽수 등)를 데이터셋에 추가하지 않고 학습 진행
- Attention을 이용한 다양한 모델, 특히 attention layer로만 구성된 모델을 이용한 학습을 시도해보지 못함
- 행렬 계산을 이용한 Transformer 모델이 연산속도 측면에서 갖는 장점을 충분히 활용했는지 평가 필요
- d_model의 값이 커도 모델의 step 당 연산 속도에 큰 영향을 주지 않는 것이 연산 속도 측면에서 큰 장점
- d_model의 값이 크면 parameter의 개수가 많아지므로, 원활한 학습에 필요한 데이터 양, step 등이 커질 수 있음
- 따라서 d_model의 값을 설정할 때 한계가 있는 상황인데, 데이터 셋을 확장하는 등 d_model을 늘려도 괜찮을 수 있는 조사를 하지 않음
- 저자명, 출판사를 인코딩 중 기타 항목으로 처리할 때 threshold 기준의 구체적인 근거를 제시하지 못 함
- 추가적인 조사를 통해 더 객관적이고 제시 가능한 근거 확립 가능
- 출간 연도 등으로 stratify하여 학습할 때 성능을 높히는 것이 가능한지 확인
- d_model, d_ff, head, N 등의 모델 구조 관련 hyperparameter를 변경했을 때 성능이 어떻게 달라지는지 확인
- Attention layer만을 이용한 모델 개발 및 성능 비교
- 단어 corpus를 다른 열의 내용에 대하여도 확장하거나, 다른 embedding model로 vector화 된 정보들이 섞여있을 경우 학습에 주의 할 점 조사
- 데이터를 보강하여 학습에 수월한 질 좋은 데이터셋 구성
- 도서 정보 페이지에 정보 중, 도서 정가에 직접적인 영향을 주는 다른 정보(제본형태, 쪽수 등)를 추가적으로 크롤링
- 베스트 셀러에 포함된 적 없는 도서도 대상으로 하기 위한 크롤링 방법 개발 필요
- 위의 모델 외에도 다양한 모델 개발 가능
- 카테고리와 도서 명, 출판사, 정가 등의 정보로 출간 연도 예측
- 도서 정보 및 중고 시장에서의 가격을 바탕으로 알라딘의 SalesPoint 산정법 추정
- OLPJ24 : Doeun Oh, Junseong Lee, Yerim Park, and Hongseop Jeong, 알라딘 중고 도서 데이터셋 구축 및 그에 기반한 중고 서적 가격 예측 모델, GitHub, 2024
- VSPU17: Vaswani, Ashish and Shazeer, Noam and Parmar, Niki and Uszkoreit, Jakob and Jones, Llion and Gomez, Aidan N and Kaiser, Lukasz and Polosukhin, Illia, Attention is All you Need, Advances in Neural Information Processing Systems, 30, 2017
- K19: hyunwoongko, transformer, GitHub, 2019