피드 포워드 신경망(FFNN) : 순방향신경망
순환 신경망(RNN) :은닉층의 출력값을 출력층으로도 값을 보내지만, 동시에 은닉층의 출력값이 다시 은닉층의 입력으로 사용된다.
전결합층 : 어떤 층의 모든 뉴런이 이전 층의 모든 뉴런과 연결돼 있는 층 = 밀집층
활성화함수
선형함수가 아닌 비선형함수여야 한다. (비선형함수는 직선하나로 그릴 수 없는 함수) 즉, 선형 함수로는 은닉층을 여러번 추가하더라도 1회 추가한 것과 차이를 줄 수 없습니다.
- 시그모이드 함수
출력값이 0 또는 1에 가까워지면, 그래프의 기울기가 완만해지는 모습을 볼 수 있다. 기울기 소실 문제발생(역전파 과정에서 0에 가까운 아주 작은 기울기가 곱해지게 되면, 앞단에는 기울기가 잘 전달되지 않게 됩니다. 다시말해 매개변수 W가 업데이트 되지 않아 학습되지 않는다.)- 하이퍼볼릭탄젠트 함수
출력값이 –1,1에 가까울 때 문제발생- 렐루함수
문제 : 입력값이 음수면 기울기도 0.- 리키렐루
Leaky ReLU는 입력값이 음수일 경우에 0이 아니라 0.001과 같은 매우 작은 수를 반환하도록 되어있습니다.- 소프트맥스함수
분류 문제를 로지스틱 회귀와 소프트맥스 회귀를 출력층에 적용하여 사용합니다.
-> 은닉층에서 주로 렐루, 렐루 변형 많이 사용
순전파 : 입력층에서 출력층 방향으로 예측값의 연산이 진행되는 과정
행렬곱으로 순전파 이해하기
입력차원3, 출력차원2 이면 화살표가 6개 이어지는데 이는 가중치 W의 개수가 6개임을 의미한다. 이를 행렬곱 관점에서는 3차원 벡터에서 2차원 벡터가 되기 위해서 3 × 2 행렬을 곱했다고 이해할 수 있습니다.
행렬곱으로 병렬 연산 이해하기
다수의 샘플을 동시에 처리하는 것 : 배치 연산
EXAMPLE) 입력층부터 뉴런 수 4, 8, 8, 3이면, 행렬크기 추정해보자
입력층-> 은닉층1
Xmn Wnj +Bmj=Ymj
->X14 Wnj +Bmj=Y18
편향 행렬 B는 출력 행렬 Y의 크기에 영향을 주지 않으므로 편향 행렬 B의 크기는 출력 행렬 Y의 크기와 같습니다.
->X14 W4j +B18=Y18
가중치 행렬 W의 열은 출력 행렬 Y의 열과 동일해야 합니다.
->X14 W48 +B18=Y18
배치경사하강법 : 배치 경사 하강법은 한 번의 에포크에 모든 매개변수 업데이트를 단 한 번 수행합니다. 배치 경사 하강법은 전체 데이터를 고려해서 학습하므로 에포크당 시간이 오래 걸린다. model.fit(X_train, y_train, batch_size=len(train_X))
확률적 경사 하강법(SGD)
매개변수 값을 조정 시 전체 데이터가 아니라 랜덤으로 선택한 하나의 데이터에 대해서만 계산하는 방법입니다. model.fit(X_train, y_train, batch_size=1)
미니 배치 경사 하강법 (실제로 가장 많이 사용)
model.fit(X_train, y_train, batch_size=32) #32를 배치 크기로 하였을 경우
모멘텀 – 경사하강법에 관성을 더한다. 경사 하강법에서 계산된 접선의 기울기에 한 시점(step) 전의 접선의 기울기값을 일정한 비율만큼 반영합니다.
tf.keras.optimizers.SGD(lr = 0.01, momentum= 0.9)
아다그라드
각 매개변수에 서로 다른 학습률을 적용시킨다. 이 때, 변화가 많은 매개변수는 학습률이 작게 설정되고 변화가 적은 매개변수는 학습률을 높게 설정시킵니다.
tf.keras.optimizers.Adagrad(lr=0.01, epsilon=1e-6)
알엠에스프롭(RMSprop)
아다그라드는 학습을 계속 진행한 경우에는, 나중에 가서는 학습률이 지나치게 떨어진다는 단점이 있는데 이를 다른 수식으로 대체하여 이러한 단점을 개선하였습니다.
tf.keras.optimizers.RMSprop(lr=0.001, rho=0.9, epsilon=1e-06)
아담(Adam)
알엠에스프롭과 모멘텀 두 가지를 합친 듯한 방법으로, 방향과 학습률 두 가지를 모두 잡기 위한 방법입니다.
tf.keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False)
역전파
순전파는 이해, 역전파는 반대!
에포크와 배치크기와 이터레이션
기계는 실제값과 예측값의 오차로부터 옵티마이저를 통해서 가중치를 업데이트합니다. 머신 러닝에서는 이 과정을 학습이라고 합니다.
(1) 에포크
전체한번 돌린 것, 이 에포크 횟수가 지나치거나 너무 적으면 앞서 배운 과적합과 과소적합이 발생할 수 있습니다.
(2) 배치크기
배치크기와 배치 수는 다르다! 2000개인데 배치크기 200이면 배치 수는 10
(3) 이터레이션=배치의 수
이터레이션이란 한 번의 에포크를 끝내기 위해서 필요한 배치의 수를 말합니다.
데이터 양 늘리기. 만약 데이터 양이 적을 경우에는 의도적으로 기존의 데이터를 조금씩 변형하고 추가하여 데이터 양을 늘린다.
모델의 복잡도 줄이기
가중치 규제 적용하기- 간단한 모델은 적은 수의 매개변수를 갖은 모델
L1 규제: 가중치 W들의 절대값 합계를 비용함수의 추가
L2 규제: 가중치 W들의 제곱합을 비용함수에 추가
-> 이 W앞에 있는 람다값(규제의 강도)는 하이퍼파라미터이다. 비용함수를 최소화하기 위해서는 가중치 W들이 작아져야한다. 그래야 식 W*매개변수로 이루어져있는데 매개변수로서 영향을 거의 못미치게 된다.
드롭아웃
학습시에만 사용하고 예측시에는 사용하지 않는다.
학습 과정에서 신경망의 일부를 사용하지 않는 방법입니다. 예를 들어 드롭아웃의 비율을 0.5로 한다면 학습 과정마다 랜덤으로 절반의 뉴런을 사용하지 않고, 절반의 뉴런만을 사용합니다. 학습 시에 인공 신경망이 특정 뉴런 또는 특정 조합에 너무 의존적이게 되는 것을 방지해준다.
EXAMPLE)
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dropout, Dense
max_words = 10000
num_classes = 46
model = Sequential()
model.add(Dense(256, input_shape=(max_words,), activation='relu'))
model.add(Dropout(0.5)) # 드롭아웃 추가. 비율은 50%
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5)) # 드롭아웃 추가. 비율은 50%
model.add(Dense(num_classes, activation='softmax'))
기울기가 점차 커지더니 가중치들이 비정상적으로 큰 값이 되면서 결국 발산되기도 합니다. 이를 기울기 폭주라고 하고 RNN에서 발생할 수 있습니다.
1. 렐루와 렐루 변형들
은닉층에서는 시그모이드 함수를 사용하지 말자.
Leaky ReLU를 사용하면 모든 입력값에 대해서 기울기가 0에 수렴하지 않아 죽은 ReLU 문제를 해결합니다.
from tensorflow.keras import optimizers
Adam = optimizers.Adam(lr=0.0001, clipnorm=1.)
*정규분포로 초기화할 경우
평균 0, 표준편차 -> 를 따른다.
2) He 초기화
He 초기화는 세이비어 초기화와 다르게 다음 층의 뉴런의 수를 반영하지 않습니다. 전과 같이 이전 층의 뉴런의 개수를
이라고 해봅시다.
He 초기화는 균등 분포로 초기화 할 경우에는 다음과 같은 균등 분포 범위를 가지도록 합니다.
배치 정규화를 사용하면 시그모이드 함수나 하이퍼볼릭탄젠트 함수를 사용하더라도 기울기 소실 문제가 크게 개선됩니다.
가중치 초기화에 훨씬 덜 민감해집니다.
훨씬 큰 학습률을 사용할 수 있어 학습 속도를 개선시킵니다.
미니 배치마다 평균과 표준편차를 계산하여 사용하므로 훈련 데이터에 일종의 잡음 주입의 부수 효과로 과적합을 방지하는 효과도 냅니다. 다시 말해, 마치 드롭아웃과 비슷한 효과를 냅니다. 물론, 드롭 아웃과 함께 사용하는 것이 좋습니다.
하지만 배치 정규화는 모델을 복잡하게 하며, 추가 계산을 하는 것이므로 테스트 데이터에 대한 예측 시에 실행 시간이 느려집니다.
(3) 배치 정규화의 한계
미니 배치 크기에 의존적입니다.
너무 작은 배치 크기에서는 잘 동작하지 않을 수 있습니다. 단적으로 배치 크기를 1로 하게되면 분산은 0이 됩니다. 작은 미니 배치에서는 배치 정규화의 효과가 극단적으로 작용되어 훈련에 악영향을 줄 수 있습니다. 배치 정규화를 적용할 때는 작은 미니 배치보다는 크기가 어느정도 되는 미니 배치에서 하는 것이 좋습니다.
RNN에 적용하기 어렵다.
RNN은 각 시점(time step)마다 다른 통계치를 가집니다. 이는 RNN에 배치 정규화를 적용하는 것을 어렵게 만듭니다. RNN에도 적용하는 것이 가능한 층 정규화!