반응형

 

 

Lecture 14 - Expectation-Maximization Algorithms | Stanford CS229: Machine Learning (Autumn 2018)

 

 

주요내용

  • Unsupervised Learning(비지도 학습)
    • K-means Clustering
    • Mixture of Gaussian: Gaussian Mixture Model (GMM)
    • EM (Expectation-Maximization)
    • Derivation of EM

 

비지도 학습은 이전까지 배웠던 지도학습과 다른 학습 방법입니다. 예를 들면 지도학습은 긍정 데이터와 부정 데이터들이 주어지고 이들을 잘 분류하는 선형 회귀 모델 같은 것을 만들어서 잘 분류하는 회귀선을 만드는 것이었습니다. 그러나 비지도 학습은 레이블이 없는 데이터들이 주어지고, 지도학습에서는 (x, y)가 주어졌지만 비지도 학습에서는 x 만 제공됩니다. 이런 데이터 셋은 {x(1), x(2), ....x(m)} 으로 주어진 x 데이터 m개를 표현할 수 있습니다. 

 

K-means Clustering

첫번째로 이야기할 비지도 학습은 클러스터링 입니다.  x 데이터가 주어지면 두개 또는 그 이상의 그룹으로 묶는 알고리즘 입니다. 가장 많이 사용되는 클러스터링은 시장 구분(Market Segmentation)입니다. 예를 들면 사용자들을 클러스터링하여 어떤 다른 시장으로 그룹핑할 수 있는지 알 수 있습니다. 고객의 나이, 성별, 교육, 지역 등을 가지고 클러스터링 하여 다른 그룹으로 만들 수 있습니다. 

위와 같은 데이터 셋이 제공되면 2개의 그룹으로 클러스터링 하기를 원할 것입니다. k-means의 경우 임의로 클러스터 갯수에 해당하는 위치를 선정하고 

 

데이터 별로 두개의 중심점 중에서 어느 중심점에 더 가까운지를 기준으로 클러스터(색)를 정합니다.

 

두 번째로는 파란색 점들의 평균을 구해서 새로운 중심점으로 정합니다.  

 

그리고는 새로 정해진 중심점을 기준으로 모든 점들에 대해서 다시 어느 중심점이 더 가까운지 비교하여 새로운 클러스터를 할당합니다.

 

그리고 다시 새롭게 할당된 클러스터의 중심점을 구합니다.

 

 이런 클러스터를 할당하고 새로운 중심점을 구하는 동작을 반복하다 보면 특정 지역에 중심점이 수렴하게 됩니다.

 

이런 알고리즘을 k-means 알고리즘이라고 합니다.

레이블 되지 않은 Data x 가 주어졌을 때 알고리즘은 아래와 같습니다. 1. 먼저 중심점을 초기화 합니다. k 갯수 만큼의 중심점의 초기 값을 정하는 것인데 보통 random 값으로 잡지 않고 실제 Data x 값들 중에서 k 개를 임으로 선택합니다. 

 

 

비용함수를 공식으로 적어보면 아래와 같습니다. c는 각 점들을 의미하고, u 뮤는 중심점을 의미 합니다. 각 x 값과 중심점과의 차이를 모두 더한 값으로 반복할 수록 작은 값으로 수렴하게 됩니다. 아주 많은 데이터를 가지고 이 알고리즘을 돌리다보면 아래의 그래프 처럼 수렴하기 전에라도 어느 정도 중심점이 변하지 않으면 종료하기도 합니다.

 

k-means 클러스터링과 관련해서 가장 많이 받는 질문은 어떻게 k 값을 정하는가? 입니다.  메트릭이 있기는 하지만 잘 쓰지는 않습니다. 보는 사람마다 다르게 판단할 수 있기 때문에 모호합니다.

2가 맞을 까요 4가 맞을까요?

오히려 목적에 맞게 k를 정하는 것을 권합니다. 예를 들어 마케팅을 위해 마켓 세그멘테이션이 필요하고 이를 위해 클러스터링을 한다고 했을때, 그룹핑을 4개로 할 수도 있고 100개로 도 할 수 있지만 업무적으로 프로모션을 위한 그룹 설계가 4개로 준비되어 있을 경우 4개로 그룹핑하여 제공해야 실무에서 마케팅에 사용할 수 있습니다.

k-means 알고리즘은 로컬 미니멈에 빠질 수 있습니다. 이 말은 초기 중심점 값을 어떻게 정하냐에 따라서 알고리즘을 실행할 때마다 다르게 그룹핑 될 수 있다는 의미입니다. 이런 로컬 미니멈에 빠지는 것을 방지하는 방법중 하나는 여러번 알고리즘을 실행 시키고 나서 비용함수의 값이 제일 작은 결과로 정해진 클러스터 결정을 선택하는 것입니다.

 

 

Density estimation

비행기 엔진을 만드는 공장에서 만들어진 엔진의 불량을 탐지하는 모델을 만든다고 생각해 보시죠. 시험 테스트 중에 나온 데이터인 진동 Vibration과 발열 Heat을 가지고 그래프를 만들었을 때 아래와 같이 그려진다고 하겠습니다. 이 때 녹색 점과 같은 데이터를 만들어낸 비행기 엔진의 경우 이상 탐지(Anomaly Detection)으로 탐지 할 수 있습니다.

 

그러나 아래와 같이 분포가 간단하지 않은 경우 그룹핑을 하기 매우 어렵습니다. 이럴때 아래쪽에 있는 두개의 타원형 형태의 가우시안 분포와 이 타원형의 왼쪽에 연결된 또 다른 두개의 타원형 형태의 가우시안 분포, 즉 2개의 가우시안 분포로 전체 분포를 설명할 수 있습니다.

 

