Search

'학습모델'에 해당되는 글 2건

  1. 2017.10.12 폴리페이스 - 데이터 학습시키기
  2. 2017.08.10 오버피팅(Overfitting)

폴리페이스 - 데이터 학습시키기

공상프로젝트/폴리페이스 2017.10.12 21:21 Posted by 아는 개발자 아는 개발자

데이터 구하고 가공하기에서 한 작업은 정치인들의 사진을 인터넷에서 크롤링 한 후 정확도 향상을 위해 사진에서 얼굴 부분만 추려낸 후 이 것을 Tensorflow서 사용 할 수 있는 파일 형식인 tfrecord로 변환하는 작업이었다. 이제는 변환된 데이터를 이용해서 학습을 시키는 일만 남았다. 이번 포스팅에서는 데이터를 학습시키는 과정들을 쭉 살펴보려고 한다.


1. Tensorflow 설치하기 (feat, 그래픽 카드 없이는 못쓴다)


Tensorflow는 내 데스크탑에 그래픽 카드가 있느냐 아니면 없느냐에 따라서 설치 명령어가 달라진다.


(tensorflow)$ pip install --upgrade tensorflow      # for Python 2.7
(tensorflow)$ pip3 install --upgrade tensorflow     # for Python 3.n
(tensorflow)$ pip install --upgrade tensorflow-gpu  # for Python 2.7 and GPU
(tensorflow)$ pip3 install --upgrade tensorflow-gpu # for Python 3.n and GPU


이 프로젝트를 처음 시작 했을 때 내 리눅스 PC는 그래픽 카드가 없었다. 애초에 이 PC는 오직 교육용으로만 사용하기 위해 게임을 할 수 있는 환경 자체를 차단 하려고 했었다. 그래서 맨 처음에 tensorflow를 설치 했을 때는 가장 위에 있는 CPU만 사용 하는 tensorflow 버전으로 설치했었다. CPU만 사용하니 한 번 학습 시키는데(뉴럴 네트워크에서 1회 학습을 하는 경우) 10초 정도 소요됐다. 10000회 정도 학습 시키려면 컴퓨터를 켜 두고 출근해야 하기도 했다.


그런데 회사 선배가 자기가 쓰던 그래픽 카드를 싸게 판다는 말을 듣고 컴퓨터에 설치해서 학습 시켜보니 퍼포먼스가 무려 20배 이상 차이가 났다. CPU만 사용했을 때 10초 정도 소요되던 것이 그래픽 카드를 사용하니까 0.5초면 가능했다. 10000회 학습 시키려고 컴퓨터를 켜두고 출근을 했었는데 이제는 1-2시간 정도면 끝났다. 그동안 내가 얼마나 많은 시간을 학습 과정에서 소비하고 있었던 것일까. 시간이 넉넉한 사람이면 모르겠지만 그래픽 카드의 유무에 따라서 작업의 퍼포먼스 차이가 크다. 초기부터 그래픽 카드를 사용했다면 불필요하게 시간을 허비하지 않았을텐데.


그래픽 카드를 사용했을 때 학습 속도, 1회 학습하는데 0.5초가 소요되고 있다

2. 학습 모델 선택하기


Tensorflow github에선 이미지를 분류 할 수 있는 다양한 학습 모델을 파이썬 코드로 짜뒀다. 개발자는 학습시키는 명령어에 사용할 학습 모델을 옵션으로 추가하면 간단히 학습 시킬 수 있다. 현재 tensorflow에서 만들어둔 학습 모델로는 이런 것들이 있다.


위 사진에 있는 학습 모델들은 이미 논문에 등재된 뉴럴 네트워크를 구글이 tensorflow에서 사용 할 수 있는 형태로 변환 한 것이다. 학습 모델의 이름을 인터넷에 검색해보면 논문 자료를 다운 받을 수 있으니 관심이 있으면 읽어보는 것도 좋다. 물론 내용이 결코 쉽진 않다. 나는 간단히만 읽어봤다.


이미지 인식 모델 중 가장 유명한 모델은 inception 시리즈이다. 이 모델은 현재 네번째 버전까지(inception_v4) 나왔고 imagenet 컨테스트에서 가장 우수한 학습 알고리즘으로 선정됐다. 하지만 서비스를 하려면 정확도 뿐만 아니라 학습하는데 소요되는 시간 및 유지 관리의 측면도 중요할 것 같아서(당시엔 그래픽 카드가 없었기 때문이기도 하다) 이 모든 요소를 절충 할 수 있는 학습 모델을 찾기로 했다. 이때 검증용으로 사용한 데이터는 tensorflow에서 제공하는 flower 데이터를 사용했다. inception_v1을 사용 했을 때는 학습 속도 자체는 나쁘지 않았으나 퍼포먼스가 좋지 않았고 inception_v3, inception_v4는 학습 속도가 너무 느렸다. 결과적으로 inception_v2가 학습시간 대비 가장 훌륭한 퍼포먼스를 보였다. 이미지 학습 모델은 inception_v2로 선정했다.


