오늘은 이 3개에 대해 배워보겠다.
- Perceptron
- MLP
- input, hidden, output layer
- 신경망 학습 : 순전파-손실 계산-역전파 과정
- Gradient Descent
- Optimizer
- Learning Rate
- Weight Initialization
- Regrularzation
- Weight Decay
- Weight Scheduling
- Dropout
- Early Stopping
- Cross Validation
- GridSearch, RandomSearch
🌀 신경망 학습
- 순전파 : 입력 신호 정보를 입력층부터 출력층까지 전달하여 값을 출력한다.
- 손실 계산 : loss function을 사용하여 예측값, 실제값의 차이 계산
- 역전파 : 손실을 줄이는 방향으로 경사하강법을 통해 각 가중치 갱신
- 학습 중지 기준을 만족할 때까지 1~3의 과정 반복한다.
1~3의 과정을 iteration이라고 하며, 매 iteration마다 가중치 갱신됨.
Loss Function
신경망은 손실 함수를 최소화하는 방향으로 가중치를 갱신한다. 그렇기 때문에 손실 함수를 잘 정의해주어야 가중치가 제대로 갱신될 수 있다!
일반적으로,
- 회귀 손실 함수 : MSE, MAE
- 이진 분류 손실 함수 :
binary_crossentropy
- 다중 분류 손실 함수
categorical_crossentropy
: label이 원핫인코딩 형태일 때sparse_categorical_crossentropy
: label이 원핫인코딩 형태가 아닐 때
🌀 Optimizer - Gradient Descent
: 경사를 내려가는 방법 결정하는 것으로, 가중치 수정 방향을 결정한다.
순전파를 통해 예측값 → 손실함수를 통해 예측값, 실제값의 차이가 0에 가까울수록 더욱 정확한 예측이 가능해지므로, 기울기가 0에 가깝게 해줌
경사하강법을 통해 가중치가 update되는 과정이 매 iteration마다 적용된다.
각각의 가중치는 어떻게 update될까?
경사하강법을 사용하기 때문에 각 가중치에 대한 기울기(gradient)값을 구해줘야한다.
편미분, 연쇄 법칙 사용!!!!
- 편미분 (partial derivatives): 가충기(param)가 2개 이상인 함수에서 특정 가중치에 대한 기울기 계산해줌.
예를 들어, 가중치 3개가 있을 때, 하나의 가중치를 갱신하기 위해서 나머지 2개의 가중치는 상수로 생각하고 (갱신하고자하는 가중치만 계산하기 위해) 미분 하는 방법을 말한다.
- 연쇄 법칙 (chain rule) : 합성 함수의 미분을 쉽게 해주어, 모든 가중치에 대한 기울기 계산해줌.
연쇄법칙을 사용하여, 각 변수가 얼마나 수정되어야할지에 대한 정보를 전달할 수 있다.
sigmoid를 activation function으로 사용하는 경우, 은닉층의 깊이가 깊다면 오차율 계산이 어렵다. 이것이 딥러닝에 sigmoid를 사용할 때 vanish gradient 문제가 발생하는 이유이다.
수많은 optimizer가 있지만, GD, SGD, mini-batch GD만 우선 알아보자.
1. Gradient Descent (GD)
일반적인 경사 하강법
단점
Gradient Descent는 매 iteration마다 모든 데이터를 사용하여, 손실 계산 과정이 굉장히 오래걸린다.
그래서 등장한 것이 바로 확률적 경사 하강법, 미니 배치 경사하강법이다.
2. Stochastic Gradient Descent (SGD)
확률적 경사 하강법
전체 데이터에서 하나의 데이터를 뽑아서 신경망에 입력 후 손실 계산 후, 그 손실 정보를 역전파하여 신경망의 가중치를 update하게 된다.
즉, iteration마다 1개의 데이터만을 이용한다.
→ 가중치를 빠르게 update!
단점
1개의 데이터만 보기 때문에, 학습 과정에서 불안정한 경사 하강을 보인다.
3. Mini-Batch Gradient Descent
GD, SGD 방법을 적절히 융화한 방법으로, 일반적으로 가장 많이 사용된다.
N개의 데이터로 mini batch 구성후, 미니 배치를 신경망에 입력후 이 결과로 가중치 update하는 방법
모든 데이터를 사용해 오래 걸리지만 안정적인 GD, 하나의 데이터를 사용해 빠르지만 불안정한 SGD의 각각의 장점을 융화시킴.
- batch size : 미니 배치의 크기
- 일반적으로 2의 배수로 설정
- 메모리 크기가 허락한다면 큰 배치 사이즈를 쓰는 것이 학습을 안정적으로 진행
- Data 개수 = batch size x iteration
- batch size가 작을 때
- 단점 : 경사하강법을 통한 가중치 갱신이 불안정해, 최적점에 이르기까지 많은 iteration을 필요로 한다.
- 장점 : Noise가 상대적으로 높기 때문에, 지역 최적점(Local Minima)에서 빠져나올 확률이 높아짐
- batch size가 클 때
- 장점 : 가중치 갱신이 안정적으로 일어나기 때문에 학습 속도가 빨라짐.
- 단점 : 메모리를 초과해버리는 Out-of-Memory 문제 발생
- 최적의 batch size는?
- 항상 큰 batch size가 최고의 결과를 가져다 주진 않는다.
- 가장 좋은 방법은 hyperparameter tunning이다.
- 여러 batch size에 대해 신경망 학습 후 가장 좋은 결과를 보이는 batch size 결정하게된다.
ex) 데이터의 개수가 1000개, batch_size=8, epochs=5라면, 학습이 종료될 때까지 iteration은 몇 회 일어날까?
→ 데이터 하나 다도는 iteration = 1000/8=125 , 총 iteration = epochs가 5니까, 125x5 = 625
어떤 optimizer가 가장 좋다고 말하기는 어렵다.
여러 optimizer를 적용하면서 비교해봐야할 것이다.
🌀 Tensorflow 신경망 예제
Fashion MNIST 예제를 사용해보자. (다중 분류)
from tensorflow.keras.datasets import fashion_mnist
from tensorflow.kears.models import Sequential
from tensorflow.keras.layers import Dense, Flatten
(x_train, y_train), (x_test, y_test) = fashion_mnist.load_data()
# 이미지 데이터라서, 정규화해줌.
x_train, x_test = x_train/255.0, x_test/255.0
np.unique(y_train)
>> array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=uint8) # 다중 분류 문제
model = Sequential()
model.add(Flatten(input_shape=(28,28))
model.add(Dense(10, activation='softmax'))
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(x_train, y_train, epochs=10)
#(default=None) shuffle=True (순서를 랜덤하게 섞었을 때 더욱 성능이 좋을 때가 있음. 좀 더 일반화해줌)
model.evaluate(x_test, y_test, verbose=2)
다중 분류 문제니까, 출력층의 activation은 softmax로 지정해주었다.
loss함수는 class label을 보고, sparse_categorical_crossentropy로 지정해주었다.
class label의 개수는 10개 였으니 출력층의 Dense층의 숫자는 10으로 지정하였다.
어떤 optimizer를 사용할지 모르겠을 때는, 비교적 준수한 성능을 내주는 adam을 사용하는 것이 좋다.
model.summary()
>> Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
flatten (Flatten) (None, 784) 0
dense (Dense) (None, 10) 7850
=================================================================
Total params: 7,850
Trainable params: 7,850
Non-trainable params: 0
_________________________________________________________________
Dense layer에서는 10개 유닛을 가지고 있으므로, 784(입력 유닛 수) x 10(출력 유닛수) + 10(bias, 출력 유닛수 따라감) = 7850개의 학습 가능한 파라미터
[SUMMARY]
신경망 학습의 대략적인 과정
- 신경망에서 사용할 초기 가중치 임의로 설정
- 설정한 파라미터 이용해 입력 데이터를 신경망에 넣은 후, 순전파 과정을 거쳐 예측값 얻음.
- 예측값, 실제값 차이 비교해 손실 계산
- 손실의 gradient를 계산하여, gradient가 줄어드는 방향으로 가중치 update해줌. 이 때 각 가중치의 gradient를 계산할 수 있도록 손실 정보를 전달하는 과정을 역전파라고 한다.
- optimizer 파라미터를 이용해 얼마만큼의 데이터를 이용하여 가중치를 어떻게 update할 지 결정한다. (adam, stochastic or mini batch, ..)
- 1~5 과정을 몇 회(epoch) 할지 결정한다.
More Study
- batch size : gradient를 만들 데이터의 개수
- iteration : 순전파-역전파 과정을 거쳐 가중치 update 되는 횟수 (step)
- epoch : 훈련 데이터셋 전체가 몇 번
해당 지점에서의 기울기구하는 과정을 수학적으로 유도해보자!
- w21 지점에서의 기울기
- w11지점에서의 기울기
Convex function & Concave function
convex function(볼록 함수)에서는 Gradient Descent가 잘되고, concave function(오목 함수)에서는 GD가 잘 안된다.
해석학에서의 볼록 함수는 아래로 볼록한 것만 볼록함수라고 한다. 오목함수는 위로 볼록한 것을 말한다.
Mathematcial Optimization Problem
주어진 조건 하에서 목적 함수를 최소화 또는 최대화하는 변수의 값을 찾는 문제
f(x) : 목적 함수 (objective function)
g_i(x) : 부등식 제약 조건 함수 (inequality constraint function)
h_j(x) : 등식 제약 조건 함수 (equaility constraint function)
최적화 알고리즘은 f(x)를 최소화하면서, 모든 제약 조건 g_i(x)≤0, h_j(x)=0을 만족하는 x를 찾으려고한다.
제약 조건 두 가지로 분류
- Explicit constraints : 말 그대로 optimization problem에 직접적으로 명시된 제약조건 (explicit constraints가 없는 문제를 unconstrained problem이라한다.)
- Implicit constraints : optimization problem에 직접적으로 명시되지 않는 제약조건 (objective function, 모든 constraint function들의 정의역에 대한 교집합)
ex) Optimization problem으로 minimize log(x)가 주어졌다고 해보자.
- 여기서 objective function인 log함수의 정의역이 x>0이므로 x>0이 이 문제에서의 implicit constraint가 된다. (직접적으로 명시해주지 않았음)
- 이 문제를 explicit constraints 형태로 바꾼다면, minimize log(x) subject to x>0이라 optimization problem이라 정의하면 되겠지.
optimization problem은 다양한 영역에 걸쳐 사용될 수 있다.
- ML, DL - variables : model parameter, constraints : 사전 정보 (param에 대한 제약사항), objective : 예측값에 대한 error function이겠지.
- portfolio - variables : 각 자산에 대한 투자금, constraints : 예산, 자산당 최소/최대 투자가능 금액, 최소 수익, objective : 전반적인 위험도 또는 주가 수익률 분산
Convex Opimization problem
앞서 배운, optimization problem을 참고해서 보자.
- g_i (inequality constraint function) : convex
- g : convex function if dom f is a convex set , (for all x,y in dom f, 0≤theta≤1)
- 여기서 convex set은 어떤 집합이 있을 때, 이 집합의 원소인 두 점 x1, x2를 잇는 선분이 이 집합에 다시 포함될 때 이 집합을 convex set이라 한다.
- 두 점을 잇는 이 선분은 구간 [x,y]에서 그래프보다 크거나 같게 위치한다. → 이는 함수 f(x)가 구간 [x,y]에서 볼록(convex)하다는 가정 아래에서, 선분의 아래쪽 영역이 그래프 위쪽으로 오게끔 제약 조건을 설정한것이다.
- 이러한 제약 조건을 통해, 최적화 변수 x가 주어진 구간 [x,y]에서 주어진 함수 f(x)보다 더 크게 설정되지 않도록 한다. 이를 통해 최적화 변수 x가 주어진 구간에서 함수 f(x)의 최솟값을 찾는 해를 찾는 것이 목적이다.
- ex) f(x)=x^2이 주어진 구간[0,1]에서 convex하다고 가정해보자. 이때 두 점을 잇는 선분은 구간[0,1]에서 그래프보다 크거나 같게 위치한다는 제약 조건을 설정하면, 최적화 변수 x가 [0,1]에서 f(x)보다 더 크게 설정되지 않도록 한다. 이를 통해 최적화 변수는 0~1값만 가지며, 이를 통해 f(x)의 최솟값을 찾는 해를 찾을 수 있다.
- convex function의 local minimum은 항상 global minimum이다.
- 따라서 GD가 매우 잘 작동하기 때문에, GD만 계속 반복해서 수행하더라도 gloabl minima를 찾을 수 있따!!!
- But, 이런 함수는 아주 드물고, 딥러닝에서 주로 다루는 함수는 nonconvex function이다. 따라서, 인공신경망으로 GD를 훈련하는 이상, global minima에 도달하기는 거의 불가능하다…
- 그럼에도 불구하고, nonconvex function에서 GD가 잘 동작하도록 하기 위해 할 수 있는 일들이 있따!!
- 다양한 시작점에서 시작해보기 (어차피 극소값까지밖에 못갈것이라면, 이왕이면 좋은 출발점에서 시작하는 것이 좋다. 어디가 좋은 출발점인지는 훈련 결과를 봐야 알것같다.?)
- learning rate 변경해보기 (어느 정도 성능이 수렴하면 학습 속도를 낮추어 조금 더 촘촘히 움직여보는 방법도 좋겠지.)
- h_j (equality constraint function) : affine (linear function에 상수합이 붙은 형태의 함수)
Momentum
GD 알고리즘의 단점은 기울기가 0인 점을 잘 탈출하지 못하고, 훈련이 너무 느리다. 이를 해결하기 위해 보편적으로 사용하는 방법이 관성(momentum)을 추가하는 것이다.
- 관성 : 변수가 가던 방향으로 계속 가도록 하는 속도항 추가하는 것
원래의 기울기는 가던 방향을 약간씩만 바꿔주는 역할을 한다. 모멘텀을 추가하면, 바른 방향으로 가고있을 경우 속도가 더 빨라지게 되어 더 빨리 훈련될 수 있다. 또한, 현재 기울기가 0인 점이더라도 속도가 있으니 계속 이동해 탈출할 수 있게 한다.
새로운 속도는 이전 속도와의 지수평균을 통해 계산된다. learning rate처럼, 지수 평균에 사용되는 momentum rate가 있다. momentum rate가 클수록, 이전 속도를 더 따르게 된다.
momentum rate는 0.5정도로 시작해 어느 정도 감소 추세가 안정화되면 0.9로 늘려 사용한다. 다양한 안정화 기법이 나온 요즘에는 시작을 0.9부터 하기도 한다.
momentum을 사용한다는 것은 학습속도를 기존에서1/1-momentum rate배 속도로 보정하 것이라고 해석할 수 있다. momentum rate를 0.9로 한다는 것은, 기존 대비 약 10배 속도의 정도로 움직이는 것이라 할 수 있다.
관성으로 달려가는 방향은 결국 예전 상태가 만든 방향이다. 예전의 상태를 사용하는 것말고, 바뀔 상태를 사용해 만든 ‘가속 관성 알고리즘’이 있다. Nesterov Accelerated Momentum(NAG) 알고리즘은 지금의 속도로 달려갔을 때 ‘도달할’점에서의 기울기를 계산해 더한다.
hstack
: 옆으로 붙여줌 / vstack
: 밑으로 붙여줌.
amix
: array에서 가장 큰 값 (axis=0 : 열에 대한 것, axis=1 : 행에 대한 것)
np.random.randn
: 정규분포를 따르는 랜덤값 출력
'Machine Learning' 카테고리의 다른 글
[Neural Networks 4] Hyperparameter Tuning (0) | 2023.04.24 |
---|---|
[Neural Networks 3] 더 나은 신경망 학습을 위한 방법 (0) | 2023.04.24 |
[Neural Networks 1] Artificial Neural Network (0) | 2023.04.23 |
[Applied Predictive Modeling 4] Special Classification Problem (0) | 2023.04.17 |
[Applied Predictive Modeling 3] ML Problem Framing (0) | 2023.04.17 |