일지/네부캠 AI 4기(22.09.19~23.02.14)

20221220화-movie7, 3강, 오프라인

제로타이 2022. 12. 21. 00:37

(3강) Collaborative Filtering (1)

메모리 기반cf,모델 기반 cf, cf에 대한 논의

메모리 기반 협업 필터링

유저나 아이템 간의 유사도에 기반한 추천. 유사도를 위한 다양한 지표가 존재한다.

자카드, 코사인, 피어슨. 이전에 배운 적 있으니 이런 갑다 하고 넘어가겠다.

기본 아이디어는 간단하다. 유저가 아이템에 부여할 평점? 유사한 유저나 아이템에 부여된 기반으로 추정할 수 있을 것이다.

그러한 아이디어에서 나오는 식. 유사도를 구하고 그것을 가중치 삼아서 평점을 구한다.

아마존에서 사용한 아이템-아이템 협필. 코사인 유사도를 사용하였다. 해당 아이템과 유사하게 같이 사지고는 했던 아이템 추천. 오프라인에서 테이블을 완성하고, 온라인에서는 룩업만 했다. 

모델 기반 협업 필터링

모델을 통해! 기본적으로 저차원의 표현을 학습한다고 볼 수 있다. MF에서는 latent factor, 딥러닝으로 가면 임베딩 층. 명시적인 피쳐를 주지 않더라도 알아서 잘 학습한다!(그렇다고 명시적으로 주면 안 된다는 것을 뜻하지는 않는다)

1~3은 역사를 좋아하고, 5~7은 로맨스를 좋아하는 유저. R을 분해해서 보면 그러한 역사나 로맨스라는 잘 드러나지 않던, latent factor가 보이게 된다. 즉 잠재 정보가 발견된다는 것이다. 상호작용을 해석하는 것만으로.
이러한 잠재요인을 찾는 모델은 비단 추천시스템에서만 쓰이는 것은 아니다. LDA(디리클레 머시기)도 MF의 노말라이즈된 버전이라고 생각해볼 수 있다. 

넷플릭스에서 제시한 대회에서 MF를 사용하고 본격적으로 MF가 추천에 들어왔다.

당시 대회에서는 시간 요소가 굉장이 유의미했다고 한다. 특정 시점부터 평점이 오른다던가. 

암시적 피드벡 데이터. 유저의 선호를 완벽히 나타내지는 못하지만, 어느 정도 추정하는데 도움을 준다. 사실 명시적 데이터보다 더 좋을 수도 있다. 왜냐하면 평점을 매길 때 사용자가 한번 더 고민을 하기도 하고, 평점을 매기는 사람과 안 매기는 사람 간의 성향 차이가 드러나지 않을 수도 있기 때문이다.
명시적 데이터는 양도 적고, 편향도 존재하기 마련이다.

이봐라. 관측 데이터에 대한 평점 분포와 비관측 데이터에 대해나 평점 분포 차이가 발생하기도 한다. 그에 비해 암시적 데이터는 간접적이나 오히려 솔직한 정보를 얻는데 도움을 주기도 한다. 더불어 추천을 하는 테스크는 사실 그 사람이 소비할 아이템을 추천하는 것이기도 한데, 이것은 암시적 데이터와 맞아떨어지는 측면도 있다. 

보다 풍부한 데이터, 추천 테스크와의 적합성, 비즈니스 목표와의 직접적인 연관성 등으로 암시적 데이터가 요즘 핫하다. 

rmse로 평점을 잘 예측하는 게 정말 좋은 추천에 도움이 되기는 하는가? 해리포터 시리즈 하나에 좋은 평점 내린 거 보고 다른 해리포터 시리즈에 대해서도 그럴 거라 생각하고 추천해주는 게 좋은 추천인가? 이미 다 봤을 수 있잖나? 다양성이나 새로운 컨텐츠의 발견에 도움이 안 된다!

협업 필터링에 대한 심층 논의

위에서 본 두 큰 분류 간의 비교. 

CF는 일종의 결측값 채우기 작업이다. 행렬 완성 문제! 대신 엄청 큰 희소율을 보일 뿐. 

그래서 어떻게 보면 전통적인 회귀, 분류 문제의 일반화 케이스로 바라볼 수도 있다.

왼쪽이 분류 문제. 색칠된 부분이 y 데이터, 맞춰야 하는 부분이다. 협업 필터링은 오른쪽의 문제를 해결하고 있는 꼴이다. 
또한 학습셋과 테스트의 구분이 모호하다. 맞춰야 하는 부분이 군데군데 있듯, 그 구분도 군데군데 들어가게 된다. 
이런 맥락에서 일반화된 케이스라고 볼 수 있다는 것.

