페이지

2018년 3월 11일 일요일

CHATER 6 영화 추천 시스템 만들기

영화 추천 시스템은 정보 필터링 시스템의 일종으로,각 정보 (상품, 신문기사, 친구 등)에 대한 사용자 점수나 선호도 등을 예측합니다. 아마존을 비롯한 거의모든 전자상거래 사이트에서는 사용자에게 상품을 추천합니다. 뉴스 포털에서 제공하는 사용자는 사용자별 추천 기사는 이제 너무나도 익합니다. 이렇게 추천 시스템은 오늘날 인터넷 기반 서비스에서 없어서는 안 될 중요한 서비스를 제공합니다. 이 장에서는 그중에서 넷플릭스 프라이즈(Netflix Prize)로 널리 알려진 영화 추천 시스템에 대해 알아봅시다.

6.1 영화 추천 시스템
영화 추천 시스템은 사용자가 해당 영화에 별점을 몇 개 줄 것인지 예측하는 문제입니다. 우선 추천 시스템에 쓰일 만한 데이터를 생각해 볼까요? [표 6-1]과 같이 사용자가 영화에 준 별점 데이터가 있어야 합니다.

표 6-1 사용자 별점 데이터
사용자 ID        abcd
영화 ID          00001
별점               4
별점을 준 일시      2012-03-02

[표 6-1]에 있는 정보만으로는 00001이 어떤 영화인지 알 수 없으므로 사용자가 왜 영화 0001에 별점 4를 줬는지 알 수 없습니다. 영화의 내용을 알기 위해서는 별도로 [표6-2]와 같은 영화 정보도 있어야 합니다.

[표 6-2 영화 데이터]
ㄹㅇㅁㄴㄹㄴㄹㅇㄴㄹ


회귀 모델로 영화의 특징을 이용해서 사용자의 별점을 예측하는 경우를 생각해 봅시다. 영화의 특징으로는 영화 제목, 영화 장르, 상영개시일 등이 있습니다. IMDB 같은 지식 베이스를 이용하면 등장하는 배우나 영화 장르 같은 정보를 이용할 수 있습니ㅏㄷ. 이를 이용하여 회귀식을 작성한다면 '영화수 * 영화의 특징 수 * 사용자 수'만큼의 변수를 고려해야 하므로 모델이 복잡해집니다.

한 사용자의 취향은 그 사용자가 보는 영화 내용으로 알 수 있습니다. 예를 들어 어떤 사용자가 해리포터 1편부터 4편까지 보았다고 할 때 5편을 추천하는 건 당연하겠죠, 또한 비스산 판타지 소설 기반의 영화인 나니아 연대기를 추천해도 좋을 겁니다. 이렇게 상품 내용에 기반하는 방식을 내용 기반 추천 시스템이라고 합니다.

또한 비슷한 영화 취향을 지닌 사용자들은 비슷한 영화를 볼 겁니다. 만약 사용자 1이 스파이더맨, 아이언맨, 어벤져수, 닥터 스트레인지를 보았고, 사용자 2가 스파이더맨, 아이언맨, 어벤져스를 보았다면, 사용자 2에게 닥터 스트레인지를 추천해도 될 겁니다. 이렇게 다른 사용ㅈ 정보를 이용하는 방법이 협업 필터링입니다.

이 장에서는 내용 기반 추천 시스템에서 유사도 계산에 사용하는 자카드 계수와 코사인 유사도, 협업 필터링에 사용하는 수학적 기법인 행렬 분해에 대해 알아봅시다.

6.2 유사도 계산
유사도란 두 객체가 얼마나 유사한지 나타내는 척도입니다. 4.5절 '유사도 계산'에서는 수치 데이터의 유사도를 측정하는 방법에 공부했습니다. 여기서는 두 문서 간의 유사도 평가와 협업 필터링에 자주 사용하는 자카드 계수와 코사인 유사도, 그리고 단어의 유사도 평가에 사용하는 편집거리에 대해 알아봅시다. 자카드 계수와 편집 거리는 문서 안의 문자열을 그대로 사용하여 유사도를 계산할 수있습니다. 코사인 유사도는 문서 안의 문자열의 빈도를 사용합니다.