1차원 가우시안 분포를 예를 들어 보겠습니다. 아래와 같이 X 데이터가 주어졌을 때 이것은 2개의 가우시안 분포에서 왔을 수 있습니다. 그리고 이번 예시의 경우 두 개의 분포를 연결하면 중앙 부분은 확률이 낮아지는 부분으로 구성된 하나의 분포 곡선을 그릴 수 있습니다. (아래쪽 쌍봉 곡선)

 

Mixture of Gaussians Model: Gaussian Mixture Model (GMM)

이러한 방법으로 여러개의 다변량 분포가 혼합되어 있는 경우 어느 분포에서 추출될 가능성이 높은지를 알 수 있습니다.

latent 는 hidden 또는 unobserved의 의미 입니다. z는 랜덤 변수값이고 다중 분포일때 z ㅌ {1, ... k} , x(i), z(i)는 결합 분포를 가지고 있습니다. 이 것은 P(x(i), z(i)) = P(x(i) | z(i)) P(z(i)) 로 계산됩니다. 

일반적으로 GDA Gaussian Distribution Analysis 는 2개의 분포, 즉 베르누이 분포를 말하지만 여기에서는 k개의 분포를 가지는 다형성의 파이를 갖습니다. 이 것이 첫번째로 GDA와 다른 것이고 두번째는 j분포 갯수의 차이 입니다. z(i)가 j번째 가우시안 분포에서 나왔을때 x(i)가 나올 확률은 평균이 uj 이고 분산이 시그마j 인 정규분포에서 나올 확률과 같습니다.  GDA와 가장 큰 차이점은 GDA는 데이터 y(i)가 관측된 값으로 주어진다는 것입니다. 

 

 

만약 우리가 z(i)의 값들을 알고 있다면 MLE를 사용할 수 있습니다. 그때 가능도는 아래와 같이 구할 수 있습니다.

 

 

EM (Expectation-Maximization)

EM은 관측되지 않는 잠재변수에 의존하는 확률 모델에서 최대가능도(maximum likelihood)나 최대사후확률(maximum a posteriori, 약자 MAP)을 갖는 모수의 추정값을 찾는 반복적인 알고리즘을 말합니다. (위키피디아)

첫번째 E-step은 아래와 같습니다. 우리는 실제 z(i) 값을 모르기 때문에 주어진 값들을 이용해서 기대값을 찾는 단계입니다. 여기서 z(i)란 x(i)가 뽑힐 수 있는 특정 정규분포 j를 말합니다.

 

두번째 단계는 M-step 입니다. 앞에서 찾은 기대값을 최대로하는 모수 값을 찾습니다.

이러한 단계를 거처 기대값을 최대로 하는, 여러개의 분포가 합쳐지는 하나의 분포 곡선을 만들 수 있습니다. 이러한 곡선은 아래처럼 다양합니다.  이로써 찾은 함수를 통해 입력값 x를  실행했을때 결과 확률값이 특정 기준(입실론) 보다 크거나 같으면 정상적인 데이터이고 확률값이 작으면 이상탐지(Anomaly)로 판단할 수 있습니다.

 

 

 

 

 

Derivation of EM

이후 아래는 EM의 공식을 유도하는 내용입니다.

Jensen's inequality

함수 f를 아래로 볼록한 함수(Convex function)이라고 하고 x를 임의의 값이라고 할때, 공식 f(EX) <= E[f(x)] 를 만족합니다.

 

 

 

 

우리는 젠슨의 불균형 공식을 위로 볼록한 Concave 함수로 사용합니다. Concave 함수는 Convex 함수와 위/아래가 바뀐 함수이지요. 그럴 경우 위에서 설명한 모든 부등식을 반대로 바꾸면 됩니다.

임의의 녹색 theta세타 값을 먼저 설정합니다. 이 값에 해당하는 함수곡선(녹색)을 만들고 이 함수와 목표 함수(검정색)가 만나는 점을 찾고 이 녹색 함수의 꼭지점을 찾습니다. 그리고 이 꼭지점으로 이동합니다. 이 꼭지점에 해당하는 theta값으로 변경 후 다시 함수를 찾습니다. 이러한 내용을 반복하면 검정색의 목표 함수의 지역 최대값(꼭지점)에 점점 가깝게 됩니다. 그러나 아래 그림의 오른쪽 처럼 목표함수가 여러개의 지역 최대값을 가지고 있는 경우 전체 최대값을 찾지 못할 수도 있습니다.

 

아래는 이러한 E, M 단계를 공식으로 풀이 증명하는 내용입니다.

 

위 공식의 변형에 필요한 기본 전제 공식은 아래와 같습니다.

 

 

 

 

 

 

아래는 강의 동영상 링크 입니다.

https://www.youtube.com/watch?v=rVfZHWTwXSA&list=PLoROMvodv4rMiGQp3WXShtMGgzqpfVfbU&index=14 

 

 

반응형
반응형

Lecture 8 - Data Splits, Models & Cross-Validation | Stanford CS229: Machine Learning (Autumn 2018)

 

 

주요내용

  • Bias/ Variance
  • Regularization 정규화
  • Train/dev/test splits
  • Model selection & Cross validation

 

 

 

Bias/ Variance

이전 강의에서 예를 들었던 주택 사이즈별 가격 데이터를 가지고 이야기 해 보겠습니다. 같은 데이터를 가지고 아래와 같이 3가지의 모델을 만들 수 있습니다. 왼쪽은 언더피팅(underfit)된 1차원 모델의 High bias 그래프이고 가운데는 적당한 2차원 모델, 오른쪽에는 다중 선형모델로 오버피팅(Overfitting)된 모델의 High Variance 그래프 입니다.

 

 

 

