seohyunchoi123 / ML-DL-Paper-Implementation

Have studied and implemented ML, DL paper
0 stars 0 forks source link

NCF, ONCF 구현 및 테스트 이슈사항 #2

Open seohyunchoi123 opened 5 years ago

seohyunchoi123 commented 5 years ago

선택한 논문

  1. Neural Collaborative Filtering (NCF)
  2. Outer Product-based Neural Collaborative Filtering (ONCF)
  3. Joint Deep Modeling of Users and Items Using Review for Recommendation

1, 2번을 우선으로 구현하고 ALS와 성능비교를 하고자 합니다. 3번은 시간이 남는대로 할 예정입니다. (학습 데이터: 브런치 8d mm 데이터)

선택 이유

논문 소개

1. Neural Collaborative Filtering (NCF)

seohyunchoi123 commented 5 years ago

첫 번째 기록, 8/5(월) ~ 8/9(금)

한 일들

  1. Neural Collaborative Filtering 논문 공부
  2. 위 논문 코드 구현 및 디버깅

이슈 사항

1. 코드의 연산 속도가 매우 느림

디버깅 과정에서 Negative Sampling의 연산 속도가 매우 느림을 발견했다. 한 유저당 소비하지 않은 아이템 중 일부를 추출하는 과정이다. 유저마다 소비하지 않은 아이템이 약 40만개이기에 샘플링 시간이 오래 걸리는 것으로 추측하고 있다. 이중 루프를 최소화하여 10,000번 루프 당 약 1분 55초까지 연산 시간을 줄였다. 단순히 샘플링함수 한 줄만 넣어도 10,000번 루프 당 약 1분 15초 정도가 걸림을 볼 때 연산 시간을 획기적으로 줄이기는 어려워보인다. 총 8백만 번의 루프를 돌아야하기에 약 27시간 정도 소요될 예정이다. 내일까지 돌려놓고 다시 확인해보고자 한다.

조치 사항

  • 08/12, 위 연산 속도를 10,000번 루프당 0.15초까지 줄였다. np.random.randint 함수로 미리 난수를 생성해놓음으로써 샘플링과 똑같은 결과를 내면서 연산 속도는 약 500배 개선하였다. 문제 해결!

앞으로 할 일들

  1. 디버깅을 마저 완료하고 ALS와 성능을 비교해볼 것이다.
  2. 논문에서 제시한 하이퍼파라미터는 우리 카카오의 데이터에는 최적화되어있지 않으므로 적절한 값을 찾아내는 작업도 진행할 예정이다.
  3. 위 과정들이 마무리되는대로 두 번째 논문 구현을 시작하고자 한다.
seohyunchoi123 commented 5 years ago

두 번째 기록, 8/12(월) ~ 8/16(금)

한 일들

  1. Negative Sampling의 연산 속도를 500배 개선하여 위 이슈 해결
  2. NCF 구현 및 디버깅 완료
  3. NCF 학습
  4. ONCF 구현 및 디버깅

이슈 사항

1. 게시글을 하나만 본 유저의 경우 트레인셋, 테스트셋을 나누기가 애매함

논문에서느 테스트셋은 각 유저마다 가장 최근에 본 게시글이고 그 이전까지 본 게시글들을 트레인셋으로 쓴다. 하지만 현재 사용중인 브런치 데이터는 게시글을 딱 하나만 본 유저가 3,903,781명 중에서 1,963,135명이다.

조치 사항

  • 08/12, 일단 위 경우는 트레인셋에 넣기로 했다. 테스트셋에 넣는다면 학습도 안한 경우를 테스트해야하는 역설적인 상황이 일어나기 때문이다.
  • 08/13, 트레인셋에서도 아예 빼기로 했다. 테스트하지도 못하는 케이스를 굳이 학습할 필요가 없다고 판단했다. 또 다른 이유로는 학습 시간을 줄이기 위함이다. 이로써 유저를 나타내는 원핫벡터의 크기가 거의 반으로 줄었고(3,903,781명 > 1,963,135명) 한 에폭의 학습 예정 시간이 2시간 30분으로 기존보다 약 3배 개선됐다. ->2번 이슈를 해결하는 데 큰 도움이 되었음

2. 학습시간이 너무 오래 걸림

모든 트레인데이터를 한 번씩 학습하는데(한 에폭) 걸리는 예정 시간이 약 9시간이다..

조치 사항

  • 08/12, 기존에 1024였던 배치사이즈를 1500까지 올렸다. 약 7.5시간까지 줄였다. 더 올리고싶지만 2048을 시도했을때는 ResourceExhausted Error가 떴다.
  • 08/13, 위 1번 이슈에서 제시한 대로 게시글 하나만 소비한 유저를 트레인셋에서도 아예 빼기로 했다. 이로써 유저를 나타내는 원핫벡터의 크기가 거의 반으로 줄였다. 한 에폭의 학습 예상 시간이 약 2시간 30분으로 3배 더 줄었다. (이슈 1번의 조치 사항임)
  • 08/13, 원핫벡터 크기 줄면서 배치 사이즈를 2048까지 올릴 수 있게 됐다. 이 결과, 한 에폭의 학습 예상 시간이 2시간 20분으로 줄었다.
  • 08/14, 서버가 자꾸 튕긴다. gpu 과다 사용이 원인이 아닐까 생각하여 배치사이즈를 512로 줄여보았다. 근데 놀랍게도 512로 줄였을 때 학습 예상 시간이 1시간 40분으로 더 줄어들었다.
  • 08/22, 벨의 피드백으로 유저, 아이템 id 임베딩을 원핫인코딩 없이 하는 방법을 알게 되었다. 학습 예상 시간이 4분으로 줄어들었다. -> 결과적으로 처음보다 속도를 약 130배 개선, 속도 문제 해결 & 서버가 튕기는 문제는 nohup 명령어로 해결하였음

앞으로 할 일들

  1. NCF 학습 마저 완료하고 테스트
  2. ONCF 디버깅 완료 후 학습 및 테스트
  3. ALS 테스트
  4. 여유가 된다면 BPR도 ALS와 함께 대조군으로 포함시켜보자
seohyunchoi123 commented 5 years ago

세 번째 기록, 8/19(월) ~ 8/23(금)

한 일들

  1. ONCF 구현 및 디버깅 완료

  2. NCF, ONCF 학습 및 테스트 & ALS, BPR의 테스트 결과와 비교 (바로 아래에 결과 서술해놓았습니다)

<테스트셋 데이터>

총 1,940,646명의 유저에 대한 데이터이고, 각 유저마다 정답 1개를 포함한 51개의 후보군으로 구성돼있음

<실험한 파라미터>

NCF - 레이어 층 수

선정 이유: 모델의 핵심인 Non-Linearity 특성을 좌지우지하는 파라미터이기 때문이다. 실제로 논문에 따르면 레이어 층 수에 따라 모델의 성능이 크게 바뀌었다. 이런 이유로 논문에서도 이를 주요 실험 대상군으로 놓고 여러 실험을 진행했다.

ONCF - Regularization Coefficient (로스 함수 내 정규항의 계수)

선정 이유: 논문에 따르면 이 계수는 모델의 성능을 좌지우지하는 굉장히 중요한 변수이다. 실제로 내가 직접 실험을 해볼 때도 이 계수를 0으로 주면 심각한 오버피팅이 일어났고 0.001로 줬을 때는 모델의 웨이트들이 모두 0이 되버렸다. 그래서 다양한 값을 주면서 실험해볼 필요가 있다고 생각했다.

<테스트 결과 >

image

<결과 분석 및 추가실험 계획>

이슈 사항

1. ONCF를 학습하던 도중에 6번째 에폭부터는 HR, NDCG의 결과값이 계속 0이 나왔다

분석 결과 정규화의 영향으로 가중치가 모두 0에 수렴해버린 것이 원인이었다. ONCF는 로스함수에 가중치 정규화항을 추가한다. Regularization Coefficient는 약 0.001을 쓴다. 하지만 현재 실험중인 브런치데이터는 논문에서 사용한 데이터보다 약 200배가 더 많기에 0.001을 그대로 써서는 안 되는 것이다. 데이터 수가 많은 만큼 iteration의 수가 많고 정규화도 자주 일어나기 때문이다.

조치 사항

  • 08/20, 어쩔 수 없이 Regularization Coefficient를 논문에서 제시한 값보다 약 100~1000배 낮춰서 다시 실험했다. 문제가 해결되었다.

앞으로 할 일들

  1. 위와 같은 실험을 cafe-1d 데이터로도 똑같이 진행하기
seohyunchoi123 commented 5 years ago

네 번째 기록, 결과 총 정리 (8/28)

실험 테스트 결과

학습 환경 - 브런치 8d)

ALS: D=20, iter=10, num_proc=4, alpha=128.0,reg_u=1.0, reg_i=1.0 BPR: D= 50, iter = 100, num_proc=12, reg_b = 0.01, reg_u = 0.01, reg_i = 0.01, reg_j = 0.01, decay = 0.95 (D가 50이상부터 성능이 비슷하다는 율의 이전 실험결과를 참고하여 D=50으로 설정. 나머지는 모두 기존 세팅 그대로 유지) NCF: Embedding size = 16, iter = 10, optimizer = Adam, lr = 1e-05 (6번째 에폭부터 1e-06) ONCF: Embedding size = 64, iter = 10, optimizer = Adagrad, lr = 5e-02

학습 환경 - 카페 1d)

ALS: D=40, iter=10, num_proc=8, alpha=8.0,reg_u=8.0, reg_i=8.0 BPR: D= 50, iter = 100, num_proc=12, reg_b = 0.01, reg_u = 0.01, reg_i = 0.01, reg_j = 0.01, decay = 0.95 (D가 50이상부터 성능이 비슷하다는 율의 이전 실험결과를 참고하여 D=50으로 설정. 나머지는 모두 기존 세팅 그대로 유지) NCF: Embedding size = 16, iter = 10, optimizer = Adam, lr = 1e-05 (6번째 에폭부터 1e-06) ONCF: Embedding size = 64, iter = 10, optimizer = Adagrad, lr = 5e-02

실험 환경 )

실험 데이터: 브런치 8d(전처리 후 총 유저수 1,940,636명), 카페 1d(전처리 후 총 유저수 809,416명) 테스트셋 구성: 각 유저마다 정답 아이템 1개를 포함한 총 51개의 후보군 아이템 생성 (위와 동일)

1. 브런치 8d 실험 결과 (HR, NDCG 순)

image

image

2. 카페 1d 실험 결과 (HR, NDCG 순)

image

image

도출된 결론

" MLP(Multi-Layer Perceptron)구조의 뉴럴네트워크를 이용하면 단순한 내적연산보다 더욱 의미 있는 Collaborative Filtering이 가능하다 "

근거)

  1. 선형 내적과 뉴럴 네트워크가 앙상블로 합쳐진 구조인 Neural Collaborative Filtering 모델은 선형 내적뿐인 ALS보다 더 높은 성능을 보인다.
  2. Neural Collaborative Filtering 모델에서 레이어를 추가할수록 성능이 높아지는 경향을 볼 수 있다.
  3. 뉴럴네트워크 중에서도 ONCF의 CNN은 성능이 좋지 않았던 반면에 NCF의 MLP는 가장 높은 성능을 보이고 있다.

향후 과제들

  1. NCF와 ALS 간의 격차가 브런치 데이터에서는 컸는데 카페 데이터에서는 작아진 이유를 밝혀내기
  2. NCF에 더욱더 많은 레이어 쌓아서 실험해보기
  3. K-FOLD를 통해 실험 결과의 신뢰도 더욱 높이기
  4. ONCF의 Regularization Coefficient를 더욱 다양하게 실험해보기