TigerCow.Door


안녕하세요.

이번 포스팅에서는 Neural Network에서도 가장 재밌고, 꽃이라고 하는 Recurrent Neural Network(RNN)에 대해서 알아보도록 하겠습니다.



1. Sequence(or Series) Data


우리가 사용하는 데이터들 중에서는 sequence data들이 매우 많이 있습니다.

예를 들어, 우리가 이야기하는 자연어에서도 단순히 하나의 단어에 대해서만 이해해서 전체적인 이해를 할 수 있는 것이 아니라, 그전에 이야기했던 단어들을 모두 이해해야 합니다. 이러한 데이터를 sequence data라고 합니다.


이전의 NN이나 CNN등 에서는 하나의 입력, x에 대해서 출력 y를 나타내는 간단한 형태였기 때문에 시리즈 데이터인, x0, x1, ..., xt등의 데이터를 처리하기 힘들었습니다.


그래서 이러한 시리즈 데이터를 처리하기 위해서 다음과 같은 모델이 고안되었습니다.



즉, 입력값에 대해서 현재의 state가 다음의 state에 영향을 미치는 것입니다.

이를 좀 더 펼쳐서 살펴보면 다음과 같습니다.


실제로는 우측과 같이 구현되는데, 위에서 언급한 바와 같이, x0 를 통해 계산된 것이 x1이 계산될때 영향을 미칩니다.

이러한 모델은 시리즈 데이터들을 다루는데 매우 효과적입니다.



2. Recurrent Neural Network


즉, 이러한 모델을 RNN(Recurrent Neural Network)라고 합니다.

이러한 모델은 어떻게 계산하는 것일까요?


RNN에서는 state라는 개념이 존재하는데, state를 계산하기 위해, 그 전에 있던 old state가 사용되고 입력값 x가 사용됩니다.

그리고 여기서 사용되는 함수, f는 전체적으로 동일합니다.


좀 더 구체적으로 값을 계산하는 방법에 대해서 알아보겠습니다.

가장 기초적으로는 Vanilla RNN입니다.


우리가 그동안 다뤘던 WX 와 같은 형태처럼, 입력값 h_(t-1)에 대해서 W_(hh)*h_(t-1)로 계산되고, x_t에 대해서는 W_(xh)*x_t와 같이 계산됩니다. 그리고 sigmoid와 비슷한 tanh에 두 값을 더해서 넣어줍니다.

그리고 결과값 yt에 대해서는 W_(hy)*h_t로 계산합니다.

이때 y가 몇개의 벡터로 나올 것인가는 우리가 설정하는 W에 따라서 결정됩니다.



3. Recurrent Networks



위에서 알아본 RNN은 매우 다양하게 활용될 수 있습니다.

위의 그림을 보시면, 첫번째는 우리가 그동안 다루었던 단순한 Neural Network같은 것으로부터 시작해, Image Captioning에서 이용되는 one to many 형태도 있으며, Sentiment Classification으로써 여러개의 단어를 통해 감정을 예측하는 등으로 활용되는 many to one, 그리고 many to many의 형태가 있습니다.


블로그 이미지

Tigercow.Door

Web Programming / Back-end / Database / AI / Algorithm / DeepLearning / etc

댓글을 달아 주세요


안녕하세요. 문범우입니다.

지난 포스팅에서 CNN에 대해서 알아보았습니다.

이번 포스팅에서는 이어서, CNN에서의 pooling과 나머지 것들에 대해서 알아보도록 하겠습니다.


1. Pooling



Convolution Neural Network의 전체적인 구조를 위의 그림과 같이 확인해보면, Convolution과 RELU가 붙어져 있으며 중간에 한번씩 POOL을 하게 됩니다.


이때 진행되는 POOL이라는 것이 무엇인가 알아보도록 하겠습니다.


pooling이라는 것을 먼저 간단히 생각해본다면, sampling이라고 생각하면 됩니다.

우리가 입력 이미지에 대해서 위의 그림과 같이 convolution layer를 만드는데, 여기서 하나의 layer만 뽑아내고 이를 resize하는 과정을 pooling이라고 합니다.

복잡한 것이 아니고, 하나의 예를 들어서 pooling을 진행해보도록 하겠습니다.


pooling에서도 많이 사용되는 max pooling은 아래 사진과 같이 진행됩니다.


pooling에서는 우리가 지난 포스팅에서 알아보았던 filter라는 개념이 다시 사용되는데, 위의 사진과 같이, 2x2 형태의 필터를 이용하며, 이때 stride는 2로 설정하였습니다.

그럼 필터에서 어떠한 값을 어떻게 추출할 것인지가 문제가 됩니다.

이때 위에서 말했듯, max pooling을 사용하면 그림의 오른쪽과 같이 나오게 됩니다.


이런식으로 처리하는 것이 pooling입니다.



2. Others



정리를 해보자면, 지난 포스팅에서 배운 Convolution 을 통해 나온 벡터 값을 RELU 함수에 입력하고, 그 과정 중간에 위에서 배운 pooling과정을 진행하여 resize하는 방법을 진행합니다. 물론 layer를 어떻게 설정하느냐는 모델을 만드는 여러분의 몫입니다.

그리고 마지막 과정에서 보통 pooling을 진행하는데, 예를 들어 pooling을 통해 3x3x10의 형태로 결과가 나왔다면 이것을 x 값으로 하여 일반적인 Neural network를 구성하면 됩니다.

블로그 이미지

Tigercow.Door

Web Programming / Back-end / Database / AI / Algorithm / DeepLearning / etc

댓글을 달아 주세요


안녕하세요. 문범우입니다.

이번 포스팅에서는 dropout과 model ensemble에 대해서 살펴보도록 하겠습니다.



1. Dropout


우리가 dropout을 하는 이유는 바로 아래와 같은 overfitting 때문입니다.



우리가 과거에 알아봤던 것처럼, 훈련 data에 있어서는 100%의 accuracy를 내지만, 실제로 test data에 있어서는 높은 예측율을 내지 못하게 되는 현상이죠.



위와 같이, 파란색 그래프, training 에서는 에러율이 점점 낮아지지만, 실제로 빨간색 그래프처럼 test data를 통해 확인해보니 어느 시점부터 에러율이 더 증가하게 됩니다.


이러한 overfitting은 우리가 더 깊게 만들수록 일어날 확률이 커집니다.

왜냐하면 더 깊어질수록 더 많은 변수가 생기기 때문입니다.


그럼 이를 해결하기 위해서는 무슨 방법이 있을까요?


첫번째로는, 더 많은 데이터를 훈련시키는 것입니다.

또는 feature를 줄여주는 방법도 있을 것입니다.

그리고 우리가 예전에 간단히 알아봤던, Regularization 이라는 방법이 있습니다.



우리가 예전에 알아봤던 것처럼, 위의 식과 같이 처리함으로써 Regularization을 하는 L2regularization도 있습니다.


그리고 Neural Network에서는 또다른, dropout이라는 방법이 있습니다.

dropout이란 쉽게 말해서, 위 그림에서 왼쪽 그림과 같은 모델에서 몇개의 연결을 끊어서, 즉 몇개의 노드를 죽이고 남은 노드들을 통해서만 훈련을 하는 것입니다.

이때 죽이는, 쉬게하는 노드들을 랜덤하게 선택합니다.




쉽게 말해 각 노드들을 어떤 전문가라고 생각해본다면 랜덤하게 몇명은 쉬게하고 나머지만 일하게 합니다. 

그리고 마지막에는 모든 전문가들을 총 동원해서 예측을 하게 합니다.


이러한 아이디어가 dropout 입니다.


실제로 텐서플로우에서 구현하기에도 어렵지 않게 가능합니다.

우리가 원래 만들었던 layer를 dropout함수에 넣어서, 몇 퍼센트의 노드가 일하게 할 것인지 함께 적어줍니다.

위의 코드를 보면 Train에서는 0.7, 즉 70%의 노드들이 랜덤하게 훈련되게 하였습니다.

그리고 실수하면 안되는 점이 Evaluation 과정에서는 dropout_rate를 1로 함으로써 100%의 노드들을 참가시키도록 해야 합니다.



2. Ensemble



우리가 추후, 학습시킬 수 있는 장비가 많을때 사용할 수 있는 또 하나의 방법도 있습니다.

Ensemble이라고 하는 것인데, 위와 같이 여러개의 독립적인 모델을 만듭니다. 이때 훈련 데이터셋은 별도로 해도 되고, 모두 같은 훈련 데이터셋을 이용해도 상관 없습니다.

이때 각 모델의 초기값이 서로 다르기때문에 결과도 약간씩 다를 것입니다.

그리고 이후에 독립적인 모델들을 모두 합쳐서 한번에 예측을 하게 합니다.

즉, 이것은 전문가 한명에게 어떤 질문을 하는 것이 아니고 서로 독립적인 전문가 다수를 모아두고 질문을 하는 것과 같습니다.


실제로 Ensembel을 이용하면 2%~5%까지도 예측율이 올라간다고 합니다.


블로그 이미지

Tigercow.Door

Web Programming / Back-end / Database / AI / Algorithm / DeepLearning / etc

댓글을 달아 주세요


안녕하세요. 문범우입니다.

이번에는 지난 포스팅에 이어서 딥러닝을 잘하는 방법 중 weight의 초기값을 설정하는 방법에 대해서 알아보도록 하겠습니다.



1. RBM(Restricted Belief Machine)


우리가 지난 포스팅에서 위의 그림과 같은 Vanishing gradient 문제에 대해서 알아보았습니다.

그리고 이 문제에 대해서는 Hilton 교수님께서는 4가지 이유를 꼬집었습니다.


위의 4가지 항목중 제일 아래에 있는 것은 우리가 지난 포스팅에서 sigmoid함수 대신, ReLU함수를 사용함으로써 해결할 수 있었습니다.

하지만 하이라이트 된 것과 같이 또 다른 문제도 있었습니다.


이전의 테스트에서도 아래와 같이, 같은 ReLU함수를 사용했음해도 불구하고 cost가 초반에 다르게 변화하는 것을 볼 수 있습니다.


이러한 현상이 발생하는 이유는 우리가 테스트를 할때, 초기값을 랜덤하게 지정해서 발생한 현상입니다.


그럼, 이런 초기값에 대해서 좀 더 자세히 살펴보도록 하겠습니다.

단적으로 초기값을 0으로 설정해보면 어떨까요?

그럼, 위와 같은 그림에서 W를 0으로 둔것이고, 이것이 chain rule에서 사용됩니다. 그럼 x = df/dg * W 이므로 x = 0이 되고, 그 앞에 있는 것들도 모두 0이되면서 gradient가 사라져 버립니다.


따라서, 절대로 초기값으로 0을 주면 안된다는 것을 알 수 있습니다.

그럼 초기값을 어떻게 주어져야 할까요?


이에 대해 2006년 Hilton교수님께서 논문을 쓰시면서 RBM(Restricted Boatman Machine)을 사용함으로써 해결하게 됩니다.

그리고 이러한 RBM을 사용한 네트워크를 DBN(Deep Belief Networks)라고 합니다.


어떻게 동작되는 것 일까요?


먼저, 입력을 재생산 해냅니다.


위의 그림과 같이, 입력값을 weight와 곱해서 b값을 얻어냅니다. 또한 b 유닛아래에 있는 것들에 대해서도 같은 방법을 통해서 값을 얻습니다. 이러한 과정을 Forward 라고 합니다.



그리고, Backward 방법으로, 우리가 얻은 값들과 weight를 통해 위의 그림에서의 b 값을 얻습니다.

그럼 우리가 처음에 입력한 값을 x라고 한다면, x와 b의 값의 차이가 존재할텐데 이 차이가 최소가 될 때까지 weight를 조절합니다.


이렇게 해서 weight를 구하는 것을 RBM이라고 합니다.

그리고 위와 같은 방법을 encoder/decoder라고도 합니다.


실제로 이것을 네트워크 상에서 적용시키기 위해서는 아래와 같은 과정을 가집니다.

여러개의 레이어가 있을때, 입력값 측의 레이어부터 시작하여 layer 1과 layer 2를 encoder/decoder를 수행하고, 이후에 layer2 와 layer3에 대해 수행하며 끝까지 나아가는 방법입니다.


이제 이러한 과정을 통해 각 weight를 구할 수 있고, 그것을 학습시킨다, training한다는 표현보다는 fine tunning 이라는 표현을 사용합니다.

학습하는 것보다 훨씬 더 빨리 진행되는 작업이기 때문이죠.

이러한 fine tunning이 끝나게 되면 이후 우리가 학습시키고자 하는 데이터들에 대해서 label을 붙여서 실제로 training을 진행합니다.



2. Xavier initalize




그런데 실제로 이것을 구현하는데 있어서는 복잡한 과정이 있을 수 있습니다.

하지만 좋은 소식은, 2010년에 발표된 논문에서 우리가 굳이 RBM을 쓰지 않아도, 좋은 초기값을 얻을 수 있다는 Xavier initialize라는 알고리즘이 나왔습니다.


이는 입력의 노드의 개수에 비례해서 초기값을 세팅하면 된다는 식의 알고리즘 입니다.


이를 식으로 간단히 살펴보면, 우리가 좋은 값, 좋은 weight를 얻기 위해서 입력값의 개수 fan_in 과 출력 값의 개수 fan_out을 이용하여 초기값을 주는 것입니다. 이러한 식을 통해 어쩌면 RBM보다 더 좋은 결과를 가질 수 있다고 합니다.


블로그 이미지

Tigercow.Door

Web Programming / Back-end / Database / AI / Algorithm / DeepLearning / etc

댓글을 달아 주세요



안녕하세요. 문범우입니다.

이번 포스팅에서는 딥러닝의 기본 개념으로써 딥러닝의 시작과 XOR문제, 그리고 '딥'의 출현에 대해서 이야기 해보도록 하겠습니다.



1. 딥러닝의 시작



많은 과학자들은 인간이 고민하고 어려워 하는 문제들에 대해서 기계가 해결시켜주기를 바랬습니다.

그리고 그 시작으로 먼저 인간의 뇌를 분석하기 시작했습니다.



그리고 분석된 뇌에 대해서 수학적으로 식을 세우고, 풀어냈습니다.


이를 간단히 하여 위와 같은 그림으로 나타내게 되었습니다.

지난 포스팅들에서도 확인했던 그림들입니다.

그리고 이러한 구조를 직접 하드웨어를 통해 만들기도 하였습니다.

57년도에 Frank 박사님께서 하드웨어로써 이를 구성하기도 하면서 많은 사람들이 이에 대한 꿈을 꾸기 시작했습니다.

그리고 58년도에 NewYork Times에는 이러한 기계들이 스스로 학습하며 보고, 듣고, 말하고, 심지어 스스로를 인지한다는 말까지 하게 되었습니다.

이러한 상황은 역시나 많은 사람들의 관심을 갖게되는 시작이 되었습니다.


그 시작으로 x1과 x2에 대해서 AND와 OR에 대한 답을 내는 문제를 풀기 시작했습니다.

그리고 그 문제들을 풀면서 굉장한 희망을 갖게되었지만,

다시 한번 좌절을 겪게 되는 문제가 있었습니다.


그 문제는, 매우 간단하지만 이전과 다른 XOR문제 이었습니다.

즉, 그전의 AND와 OR문제에 대해서는 linear하게 선을 그어서 문제를 해결할 수 있었지만 XOR문제에 있어서는 어떤 linear한 선을 그어도 그 정확도가 매우 낮을 수 밖에 없었습니다.

그리고 69년도에 MIT AI lab에 있었던 Minsky교수는 이를 수학적으로 풀 수 없는 문제임을 증명합니다. 동시에 MLP(Multilayer perceptrons, Multilayer neural nets) 이 필요하지만 각각의 layer에 대해서 아무도 학습시킬 수 없다고 이야기합니다.


그리고 74년도, Paul Werbos 박사님과 86년도 Hinton 박사님에 의해서Backpropagation 이라는 개념이 등장면서 XOR을 포함한 더 복잡한 문제들을 해결할 수 있게 되었습니다.

