일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 연습문제
- 운영체제
- CNN
- 자바
- C++
- CSS
- 정보처리기사실기
- 컴퓨터비전
- html/css
- pandas
- 컴퓨터구조
- 중학1-1
- 파이썬라이브러리
- 데이터베이스
- 코딩테스트
- 딥러닝
- 중학수학
- 정보처리기사필기
- JSP/Servlet
- SQL
- 혼공머신
- 텍스트마이닝
- numpy/pandas
- 데이터입출력구현
- 자바 실습
- 파이썬
- 영어공부
- 머신러닝
- 정수와유리수
- 데이터분석
- Today
- Total
클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지
케라스 1 - 딥러닝 준비 1 : 주요 용어 정리 본문
어제 딥러닝 심층 신경망을 공부하다가 너무 지루해서 딥러닝 공부를 중단할까 하는 마음이 많았지만 그냥 다시 시작해 보기로 했다.
케라스에 대하여
2019년 9월 텐서플로 1에서 텐서플로 2로 정식 판올림을 하면서 생긴 가장 큰 변화는 케라스 API를 텐서플로를 내제화했다는 점이다. 2015년 3월 처음 릴리즈된 케라스 API는 고수준의 딥러닝 라이브러리다. 다른 딥러닝 라이브러리와 가장 큰 차이는 GPU 연산을 수행하는 기능을 직접 실행하지 않고 텐서플로, CNTK, Theano, MXNet 등의 백엔드 엔진을 지정하여 사용한다는 점이다.
케라스의 본래 목적 자체가 딥러닝 라이브러리를 쉽고 간결한 코드로 실행할 수 있게 만들어주는 것이다. 직관적이고 사용자 친화적으로 설계되어 있어 코딩의 난이도가 어렵지 않다. 벡엔드 엔진을 쉽게 변경할 수 있다는 장점도 있다. 하지만 복잡한 구조의 모델 구현과 사용자 정의의 훈련을 위해서는 텐서플로의 저수준 API를 활용해야 한다는 한계점도 분명하다.
사용이 편리한 케라스 라이브러리와 통합되어 이용할 수 있다는 점에서 텐서플로를 이용할 이유가 충분하다.
주요 용어
1. 하이퍼파라미터(hyper-parameter)
파이썬 프로그래밍에서도 파라미터를 사용한다. 하지만 딥러닝에서 말하는 하이퍼파라미터는 파이썬에서 배운 파라미터와는 다른 의미를 갖는다.
하이퍼파라미터는 딥러닝뿐 아니라 머신러닝 모델을 훈련할 때 사용자가 직접 설정해 주는 설정 값을 뜻한다. 모델이 훈련하면서 가중치(weight)와 편향(bias)은 자동 업데이트되고 조정되며 알아서 변하는 값들이지만, 그 외에 학습 속도나 반복 횟수 등 사용자가 직접 설정해야 하는 값들이 매우 많다.
이렇게 사용자가 직접 설정해야 하는 값들을 하이퍼파라미터라고 하며, 사용자가 어떠한 값을 설정하느냐에 따라 모델의 성능 및 결과가 달라지기 때문에 매우 중요하다. 사용자가 별도로 설정해주지 않으면 기본값이 지정되어 있어서 자동으로 적용된다.
모델의 예측 성능을 높이기 위해 하이퍼파라미터 값들을 조절하는데 많은 시간을 투자하는 것이 일반적이다. 이처럼 하이파라미터의 값을 조절하는 행위를 하이퍼파라미터 튜닝이라고 한다.
딥러닝 프로젝트를 실행하는 초기 단계에 많은 시간을 튜닝하는데 투자하는 것보다 가장 마지막 단계에서 진행하는 것을 추천한다.
2. 과소적합 vs. 과대적합(undefitting vs. overfitting)
머신러닝 학습에 있어 데이터는 크게 훈련용 데이터와 예측용 데이터로 구분할 수 있다. 훈련용 데이터는 말 그대로 머신러닝 모델이 학습할 데이터를 말하며 training set 혹은 train set라고 줄여서 말한다. 예측용 데이터는 정답 레이블이 없는 머신러닝 모델이 예측해야 하는 대상 데이터를 말하며 test set라고 말한다.
머신러닝에서 주어진 훈련 데이터에서 패턴 학습을 통해 모델을 완성해 나간다. 훈련용 데이터를 반복적으로 학습하면서 모델은 사람이 발견하지 못하는 패턴을 발견하므로 사람의 예측 성능을 뛰어넘는 모델을 생성할 수 있다. 하지만 예측할 데이터가 모델을 학습한 데이터와 다른 분포를 갖거나, 혹은 학습한 데이터가 특정 레이블에 편향된 데이터로 이루어져 있다면 모델이 학습한 후 예측 성능이 현저히 떨어지게 된다.
모델이 충분히 학습되지 않은 경우에는 예측 성능이 떨어진다. 이 상태를 과소적합되었다고 한다. 그와는 반대로 학습 데이터를 지나치게 반복 학습하게 되어 과하게 적합된 상태를 과대적합되었다고 한다. 이 상태에서는 훈련 데이터에 존재하는 불필요한 노이즈까지 과도하게 모델에 반영되어 주어진 훈련 데이터에 대한 예측 성능이 좋지만, 정작 중요한 예측 데이터에 대한 예측 오차가 발생할 확률이 커진다.
모델을 학습시킬 때는 과소적합과 과대적합 문제를 최소화하면서 정확도를 가장 높일 수 있도록 해야 한다. 훈련 데이터의 일부를 검증 데이터로 활용하여 검증 성능이 가장 좋은 구간을 모델의 가장 이상적으로 학습된 지점이라 판단하는 방법으로 최종 모델을 결정한다.
3. 에포크(epoch)
딥러닝은 데이터셋을 학습하는 과정을 여러 번 반복(iteration)하면서 최적의 모델 가중치를 찾는 과정이다. 딥러닝 모델이 반복 훈련을 할 때 데이터셋을 전부 학습에 사용하는 1회의 훈련 루프를 1 epoch라고 한다.
훈련 데이터셋을 빠짐없이 모두 1번 모델 훈련에 사용하면 1 epoch의 훈련 과정을 마치고 다음 epoch로 넘어간다. 사전에 설정된 최대 epoch 횟수까지 반복적으로 진행하고 종료된다.
epoch 역시 중요한 하이퍼파라미터다. 사전에 설정한 최대 epoch까지 반복 학습이 끝나더라도 모델이 과소적합되었다고 판단된다면 epoch를 늘려서 다시 학습할 필요가 있다. 그와 반대로 만약 모델이 빠르게 과대적합 구간으로 진입한다면 epoch를 줄여서 최대 구간에서 학습을 조기에 종료하는 것이 과대적합을 방지하고 시간을 절약할 수 있다.
4. 손실함수(loss function)
손실함수를 설명할 수 있는 가장 쉬운 용어를 찾는다면, '예측값과 정답 값의 차이 또는 오차(Error)'라고 말할 수 있다. 오차는 답러닝 모델의 출력 값과 실제 값의 차이를 말한다.
딥러닝 모델에 적용하는 손실함수는 사용자가 정의해야 한다. 분류나 회귀 모델에 따라 손실함수를 다르게 적용하는 것이 일반적이다.
지도 학습의 분류 문제는 이진 분류와 다중 분류로 구분할 수 있다. 이진 분류 문제를 해결하기 위해서는 binary_crossentropy 손실함수를 사용하며, 다중 분류에서는 categorical_crossentropy 손실함수를 사용한다. 다중 분류의 대상이 되는 클래스가 원핫 벡터인 경우를 말한다.
다중 분류 문제에서는 출력층의 활성함수로 'softmax'를 사용한다. 한편 회귀 모델의 경우 평균제곱오차, 평균절댓값오차, 후버 등이 사용된다.
텐서플로는 사전 정의된 손실함수를 함수형과 클래스형으로 제공하고 있으며, 일반적으로 만이 사용하는 손실함수 목록은 다음과 같다.
다음과 같이 클래스 및 함수 형태도 정의되어 있는 손실함수를 지정하여 사용한다.
딥러닝 문제에 따라서는 텐서플로에서 제공하는 손실함수로 해결하기 어려운 경우가 있다. 이럴 때는 사용자가 직접 손실함수를 만들어서 사용해야 한다. 기본 제공 손실함수와 같이 함수 형태나 클래스 형태 모두 가능하다.
5. 경사하강법(gradient descent)
경사하강법은 딥러닝 모델을 훈련할 때, 모델 내부의 가중치에 대한 미분 값을 구하고 목적 함숫값이 낮아지는 방향으로 차감하면서 결국 최소 함숫값을 갖도록 하는 방법이다.
딥러닝 훈련 프로세스에서 경사하강법 알고리즘을 적용하여 손실함숫값을 최소로 만드는 가중치를 차~을 수 있다. 경사하강법은 현재 공개된 다양한 옵티마이저(최적화 함수)의 근간이 되는 알고리즘이다. 그렇기 때문에 경사하강법을 잘 이해하는 것은 매우 중요하다. 따라서 이번에는 경사하강법을 넘파이로 직접 구현해 본다.
먼저 손실함수 혹은 목적 함수를 다음과 같이 정의한다.
실행 결과를 보면 실제 생성된 y 데이터는 y = 0.3x + 0.5 식과 완벽히 일치하지 않고 약간의 노이즈가 추가될 것을 확인할 수 있다.
이제 경사하강법 알고리즘의 핵심인 w, b에 대한 그래디언트를 구하는 부분만 구현하면 된다. 그래디언트는 손실함수를 w, b에 대한 각각의 편미분 값을 구한 뒤 학습률 계수를 곱하여 이전의 w, b로부터 차감한다. 이를 수식으로 나타내면 다음과 같다.
그래디언트 w, b를 업데이트 수식으로 구했다면 넘파이로 최적화하는 과정을 구현해 본다. 최대 반복 횟수를 지정하고 오차가 0.005 이내로 수렴하면 반복문을 종료한다. 반복문 안에서 손실함수를 정의하고, 매 epoch마다 w, b에 대한 가중치를 업데이트한다.
GPU로 할당하지 않았더니 4w만에 종료되었는데 GPU로 할당하니 이제 잘 출력이 된다.
가중치가 난수 값에 의해 다르게 초기화되기 때문에 매번 실행할 때마다 수렴하는 속도는 차이가 있다. 하지만 결국 목표하는 오차 범위 안으로 수렴하여 반복문을 종료하게 되고, 종료 후 w, b 계수를 확인하면 샘플 데이터셋을 생성할 때 설정한 w, b 계수와 비슷한 값임을 확인할 수 있다.
학습을 마치고
딥러닝 용어에 대해서 정리해 보았다. 그동안 자주 들어본 용어였지만 정확한 의미를 잘 몰랐는데 이번 학습을 통해 확실히 이해할 수 있어서 좋았다.
수학 수식을 직접 쓰려고 했지만 써보다가 사용법을 익히는데 많은 시간이 걸려서 지금은 그냥 책을 스캔하기로 했다. 나중에는 수식을 많이 사용할 테니 다음에는 꼭 적용하는 방법을 배울 생각이다.
'인공지능 > 딥러닝' 카테고리의 다른 글
케라스 3 - 단순 신경망 훈련 (0) | 2024.10.26 |
---|---|
케라스 2 - 딥러닝 준비 2 : 딥러닝 프로세스 (0) | 2024.10.26 |
딥러닝을 시작합니다 6 - 신경망 모델 훈련 2 : 모델 저장과 복원 및 콜백 (0) | 2024.10.26 |
딥러닝을 시작합니다 5 - 신경망 모델 훈련 1 : 손실 곡선과 검증 손실 그리고 드롭아웃에 대하여 (0) | 2024.10.25 |
딥러닝을 시작합니다 4 - 심층 신경망 2 : 렐루 함수와 옵티마이저 (0) | 2024.10.25 |