Regularization 정규화

아래는 로지스틱 회귀 공식 입니다. - 부호 뒤의 람다|| ||^2가 Regularization 내용입니다. 이 변수를 통해 곡선의 구부러진 정도를 조정할 수 있습니다.

 

λ람다에 따른 곡선의 변화를 보면 아래와 같습니다. λ가 아주크면 0에 가까워지는 군요.

 

SVM의 경우 수많은 변수를 세타함수를 통해서 만들어 사용하는 데(고차원 매핑) 왜 오버피팅이 되지 않을 까요? 그것은 - λ||θ||^2 와 같은 역할을 하는 것이 SVM에서는 minimize ||w||^2 때문에 결국 같은 효과 즉 오버피팅을 막는 효과가 있습니다.

 

나이브 베이즈의 예를 들어 보겠습니다. 전 시간에 예를든 스팸 분류기도 좋고 트위터 데이터에 대한 감성분석도 좋습니다. 이러한 분류 문제를 다룬다고 할때 특히 이렇게 피처는 많고(10,000) 예제 데이터는 적을때(100)는 로지스틱 회귀에 정규화 Normalization 을 추가하여 개발한 모델의 성능이 나이브 베이즈 보다 좋습니다. 정규화를 이용하지 않으면 오버피팅되기 때문에 성능이 좋지 않습니다.   보통은 피처가 예제 데이터 보다 10배이상 크면 정규화를 이용합니다.

정리하면 

 

Frequentist와 Bayesian 학자들 사이의 차이점에 대해서 설명합니다. Frquentist는 MLE를 구하고 베이지안 학자는 MAP(Maximization A Posteriori)를 구합니다.

 

 

 

y축은 에러율, x 축은 모델의 복잡도를 기준으로 그래프를 그려보면 아래와 같습니다.  일반적인 그래프는 모델 복잡도가 낮으면 언더핏되고 모델 복잡도가 높아질 수록 점점 에러가 줄어들게 됩니다. 그러다가 중간이 지나면 다시 에러율이 상승하는데 이렇게 상승된 상태의 모델을 오버피팅된 모델이라고 합니다.  곡선이 위로 꺽기기 시작하는 중간지점이 가장 좋은 모델 복잡도를 가진(에러가 가장 낮은) 모델입니다.

 

여기에 정규화(Normalization)을 위해 λ를 사용할 경우 λ크기에 따라 에러의 변화를 만들 수 있습니다. λ가 너무 크면 제일 왼쪽 처럼 언더피팅되고 λ를 0으로 설정하면 (정규화를 안하면) 오른쪽 처럼 오버피팅됩니다. 적당한 λ값을 설정해주면 중간에 가장 에러가 낮을때를 만들 수 있습니다.

 

 

 

 

Train/dev/test splits

일반적으로 트레인/개발/테스트로 나눕니다. 트레인/검증/테스트(Train/Validation/Test) 로도 불립니다. 10,000 개의 example 데이터가 있을 경우 모델의 복잡도를 하나씩 높여가면서 결과를 보고, 또는 람다 값 등 변수들을 조정하면서, 그리고 정규화를 적용해 보면서 모델을 만듭니다.

 

 

이때 데이터셋(S)를 train용 dev용, test용 으로 분리합니다. dev 는 development를 말합니다.

각각의 모델을 S(train) 테레인 데이터를 가지고 훈련하여 적당한 하이퍼파라메타를 찾습니다.  

옵션으로 논문 페이퍼를 위한 내용 필요시 테스트 데이터를 가지고 사용합니다. 이전에는 한번도 사용되지 않은 데이터 입니다.

 

 

degree를 높여가면서 S(dev)개발용 데이터를 이용한 에러가 아래 왼쪽처럼 감소하다가 증가하는 degree가 나옵니다. 보기에는 4.9에러가 나온 degree의 모델을 사용하면 될 것 같은데 자세히 보면 그전, 그리고 전전 에러율이 5.0, 5.1로 큰 차이가 없습니다. 이러한 경우에 실제 모델 degree의 차이때문에 생긴 에러 차이가 아니라 바이어스나 모델의 다른 변수에 의한 것일 수 있습니다. S(test)로 측정해서 선택하도록 합니다.

 

예전에는 대부분 데이터 셋(S)은 아래처럼 70%와 30%로 나누거나 60%, 20%, 20%로 나누었습니다.  그런데 예제 데이터가 10,000,000개 있을 경우 6:2:2로 분리하는 것이 좋을까요? 정말 test 데이터가 2,000,000개 필요한지 생각해 봐야합니다. 온라인 추천이라든가 매우 작은 소수점아래 자리까지 고려하는 경우에는 많은 test 데이터가 필요합니다. 그러나 다른 업무에서는 이렇게 많이 필요하지 않을 수 있습니다. 데이터가 충분히 많이 있다면 90%:5%:5%로 나누는 것이 좋습니다. 그리고 여기에 원하는 정확도의 차이(0.01%까지 고려해야하는지 0.0001%까지 고려해야하는지) 에 따라서 dev/test 수를 조정하면 됩니다.

 

 

 

 

Model selection & Cross validation

이처럼 데이터를 트레인/데브/테스트로 분리하는 것을 (Simple) Hold-out cross validation 이라고 합니다. 그리고 dev set은 Cross Validation Set 이라고도 불립니다.

