일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 자바스크립트
- SQL
- 중학수학
- 중학1-1
- 컴퓨터비전
- 정보처리기사실기
- 파이썬
- CSS
- 딥러닝
- 정보처리기사필기
- c언어
- 순환신경망
- 자바 실습
- JSP/Servlet
- 데이터베이스
- rnn
- 디버깅
- ChatGPT
- 자바스크립트심화
- 개발일기
- 컴퓨터구조
- 데이터분석
- 머신러닝
- 연습문제
- 상속
- JSP
- 혼공머신
- html/css
- JDBC
- 자바
- Today
- Total
클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지
케라스 5 - 모델 세부 설정 본문
이번에는 모델 세부 설정하는 방법을 공부해 보겠다. 앞에서 다룬 mnist 데이터셋을 다시 사용한다. 데이터 정규화까지 처리하여 입력 데이터를 준비한다.
1. 초기값 설정
레이어의 초기화 방법을 다르게 설정할 수 있다. Dense 레이어는 기본 초기화 방법으로 Glorot Uniform 초기화 방법이 설정되어 있다.
기본값으로 설정된 Glorot Uniform 초기화 방법을 HeNormal로 변경하기 위해서는 kernel_initalizer 매개변수에 설정하면 된다.
2. 규제
모델의 과대적합을 해소하기 위해 L1, L2 규제를 적용하기도 한다. 텐서플로 케라스 레이어는 기본값으로 규제를 적용하지 않고 있다. 다음 코드에서 kernel_regularizer 설정이 None으로 설정되어 있는 것을 확인할 수 있다.
따라서 레이어에 규제를 적용하기 위해서는 별도로 설정해 주어야 한다.
모델이 과대적합하는 것을 방지해 주기 위해 모델을 구성하는 레이어마다 규제를 적용할 수 있다. 케라스에서 지원하는 규제는 L1, L2 규제가 있다. 규제를 적용하기 위해 kernel_regularizer에 규제를 적용하면 된다.
3. 드롭다운
드롭다운은 2014년에 발표된 논문에서 제안된 아이디어며, 무려 26000번 넘게 인용된 논문이다.
딥러닝 모델의 가장 큰 난제가 바로 과대적합 문제다. 딥러닝 모델의 층이 넓고 깊어질 때 모델은 훈련에 주어진 샘플에 과하게 적합하도록 학습하는 경향이 있다. 따라서 훈련할 때 만나지 못한 새로운 데이터에 대해서는 좋지 않은 예측력을 보일 때가 많다. 즉, 훈련 데이터셋에 너무 적응하여 검증 데이터셋이나 테이스 데이터셋에 대해 일반화된 성능을 갖지 못하는 문제가 자주 발생하는 편이다.
드롭아웃은 모델의 과대적합 문제를 해결하기 위해 제안된 아이디어이며, 실무적으로 상당히 좋은 효과를 보이는 것으로 알려져 있다.
왼쪽 그림을 보면 모든 노드들이 연결되어 있다. 하지만 오른쪽 그림은 고든 노드가 연결되어 있지 않고 확률적으로 몇 개의 신호는 끊겨 있다. 이렇게 노드의 일부 신호를 임의로 삭제하게 되면, 모델이 쉽게 과대적합되는 것을 방지할 수 있다. 모델이 학습하는 가중치 파라미터의 개수가 현저하게 줄어들게 되기 때문이다.
중요한 점은 모델이 훈련할 때는 드롭아웃이 적용되어 노드 중 일부만 훈련하게 되지만, 예측 시점에는 모든 노드들이 활용된다.
케라스에서 드롭아웃은 다음과 같이 설정할 수 있다. Dropout 레이어 함수에 입력하는 숫자는 노드에서 제거되는 비율을 나타낸다.
4. 배치 정규화
배치 정규화는 2015년 세르게이 이오페와 크리스티안 세게디가 제안한 개념이다. 배치 정규화는 각 층에서 활성화 함수를 통과하기 전 미니 배치의 스케일을 정규화한다. 다음 층으로 데이터가 전달되기 전에 스케일을 조정하기 때문에 보다 안정적인 훈련이 가능하고 성능을 크게 향상할 수 있다.
배치 정규화 층은 케라스에서 클래스 함수로 지원하기 때문에 별도로 코드를 구현할 필요가 없고, 클래스 인스턴스를 생성하여 추가해 주면 된다.
다음 코드에서는 Dense 레이어에 ReLU 활성화 함수를 추가한 모델을 model_a로 지정하여 생성하고, 배치 정규화를 적용 후 ReLU 활성화 함수를 추가한 모델을 model_b에 지정하여 성능을 비교해 보도록 하자.
동일한 조건에서 10번의 epoch 동안 model_a, model_b 두 모델을 훈련한 결과는 다음과 같다.
그래프를 보면, 배치 정규화만 추가하였는데 손실은 이전 대비 더 안정적이고 빠르게 수렴하는 것을 확인할 수 있다. 데이터 개수가 적은 편인 mnist 손글씨 데이터셋에서는 큰 차이를 보이지 않을 수 있지만, 더 크고 복잡한 데이터셋에 대해서는 배치 정규화 유무가 모델 성능에 큰 영향을 미치는 경우도 있으므로 배치 정규화를 적극 적용해 볼 필요가 있다.
5. 활성화 함수
지금까지 다뤄본 예제들은 주로 Dense 레이어에 ReLU 활성화 함수를 지정했다. 케라스가 지원하는 다른 활성화 함수를 적용해 볼 수 있다. 활성화 함수를 적용할 때 다음과 같이 클래스 인스턴스로 선언하여 하이퍼파라미터 값을 변경하여 적용할 수 있다.
LeakyReLU를 모델에 적용할 때는 다음과 같이 적용할 수 있다.
앞에서 생성한 2개의 모델과 LeakyReLU 활성화 함수로 변경한 모델까지 더해서 총 3개의 모델을 동일한 조건으로 10번의 epoch 동안 훈련한 후에 수렴 속도를 확인한다.
결과를 다음 코드로 시각화하면 epoch별 검증 손실의 감소 추이를 확인할 수 있다.
실행 결과를 보면 mnist 데이터셋은 모델별 차이가 크지는 않다. 좀 더 복잡한 데이터셋을 다룬다면 배치 정규화와 다른 활성화 함수를 적용해 보면서 모델의 훈련 추이를 관찰해 볼 필요가 있다.
학습을 마치고
모델 세부 설정에 대해 배울 수 있는 시간이었다. 케라스 과정도 한 절반 정도 온 것 같다. 오늘 저녁까지 남은 시간 케라스 공부를 마칠 수 있었으면 좋겠다.
'인공지능 > 딥러닝' 카테고리의 다른 글
케라스 7 - 모델 저장 및 불러오기 (0) | 2024.10.26 |
---|---|
케라스 6 - 콜백(Callback) (0) | 2024.10.26 |
케라스 4 - 심층 신경망으로 이미지 분류 (1) | 2024.10.26 |
케라스 3 - 단순 신경망 훈련 (0) | 2024.10.26 |
케라스 2 - 딥러닝 준비 2 : 딥러닝 프로세스 (0) | 2024.10.26 |