또한 LeKun 박사님에 의해서 Convolution Neural Networks 라는 알고리즘이 개발되기도 하였습니다.




기존에는 forward 방식으로 학습을 진행하는 방식이었는데 이러한 방법에서는 앞에서 부터 에러를 수정하는 등의 방법이 어려웠지만 Backpropagation 에서는 에러를 검출하고 그곳에서 부터, 즉 backward 방식으로 에러를 수정하는 알고리즘입니다.



그리고 Convolutional Neural Networks 란 어떤 이미지에 대해서 한번에 인식하게끔 하는 것이 아니라, 부분부분으로 나눠서 이를 학습하고 나중에 합치는 방법입니다.

우리가 흔히 알고있는 '알파고' 또한 이러한 방식의 AI입니다.


그렇지만, 95년도에 다시 한번 큰 문제에 부딪히게 됩니다.



그 동안 진행했던 Backpropagation 은 간단한 문제들을 해결 할 수 있었지만, 우리가 실질적으로 해결하고자 하는 복잡한 문제들에 대해서는 앞에서 발생한 에러를 뒤로 보내다 보니 이 에러의 신호가 너무 약해져 뒤에 가서는 무의미해지게 됩니다. 즉, 복잡한 문제에 대한 훈련을 할 수록 성능이 더 떨어지게 됩니다.

또한 LeKun 교수님께서도 오히려 다른, 랜덤 방식의 알고리즘들이 더 성능이 좋다고 하면서 다시한번 AI분야에 대한 열기가 식게 되었습니다.



2. CIFAR 와 '딥'의 출현



이러한 찬바람 속에서 등장한 단체가 있었습니다.

바로 CIFAR 라는 캐나다에 위치한 단체인데, 이 단체는 당장 지금 돈이 되지 않아도 연구를 하라는 등의 지원을 했습니다.

그리고 Hinton 교수님은 이 단체가 위치한 캐나다로 이주하게 됩니다.



그리고 마침내 2006년, 2007년에 Hinton 교수님과 Bengio 교수님의 논문들을 통해 큰 돌파구가 생기게 됩니다.

그 전에는 우리가 매우 '딥'한 문제들에 대해서 학습을 시키는데 문제가 발생했는데 2006년 논문에서, 우리가 이러한 문제들이 생기는 이유는 초기값을 제대로 설정하지 못해서라고 이야기를 합니다.

그리고 2007년에는 그 초기값문제가 맞으며 한걸음 더 나아가 깊은 '딥'한 문제를 풀수 있음을 보여주게 됩니다.

그리고 이때, Neural Nets 가 아닌, 새로운 이름 Deep Nets, Deep Learning 으로 새로운 시작을 하게 됩니다.



그리고 실제로 더 주목을 받게되는 계기는 ImageNET이라는, 이미지를 보고 컴퓨터가 무엇인지 맞추는 문제에서 입니다.

그 전에는 매년 1~2%의 오차율을 감소시키며 2011년 기준으로 약 26%의 오류를 가지고 있었지만 2012년 Hinton 교수님의 연구실에 있는 박사과정 학생이 오류를 15%로 떨어뜨리게 됩니다.

이는 2015년, Deep Learning 기술을 기반으로 해서 약 3%대의 오류를 가지게 됬는데, 이때 사람의 오류는 약 5%였다고 합니다.


그리고 이후에는 컴퓨터가 단순히 이미지를 맞추는 것이 아니라 이미지에 대해 설명을 하는 기술까지 개발이 되었습니다.


그리고 이후 Hinton 교수님은 우리가 왜 그전에는 잘 하지 못했을까에 대해 4가지 문제를 이야기합니다.

이제 이러한 것들에 대해서 천천히 이야기를 해보도록 하겠습니다.

그리고 다음 포스팅에서는 우리가 직접 XOR문제를 딥러닝으로 해결해보도록 하겠습니다.


블로그 이미지

Tigercow.Door

Web Programming / Back-end / Database / AI / Algorithm / DeepLearning / etc

댓글을 달아 주세요