CF에서는 콜드 스타트에 매우 취약하다. 갑자기 한 행을 추가하거나 하는 일로 인해 가지게 되는 연산도 많거니와 채울 영역이 너무나도 늘어나게 된다. 

유저로부터 자유로운 모델 접근도 있다. user-free. 
유저로부터 자유로우면 무엇이 좋은가? 콜드스타트 유저(새로 오거나, 이력이 거의 없음)에 대해서도 추천을 해줄 수 있다. 또한 시퀀스 시나리오를 고려할 수 있다!
이런 이유에서 조금 더 실용적일 수 있다. 

이런 식으로 선형회귀 문제를 가진다. 유저가 소비한 모든 아이템에 대해 가중치를 따진다. 이것은 마치 메모리 기반에서의 유사도를 구하는 것과 비슷한 작업이다. 

이러한 모델의 종류.

SLIM - Sparse Linear Methods for Top-N Recommender System

위에서 본 선형 회귀에 규제항을 추가한다. 그리고 몇가지 제약 조건을 걸었다. 일단 유사도 계산의 편의성을 위해 값이 음수면 안되고, 자기 자신에 대한 추천을 하는 것을 막기 위해 아예 0으로 설정해버린다. 

이제 W만 제대로 학습이 된다면, 앞에 어떤 유저가 와도 추천을 해줄 수 있게 된다. 정확히는 한번이라도 유저가 소비한 정보가 있기는 해야 한다. 아무튼 모델과 메모리 기반 협업 필터링이 결합한 형태.

FISM - Factored Item Similarity Model

유저가 소비한 아이템을 보면서 각 아이템을 순회할 때 그 아이템을 제외한 다른 아이템 간의 관계를 고려하는 모델이다.

CF 아니더라도 유저로부터 자유로운 모델들.

오프라인

오늘 다들 참석하지는 못해서 계획했던 베이스라인 해부와 CS를 진행하지 못했다. 베이스라인은 지금 내가 거의 코드 분석이 다 된 상황이라 다른 사람들한테 조금이라도 도움을 주고 싶은데 아쉽네. 
다른 인원들은 VAE에 꽂혀 있었는데, 나도 최대한 참여하려 했으나 일단 내용이 통계 관련이라 너무나도 어려워서 기본 지식이 없으니 알아듣기가 쉽지 않았다. 그리고 이미 두 명이 최대한 열심히 달라붙어 있는 상황이라 나까지 할 필요는 없다는 생각이 들었다. 
그렇다면 내가 해야 할 것이 무엇인가? 강의에서 나오는 다른 모델 써보기! 그리고 검증셋 만들기. 

저번 대회 마지막 미션에서도 등장했고, 2강에서도 추천된 라이브러리 중 하나인 recbole. 저번에도 라이브러리가 많이 들어있다는 것을 확인하기도 했던지라 한번 이걸 파보기로 했다. recbole이 좋은 점이 무엇인가 하면, 파이토치로 구현이 돼있어서 내부 모델을 내가 눈으로 확인할 수 있다는 것이었다. 그리고 간단하게 많은 모델들을 확인할 수 있다는 것도 장점! 다만 recbole이 요구하는 방식의 데이터셋을 만들고, 설정파일을 만들어야 해서 조금은 진입장벽이 있는 편이다. 아직 완벽히 파악은 끝나지 않아서 조금 더 파봐야할 것으로 보인다.

결국 OOM 문제가 터졌다. 이걸 어찌 해야 한단 말이냐..?

배치 사이즈가 지멋대로 조정이 되는데, 이것은 FISM을 사용하려 해서 어쩔 수 없는 것으로 보이긴 한다. 아이템-아이템을 해야 하니까, 조금씩 잘라서 쓴다는 선택지가 없는 것으로 일단 생각된다. 자세한 건 더 뜯어보면 알 수 있을 것 같기도 한데, 일단 문제는 OOM을 해결하는 것. 아니, 정확히는 이걸로 추천을 해내는 것이 당초의 목적이고 그것만 할 수 있으면 된다.

config놈이 뭔가 이상하다. 뭔가 불필요한 정보는 마구 들어가있는 주제에 정작 내가 넣은 split_to에 대한 값을 제대로 내뱉지를 못한다.. 주피터로 하지 말고 그냥 py파일로 만지고 싶은데. 그냥 옮겨 버릴까.

다짐 및 회고

내가 팀을 위해 무얼 할 수 있는지 계속 고민한다. 당장 베이스라인을 가장 잘 이해하고 있는 것은 나이고, 검증 셋을 어떻게 만들어야 할 지에 대한 아이디어도 내가 가장 많이 가지고 있다. 그 부분을 내가 해결해 줄 수 있으면 가장 베스트. 
그리고 내가 알려줄 수 있는 것들을 알려주는 게 좋을 것 같다. 
당장 내가 해야 할 것이 있다는 게 역시 좋구만.