@@@ 인공지능/수학·통계를 몰라도 이해할 수 있는 쉬운 딥러닝

1 - 2. 분류(Classification) 기법 활용하기(1)

HTG 2021. 7. 2. 00:04
728x90

1-2-1. AI는 체격을 보고 초·중·고등학생을 구분할 수 있을까?

데이터 살펴보기

데이터 - 서울시 교육청에서 공개한 학생 건강 검사 데이터

피쳐 - 커다란 데이터에서 우리가 유심하게 살펴보라고 하는 부분

노말라이즈 - AI가 공평하게 여러 피쳐를 학습할 수 있도록하는 것(여기에선 0~1사이의 값으로 만들기 위해 몸무게를 최댓값으로 나눈다)

데이터 분할 - split과정으로 80/20으로 나눔

 

어떤 인공지능을 사용?

신경망 구조 - 입력, 은닉, 출력 1개씩 구성된 간단한 FNN

층수 종류 크기(퍼셉트론 갯수) 활성화 함수
1층 FNN 3 없음
2층 FNN 128 ReLu
3층 FNN 3 Softmax

입력층은 성별, 키, 체중 3종류의 데이터를 입력받기위해 3으로 설정

딥러닝에서 입력할 데이터의 종류를 피쳐라고 부름 -> 일반적으로 입력층의 크기는 피쳐의 개수와 동일하게 설정

피쳐 수 > 입력층 크기 : 일부 피쳐 누락/ 피쳐 수 < 입력층 크기 : 불필요한 공간 발생

출력층은 초등학생, 중학생, 고등학생 3종류의 카테고리를 구분하기위해 3으로 설정

 

분류에 사용하는 활성화 함수, Softmax

뉴런의 행동을 모사하기보다는 분류 문제에서 확률 질량 함수의 정규화를 위해 사용.

신경망의 출력값은 단순한 숫자일 뿐, Softmax 연산을 거치면 비로소 확률 질량 함수로서 의미를 가짐.

(간단히 말해서, 분류 문제에서는 Softmax 함수를 사용하는 것이 좋다)

https://github.com/boostcamp-ai-tech-4/peer-session/issues/39 - 분류에서 Softmax를 사용하는 이유

https://blog.naver.com/hobbang143/221735605346 - 간단 설명

 

분류 인공지능의 학습은 '출력층이 추론한 확률이 최대한 잘 들어맞도록 노력하는 과정'이고, 분류 결과는 '인공지능이 가장 높은 확률을 출력한 카테고리'라고 할 수 있음.

 

모델 코딩

인공신경망 구축

keras.Sequential 함수를 사용하여 인공신경망 구축

keras.layers.Dense(퍼셉트론 갯수, activation = "활성화 함수")

 

컴파일

코드를 컴퓨터가 이해할 수 있는 형태로 변환하는 작업 - 컴파일

.compile(optimizer = "",metrics = [""], loss = "")

옵티마이저(optimizer) - 인공신경망의 가중치를 조절하기 위한 알고리즘

                                대체로 "Adam"을 사용하면 좋은 결과를 얻을 수 있음.

메트릭(metrics) - 성능 검증을 위한 척도

                       여기에서 정확도를 의미하는 "accuracy" 사용

로스(loss) - 인공신경망을 학습시키기 위한 기준이 되는 함수

                작으면 작을수록 AI성능이 높음/ 학습 목표에 따라 적절한 로스 선택

                분류 문제에서는 "크로스 엔트로피(cross-entropy)"를 사용

                여기에서는 크로스 엔트로피 중 하나인 "sparse_categorical_crossentropy" 사용

 

인공지능 학습

콜백, 학습을 조기에 중단하기 위한 도구

인공지능 학습 시 '에포크'를 너무 높게 설정하면(반복 학습을 많이 하면) '오버피팅' 등의 현상이 발생하며 오히려 성능이 낮아지는 현상 발생 -> 반복 학습을 많이 해서 발생하는 '오버피팅'을 방지하기위해 인공지능의 성능이 적당히 상승했을 때 학습을 중단할 필요가 있음 -> 이러한 역할을 하는 것이 콜백

keras.callbacks.EarlyStopping(monitor='', patience=n)

monitor - 학습을 조기 중단하기 위한 기중으로 삼을 지표를 의미

             여기에서 'val_loss'를 사용(학습 중단의 지표로 'val_loss'를 사용, 'val_loss'는 검증 과정의 로스를 의미)

             성능 검증을 실시하고, 로스가 딱히 개선되지 않는다면 학습을 중단하라는 의미 

patience - 숫자를 인자로 가짐.

              여기에서 10을 입력/ "10 에포크가 지나도록 성능개선이 없으면 중단하겠다"는 의미.

              짧을수록 성질이 급하게 학습을 종결시키고 길수록 느긋하게 학습을 종결.

              너무 길면 중단 시점에서 AI의 성능이 나쁠수 있고, 너무 짧으면 충분한 학습이 진행되기 전에 학습이 종료되                어릴수있음.

 

인공신경망 학습 개시

fit(train_X, train_Y, epochs=EPOCHS, validation_data=(test_X, test_Y), callbacks=[early_stop]) - fit 함수를 통해 학습시작

train_X, train_Y - 트레이닝 데이터를 의미

                      X는 AI에 입력해 줄 데이터/ Y는 AI 출력 결과물을 채점하기 위한 레이블

epochs - 학습을 반복할 에포크 수를 입력

validation_data=(test_X, test_Y) - 인공지능의 성능을 평가하기 위한 테스트 데이터

callbacks - 콜백 값 입력

 

학습 결과 확인

성능 확인 시, val_accuracy를 확인 -> 현재 73%확률로 인공지능이 성별, 키, 체중을 보고 초,중,고등학생을 구분

 

 

로스 함수는 낮을수록 좋고, 정확도는 높을수록 좋다.

빨간선이 트레이닝학습 결과/ 파란색은 테스트 데이터를 평가

Loss History를 보면 트레이닝, 테스트 로스 모두 에포크가 증가함에 따라 점점 감소하는 것을 확인

Accuracy는 빨간 선(트레이닝)은 에포크가 증가함에 따라 비교적 순탄하게 증가/ 파란 선(테스트)는 증가세가 안정되지 않음.

이처럼 대부분의 경우 테스트 성능은 트레이닝 성능에 비해서 들쭉날쭉하게 증가하거나 에포크가 많이 지나면서 오히려 감소함. -> 따라서, 학습을 어느시점에 중단시킬지 결정하는 것이 인공지능의 성능 측명에서 중요한 이슈

 

 

오버피팅 & 언더피팅

오버피팅 - 피팅이 너무 많이 되었다.

언더피팅 - 피팅이 덜 되었다.

모델의 분산에 비해 데이터의 규모가 작을수록 오버피팅이 쉽게 발생.

데이터의 규모가 모자란다면 퍼셉트론의 개수를 줄이거나 층수를 낮춰서 모델의 분산을 낮춰 줘야함.

모델을 너무 오랜 에포크 동안 학습시켜도 오버피팅이 발생.

오버피팅 발생 여부 판단은 앞에 처럼 그래프를 통해서 확인

 

하이퍼 파라미터 조작

뉴럴 네트워크의 층수, 각 층에 포함된 퍼셉트론의 개수, 에포크 등 인공지능을 제작할 때 인간이 직접 지정해 주는 값