brunch

You can make anything
by writing

C.S.Lewis

by 라인하트 Feb 16. 2021

머신러닝 옥타브 실습(8-4):협업 필터링 구현

   온라인 강의 플랫폼 코세라의 창립자인 앤드류 응 (Andrew Ng) 교수는 인공지능 업계의 거장입니다. 그가 스탠퍼드 대학에서 머신 러닝 입문자에게 한 강의를 그대로 코세라 온라인 강의 (Coursera.org)에서 무료로 배울 수 있습니다. 이 강의는 머신러닝 입문자들의 필수코스입니다. 인공지능과 머신러닝을 혼자 공부하면서 자연스럽게 만나게 되는 강의입니다. 


Programming Exercise 8: 

Anomaly Detection and Recommender Systems (이상 탐지와 추천 시스템)


2. Recommender Systems (추천 시스템)


2.2.3 Regularized cost function (정규화된 비용 함수)


   The cost function for collaborative filtering with regularization is given by



   You should now add regularization to your original computations of the cost function, J. After you are done, the script ex8 cofi.m will run your regularized cost function, and you should expect to see a cost of about 31.34.

   You should now submit your solutions.


   정규화 항을 사용하는 협업 필터링의 비용 함수는 다음과 같습니다. 


   기존에 작성한 정규화하지 않은 비용 함수 J의 코드에 정규화 항을 추가합니다. ex8_cofi.m 파일은 정규화된 비용 함수를 실행하고 약 31.34의 비용을 표시합니다. 

    cofiCostFunc.m 파일 작성을 완료하면 제출합니다. 



<Part 4: 협업 필러팅 비용 함수 정규화 >


(1) 정규화된 비용 J 계산하기


   비용과 기울기를 계산하는 cofiCostFunc.m 파일을 작성합니다. 파일을 호출할 때 영화 프로파일  X(:)과 사용자 프로파일 Theta(:)로 만든 벡터 param , 영화에 대한 사용자 평가 척도 Y, 영화에 대한 사용자 평가 여부 R, 총 사용자 수 num_users, 총 영화 수 num_movies, 총 피처 수 num_features, 그리고 정규화 파라미터 lambda를 전달합니다.


J = cofiCostFunc([X(:) ; Theta(:)], Y, R, num_users, num_movies,  num_features, 1.5);           


   정규화하지 않은 비용 함수 J를 계산할 때 정규화 파라미터 lambda의 값은 0을 사용하고, 정규화한 비용 함수 J를 계산할 때 정규화 파라미터 lambda의 값을 0 아닌 값을 사용합니다. 여기서는 lambda = 1.5입니다. 


   cofiCostFunc.m 파일은 비용 J를 반환합니다. 파일은 인공 신경망 때와 마찬가지로 데이터를 벡터 단위로 처리합니다. m X n 차원 행렬을 언롤링하여 벡터로 재배열합니다. 



(2) 정규화한 비용 J 계산하기


%%% 정규화하지 않은 비용 함수 J를 계산하는 코드

