일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- c언어
- 순환신경망
- 정보처리기사실기
- JSP/Servlet
- 컴퓨터비전
- html/css
- 상속
- 파이썬
- 컴퓨터구조
- 혼공머신
- 자바스크립트심화
- 티스토리챌린지
- CSS
- SQL
- JSP
- 데이터베이스
- 정보처리기사필기
- 자바스크립트
- 자바
- 딥러닝
- rnn
- 디버깅
- JDBC
- 오블완
- 중학1-1
- 자바 실습
- 머신러닝
- 연습문제
- 중학수학
- 데이터분석
- Today
- Total
클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지
딥러닝을 시작합니다 4 - 심층 신경망 2 : 렐루 함수와 옵티마이저 본문
이어서 심층 신경망 학습을 진행해 보겠다. 아침에 일정이 있어 1시간 만에 이 공부를 모두 마치려고 한다.
렐루 함수
초창기 인공 신경망의 은닉층에 많이 사용된 활성화 함수는 시그모이드 함수이다. 하지만 이 함수에는 단점이 있다. 오른쪽과 왼쪽 끝으로 갈수록 그래프가 누워있기 때문에 올바른 출력을 만드는데 신속하게 대응하지 못한다.
특히 층이 많은 심층 신경망일수록 그 효과가 누적되어 학습을 더 어렵게 만든다. 이를 개선하기 위해 다른 종류의 활성화 함수가 제안되었다. 바로 렐루(ReLU) 함수이다. 입력이 양수일 경우 마치 활성화 함수가 없는 것처럼 그냥 입력을 통과하고 음수일 경우에는 0으로 만든다.
렐루 함수는 max(0, z)와 같이 쓸 수 있다. 이 함수는 z가 0보다 크면 z를 출력하고 z가 0보다 작으면 0을 출력한다. 렐루 함수는 특히 이미지 커리에서 좋은 성능을 낸다고 알려져 있다.
렐루 함수를 적용하기 전에 케라스에서 제공하는 편리한 층 하나를 더 살펴보겠다. 패션 MNIST 데이터는 넘파이 배열의 reshape() 메서드를 사용해 1차원으로 펼쳤다. 직접 1차원으로 펼쳐도 좋지만 케라스에서는 이를 위한 Flatten 층을 제공한다.
사실 Flatten 클래스는 배치 차원을 제외하고 나머지 입력 차원을 모두 일렬로 펼치는 역할만 한다. 입력에 곱해지는 가중치나 절편이 없다. 성능을 위해 기여하는 바는 없다. 하지만 Flatten 클래스를 입력층과 은닉층 사이에 추가하기 때문에 이를 층이라 부른다. 이 층은 입력층 바로 뒤에 추가한다.
첫 번째 Dense 층의 활성화 함수를 relu로 바꾼 것을 눈여겨보라. 모델의 summary() 메서드를 호출해 보면 이런 점을 더 확실히 알 수 있다.
케라스의 Flatten 층을 신경망 모델에 추가하면 입력값의 차원을 짐작할 수 있다. 앞의 출력에서 784개의 입릭이 첫 번째 은닉층에 전달된다는 것을 알 수 있다. 이는 이전에 만들었던 모델에서는 쉽게 눈치채기 어려웠다.
훈련 데이터를 다시 준비해서 모델을 훈련해보겠다.
시그모이드 함수를 사용했을 때보다 성능이 조금 향상되었다. 크지 않지만 렐루 함수 효과를 보았다.
은닉층을 추가하지 않은 경우보다 성능이 몇 퍼센트 향상되었다.
옵티마이저
하이퍼파라미터는 모델이 학습하지 않아 사람이 지정해 주어야 하는 파라미터이다. 신경망에는 하이퍼파라미터가 많다. 여러 개의 은닉을 추가할 수 있는데 은닉층의 개수는 모델이 학습하는 것이 아니라 우리가 지정해 주어야 할 하이퍼파라미터이다.
compile() 메서드에서는 케라스의 기본 경사 하강법 알고리즘이 RMSprop를 사용했다. 케라스는 다양한 종류의 경사 하강법 알고리즘을 제공한다. 이들을 옵티마이저라고 부른다. RMSprop의 학습률 또한 조정할 하이파라미터 중 하나이다.
가장 기본적인 옵티마이저는 확률적 경사 하강법인 SGC이다. 이름이 SGD이지만 1개의 샘플을 뽑아서 훈련하지 않고 기본적으로 미니배치를 사용한다.
SGD 옵티마이저를 사용하려면 compile() 메서드의 optimizer 매개변수를 'sgd'로 지정한다.
만약 SGD 클래스의 학습률 기본값이 0.01일 때 이를 바꾸고 싶다면 원하는 학습률을 learning_rate 매개변수에 지정하여 사용한다.
SGD 외에도 다양한 옵티마이저들이 있다.
기본 경사 하강법 옵티마이저는 모두 SGD 클래스에서 제공한다. 이 클래스의 momentum 매개변수의 기본값은 0이다. 이를 0보다 큰 값으로 지정하면 마치 이전의 그레이디언트를 가속도처럼 사용하는 모멘텀 최적화를 사용한다.
다음처럼 SGD 클래스의 nesterov 매개변수를 기본값 False에서 True로 바꾸면 네스테로프 모멘텀 최적화를 사용한다.
모델이 최적점에 가까이 갈수록 학습률을 낮출 수 있다. 이렇게 하면 안정적으로 최적점에 수렴할 가능성이 높다. 이런 학습률을 적응적 학습률이라고 한다. 이런 방식들은 학습률 매개변수를 튜닝하는 수고를 덜 수 있는 것이 장점이다.
적응적 학습률을 사용하는 대표적인 옵티마이저는 Adagrad와 RMSprop이다.
RMSprop로 마찬가지다.
모멘텀 최적화와 RMSprop의 장점을 접목한 것이 Adam이다. 여기서는 Adam 클래스의 매개변수 기본값을 사용해 패션 MNIST 모델을 훈련해 보겠다.
출력 결과를 보면 기본 RMSprop을 사용했을 때와 거의 같은 성능을 보여준다.
환경마다 조금씩 차이가 있지만 여기서는 기본 RMSprop보다 조금 나은 성능을 낸다.
단원 마무리하기
SGD는 기본 경사 하강법과 모멘텀, 네스테로프 모멘텀 알고리즘을 구현할 클래스이다. 이런 알고리즘들은 모둘 일정한 학습률을 사용한다.
학습을 마치고
심층 신경망도 공부를 마쳤다. 오후에 약속이 있어서 늦어도 아침 11시 반까지는 공부를 마쳐야 할 것 같아 빠르고 공부를 진행했다. 그래도 3시간 반 정도 걸렸다. 딥러닝이 무엇인지 조금 알 것 같다.
이제 오후 늦게 마지막 장 학습을 진행해 볼 것이다.
'인공지능 > 딥러닝' 카테고리의 다른 글
딥러닝을 시작합니다 6 - 신경망 모델 훈련 2 : 모델 저장과 복원 및 콜백 (0) | 2024.10.26 |
---|---|
딥러닝을 시작합니다 5 - 신경망 모델 훈련 1 : 손실 곡선과 검증 손실 그리고 드롭아웃에 대하여 (0) | 2024.10.25 |
딥러닝을 시작합니다 3 - 심층 신경망 1 : 심층 신경망 만들기 및 층을 추가하는 다른 방법 (0) | 2024.10.25 |
딥러닝을 시작합니다 2 - 인공 신경망 2 : 인공 신경망으로 모델 만들기 (0) | 2024.10.25 |
딥러닝을 시작합니다 1 - 인공 신경망 1 : 패션 MINIST 데이터셋으로 딥러닝 실습해보기 (0) | 2024.10.04 |