그럼 데이터 셋이 작은 경우에는 어떻게 할까요?  예를 들면 m=100 개 셈플이 있다면 70개를 훈련에 30개를 개발(검증)에 써야합니다. 훈련과 검증에 너무 작은 수 입니다. 

 

이러한 경우 K-fold Cross Validation을 이용합니다. k는 임의 의 숫자인데 통상적으로 10을 씁니다. 여기서는 설명을 위해 5로 합니다. 전체 데이터셋(S)를 K로 나눈 숫자만큼의 덩어리로 만들어서 , k번 반복하는 동안 한번에 한 덩어리 데이터를 가지고 훈련하는 방법입니다. K 번 훈련해서 나온 에러를 평균해서 하나의 degree(복잡도, 하이퍼 파라메터)에서의 에러율을 구합니다. 이런 절차를 degree 숫자만큼 반복하면서 진행하면 어느 degree에서 가장 작은 에러가 발생하는 지 알수있습니다. (측, 최적의 degree모델을 찾을 수 있습니다.) 데이터를 가지고 1번의 훈련과 검증이 가능 했던 것을 k 번 반복할 수 있게되어서 훈련을 더 잘할 수 있습니다. 알고리즘은 아래의 오른쪽에 나와있습니다.

옵션으로 해도되고 안해도 되는데, 이렇게 해서 선택하게된 degree의 모델을 가지고 전체 100% 훈련데이터를 가지고 훈련해서 모델을 만들 수 있습니다.

이러한 Cross Validation 은 특히 적은 데이터를 가지고 있을때 유용합니다.

 

Leave-one-out Cross Validation

훈련 데이터의 개수가 아주 적을 때(100보다 같거나 작을 경우) Leave-one-out Cross Validation을 쓰면 좋습니다.  예를 들어 훈련 데이터가 20개(m=20)일 경우의 예를 들면 데이터들을 아주 작게 즉 1개 단위로 사용할 수 있게 분리해서 사용 하는 방법입니다. 즉, 20개로 분리하고 19개를 훈련에 사용하고 1개로 검증하고, 전에 사용했던 훈련 데이터중 하나를 검증으로 사용하고 나머지를 모두 훈련데이터로 사용하는 방법입니다. 이렇게 하면 모델의 훈련과 검증을 20번 할 수 있습니다. 컴퓨팅에 많은 비용이 소모되므로 데이터가 많을 경우는 사용하지 않습니다. 말씀 드린 대로 100개 이하인 경우만 사용을 권장합니다.  

 

 

 

Feature Selection

피처 선택(Feature Selection)은 여러 개의 피처 중에서 성능에 많은 영향을 미치는 피처들을 찾는 것을 말합니다. 전방 피처 선택(Forward Feature Selection)과 후방 피처 선택(Backward Feature Selection) 방법이 있습니다. 전방 피처 선택의 예를 들면 5개의 피처가 있다고 가정할 때 가장 영향력이 큰 피처를 하나씩 추가해 가는 방법입니다. 아래의 경우 x2가 제일 중요한 피처라고 발견된 경우 x2는 고정하고 추가로 x2와 x1, x2와 x3, x2와 x4, x2와 x5 처럼 x2피처에 하나의 피처를 추가할 경우 어떤 피처가 가장 영향력이 큰지를 찾는 방법입니다.  이러한 방법으로 하나씩 피처를 선택해나가는 방법이 전방 피처 선택법(Forward Feature Selection)입니다.

반응형
반응형


스탠포드 머신러닝 강의 1:20 / 1:20:24Lecture 7 - Kernels | Stanford CS229: Machine Learning (Autumn 2018)

주요내용

  • Optimization Problem
  • Representer Theorem
  • Kernels (SVM)
  • Examples of Kernels (SVM)


Recap

지난 시간에 배웠던 내용을 정리합니다. Optimal margin classifier를 설명합니다.



감마를 최대화하는 w와 b를 구하면 됩니다. 이말은 모든 예제가 구해지면 감마보다 큰 지오매트릭 마진을 같는다는 의미 입니다. 모든 셈플을 잘 분리한다는 말이지요. (반대로 이말은 아웃라이어가 있을때 민감하게 반응한다는 단점이 있습니다. 이것을 어떻게 해결하는지는 뒤에서 설명합니다.)


w와 b에 일정한 값을 곱해도 같은 직선이라는 것을 설명합니다.



Gradient Descent 를 설명합니다.



w는 경계선의 기울어짐을 결정하고 b는 경계선의 수직방향으로의 이동 정도를 결정합니다.


이 내용을 3차원에서 설명해보면 아래와 같습니다. 3차원에서는 2차원에서의 선이 평면으로 나타납니다. 아래 예시에서 w는 평면의 각도를 결정합니다. w3이 0 이라서 수직이 되었네요.


w를 구하기 위한 상세 공식 유도를 아래와 같이 설명합니다.

24:34



Kernel Trick 커널 트릭

커널 트릭은 아래와 같습니다.
1) 커널은 이너프러덕으로 계산된다
2) 피처 x가 2개든, 3개든 얼마든지 매핑 함수를 통해 100,000 또는 수억개의 피처로 만들 수 있다. (아래 그림의 오른쪽 내용)
3) 2)에서 매핑된 변수(Φ(x))들과 z 함수(Φ(z))들을 계산하는 방법을 찾는다.
4) 알고리즘에 있는 <x, z> 를 k<x, z> 로 바꾼다.
이말을 합처보면 고차원 매핑(2)과 내적(3)을 하는 것이 커널 입니다.



커널의 예를 들어 보겠습니다.
x 는 아래와 같습니다.