J = 1/2 * sum(sum(((X * Theta' - Y) .* R) .^2));

  

 다음은 정규화한 비용 함수  J를 계산하는 공식입니다. 


   지난 실습에서 정규화하지 않은 비용 함수 J를 계산하는 코드를 작성했습니다. 


J = 1/2 * sum(sum(((X * Theta' - Y) .* R) .^2));


%%% 정규화한 비용 함수 J의 첫 번째 정규화 항을 계산하는 코드

lambda/2 * sum(sum(Theta .^2))


   다음은 정규화한 비용 함수  J를 계산하는 공식입니다. 


   정규화하지 않은 비용 함수 J를 계산하는 코드에 뒤의 두 개항을 포함합니다. 정규화 항을 코드를 작성하기 위해서는 정규화 파라미터 lambda를 사용합니다. 


lambda = 1.5;


   첫 번째 정규화 항에 대한  코드를 작성합니다. 


>> Theta

Theta =

   0.28544  -1.68427   0.26294

   0.50501  -0.45465   0.31746

  -0.43192  -0.47880   0.84671

   0.72860  -0.27189   0.32684


>> Theta .^2

ans =

   0.081478   2.836749   0.069137

   0.255038   0.206705   0.100782

   0.186552   0.229254   0.716920

   0.530856   0.073926   0.106827


>> sum(Theta .^2)

ans =

   1.05392   3.34663   0.99367


>> sum(sum(Theta .^2))

ans =  5.3942


>> lambda = 1.5

lambda =  1.5000


>> lambda/2 * sum(sum(Theta .^2))

ans =  4.0457

   


%%% 정규화한 비용 함수 J의 두 번째 정규화 항을 계산하는 코드

lambda/2 * sum(sum(X .^2))


   첫 번째 항을 계산하는 것과 동일하고 단지 사용자 프로파일 Theta를 제곱하는 것이 아니라 영화 프로파일 X를 제곱합니다. 


>> X

X =

   1.048686  -0.400232   1.194119

   0.780851  -0.385626   0.521198

   0.641509  -0.547854  -0.083796

   0.453618  -0.800218   0.680481

   0.937538   0.106090   0.361953


>>  lambda/2 * sum(sum(X .^2))

ans =  5.0738



%%% 정규화한 비용 함수 J 계산하는 코드

J = 1/2 * sum(sum(((X * Theta' - Y) .* R) .^2));

J = J + lambda/2 * sum(sum(Theta .^2)) + lambda/2 * sum(sum(X .^2))


   정규화하지 않은 비용 함수 J에 정규화 항을 추가하는 형식으로 코드를 작성합니다.  옥타브 프로그램에서 31.344의 결과를 얻습니다. 


>> J = 1/2 * sum(sum(((X * Theta' - Y) .* R) .^2));

>> J = J + lambda/2 * sum(sum(Theta .^2)) + lambda/2 * sum(sum(X .^2))

J =  31.344


(3) 정답


function [J, grad] = cofiCostFunc(params, Y, R, num_users, num_movies, ...

                                  num_features, lambda)

%COFICOSTFUNC 협업 필터링 비용 함수 

%   [J, grad] = COFICOSTFUNC(params, Y, R, num_users, num_movies, ...

%   num_features, lambda) 

%           협업 필터링 문제의 비용 J와 경사도를 반환 


% 언롤링된 파라미터 벡터 X와 Theta를 다시 원래  X와 Theta의 차원으로 재배열 

X = reshape(params(1:num_movies*num_features), num_movies, num_features);

Theta = reshape(params(num_movies*num_features+1:end), ...

          num_users, num_features);


            

% 변수 초기화 

J = 0;

X_grad = zeros(size(X));

Theta_grad = zeros(size(Theta));


% ====================== YOUR CODE HERE ======================

% Instructions: 

%          협업 필터링의 비용 함수와 기울기를 계산 비용 함수와 계산

%          우선, 정규화 항이 없는 비용 함수를 계산하고 예상 비용도 같은 지를 확인

%          다음, 기울기를 계산하고 기울기가 맞는지 checkCostFunction 루틴으로 확인

%          마지막으로, 정규화를 구현

                   

% Notes: 

            X : num_movies  x num_features.    : 영화 프로파일 행렬

%        Theta : num_users  x num_features: 사용자 프로파일 행렬 

%        Y : num_movies x num_users  : 사용자의 영화 평가 점수 행렬 

%        R : num_movies x num_users  : 사용자의 영화 평가 여부 행렬

%                                                              (R(i,j) = 1 이면 평가, 

%

% 다음 변수를 올바르게 선언하시오

%        X_grad : num_movies x num_features : X의 각 성분에 대한 편미분 행렬 

%        Theta_grad : num_users x num_features : Theta의 각 성분에 대한 편미분 행렬

%


%  Cost Function & Gradient

J = 1/2 * sum(sum(((X * Theta' - Y) .* R) .^2));


X_grad = ((X * Theta' - Y) .* R) * Theta;

Theta_grad = ((X * Theta' - Y) .* R)' * X;


% Regularized Cost Function

J = J + lambda/2 * sum(sum(Theta .^2)) + lambda/2 * sum(sum(X .^2));


% =============================================================


grad = [X_grad(:); Theta_grad(:)];


end




(4) 결과 확인


>> J = cofiCostFunc([X(:) ; Theta(:)], Y, R, num_users, num_movies, ...

               num_features, 1.5)

J =  31.344







2.2.4 Regularized gradient (정규화된 기울기)


   Now that you have implemented the regularized cost function, you should proceed to implement regularization for the gradient. You should add to your implementation in cofiCostFunc.m to return the regularized gradient by adding the contributions from the regularization terms. Note that the gradients for the regularized cost function is given by:



   This means that you just need to add λx(i) to the X grad(i,:) variable described earlier, and add λθ(j) to the Theta grad(j,:) variable described earlier.

   After you have completed the code to compute the gradients, the script ex8 cofi.m will run another gradient check (checkCostFunction) to numer- ically check the implementation of your gradients.

   You should now submit your solutions.


   정규화한 비용 함수를 구현하였고 이제  비용 함수의 기울기를 구현합니다. cofiCostFunc.m 파일은 정규화하지 않은 기울기가 있으므로 정규화 항을 추가한 값을 반환합니다. 정규화한 비용 함수의 기울기는 다음과 같습니다. 

  이 공식은  X_grad(i,:) 변수에 λx^(i)를 더하고, Theta_grad(j:1)에 λθ^(j)를 더한다는 것을 의미합니다. cofiCostFunc.m 파일에 기울기를 계산하는 코드를 완성합니다. ex8_cofi.m 파일은 checkCostFunction.m 파일을 실행하여 기울기 구현을 숫자로 확인합니다. 

   cofiCostFunc.m 파일 작성을 완료하면 제출합니다. 



<Part 5 : 협업 필터링 기울기 정규화 >

 

   (1) 정규화된 비용 J 계산하기


   비용과 기울기를 계산하는 cofiCostFunc.m 파일을 작성합니다. 파일을 호출할 때 영화 프로파일  X(:)과 사용자 프로파일 Theta(:)로 만든 벡터 param , 영화에 대한 사용자 평가 척도 Y, 영화에 대한 사용자 평가 여부 R, 총 사용자 수 num_users, 총 영화 수 num_movies, 총 피처 수 num_features, 그리고 정규화 파라미터 lambda를 전달합니다.


J = cofiCostFunc([X(:) ; Theta(:)], Y, R, num_users, num_movies,  num_features, 1.5);           


   정규화하지 않은 비용 함수 J를 계산할 때 정규화 파라미터 lambda의 값은 0을 사용하고, 정규화한 비용 함수 J를 계산할 때 정규화 파라미터 lambda의 값을 0 아닌 값을 사용합니다. 여기서는 lambda = 1.5입니다. 


   cofiCostFunc.m 파일은 비용 J를 반환합니다. 파일은 인공 신경망 때와 마찬가지로 데이터를 벡터 단위로 처리합니다. m X n 차원 행렬을 언롤링하여 벡터로 재배열합니다. 



(2) 정규화한 기울기 계산하기


%%% 정규화하지 않은 비용 함수 J를 계산하는 코드

X_grad = ((X * Theta' - Y) .* R) * Theta;

Theta_grad = ((X * Theta' - Y) .* R)' * X;


다음은 정규화한 비용 함수  J를 계산하는 공식입니다. 



   지난 실습에서 정규화하지 않은 비용 함수 J의 편미분 기울기를 작성했습니다.


X_grad = ((X * Theta' - Y) .* R) * Theta;

Theta_grad = ((X * Theta' - Y) .* R)' * X;


%%% 정규화한 비용 함수 J의 편미분 기울기를 계산하는 코드 : X_grad

lambda*X


   다음은 정규화한 비용 함수  J를 계산하는 공식입니다. 


   

   정규화하지 않은 비용 함수 J를 계산하는 코드에 뒤의 두 개항을 포함합니다. 정규화 항을 코드를 작성하기 위해서는 정규화 파라미터 lambda를 사용합니다. 


lambda = 1.5;


   X_grad의 정규화 항 코드를 작성합니다. 


>> X_grad = ((X * Theta' - Y) .* R) * Theta

X_grad =

  -2.52899   7.57570  -1.89979

  -0.56820   3.35265  -0.52340

  -0.83241   4.91163  -0.76678

  -0.38358   2.26334  -0.35334

  -0.80378   4.74272  -0.74041


>> lambda

lambda =  1.5000


>> X

X =

   1.048686  -0.400232   1.194119

   0.780851  -0.385626   0.521198

   0.641509  -0.547854  -0.083796

   0.453618  -0.800218   0.680481

   0.937538   0.106090   0.361953


>> lambda*X

ans =

   1.57303  -0.60035   1.79118

   1.17128  -0.57844   0.78180

   0.96226  -0.82178  -0.12569

   0.68043  -1.20033   1.02072

   1.40631   0.15913   0.54293


  X_grad와 정규화 항 lambda*X는 동일하게 5 X 3차원 행렬입니다. 




%%% 정규화한 비용 함수 J의 편미분 기울기를 계산하는 코드 : Theta_grad

lambda * Theta


>> Theta_grad = ((X * Theta' - Y) .* R)' * X

Theta_grad =


  -10.56802    4.62776   -7.16004

   -3.05099    1.16441   -3.47411

    0.00000    0.00000    0.00000

    0.00000    0.00000    0.00000


>> lambda

lambda =  1.5000


>> Theta

Theta =


   0.28544  -1.68427   0.26294

   0.50501  -0.45465   0.31746

  -0.43192  -0.47880   0.84671

   0.72860  -0.27189   0.32684


>> lambda * Theta

ans =

   0.42817  -2.52640   0.39441

   0.75752  -0.68197   0.47619

  -0.64787  -0.71821   1.27007

   1.09290  -0.40784   0.49027



%%% 정규화한 비용 함수 J의 편미분 기울기를 계산하는 코드

X_grad = ((X * Theta' - Y) .* R) * Theta;

Theta_grad = ((X * Theta' - Y) .* R)' * X;


X_grad = X_grad + lambda*X

Theta_grad = Theta_grad + lambda * Theta;


   정규화하지 않은 비용 함수 J의 편미분 기울기에 정규화 항을 추가하는 형식으로 코드를 작성합니다.  


>> Theta_grad = ((X * Theta' - Y) .* R)' * X

Theta_grad =

  -10.56802    4.62776   -7.16004

   -3.05099    1.16441   -3.47411

    0.00000    0.00000    0.00000

    0.00000    0.00000    0.00000


>> X_grad = X_grad + lambda*X

X_grad =


  -0.95596   6.97536  -0.10861

   0.60308   2.77421   0.25840

   0.12986   4.08985  -0.89247

   0.29684   1.06301   0.66738

   0.60253   4.90185  -0.19748


>> Theta_grad = Theta_grad + lambda * Theta

Theta_grad =


  -10.13985    2.10136   -6.76564

   -2.29347    0.48244   -2.99791

   -0.64787   -0.71821    1.27007

    1.09290   -0.40784    0.49027


(3) 정답


function [J, grad] = cofiCostFunc(params, Y, R, num_users, num_movies, ...

                                  num_features, lambda)

%COFICOSTFUNC 협업 필터링 비용 함수 

%   [J, grad] = COFICOSTFUNC(params, Y, R, num_users, num_movies, ...

%   num_features, lambda) 

%           협업 필터링 문제의 비용 J와 경사도를 반환 


% 언롤링된 파라미터 벡터 X와 Theta를 다시 원래  X와 Theta의 차원으로 재배열 

X = reshape(params(1:num_movies*num_features), num_movies, num_features);

Theta = reshape(params(num_movies*num_features+1:end), ...

          num_users, num_features);


            

% 변수 초기화 

J = 0;

X_grad = zeros(size(X));

Theta_grad = zeros(size(Theta));


% ====================== YOUR CODE HERE ======================

% Instructions: 

%          협업 필터링의 비용 함수와 기울기를 계산 비용 함수와 계산

%          우선, 정규화 항이 없는 비용 함수를 계산하고 예상 비용도 같은 지를 확인

%          다음, 기울기를 계산하고 기울기가 맞는지 checkCostFunction 루틴으로 확인

%          마지막으로, 정규화를 구현

                   

% Notes: 

            X : num_movies  x num_features.    : 영화 프로파일 행렬

%        Theta : num_users  x num_features: 사용자 프로파일 행렬 

%        Y : num_movies x num_users  : 사용자의 영화 평가 점수 행렬 

%        R : num_movies x num_users  : 사용자의 영화 평가 여부 행렬

%                                                              (R(i,j) = 1 이면 평가, 

%

% 다음 변수를 올바르게 선언하시오

%        X_grad : num_movies x num_features : X의 각 성분에 대한 편미분 행렬 

%        Theta_grad : num_users x num_features : Theta의 각 성분에 대한 편미분 행렬

%


%  Cost Function & Gradient

J = 1/2 * sum(sum(((X * Theta' - Y) .* R) .^2));


X_grad = ((X * Theta' - Y) .* R) * Theta;

Theta_grad = ((X * Theta' - Y) .* R)' * X;


% Regularized Cost Function

J = J + lambda/2 * sum(sum(Theta .^2)) + lambda/2 * sum(sum(X .^2));


X_grad = X_grad + lambda*X;

Theta_grad = Theta_grad + lambda * Theta;

% =============================================================


grad = [X_grad(:); Theta_grad(:)];


end


(4) checkCostFunction.m 파일로 기울기 값을 확인 


   checkCostFunction.m 파일은 기울기가 제대로 계산되었는 지를 확인합니다. 예전 실습에서 이미 다루었던 파일입니다. 임의의 행렬을 생성하여 cofiCostFunc.m 파일이 제대로 동작하는 지를 확인합니다. 


>> checkCostFunction(1.5);

  -2.36503  -2.36503

   0.99933   0.99933

   3.32403   3.32403

   0.81451   0.81451

  -4.96993  -4.96993

   0.70857   0.70857

   3.50315   3.50315

   1.20844   1.20844

  -5.22748  -5.22748

   0.14975   0.14975

   2.55984   2.55984

   1.21819   1.21819

   0.39245   0.39245

   0.21227   0.21227

  -0.69245  -0.69245

   3.22601   3.22601

  -1.15033  -1.15033

  -1.27502  -1.27502

   1.61309   1.61309

   0.45978   0.45978

   4.55450   4.55450

  -0.32123  -0.32123

   1.77810   1.77810

   1.47451   1.47451

  -0.80942  -0.80942

   4.36712   4.36712

  -0.81416  -0.81416

The above two columns you get should be very similar.

(Left-Your Numerical Gradient, Right-Analytical Gradient)


If your cost function implementation is correct, then

the relative difference will be small (less than 1e-9).


Relative Difference: 3.05491e-12


   이미 분석한 파일이므로 분석을 생략합니다.



(5) 결과 확인


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari