Representation/Lec.14

2021. 1. 9. 19:55딥러닝 강의 정리

우리가 네트워크를 만들고 훈련을 시키는 이유는 여러 training data들을 알맞게 분류를 시키기 위해서 이다. 아래처럼 말이다.

하지만 실제로는 이렇게 data들이 깔끔하게 분리되어있는 것이 아닌

이렇게 산발로 되어있다. 그리고 우리는 이상태를 분류해야 한다. 

 

아래의 예를 보자.

빨간색이 1이고 파란색이 0이라고 할때 linear한 선으로는 이 두가지 상태를 분리할 수 없다. 왜냐하면 이 것을 자세히 보면

이렇게 같은 x값을 가지는데 서로다른 y값을 가지는 data도 존재하기 때문이다. 이런 상황을 분리하기 위해 조건부확률을 가져왔다.

예를들어 전체중 1이 될 확률은 90/100인 것이다. 이를 수식으로 나타내면 가 된다. 하지만 위에서 모든 data들이 깔끔하게 떨어져있지 않다고 하였다. 실제로는 저 점들을 중심으로 미세한 noise가 끼어있을 것이다. 그렇다면 저렇게 조건부확률을 사용하면 각 x축마다 1개씩 값이 존재할 것임으로 가 1또는 0이 나와서

이런식으로 그래프가 형성될 것이다. 그래서 각 x축마다 조건부 확률을 쓰는 것이 아닌 어느정도의 범위를 잡고 확률을 사용한다.

그러면 맨 아래와 같은 결과 나올 것이다. 그리고 이는 sigmoid function의 모양이며 아래와 같다.

결국 우리가 그동안 사용했던 sigmoid는 input에 대한 조건부확률인 것이다. 여러개의 input이 들어와도 마찬가지이다. 다만 이번에는 모든 x에 대하여 weight와 bias를 곱한뒤 그것을 sigmoid에 넣는다.

위는 input이 들어왔을때 그것이 1일 확률을 나타내는 함수이다. 그렇다면 x가 들어왔을 때 y값을 가질 확률은 어떠할까? 그 식은 아래와 같다.

이를 이용해서 전체적인 model을 추정하는 법은 (X1,y1),(X2,y2)...의 N개의 training data가 들어왔을때(X는 벡터, y는 0 또는 1), 전체 data의 total probability는 아래와 같다.

각각의 data가 independent함으로 확률을 구해 곱하면 되는 것이다. 위의 결과를 bayes rule을 이용하면 아래와 같이 나타낼 수 있다.

그리고 여기에 로그를 취하면 아래의 식을 얻을 수 있다.

우리의 목표는 logP를 최대로 만드는 것이다. 그를 위해서는 wo와 w를 그 방향으로 이끌도록 만들어야 한다.

이는 결국 w0와 w1이 를 최소화해서 빼는 것을 줄여야 하는 것이다.

위의 log표현은 다시 생각해보면 one-hot representation으로 되어있는 라벨과 logistic function의 output을 가진 결과 사이에서 cross entrophy를 한것과 같다.

 

위에 오각형 두개를 classify하는 MLP를 살펴보자.

1번은 아래쪽 오각형을 담당하고(각각의 뉴런이 한줄씩 분리한다), 2번은 위쪽 오각형을 담당한다.

위에 결과가 y1, y2이고 이 y1과 y2를 노란색 뉴런이 분리한다. 이때 노란색 뉴런은 logistic function같은 것을 사용하며 y1과 y2를 linear하게 분리하게 된다. 즉 첫번째 layer에서 계산을 해서 2번째 layer에서 linearly separable하게 바꿔주는 것이다. 위는 물론 애초에 모델자체가 sufficient structure이다. 하지만 항상 이런 모델이 나오지는 못할 것이다. 그래도 최대한 linearly separable하게 만들어준다. 

 

이제 lower layer가 하는 일을 살펴보자. 맨위의 layer가 linearly separable하게 해주었다면 lower layer는 그것을 가능하게 만들어주는 역할을 한다. 즉 input에 가까운 layer일 수록 점점 linearly separable 할 수 없다. 그러나 계산을 통해 위에 layer로 올라갈수록 점점 linearly separable 해진다. 이것을 Manifold hypothesis라고 한다. 처음에 data는 곡선의 표면에 분포해 있다. 점점 계산을 거치며 layer가 올라갈 수록 그 곡선이 펴지고 맨 위에서는 manifold가 linearly separable 할 정도로 충분히 펴져서 linear classification이 가능하게 해준다. 아래는 그 예시이다.

2-3-1 뉴럴 네트워크인데 맨 처음에는 오른쪽 위에 그림처럼 생겼다. 이것을 네트워크에 넣으면 왼쪽 중간 그림처럼 rotated and shifted 되어서 3차원의 영역에 들어가게 된다. 3차원인 이유는 뉴런이 2번째 layer 3개이기 떄문이다. 그리고 마지막에는 왼쪽 아래처럼 일차원으로 들어가서 separable하게 된다. 

다차원도 마찬가지 이다. 처음에는 뒤죽박죽이다가 갈수록 linearly separable해지는 것을 볼 수 있다. 

 

지금까지는 완벽히 separable한 문제를 보았다면 이제는 노이즈가 약간 낀 문제를 확인해보자.

하지만 이 역시 완벽히는 아니더라도 마지막 layer에서는 최대한 linearly separable하게 만들어준다. 그리고 이때 맨 위에서 보았던 조건부 확률을 통해 분류가 된 정도를 확인한다. 이떄의 output은 P(y|x)이다. 

 

Lower layer를 살펴보자. 우선 기본적인 퍼셉트론의 구조는 아래와 같다.

여기서 weight의 역할은 input과 내적을 하여 threshold를 넘는다면 뉴런이 작동되고 아니면 작동이 안되는 것이다. 이를 다른 관점으로 본다면 아래 그림과 같다.

먼저 내적의 식을 써보자. 이면 뉴런이 작동하는 것이다. 이때 W를 1로 잡으면 인것이다. 여기서 θ는 w벡터와 x벡터의 사이각을 이야기하고 이 θ가 일정 크기보다 작다면 뉴런이 작동하는 것이다. 즉 위의 그림에서 원뿔이 있다면 w를 주변으로 x가 변하게 되고 사이각이 θ이내일 때 뉴런이 작동하며 그 범위가 저 원뿔이라고 할 수 있다. 다르게 얘기하면 x는 w가 될 수록 좋은 것이고 즉 w는 x가 가지고 싶어하는 canonical input이라고 할 수 있다. 

또한 이 퍼셉트론은 아래의 역할도 있다.

w가 검정색이고 x의 패턴이 2가지가 있다. 하나는 Correlation이 낮고 하나는 높다. 그리고 뉴런이 이 correlation이 높은 쪽을 작동시킨다. 즉 퍼셉트론은 correlation filter인 것이다. 다르게 생각하면 weight는 input이 뉴런에 들어와서 작동이 되는 모범 답안이라고 할 수 있다. 

이제 MLP를 다시 살펴보자.

여기서 첫번째 layer는 signal의 중요한 특징을 뽑아낸다. 따라서 우리가 더 많은 특징들을 찾아낼 수록 input에 대하여 더 많은 정보를 들고 있다는 것이다. 그리고 위 layer에서는 이러한 특징들을 뽑아내서 재 조합하는 것이다. 이런 재조합 과정에서 우리는 signal의 좀 더 복잡한 특징들을 찾아내게 되고 결국은 모든 특징을 뽑아내게 되는 것이다. 그 과정이 아래의 그림이다.

 

Autoencoder

뉴럴 네트워크가 input 자기자신을 예측하도록 훈련된 것을 autoencoder라고 한다. 두가지의 파트로 나누어지는데 encoder부분은 signal의 중요한 패턴들을 찾아내도록 훈련이 되고 decoder부분은 그 찾아낸 패턴들을 통해 signal을 재 조합하는 부분이다. 가장 간단한 autoencoder는 아래와 같다.

하나의 linear activation인 hidden unit으로 구성된 구조이다. 이것을 훈련시키는 과정은 X와 의 L2 divergence를 줄이는 방향으로 훈련을 시키는 것이다.

이것은 결국 PCA의 과정이랑 같다. PCA는 데이터들을 정사영 시켜 차원을 낮출때 데이터 구조를 잘 유지시키는 벡터를 찾는 것이다.

따라서 이렇게 퍼져있는 데이터를 저 파란색 선으로 모으는 것이다. 이에 대해서는 다음 블로그를 참고하면 정말 좋을 것같다. angeloyeo.github.io/2019/07/27/PCA.html

 

주성분 분석(PCA) - 공돌이의 수학정리노트

 

angeloyeo.github.io

즉 autoencoder는 maximum energy의 방향을 찾는 것이고 그 energy는 데이터가 퍼져있는 정도를 이야기한다. 이 과정을 거치면 모든 input vector들이 위의 과정으로 찾은 principal axis로 모이게 된다. 다시말하면 autoencoder는 input을 새로운 principal subspace로 모으는 것이고 그곳이 가장 적은 에러를 지니는 곳이다. 여기서 에러는 이다.

이렇게 subspace로 모이기도 한다. 

위에서는 linear activation을 사용하였는데 non-linear activation을 사용하여도 curved space로 모일 뿐 다른점은 없다.

그리고 이때 네트워크가 깊을 수록 좀더 복잡한 manifold를 얻어낼 수 있다. 

 

예시를 들어보면

encoder에서 hidden representation은 1개이다. 왼쪽 그래프는 그 hidden representation에서 나온 것이고 2차원의 input을 저 점들로 나타낸 것을 볼 수 있다. 오른쪽은 그것을 바탕으로 decoder에 넣어 output을 낸것인데 파란색 줄 위와 파란색 칠한 원부부은 왼쪽의 training에서 볼 수 없던 부분이다. 그래서 저렇게 외곡이 발생한 것이다.

위에 그림도 마찬가지로 빨간색 빗금친 부분은 encoder에서 보지 못했던 데이터이기때문에 외곡이 발생할 수 있는 것이다. 하지만 여기서는 비교적 잘 나타내었다. 

위에처럼 hidden representation이 input보다 차원이 낮다면 이것을 bottleneck network라고 부르기도 한다. 이것은 nonlinear PCA이며 잘 훈련이 되었따면 그 data의 manifold를 잘 알 수 있게 된다. 

하지만 위의 예시에서 보았듯이 decoder은 training data로 encoder에서 만들어낸 manifold 위에 data만 만들어낼 수 있다. 이는 다르게 생각하면 training data에 없는 data여도 있다는 것을 가정하고 최대한 비슷하게 만들어 낼 수 있다는 것이다. 

또한 decoder는 dictionary의 역할을 한다. encoder에서 만든 manifold를 사전이라고 하면 decoder에서는 그 사전의 일부분을 펴서 무언가를 만들어내는 것이다. 예를들어

색소폰 소리를 encoding한 autoencdoer에서 decoder는 그 hidden representation을 적절히 조합하여 다양한 색소폰의 소리를 만들어낼 수 있다. 이를 응용해

기타소리의 dictionary를 만들고 드럼소리의 dictionary를 만들어 두 소리를 합쳐 하나의 새로운 음악을 만들 수 있다. 

이렇게 두개의 네트워크를 weighted sum하여 그것의 loss function을 이용해

composing machine을 훈련 시킬 수 있다.