그러면 아래와 같이 x를 고차원으로 매핑시킨 Φ(x)와 여러변수의 Φ(z)를 만들 수 있습니다. : 여기에서 매핑함수 Φ() 는 R^(n^2)로 정의했기 때문에 3개의 변수(x1, x2, x3)가 9개의 변수(x1,x1, x1,x2, ...)로 변경되었습니다. 이를 계산하기 위해서는 O(n^2)의 시간이 필요합니다.


더 좋은 방법을 생각해 보겠습니다. 아래 그림의 제일 위에 있는 공식 처럼 k(x,z) 를 다른 계산 방법으로 바꿀 수 있습니다. 즉, 함수를 거치지 않고 두 행렬의 곱으로 계산할 수 있습니다. 아래는 (x^Tz)^2가 Φ(x)^T Φ(z)와 같음을 증명하는 내용입니다. (x^Tz)^2 를 두개로 나누어서 () () 이렇게 만들었고 아래 처럼 쭉 따라서 가다보니 결국 (빨간색/녹색 동그라미처럼 두 항목을 곱한 값을 더한다는 것과 같은데...이말은 결국 제일 위줄 공식의 가운데에 있는 Φ(x)^T Φ(z)와 같은 결과이기 때문에 두 공식이 같음이 증명됩니다.
속도는 둘다 R^n 행렬이기 때문에 T 트렌스포즈하고 곱을 하면 O(n) 시간만 있으면 계산이 됩니다.


다시말하면 결국 Φ(x)의 한 행의 내용(빨간 동그라미)과 Φ(z)의 한 행의 내용(녹색 동그라미)을 곱해서 합친 것이 (x^Tz)^2와 같습니다.


여기에 상수 c를 추가해도 역시 소요시간은 O(n) 입니다. Φ(x)는 n+d 중에 d개의 피처를 갖을 수 있는데 최대 d의 깊이를 가질 수 있습니다. 그래서 d=5라면 아래와 같이 x1, x2, x3, x12, x29 도 될수 있고 x1, x2^2, x2,x18 도 될 수 있습니다. 이것은 (n+d)^d 와 비슷합니다.


SVM을 정의 하면
Optimal margin classifier + Kernel Trick = Support Vector Machine
이 됩니다.
이말은 적은 데이터로 많은 피처들을 만들어서 아주 효율적으로 계산해서 효과적으로 분류하는 모델을 만들게 됨을 의미합니다. SVM이 다른 말로 커널인줄 알았는데 조금 다른 것이 이었네요.
아래의 영상을 통해 SVM이 어떻게 동작하는 지 이해를 높일 수 있습니다.
https://www.youtube.com/watch?v=3liCbRZPrZA



여러 차원에 있던 데이터들을 잘 분리하는 하이퍼플레인(평면)이 있는데 이런 그래프를 2차원 으로 축소하면 하이퍼블레인(평면)이 선으로 바뀌어 표시됩니다. 그대신 직선이 아닌 구불구불한 선이 될 수 있습니다. 이러한 2차원 결과를 보여주는 것이 아래 그림 입니다. 이해되시나요. 위의 동영상을 보셨다면 이해가 되실 것 같습니다.




자, 이제 커널을 만드는 방법에 대해서 이야기 합니다. 여러 가정/조건이 있습니다. x, z가 비슷하면 커널함수 k(x,z)의 결과가 커야하고, 반대로 다르면 함수의 결과가 작아야 합니다. 이것은 벡터의 성질과 동일합니다. 이러한 조건을 만족하는 함수중하나가 아래의 공식입니다.


또다른 조건은 지금까지 맞다고 가정했던 공식인 k(x,z) = Φ(x)^T Φ(z) 입니다. 그리고 k(x,x) = Φ(x)^T Φ(x) >= 0 입니다. x1 부터 xd까지의 값을 가진 d 포인트가 있다고 합니다. 이때 K(커널행렬)은 R^(d*d) 입니다. 요소의 표시는 K(sub ij) = k(x(i), x(j)) 로 표시합니다.


그래서 벡터 z가 주어졌을때 커널과 계산 공식을 유도해보면 결국 K가 0보다 크거나 같습니다.


이것은 머서이론 (Mercer Theorem)과 같습니다.


그래서 앞서 커널을 만드는 방법을 설명할때 조건과 이에 적합한 예시를 들었던 아래의 커널함수는 유효함을 알수 있고 이것은 가장 많이 쓰이는 가우시안 커널입니다.


그 밖에도 선형 커널이 있는데 이는 선형함수와 같은 결과를 나타냅니다.


커널 트릭 중 이너프러덕은 다른 모델에서도 많이 쓰이는 방법입니다. < x(i), x(j) >


아래와 같이 2차원에 그래프를 그렸을때 빨간색과 같이 모든 것을 잘 분리하는 모델을 만들고 싶지 않을 것입니다. 왜냐하면 실제 추론 시에는 이렇게 할경우 더 안좋은 성능을 내기 때문입니다. 즉, 훈련데이터에 오버피팅 되어서 실제 추론시에는 성능이 낮아지는 것입니다. Variance가 커지겠네요. 그래서 빨간색 분리선보다는, 이상한 자리에 있는 값들은 잘 못 분리하더라도 파란색 분리선처럼 만들고 싶을 것입니다.



이렇게 하기 위해서 정규화를 할 수 있습니다. L1 놈/노름 소프트 마진 SVM 입니다. 오차 c를 이용하여 분리선과 오차거리를 고려해서 분리하게 됩니다.



L1 놈/노름 소프트 마진 SVM을 쓰는 다른 이유는 아웃라이어 하나만 들어와도 많이 다른 분리선을 만들기 때문에 이를 방지하기 위해 L1 norm soft margin SVM을 쓰는 것이 좋습니다. 옵티마이저가 최악의 케이스도 분리/포함하도록 되었는 경우 이와 같은 문제가 있습니다. 녹색 x 하나 만으로 기존에 파란색 선에서 녹색선처럼 많은 각도가 변경됩니다.


가우시안 커널의 성능도 매우 좋은데 MNIST와 같은 이미지 데이터에 대한 분류에서도 높은 성능을 냅니다. 0과 1의 픽셀 정보를 이용해서 하나의 벡터로 만들어서 SVM의 입력으로 넣고 분류하면 됩니다. SVM은 때로는 딥러닝 보다 좋은 성능을 낼때도 있으며 턴키 알고리즘으로 쉽게 만들 수 있습니다.



Examples of Kernels (SVM)

프로틴 시퀀스 분리 모델의 예시입니다. A부터 Z로 표시되는 원소로 구성된 프로틴의 아미노산 유무를 가지고 프로틴의 기능을 분리하는 모델을 만든다고 가정 합니다. 실제로는 20개인데 알파벳을 이용해서 이해를 쉽게하기 위해 26개를 이용합니다. 왼쪽에 시퀀스에서 등장한 4개의 문자를 오른쪽 피처 4개의 문자와 같으면 그 갯수를 누적하여 표시합니다. BAJT는 왼쪽에서 두번 나와서 오른쪽에 2로 표시됬습니다. 이렇게 해서 Φ(x)를 만들고 k(x,x)를 가우시안 커널을 이용하여 만들어 적용하면 됩니다.



SUMMARY

정리하면 SVM은 커널트릭과 최적의 마진 분리를 이용하는 분류 알고리즘 입니다. 커널 트릭은 입력 데이터를 다차원 데이터로 매핑/변환 하는 함수 Φ(x)와 그 결과와 커널함수 k(x,z) 결과의 행렬을 가지고 분류 모델을 만듭니다. 이러한 결과에 정규화 L1 norm soft margin SVM을 이용하고 오차 c를 추가하여 아웃라이어에 강한 분류 모델을 만듭니다. 최적의 마진 분리는 Geometric margin 지오메트릭 마진은 경계선을 근접한 요소와의 거리를 기준으로 경계선을 나누눈 방법입니다. SVM은 턴키 알고리즘으로 쉽게 개발/활용할 수 있을 뿐만 아니라 초기 딥러닝 모델 만큼이나 성능이 좋아서 지금도 많이 쓰입니다.



아래는 강의 영상 링크 입니다.
https://www.youtube.com/watch?v=8NYoQiRANpg&list=PLoROMvodv4rMiGQp3WXShtMGgzqpfVfbU&index=7


반응형
반응형

 

주요 내용

    1. 개요
    2. TF-IDF 계산 해보기
    3. TF-IDF의 장점 및 단점

 

1. 개요

TF-IDF 는 BoW(Bag of Words)와 마찬가지로 텍스트 데이터를 (컴퓨터에서 사용하기 위해) 표현하는 방법중 한가지 방법 입니다. 정보 검색과 텍스트 마이닝에 많이 쓰입니다. 특히, 이 방법은 단어의 출현 빈도를 가지고 단어의 중요도를 표현하는 방법입니다. 그래서 해당 문서에서의 단어 출현 횟수와 다른 전체 문서에서의 출현 횟수를 고려해서 중요도를 계산합니다. 해당 문서에서의 단어 출현 횟수는 많으면 많을 수록 단어의 중요도가 더 높아지고(Term Frequency), 다른 전체 문서에서의 출현 횟수가 많아지면 많아 질수록(다른 문서에서도 많이 쓰이면 쓰일 수록) 중요도가 떨어지게하는(Inverse Document Frequency) 숫자를 만드는 방법 입니다.
예를 들어 보겠습니다. '노란 사자 왕' 이란 검색어와 가장 적절한 문서를 찾으려면 어떻게 해야할 까요? 가장 간단한 방법은 각 단어가 포함되어 있는 문서를 찾는 것일 것입니다. 그런데 이런 문서가 10,000개 있다면 어떻게 해야 할까요? 네, 여러번 '노란', '사자', '왕' 이란 단어가 들어가 있으면 더 적절한 문서라고 할 수 있을 것 같습니다. 그런데 이렇게 해서 다시 필터링해보니 100건이 나왔다고 합시다. 여러번 나왔으니 더 적절한 문서라고 할 수 있지만 문서의 길이를 고려하지 못해서 전체 문서에서의 단어 중요도가 반영되지 못했습니다. 1페이지 문서에서 10번 나온 것과 100페이지 문서에서 10번 나왔다면 1페이지에서 10번 나온 문서가 더 밀접한 관계가 있다고 말할 수 있습니다. 그래서 문서의 길이를 고려한 출현 횟수를 산정하는 방법이 바로 Term Frequency 입니다. 그래서 간단한 공식으로는 단어 출현횟수/ 문서내 전체 단어수가 되겠습니다.
그럼 두번째 전체 문서에서의 출현 횟수 왜 필요할까요? 문서중에는 의미가 없는 단어들도 매우 많습니다. 행태소 분석시 나오는 '는', '를', 'ㅂ니다' 같은 요소들은 의미는 없지만 일반적으로 매우 많이 출현하는 단어에 해당합니다. 이러한 단어들에게는 매우 작은 값으로 계산되는 것이 필요하겠습니다. 그러면 이런 숫자는 어떻게 계산할까요? 위에서 설명한 것처럼 모든 문서에서 나타나면 안 중요한 단어이고 해당문서에서만 나타나면 중요한 단어인 것이지요. 이렇게 만들려면 전체 문서수와 해당 단어가 나타난 문서수의 비율로 계산할 수 있겠습니다. 전체 문서수 / 해당 단어 출현 문서수 이렇게 계산하면 되겠군요. 100 개 문서중에 1번 나타난 단어(100/1=100)와 100개 문서중에 10번 나타난 단어(100/10=10)는 중요도가 달라집니다. 그런데 이렇게 하면 전체 문서와 단어 출현 문서수가 클 경우 중요도 차이가 너무 크게 됩니다. 그래서 여기에 log 를 적용하여 숫자를 작게 만듭니다. log(100) = 2, log(10) = 1. 아까는 차이가 9였는데 이제는 1이 되었네요. 그래서 간단한 공식으로는 log(전체 문서수/해당 단어 출현 문서수)가 됩니다. 이것이 Inverse Document Frequency입니다.
그런데 다른 자료들을 보면 계산하는 방법이 이렇게 간단하지 않고 복잡하고, 방법도 여러가지가 있는 걸까요? 그 이유는 좀더 정확한 계산을 위해서 단순한 출현 횟수를 그대로 사용하지 않고 변환을 하기 때문에 그렇습니다. 위에서 log를 적용한 것처럼 말이죠. 중요한 것은 기본을 이해하는 것 입니다. 기본을 이해해야 변형을 이해하기 쉽습니다. 기본은 위에서 말씀 드린 것 처럼 어렵지 않습니다.

큰 숫자에 대응하기 위해 log를 사용하고 분모/분자가 0이 되면 안되므로 문서가 없을 때를 대비해서 분모/분자에 1을 더해줍니다. 그래서, TF-IDF의 공식은 아래와 같습니다.
 
해당 단어의 TF-IDF = Term Frequency X Inverse Document Frequency
해당 단어의 TF-IDF = TF(t,d) X IDF(t, D)
해당 단어의 TF(t,d) = log (f(t,d) + 1)
해당 단어의 IDF(t, D) = log (D / ( {d in D : t in d} ) + 1) )
t: 해당 단어
d: 해당 문서
D: 전체 문서 개수

 

 

