딥러닝을 구성하는 필수적인 요소 - 데이터 (Data) : 모델을 학습하기 위해 필요 ( MNIST, Fashion MNIST 등) - 해결하고자 하는 문제(task)에 따라 필요로 하는 데이터의 형태나 구성이 달라짐 - 모델 (Model) : 주어진 데이터를 원하는 결과로 변환 (다층 퍼셉트론(MLP), 컨볼루션 신경망(CNN), 순환 신경망(RNN) 등) - 입력을 원하는 결과로 바꾸어주는 일련의 연산 과정을 구조화한 것 : 딥러닝의 학습 대상 - 손실 함수 (Loss Function) : 모델의 결과에 대한 오차를 수치화 (평균절대오차(MAE), 평균제곱오차(MSE), 교차 엔트로피(CE) 등) - 실제 혹은 목표로 하는 값(y)과 모델의 추정한 값(y) 사이의 차이 - 최적화 알고리즘 (Optimization Algorithm) : 손실 함수의 값이 최소가 되도록 모델의 파라미터를 조정 (경사 하강법(GD), 확률적 경사 하강법(SGD), 모멘텀(Momentum) 등 ) - 기타 알고리즘 : 성능 향상 (Dropout, Regularization, Normalization 등 )
딥러닝 파이프라인 - 모델이 데이터를 통해 추정한 값( )이 정답/목표( )와 최대한 가까워지도록 ( = 손실 함수의 값이 최소가 되도록 ) 파라미터( )를 최적화 알고리즘을 적용하여 최적의 모델 파라미터( )를 찾는 과정
다중 퍼셉트론
뉴럴넷 (nerual network, NN) 개요 - 사람이 인식하는 과정
- 눈을 통해서 정보 수집 -> V1에서 모션 정보 처리 -> V2에서 스테레오 정보 처리 -> V4에서 인지 ->V5에서 상황 인식
- 기계가 손글씨를 인식 하는 과정 - 샘플들을 엄청 보면서 패턴을 파악 -> 주요 특징을 프로그래밍 언어로 표현 -> 의사 결정 룰 결정
- 인공 뉴런
- 뉴럴넷(Neural Network, NN)에서 자동으로 특징들과 의사 결정 룰을 찾아낸다!!
퍼셉트론 (Perceptron) - 인간 및 동물의 뉴런을 모방
- 1957년 코넬 항공 연구소의 프랑크 로젠블라트에 의해 고안된 가장 간단한 형태의 Feed-Forward 네트워크 - 퍼셉트론 예시 : 이진수 입력, 이진수 출력, 스텝함수 - 단일 퍼셉트론만 가지고도 많은 것을 할 수 있음
구조 - 가중치 : weight - w를 뜻하는 것 ⇒ 가중치와 임계치를 변화시키며 다양한 의사 결정 모델을 만들 수 있음 - 편향 : bias(w0) -> w0(bias)가 클수록 출력값이 쉽게 1이 됨
원리 - 퍼셉트론과 선형 분리 -> 퍼셉트론을 일반화하면 선형식을 통한 분리로 이해할 수 있음 → 선형 분리 가능성
퍼셉트론이 각광 받았었던 이유 - 퍼셉트론의 선형 분리 가능성 덕분에 AND, OR, NAND 등의 로직을 구현이 가능 - NAND gate는 “universal for computation”으로 알려져 있고, 이는 어떤 모델이든 NAND gate의 조합으로 표현 가능 - 하나의 퍼셉트론으로 낸드게이트를 표현
- 하지만! XOR 논리 게이트는 하나의 퍼셉트론으로는 구현이 불가능함 -> 여러 층의 퍼셉트론을 활용하면 분리가 가능하며, 이를 다층 퍼셉트론의 비선형 분리 가능성 - > 즉 퍼셉트론들의 조합으로 어떠한 연산이든, 어떠한 입출력 관계든지 표현이 가능
다층 퍼셉트론 (Multi-Layer Perceptron) = Fully-Connected Layers(FCs) - 활성화 함수 (Activation Function) - 입력 신호의 총합을 출력신호로 변환하는 함수 - 활성화 함수가 없는 다층 퍼셉트론 모형 = 단순한 선형식 - 현실에서는 Step Function이 아닌 다른 종류의 활성화 함수들이 사용 - 시그모이드 함수 (Sigmoid Neuron / Sigmoid Function) : 연산 과정 전체를 미분 가능하게 만드는게 큰 목적! => 역전파 기법과 연관
미분 (differentiation)과 기울기 - 변수의 움직임에 따른 함수값의 변화를 측정하는 도구 - 최적화에서 제일 많이 사용하는 기법
- 모든 조합에 대해서 손실함수를 계산하여 나타낸 그래프에서 찾을 수 있음 : 전부다 하면 비효율적임 - 특정 검은색 점에서 어떻게 a,b에 대한 변화를 줘야 L이 줄어드는지 추정하여 파라미터 값을 변화시킴. -> 결국 알아야 할 건, 파라미터를 변화시킬 때 L값이 어떻게 변화하는지! ⇒ 미분
- 2차원 평면에서의 미분
- x에서의 미분값은 함수 f 의 주어진 점 (x, f(x)) 에서의 접선의 기울기와 동일 - 어떤 점에서의 함수의 기울기를 알면 어느 방향으로 점을 움직여야 함수값이 증가or 감소하는지 알 수 있음 - 미분값의 반대 방향으로 가면 감소!! x → x – f '(x)
- 편미분 (partial differentiation)
- 벡터를 입력값으로 받는 다변수 함수의 경우, 각 변수에 대해 미분한 편미분을 사용 - 각 변수에 대한 편미분을 나타낸 그래디언트(gradient) 벡터를 이용하면 마찬가지로 다변수 함수의 기울기를 알 수 있음
경사 하강법 (Gradient Descent, GD) - 기울기(f'(x))가 감소하는 방향으로 x를 움직여서 의f(x) 최소값을 찾는 알고리즘 - 딥러닝에선 손실 함수의 그래디언트가 감소하는 방향으로 파라미터를 움직여 손실 함수의 최소값을 찾음 손실함수의 그래프 예시
- 특정 방향으로 얼마나 움직일지에 대한 상수값 - 미분은 방향, 학습률은 그 방향으로 한 번에 얼마나 갈지! - 손실함수 전체 모양이 부드러운 U모양이다는 가정 : 기울기가 0이면 멈춤, 기울기 크기가 작으면 거의 다 왔다!
- 경사 하강법의 학습과정 1. 모델 파라미터 θ ={W,b} 초기화 2. 전체 학습데이터셋에서의 손실 함수 값을 구하고 미분을 통해 이를 최소화하는 모델 파라미터 W,b를 찾기 3. 2)를 반복하다가 종료 조건이 충족되면 학습 끝 -> 손실함수가 최소(0) - 미분값이 (기울기) 점점 작아지면서 파라미터의 변화량도 작아짐
- 경사 하강법의 알고리즘 (in pseudocode)
- 한계
1. 시작점에 따라서 내용이 달라짐. 2. 모델 구조가 바뀌면 함수 모양이 바뀜
- 해결법 ① 파라미터 초기화를 굉장히 잘한다. (여러 초기화 기법, pretraining) ② 모델 구조를 바꿔서 그래프 모양을 바꾼다. ③ Learning Step을 바꾼다.
- 경사 하강법의 파이프라인
모든 샘플에 대해서 로스를 구해서 다 더해야 한다! 샘플 수가 많으면 연산량이 문제가 된다. (=단점) -> 계산 효율을 위해 손실값을 샘플별 합이 아닌 평균값으로 : 전체 샘플이 아닌 일부 샘플에 대한 평균값으로 대체 ( 그래디언트 계산도 훨씬 간단해짐!)
확률적 경사 하강법 (Stochastic Gradient Descent, SGD) - 모든 데이터를 사용해서 구한 경사를 통해 파라미터를 한 번 업데이트 하는 대신, 데이터 한 개 또는 일부를 활용하여 구한 경사로 여러 번 업데이트를 진행 - ‘미니 배치(mini-batch)’ =‘배치(batch)’ = SGD를 통해 한 번의 학습을 하는 데에 사용되는 데이터 샘플의 집합 - 손실 함수의 크기를 1/m로 스케일하는 과정은 학습 데이터의 크기가 실시간으로 바뀌는 환경에서 특히나 잘 작동 - 온라인 학습(online/incremental learning) = m=1인 환경
- 파이프라인 - 학습을 하기 위해서는 손실 함수의 그래디언트를 계산하는 과정이 불가피 : step function이 아닌 sigmoid function이 퍼셉트론에서 주로 사용되는 이유
- SGD vs. GD (1) 볼록하지 않은 목적식을 가진 경우, SGD가 GD보다 실증적으로 더 낫다고 검증 - SGD는 학습에 활용하는 데이터 샘플이 매번 달라짐에 따라 손실 함수의 형태가 약간씩 바뀐다고 볼 수 있음 - local minima에 빠지는 것을 방지하여 최적해에 도달할 가능성을 높이는 방법
(2) 데이터의 일부를 가지고 그래디언트 벡터를 계산하고 파라미터를 업데이트 - 컴퓨터의 메모리 및 연산 자원을 좀 더 효율적으로 활용
역전파
- 경사 하강법(GD)을 다층 퍼셉트론(MLP)와 같은 딥러닝 모델에 적용하는 과정을 이해하려면 필수적으로 역전파 알고리즘에 대해 알아야함
손실 함수의 기울기 - 모델의 각 파라미터에 대한 손실 함수의 기울기는 해당 파라미터가 잘못된 예측에 얼마나 기여했는지를 나타냄 - 경사 하강법을 적용하려면 모델을 구성하는 각 파라미터에 대해 손실함수를 미분한 결과(그래디언트)가 필요
-> 딥러닝 모델일 경우, 이를 일일이 수식으로 전개하는 것은 매우 복잡한 일 : 계산 그래프를 활용하여 모델의 구조를 표현
계산 그래프 (Computational Graph) - 일련의 연산 과정을 하나의 방향 그래프(directed graph)로 나타낸 것 - 계산 그래프를 사용하면 편미분 계산이 가능하며, 중간 결과들을 보관하는 것이 가능 - 전체 편미분에 필요한 연산들을 작은 단위로 쪼개고, 각각 편미분을 적용해서 합쳐서 최종 결과 도출 - 장점 : 작은 문제에 집중하여 복잡한 문제를 단순화, 각 변수에 대한 미분을 효율적으로 계산
- 노드 : 하나의 연산을 의미 - 엣지 : 노드(연산)에 필요한 입력값
연쇄 법칙 (Chain Rule) - 둘 이상의 연산이 수행된 합성 함수를 미분하기 위해, 연쇄 법칙(chain rule)을 사용 - 합성 함수의 미분은 합성 함수를 구성하는 각 함수의 미분의 곱으로 나타냄
- 연쇄 법칙과 뉴럴넷의 연관성 - 4개의 노드로 구성된 간단한 뉴럴넷의 경우 1. 학습 중인 상황 : 파라미터가 (p1,p2,p3,p4) 특정 값을 가지고 있고, 학습 데이터의 특정 샘플에 (x) 대해서, 손실함수값을 계산가능 2. 모든 파라미터에 대한 편미분을 (∂L/∂p1,∂L/∂p2,∂L/∂p3,∂L/∂p4) 구해야 하는데, 연쇄 법칙을 사용
- 역전파 : 각 노드에서의 편미분을 이전까지의 결과에 곱해서 뒤로 전달
역전파 알고리즘 (Backpropagation Algorithm) - 신경망의 추론 방향과 반대되는 방향으로 순차적으로 오차에 의한 편미분을 수행하여 각 레이어의 파라미터를 업데이트하는 과정 - 계산 그래프의 역전파 - 연쇄 법칙을 활용하여 그래프의 각 노드에 대한 편미분( ∂y/ ∂x)을 기존 신호(E)에 곱하여 이전 레이어의 노드에 전달
- 덧셈 노드 - 곱셈 노드
손실 함수의 기본 가정 - Input → activation function : z - activation function → Output : a : 활성화 함수 입력이 z 출력이 a (다음 레이어의 입력)
비용 함수(=손실 함수)에 대한 가정 - 학습 데이터 샘플에 대한 신경망의 총 손실은, 각 데이터 샘플에 대한 손실의 합과 같다. -> 전체 손실(∂C/∂w)이 아닌 각 데이터에 대한 손실(∂Cx/∂w)에만 집중 - 비용 함수는 설계하기 나름. 샘플별 곱으로 정의할 수도 있지만, 합의 형태로 표현해야만 역전파 기법을 사용가능. - a가 활성화 함수 출력이므로, 최종 레이어의 활성화 함수 출력이 모델의 최종 출력
- 각 학습 데이터 샘플에 대한 손실은 a^L에 대한 함수 - 중간 레이어의 출력 값으로도 비용 함수를 계산할 수도 있지만, 최종 출력에 대한 함수로만 정의를 해야 역전파 기법을 사용가능함.
역전파의 기본 방정식
역전파의 기본 방정식 1. for the error in the output layer, 𝜹^L 2. for the error in the l-th layer in terms of the error in the next layer (l+1), 𝜹^𝒍 ↔ 𝜹^𝒍+1 3. for the rate of change of the cost with respect to any bias in the network 4. for the rate of change of the cost with respect to any weight in the network [ Insight 1 ] Low-activation neurons : 만일 뉴런 a가 활성화된 정도가 작다면, 관련 가중치의 변화가 비용 함수 C의 변화에 거의 영향을 주지 않음 [ Insight 2 ] Saturated neurons : 출력층에서의 출력값이 거의 0 또는 1인 경우, 관련 뉴런의 가중치 및 편향는 느리게 학습. -> 이미 잘 맞추는 문제는 더 이상 풀지 않는 것과 유사함
역전파 알고리즘
모델 파라미터 업데이트 알고리즘 (w/ GD)
손실 함수
손실 함수에 따른 학습 결과 차이 - 어떤 손실 함수를 선택하는지에 따라서도 최종 성능이 달라짐
대표적인 손실함수 - 평균절대오차 (Mean Absolute Error, MAE) = L1 Loss : 실제값(y)과 모델의 추정한 값(y) 사이의 차이에 대한 절대값을 평균낸 값 또는 함수 - 추정하고자 하는 값과의 단위가 같기 때문에 직관적으로 이해하기 쉬움 - 손실 함수의 값이 최소값에 가까워져도 미분값은 동일하기 때문에 점핑이 일어날 수 있으며 손실 함수의 크기를 직접 줄여야함.
- 평균제곱오차 (Mean Squared Error, MSE) = L2 Loss = Quadratic Loss : 실제값(y)과 모델의 추정한 값(y) 사이의 차이를 제곱하여 평균낸 값 또는 함수 - 초반 학습이 빠르나 이상치(outlier)에 민감하다는 특징
- Huber Loss = SVM Loss=MSE +MAE -오차가 일정 수준 이하일 때는 MSE, 그렇지 않을 때는 MAE를 사용하여 두 손실 함수의 장점을 결합한 방법
- 교차 엔트로피 (Cross Entropy, CE) : 주어진 확률 변수 또는 사건 집합에 대한 두 확률 분포 간의 차이를 측정하는 함수 : 이진 분류 문제에 적용되는 교차 엔트로피-BCE(Binary Cross Entropy) = Log Loss
- Hinge Loss - 모델이 만드는 결정 경계(decision boundary)와 데이터 사이의 마진(margin)을 최대화하는 것을 목적으로 하는 손실 함수
- Kullback Leibler Divergence(KLD) Loss
-> 사실상 쓰는 것은, 평균제곱오차 (Mean Squared Error, MSE)와 교차 엔트로피 (Cross Entropy, CE) 를 주로 씀
손실함수 선택법 - Backpropagation 관점 - Vanishing Gradient Problem - 레이어의 수가 증가할수록 활성화 함수의 미분값(0~1)이 계속해서 곱해져, 가중치에 따른 미분값이 0에 수렴하게 되는 문제 - MSE vs. CE
- MSE와는 달리 CE는 출력 레이어에서의 에러값에 활성화 함수의 미분값이 곱해지지 않아 gradient vanishing problem에서 좀 더 자유롭다. (학습이 좀 더 빨리 된다) - 그러나 히든 레이어의 노드들에서는 활성화 함수의 미분값이 계속해서 곱해지므로 레이어가 여럿 사용될 경우에는 결국 gradient vanishing problem에서 완전 자유롭지 않음 - 이러한 관점에서, 활성화 함수의 미분값이 0 또는 1로만 표현되는 ReLU는 훌륭한 선택
- Maximum Likelihood 관점 - 딥러닝 파이프라인 (w/ Negative Log-Likelihood)
- 파라미터를 바꿔서 모델 을 바꾸어서 가우시안 분포를 그리는 것 -> 어떤 분포에서 y가 나올 확률이 더 크냐
- 모델 학습을 위한 역전파 이론의 가정 검토 1. 독립항등분포(i.i.d.) 가정
모델 학습법 실습 - 딥러닝 모델 구현, 학습, 결과출력
MNIST(Modified National Institute of Standards and Technology) Database
- 입력(이미지) : 0부터 9까지의 숫자 중 하나에 속하는 28px * 28px의 흑백 이미지 - 출력(숫자) : 주어진 이미지에 대응되는 숫자 (0~9)
데이터 전처리 - 흑백이미지는 정수값( 0~255의 값)을 가짐 -> 정규화로 하여서 실수(0~1)로 변환 - 코드 라벨 데이터 전처리 : one-hot encoding 수행
MLP 모델 구성 - numpy 라이브러리만으로 구현이 가능 - 활성화 함수 구현 : 시그모이드 함수 및 도함수 - 시그모이드 레이어 구현 & 테스트