이 포스팅은 edwith의 딥러닝 2단계 : 심층 신경망 성능 향상시키기를 듣고 공부 목적으로 작성되었습니다.
How to make Improving Deep Nerual Networks
어떻게 해야 심층 신경망의 성능을 향상 시킬 수 있을까??
Keyword : Train/ Dev/ Test sets
Applied ML is a highly iterative process
Deep Neural Networks
#layers
#hidden units – 각각의 틍이 몇 개의 은닉 유닛을 가지는지
Learning rates – 학습율을 뭘로 할 것인지
Activation functions – 서로 다른 층에서 사용하는 활성화 함수는 무엇인지
새로운 application을 시작할 때는 이 모든 것에 대한 올바른 값을 추측하는 것은 불가능하다.
1. Idea로 시작해서 특정 개수의 층과 유닛을 가지고 특정 데이터 세트에 맞는 신경망을 만든다.
2. Code로 작성하고 실행하고 실험한다.
3. Experiment 그 결과 특정 네트워크 혹은 설정이 얼마나 잘 작동하는지를 알게 되고
Idea를 개선하며 더 나은 신경망을 찾기 위해 반복한다.
자연어 처리, 컴퓨터 비전, 음성 인식, 구조화된 데이터 각 분야나 애플리케이션의 직관이 매우 달라 서로의 영역에서 거의 적용이 되지 않는다. 또한, 데이터의 양, 인력 특성의 개수, CPU GPU처럼 훈련을 진행하는 컴퓨터 설정 등의 다양한 요인에 hyper parameter의 최고의 선택이 결정된다.
따라서 Deep Neural Networks의 좋은 선택을 하기위해서(딥러닝의 성능을 향상시키기 위해)
위의 cycle을 반복적으로 도는 과정이다.
=> Q. 그렇다면 이 cycle을 어떻게 효율적으로 돌 수 있을까??
A. Train/Dev/Test sets 잘 설정하는 것이 효율적이다.
Train/Dev/Test sets
Data를 Train/Dev/Test 세트로 나눈다.
· Train 훈련 세트 : 훈련을 위해 사용되는 데이터
· Dev 개발 세트 : 다양한 모델 중 어떤 모델이 좋은 성능 나타내는지 확인
= Hold out cross validation sets = Development sets
· Test 테스트 세트 : 모델이 얼마나 잘 작동하는지 확인
작업의 흐름은 훈련 세트에 대해 계속 훈련 알고리즘을 적용시키면서 개발 세트 혹은 교차 검증 세트에 대해 다양한 모델 중 어떤 모델이 가장 좋은 성능을 내는지 확인합니다.
더 발전시키고 싶은 최종 모델이 나오면 테스트 세트에 그 모델을 적용시켜 알고리즘이 얼마나 잘 작동하는지 편향 없이 측정하게 됩니다.
Train/Dev/Test sets 어떤 비율로 설정해야 할까?
이제까지
머신러닝 이전 시대에서는
Data 7:3 = 훈련: 테스트 – 명시적인 개발 세트가 없을 떄
6:2:2: = 훈련: 개발 세트: 테스트 세트
몇 년전까지만해도 관행이었다. 100-1000-10000 에서는 나름 합리적인 숫자였으나
총 100만개 이상의 샘플이 있는 현대 빅테이터 시대에는 개발 세트와 테스트 세트가
훨씬 더 작은 비율이 트렌드가 되었다.
현대 빅테이터 시대에는
98:1:1
99.5: 0.25 : 0.25
99.5: 0.4: 0.1 (크기가 더더더 클 경우)
왜냐하면 dev 세트와 test 세트의 목표는 서로 다른 알고리즘을 시험하고 어떤 알고리즘이 성능이 더 좋은지 확인하는 것이다.
dev 세트는 평가할 수 있을 정도로만 크면 됩니다. 이를 위해 전체 데이터의 20 퍼센트나 필요하지는 않다.
따라서 예를들어 백만개의 훈련 샘플이 있는 경우에는 만 개의 샘플을 개발 세트로 설정하면
두개의 알고리즘 중 어 느것이 더 좋은지 평가하는데 충분합니다.
같은 방식으로 테스트 세트의 주요 목표는 최종 분류기가 어느정도 성능인지 신뢰있는 추정치를
제공하는 것이므로 이것 또한 만개의 샘플을 설정해도 충분하다.
단일 분류기의 성능을 평가하고 안정적인 추정치를 제공하기 위해서 말입니다.
따라서 백만개의 샘플인 경우 dev/ test sets를 만개의 샘플로 설정하면 98:1:1 = train : dev : test
크기가 더더더 클 경우 99.5: 0.25 : 0.25 or 99.5: 0.4: 0.1
머신러닝 문제를 설정할 떄는 훈련 개발 테스트 세트를 설정하게 되는데 상대적으로 적은 데이터 세트 일 경우에는 전통적인 비율로 설정하는 것도 괜찮습니다.
Mismatched train/ test distribution
일치하지 않는 훈련 테스트 분포에서 훈련시킨다는 것입니다.
사용자가 사진을 업로드하면 사용자에게 그 중 고양이 사진을 찾아 보여주는 것이 목표라 하자.
TRAINING SETS : 웹 페이지에서 가져온 고양이 사진 – 아주 전문가스러고 잘 정돈된 고양이 사진 결과를 가지고 있음
DEV/TEST SETS : 앱을 사용하는 사용자들에 의해 구성된 것 – 사용자들은 흐릿한 저해상도의 사진을 올리게 될 것입니다. 일상적인 상황에서 핸드폰 카메라로 찍은 사진들이 많아여
이 두가지 데이터의 분포는 달라질 수 있습니다. 경험상 이런 경우 dev sets와 test sets가 같은 분포에서 와야 합니다.
개발 세트를 사용해 다양한 모델을 평가하고 성능을 개선하기 위해 열심히 노력할 것이므로 개발 세트가 테스트 세트와 같은 분표에서 오는 것이 좋습니다. 이 경험적인 규칙을 따를수록 머신러닝 알고리즘의 진전은 더 빠르게 일어날 것이다.
( 이 규칙에 대한 것은 추후에 자세하게 설명할 것임 )
Not having a test set might be okay.
마지막으로 테스트 세트를 갖지 않아도 괜찮다.
테스트 세크의 목표는 최종 네트워크의 성능에 대한 비편향 추정을 제공하는 것이다. 그러나 비편향 추정이 필요 없는 경우에 테스트 세트를 갖지 않아도 괜찮다.
따라서 dev 세트만 있는 경우에 모든 test 세트를 train세트에서 훈련시키고 다른 모델 아키텍처를 시도하고 이것을 dev 세트에서 평가합니다. 그리고 이과정을 반복해 좋은 모델을 찾습니다.
dev 세트에 데이터를 맞추기 때문에 성능에 대한 비편향 추정을 주지 않습니다.
그 추정이 필요하지 않다면 test 세트가 없어도 괜찮습니다.
머신러닝에서 별도의 test 세트 없이 train세트와개발 세트만 있는 경우,
train 세트와 dev 세트만 있는 경우 – dev세트를 test 세트라고 부릅니다.
그러나 실제로 하는 것은 test 세트를 교차 검증 세트 (=dev sets)로 사용하는 것입니다. – 좋은 용어는 아님. 테스트 세트에 과적합하기 때문
팀에서 train세트와 test 세트만 있다고 하는 경우는 그들이 train과 dev 세트를 가지고 있는지 봐야한다. 왜냐하면 test 세트에 과적합이 일어나기 때문이다.팀의 용어를 바꿔 train/test 세트 대신 train/dev 세트로 불러야 한다.
문화적으로 후자가 더 올바른 용어인걸 알아도 어색할 수 있다.
알고리즘 성능에 완전한 비편향 추정이 필요 없다면 이런 방식도 괜찮습니다.
( ???? 이부분은 좀 더 공부가 필요한 것같다)
...아이패드를 빨리 사고 싶다......