- 자카드 계수: 두 집합이 공유하는 원소 수에 기반한 유사도
- 코사인 유사도: 두 벡터 사이의 각도에 기반한 유사도
- 편집거리: 문자열을 편집하는데 필요한 연산 수에 기반한 유사도

6.2.1 지카드 계수
자카드 계수(Jaccard coefficient)는 두 집합의 유사도를 측정하는 계수입니다. 집합 S와 T가 있을 때, 두 집합의 자카드 계수는 두 집합의 교집합의  원소수를 합집합의 워소수로 나눈값입니다. 식으로 표현하면 다름과같습니다.


식 6-1 자카드 계수

| S 교집합 T   |
| ____________  |
| S 합집확 T   |

각 영화 줄거리의 유사도를 비교하여 사용자가 구매한 영화와 비슷한 내용의 영화를 추천한다고 생각해 봅시다. 영화 줄거리에 출현하는 단어와 전체 단어 사이에는 다음과 같은 관계가 있습니다.

- P00: 영화 1과 영화 2의 줄거리에 사용되지 않은 단어
- P01: 영화 1 줄거리에만 사용된 단어
- P10: 영화 2 줄거리에만 사용된 단어
- P11: 영화 1과영화 2 줄거리에 동시에 사용된 단어

예를 들어 '해리포터와 마법사의 돌'(영화1)과 '해리포터와 불의 잔'(영화2)의 내용을 비교한다고 할 때, P01은 마법사의 돌, P10은 불의 잔, P11은 해리포터, 론, 헤르미온느, P00은 아이언맨, 스트레인지, 미녀와 야슈등이 될 겁니다.

단순히 생각해보면 영화 1과 영화 2의 유사도는 P11/(P00+P01+P10+P11)이 될 것 같습니다. 이렇게 계산하는 유사도를 단순 일치계수(simple matching coefficient)라고 합니다. 즉, 두 영화 줄거리에 공통으로 사용되는 단어를 모든 단어 수로 나누는 거죠, 하지만 한 영화의 줄거리 소개에 사용되는 단어 수가 모든 단어 수보다 월등히 적으므로 워 식을 사용할 경우 P00의 값이 다른 값에 비해 굉장히 크게 됩니다.

협업 필터링에서도 비슷한 문제가 생깁니다. 예를 들어 한 사용자가 구매하는 상품 수가 온라인 쇼핑몰에 존재하는 전체 상품 수에 비해 월등히 적으므로 두 사용자 중 어느 쪽도 구매하지 않은 상품수 (P00)가 많아집니다. 이렇게 데이터 하나에 존재하는 피처 수가 가능한 피처 수에 비해 월등하게 적은 경우 데이터가 희박하다고 표현합니다. 지 카드 계수는 이렇게 희박한 데이터 간의 유사도를 측정하는 데 유용합니다.

6.2.2 코사인 유사도
코사인 유사도(cosine similarity)는 두 벡터 사이의 각도를 -1부터 1사이의 값으로 나타내는 척도입니다. 두 벡터가 같은 방향(두 벡터 사이의 각도가 0도)이면 1, 두 벡터가 완전 반대 방향(두 벡터 사이의 각도가 180도)이면 -1이 됩니다. 값이 1일 경우 벡터 간의 유사도가 크다는 거고, -1일 경우 유사도가 매우 작다는 겁니다. 정의는 다음과 같습니다.

식 6-2 코사인 유사도


각도와 유사도는 무슨 관계가 있을까요? 문서에 나오는 단어 빈도를 사용하여 유사도를 측정한다고 생각해봅시다. [표6-3]은 각 문서에 출현하는 단어 수를 보여줍니다.

표 6-3
문서당 단어 빈도
                      단어1       단어2
문서1            4               3
문서2           2                1
문서3           1                3

위 표를 다음과 같은 벡터로 나타낼 수 있습니다.

문서1 = (4,3)
문서2 = (2,1)
문서3 = (1, 3)

그림으로 나타내면 [그림 6-1]과 같습니다. 그림에서 볼수 있듯이 코사인 유사도는 벡터의 크기를 무시하고 각도를 이용하여 유사도를 계산합니다.

문서 2와 문서3 중 어느 문서가 문서 1에 가까운지 살펴보겠습니다.

sim(문서1, 문서2) = (4*2 + 3*1)/루트(4*4 + 3*3)루트(2*2 + 1*1) = 0.98
sim(문서1,  문서3) = (4*1 + 3*3)/루트(4*4 + 3*3)루트(1*1 + 3*3) = 0.82

문서 2가 문서 3보다 문서 1에 더 가깝다는 것을 알 수 있습니다. 이때 연산 횟수가 많을 수록 거리가 멀다고 정의합니다. 문자열에 대해 가능한 연산은 문자 삽입(insertion), 삭제(deletion), 대체(substitution), 전치(transposition)가 있습니다. 편집 거리는 허용하는 연산에 따라 종류가 나뉘는데, 예를 들어 대체 연산만 허용하는 해밍 거리와 삽입, 삭제, 대체 연산을 허용하는 레벤슈타인 거리 등이 있습니다. 문자열 비교 시 가장 자주 사용하는 거리는 레벤슈타인 거리 입니다.

옐르 들어 다음과 같은 문자열이 있다고 합시다.
S1 = abcd
S2 =acfdg

S1을 S2로 만들려면 다음과 같은 과정을 거칩니다.

1. b 삭제
2. f 삽입
3. g 삽입

3번의 연산을 거쳤으므로 편집 거리(S1, S2)는 3이 됩니다.

그럼 이런 편집거리는 어디에 사용할 수 있을까요? 아래와 같은 영화 제목을 생각해 봅시다.

- 영화1: 스파이더맨1
- 영화2: 스파이더맨2
- 영화3: 아이언맨1

영화 1과 2는 편집 거리가 2(1삭제 후 2삽입)인 반면, 영화 1과 3은 편집 거리가 7('스, 파, 이, 더' 삭제 후 '아, 이, 언' 추가)이라는 것을 알 수 있습니다. 편집 거리는 이렇게 시리즈몰의 제목을 찾는데 유용합니다. 또한 문서의 안의 오탈자를 고려하여 유사도를 측정하는데도 유용합니다. 예를 들어 '해리포터'와 '헤리포터'의 경우 다른 문자열리지만 편집 거리가 2로 작으므로 오탈자로 인해 차이가 생겼다고 보고 같은 문자열로 취급하는 식입니다.

6.3 내용 기반 추천 시스템
내용 기반 추천 시스템은 사용자가 과거 좋은 별점을 준 영화와 비슷한 영화를 추천합니다.
그럼 어떤 영화가 비슷한 영화일까요? 단순히 생각하면 영화 내용이  같으면 될 것 같지만 모든 문장이 같을 순느 없을 테니 영화 내용 소개 문서 안에서 사용된 단어가 비슷하면 되겠네요. 비슷한지 여부를 판ㄹ별하는 것 유클리드 거리잖아요! 그렇다면 문서의 모든 단어를 3.3.2절 '카테고리 데이터 표준화'에서 설명한 원-핫 인코딩 방식을 적용해 수치 데이터로 바꾼 후 문서 같의 유클리드 거리를 계산하면 되겠군요. 그런데 문제가 있습니다. 일반적으로 문서에는 사용된 단어가 됭장히 많고, 춫ㄹ현 빈도가 다르며, 같은 단어라도 다른의미로 쓰일 수 있습니다.

이 문제를 해결하려면 문서 내의 모든 단어를 사용하는 대신 5.1.1절 '문서 분류에 많이 사용하는 피처'에서 배운 대로 문서에 나오는 중요단어를 피처로 추출하여 비교합니다. 그리고 문사 간 유사도를 계산하기 위해서는 6.2절 '유사도 계산'에서 설명한 유사도 계산법을 이용합니다.

이런한 내용 기반 추천 시스템은 다른 사용자의 정보가 없어도추천이 가능하고, 독특한 취향을 가진 사용자(즉, 다른 사용자와 겹쳐지 않는 상품만 구매하는 사용자)에게도 상품을 추천할 수 있으며, 상품을 추천하는 이유를 설명하기도 쉽습니다. 반면 특이한 상품을 추천하는 ㅔㄷ 제한적이며, 과거 구매 이력이 없는 신규 사용자에게 추천하기 어렵다는 단점이 있습니다.

6.4 협업 필터링
협업 필터링은 다른 사용자의 구매 이력을 이용해서 영화를 추천하는 방법입니다. 한 사용자의 구매 이력만 생각하는 내용 기반 추천 시스템과 달리 협업 필터링은 여러 사용자 혹은 여러 아이템 정보를 동시에 사용하여 추천합니다. 그림으로 나타내면 다음과 같습니다.

그림 6.2 사용자 기반 필터링

사용자 1이 영화1, 2, 3를 보고, 사용자 2가 영화 1,4를 보았을 때 , 사용자 2에게 영화2를 추천하는 것이 사용자 기반 협업 필터링의 아이디어 입니다. 반면 상품 기반 협업 필터링은 사용자으 상품 평가 유사성을 이용하여 상품을 추천합니다. 예를 들어 영화1과 영화2에 사용자 1과 사용자3이 좋은 별점을 줬을 경우, 사용자 2도 좋은 별점을 줄 거라고 생각하는 겁니다.

두 필터링 방법 모두 상품, 사용자, 별점의 괄계를 이용합니다. 이런 관계를 [표6-4]와 같이 행별로 표시한 것을 유틸리티 행렬(utlity matrix)이라고 합니다. 유틸리티 행렬은 '사용자 수 * 상품수(혹은 사품 수 * 사용자 수)' 크기 행렬입니다. 행렬의 각 원소는 사용자가 상품에 준 점수를 나타냅니다. ?는 사용자가 상품에 아직 점수를 주지 않은 항입니다.

표 6-4 유틸리티 행렬
                  영화1        영화2         영화3       영화4
사용자1           1            5               2              4
사용자2           2            2               5              1
사용자3           2            4               ?               ?

[표 6-4]에서 사용자 1은 영화 1에 별점 1을 줬습니다. 사용자 3은 아직 영화 3과 영화 4에 별점을 주지 않았습니다. 그럼 영화 3과 4를 사용자 3에게 추천할 지 여부를 정하려면 (사용자 3, 영화 3), (사용자3, 영화4) 별점을 예측할 필요가 있습니다. 별점 예측 기법으로는 사용자/상품 기반 협업 필터링과 잠재성 요인 모델이 있으며, 성능 평가에는 평균 제곱근 편차를 사용합니다.

6.4.1 평균 제곱근 편차
사용자가 입력할 별점을 되도록 실제 값에 가깝게 예측하는 것(근사)이 추천 시스템의 목표입니다. 예를 들어 사용자 1이 '어메이징 스파이더맨'에 줄 실제 별점이 5라고 할때 별점 3으로 예측하는  것보다 별점 4로 예측하는 것이 더 정확한 예측이고 더 정확한 추천입니다. 즉 실제 별점과 근사 별점의 차가 적을수록 좋은 예측이 됩니다. 이를 평가하는 것이 평균 제곱근 편차(Root Mean Square Error:RMSE)입니다.

실제 별점이 들어 있는 행렬 M, 예측한 별점이 들어 있는 행렬을 M', 행렬의 각각 mij, m'ij로 나타내고, 유틸리티 행렬의 원소 수를 N이라 할 때, 평균 제곱근 편차는 다음과 같이 계산합니다.

6-3 평균 제곱근 편차

루트(함(mij - m'ij)**/N)

mij: 실제 별점 행렬의 (i,j) 항
m'ij:예측 별점 행렬(i,j) 항
N: 유틸리티 행렬의 원소 수:

즉, 평균 제곱근 편차는 예측값과 실제 값의 차이를 제곱한 값의 평균의 제곱근입니다. 예측값과 실제값의 차이가 적을수록, 또 예측값과 실제값의 차이가 적은 항이 많을 수록 이 값은 작아집니다. 그러므로 값이 적을수록 좋은 예측입니다.

[표 6-4]의 유틸리티 행렬을 이용해 평균 제곱근 편차를 계산했습니다.

실제 별점 행렬M
              영화1                  영화2                 영화3                 영화4
사용자1      1                       5                        2                       4
사용자2      2                       2                        5                       1
사용자3      2                       4                       1                         4

예측 별점 행렬 M1
                   영화1           영화2            영화3         영화4
사용자1       1                  5                      2                 4
사용자2       2                 2                       5                 1
사용자3       2                 4                       1                  3

예측 벌점 행렬 M2
                   영화1           영화2            영화3         영화4
사용자1       1                  5                      2                 4
사용자2       2                 2                       5                 1
사용자3       2                 4                      4                  2

여기서 평균 제곱근 편차는 유틸리티 행렬(표6-4)에서 ?로 표시된 미지항에 대새서만 계산합니다. 즉, 예측한(사용자 3, 영화3)과 (사용자3, 영화4)의 항만 고려하여 값을 구합니다.  유틸리티 행렬의 원소 수는 12개이므로 N은 12가 됩니다. 따라서 예측 별점 행렬 1과 예측 별점 행렬 2의 평균 제곱근 편차는 다음과 같습니다.

RMSE(M1) = 루트(((1-1)** + (4-3)**/12)) = 0.29
RMSE(M2) = 루트(((1-4)**+(4-2)**/12)) = 1.04

예측 별점 행렬1이 더정확히 실제 별점을 예측했다는 것을 알수 있습니다.

6.4.2 사용자 기반, 상품 기반 협업 필터링
사용자 기반, 혹은 상품 기반 협업 필터링은 추천을 위해 사용자 혹은 상품의 유사도를 사용합니다.
사용자 간의 유사도를 계산할 때는 사용자가 본 영화와 별점을 이용합니다. 자카드 계수를 사용할 경우에는 두 사용자가 본 영화 중 공통된 영화가 많을수록 두 사용자가 비슷하다고 보는데, 이 경우 영화의 별점 정보를 무시하게 되므로 적절하지 않습니다. 예를 들어 두 사용자가 완전히 같은 영화를 봤더라도 상반되게 별점을 줬다면 두 사용자의 영화 취향이 비슷하다고는 할 수 없겠죠. 따라서 상품에 별점과 같은 선호도 정보가 있을때는 코사인 유사도를 계산하는 것이 좋습니다. 계산 절차는 다음과 같습니다.

1.  열마다 별점 평균값 구하기
2. 각 별점에서 평균값 빼기
3. 미지항을 0으로 채우기

[표 6-4]의 유틸리티 행렬에 이 방법을 적용해서 사용자1, 사용자2, 사용잦3의 유사도를 계산해 볼까요?

사용자1의 별점 평균: (1+5+2+4)/4 = 3
사용자2의 별점 평균:(2+2+5+1)/4 = 2.5
사용자3의 별점 평균:(2+4)/2 = 3

[표6-4]의 각 열에서 위에 계산한 별점 평균을 뺀 것이 [표 6-5]입니다. 사용자 3의 미지항은 0으로 채웠습니다.

표 6-5 수정된 사용자 별점

                     영화1           영화2            영화3         영화4
사용자1       -2                  2                      -1                 1
사용자2        -0.5                -0.5                      2.5                -1.5
사용자3       -1               1                     0                  0

[표6-5]의 값을 이용해서 계산한 사용자의 코사인 유사도는 다음과 같습니다.

sim(사용자1, 사용자3) = 0.89
sim(사용자2, 사용자3) = 0.0

사용자 1이 사용자 3과 비슷하므로, 사용자 3에게는 사용자1이 좋은 점수를 준 영화 4를 추천하면 될 것 같습니다.

상품 기반 추천 방식으로 영화를 추천할 경우 영화 정보 등을 이용하여 유사도를 계산하므로 기본적으로는 내용 기반 추천 시스템에서 사용하는 방식과 같습니다. 카테고리나 가격 같이 피처가 정해져 있는 상품은 유사도 계산이 더쉬우므로 실전에서는 사용자 기반 협업 필터링보다 상품 기반 협업 필터링을 더 자주 습니다. 상품 기반 협업 필터링을 이용한 사용자의 상품 별점 계산은 일반적으로 다음과 같습니다.

rxi = bxi  + (합(Sij*(rxj  - bxj))/합(Sij))

bxi = u  + bx + bi
rxi = 사용자 x의 상품 i에 대한 별점
i = 사용자 x의 별점 정보가 존재하지 않는 상품
Sij = 상품 i와 사품 j의 유사도
j = Sij가 높고 사용자 x 의 별점 정보가 존재하는 상품
bxi = 사용자 x의 상품 i에 대한 별점 편향
u = 전체 상품의 별점 평균
bxi = 사용자 x의 상품i에 대한 별점 편향
u = 전체 상품의 별점 평균
bx = 사용자 x의 별점 편향
bi = 상품 i의 별점 편향

미지의 별점을 구하려면 영화(상품) 전체의 평균 별점에 사용자 및 영화의 별점 편향(치우침)을 고려합니다. 별점 계산에서 편향을 다루는 표준화에 대해서는 6.5절 '표준화'에서 자세히 살펴보겠습니다.

6.4.3 잠재성 요인 모델
사용자/상품 기반 협업 필터링은 상품이나 사용자의 유사도를 계산해서 별점을 예측하지만 잠재성 요인 모델(latent factor model)은 유사도 계산하지 않고 유틸리티 행렬로 별점을 직접 예측합니다. 잠재성 요인 모델은 유틸리티 행렬이 두 행렬(사용자 요인 행렬, 별점 요인 행렬)의 곱으로 이루어져 있다고 가정합니다.

6.4.3.1 특잇값 분해
행렬 분해는 행렬 하나를 여러 행렬의 곱으로 분해하는 방법입니다. 이 방법에는 여러가지가 있지만, 그 중에서 가장 널리 사용되는 방법은 특잇값 분해(Singular Value Decomposition:SVC)와 7.3.2절 '코너'에서 공부할 고유벡터 분해 (eigen vector decomposition) 입니다.
행렬 A가  m*n 행렬일 때, A를 특잇값 분해하면 크기 m*m의 행렬  U, 크기 m * n행렬  합, 크기  m * n의 행렬 V로 분해할 수 있습니다. 그림으로 나타내면 [그림6-3]과 같습니다.

그림 6-3 특잇값 분해


특잇값 분해는 계산에 시간이 많이 걸리기 때문에 일반적으로 고윳값이 큰 고유벡터 k개만으로 U와 V를 만듭니다. 이를 절단 특잇값 분해(truncated SVD)라고 합니다. 적은 수의 고유벡터를 사용하여 만들어진 U와 V의 곱은 워래의 행렬에 가까운 행렬(근사 행렬)을 만들어낼 수 있습니다. 따라서 전단 특잇값 분해는 차원 축소에 이용되기도합니다.

절단행렬 분해를 크기라 '사용자 수 * 영화 수'인 유틸리티 행렬에 적용하면 유틸리티행렬을 크기가 '사용자수 * k'인 상요자 요인 행렬 X와 크기가 '영화 수 * k'인 영화 요인 행렬 Y로 나눌 수 있습니다. 여기서 K는 원래 사용자 수 및 영화 수보다 작습니다. 그리고 이 행렬의 곱을 구하는 것으로 원래 행렬을 예측하게 됩니다.

특잇값 분해를 적용하려면 행렬의 모든 값을 알아야 합니다. 하지만 지금 행렬에는 미지항(사용자의 별점이 없는 영화)이 있습니다.  따라서 미지항을 임의의 값으로 초기화 하고 가중치 행렬을 적용해서 무시하게 만들거나, 아애 손실함수를 존재하는 별점 값에 대해서만 계산합니다. 그리고 이미 값이 존재하는 항에 의한 과학습을 막기 위해 정규화를 적용합니다. 행렬의 전 항의 별점을 이용한 정규화된 손실함수는 [식 6-4]와 같습니다.



[식 6-4]의 값을 구하는 방법은 다양합니다. 여기서는 자주 쓰이는 교대 최소제곱법과 경사하강법에 대해 설명하겠습니다.

교대 최소제곱법
미지 행렬 X,  Y를 하나씩 구해나가는 방법입니다. X, Y를 임의의 행렬로 초기화한 후, 임의의 Y를 사용하여 X를 구하고, 그렇게 구해진 X를 업데이트 합니다. 이 과정을 각 단계마다 XY로  근사한 행렬 Q와 실제 점수 행렬 R을 이용하여 [식 6-4]의 손실을 계산하고,  이 손실값을 전 단계로 부터 변하지 않을  때 갱신을 멈춥니다. 일반적으로 반복횟수를 제한하거나, 이전 단계의 손실값과 비교하여 사용자가 지정한 차이보다 작을 경우 갱신을 머춥니다.

X와 Y로 행렬을 근사할때 이미 알고 있는 별점에 의한 근사 결과에 가중치를 더 주면 결과가 더 정확할 것 같습니다. 이를 위해 가중치 행렬을 정의합니다. 이  행렬은 점수 행렬 R과 같은 크기(m * n)인데, Rij 에 유저가 준 점수값이 있으면 1, 없으면 0입니다. 수식으로 표현하면 다음과 같습니다.

식 6-5 가중치 행렬
Wui = 0, rui = 0이면
Wui = 1 그렇지 않으면
wui = 가중치 행렬의 (i, j)의 값

가중치 행렬이 들어간 손실 함수는 다음과 같이 바뀝니다.

이와 같이 사용자와 상품 행렬을 더 이상 값이 바뀌지 않을 때까지 번갈아가며 갱신합니다. 그 후 두 행렬의 곱으로최종 근사 행렬을 계산합니다.

경사하강법
행렬 X,Y는 2.3.1절 '경사하강법'에서 공부한 경사하강법으로  풀 수 있습니다. 초기 X, Y를 임의로 정한 후 이를 이용하여 근사 행렬 Q를 구합니다. 그 후 R과  Q를 구합니다. 그 후 R과 Q를 잉요하여 손실을 구하고 그 값울 경사하강법에 적용합니다.


경사하강법을 전체 행렬에 적용하기 보다는 관측된 일부 값에 대해서만 SGD를 적용하면 빠른 속도를 얻을 수 있습니다. SGD에 대해서는 ㄹ제 구현은 12장에 살펴보겠습니다 2.3.3절 '활률적 경사하강법'에서 자세히 설명했으니 그곳을 참조하세요.

댓글 없음: