01. 인공신경망(딥러닝)의 역사
1. 퍼셉트론의 등장(Perceptron)
- 1957년 프랭크 로젠블라트가 퍼셉트론이라는 신경망 모델 발표
- 인간의 두뇌 움직임을 수학적으로 구성하여 당시 굉장한 이슈가 되었으며 이후 인공신경망에 대한 기대가 폭증함
- 신호(x1, x2,x3)를 입력으로 받아 하나의 신호(y)를 출력하는 기계
- 신경망의 기원이 되는 알고리즘

- 입력(Input) : AND 또는 OR 연산을 위한 입력 신호
- 가중치(Weight) : 입력 신호에 부여되는 중요도 가중치가 크다 = 그 입력이 출력을 결정하는데 큰 역할을 한다.는 의미
- 가중합(Weighted Sum) : 입력값과 가중치의 곱을 모두 합한 값
- 활성화 함수(Activation Function) : 가중합에 대하여 임계치(Threshold)를 넘어가면 1, 그렇지 않으면 0을 출력함
- 출력(Output) : 최종 결과(분류)
초기 퍼셉트론은 AND와 OR만 가능한 알고리즘이었다.

- 퍼셉트론은 선형분리만 가능했었다(AND와 OR 사진처럼 선으로 그어 분류하는것)
- 하지만 XOR연산은 못하는 한계가 있었다.
XOR연산 한계 극복?
- 12년 후인 1969년 마빈 민스키와 시모어 페퍼트가 현재 퍼셉트론은 XOR연산이 불가능하다는 가설을 수학적으로 증명
- 또한, "퍼셉트론을 여러 개 쌓아 올린 다층 퍼셉트론(MLP)를 통해 XOR연산에 대한 문제는 해결할 수 있지만,각각의 가중치와 편향을 학습시킬 방법이 없다" 라는 결론을 내놓으며 퍼셉트론을 이용한 학습의 한계를 언급함
2. 역전파의 고안(Backpropagation)
- 5년 후인 1974년, 폴 워보스가 박사과정 논문에서 역전파를 제안
- 가중치와 편향을 학습하기 위한 방법으로 거안
- 신경망의 오차(예측값 - 실제값)를 출력층에서부터 입력층으로 피드백하여 각층(Layer)의 가중치와 편향을 업데이트 하는 원리

XOR 문제는 해결됬지만 또 다른 문제
- 12년 후인 1986년 제프리 힌튼이 또 다른 역전파 방법을 고안
- 제프리 힌튼이 제안한 역전파가 XOR 문제뿐만 아니라 더 복잡한 문제도 해결할 수 있음이 증명되자 다시 사람들의 관심을 끌기 시작했다.
- 이후 한동안 인공신경망 연구는 큰 진전이 있었지만, 다음이유로 긴 침체기로 돌입한다.
- 신경망의 깊이가 깊어질수록 원하는 결과를 얻을 수 없음
- 신경망 학습에 최적화된 하이퍼파라미터에 대한 이론적인 근거가 없음

- 기존 이론으로는 신경망이 깊어질수록 학습력이 좋아져야 하는데 예상한 대로 결과가 나오지 않음
- 역전파를 수행할 때 출력층에서 멀리 떨어진 층에서는 기울기가 급속히 작아지는 기울기 소멸 문제(Vanishing Gradient),
- 기울기가 너무 커지는 기울기 발산(Exploding Gradient)문제가 발생해 학습력이 떨어짐
기울기 계산 - 경사 하강법

- 경사하강법은 오류가 작아지는 방향으로 가중치(w)값을 보정하기 위해 사용
- 최초 가중치에서 시작해 미분을 적용한뒤 미분값(기울기 값)이 계속 감소하는방향으로 업데이트하며, 업데이트가 끝나는 전역 최소점에서 w를 반환한다.

