brunch

You can make anything
by writing

C.S.Lewis

by 유윤식 Mar 07. 2020

TF-KERAS: 행렬곱, 그리고 추천

#추천시스템, #Tensorflow, #Keras, #Matrix

행렬곱?

추천??


사용자 5명, 영화 10편이 있다고 하자.

사용자 5명, 책 10편이 있다고 하자.

사용자 5명, 음악 10곡이 있다고 하자.


사용자 5명은 영와, 책, 음악이라는 컨텐츠에 대해서 어떠한 행위(Interaction)를 한다.

이를 기반으로 사용자 5명 사이의 관계가 형성되고,

이를 기반으로 추천이라는 서비스가 진행된다.


매우 기본적이고 고전적인 방식의 접근이다.

누구나 한 번쯤은 위와 같은 형태의 추천 방식을 보았을 것이다.


그 유명한 "Collaborative Filtering" 이다.


하나의 테이블을 떠올려 보자.

각 Row에 사용자1, 사용자2, ... 사용자5 가 있다.

각 Column에 아이템1, 아이템2, ... 아이템10 이 있다.


사용자1 과 각 아이템에는 '1'과 '0'으로 채워진다.

영화를 보았거나, 책을 구매했거나, 음악을 청취했다면 '1'의 값을 가진다.

Otherwise, '0'의 값을 가진다.


구글 이미지 검색을 통해서 'Collaborative Filtering' 결과를 보면,

위에 언급한 내용이 첫번째에 보일 것이다.


그럼 어떻게 사용자 * 아이템 상호작용 결과를 통해서 각 사용자끼리의 관계를 알 수 있을까?


행렬곱을 활용하거나, 코사인, 유클리드 거리 계산 방법을 통해서 알 수 있다.


원리는 간단하다.

사용자1과 가장 가까운 거리에 위치하는 다른 사용자는?

사용자1과 같은 곳을 바라보는 다른 사용자는?


위 두가지 물음에 해당하는 답을 찾을 수 있다면 '해당 사용자'는 사용자1과 비슷한 성향을 가지며,

그 '해당 사용자'가 상호작용한 아이템을 사용자1에게 추천 할 수 있다.


깊게 파고들자면 끝이 없다.

통계도, 딥러닝도 그렇지만 모든 원리를 다 알고 진행하기 보다는 일단 프로그램을 통해 구현하고 결과를 통해 Insight를 발견하는 것에 초점을 두는 것을 선호한다.


코드는 워낙 간단하다.


user_ = tf.keras.Input(shape=(1, ), dtype='int32', name='user_input')

item_ = tf.keras.Input(shape=(1, ), dtype='int32', name='item_input')


단 두줄로 사용자, 아이템 정보를 입력받기를 희망(?) 할 수 있다.


user_embedding = tf.keras.layers.Embedding(5, 10, name='uemb')

item_embedding = tf.keras.layers.Embedding(10, 20, name='iemb')


단 두줄로 사용자, 아이템의 특징을 나타내는 메트릭스를 만들었다.

추가적으로 첫번째 파라미터는 사용자 전체의 수, 두번째 파라미터는 사용자 특징 정보의 수를 나태냈다.

이는 사용자는 5명, 10개의 특징

아이템은 10개, 20개의 특징을 갖도록 만들었다.


이제 각자 알아서 열심히!! 검색을 하든, 책을 찾아서 보든

직접 나머지를 구현해서 추천 결과를 만들어야 한다.


코드는 널리고 널렸다.

단, 내 코드는 지금! 아직! 세상에 존재하지 않는다.

직접 구현해 보는 것이 추천서비스를 만들어 보는 첫번째이자 가장 중요한 시작이다.


'행렬곱' 이라는 키워드를 잘 이용해보라.

단순한 것 같지만,

직접 구현하면서 각 Tensor의 크기, 모양, 다양한 실험 등을 print 하고 눈으로 확인하는 과정을 경험하고

이를 토대로 단순히 코드를 배우는 것을 넘어 데이터 형태를 배울 수 있을 것이다.


끝.




작가의 이전글 TF-KERAS: Matrix Factorization
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari