-
[Week 9] Recommender SystemsCourses/Andrew Ng - Machine Learning 2022. 2. 9. 18:47
Predicting Movie Ratings
이번 시간엔 추천 시스템을 다룹니다. 영화 등급을 예측하는 문제를 예시로 듭니다.
4명의 유저가 5개의 영화에 대해 별점으로 평가합니다. 0~5가 값이 될 수 있습니다. 이 예제에는 로맨틱 영화와 액션 영화가 있습니다. 앨리스는 로맨틱 영화에 높은 별점을 주었지만 액션 영화는 선호하지 않습니다. 반대로 캐롤은 로맨틱 영화에는 낮은 점수를 주었지만 액션 영화에 높은 별점을 주었습니다.
r(i,j)는 사용자 j가 영화 i에 별점을 주었는지 평가 여부입니다. 평가를 했다면 r(i,j) = 1, 아니라면 r(i,j) = 0 입니다. y^(i,j) 는 사용자 j가 영화 i에 준 평점입니다. 앨리스가 유저 1이고 Love at last가 영화 1이라면 y^(1,1) = 5 입니다. 추천 시스템 문제는 유저가 아직 평가하지 않은 영화에 어떤 별점을 줄 지 예측하는 것 입니다. 앨리스는 로맨틱 영화를 좋아하니 Cute puppies of love에 높은 점수를 줄 것이라고 생각할 수 있습니다. 데이브는 액션 영화를 선호하니 Swords vs. karate에 높은 점수를 줄 것이라고 예측할 수 있습니다. 이런 예측에 근거하여 유저가 더 좋아할만한 영화를 추천하는 것이 알고리즘의 목적입니다.
Content Based Recommendations
우리의 목표는 ?의 값을 예측하는 것 입니다. 이를 위해 영화의 특성을 나타내는 변수들을 만듭니다. x1는 영화의 로맨스 정도이고 x2는 액션의 정도입니다. 즉 영화가 로맨스에 가까울 수록 x1의 값은 커지고, x2의 값은 작아집니다. 반대로 영화가 액션에 가깝다면 x2의 값이 커지고 x1은 작아집니다. 5개에 영화에 대해 변수 벡터로 표현합니다. x(1) = [1;0.9;0], x(2) = [1;1;0.01] 같은 형식입니다. 이제 각 유저에 대한 파라미터 theta를 학습해야 합니다. 앨리스는 로맨스 영화를 극도로 선호하는 특성이 있으므로 theta(1) = [0; 5; 0] 으로 표현할 수 있습니다. x(3) = [1;0.99;0]으로 표현 가능하므로 우리는 cute puppies of love에 대한 앨리스의 점수를 theta(1)^T * x(3)으로 계산하여 4.95 정도가 될 것이라고 예측할 수 있습니다.
파라미터 벡터 theta는 각 유저들에 대한 파라미터입니다. 이를 계산하기 위해 , 해당 유저가 실제로 별점을 준 값과 예측 값 사이의 오차로 cost function을 만들고 이를 최소화합니다. 이것은 오차의 제곱항을 최소화 하는 선형 회귀 문제와 같습니다. 여기에 정규화 항을 추가합니다.
이 과정을 모든 유저와 모든 영화에 대해서 진행합니다. cost function을 최소화한 뒤 해당 파라미터를 경사 하강법으로 업데이트합니다. 이런 방식을 컨텐츠 기반 추천이라고 부릅니다. 영화에 대한 어떤 판단 척도를 변수로 삼아 예측합니다. 다만 실제로 모든 영화에 이런 변수를 만드는 것은 어려운 일입니다. 따라서 이런 방식이 아닌 다른 추천 시스템에 대해 알아보겠습니다.
Collaborative Filtering
협업 필터링 방식은 컨텐츠 기반 추천 방식과 달리 나와 유사한 취향을 가지고 있는 유저의 파라미터를 따라 별점을 예측합니다.
이제 각 유저의 로맨스 영화 척도와 액션 영화 척도에 대한 정보가 있습니다. 앨리스와 밥은 로맨스 영화를 선호하고 캐롤과 데이브는 액션 영화를 선호합니다. 이는 유저들이 직접 설정한 값입니다. 아까와는 다르게 파라미터 theta는 알고 있고, 우리는 x1,x2 변수에 대해 알아야 합니다. 앨리스와 밥이 Love at last에 5점을 주었고 캐롤과 데이브는 0점을 주었으므로 이 영화는 로맨스에 가깝다는 것을 알 수 있습니다. 그에 근거하여 우리는 X(1)을 추정할 수 있습니다. theta(1)^T*x(1) = 5, theta(2)^T*x(2) =5 ...
우리는 이미 유저들의 선호도인 파라미터 theta를 가지고 있기 때문에 각 영화들의 변수인 x만 최소화하면 됩니다. 컨텐츠 기반 추천처럼 실제로 사용자가 준 별점과 예상 별점의 오차의 제곱항을 모두 더하고 정규화 항과 함께 최소화합니다. 이렇게 모든 영화의 변수를 최적화합니다.
영화에 관한 변수인 x가 주어졌다면 파라미터 theta를 유추할 수 있습니다(컨텐츠 기반 추천). 각 유저들의 선호도인 파라미터 theta가 주어졌다면 x를 유추할 수 있습니다(협업 필터링).
Collaborative Filtering Algorithm
효율성을 위해 x와 theta를 동시에 추정합니다. 맨 아래식이 두가지 최적화를 동시에 진행하는 수학 식 입니다. 첫번째 식과 두번째 식의 오차항을 합친 것 입니다. 모든 유저가 평가한 모든 영화의 오차의 제곱항의 합계입니다. 그 뒤는 파라미터 theta와 x에 대한 정규화 항입니다. 이렇게 x와 theta를 동시에 최적화합니다.
지금까지 설명한 것을 요약합니다. 첫번째로 파라미터 theta와 x를 작은 값으로 랜덤 초기화합니다. 두번째로 고급 최적화 알고리즘을 사용하여 비용 함수 J를 최소화합니다. 세번째 최적화한 파라미터들을 사용하여 특정 영화의 별점 예측값을 알아냅니다.
Vectorization: Low Rank Matrix Factorization
이번엔 협업 필터링 알고리즘이 예측하는 다른 방법에 대해 알아봅니다.
유저와 영화 별점 데이터가 주어졌을 때 행렬 Y를 오른쪽과 같이 정리합니다. 각 성분은 y^(i,j)와 동일합니다. 평가되지 않은 영화는 그대로 ?로 남겨둡니다.
행렬 Y의 성분들은 오른쪽과 같이 vectoriztion 표현화할 수 있습니다. 녹색 동그라미는 2번 유저가 2번 영화에 줄 별점을 예측하는 성분입니다. X와 Theta는 위처럼 모든 변수를 행에 나열할 수 있습니다.
어떤 두 영화가 얼마나 유사한지 측정하는 방법이 있습니다. 영화 i에 대한 변수 x(i)가 있고 다른 영화 j에 대한 변수 x(j)가 있습니다. 두 영화가 유사하다는 건 차이가 적다는 의미이므로 ||x(i)-x(j)|| 가 작을 수록 두 영화가 비슷하다는 의미입니다. 따라서 유저가 어떤 영화를 보고 있고 마음에 들어한다면 , 비슷한 다른 영화를 추천할 수 있습니다.
Implementational Detail: Mean Normalization
어떤 영화도 평가하지 않은 새로운 유저가 있다고 가정합시다. 변수의 개수는 n=2입니다. 이 유저는 아무런 평가를 하지 않았기 때문에 r(i,j) =1 인 항이 없고 따라서 0이 됩니다. 정규화 항의 경우에도 이미 파라미터가 0,0 이기 때문에 영향을 미치지 않습니다. Theta(5) = [0;0] 이기 때문에 알고리즘은 이브가 모든 영화에 0점을 줄 것이라고 예측하게 됩니다.
이 문제를 해결하기 위해 Normalization 개념을 도입합니다. 모든 영화 등급을 행렬 Y로 그룹화합니다. 이브는 어떤 영화도 평가하지 않았기 때문에 5번째 열의 성분들은 물음표입니다. 이제 각 영화가 받은 영화 등급의 평균을 계산합니다. 첫번째 영화는 5,5,0,0을 받았으므로 10/4 = 2.5가 평균 점수가 됩니다. 이렇게 구한 평균 벡터를 μ 벡터로 합니다. Y의 모든 열에 μ 벡터를 뺍니다. 결과적으로 Y의 각 행들의 평균은 0이 됩니다. 변형시킨 Y를 협업 필터링 알고리즘에 적용합니다. 이 때 아까 빼준 평균값 만큼 다시 더해줍니다. 이브가 준 별점의 초기값들은 모두 0이지만 이제 평균을 더하여 어떤 값을 줄 수 있습니다. 이브는 아직 어떤 평가도 하지 않았기 때문에 다른 유저들이 준 영화의 평균값이 별점이 될 것이라고 추정합니다.
혼자서 강의를 듣고 정리한 것이니 틀린 점이 있다면 언제든지 지적 부탁드립니다 :)
'Courses > Andrew Ng - Machine Learning' 카테고리의 다른 글
[Week 10] Advanced Topic (0) 2022.02.25 [Week 10] Gradient Descent with Large Datasets (0) 2022.02.23 [Week 9] Buidling an Anomaly Detection System (0) 2022.02.08 [Week 9] Anomaly Detection (0) 2022.02.08 [Week 8] Applying PCA (0) 2022.01.30