- 손실 함수에는 지역최소점(Local Minimum)과 전역 최소점(Global Minimum)이 있다.
- 만약 가중치와 오차에 대한 그래프가 위와 같을때 지역 최소점을 전역 최소점으로 생각하고 업데이트를 마친다면, 그만큼의 오차가 발생한다는 것임
3. 딥(Deep)의 출현
- 2006년, 역전파를 고안했었던 제프리 힌튼이 가중치의 초기값을 제대로 설정하면, 깊이가 깊은 신경망도 학습이 가능하다는 연구를 선보임
- 2007년, 벤지오(Bengio) 팀이 오토인코더(Autoencoder)를 사용하여 좀더 간단한 사전훈련 방법을 제안
- 이때부터 인공신경망(Neural) 대신 딥(Deep)이라는 용어를 사용하기 시작
02. 딥러닝의 개요
1. 인공신경망의 개념
- 딥러닝의 기원은 인공신경망이며, 사람의 신경망 구조에서 착안해 만들어짐

2. 딥러닝의 개념
가중합(Weighted Sum)

- 입력값 x 가중치 + 편향 = 가중합
- x : 외부에서 들어오는 신호
- w : 신호를 연결하는 가중치
- b : 출력값을 조절하는 편향
- y = 외부로 나가는 신호
활성화 함수(Activation Function)
- 입력 신호가 출력 결과에 미치는 영향도를 조절하는 매개변수
- 출력 값을 0~1 사이의 값으로 변환해야 하는 경우에 사용
- 일반적으로 비선형을 위해 사용
1) Sigmoid 함수

- x값의 변화에 따라 0~1까지의 값을 출력하는 S자형 함수
- 로지스틱(Logistic) 함수라고도 함
2) 하이퍼볼릭 탄젠트(Hyperbolic Tangent)

- Sigmoid와 유사하지만 -1 ~ 1값을 가지며, 데이터의 평균이 0을 가짐
3) 렐루(ReLU)

- x가 음의 값을 가지면 0, 양의 값을 가지면 x를 그대로 출력
- 함수 형태도 max(0,x)로 계산이 간단하며, 학습속도가 빠름
4) 리키렐루(LeakyReLU)

- ReLU함수와 유사하지만, 가중치 곱의 합이 0보다 작을 때의 값도 고려함
- 이 함수를 ReLU함수의 '죽은 렐루' 현상을 보완함
3. 딥러닝학습
순전파(Foward Propagation)

- 입력층에서 출력층 방향으로 연산이 진행되면서 최종 출력값(예측값)이 도출 되는 과정
손실 함수(Loss Function)

- 예측값과 실제값의 차이를 구하는 함수
- 두 값의 차이가 클 수록 손실함수의 값은 커지며, 차이가 작을수록 손실함수의 값은 작아진다.
옵티마이저(Optimizer)

- 일반적으로 전체 데이터를 한번에 학습하게 되면 계산량이 많아져 속도가 느려질 수 있기 때문에 배치를 이용한 학습을 함
역전파(Backward Propagation)

- 역전파는 경사 하강법을 이용해 오차를 줄이는 방향으로 가중치를 수정함
- 가중치를 수정할 때에는 순전파에서 계산한 결과의 편미분값을 오차에 곱해 출력층 - 은닉층 - 입력층 순서로 전달함
03. 딥러닝 유형
1. 심층 순방향 신경망(Deep Feedforward Network, DFN)

- 딥러닝에서 가장 기본으로 사용하는 인공신경망이며 입력층, 은닉층, 출력층으로 이루어져 있음
- 이때 중요한 것은 은닉층이 2개 이상이어야 한다는 점
- 만약 DFN의 은닉층이 수십 ~ 수백 개로 많으며, 입력 데이터가 시간 순서에 따른 종속성을 가질 경우 시계열 데이터 처리에 한계가 있음
- 그래서 이러한 문제점을 해결하기 위해 제안된 것이 순환 신경망임
2. 순환 신경망(Recurrent Neural Network, RNN)
- 시계열 데이터와 같이 시간적으로 연속성이 있는 데이터를 처리하기 위해 고안된 인공신경망
- 시계열 데이터 : 일정한 시간 동안 관측되고 수집된 데이터(주식, 날씨)

- 시계열 데이터는 데이터의 특성상 앞에 입력된 데이터가 뒤에 입력된 데이터에 영향을 미침
RNN과 DFN의 차이
- RNN은 은닉층의 각 뉴런에 순환 구조를 추가하여 이전에 입력된 데이터가 현재 데이터를 예측할 때 다시 사용될 수 있도록 함
- 따라서 현재 데이터를 분석할 때 과거 데이터를 고려한 정확한 데이터 예측을 함
- 하지만, RNN역시 신경망 층이 깊어질수록 먼 과거의 데이터가 현재의 영향을 미치지 못하는 문제가 발생함
- 이를 "장기 의존성(Long Term Dependency)"문제라고 하며, 이를 해결하기 위해 제안된 것이 LSTM이다.
3. LSTM(Long Short Term Memory)

