Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

About design of recommendation feature, and things to decide while implementing it. #56

Open
jangdonghae opened this issue Nov 20, 2019 · 8 comments
Labels
help wanted Extra attention is needed ML/DL

Comments

@jangdonghae
Copy link
Contributor

지금 Recommendation feature을 일단 local에서 구현 중입니다. 현재 content-based와 collaborative filtering을 대략적으로 구현한 상태이고, 둘을 합친 hybrid model도 design한 상태입니다.
Backend가 아직 구현되지 않았기 때문에 간단한 데이터를 만들거나, 유사한 데이터셋을 이용해서 테스팅 중인데, 몇 가지 정해야 하는 것이 생겼습니다.

0. design

일단 현재 구상 중인 design은 content-based로 계산된 유사도, collaborative filtering에서 계산된 점수, block의 distribution에서 계산된 유사도, 이 세가지를 이용해서 추천을 하는 것입니다.
Content-based의 경우 현재 사용하느 universal-sentence encoder가 문장에 대해서는 어느 정도 잘 작동하는 것을 확인하였습니다. 또한 location에 대해서도 큰 도시나 나라에 대해서는 적절한 유사도를 보여주는 것을 확인하였습니다.
Collaborative filtering의 경우 implicit feedback을 이용한 방법을 채택하였습니다. Explicit feedback은 영화 평점과 같이 user의 평가가 점수로 환산되어지는 경우입니다. 하지만 Implicit feedback의 경우 그 plan을 보거나, comment를 다는 행위, 등 user의 행동만을 관찰할 수 있는 경우입니다. 해당 plan을 봤다고 해서 해당 plan을 마음에 들어한다는 보장이 없기 때문에 이를 반영한 모델링을 해줬습니다. 이 모델의 경우 view, like, commenting 등의 행위에 대해서 가중치를 줄 수 있기 때문에 더욱 좋을 것 같습니다.
block의 distribution의 경우, 해당 plan의 block distribution이 비슷한 경우 해당 여행의 성향이 비슷하다고 판단하여 반영하기로 하였습니다.
Design에 대해서 의견이 있으시면 댓글로 달아주세요!

1. Data update

일단 content-based의 경우 plan안에 있는 내용이 바뀔 때마다 embedding vector를 새로 계산해서 저장해야 합니다. embedding vector를 계산하는 것이 오래걸리지는 않지만 모델 로딩에 필요한 overhead가 상당 부분 차지합니다. 따라서 plan의 내용이 바뀔 때마다 바로바로 계산하는 것이 가능할지 모르겠고, 상당히 비효율적일 것 같습니다.
그래서 data update를 반영하여 embedding vector를 계산하는 것을 1시간에 한 번씩, 같이 적당한 주기를 가지고 하는 것에 대해 생각하고 있는데 의견 있으시면 답글 달아주시면 감사합니다.
또한 현재 작성중인 plan에 대해서도 추천을 해주는 것이 맞는지에 대한 의견도 궁금합니다!

2. model update

collaborative filtering의 경우 model update를 해줘야 하는데, model update 또한 시간이 걸리기 때문에, 1시간에 한번이나 하루에 한 번 update하는 것에 대해서 어떻게 생각하는지 궁금합니다.

3. recommendation time period

사용자에게 추천을 함에 있어서 1년전이나 2년전에 본 plan과 유사한 plan을 추천하는 것이 의미있는지 잘 모르겠습니다. 그 때 당시와 지금의 사용자가 필요한 것이 많이 다를 것 같다고 생각되서, 최근 한달 동안 본 plan을 대상으로만 추천을 해준다거나 하는 것이 더 좋을 것 같은데 이에 대해서 어떻게 생각하는지 궁금합니다.

4. Where does we calculate?

이건 제가 잘 몰라서 그런데, 시간이 다소 걸릴 수 있지만, 바로 계산해야할 필요는 없는 model update 같은 경우 어디서 진행해야하는지 잘 모르겠습니다. 따로 서버를 하나 더 파는 걸 까요?

@jangdonghae jangdonghae added help wanted Extra attention is needed ML/DL labels Nov 20, 2019
@jang1suh
Copy link
Contributor

수고 많으셨습니다! 어느정도 잘 작동한다니 다행이네요. 제가 이쪽을 잘 알지는 못해서 당장 생각나는 것만 몇 가지 말씀 드리자면,

  1. Data update / model update의 경우 사용자가 plan 내용을 수정하고 저장할 때 업데이트가 필요한 것으로 보이는데, 백엔드에 수정 내용이 반영되는 시점을 언제로 하느냐를 먼저 정해야 할 것 같습니다.(정했는데 제가 기억을 못하는 거일 수도 있어요...) 일정 시간마다 자동 저장되도록 하면 너무 부하가 많이 걸리니까 일정 시간마다 (변경된 데이터에 대해서만) 업데이트 해 주는 편이 좋을 것 같고, 사용자가 comfirm 버튼을 눌렀을 때만 반영되도록 하면 그때그때 반영해 줘도 괜찮을 것 같아요. 다만 어느 방법을 사용하든 새로운 plan에 대해 추천 plan이 아예 없는 경우가 생기면 곤란하니까 처음 plan이 만들어질 때 계산해 주는 것은 필요할 것 같습니다.

  2. 작성중인 plan과 완성된 plan에 대한 구분이 아직까진 딱히 없어서, 일단 추천은 똑같이 구현해 주는 게 맞는 것 같습니다.

  3. 저희가 plan의 visibility를 private와 public으로 구분하는데, private plan의 경우 추천 대상에서 제외하는 것도 고려해야 할 것 같습니다. 나만 볼 수 있는 plan에 관련된 추천 plan을 보여줄지도 정해야 할 것 같은데, 유저가 관심이 있으면 검색하도록 하는 편이 나을 수도 있어서 private plan은 아예 추천 시스템에서 빼는 것도 고려할 수 있을 것 같습니다. 이 경우 private -> public으로 설정이 변경되는 순간 해당 plan에 대해 embedding vector 등이 계산되도록 해야할 것 같습니다.

  4. Collaborative Filtering이 어떤 plan의 detail page에서 그 plan과 비슷한 다른 plan을 찾아주는 하나의 방법으로만 쓰이는지, 어떤 유저에 대해 그 유저가 좋아할 만한 다른 plan을 추천해 주는 데에도 쓰이는지 알려주시면 이해하기 좋을 것 같습니다. 후자의 경우처럼 쓰이는 것도 생각하셨다면 main page에서 Recommended 리스트도 만들면 어떨까 싶어서요!

@deploy-soon
Copy link
Contributor

지금 이슈가

  1. 모델은 언제 update 해야 하는가?
  2. 기존 계획을 만족하는 모델은 어떻게 디자인되어 있어야 하는가?
  3. 모델은 물리적으로 어느 곳에 존재해야하는가?

인것 같은데요

제 생각 모델은 update하는 부분은 모델이 만들어지고 나서 생각해도 될 것 같습니다. 매번 모델을 학습하고 수정해서 서비스해도 좋겠지만 다른 급한 문제가 많아 이를 먼저 해결하는 것이 좋을 것 같습니다..
1년전이나 2년전에 본 plan과 유사한 plan을 추천하는 것이 무의미한 것 같다고 하셨는데 이부분도 모델 결과만 나온다면 필터링해도 되는 문제라 굳이 학습단계에서 신경쓸 부분은 아니라고 생각합니다.

모델이 만들어지면 inference할 공간이 필요할 것 같은데 모델이 작으면 백엔드 서버에 두고 바로 inference해도 좋고 아니라면 개인 azure 서버에 두고 따로 백엔드 서버를 만드는 것도 좋을 것 같네요.

그리고 모델이 어느정도 디자인되었다고 하셨는데 혹시 작동까지 모두 되는건지 궁금합니다. 최대한 robust하게 만들고 적용한뒤 차차 수정하는 방향으로 개발하면 좋을 것 같습니다.

@jangdonghae
Copy link
Contributor Author

@rxwe

  1. 좋은 의견 감사드립니다. 하지만 confirm버튼 누를 때마다 새로 계산하는 것도 부하가 좀 있을 것 같긴한데 그건 나중에 고려해도 될 것 같네요!
  2. 넵 알겠습니다
  3. 좋은 의견입니다. 그런데 저희 처음 plan 생성하면 default가 private인가요?
  4. 성능이 괜찮다면 main page에도 만드는 것이 가능할 것 같아요

@jangdonghae
Copy link
Contributor Author

@deploy-soon
나중에 고려해야 한다는 의견도 맞는 것 같습니다. 모델마다 모델 성능이랑 사용하는 데이터양, 등등의 trade off가 있기 때문에 고려하고 있었는데, 일단 완성을 먼저 목표로 설정하겠습니다.
모델의 경우 구현은 대략 했는데, 테스팅을 외부의 데이터로 해본 거라서 작동되게 만든는건 backend가 만들어지고 해볼 계획입니다!

@deploy-soon
Copy link
Contributor

혹시 지금 cf cb 앙상블 모델을 개발하고 계신가요 아니면 cb만 하고 계신건가요?

@jang1suh
Copy link
Contributor

jang1suh commented Nov 22, 2019

좋은 의견입니다. 그런데 저희 처음 plan 생성하면 default가 private인가요?

처음 생성하면 private로 되고 사용자가 설정할 때 public으로 바뀌게 될 것 같아요!

@jangdonghae

@jangdonghae
Copy link
Contributor Author

@deploy-soon
지금 일단 둘다 만들고 있습니다. CF는 모델 자체는 많이 어렵진 않은데, training 데이터가 필요해서 어떻게 만들지 고민 중입니다.

@jangdonghae
Copy link
Contributor Author

@rxwe
넵 알겠습니다!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
help wanted Extra attention is needed ML/DL
Projects
None yet
Development

No branches or pull requests

3 participants