핵심 키워드
- #심층 신경망 #렐루 함수 #옵티마이저
- 인공 신경망에 층을 여러 개 추가하여 패선 MNIST 데이터셋을 분류하면서 케라스로 심층 신경망을 만드는 방법을 배우자
2개의 층
- 2개의 층
인공 신경망 모델에 층을 2개 추가해보자
입력층과 출력층 사이에 밀집층을 추가하면, 이처럼 입력층과 출력층 사이에 있는 모든 층을 은닉층이라고 부름
입력층은 28 x 28 크기의 2차원 배열을 784 크기의 1차원 배열로 펼침
은닉층은 활성화 함수가 표시되며, 활성화 함수는 신경망 층의 선형 방정식의 계산 값에 적용하는 함수를 뜻함
대표적으로 시그모이드 함수와 렐루 함수 등을 사용함
반면 출력층에 적용하는 활성화 함수는 이진 분류일 경우 시그모이드 함수, 다중 분류일 경우 소프트맥스 함수로 제한됨
2개의 선형 방정식을 사용할 경우, 두 번째 식에 첫 번째 식을 대입하면 하나로 합쳐지게 됨
이처럼 신경망에서 가중치의 곱으로만 표현된다면 뒤에 있는 출력층과 합쳐져서 하나의 층이 되므로
은닉층에서 선형적인 산술 계산만 수행한다면 수행 역할이 없는 셈
그러므로 은닉층을 두어서 활성화 함수를 거쳐 비선형 함수로 데이터를 변경해 단순하게 선형식이 합쳐지지 못하도록 만들어줌
이러한 이유때문에 은닉층에 활성화 함수를 사용하는 것
은닉층에 활성화 함수를 사용할 때는 적어도 출력층의 뉴런보다는 많게 만들어야 정보가 부족하지 않게 전달되므로 주의
심층 신경망 만들기
- 심층 신경망
시그모이드 함수 은닉층인 dense1과 소프트맥스 함수 출력층인 dense2를 Sequential 클래스에 추가해 심층 신경망을 만듦
Sequential 클래스의 객체를 만들 때 여러 개의 층을 추가하려면 리스트로 만들어 전달하며 출력층은 가장 마지막에 두어여 함
- summary() 메소드
케라스의 summary() 메소드를 호출하면 층에 대한 유용한 정보를 얻을 수 있음
이는 맨 처음 추가한 은닉층에서 출력층의 순서대로 나열되며 층마다 층 이름, 클래스, 출력 크기, 모델 파라미터 개수를 출력
또한 층을 만들 때 name 매개변수로 이름을 지정할 수 있으며 지정하지 않으면 케라스가 자동으로 'dense'라고 이름을 붙임
Output Shape (None, 100)
첫 번째 차원은 샘플의 개수를 나타내며 샘플 개수가 아직 정의되어 있지 않기 때문에 None
케라스 모델의 fit() 메소드에 훈련 데이터를 주입하면 이 데이터를 한 번에 모두 사용하지 않고 잘게 나누어 여러 번에 걸쳐
경사 하강법 단계인 미니배치 경사 하강법을 사용하는데, 케라스의 기본 미니배치 크기는 32개이며
이 값은 fit() 메소드의 batch_size 매개변수로 바꿀 수 있으므로 샘플 개수를 고정하지 않고 유연하게 대응하도록 None으로 둠
두 번째 차원은 은닉층의 뉴런 개수를 100개로 두었으므로 100개의 출력이 나오게 된 것
Param # 78500
모델 파라미터 개수가 출력되며 이 층은 Dense 층이므로 입력 픽셀 784개와 100개의 모든 조합에 대한 가중치가 있고
뉴런마다 1개의 절편이 있으므로 78500
785 (입력 픽셀) x 100 (가중치) + 100 (절편) = 78500
Output Shape (None, 10)
배치 차원은 동일하게 None이고 출력 뉴런 개수가 10개이기 때문에 10개의 출력이 나오게 된 것
Param # 1010
100개의 은닉층 뉴런과 10개의 출력층 뉴런이 모두 연결되고 출력층의 뉴런마다 하나의 절편이 존재하므로 1010
100 (은닉층 뉴런) x 10 (출력층 뉴런) + 10 (절편) = 1010
층을 추가하는 다른 방법
- 층을 추가하는 다른 방법
앞에서는 Dense 클래스의 객체 dense1, dense2를 만들어 Sequential 클래스에 전달했으나
이 두 객체를 따로 저장하여 쓸 일이 없기 때문에 Sequential 클래스의 생성자 안에 바로 Dense 클래스의 객체를 만듦
이 방법은 편리하지만 아주 많은 층을 추가하려면 Sequential 클래스 생성자가 매우 길어지게 되며
조건에 따라 층을 추가할 수도 없음
그러므로 Sequential 클래스에서 층을 추가할 때 가장 널리 모델의 add() 메소드를 사용
이는 Dense 클래스의 객체를 따로 변수에 담지 않고 바로 add() 메소드로 전달하기 때문에
한눈에 추가되는 층을 볼 수 있고 프로그램 실행 시 if문 등을 사용해서 동적으로 층을 선택하여 추가할 수 있음
- 모델 훈련
모델을 훈련하기 위해 compile() 메소드로 설정한 후 5번의 에포크동안 훈련
훈련 세트에 대한 성능을 보면 추가된 층이 성능을 향상시켰다는 것을 알 수 있음
렐루 함수
- 렐루 함수와 Flatten 층
초창기 인공 신경망의 은닉층에 많이 사용된 활성화 함수는 시그모이드 함수
하지만 시그모이드 함수는 오른쪽과 왼쪽 끝으로 갈수록 그래프가 누워있기 때문에
선형 출력값이 너무 커지거나 너무 작아질 경우, 변화가 굉장히 작아져 올바른 출력을 만드는데 신속하게 대응하지 못함
특히 층이 많은 심층 신경망일수록 그 효과가 누적되어 학습을 더 어렵게 만듦
이를 개선하기 위해 다른 종류의 활성화 함수인 렐루 함수가 제안됨
렐루 함수는 입력이 양수일 경우 마치 활성화 함수가 없는 것처럼 그냥 입력을 통과시키고 음수일 경우 0으로 만듦
즉, 이 함수는 z가 0보다 크면 z를 출력하고 z가 0보다 작으면 0을 출력함
특히 렐루 함수는 이미지 처리에서 좋은 성능을 냄
이외에도 케라스에서는 Flatten 클래스를 제공하여 입력 차원을 모두 일렬로 펼치는 역할을 하도록 함
이는 입력에 곱해지는 가중치나 절편이 없으므로 인공 신경망의 성능을 위해 기여하는 바가 없으며 단지 편의를 위해 제공됨
이로 인해 앞서 인공 신경망에 주입하기 위해 넘파이 배열의 reshape() 메소드를 사용하지 않아도 됨
이렇게 렐루 함수와 Flatten 클래스를 적용하고 모델을 컴파일해서 훈련하면
시그모이드 함수를 사용했을 때와 비교하면 성능이 조금 향상된 것을 볼 수 있음
옵티마이저
- 옵티마이저
앞서는 compile() 메소드에서 케라스의 기본 경사 하강법 알고리즘은 RMSprop을 사용했으며
또한 케라스는 다양한 종류의 경사 하강법 알고리즘을 제공하고 이들을 옵티마이저라고 함
가장 기본적인 옵티마이저는 확률적 경사 하강법인 SGD
이름은 SGD이지만 1개의 샘플을 뽑아서 훈련하지 않고 기본적으로 미니배치를 사용함
SGD 옵티마이저를 사용하려면 compile() 메소드의 optimizer 매개변수를 'sgd'로 지정하거나
SGD 클래스를 통해 객체를 구현해 optimizer에 넣어줌
만약 SGD 클래스의 학습률 기본값이 0.01일 때 이를 바꾸고 싶다면 원하는 학습률을 learning_rate 매개변수에 지정
SGD 외에도 다양한 옵티마이저들이 존재하며 기본 경사 하강법 옵티마이저는 모두 SGD 클래스에서 제공함
SGD 클래스의 momentum 매개변수의 기본값은 0이며 이를 0보다 큰 값으로 지정하면
마치 이전의 그레이디언트를 가속도처럼 사용하는 모멘텀 최적화를 사용할 수 있으며
보통 momentum 매개변수는 0.9 이상을 지정함
또한 SGD 클래스의 nesterov 매개변수를 기본값 Fasle에서 Ture로 바꾸면 네스테로프 모멘텀 최적화를 사용할 수 있음
네스테로프 모멘텀은 모멘텀 최적화를 2번 반복하여 구현함
기본 경사 하강법 옵티마이저 외에도
한 번에 경사를 너무 빠르게 내려가면 최적점을 건너뛸 수 있으므로 모델이 최적점에 가까이 갈수록 학습률을 낮춰
안정적으로 최적점에 수렴할 가능성을 높이는 적응적 학습률을 사용하는 옵티마이저가 존재
적응적 학습률을 학습률을 사용하는 대표적인 옵티마이저는 Adagrad와 RMSprop가 있으며
모멘텀 최적화와 RMSprop의 장점을 접목한 Adam이 존재
Adam 클래스의 매개변수 기본값을 사용해 5번의 에포크 동안 패션 MNIST 모델을 훈련하면
기본 RMSprop를 사용했을 때와 거의 같은 성능을 보여주는 것을 볼 수 있음
'ML > 혼자 공부하는 머신러닝 + 딥러닝' 카테고리의 다른 글
[혼공머신] 08. 이미지를 위한 인공 신경망 - 합성공 신경망의 구성 요소 (0) | 2022.07.12 |
---|---|
[혼공머신] 07. 딥러닝을 시작합니다 - 신경망 모델 훈련 (0) | 2022.07.07 |
[혼공머신] 07. 딥러닝을 시작합니다 - 인공 신경망 (0) | 2022.07.05 |
[혼공머신] 06. 비지도 학습 - 주성분 분석 (0) | 2022.06.30 |
[혼공머신] 06. 비지도 학습 - k-평균 (0) | 2022.06.29 |