Search
Duplicate

Machine Learning/ 적용 사례

Recommender Systems

사용자 정보를 Matrix로 구성하여 사용자의 선호에 맞는 컨텐츠나 유사한 컨텐츠를 추천하는 추천 시스템.
이하 시스템에 대한 내용은 다음의 조건을 따른다.
사용자는 각각의 영화에 대해 1-5개의 별점을 줄 수 있음.
별점을 매기지 않았다면 ?로 표시
유저 수는 nun_{u}로 표기, 영화 수는 nmn_{m}으로 표기
유저 jj가 영화 ii에 대해 평점을 주었다면 r(i,j)=1r(i, j) = 1이라고 표기
rr 행렬은 별점을 주었는지 안 주었는지만 판별
유저 jj가 영화 ii에 부여한 별점은 y(i,j)y(i, j) 로 표기

Content Based Recommendations

사용자의 장르별 선호 정보를 이용해서 사용자의 특정 영화에 대한 선호를 예측하는 시스템.
장르별 선호는 어떻게 아느냐면 이 아래의 Collaboartive Filtering 참조
유저의 장르 선호와 영화의 장르 정보를 이용해서 사용자의 특정 영화에 대한 선호도를 예측하는 것은 선형 회귀 문제이다.
데이터가 행렬로 표현되어 있으므로 비용함수의 표현은 다음과 같다,
minθj=12i:r(i,j)=1((θ(j))Tx(i)y(i,j))2+λ2k=1n(θk(j))2\min_{\theta^j} = \frac{1}{2} \sum_{i:r(i,j)=1} ( (\theta^{(j)})^T x^{(i)} - y^{(i,j)} )^2 + \frac{\lambda}{2} \sum_{k=1}^{n} (\theta_k^{(j)})^2
위 식은 한 명의 유저에 대한 것이므로 전체 유저에 대해 계산하면 식은 다음과 같다.
min(θ1...θnu)=12j=1nui:r(i,j)=1((θ(j))Tx(i)y(i,j))2+λ2j=1nuk=1n(θk(j))2\min_{(\theta^1 ... \theta^{n_u})} = \frac{1}{2} \sum_{j=1}^{n_u} \sum_{i:r(i,j)=1} ( (\theta^{(j)})^T x^{(i)} - y^{(i,j)} )^2 + \frac{\lambda}{2} \sum_{j=1}^{n_u} \sum_{k=1}^{n} (\theta_k^{(j)})^2
위 식에 따른 Gradient Descent는 아래와 같다.
k=0k = 0인 경우
θk(j):=θk(j)αi:r(i,j)=1((θ(j))Tx(i)y(i,j))xk(i)\theta_k^{(j)} := \theta_k^{(j)} - \alpha \sum_{i:r(i,j)=1} ((\theta^{(j)})^T x^{(i)} - y^{(i,j)}) x_k^{(i)}
k>0k > 0인 경우
θk(j):=θk(j)α(i:r(i,j)=1((θ(j))Tx(i)y(i,j))xk(i)+λθk(j))\theta_k^{(j)} := \theta_k^{(j)} - \alpha ( \sum_{i:r(i,j)=1} ((\theta^{(j)})^T x^{(i)} - y^{(i,j)}) x_k^{(i)} + \lambda \theta_k^{(j)} )

Collaborative Filtering

Content Based Recommendations이 사용자의 선호와 영화 정보가 있을 때 사용자의 영화 선호를 예측하는 것이었다면 Collaborative Filtering은 사용자의 선호를 바탕으로 영화의 장르를 예측하는 시스템.
사실 아는 변수와 알고자 하는 변수가 다를 뿐이기 때문에 계산식 자체는 비슷한데, 정규화 할 때 적용하는 부분만 다르다.
하나의 xx에 대한 식
minxj=12i:r(i,j)=1((θ(j))Tx(i)y(i,j))2+λ2k=1n(xk(j))2\min_{x^j} = \frac{1}{2} \sum_{i:r(i,j)=1} ( (\theta^{(j)})^T x^{(i)} - y^{(i,j)} )^2 + \frac{\lambda}{2} \sum_{k=1}^{n} (x_k^{(j)})^2
모든 xx에 대한 식
min(x1...xnu)=12j=1nui:r(i,j)=1((θ(j))Tx(i)y(i,j))2+λ2j=1nuk=1n(xk(j))2\min_{(x^1 ... x^{n_u})} = \frac{1}{2} \sum_{j=1}^{n_u} \sum_{i:r(i,j)=1} ( (\theta^{(j)})^T x^{(i)} - y^{(i,j)} )^2 + \frac{\lambda}{2} \sum_{j=1}^{n_u} \sum_{k=1}^{n} (x_k^{(j)})^2
xx가 주어졌을 때 θ\theta를 알고자 할 때는 정규화 부분에 θ\theta를 적용하고, 반대로 θ\theta가 주어졌을 때 xx를 알고자 할 때는 정규화 부분에 xx를 적용한다.

Collaborative Filtering Algorithm

xx를 이용해서 θ\theta를 구하는 방법이 있고, θ\theta를 이용해서 xx를 구하는 방법이 있다는 것은 이 둘을 하나로 합치면 xx와 θ\theta를 모두 구할 수 있다는 뜻이다.
xx와 θ\theta를 작은 값으로 초기화 한 후 Content Based Recommendations와 Collaborative Filtering을 번갈아 돌리면 된다.
그런데 이 둘을 아예 하나의 식으로 합치는 것도 가능하다. 둘의 식이 비슷하기 때문에 그대로 합치면 된다.
min(x1...xnu,θ1...θnu)=12j=1nui:r(i,j)=1((θ(j))Tx(i)y(i,j))2+λ2j=1nuk=1n(xk(j))2+λ2j=1nuk=1n(θk(j))2\min_{(x^1 ... x^{n_u}, \theta^1 ... \theta^{n_u})} = \frac{1}{2} \sum_{j=1}^{n_u} \sum_{i:r(i,j)=1} ( (\theta^{(j)})^T x^{(i)} - y^{(i,j)} )^2 + \frac{\lambda}{2} \sum_{j=1}^{n_u} \sum_{k=1}^{n} (x_k^{(j)})^2 + \frac{\lambda}{2} \sum_{j=1}^{n_u} \sum_{k=1}^{n} (\theta_k^{(j)})^2

Low Rank Matrix Factorization

유저별 영화 평점을 행렬로 표현하고 그것을 YY라고 한다면, 선형회귀에서 풀었던 것처럼 YY를 두 벡터 θ\thetaxx의 곱으로 표현할 수 있다.
위 이미지 오른쪽 행렬 참조
이때 전체 행렬에서 xx를 뽑아내서 XX 벡터를 만들면 위 이미지의 왼쪽 아래의 모양과 같은 벡터가 되고,
(xnm)T(x^{n}m)^{T}로 이루어진 벡터
θ\theta만 뽑아내서 Θ\Theta 벡터를 만들면, 위 이미지의 오른쪽 아래 모양과 같은 벡터가 된다.
(θnu)T(\theta^{n}u)^{T}로 이루어진 벡터
XX와 Θ\ThetaYY를 표현하면 다음과 같다.
Y=XΘTY = X \Theta^T
이렇게 정리된 정보를 이용하면 두 영화 사이의 유사도를 예측할 수 있는데, 두 영화에 대한 점수를 바탕으로 거리를 측정하면 된다.
minimizexixjminimize ||x^i - x^j ||
추가 팁으로 전체 값에 대해 Mean Normalization –데이터 분포가 원점을 중심으로 하도록 이동– 을 하는데, 이는 평가 점수가 0인 것과 점수를 평가 안한 것을 구분하기 위함.

Photo OCR

사진에서 글자를 읽어내는 것에 대한 사례. 실제 OCR은 좀 더 복잡하고 일정 부분에 대해서만 설명한다.

Algorithm

사진에서 글자를 읽어 내는 것은 한번에 하는게 아니라 여러 단계를 거쳐 진행한다. 간단하게 그 프로세스를 정리하면 다음과 같다.
Text Detection
사진에서 글자를 판별해 내는 단계
Character Segmentation
판별된 글자를 Character 단위로 쪼개는 단계
Character Classification
쪼갠 Character를 실제 인식하는 단계
Character를 인식할 때는 Sliding Window라는 단계를 거친다.
문자 뿐만 아니라 사진에서 사람을 알아내는 것도 같은 방법을 거친다.
Character의 일반적인 width, height의 비율을 이용해서 적당한 크기의 박스를 만들고 그 박스를 1px, 2px 정도로 쭉 움직이면서 –이래서 Sliding Window라고 한다– 해당 박스 안에 글자라 들어오는지 아닌지를 판별한다.
적당한 크기로 쭉 돌고, 사이즈를 키워서 다시 돌고, 다시 사이즈를 조절해서 돌고 하는 식으로 이미지에서 글자를 검출해 낸다.
글자를 검출해 낸 후에는 다시 1차원 박스를 이용해 글자 사이의 여백을 찾아 개별 글자를 분류해 낸다.
1차원 Sliding Window
https://www.coursera.org/learn/machine-learning/
개별 단위까지 분류된 글자는 최종적으로 Classification을 통해 글자로 인식한다.

Aritificial data synthesis

Classification을 잘 하려면 수많은 데이터로 학습이 필요하다. 많은 데이터를 수집하는 것도 가능하긴 하지만, 비용이 많이 들기 때문에, 수집한 데이터에 변형이나 노이즈를 가해 학습용 데이터를 만들어 내는 것도 가능하다.
이미지라면 포토샵 작업을 해도 되고, 사운드라면 노이즈를 심어도 된다.
이러한 작업을 Aritificial data synthesis라고 한다.

Ceiling analysis

각 파이프라인에 대해 Ceiling Analysis를 해볼 수 있다.
(사실 모든 영역이 마찬가지지)
각 단계별로 최종 정확도를 측정하여 각 파이프라인 별로 효율을 측정할 수 있으며, 이를 통해 비용대비 효율을 계산하여 불필요한 자원의 낭비를 피할 수 있다.
노력을 들여도 큰 개선이 이뤄지기 어려운 부분에는 헛수고 할 필요 없다.