- RNN과 다르게 신경망 내에 메로리를 두어 먼 과거의 데이터도 저장할 수 있도록 함
- 입출력을 제어하기 위한 소자를 두었는데, 이것을 게이트(Gate)라고 함
- 게이트는 입력 게이트, 출력 게이트, 망각 게이트가 있음
LSTM에서 각 게이트의 역할
입력게이트 : 현재의 정보를 기억하기 위한 소자이다. 과거와 현재 데이터가 Sigmoid 함수와 Hyperbolic 함수를 거치면서 현재 정보에 대한 보존량을 결정
망각 게이트 : 과거의 정보를 어느 정도까지 기억할지 결정하는 소자
출력 게이트 : 출력층으로 출력할 정보의 양을 결정하는 소자
4. 합성곱 신경망(Convolutional Neural Network, CNN)

- 인간의 시각적 처리 방식을 모방한 신경망
- 이미지 처리가 가능하도록 합성곱(Convolution) 연산 도입
CNN 구조

합성곱층(Convolutional Layer)
- 이미지를 분류하는 데 필요한 특정(Feature) 정보들을 필터를 이용해 추출하는 역할
- 합성곱층에 필터가 적용되면 이미지의 특징들이 추출된 "특성 맵"이라는 결과를 얻을 수 있음
풀링층(Pooling Layer)
- 합성곱층의 출력데이터를 입력으로 받아서 출력 데이터인 활성화 맵의 크기를 줄이거나 특정 데이터를 강조하는 용도로 사용
- 처리 방법 : MaxPooling, MinPooling, AveragePooling,
완전연결층(Fully Connected Layer)
- 합성곱층과 풀링층으로 추출한 특징을 분류하는 역할
- CNN은 합성곱층에서 특징만 학습하기 때문에 DFN이나 RNN에 비해 학습해야하는 가중치의 수가 적어 학습 및 예측이 빠르다는 장점이 있음
5. 워드 임베딩(Word Embedding)
- 단어를 벡터로 표현하는 방법
- 기계가 사람의 언어를 이해할 수 있도록 변환
원 핫 인코딩

- 범주형 변수를 숫자형으로 바꾸는 방법이며 해당되는 것을 1 해당되지 않으면 0으로 바꿔주는 인코딩 방법
워드 투 벡터(Word2Vec)
- 비슷한 context에 등장하는 단어들은 유사한 의미를 지닌다는 이론에 기반하여 단어를 벡터로 표현해 주는 기법
- 주변 단어를 알면 특정 단어를 유추할 수 있다라는 원리를 기반으로 함
- 대표적인 모델로는 CBOW와 skip-gram이 있음
- CBOW : 전체 context로부터 특정 단어를 예측하는 것
- Skip-gram : 특정 단어로 부터 전체 context의 분포를 예측하는 것
TF-IDF
- 단어마다 가중치를 부여하여 단어를 벡터로 변환하는 방법
- TF(Term Frequency) : 특정 문서에서 특정 단어가 등장하는 횟수
- DF(Document Frequency) : 특정 단어가 등장한 문서의 수
- IDF(Inverse Document Frequency) : DF에 반비례하는 수
Fasttext
- 페이스북에서 개발한 워드 임베딩 방법으로 단어를 벡터로 변환하기 위해 부분단어(Sub Words)라는 개념을 도입함
- 부분 단어를 사용하면 Word2Vec에서 문제가 되는 "모르는 단어"문제를 해결할 수 있기 때문에 임베딩에서 많이 사용되는 모델 중 하나
적대적 생성 신경망(Generative Adversarial Network, GAN)
- 두 개의 신경망 모델이 서로 경쟁하면서 더 나은 결과를 만들어 내는 강화학습
- 특히 이미지 생성 분야에서 뛰어난 성능을 보임
- 생성모델(Generator Model)과 판별모델(Discriminator Model)이라고 하며 각각은 서로 다른 목적을 가지고 학습
- ex) 생성모델 : 위조지폐범, 판별모델 : 경찰