인공신경망
1. 개요
人工神經網 / artificial neural network
인공신경망이란, 인간의 뉴런 구조를 본떠 만든 기계학습 모델이다.
이름에서 알 수 있듯이 생물의 신경망, 특히 인간의 시각/청각 피질을 본떠 만든 알고리즘이다. (진짜 인간 뇌의 작동 방식과는 백만 광년 정도 거리가 있다.)
처음부터 이렇게 유망한 분야였던 것은 아니다. 한동안 서포트 벡터 머신과 나이브 베이즈 모델 등에 밀려 거의 사장되다시피 했는데, 그런 냉소적인 반응 속에서도 묵묵히 수십년간 연구를 이어온 일부 과학자들에 의해 기적처럼 다시 빛을 보게 된 특이한 케이스다.[1]
2. 본론
[image]
3blue1brown의 간단한 설명
기본 원리는 단순하다. 몇 개의 층위를 만들어서 그 안에 '세포'들을 집어넣고, 이들을 무작위 연결 강도로 연결한다. 각 '세포'들은 자신에게 들어온 신호를 가중치와 곱해 모두 더하고($$wx$$), 역치와 비교해서($$wx + b$$) 신호를 다음 뉴런으로 전달한다.
그런데 이렇게만 할 경우 전송되는 신호는 그냥 입력 신호의 선형 합이 될 뿐이고, 선형 합을 아무리 복잡하게 반복해 봤자 나오는 건 그냥 입력 신호의 선형 합밖에 없다(...). 다시 말해 아무리 많은 층을 쌓아봤자 행렬 곱하기 연산을 한 번 한 것과 동일한 결과가 나오는 것이다. 이와 같은 문제점은 비선형 활성 함수를 도입하여 해결할 수 있다. 비선형 함수를 도입할 경우 인공신경망 모델로 비선형 문제를 풀 수 있고, 많은 층을 쌓을 경우 대체적으로 결과물이 향상된다. 더욱이 이러한 비선형 활성 함수의 경우 일반적으로 입력 값이 특정 값보다 큰 경우 함수의 국부적인 특성이 판이하게 변하게 되는데, 이는 세포가 임계치 이상의 자극을 받으면 활성화 되어 반응을 하는 것과 매우 유사하기 때문에 이러한 비선형 함수가 활성 함수라고 불리게 되었다.
2.1. 전달/활성 함수
앞서 언급했듯이 입력 신호의 선형 합을 활성화 함수에 집어넣으면서 최종적으로 신호의 강도를 계산하는데, 그냥 주먹구구식으로 이것저것 함수를 대입해 보면서 가장 결과가 좋은 함수를 사용하는 중이다. 초기에는 실제 세포의 실무율을 잘 모사할 것으로 보이는 sigmoid 함수를 사용한 logistic 모델이 사용되었고, tanh함수나 softmax 함수가 사용되었다. 그러나 해당 함수를 활성 함수로 쓸 경우 은닉 층의 수가 증가하면 연결 강도를 학습시킬 때 활성 함수 미분 값을 곱한 값이 0으로 수렴하여 학습이 잘 되지 않는다는 문제가 있었다. 이에 따라 최근에는 sigmoid, tanh와 같은 squashing function이 아니라, ReLU와 같이 입력 값이 증가할수록 출력 값도 증가하는 함수가 많이 사용되고 있다. ReLU함수는 max(0, x)의 꼴을 가지는데, 입력 값이 0 이하면 항상 0의 출력 값을 가지므로, 음수인 입력 값에 대하여 해당 뉴런의 학습이 진행되지 않는다는 문제점이 있었다. 이를 해결하기 위하여 음수의 입력 값에서도 0이 아닌 출력 값을 가지는 Leaky ReLU 함수 및 Parametric ReLU 함수가 제안되었으며, 일반적으로 ReLU보다 좋은 성능을 낸다고 알려져있다. 더불어 함수의 미분 값이 연속적인 ELU 함수 또한 활성 함수로 널리 사용되고 있다.
다만 최근 배치 정규화라는 방법이 제안되면서, 입력의 값 분포를 최적화할 수 있게됨에 따라, sigmoid 함수를 활성함수로 쓰더라도 은닉층이 많은 인공 신경망을 잘 학습시킬 수 있게 되었다. 이와 같은 현상은 sigmoid 함수가 $$x=0$$ 근방에서 직선과 같은 형태를 가지고 있으므로 입력을 잘 처리해주면 주로 해당 영역에서 입력 데이터를 처리할 수 있다는 것에서 기인한다.
2.2. 학습 방법
인공 신경망의 학습을 진행하면 학습 데이터와의 오차를 최소화할 것으로 예상되는 방향으로 가중치 $$w$$와 역치 $$b$$의 업데이트가 이루어진다. '역치'라고 표현하기는 하지만, 이 값은 출력 값이 1인 '편향 세포(bias neuron)'과의 연결 강도로 볼 수도 있으므로 역치 또한 사실상 일종의 연결 강도, 즉 가중치라고 볼 수 있다. 그래서 몇몇 자료에선 가중치 $$w$$에 역치 $$b$$가 포함되어 있는 경우도 있다.
학습을 진행할 때, 가중치를 한 번에 크게 크게 업데이트하는 것이 아니라, 조금씩 업데이트를 여러 번 하게된다. 그 이유는, 오차를 줄일 것으로 보이는 가중치 업데이트 방향이, 장기적으로 보면 그렇지 않은 경우가 많기 때문이다. 예를 들어서, 어떤 목적지로 걸어 갈 때 눈을 감고 있다가 한 번씩 눈을 떠서 주변 상황을 파악한 뒤, 다시 눈을 감고 움직여야 하는 상황에 있다고 생각해보자. 눈을 한 번 떠서 주변 상황을 파악했다고 한들 눈을 감고 너무 많은 거리를 걸어가면 벽에 부딪힐 수도 있고, 사고가 날 수도 있다. 반면에 짧은 거리를 걸어간 후, 눈을 떠서 주변 상황을 파악하고, 다시 짧은 거리를 걸어가면 사고가 나지 않을 수 있으나, 목적지에 도달할 때까지 너무 많은 시간이 걸릴 수 있다. 따라서 걸어갈 때 적절한 거리를 걸어가는 것이 중요한 문제가 된다. 마찬가지로 인공 신경망을 학습할 때 적절한 학습률로 가중치를 업데이트 하지 않으면, 인공 신경망이 발산하거나, 학습하는데에 너무 오래걸리는 등의 문제가 발생하게 된다.
2.3. 생물학적 뇌와의 차이
인공 신경망이라는 단어 자체가 나타내고 있듯이 인공 신경망은 생물학적인 뇌와 큰 차이점을 보인다. 생물의 뇌, 특히 인간의 뇌는 1,000억 개 이상의 세포로 구성되어있는데, 현재까지의 기술로는 이와 같은 수의 뉴런을 시뮬레이션 할 수 없다. 비록 인공 신경망의 구조 자체가 생물학적인 뇌의 구조를 모사하며 시작되었으나, 뉴런의 수 말고도 구조적인 차이가 존재한다. 일반적인 세포는 역치 이상의 자극을 받지 않으면, 아예 반응을 하지 않고, 역치 이상의 자극을 받으면 반응을 하는 실무율 특성을 보인다. 자극이 세지면 반응의 크기가 커지는 것이 아니라, 반응의 빈도가 높아지는데, 사실 이러한 특성은 계단 함수(step function), 혹은 디락 델타 함수와 비슷하다고 볼 수 있다. 그런데 단위 계단 함수와 같은 계단 함수의 경우 $$x=0$$인 곳에서 불연속적이므로 미분을 할 수가 없고, 그래서 학습을 할 수 없다는 매우 큰 문제점이 존재했다. 따라서 그 당시의 과학자들과 공학자들은 미분이 가능한 부드러운 계단 함수 형태인 sigmoid함수, tanh 함수 등을 썼던 것이다. 비록 sigmoid 함수가 계단 함수와 매우 비슷한 함수라고 할 수 있으나, 생물학적인 뇌와는 큰 차이가 있는데, 생물학적인 뇌는 시간의 흐름 없이는 작동할 수 없다는 것이다. 반면 인공 신경망의 경우 입력 값만 주면, 시간의 흐름과는 상관 없이 출력 값이 정해져있다.
더욱이 인공 신경망 모델 자체가 발전하며, sigmoid 함수가 아닌 ReLU 계열의 함수가 활성 함수로 널리 쓰이게 되었는데, 이러한 함수는 계단 함수와는 다소 거리가 있으므로 생물학적인 뇌와는 더욱 큰 차이가 발생했다고 볼 수도 있다. 물론, ReLU 계열의 함수가 자극에 따른 반응의 빈도를 나타낸다고 생각할 경우 거리가 좁혀졌다고 볼 수도 있겠다. 문제는 과거의 연구자들이 생물학적인 뇌와 차이가 큰 인공 신경망을 연산 성능이 후달려 컴퓨터로 계산을 하기도 힘든데, 굳이 연구를 해야되냐는 생각을 많이 했다는 것이고, 그렇게 인공 신경망 모델은 역사의 뒤안길로 사라질 뻔 했다. 물론 이와 같은 무관심에는 컴퓨터 성능과 관련된 문제 뿐 아니라, 은닉층이 많아질수록 학습이 잘 되지 않는다는 문제가 해결되지 않았다는 것도 한 몫 했다.
2.4. 명예회복, 그리고 부활
그런데 이렇게 역사에 묻힐 것 같던 이 이론은 돌연 딥러닝(Deep learning)이라는 이름으로 화려하게 부활했다. 이는 '구시대의 산물'로 받아들여졌던 인공 신경망에 대해서 계속해서 연구를 진행했던 연구자들이 큰 진보를 이루어냈기 때문인데, 인공 신경망을 사전 훈련 해주거나, sigmoid 계열의 함수가 아니라 ReLU 계열의 함수를 쓰면 은닉층이 많아도 인공 신경망이 학습이 잘 된다는 것이 밝혀졌던 것이다. 더불어 각종 대회에서 인공 신경망 모델이 기존의 모델을 말 그대로 박살내버리면서 수 많은 연구자들이 놀라면서 인공 신경망으로 다시 관심을 돌리게 된 것이다. 물론 은닉층의 수가 지나치게 많아질 경우 이와 같은 방법을 사용해도 결과물의 열화가 발생할 수도 있다는 연구 결과가 보고되었으나, 이를 해결하기 위해 배치 정규화, ResNet등의 해결 방법이 제안이 되었으며, 실제로 효과가 있다는 것이 밝혀졌다. 이와 같이 인공 신경망으로 연구자의 관심이 쏠리고 인공 신경망 모델이 발전하는데에는 기존에 난제로 보였던 문제들이 해결된 것도 무시할 수 없으나, 컴퓨터의 연산속도가 무지막지하게 빨라지면서 느린 수렴 속도가 그렇게까지 부각되지 않게 되었다는 것도 무시할 수 없는 요인이다. 왜냐하면, 난제들은 결국 시간이 지나면 누군가는 해결을 했을 것이기 때문이다.
아직 인공신경망 알고리즘은 인간 뇌의 성능의 발끝에도 미치지 못한다. 인간의 시각피질은 고작 몇백g밖에 무게가 안 되고 에너지원 역시 설탕 한 스푼만 주면 몇 시간이고 굴려먹을 수 있지만, 기계가 그 일을 하기 위해서는 집채만한 슈퍼컴퓨터로도 모자라다. 엄청 딸리는 소프트웨어의 효율을 압도적인 하드웨어로 찍어누르고 있는 셈. 도밍고스 교수의 말마따나 아직 기계학습에 대한 우리의 이해는 연금술 수준이라는 것이 정확할 것이다. 인공신경망은 만드는 사람도 쓰는 사람도 이게 왜 잘 작동하는지 잘 모를 만큼 부속과 출력의 상호관계가 천차만별이다. 그냥 결과가 나오니까 쓰는 거지(...) 특히 알고리즘의 성능 개선을 위해 접근하는 각종 시도의 경우 인간 뇌세포의 작동 방식과 전혀 관련이 없는 것은 물론이고, 이 방법을 사용하면 어떻게 성능이 나아지는지에 관한 이론적 근거가 조악하게라도 붙어 있는 경우가 훨씬 드물다. 그냥 '이렇게 하니까 학습이 더 잘 되더라.' 라는 말이 도는 편. 부족한 것이 많지만 그렇기에 발전할 여지가 많은 논리이며, 사람들이 인공신경망 알고리즘에 관해선 인간의 지능을 뛰어넘는 강인공지능, 발달을 추구하는 인공'지성'이 해결하기를 바라는 가장 큰 이유이기도 하다.
'''2013년 즈음부터 현재까지 가장 주목받고 있는 머신러닝 알고리즘'''이다.
3. 종류
아래 '종류'라는 건 한 프로그램에 하나만 쓰이는 것이 아니다. 가령 이미지 처리와 언어 처리를 동시에 하기 위해 CNN과 RNN을 동시에 사용할 수도 있다.
3.1. Perceptron
Perceptron은 위에서 설명한 뉴런의 수학적 모델을 일컫는 용어이기도 하고, 최초로 제안된 신경망 프로그램 알고리즘 (1957)이기도 하다. 이 알고리즘은 이름 그대로 하나의 뉴런을 사용하며 학습 데이터를 가장 잘 설명할 수 있는 최적의 패러미터( $$w, b$$ )값을 찾는다.
학습은 학습 데이터를 넣은 후 결과가 원하던 결과보다 크면 결과가 작아지게 패러미터를 조정하고 원하던 결과보다 작으면 커지게 패러미터를 조정하는 것을 반복한다. 이것으로 학습이 가능하다는 것은 perceptron convergence theorem이란 이름으로 증명이 되어 있다.
그러나 비선형함수를 학습할 수 없기에 이 방법이 사장됐다. 입력층과 출력층만 있는 퍼셉트론으로는 XOR 문제도 해결할 수 없다. 그 결과 MLP가 나오게 된다.
3.1.1. Multi Layer Perceptron (MLP)
말그대로 여러개의 Perceptron을 연결시켜 층(Layer)을 만들고, 이 층들을 중첩시켜 다층 (Multi Layer)으로 만든 것이다.
여러개의 Perceptron이 하나의 층(Layer)을 구성하며, 일반적으로 3~6개 정도의 층을 두며, 이들을 각각 입력층(Input layer), 은닉층(Hidden layer), 출력층(Output layer) 으로 구분하여 부른다. 필요이상으로 많은 층을 두는 것은 오히려 성능이 떨어진다고 알려져있다. 처음에는 중간에 존재하는 은닉층을 학습시킬 방법이 없기에 사장되었지만, 해결할 방법을 꾸준히 연구한 결과 역전파(backpropagation) 알고리즘 (1986)이 발명되어 사용할 수 있게 되었다. 신경망계통 알고리즘답게 초창기에 반짝하며 신드롬을 일으킬정도로 관심을 받았다. 그러나 사라지는 경사 문제 [2] , 과적합 문제 등이 있었고 당시 연산능력의 한계가 심했기 때문에 금새 사장되고 만다.
3.2. 심층학습(Deep Learning)
심층학습 문서 참조
3.2.1. Convolutional Neural Network(CNN)
1989년 인간의 시신경 구조를 모방해 만들어진 인공신경망 알고리즘. 다수의 Convolutional Layer(이때의 작은 행렬을 필터라 부른다)으로 부터 특징맵(Feature map)을 추출하고 서브샘플링(Subsampling)을 통해 차원을 축소하여 특징맵에서 중요한 부분만을 가져온다. 이미지 분류, semantic segmentation, optical flow등등 대부분의 컴퓨터 비전(computer vision)분야에서 필수적으로 사용되는 기술이며, 기존의 mlp에 비해 적은 연산량과 높은 성능을 보여줘 각광받고 있다.
ML 기술의 선구자 중 한명인 얀 르쿤이 개발한 LeNet이 초기 CNN 구조의 대표적인 역할을 했고, 이후 ImageNet 이미지 분류 대회에서 InceptionV3 등 새로운 모델 구조들이 나오며 성능이 비약적으로 개선되었다. 요즘에는 ResNet을 자주 쓰는데, TfNet이나 Torchvision에서 제공하는 pretrained weights를 사용하여 transfer learning을 하면 많은 분야에서 훌륭한 성능을 뽑아주기 때문에 애용된다. ResNet의 무거움을 해결하기 위한 MobileNetV2나 EfficientNet도 주목받고 있다.
하단의 RNN과 융합한 R-CNN이라는 물건도 있다. Object Detection 할때 사용한다.
3.2.2. Recurrent Neural Network
뉴런의 출력이 다시 입력으로 feedback되는 재귀적인 연결 구조를 갖는 신경망. 다층 퍼셉트론 신경망은 입력이 출력 방향으로만 활성화되고 은닉 뉴런이 과거의 정보를 기억하지 못한다는 단점이 있다. 이러면 입력이 들어온 문맥을 기억할 수 없다. 이런 단점은 시계열분석[3] 관련 문제에서 매우 해롭다. RNN은 이런 단점을 해결했다.
앞에서 무슨 단어가 나왔는지의 문맥이 다음에 나올 단어를 예측(prediction)하는 문제를 푸는 데 유용하다. 이런 문제에는 음성 인식, 필기체 인식, 텍스처 인식이 있다. 또 분류에도 유용하다. 언어 모델은 말뭉치를 이용한 기계 번역에 도움이 되었다.
기존의 DNN(Deep Neural Networks)의 경우 각 layer마다 parameter들이 독립적이었으나, RNN은 이를 공유하고 있다. 따라서 현재의 출력 결과는 이전 time step의 결과에 영향을 받으며, hidden layer는 일종의 메모리 역할을 하게 된다.
RNN의 기본적 작동원리는 ht = g1 ( xtU + Wh(t-1) + bx), ot = g2 (Vh(t)+bh) 이다.
g1 g2 : 비선형 활성화 함수 (Sigmoid, tanh 등)
xt: 입력값
ht: t(시간)단계의 은닉변수 (hidden state)
ot: t(시간)단계의 출력값
b: 편향 (bias)
UVW: xt ht ht-1의 가중치 (weight)
위 식에서 입력 X = (x1 , x2 , x3 , ... , xn)이 입력되면 ot가 출력된다.
변종으로 Bi-directional RNN이 있다. 이 모델은 과거 및 미래 상태도 반영한다. 언어 모델링을 할 때 앞뒤 단어를 모두 고려하게 되므로 정확성이 높아진다. 하지만 학습이 오랫동안 진행지면서 초기 학습이 잊혀질 단점이 있다.
하지만 전통적인 RNN 모형 및 Bi-directional RNN의 경우 Vanishing gradient problem을 지닌다. [4]
이 해결책으로 제시되고 있는 것이 다음 알고리즘들이다.
- LSTM
- elman NN: RNN에 context layer가 추가되어 있어 vanishing gradient problem을 어느 정도 해결했다. context layer는 hidden layer에서 나온 결과 중 기억하고 싶은 부분을 저장해 두었다가 필요할 때 꺼내올 수 있는 피드백 신호 역할을 한다.
3.2.2.1. Long Short Term Memory
1997년 나온 RNN의 개선판. 학습이 오래 지속될 경우 초기 학습한 내용이 잊혀진다는 단점이 있는데 이를 개선한 architecture이다. RNN의 입력, forget, 출력 부분에 Gate라는 셀들을 붙여 값을 조절한다. Forget gate는 이전 상태 정보를 저장할지를 결정하고, input gate는 입력되는 새로운 정보를 저장할지 결정하고, output gate는 갱신된 cell의 출력값을 제어한다.
망각 게이트 (forget gate)는 기존의 소자변수를 얼마나 잊어버릴지 결정한다. ft = σ (Uf xt + Wf ht-1 + bf)이다.
Uf xt + Wf ht-1 + bf는 xt, ht-1 , b의 가중합이다. ft는 이 가중합에 sigmoid함수(σ)를 씌운 것이다. 1은 모두 기억하겠다는 뜻이고 0은 모두 잊어버린다는 뜻이다.
3.2.2.1.1. Gated Recurrent Unit
2014년 뉴욕대학교 조경현 교수가 발표한, LSTM의 장기기억능력은 보존하면서 연산은 적은 모델이다.
3.3. 강화학습
본문 참고
3.4. 진화전략
2018년 진화전략 개발중 openAI
- Reptile 파충류 : 확장 가능한 메타 - 학습 알고리즘 openAI 진화전략 버전1
- 자율 학습을 통한 언어 이해 향상 openAI 진화전략 버전2 https://blog.openai.com/language-unsupervised/
3.5. 혼합모델
3.5.1. 오토인코더
자기부호화기 (Autoencoder)
이미지 같은 복잡한 데이터는 높은 차원에 존재한다. 복잡한 데이터를 저차원으로 표현하면 처리가 간단해질 수 있다. 이 때문에 데이터의 차원을 축소하려는 노력들이 있어 왔다. 그 예로 Singular Value Decomposition (SVD) 혹은 주성분 분석 (PCA)이 있다. RNN 역시 시계열 데이터를 직접적으로 이용하는 것이 아니라 은닉 상태를 추론하여 문제를 풀어 나간다. 이렇게 차원을 축소하면 분류도 쉬워진다.
정보를 압축하는 인코더와 압축된 정보를 바탕으로 데이터를 복원하는 디코더를 만들 수 있다. 오토인코더는 데이터의 효율적인 인코딩을 찾는 방법이다.[5] 인공신경망에서 입력 레이어의 뉴런과 출력 레이어의 뉴런을 같은 개수로 두고, 입력과 출력이 같은 값이 되게끔 신경망을 학습시키게 된다. 이렇게 하고 은닉층에 있는 뉴런의 개수를 입력층의 뉴런의 개수보다 적게 하여 신경망을 구성하면, 입력층에서 은닉층으로 가는 과정은 인코딩 과정이 되고, 은닉층에서 출력층으로 가는 과정은 디코딩 과정이 된다. 이 때 은닉층의 각 뉴런의 활성화 정도는 입력 데이터의 새로운 코드가 된다. 선형 뉴런을 사용하면 오토인코더의 결과는 PCA와 거의 유사한 결과를 갖게 된다. 따라서 선형 뉴런 대신 시그모이드 뉴런을 사용함으로써 비선형적인 코딩을 얻을 수 있게 된다.
오토인코더를 한 번 사용하여 데이터를 한 번에 인코딩하는 방법으로 신경망을 구성할 수도 있지만, 뉴런의 개수가 크게 줄어들게 되면 신경망의 학습이 이루어지기 어렵고, 신경망의 표현 능력도 떨어지게 된다. 신경망의 표현 능력을 향상시키기 위하여 오토인코더를 쌓아 올리게 되는데 각각의 오토인코더는 입력 데이터를 표현할 수 있는 조금 더 좋은 코드를 찾게 되고 최상위 오토인코더는 매우 적은 수의 코드로 처음 주어진 입력값을 표현할 수 있게 된다.
단, 쌓아 올린 오토인코더는 일반적인 역전파(back propagation) 방법으로는 학습이 잘 되지 않는데 이를 극복하기 위해서 RBM(Restricted Boltzmann Machine)을 이용해 오토인코더를 미리 학습시키고, 미리 학습된 결과를 초기 추측으로 사용하여 역전파 방법으로 튜닝하면 쌓아 올린 오토인코더를 제대로 학습할 수 있게 된다.
반대로, 오토인코더의 디코더를 이용하면 축소된 공간에서 임의의 점에 해당하는 가상의 데이터를 원공간에서 생성해낼 수 있다. 결함 데이터가 일반적으로 부족한 고장진단 분야의 경우 (데이터 불평형 문제), 축소된 공간에서의 고장분포를 파악하여 이에 해당하는 다양한 고장데이터를 가상으로 생성할 때 사용할 수 있다. 이밖에도 정보를 압축하고 복원하는 구조로 Convolutional layer 를 통한 오토인코더 방법 (Convolutional Autoencoder), 베이지안적 사고를 바탕으로 신경망을 최적화시키는 방법 (Variational Autoencoder) 등이 제안되었다.
구체적인 방법은 다음과 같다. 입력 값 x가 주어지면 인코더를 통해 압축된 데이터 y로 변환하고 디코더를 통해 압축된 데이터 y를 z로 풀어낸다.
y = fθ(x) = s (Wx+b)
z = gθ(y) = s (W'y + b')
3.5.2. GAN
generative adversarial networks
2014.6 제안된 방식.
Classification (분류) 문제는 접근법을 discriminative 모델과 generative model로 나눌 수 있다.
- discriminative model (지도학습의 일종): 입력 x에서 출력 y로 가는 관계인 조건부확률 p(y|x)를 추정하려고 시도한다. 클래스를 분류하려 한다. 만약 generative model에서 만들어진 output이 실제인지 아닌지 판단하는 탐정 역할이라고 최초 논문에는 서술되어 있다. 다중 회귀분석, 나이브 베이지안 분류기 등.
- generative model (비지도학습의 일종): p (x,y)을 추정하려고 한다. 분류 경계선 (decision boundary)을 만들려고 한다. 우도 (likelihood)나 사후확률 (posterior probability)를 사용한다. 밀도 기반 추정법들. 최초 논문에는 탐정을 속이기 위해 점점 더 나은 모형의 위조 지폐를 만드는 위조 지폐범이라고 비유되어 설명되어있다.
출처
$$ \underset{G}{\min} \underset{D}{\max} V (D,G) = E_{x \sim P_{data}(x)} \,[log D(x)] $$
$$ + E_{z \sim P_{z}(z)} \,[log (1-D(G(z)))]$$
위 식에서 G는 생성 모델, D는 분류 모델을 가리킨다. 좌변은 생성자가 구분자의 정확도를 최소화시키면서 구분자는 자신의 정확도를 최대화시키는 minimax 최적화 문제를 의미한다. 이 값은 0~1로 주어진다.
우변은 두 개의 항으로 나뉘어 있는데 이는 정보이론 (수학)에서 엔트로피를 최소화하는 것과 같다.[6] '''우변 첫번째 항인 E x~Pdata(x) (log D(x))'''은 실제 데이터 x를 입력받았을 때 올바르게 '실제데이터'(D=1)라고 판단할 경우 최대화된다. '''우변 두번째 항인 Ez~Pz(z) (log (1-D(G(z)))'''은 가상데이터 (z)를 입력받았을 때 올바르게 '가상데이터' (D=0)라는 것을 구분할 경우 최대화된다. 생성자는 그럴듯한 가상 데이터를 생성함으로써 두 번째 항을 최소화시키려고 노력한다.
오토인코더에는 단순히 데이터를 생성한다는 개념만 있었다. 하지만 GAN에는 경쟁이라는 요소가 들어간다. GAN이 오토인코더에 비해 양질의 데이터를 생성할 수 있다.
GAN에도 단점이 있다. 생성자가 그럴듯한 가상 데이터를 학습 초반부터 생성하기 힘들기 때문에 모델이 학습되지 않는 현상이 발생한다. 그리고 오토인코더가 주어진 데이터의 잠재 변수 (latent variable)를 추론할 수 있는 데 비해 GAN은 차원 축소의 개념이 존재하지 않는다.
3.5.2.1. DCGAN
위에서 설명한 딥 CNN과 GAN을 통합한 개념.
Radford, A. (2016) [7] 논문에서 시작되었다.
각 레이어에 Convolution layer를 사용한다. 단, CNN과 달리 Pooling layer, Fully connected layer는 사용하지 않는다. 레이어 계산 결과에 Batch Normalization를 사용한다. 활성 함수(Activation function)으로 ReLU 대신 LeakyReLU를 사용한다.
Generator는 랜덤 입력 ‘z’가 의미있는 잠재 특징 (latent feature)이 되도록 학습한다. 이 랜덤 입력의 의미가 무엇인지 우리는 알 수 없다.
3.5.2.2. cGAN
위에서 설명한 DCGAN으로는 latent feature가 어떤 의미를 가지게 학습시킬 수 없다. 그래서 input을 조절해서 output을 자신이 원하는 방향으로 만드는 것이 불가능하다. 이를 보완하기 위한 아이디어로 제시된 것이 cGAN인데, conditional GAN의 줄임말이다.
기본적인 GAN과 아이디어를 동일하게 가져간다. 하지만 차이가 있다면 DISCRIMINATOR와 GENERATOR에 단순히 LATENT VECTOR을 넣는 것 뿐만 아니라, 경향성을 나타내는 INPUT Y를 추가로 넣어준다. 초기 연구에서는 이 y에 one hot encoding의 방식으로 class를 집어넣어 줬다고 한다.(ex. 만약 1부터 10까지의 숫자 학습을 시킨다고 하면 y에 [1,0,0,0,0,0..]을 넣으면 y가 1일때는 output이 1이 나오는 경향성을 띄게 학습시킴.)
이러한 방법을 통해서 우리는 DCGAN에서는 할 수 없었던 OUTPUT의 경향성을 알 수 있고, 이를 다르게 표현하는 방법으로 INFOGAN등의 논문이 나오게 된다.
4. 학습법
4.1. 경사 하강법
4.2. 확률적 경사 하강법
4.3. Adam
4.4. Nadam
5. 공학적인 기술
- 미니배치
- Sparknet (2015말)
- ReLU (Rectified Linear Unit): Sigmoid 함수에 비해 Vanishing gradient problem을 해결했다.
- 빅 데이터 프로세싱: 과적합 문제를 다량의 학습 데이터 확보를 통해 해결했다.
- Dropout: 과적합 문제를 해결하기 위해 일부 레이어의 데이터를 제거하는 기술. (1-p) 확률로 노드를 학습에서 무시하여, 노드에 연결된 edge가 없는 것으로 간주하고 매 주기마다 랜덤하게 갱신한다.
- 관련 라이브러리: Caffe, Torch, Theano, RNNLIB, CUDA-ConvNet, Pylearn, DL4J, 텐서플로우 등.
- 관련 계산 환경: CUDA, Apache Spark
6. 문제점
- 학습이 일정하게 진행되지 않는다.
- 일반 프로그램에 비해 높은 사양을 요구한다. CPU나 싸구려 GPU로만 구동한다면 시간이 많이 걸린다. 신경망 종류에 따라서는 RAM도 수십 GB 이상 잡아먹는다.[8] 이 때문에 CPU, RAM, GPU 성능의 영향을 많이 받으며, 기업에서 딥러닝 개발용으로 쓰는 워크스테이션은 천만원 정도다. 취미로 하거나 독학하는 경우 노트북으로는 택도 없기 때문에, 보통은 일단 무료인 구글 Colab을 쓴다. 근데 이건 직접 데이터나 모델을 업로드 하기 번거롭고, 툭하면 Runtime이 꺼져버리기 때문에 (...) 결국 Colab Pro나 AWS, Azure 같은거로 가게 된다.
- 정확한 딥러닝의 메커니즘은 블랙박스 형태. 인간의 신경망을 본떠서 답이 나오게끔 만들다보니 수학적인 증명이 완료되지 않았다. 시냅스가 역치를 넘기고 학습하면서 일련의 작용을 해, 인간의 감각적 반응을 이끌어 내는 것을 흉내내고, 이 시냅스들이 뭉치고 뭉쳐서 거대한 뇌를 이루어 판단이나 계산을 하게 되는 것을 흉내내는 것에 가깝다. 물론 실제 뇌 매커니즘과 딥러닝의 매커니즘에는 어느정도 차이가 있지만, 아이디어를 신경망에서 얻은 인공신경망이다보니 비슷한 문제를 안고 있는 것이다.
쉽게 말해서, 인간은 아직 뇌에 대해서도 모르는 부분이 많은데 이 인공신경망은 잘 알지도 못하는 뇌를 일단 본따서 해보자는 것이다. 아이디어는 시냅스나 뉴런 등 인간의 신경을 구성하는 요소들과 그 요소들의 작용들을 통해 얻은 것이 많지만 정작 그 모티브인 뇌에 대해서도 잘 모르는 부분이 많다보니 명확하게 증명되거나 메커니즘이 이해되지 못한 부분은 그저 추측으로 구현되는 경우가 많다.
- 아직까지 데이터를 정제하는데 사람의 손이 많이들어가는 등 상당한 노가다가 필요하다.
7. 기술 동향
- 한국의 인공신경망 기술은 현재로써는 처참한 상태다. 2011~2015년 NIPS에 1,845편의 논문이 발표되었는데 미국 1,037건, 영국 110건, 프랑스 103건, 캐나다 97건, 독일 85건, 중국 73건, 스위스 61건, 이스라엘 44건, 일본 43건, 호주 29건, 인도 24건, 싱가포르 16건, 오스트리아/이탈리아/한국 14건 등이었다. 기관별로 보면 스탠포드 대학교 84건, 카네기 멜런 대학교 66건, MIT 63건, UC 버클리 61건, 텍사스 오스틴 59건, 유니버시티 컬리지 런던 41건 등이며, 한국 기관 중 10건 이상 발표한 곳은 없다.
8. 기타
- 인공신경망과 유전 알고리즘을 결합하여 만드는 모델도 있다. 인공신경망을 다양하게 구성한 뒤 학습시켜 최적의 결과를 찾는다.
9. 관련 문서
[1] 학습에서 사용하는 기울기 하강법과 관련된 문제도 문제지만 '''하드웨어 성능과 병렬 연산의 진도가 덜 나간 상태에서 처음 등장한 것이 크다.''' 인공신경망을 제대로 사용할 수 있는 환경이 갖춰지자 비로소 빛을 보게 된 것이다.[2] Vanishing Gradient Problem. MLP에서 층이 깊어질수록 역전파 알고리즘으로 의미있는 오류를 잘 전달하지 못하는 문제.[3] 시간에 따라 연속성을 지니는 문제. 텍스트 역시 연속된 문장과 단어로 구성되어 있기 때문에 RNN으로 잘 풀린다.[4] networks의 weight가 업데이트 되는 과정에서 gradient(weight에 대한 일종의 업데이트 비율)가 1보다 작은 값이 계속 곱해지면서 gradient가 사라지는 현상. 따라서, 먼 과거의 상태는 현재의 학습에 아무런 영향을 미치지 못하게 됨[5] 이 문단의 출처: 오토인코더를 이용한 동작 데이터 분석(2013), 소음진동학회지 (2017.5) [6] Jensen-Shannon divergence 측도를 최소화한다고 말한다.[7] Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks. doi : arXiv:1511.06434[8] 진짜 제대로 된 환경에서 작정하고 실험을 돌리면 GB 단위로 세 자릿수를 찍어버린다.