2. TF-IDF 계산 해보기

 

위에서 말씀드린 공식을 이용해서 실제 TF-IDF 값을 계산해 보겠습니다.

 

Data

아래와 같은 데이터를 가정하겠습니다.

총 문서 데이터 개수, D = 10

각 문서 별 내용
d1 = I love apple"
d2 = I love peach
d3 = I love lion"
d4 = “You love lemon”
d5 = “Youlove horse"
d6 = “Youlove lion”
d7 = “We love tiger"
d8 = “We hate apple
d9 = “We hate banana"
d10 = “They hate peach

 

 

d1의 tf-idf 구하기

문서 d1에 대하여 TF-IDF를 구합니다. ln은 자연로그 입니다.

t = “I” d1 = “I love apple"
tf(t,d) = tf(“I”,d1) = ln (1 + 1) = 0.6931 (count 로 할때, 문서 d에서 t가 발견되는 건수)
idf(t, D) = log (D / {d in D : t in d} ) = ln(10 / (3 + 1)). = ln(2.5) = 0.9162 10개 문서중 3개 문서에서 I 가 발견됨
“I” tfidf = tf(“I”,d1) * idf(“I", 10) = ln(2) * ln(2.5) = 0.6931 * 0.9162 = 0.6350 ("I"의 TF-IDF입니다.)

t = “love” d1 = “I love apple"
tf(t,d) = tf(“love”,d1) = ln (1 + 1) = 0.6931 (count 로 할때, 문서 d에서 t가 발견되는 건수)
idf(t, D) = log (D / {d in D : t in d} ) = ln(10 / (7 + 1) ) = ln(1.25) = 0.22314 10개 문서중 7개 문서에서 love 가 발견됨니다.
“love” tfidf = tf(“love”,d1) * idf(“love", 10). = ln(2) * ln(1.25) = 0.6931 * 0.22314 = 0.15466 (love라는 단어가 많은(7개) 문서에서 나타나기 때문에 tfidf 값이 비교적 작습니다. 단어가 주는 차별성/특성이 작다고 할 수 있습니다.)

t = “apple” d1 = “I love apple"
tf(t,d) = tf(“apple”,d1) = ln (1 + 1) = 0.6931 (count 로 할때, 문서 d에서 t가 발견되는 건수)
idf(t, D) = log (D / {d in D : t in d} ) = ln(10 / (2 + 1) ) = ln(3.3333) = 1.2039 10개 문서중 2개 문서에서 apple 가 발견됩니다.
“apple” tfidf = tf(“apple”,d1) * idf(“apple", 10). = ln(2) * ln(2.4285) = 0.6931 * 1.2039 = 0.8344 (apple라는 단어가 적은(2개) 문서에서 나타나기 때문에 tfidf 값이 비교적 큽니다. )

d1 = “I love apple” = [0.6350, 0.15466, 0.8344]
 
 

d2의 tf-idf 구하기

t = “I” d2 = “I love peach”
tf(t,d) = 0.6931
idf(t, D) = 0.9162
“I” tfidf = 0.6931 * 0.9162 = 0.6350

t = “love” d2 = “I love peach”
tf(t,d) = 0.6931
idf(t, D) = 0.22314
“peach” tfidf = 0.6931 * 0.22314 = 0.15466

t = “peach” d2 = “I love peach”
tf(t,d) = tf(“peach”,d1) = ln (1 + 1) = 0.6931 (count 로 할때, 문서 d에서 t가 발견되는 건수)
idf(t, D) = log (D / {d in D : t in d} ) = ln(10 / (2 + 1) ) = ln(3.3333) = 1.2039 10개 문서중 2개 문서에서 peach 가 발견됩니다.
“peach” tfidf = tf * idf = 0.6931 * 1.2039 = 0.8344

d2 = “I love peach” = [0.6350, 0.15466, 0.8344]
 
 

d10의 tf-idf 구하기

t = “They” d10 = “They hate peach”
tf(t,d) = tf(“They”,d10) = ln (1 + 1) = 0.6931 (count 로 할때, 문서 d에서 t가 발견되는 건수)
idf(t, D) = log (D / {d in D : t in d} ) = ln(10 / (1 + 1)). = ln(5) = 1.6094 10개 문서중 1개 문서에서 They 가 발견됨
“They” tfidf = tf(“They”,d10) * idf(“They", 10) = ln(2) * ln(2.5) = 0.6931 * 1.6094 = 1.1154 (They라는 단어가 하나의 문서에서 나타나기 때문에 tfidf 값이 매우 큽니다. )

t = “hate” d10 = “They hate peach”
tf(t,d) = tf(“hate”,d1) = ln (1 + 1) = 0.6931 (count 로 할때, 문서 d에서 t가 발견되는 건수)
idf(t, D) = log (D / {d in D : t in d} ) = ln(10 / (3 + 1) ) = ln(2.5) = 0.9162 10개 문서중 3개 문서에서 hate 가 발견됨
“hate” tfidf = tf(“hate”,d1) * idf(“hate", 10). = ln(2) * ln(1.25) = 0.6931 * 0.9162 = 0.6350 (hate라는 단어가 적은 문서(3)에서 나타나기 때문에 tfidf 값이 비교적 큽니다. )

t = “peach” d10 = “They hate peach”
tf(t,d) = tf(“peach”,d1) = ln (1 + 1) = 0.6931 (count 로 할때, 문서 d에서 t가 발견되는 건수)
idf(t, D) = log (D / {d in D : t in d} ) = ln(10 / (2 + 1) ) = ln(3.3333) = 1.2039 10개 문서중 2개 문서에서 peach 가 발견됩니다
“peach” tfidf = tf(“peach”,d1) * idf(“peach", 10). = ln(2) * ln(2.4285) = 0.6931 * 1.2039 = 0.8344 (peach라는 단어가 적은(2개) 문서에서 나타나기 때문에 tfidf 값이 비교적 큽니다. )

d10 = “They hate peach” = [1.1154, 0.7614, 0.8344]
 
 

Summary

d1   = “I love apple”       = [0.6350, 0.1546, 0.8344]
d2   = I love peach”       = [0.6350, 0.1546, 0.8344]
d10 = “They hate peach” = [1.1154, 0.63500.8344]
 

각 문서별 벡터를 가지고 TF-IDF 메트릭스를 만듭니다.

word
d1
d2
d10
i
0.6350
0.6350
0
love
0.1546
0.1546
0
apple
0.8344
0
0
they
0
0
1.1154
hate
0
0
0.6350
peach
0
0.8344
0.8344
 
 
 

문서 간의 유사도 계산

d1 d2유사도 = (0.6350 * 0.6350) + (0.1546*0.1546) + (0.8344*0+ (0*0.8344) = 0.42712616
d1 d10 유사도 = (0.6350 * 0) + (0.1546*0+ (0.8344*0+ (0*1.1154) + (0*0.7614+ (0*1.1154) = 0
d2 d10 유사도 = (0.6350 * 0) + (0.1546*0+ (0.8344*0.8344)  = 0.6962
해석: 3개의 문서중에는 d2과 d10이 가장 유사하고, d1과 d10은 완전히 다른 문서이다.

상기와 같이 문서간의 유사도 계산 뿐만아니라 키워드(검색어)를 가지고 유사도를 계산하면 유사한 문서를 가져오는 정보 검색에 사용할 수 있습니다.

 

 

 

3. TF-IDF의 장점 및 단점

 1. 위 예시에 행렬 테이블에서도 보이는 바와 같이 0이 많이 들어있는 행렬 테이블이 만들어져서 문서의 길이가 길고 중복된 단어가 적을 수록 더 비효율 적입니다. sparce matrix (many number of 0 value)
2. 간단하게 단어의 개수로 표현되어 구현이 쉽지만 단어 위치의 의미를 파악하지는 못합니다. 문서 d1에 있는 i 와 문서  d10에 있는 hate 가 다른 단어 임에도 불구하고 같은 값 0.6350을 갖습니다. simple count of words, not present meaning of position(‘i' in d1 and ‘hate' in d10 have same value, 0.6350)
3. TF-IDF 메트릭스(행렬)에 없는 새로운 단어가 들어오면 계산할 수 없습니다. cold start, new words come, need new matrix(‘happy’?...) 이러한 부작용을 줄이기 위해 BoW(Bag of Words)에서와 마찬 가지로 더미 워드나, hashing 기법 등을 이용할 수 있습니다.

 

 
 
 
 
이렇게 정보검색과 텍스트 마이닝에 많이 쓰이는 단어의 중요도 표현 방법중 하나인 TF-IDF에 대해서 알아보고 실제로 계산을 해보았으며, 장점과 단점에 대해서도 이야기해 보았습니다.
 
 

 

 
 
반응형

+ Recent posts