3. 학습 결과


정치인들 한 명당 대략 100장 정도 사진이 있었고 총 정치인의 수는 99명 이었다. 이 데이터로 inception_v2 모델로 10000회 정도 학습을 시켰는데 정확도가 70%정도 나왔다. 이 정도면 데모용으로 사용하기엔 적합한 수치였다. 기존 논문 대비 적은 양의 데이터임에도 불구하고 퍼포먼스가 좋은 이유는 아마 크롤링한 데이터에서 따로 얼굴 부분만 추려내고 동명 이인인 데이터를 필터링 하면서 순도 높은 데이터를 골라 냈기 때문인 것 같다. 많은 양의 데이터도 중요하지만 순도 높은 데이터도 중요하다는 사실을 확인해 볼 수 있었던 것 같다.

오버피팅(Overfitting)

컴퓨터공부/인공지능 2017.08.10 21:18 Posted by 아는 개발자 아는 개발자

학습 능률을 높인다는 것은 비용함수(Cost function)의 값을 줄이는 것입니다. 하지만 학습에 사용하는 Feature(쎄타라고 생각하시면 됩니다)의 개수가 일정하면 Gradient Decent와 같은 최적화 작업을 통해 통해 최적의 해에 도달 했다고 해도 절대적인 비용은 어쩔 수가 없습니다.


최대한 학습 데이터를 따르는 직선을 만들었지만 그래도 비용은 어쩔수가 없네요.


그런데 우리가 직선이 아니라 볼록한 함수를 이용해서 학습한다면 어떨까요? 쎄타2를 추가하고 이때의 x는 제곱으로 본다고 합시다. 여러차례 최적화 작업을 거치면서 아래로 볼록한 함수가 나온다면 데이터의 흐름을 잘 따를 수 있을 것 같습니다. 실제로 그림으로 그려보봐도 그렇네요.


데이터 흐름을 더 잘 따라가는 것 같습니다.


실제로 계산해보면 비용함수의 값도 감소합니다. 이로써 Feature의 개수를 늘리면 학습효과가 더 증가 한다는 것을 알 수 있겠네요. 내친김에 극솟값 x축에 있는 학습 데이터도 캐치 할 수 있도록 차원을 더 올려봅시다. 이번엔 아예 다섯제곱까지 늘려보자구요.


이제는 학습에 사용된 모든 데이터들을 캐치 할 수 있게 됐습니다. 아마 비용함수의 값은 0이 나올것 같네요. 학습 성능은 가장 좋은 것으로 판단해도 될 것 같습니다만 X축에서 오른쪽으로 갈수록 값이 곤두박질 치고 있다는게 맘이 걸리긴 합니다.


만약 위 데이터의 원래 흐름이 아래로 블록한 그래프였다면 어땠을가요? 실제로 아래 그림의 노란색 데이터들이 들어온겁니다. 이런 경우 학습을 잘했다고 보기 어렵습니다. 차라리 2차원 블록한 그래프가 비용함수 값은 좀 있더라도 노란색 데이터가 들어 올 것이라고는 더 잘 예측 했을 것 같네요.


이처럼 비용함수의 값을 낮추기 위해 여러개의 Feature를 과하게 넣다보면 오히려 실제 데이터와 괴리되는 현상이 생깁니다. 분명 학습 데이터는 잘 맞추는데 실제로 보면 예측은 전혀 못하고 있는 것이지요. 이런 경우를 오버피팅(Overfitting)이라고 합니다. 학습 모델을 만들 때 위와 같은 경우를 방지하기 위해 비용함수의 수식에 Feature의 크기에 따른 변화값을 두기도 한답니다. 선형회귀에선 수식으로는 이렇게 표현해요!


파란색 원으로 그려둔 부분이 Overfitting을 방지하기 위한 값입니다. 일반적으로 쎄타의 값이 커질수록 Overfitting 발생 정도가 증가합니다. 그래서 이 값의 제곱 값을 더하면 전체 비용함수가 늘어나는 것으로 보고 학습 효과를 떨어뜨리게 되는 것이죠.


람다 값은 이때의 상수입니다. 오버핏 방지 연산에 얼만큼 비중을 둘 것인지를 결정합니다. 이 값이 커질수록 오버피팅이 하지 않게 되겠지만 낮아진다면 학습 데이터도 잘 맞추지 못하게 됩니다. 이 값이 적당할 때 가장 그럴듯한 예측을 하는 학습 모델을 만들 수 있게 됩니다.