1 of 213

구글 머신러닝 스터디잼 (중급)

가이드라인

2019.03.29

박찬성

2 of 213

머신러닝 스터디잼 중급반 컨텐츠 (1) - 필수사항

코세라 강의: [Launching into Machine Learning]

  • 지도학습, 머신러닝의 역사적 흐름과 그 시기별 알고리즘�모델생성, 손실함수, 경사하강법, 메트릭, 모델 학습정도의 일반화, 샘플링�
  • 두 개의 퀵랩(Qwiklab)이 포함됨 | 단, 솔루션 강의 영상도 함께 제공됨

퀵랩: [Classify Images of Clouds in the Cloud with AutoML Vision]

  • AutoML은 사용자가 이미지 데이터셋만 쥐어주면, 자동으로 최적화된 모델 찾아주는�Google 클라우드 서비스 중 하나. �
  • 오픈소스로 Keras로 만들어진 AutoML(Auto-Keras)도 있음�

3 of 213

머신러닝 스터디잼 중급반 컨텐츠 (2) - 선택사항

기타1: [머신러닝을 배우고 사용하기]

  • Google TensorFlow 공식 사이트에 등록된 튜토리얼
  • TensorFlow 2.0을 사용

기타2: [모두를 위한 딥러닝 시즌2]

  • 홍콩과기대 김성훈 교수님이 최초에 만든 “모두를 위한 딥러닝" 의 시즌2
  • 여러명의 컨트리뷰터 들이 모여서 만들어낸 딥러닝 튜토리얼
  • TensorFlow 및 PyTorch, 두 가지 버전으로 제작됨
  • 일명 모모딥-시즌2 라고 불림, 그리고 한글 컨텐츠임

4 of 213

코세라 강의

[Launching into Machine Learning]

5 of 213

목차

강의 및 퀵랩에 대한 소개

실용적인 머신러닝에 대한 소개 (페이지 8)

  • 지도학습
  • 머신러닝의 역사적 흐름과 알고리즘
  • 퀴즈

최적화에 대한 소개 (페이지 72)

  • 머신러닝 모델 정의
  • 손실함수, 경사하강
  • TensorFlow 플레이 그라운드
  • 성능 지표 (메트릭)
  • 퀴즈

일반화와 샘플링 (페이지 128)

  • 머신러닝 모델과 일반화
  • 언제 모델의 학습을 멈춰야 하는지
  • BiqQuery를 이용한 반복적인 샘플생성
  • 퀵랩1
  • 퀵랩2
  • 퀴즈

6 of 213

강의 및 퀵랩에 대한 소개

이 코스를 통해서 배우게 될 것

  • 현재, 왜 딥러닝이 이렇게나 인기가 있는지�
  • 손실함수와 성능지표를 사용해서,�모델을 평가하고 최적화를 어떻게 할 수 있는지�
  • 머신러닝에서 발생가능한 일반적인 문제를�어떻게 완화시킬 수 있는지

퀵랩에 대한 소개는 생략함

7 of 213

목차

강의 및 퀵랩에 대한 소개

실용적인 머신러닝에 대한 소개

  • 지도학습
  • 머신러닝의 역사적 흐름과 알고리즘
  • 퀴즈

최적화에 대한 소개

  • 머신러닝 모델 정의
  • 손실함수, 경사하강
  • TensorFlow 플레이 그라운드
  • 성능 지표 (메트릭)
  • 퀴즈

일반화와 샘플링

  • 머신러닝 모델과 일반화
  • 언제 모델의 학습을 멈춰야 하는지
  • BiqQuery를 이용한 반복적인 샘플생성
  • 퀵랩1
  • 퀵랩2
  • 퀴즈

8 of 213

실용적인 머신러닝에 대한 소개

: 지도학습 (Supervised Learning) - 개요

머신러닝이라는 것을 실현하기 위한 방법론이 여러개가 있지만, 그 중 크게�도학습(Supervised Learning)비지도학습(Un-Supervised Learning)이 대표적이다.

지도학습과 비지도학습의 주요 차이점은 레이블 이라는 것의 유무이다.

- 레이블이란, 기계가 학습할 때 참고할 수 있는 정답지를 의미한다.� - 지도학습은 레이블이 있지만, 비지도학습엔 레이블이 없다.� - 즉, 사람이 만들어 놓은 정답지로 모델이 나아가야 할 방향을 지도할지 말지가� “지도학습", “비지도학습" 으로 나눈다.

9 of 213

실용적인 머신러닝에 대한 소개

: 지도학습 (Supervised Learning) - 비지도학습

왼쪽 그래프는 “연봉”과 “회사 재직기간” 관계를 표현

비지도학습을 통하여 연봉과 재직기간 데이터 �조합에서, 어떤 패턴이 발견되었다고 가정해 보자.

패턴이 보여주는 내용은 데이터가 두 가지 그룹으로�나뉘어질 수 있음을 보여준다고 가정해 보자.

어떤 기준에 의해서 이 둘이 나뉘어 졌는데, �비지도학습 알고리즘이 그 기준을 학습하여 발견한 것

비지도학습에선,

데이터가 레이블링 되어 있지 않다

연봉 vs 재직 기간

재직 기간 (년)

연봉

10 of 213

실용적인 머신러닝에 대한 소개

: 지도학습 (Supervised Learning) - 모델 종류 (1)

- 회귀 모델 (Regression): 레이블의 값들이 연속적인 문제� 예] 밥값이 많이 나올수록, 팁의 크기도 계속 커진다��- 분류 모델 (Classification): 레이블의 값들이 이산적으로 나눠질 수 있는 문제� 예] 밥값이 많이 나오면 남성, 적게 나오면 여성)

모델이란?�⇒ 데이터들의 패턴을 대표할 수 있는 함수 ( 예) f(x) = ax + b )�⇒ 함수의 입력을 독립변수, 출력을 종속변수 라고한다.� (독립변수들에 의해 출력값이 정해짐)�지도학습의 모델은 크게 두 종류가 있다.�{회귀 모델 (Regression), 분류 모델 (Classification)}

성별에 따른 팁의 크기

팁의 크기

총 밥값의 크기

지도학습은 과거의

축적된 데이터로부터

미래의 값을 예측한다.

여성

남성

11 of 213

실용적인 머신러닝에 대한 소개

: 지도학습 (Supervised Learning) - 모델 종류 (2)

종류1

회귀 모델

팁의 크기를 예측

종류2

분류 모델

손님의 성별을 예측

앞서 본 그래프를 그리는데 사용된 데이터의 예

12 of 213

실용적인 머신러닝에 대한 소개

: 지도학습 (Supervised Learning) - 데이터셋의 구조

각 열을 예제(Example) 데이터라고 함

왼쪽 테이블에는

총 9개의 예제가 있음

각 행을 의미하는 컬럼명을 특징(feature) 라고 함�

⇒ 전체 특징은 하나의 레이블 컬럼(종속 변수)과� 나머지 독립변수의 컬럼들로 구성된다

데이터를 구성하는 행 중에, 하나를 선택해서

이를 레이블로 사용할 수 있다 (뭐를 예측하고자 하냐에 따라서)

13 of 213

실용적인 머신러닝에 대한 소개

: 지도학습 (Supervised Learning) - 모델을 선택하는 지침

데이터가 레이블링 되어 있는지?

연속적인 값을

예측할 것인지?

그렇소

아니오

맞소

아니오

회귀 모델

분류 모델

클러스터링

레이블링의 유무는 본인이 직접 판단

가지고 있는 데이터에서, 내가 예측하고자 하는 컬럼(레이블)이 존재하는지? 아닌지?

레이블이 없는 경우,

직접 레이블링을 할 수도 있다.

(이때는 보통 많은 사람들이

수작업으로 레이블을 달아야 하므로, �큰 비용이 발생한다)

14 of 213

실용적인 머신러닝에 대한 소개

: 지도학습 (Supervised Learning) - 동영상 내의 퀴즈

지도학습 퀴즈

여러분이 은행업계에 종사한다고 가정해 보자�

이때, 어떤 거래가 사기인지 정상적인 것인지를 감지할 수 있는 머신러닝 모델을 만들기로 했다고 가정해 보자.

그러면, 이것은 회귀 문인가? 분류 문제인가?

회귀, 그리고 이산적인 레이블

회귀, 그리고 지속적인 값의 레이블

분류, 그리고 이산적인 레이블

분류, 그리고 지속적인 값의 레이블

15 of 213

실용적인 머신러닝에 대한 소개

: 지도학습 (Supervised Learning) - 동영상 내의 퀴즈 (정답)

지도학습 퀴즈

여러분이 은행업계에 종사한다고 가정해 보자.�

이때, 어떤 거래가 사기인지 정상적인 것인지를 감지할 수 있는 머신러닝 모델을 만들기로 했다고 가정해 보자.

그러면, 이것은 회귀 문인가? 분류 문제인가?

회귀, 그리고 이산적인 레이블

회귀, 그리고 지속적인 값의 레이블

분류, 그리고 이산적인 레이블

분류, 그리고 지속적인 값의 레이블

16 of 213

실용적인 머신러닝에 대한 소개

: 회귀와 분류 - 회귀 모델 (1)

왼쪽은 선형회귀 모델을 보여준다. (Linear Regression)

모델 == “초록색 선" 이며, 이 선은 예측값을 도출하는 가이드라인�예] y = ax + b / x는 밥값, y는 팁 / a와 b는 학습으로 도출될 변수

정확한 값의 예측은 어렵지만, 모든 흩어진 데이터들을 아우를 수 있는�일반화된 값을 예측하는것이 모든 모델의 목표점이다.

학습 초기에, 초록색 선은 무작위로 어딘가에 그어진다.�그 초록색 선과 각 데이터의 위치를 비교하여 그 거리를 측정한다.�그 거리의 차이를 학습하여, 거리를 점점 좁혀나가게 된다.�⇒ 최대한 일반화 하기 위해서, 학습될때 마다 현재까지 학습된 � 모든 데이터의 거리들의 평균을 줄여나가는 것을 목표로 한다.� 이 평균 거리를 MSE (Mean Squared Error) 라고 하는데,� Error가 곧 모델과 데이터사이의 “거리"를 의미함

손님 성별별 음식점 팁

팁의 크기

총 밥값의 크기

예] 회귀 모델로,

$6.25 크기의 팁을

예측하였음

17 of 213

실용적인 머신러닝에 대한 소개

: 회귀와 분류 - 회귀 모델 (2)

앞선 예제형회귀 모델은 �예측값(팁, 종속변수)을 도출하기 위해서,�하나의 독립적인 변수(밥값) 만을 고려하였다.

하지만, 독립변수가 여러개 관여된다면�더 의미 있는 예측값을 도출할 수도 있을 것이다. (반드시 그런것은 아님)

왼쪽 그림은 3차원. 즉, 두 개의 독립변수를 사용해서�하나의 예측값을 도출하기 위한 모델 (평면)의 예를 보여준다.�3차원 이상은 시각화가 불가능 하지만,�더 높은 차원에서도 일반화하여 생각해볼 수 있을 것이다.�선형이라는 의미는 직선 / 평면같이 굴곡이 없는 형태로�그려지는 모델을 의미한다.

1차원 이상의 공간에서의 모델링된 ”평면"을

하이퍼 플레인(Hyper Plane) 이라고 한다.

(일반화된 용어임)

18 of 213

실용적인 머신러닝에 대한 소개

: 회귀와 분류 - 선형분류 모델 (1)

선형분류 모델도 선형회귀처럼 “직선” 또는 “평면” 을 그리게 된다.�단, 다른점은� - 회귀모델의 경우, 평면위의 점들이 예측값이 됨� - 분류모델의 경우, 평면은 범주를 나누기 위한 울타리가 됨� 예] 울타리를 기준으로, 한쪽은 남성 다른 한쪽은 여성�왼쪽 예의 데이터는 1차원 평면(직선)으로 성별이 이산되지 않는다 �⇒ 좀 더 고차원의 평면으로 이산 해보는 시도가 필요�분류 모델도 레이블링 값과, �모델이 예측한 범주의 결과 사이의 오차 범위를 줄여야 한다. �보통 Cross Entropy 라는 손실 측정 함수가 사용된다.

⇒ Cross Entropy는 예측값 (범주별 확률값)과 � 레이블값(여러 범주 중 하나의 카테고리만이 참일 것임) � 의 오차를 측정한다

손님 성별별 음식점 팁

팁의 크기

총 밥값의 크기

바이너리(이분) 분류 모델로,�여성 이라는 범주를 예측할 수 있음

19 of 213

실용적인 머신러닝에 대한 소개

: 회귀와 분류 - 선형분류 모델 (2)

모든 문제는 정의하기 나름이다. “팁의 크기”가 회귀 모델로 예측될 수 있는 문제였다. 하지만,�팁의 크기를 범주화 하여 (적거나, 보통이거나, 많거나) 분류모델의 문제로 바꿔볼 수도 있다.

예를 들어서, 팁의 크기에 대한 전체 분포도를 그린 후 팁이 밥값 대비 �> 25% 이면 “많다" | 15~25% 수준이면 “보통" | < 15% 이면 “적다"�와 같이 원하는대로 데이터를 범주화 해 볼 수 있다.

데이터를 들여다 보고, 정확한 요구사항을 파악한 후 요구사항을 충족시키기 위해서�만약 범주화된 데이터가 없다면, 기존 데이터를 기반으로 범주화된 데이터를 �새로이 창출해내면 될 것이다. (이런 것을 보통 Feature 엔지니어링 이라고 함)

머신러닝은 항상 “실험정신"과 깊이 연관되어 있음

20 of 213

실용적인 머신러닝에 대한 소개

: 회귀와 분류 - 데이터는 어디에서 오는가?

앞서 활용된 팁 관련 예제의 데이터는 “구조화된" 데이터라고 한다.� - 구조화되었다는 것은 행/열로써 표현이 가능하다는 뜻 (DB 테이블 처럼)

구조화되지 않은 데이터는 일반적으로 “그림", “오디오", “비디오" 같은 것을 의미한다� - 이진값들의 뭉텅이로써 존재함

예) 출생에 관련된 데이터로,� BigQuery 데이터에 소싱되어 있음� (SQL이 이용됨)

1

(SQL로

데이터 요청)

2�(결과 데이터는

“구조화된" 것)

예측

(언제 애기가

태어날지)

3. 예측모델 생성

4

나중에 직접

사용해보게 될

빅쿼리에서 제공되는

퍼블릭 데이터셋

21 of 213

실용적인 머신러닝에 대한 소개

: 회귀와 분류 - 출생 데이터로 예측 가능한것

여러개의 예측 대상을 정해볼 수 있다. 정말로, 본인이 정하기 나름임

몸무게는 부동소수로서 표현되어 있음 (실수형 연속성 데이터)

⇒ 출생할 신생아의 몸무게를 예측하고 싶다? ⇒ 회귀 모델 문제

몸무게 예측

22 of 213

실용적인 머신러닝에 대한 소개

: 회귀와 분류 - 동영상 내의 퀴즈

회귀와 분류 관련 퀴즈

오른쪽 그래프에 표현된

데이터셋은 선형회귀에 적합한가? 선형분류에 적합한가?, �또는 두개 모두가 적합한가?

선형 회귀

선형 분류

둘 모두

없음

23 of 213

실용적인 머신러닝에 대한 소개

: 회귀와 분류 - 동영상 내의 퀴즈 (정답)

회귀와 분류 관련 퀴즈

오른쪽 그래프에 표현된

데이터셋은 선형회귀에 적합한가? 선형분류에 적합한가?, �또는 두개 모두가 적합한가?

선형 회귀

선형 분류

둘 모두

없음

24 of 213

실용적인 머신러닝에 대한 소개

: 회귀와 분류 - 동영상 내의 퀴즈 (해설-회귀-1)

각각의 색에 대해서, 각각의 선을 그으면 최고의 “두 개"의 �회귀 모델을 얻을 수 있지만, 이를 모두 아우르는 �하나의 선이 그어져야 하는 것이 목표이다.

초록색 선이 바로 그 하나의 선인, 유니버셜한 모델이 된다. �그 이유는 MSE에 의해 모델의 예측값과 실제값 사이의 손실이 최소화되기 때문이다.��⇒ 파란색, 빨간색 선이 서로의 방향으로�초록색선을 땡기다가, tie를 이루는 지점이 최종 도출됨

25 of 213

실용적인 머신러닝에 대한 소개

: 회귀와 분류 - 동영상 내의 퀴즈 (해설-회귀-2)

빨간색, 파란색을 아우르는 모델을 도출하기 위해서 �좀 더 고차원적으로 접근해 볼 수 있다.�⇒ 하나 대신, 여러개의 Feature가 예측에 참여한다는 뜻

왼쪽 그림에는 두 개의 Feature가 참여하여�이차원의 하이퍼 플레인을 그려보는 예를 보여준다.�⇒ 그려진 하이퍼 플레인에는 빨간색과� 파란색의 많은 부분들이 모두 함께 포용된다

2차원 평면에서 그려둔 세 개의 선을 모두 포함하는 �2차원 하이퍼 플레인이라는 점도 확인해보자

26 of 213

실용적인 머신러닝에 대한 소개

: 회귀와 분류 - 동영상 내의 퀴즈 (해설-분류-1)

명백히 파란색과 빨간색을 구분하는 직선을 그려볼 수 있을 것이다.�(즉, 분류 모델을 만들 수 있음을 의미한다.)

오른쪽 그래프에서, 선형분류 모델의 직선은 “노란색"이다�⇒ 왜? 선형 회귀모델의 “초록색"과 정확히 일치하지 않을까?

그 이유는 회귀 모델의 손실측정함수는 MSE가 사용된 반면,�분류 모델의 손실측정함수는 Cross Entropy가 사용되었기 때문이다

MSE는 예측값과 실제값 사이의 거리차를 제곱하지만�Cross Entropy는 두 값의 차이가 클수록 기하급수적으로�크기가 늘어나는 특성이 있음�(노란색 선이 노이즈가 많은 빨간색으로부터 더 떨어진 이유)

27 of 213

실용적인 머신러닝에 대한 소개

: 머신러닝의 역사적 흐름과 알고리즘 - 선형 회귀(1)

Sir Francis Galton 에 의해 자연현상을 측정하기 위해서 고안되었다

부모와 자식의 상대적인 크기에 대한 데이터가 있었는데, 여기엔 “완두콩" 종도 포함되었다

부모세대에서 어떤 익스트림한 성장이 발견 되었더라도, 이 특징이 자식세대로 완전히 대물림 되지 않는다. �⇒ 대신에 부모세대들의 평균점으로 � 자식들이 회귀하는 특성을 가짐이 발견됨

선형 회귀는 아직 계산이 사람의 손으로�

수행되던 시기에 발명되었다.

그런데, 나중에 보니까? 거대한�데이터셋에서도 여전히 잘 동작하여 왔음

선형 회귀

행성과 완두콩 성장 예측을 위함

28 of 213

실용적인 머신러닝에 대한 소개

: 머신러닝의 역사적 흐름과 알고리즘 - 선형 회귀(2)

일반화된 회귀 모델을 수식으로 표현한 것으로, “가설” 공식 이라고도 한다. (Hypothesis)�⇒ 모델이 예측값을 뽑아내는데 사용되기 때문에 “가설”임

x_0는 첫 번째 Feature의 값, x_1는 두 번째 Feature의 값,.... �w_0는 첫 번째 Feature의 중요도를 나타내는 가중치, w_1는 …. �각 Feature 값과 가중치가 곱해진 것들을 몽땅 더한 것이 모델이 예측하고자 하는 값 y_hat 이 된다. (y 가 ^ 모자쓴듯한 표기라서 그렇게들 부름)

29 of 213

실용적인 머신러닝에 대한 소개

: 머신러닝의 역사적 흐름과 알고리즘 - 선형 회귀(3)

간단히, 아래처럼

행렬의 공식으로 간단히 표현 가능

이 공식은, 머신러닝의 다양한 곳에서 사용된다.

특히, 딥러닝에서 흔히 볼 수 있음�(눈에 익혀두는 것이 좋을것임)

대문자 X는 보통, 모든 소문자 x들을

포함하는 하나의 벡터쯤으로 생각해볼 수 있다

XW

30 of 213

실용적인 머신러닝에 대한 소개

: 머신러닝의 역사적 흐름과 알고리즘 - 선형 회귀(4)

일단, Feature들에 대한 값은 가지고 있으니, y_hat 값을 모델이 도출할 수 있을 것이다.�(가중치는 일반적으로, 특정 분포를 따르는 무작위 값으로 골라진다)

그러면, 예측된 값이 좋은지? 나쁜값인지? 어떻게 알 수 있는가?�⇒ 이때 필요한 것이 “손실 (측정) 함수”Loss Function 이다�⇒ 앞서 말했듯이 MSE 같은것을 구하는 것이다

레이블 값 (실제값)

== y_hat

(모델이 예측한 값)

XW

L2 Norm 이란 것을 계산하는 공식인데,

y 와 XW 사이의 거리를 측정한다고쯤 생각해 두자

⇒ 전체 데이터셋의 하나의 열(record)에 대한� 계산으로, MSE를 하려면 모든 열에 대해서 � 몽땅 계산한 후, 그것들의 평균을 내야함

31 of 213

실용적인 머신러닝에 대한 소개

: 머신러닝의 역사적 흐름과 알고리즘 - 선형 회귀(5)

당연히(?), 최적의 모델이 되는 목표점은�손실함수가 계산한, 모든 데이터들에 대한 손실값의 평균이�최소화 되는지점을 찾아내는 것이다.

보면 알겠지만, y나 X는 이미 주어진 데이터값이다. 변해서는 안되는 값이라는 이야기�⇒ 즉, 가중치 값을 계속 조정해서 손실값이 최소가 되는 지점을 발견해야 하는 것

XW

32 of 213

실용적인 머신러닝에 대한 소개

: 머신러닝의 역사적 흐름과 알고리즘 - 선형 회귀(6)

그러면, 어떻게 가중치 값을 조절해야 손실값을 최소화할 수 있는가?�⇒ 선형 회귀문제에는, 아래와 같은 정해진 공식이 존재한다.�����⇒ 근데? O(n^3) 의 극악한 시간 복잡도와 중복성 데이터에 대한 고려가 없음�⇒ 실용적이지 못하다고함, 다른 공식들도 몇 존재하지만… 무진장 느린 단점이 있음

다행히도! 경사하강의 최적화 알고리즘이 있는데, 그 이점으로는�1. 비교적 낮은 시간 및 공간 복잡도, 2. 일반화를 좀 더 잘 함�3. 대부분의 문제에도 활용 가능한 특징(제네릭)

33 of 213

실용적인 머신러닝에 대한 소개

: 머신러닝의 역사적 흐름과 알고리즘 - 선형 회귀(7)

왼쪽 그래프는 3차원 형태의 손실값들의 공간으로, 산/계곡이 있는것 처럼의 굴곡진 형태로 표현이 된다.

글로벌 손실의 최소지점이 모델이 궁극적으로 도달해야 하는 지점이 된다.

산의 능선을 타고 내려오면서, 더 낮은 손실값을 찾아낸 가중치 파라메터들의 조합을 발견하게 된다. 이때, 하강 방향및 경사진 정도경사하강법Gradient Descent 이라는 기법으로 구해짐��(현 위치를 미분하면 기울기가 구해지고, 기울기에 그 두 정보가 포함됨)

경사 하강법

세 개의 가중치 파라메터에 대한

손실값 공간

손실 최대

손실 최소

(글로벌)

경사를 타고

최소지점으로

내려감

34 of 213

실용적인 머신러닝에 대한 소개

: 머신러닝의 역사적 흐름과 알고리즘 - 선형 회귀(8)

경사하강으로 얻어진 정보(방향/경사도)를 이용해서, �한번에 하강할 보폭의 크기가 결정되어야 하는데, 그 정도를 학습률"Learning Rate 이라고 한다.�⇒ 학습전에 설정되는 하이퍼-파라메터의 한 종류

3차원도 상당히 단순화된 공간으로, 현실적으로는 이보다도 훨씬 높은 차원을 다루게 된다�⇒ 딥러닝의 경우, 수십 수백차원까지…

여담이지만, 강화학습의 경우는 최소가 아닌 최대지점을 찾아가는 여정이다. �(보상을 Max 로 받는 방법을 알아내기 위함)

경사 하강법

세 개의 가중치 파라메터에 대한

손실값 공간

손실 최대

손실 최소

(글로벌)

경사를 타고

최소지점으로

내려감

35 of 213

실용적인 머신러닝에 대한 소개

: 머신러닝의 역사적 흐름과 알고리즘 - 퍼셉트론(1)

Frank Rosenblatt 이 고안한 것으로, 뉴런 한개를 계산적(수학적)으로 모델링한 것이다�⇒ 퍼셉트론이 간단한 함수를 학습할 수 있음을 보여줬는데, � 이는 근래에 사람들이 “바이너리 분류"Binary Classification 라고 부르는 것을 의미한다�⇒ 즉, 선 하나를 그어서, 서로 다른 두 종류를 나눌 수 있는 능력을 가졌다는 것이다

추후 나올 내용이지만, 여러개 퍼셉트론의 배열로 하나의 층을 구성할 수 있는데,�⇒ 이것을 가장 간단한 형태의 인공신경망(단일 은닉계층) 이라고 볼 수 있다

선형 회귀

퍼셉트론

행성/완두콩 성장 예측

인공신경망의�선조격

36 of 213

실용적인 머신러닝에 대한 소개

: 머신러닝의 역사적 흐름과 알고리즘 - 퍼셉트론(2)

퍼셉트론은 사람 두뇌에 있는 뉴런의 동작원리에 영감을 받아서 만들어진 것이다. 좌상단의 그림은 실제 뉴런Neuron의 생김새를 보여준다.

  1. Dendrite는 외부자극을 수용한다�(여러개의 Dendrite가 있음)�
  2. 여러개의 외부자극을 수용하면, Nucleus에서 이 자극들을 새로운 자극으로 가공한다 �
  3. 새로운 자극은 Axon을 통해서 여러가닥으로 브로드캐스팅 된다. 이때, 각 가닥의 정보는 또 다른 뉴런의 Dendrite와 연결된다

위와 같은 뉴런들이 많이 복잡하게 엮여서 수 많은 정보를 서로 주고 받게 된다.

37 of 213

실용적인 머신러닝에 대한 소개

: 머신러닝의 역사적 흐름과 알고리즘 - 퍼셉트론(3)

좌하단의 그림은 뉴런의 계산적(수학적) 모델링에 대한 그래프를 보여주고 있다

실제 뉴런과, 모델링된 인공뉴런의 각 부분을 매칭해보면 대충 왼쪽과 같은 관계를 가질 것이다.

계산적인 모델에 대한 자세한 내용은

다음 슬라이드에 나온다

38 of 213

실용적인 머신러닝에 대한 소개

: 머신러닝의 역사적 흐름과 알고리즘 - 퍼셉트론(4)

입력(벡터 X)

가중치

(벡터 W)

모든 x*w의 합

(단일 숫자)

활성함수

(단일 숫자)

출력

(단일 숫자)

x_1, x_2, …, x_n개의 입력과 가중치간의 곱셈연산 후, 더하는 연산과 동일한 �두 벡터(입력 X, 가중치 W) 간의 곱셈이 이뤄지면, 하나의 단일 숫자 값만이 남게 된다.�⇒ 곱셈과 덧셈이라는 선형적인 연산의 수행은 있는 그대로의 특성을 보존하게 될 것이다

실제 가공은 활성함수에서 이뤄질 것이다�⇒ 활성함수란, XW 값을 살릴것인지? 죽일것인지? 결정하는 게이트라고 생각해볼 수 있다�⇒ 어떤 정해진 임계치를 기준으로, XW가 의미 있는다면, 활성화가 될 것이요… 아니면 죽을 것이다.

괜찮은 아이디어임에는 틀림 없지만, 복잡한 모델을 만들어내지는 못한다.

예] 단일 퍼셉트론으로는 XOR 모델링 불가

하지만, 이후 뉴럴넷인공신경망 및 딥러닝의 모델링을 위한 가장 기본 단위로 활용된다.

XW

39 of 213

실용적인 머신러닝에 대한 소개

: 머신러닝의 역사적 흐름과 알고리즘 - 뉴럴넷(1)

“선형적인” 활성함수Activation Function 만 사용되던 퍼셉트론 시대와 비교해서,�뉴럴넷의 시대에는 “비선형적인" 활성함수가 사용되기 시작했다.�(예 - sigmoid, tanh, ReLU, leaky ReLU, ELU, ...etc.)

뉴럴넷(인공신경망): 다계층의 퍼셉트론

퍼셉트론과 비교해서 달라진 부분

1]

입력과 출력의 연결 사이에 추가된 계층

이 계층은 은닉계층 이라고 불린다

⇒ 단순히 여러개의 퍼셉트론으로 구성�⇒ 다층 퍼셉트론이라고도 함�

여러개의 퍼셉트론이 계산한 내용을�출력 계층으로 전달해줌으로써, 좀 더 고차원적인 데이터 해석이 가능하다

2]

비선형적인 활성함수가 사용됨

40 of 213

실용적인 머신러닝에 대한 소개

: 머신러닝의 역사적 흐름과 알고리즘 - 뉴럴넷(2)

입력(벡터)

입력계층의�가중치

(행렬)

뉴럴넷(인공신경망): 다계층의 퍼셉트론

행렬곱셈(벡터)

비선형

활성함수(벡터)

은닉계층

입력

(벡터)

은닉계층

가중치

(벡터)

행렬곱셈

(단일 숫자)

비선형

활성함수(단일 숫자)

출력�(단일 숫자)

41 of 213

실용적인 머신러닝에 대한 소개

: 머신러닝의 역사적 흐름과 알고리즘 - 뉴럴넷(3)

단순한 선형 함수�

(선형적으로 증가하거나�또는 감소하거나..)

sigmoid 비선형 함수 (발음은 시그모이드)

입력값이 뭐가 들어오던지 ⇒ 0~1 사이의 값으로 변환

0~1의 표현은 확률바이너리 분류에 활용 가능한 범위의 숫자이다

Sigmoid 함수

Sigmoid의 미분 함수

42 of 213

실용적인 머신러닝에 대한 소개

: 머신러닝의 역사적 흐름과 알고리즘 - 뉴럴넷(4)

수학적 수식 자체에 대한 것은 잠시 미뤄두고, 활성함수의 그래프 모양에 관심을 가져보자.

또한, 각 함수가 미분 될 때? 어떤 모양을 띄게 될지를 상상해 보는것도 중요하다.

추후 배울 내용으로, �미분이 잘 된다 == 경사하강이 잘 작동한다 ⇒ 최소 손실지점에 좀 더 잘 도달한다

tanh 비선형 함수로 �쌍곡선에 대한 탄젠트(하이퍼볼릭 탄젠트)와 동일한 말이다�(발음은 “탠-에이취")

Sigmoid와 유사하지만, 출력값의 범위가 (-1 ~ 1)인것이 다르다

또한, tanh 함수의 미분된 형태를 보면, sigmoid가 0~0.5인 것과 비교�0~1.0의 좀 더 넓은 범위의 값을 가짐을 알 수 있다�

⇒ 즉, 미분이 더 잘된다�⇒ 미분된 값이 작아지는것이 sigmoid의 문제점이었다

⇒ 다층 레이어의 각각의 활성함수는 각 활성함수에 대한 미분을� 연속적으로 해야함을 의미한다. 작아진 녀석을 또 다시 미분하므로� 계속해서 작아지기 마련이다

tanh 함수

tanh의 미분 함수

43 of 213

실용적인 머신러닝에 대한 소개

: 머신러닝의 역사적 흐름과 알고리즘 - 뉴럴넷(5)

ReLU 비선형 함수로, Rectified Linear Unit 이라는 풀네임을 가진다.

(발음은 뤨루 또는 뤨유) - 현재 가장 인기있는 활성함수

함수의 모양은 매우 단순하다. �입력값이 0 이하면, 출력은 무조건 0이되고�입력값이 1 이상이면, 자기 자신의 값이 출력된다.�즉, f(x) = max(0, x) 과 같이 표현이 가능하다

sigmoid, tanh 대비, 뉴런의 입력값들의 조합을 살려야 한다고 학습되면�계속 그 값 그대로가 유지되고, 생존대상이 아니면 가중치가 0보다 작은수로 학습되어간다.

⇒ 0이 어떤 의미를 가지는가? � ReLU 활성함수의 연산 결과는 다음 인공뉴런의 입력으로 사용되고, � 연관된 가중치가 존재한다. 입력값이 무엇이던지 간에 가중치가 음수라면,� 두 값의 곱셈의 결과는 0이 되고, 아무런 기여도 하지 못하게 된다.

죽일놈은 확실히 죽이고, 살릴놈은 확실히 살릴 수 있음

또한, 살릴놈에 대한 미분은 항상 1로 유지가 되어 학습이 잘 이루어진다.�하지만, 죽일놈에 대한 미분은 항상 0이어서 학습이 잘 안되는 문제가 있다.

ReLU

ReLU의 미분 함수

44 of 213

실용적인 머신러닝에 대한 소개

: 머신러닝의 역사적 흐름과 알고리즘 - 뉴럴넷(6)

ELU는 ReLU와 비슷하지만,

죽일놈에 대한 미분은 항상 0이어서 학습이 잘 안되는 문제를

해결하기 위해서, 0 이하 값의 부분만을 약간 변형 하였다.

ELU는 (Exponential Linear Unit) 이라는 풀 네임을 가지는데�0 이하의 값이 e^x-1 이기 때문이다.

ReLU에 비해서 이론적으로 더 좋긴 하지만, 현실적으로 드러나는 한가지 단점이 있는데, e 에 대한 계산 시간이 복잡하다는 것이다.

⇒ 그만큼 컴퓨팅 자원이 많이 필요함

45 of 213

실용적인 머신러닝에 대한 소개

: 머신러닝의 역사적 흐름과 알고리즘 - 뉴럴넷(7) / 동영상내 퀴즈

뉴럴넷(인공신경망) 관련 퀴즈

출력의 결과가 확률적 형태이길 원한다면, 마지막 계층에서 어떤 활성화 함수를 사용해야만 하는가?

46 of 213

실용적인 머신러닝에 대한 소개

: 머신러닝의 역사적 흐름과 알고리즘 - 뉴럴넷(7) / 동영상내 퀴즈(정답)

뉴럴넷(인공신경망) 관련 퀴즈

출력의 결과가 확률적 형태이길 원한다면, 마지막 계층에서 어떤 활성화 함수를 사용해야만 하는가?

47 of 213

실용적인 머신러닝에 대한 소개

: 머신러닝의 역사적 흐름과 알고리즘 - 디시전트리(1)

Decision Tree, “디시전트리” 또는 “의사결정나무”는 80~90년대에 발명된 것으로,�⇒ Feature 별로 구분하여, 회귀/분류의 결과에 도달하기에 필요한 경계선에 대한 결정들을 내린다 �⇒ 학습이 쉽고 알고리즘의 각 결정사항은 사람들이 이해하고 해석하기가 쉽다Human Interpretable�⇒ 회귀, 분류 문제 모두를 해결할 수 있다

디시전트리는 개념적인 것으로, 이 개념을 구현한 알고리즘으로는�⇒ ID3, C 4.5, CART 가 대표적이다 (C 4.5는 ID3의 다음 버전. Scikit-Learn 에서는 CART가 사용됨)

48 of 213

실용적인 머신러닝에 대한 소개

: 머신러닝의 역사적 흐름과 알고리즘 - 디시전트리(2)

디시전트리를 수행할 때, 가장 먼저 해 봐야 할 것은

데이터셋을 보고 원하는 결과의 도출에 영향이 있을만한

흥미로운 질문들을 스스로에게 던져보는 것이다.

⇐ 타이타닉 승객 중, 생존자와 사망자들에 대한 데이터는� 머신러닝의 입문용으로 널리 사용되고 있다.

(사회적 지위, 투숙 객실 위치, 성별등… 의 Feature들이 � 어떻게 생존에 영향을 미치는지?)

49 of 213

실용적인 머신러닝에 대한 소개

: 머신러닝의 역사적 흐름과 알고리즘 - 디시전트리(3)

성별이 남성인가?

샘플 수 = 1309

[생존:500, 사망:809]

그렇소

아니오

맞소

아니오

맞소

아니오

그렇소

아니오

선실 등급 < 1.5 인가?

샘플 수 = 843

[생존:161, 사망:682]

나이가 > 17.5 인가?

샘플 수 = 179

[생존:61, 사망:118]

선실 등급 < 2.5 인가?

샘플 수 = 466

[생존:339, 사망:127]

나이가 > 17.5 인가?

샘플 수 = 664

[생존:100, 사망:564]

샘플 수 = 168

[생존:55, 사망:113]

샘플 수 = 11

[생존:6, 사망:4]

샘플 수 = 569

[생존:73, 사망:396]

샘플 수 = 95

[생존:27, 사망:68]

사망

사망

사망

사망

사망

사망

사망

생존

생존

전체 샘플비율

100%

전체 샘플비율

64%

전체 샘플비율

36%

전체 샘플비율

14%

전체 샘플비율

50%

전체 샘플비율

13%

전체 샘플비율

1%

전체 샘플비율

43%

전체 샘플비율

7%

선실등급의

결정이 내려 지기 전,

성별이 남성일 때,

사망자가 우세하다는 뜻

50 of 213

실용적인 머신러닝에 대한 소개

: 머신러닝의 역사적 흐름과 알고리즘 - 디시전트리(4)

ID3 알고리즘을 기준으로 각각의 Feature별로, 분기를 나누는 기준은

모 집단의 “Entropy”에서, 자식 집단의 “Entropy”를 비교하여 적절성이 판단된다.�

( C 4.5, C 5, CART 는 약간씩 다른 알고리즘을 사용하지만 기본적인 느낌은 비슷)

Entropy 라는 것은, 현재 집단의 순수성/순도purity 을 판단하는 방법

⇒ 집단에, 한가지 종류의 데이터만이 존재한다면 Entropy의 값은 0으로 수렴�⇒ 집단에, 여러 종류의 데이터가 섞여 존재할때, 섞인 정도가 심할수록 1으로 수렴

Information Gain(오른쪽 공식) 은 모집단의 Entropy 에서, 자식 집단의 Entropy의 차이를 구한다.⇒ 순수성이 떨어지면 떨어질 수록, 결정을 내리기 위한 분기가 형성되어야 함을 의미한다�⇒ 즉, 모집단의 순수성은 낮고 (Entropy ~ 1), 자식이 될 집단의 순수성은 높다면 (Entropy ~ 0 )� 분기가 형성될 가치가 충분하다고 판단될 수 있다.�⇒ 따라서, Information Gain 값이 1에 가까울 수록…. 분기가 형성됨

51 of 213

실용적인 머신러닝에 대한 소개

: 머신러닝의 역사적 흐름과 알고리즘 - 디시전트리(5)

⇐ Information Gain 기반으로, 각 결정 분기(경계선)들은 � 바이너리 분류를 수행하고 있다. (꼭 그래야만 하는것은 아님)

아래처럼… 쪼개지고 또 쪼개지는 느낌으로

도식화 될 수 있을 것임 (결론을 내리기 위한 경계선을 계속 가지침)

1

2

3

4

5

6

52 of 213

실용적인 머신러닝에 대한 소개

: 머신러닝의 역사적 흐름과 알고리즘 - 커널 기법(1)

새로운 종류의 비선형적인 모델에 대한 연구로, �특히 비선형적인 SVM 모델의 연구가 두드러졌다

SVM의 풀네임은 Support Vector Machine 으로, �분류를 위한 모델인데, 나눠질 데이터의 군집사이에 여백을 주어 일반화를 도모한다

일단, 다음장의 그림을 참조해보자.

53 of 213

실용적인 머신러닝에 대한 소개

: 머신러닝의 역사적 흐름과 알고리즘 - 커널 기법(2)

따라서, SVM의 목표는 Support Vector간의 여백이 최대한 넓어지는 Support Vector를 발견하는 것이다. �이때 사용되는 손실 (측정) 함수는 Hinge 손실 함수가 사용된다.

만약, 분류해야 하는 범주가 두개 이상이 된다면, 일단 하나 vs (전체 범주의 수 - 1)의 전략으로,�하나씩 하나씩 Support Vector를 구해나가게 된다.

각 범주의 데이터 군집을 구분하는 위치로부터,�각 범주에 최대한 가까운 선을 각각 그린다.

이 선들은 Support Vector 라고 불리며,�Support Vector 사이의 거리를 여백이라고 한다.

왼쪽의 두 그래프는 동일한 데이터에 대해서,

서로다른 여백의 크기를 가질 수 있는 사례를 보여준다.

여백이 크면 클 수록, 일반화가 더 잘될 수 있다

두 부류 사이의 여백을 최대화 하는 SVM

좁은 여백

넓은 여백

54 of 213

실용적인 머신러닝에 대한 소개

: 머신러닝의 역사적 흐름과 알고리즘 - 커널 기법(3)

이 커널 기법이란 녀석과 비슷한 녀석이 인공신경망에서도 존재한다.�⇒ 인공신경망의 한 계층의 뉴런의 수가 차원의 크기를 결정함�⇒ 입력 Feature가 두개 있는데, 은닉 계층의 뉴런이 세개 존재한다면, 2D => 3D 공간으로 매핑된다는 뜻 (재해석)

많이 사용되는 커널 기법으로는 Linear Kernel, Polynomial Kernel, Gaussian RBF Kernel 같은 것들이 있음

앞선 예제는 선형적인 분류의 경우를 보였다.

그런데, 데이터 분포가 선형적이지 않다면 어떨까?

선형적인 Support Vector 기반의 분류는 상당히 어려울 것이다.

해결책으로 Kernel 기법을 사용할 수 있는데, 저차원

공간의 데이터들을 고차원 공간에 다시 도포하는 기법이다.

왼쪽 그림을 예로 들어보면, �2차원 평면에서는 분류가 어려워 보이는 데이터가�3차원 공간으로 옮겨가면서 손쉽게 분류 가능한 �하이퍼 플레인이 발견될 수 있다.

커널은 입력 공간을 좀더 쓸모있는 Feature 공간으로 변형시킨다.

55 of 213

실용적인 머신러닝에 대한 소개

: 머신러닝의 역사적 흐름과 알고리즘 - 커널 기법(4) / 동영상내 퀴즈

커널 기법 퀴즈

SVM이 커널을 사용하여 입력공간을 더 높은 차원의 Feature 공간으로 매핑하는 방법을 학습했다.

인공신경망에서 이와 비슷한 매핑을 수행하는 것은 무엇인가?

활성 함수

더 많은 계층들

계층당 더 많은 수의 뉴런들

손실 함수

56 of 213

실용적인 머신러닝에 대한 소개

: 머신러닝의 역사적 흐름과 알고리즘 - 커널 기법(4) / 동영상내 퀴즈(정답)

커널 기법 퀴즈

SVM이 커널을 사용하여 입력공간을 더 놓은 차원의 Feature 공간으로 매핑하는 방법을 학습했다.

인공신경망에서 이와 비슷한 매핑을 수행하는 것은 무엇인가?

활성 함수

더 많은 계층들

계층당 더 많은 수의 뉴런들

손실 함수

57 of 213

실용적인 머신러닝에 대한 소개

: 머신러닝의 역사적 흐름과 알고리즘 - 랜덤 포레스트(1)

디시전 트리를 기억할 것이다. 하나의 나무로, 특정 결론을 도출한 것이지만…�⇒ 이 나무가 Best 나무가 아닐 수 있다

랜덤 포레스트나무가 아니라 “숲"인데, 여러개의 디시전 트리를 조합하여 이름처럼 숲을 구성한다. �(앙상블(합주) 모델이라고도 한다)

랜덤 포레스트에서, 전체 데이터는 부분적으로 쪼개져서 다수의 디시전 트리를 학습에 사용된다. �이때의 각 디시전 트리를 “약한(weak)” 학습자(learner)라고도 한다.

58 of 213

실용적인 머신러닝에 대한 소개

: 머신러닝의 역사적 흐름과 알고리즘 - 랜덤 포레스트(2)

랜덤 포레스트: 많은 약한 학습자로부터

만들어지는 강한(Strong) 학습자

랜덤 샘플

전체 데이터셋의 무작위 샘플링으로, 여러개의 약한 학습자인�디시전 트리를 위한 부분 데이터 집합을 구성한다

랜덤 샘플링과 비슷한, 랜덤 Subspacing/Bagging 용어가 있다�(“랜덤” 샘플링 => 더 나은 일반화 도출을 기대할 수 있음)

각 디시전 트리는 독립적인 알고리즘 수행 및 경계선을 특정 한다

여러개 디시전 트리들의 결과를 종합하여, 투표를 하고

대다수의 디시전 트리가 내놓은 결과가 채택된다

회귀문제라면, 연속적인 숫자들이 예측 대상값 이므로, 평균/최대값/중간값과 같은것으로 대체되어 투표될 수 있을 것이다

이렇게 여러 약한 학습자들이 모여서, 논의(?) 하여 �의사결정을 내리면 “강한”Strong 학습자를 만들 수 있게 된다

59 of 213

실용적인 머신러닝에 대한 소개

: 머신러닝의 역사적 흐름과 알고리즘 - 랜덤 포레스트(3)

전체 데이터셋의 부분을 학습하는 각 디시전 트리는 편향(언더 피팅)Bias이 심할 수 있다. (배움의 정도가 허접)�하지만, 마지막에 모든 트리들이 종합되어 결과가 도출되기 때문에 편향과 분산이 모두 줄어들 수 있을 것이다�* 편향은 학습의 정도가 부족한 상태, 분산은 학습이 지나치게 많이 이뤄진 상태, 두가지가 적절히 짬뽕되어야함

[또한, 분산(오버피팅)Variance이 심해지는것 또한 문제가 되기 때문에, �이러한 문제를 방지하기 위해서는 k-fold validation 와 같은 기법을 활용하는 것이 바람직하다.��전체 데이터셋의 일부를 따로 분리하여, 학습시에 사용하지 않고 �모델의 분산과 편향을 판단하기 위한 용도로 활용할 수 있다. (검증 데이터셋)�⇒ 학습때 사용하던 데이터로 테스트 해봐야 신빙성이 별로 없음

랜덤포레스트와 같은 앙상블 모델에서, 계~속 약한 학습자 트리를 추가하면 더 좋을까? �⇒ 물론 아니다. �⇒ 검증 데이터셋으로, 지속적으로 분산상태를 체크하여, 중도에 그만둘 수 있음�] 뒷 부분에서 좀 더 친절히(?) 다뤄짐

60 of 213

실용적인 머신러닝에 대한 소개

: 머신러닝의 역사적 흐름과 알고리즘 - 랜덤 포레스트(4) / 동영상내 퀴즈

랜덤 포레스트 퀴즈

각각의 디시전 트리를 비교할 때,

랜덤포레스트에 대해서 �가장 옳바르지 않을법한 설명은?

Bagging/Subspacing 을 통한 더 나은 일반화

투표를 통한 무리로부터 얻게된느 현명함

비슷한 편향이지만, 더 낮은 분산

시각적으로 해석하는것의 용이성

61 of 213

실용적인 머신러닝에 대한 소개

: 머신러닝의 역사적 흐름과 알고리즘 - 랜덤 포레스트(4) / 동영상내 퀴즈 정답

랜덤 포레스트 퀴즈

각각의 디시전 트리를 비교할 때,

랜덤포레스트에 대해서 �가장 옳바르지 않을법한 설명은?

Bagging/Subspacing 을 통한 더 나은 일반화

투표를 통한 무리로부터 얻게된느 현명함

비슷한 편향이지만, 더 낮은 분산

시각적으로 해석하는것의 용이성

62 of 213

실용적인 머신러닝에 대한 소개

: 머신러닝의 역사적 흐름과 알고리즘 - 현대의 뉴럴넷(1)

현대의 뉴럴넷은 일단 “깊다".�⇒ 빅데이터의 등장과, 이를 핸들링 할 수 있는 하드웨어의 발전이 한몫했음�⇒ “깊다" ~ 딥뉴럴넷 ~ 딥러닝

여러 CNN, RNN, GAN 같은 구조적인 부분의 기술 발전, 학습 효율성을 증가시켜주는 ReLU 활성함수,�파라메터의 다양한 초기화 기법, 모델의 일반화를 위한 Dropout같은 기법�같은것들이 대거 등장하여 뉴럴넷을 더욱 강력하게 만들어줬다

63 of 213

실용적인 머신러닝에 대한 소개

: 머신러닝의 역사적 흐름과 알고리즘 - 현대의 뉴럴넷(2)

딥러닝, 딥 뉴럴넷은 은닉계층이 두 개 이상인 인공신경망을 의미한다.

딥러닝 이전의 인공신경망은 하나의 은닉계층으로만 구성이되었었다�⇒ 이를 얕은 뉴럴넷(인공신경망) 이라고 부른다

보통 각 계층의 뉴런은 다음 계층의 뉴런들과 m:n의 완전한 매핑(연결) 형태를 가진다�⇒ 그래서 Fully Connected Layer(FCL, 완전히 연결된 계층) 이라고 표현된다

입력계층 ⇒ 첫 번째 은닉계층 (입력 데이터를 더 높은 차원으로 재해석/가공)

첫 번째 은닉계층⇒ 두 번째 은닉계층 (다시 한번 더 높은 차원으로 재해석)

….. 계속해서 반복된다

뉴럴넷의 계층이 깊으면 깊을수록, 입력 데이터 자체만으로는

미처 알지 못한 높은 수준의 특징(패턴)을 찾아내는 것이 가능하다.

높은 수준의 특징을 기반으로, 마지막 계층에서는 분류와 같은모델이 해결하고자 하는 문제에 대한 알고리즘이 적용된다 (Sigmoid 같은..)

64 of 213

실용적인 머신러닝에 대한 소개

: 머신러닝의 역사적 흐름과 알고리즘 - 현대의 뉴럴넷(3)

기존에 영상처리에서 사용되던 컨볼루션Convolution 이라는 기법이 있다.�⇒ 이 기법을 인공신경망에 접목시킨 모델이 있는데, CNNConvolution Neural Networks 라고 불린다.�컨볼루션이란, 이미지의 특정 지역적인 부분에서, 어떤 특징을 추출해내는 기법이다. (대각선/수직선/수평선/원 등)�⇒ 이미지가 NxN 픽셀의 배열이면, 일부분을 들여다 보기 위한 컨볼루션의 창(커널)은 nxn 크기가 될 수 있다.�⇒ 과거 컨볼루션의 모든 커널들은, 사람들이 고안한(정해놓은) 값으로 정의되어 왔다. �⇒ 예를 들어서, 수직선을 추출하기 위한 행렬에 채워진 값들이 존재했음�그런데? 인공신경망이 도입되면서, 이 커널의 값들 자체가 학습되어지게 되었고,�사람의 머리로는 생각치 못한 고차원적인 커널을 발견하게 되었다. ⇒ 결과적으로 사람보다 더 뛰어난 결과를 보여줌

낮은 계층 (선 종류)

예] 첫 번째 은닉계층

중간 계층 (눈/코/입)

예] 10번째 은닉계층

높은 계층 (얼굴 형상)

예] 20번째 은닉계층

계층이 올라갈 수록, 더 고차원적인 해석

65 of 213

실용적인 머신러닝에 대한 소개

: 머신러닝의 역사적 흐름과 알고리즘 - 현대의 뉴럴넷(4)

인셉션 모델

딥 뉴럴넷

구글넷GoogLeNet 은 2014년에 이미지넷 경연ILSVRC 을 우승한 모델로, 기본 CNN 모델의 변종쯤이다.

이미지넷 경연에서 제공되는 데이터는�120만장의 이미지로, 이는 1,000개의 범주로 나뉜다. �이 경연의 목적은 학습때 보지 못한 사진을 테스트해서, 1,000개의 범주로 적절히 잘 나누는것이다 (매우 복잡함)

Pooling 계층을 제외하면 22 계층, 포함하면 27 계층으로 당시에 매우 깊은 뉴럴넷으로 학습될 파라메터의 개수는 1,100만개 이상으로 구성된다

⇒ 현재는 끔찍하게 깊은 뉴럴넷들도 많다

구글 스터디잼이라 그런지... 구글에서 발표한 모델만을�예시로 설명하고 있다. 하지만, 더 뛰어난 모델들도 많이 있음

66 of 213

실용적인 머신러닝에 대한 소개

: 머신러닝의 역사적 흐름과 알고리즘 - 현대의 뉴럴넷(5)

이미지넷의 데이터를 사람이 분류했을 때의 추정되는 에러율�사람의 성능Human Performance

⇒ 측정 방법은 당시 스탠포드대 대학원생 이었던 Andrej Karpathy 라는 �분이 직접 손으로(?) 분류해 봄으로써, 기계가 목표로 삼을 기준점 제시

2014 ⇒ 2015 불과 1년만에 비약적인 성능 발전이 이뤄짐 (사람을 능가함)

딥러닝 모델이 발표되면, 논문에 관련 모델의 상세 스펙�학습에 사용된 다양한 파라메터 지표등이 모두 공개되는데,

이를 약간씩 변형 하면서, 실험 하다보니 금방 현재의 최고 성능을�앞지르는 새로운 모델이 탄생하게됨

67 of 213

실용적인 머신러닝에 대한 소개

: 구글의 상용화 수준의 머신러닝 시스템

그 중 sibyl 이라는 모델이 있었는데, �유투브의 동영상 추천 시스템에 사용되던 것이었음�⇒ 매우 성공적인 모델이었기에, � 이후 구글의 수 많은 부분에 적용되는 형태로 진화

엄청 큰 스케일의 컴퓨팅 자원을 활용하여, 엄청나게 큰 모델을�학습시킬 수 있도록 하기 위한 프로젝트로 탄생된 것이�TensorFlow 라는 프레임워크이다

현재는 가장 인기있는 딥러닝 플랫폼이 되었다. �또한, 이식성과 병렬계산에 뛰어난 데이터플로우 그래프 기반이어서,�별다른 노력 없이 여러가지 기기에 이식이 가능함

올해로 약, 3년정도 되었음에도 불구하고 수 많은 오픈소스 기여자들이 �존재했기에, 이론적으로 배운 내용에 매핑되는 거의 모든 기능들이 존재

TFX는 TensorFlow 기반의 상용화레벨의 규모로 스케일해주는 머신러닝 플랫폼임

코스 후반부에서, Google CLoud ML Engine / Big Query / Dataflow 등을 사용해서 �머신러닝 모델을 만들고, 배포하는 방법을 알아볼 예정 (스터디잼에서는 포함되지 않음)

구글의 상용화된 머신러닝 시스템은 수 많은

과거의 경험에 기반하여, 수 많은 모델들을 가지고 실험하여 성장

현재 구글에는 약 4,000개의 상용화된 머신러닝 모델들이 존재한다�⇒ 과거의 성공/실패의 실험들을 통하여 지속적으로 발전하고 있음

68 of 213

실용적인 머신러닝에 대한 소개

: 머신러닝의 역사적 흐름과 알고리즘 - 현대의 뉴럴넷(6)

인공신경망은 많은 분야에서, 기존에 사용되어오던

접근방식의 성능을 훨씬 뛰어넘고 있다

(그 이유는..)

아주 많은 양의 데이터

가용한 컴퓨팅 자원

(CPU/GPU/TPU)

가용한 기반환경

(GCP/AWS/Azure등� 가용한 자원을 통합관리)

이런 백그라운드 환경 기반,

문제 해결을 하려는 노오력

GPU

TPU

TPU Pool

유니버설하게 최고인 머신러닝 모델이란 것은 없다.

다만, 모델들은 서로 다를 뿐이다.

69 of 213

실용적인 머신러닝에 대한 소개

: 머신러닝의 역사적 흐름과 알고리즘 - 현대의 뉴럴넷(7) / 동영상내 퀴즈

뉴럴넷(인공신경망) 퀴즈

딥 뉴럴넷을 만들때, 중요한것은 무엇인가?

수 많은 데이터

좋은 수준의 일반화

실험정신

위 세개 모두

70 of 213

실용적인 머신러닝에 대한 소개

: 머신러닝의 역사적 흐름과 알고리즘 - 현대의 뉴럴넷(7) / 동영상내 퀴즈(정답)

뉴럴넷(인공신경망) 퀴즈

딥 뉴럴넷을 만들때, 중요한것은 무엇인가?

수 많은 데이터

좋은 수준의 일반화

실험정신

위 세개 모두

딥 뉴럴넷은, 상당히 고차원적인 특징을 학습한다.�⇒ 학습이 한순간에 이뤄지는 것이 아니다.�⇒ 조금씩 조금씩... 최적화를 해 나가야 하는데, � 그러기 위해서는 수 많은 데이터가 있어야 한다.

수 많은 데이터가 필요하다고 하였는데, �데이터가 많으면 많을수록… 현재 학습 데이터에 대해서만�너무 치우친 학습이 이뤄질 가능성이 농후해진다.�

⇒ 응용 능력이 상당히 떨어지게됨 (일반화 이슈)

⇒ 랜덤하게 계층에 포함된 일부 뉴런들의 스위치를 내려서,� 일부러 학습이 덜 되도록 유도하는 Dropout 기법�⇒ 일부러 데이터에 노이즈를 삽입하는 기법�등등의 해결방법들이 고안되고 있음

71 of 213

실용적인 머신러닝에 대한 소개

: 퀴즈

지도학습과 비지도학습 모델의 주요 다른점은?

참/거짓 문제 - �디시전 트리는 비지니스 사용자들에게 시각적으로 흥미롭기 때문에, 항상 좋은 모델이다

레이블링된, 그리고 불연속적인 데이터가 있을때 우선적으로 시도해볼 모델을 선택하시오

선형 회귀

분류

둘 다 아님

둘 다 가능

비지도학습은 더 많은 레이블링된 데이터가 필요하다. 왜냐하면, 학습동안

모델에 대한 제어가 더 안되기 때문이다

비지도학습 모델은 정확한 모델링을 위해서, 지도학습에 비해 더 적은 데이터가 필요하다.

지도학습 모델은 비지도학습보다 예측을 더 잘한다. 왜냐하면 레이블이 있기 때문이다

지도학습 모델은 알려진 레이블에 기반하여 예측을 한다. 반면에, 비지도학습 모델은

데이터셋에서 패턴을 발견하는 것으로 간주된다.

72 of 213

목차

강의 및 퀵랩에 대한 소개

실용적인 머신러닝에 대한 소개

  • 지도학습
  • 머신러닝의 역사적 흐름과 알고리즘
  • 퀴즈

최적화에 대한 소개

  • 머신러닝 모델 정의
  • 손실함수, 경사하강
  • TensorFlow 플레이 그라운드
  • 성능 지표 (메트릭)
  • 퀴즈

일반화와 샘플링

  • 머신러닝 모델과 일반화
  • 언제 모델의 학습을 멈춰야 하는지
  • BiqQuery를 이용한 반복적인 샘플생성
  • 퀵랩1
  • 퀵랩2
  • 퀴즈

73 of 213

최적화에 대한 소개

: 개요 / 머신러닝 모델 정의(1)

머신러닝 모델 정의 (Defining ML Models) 섹션에서 다루는 주제는 아래와 같다.

  • 머신러닝 모델을 정의하는 방법�
  • 손실 함수에 대한 소개�
  • 경사하강을 수행하는 방법�
  • TensorFlow 플레이 그라운드(놀이터) 활용 방법�
  • 성능 지표를 사용하는 방법 (Metric)

74 of 213

최적화에 대한 소개

: 머신러닝 모델 정의(2)

파라메터Parameter�⇒ 모델의 학습이 진행되는 과정에서, 학습한 내용을 저장하는 변수이다�⇒ 사람과 똑같이 생각해볼 수 있다. � 학습의 진행에 따라서, 점점더 배운것을 잘 기억할 수 있게 된다. (계속 값이 업데이트됨)� (하지만, 항상 더 많은 학습이 더 좋은것은 아니다. 과적합 문제 발생)

하이퍼 파라메터Hyper-Parameter�⇒ 모델의 학습을 시작하기전, 설정해 주는 고정된 값�⇒ 얼마나 학습을 조밀하게 진행할 것인가? (학습률) / 인공신경망 계층마다의 뉴런의 갯수는 몇개? � 인공신경망의 계층의 수는 몇개? / 한번에 몇개의 데이터를 학습시킬 것인가? (배치 사이즈) / 등등

파라메터

하이퍼 파라메터

모델이 학습되면서

바뀌는 값들

모델을 학습시키기 전에 설정되는 값들

머신러닝

모델

머신러닝 모델은 수학적인 함수를 의미하고,�

이 모델의 구성요소“파라메터”와 “하이퍼-파라메터”가 있다

75 of 213

최적화에 대한 소개

: 머신러닝 모델 정의(3)

출력

bias

입력

가중치

선형 모델에는 두 종류의 파라메터가 있다: bias 와 weight(가중치)

좌측 그래프2차원 평면에서 직선(y=b+xm) 모델을 보여준다.

⇒ 레이블 데이터를 학습하면서, m과 b에 대한 값이 조정된다.

⇒ 이 그래프는 하나의 x, 하나의 m만이 연관되어 있다.

우측 그래프는 왼쪽 그래프 모델의 일반화된 모습을 보여준다

⇒ X는 2개, w도 2개로 학습되어야할 파라메터가 3개이다�⇒ 3차원 공간에서의 평면을 그리는 모델로, 2차원의 직선을� 일반화하였다. 3차원보다 고차원은 하이퍼플레인이란 용어를 사용

어떻게 모델이 데이터를 분류하게 되는가?

일단, 데이터를 어떻게 분류할지를 결정해야 하는데, 가장 심플한 케이스는 �두 종류로 분류를 하는 “바이너리 분류”Binary Classification 이다.

두 종류의 데이터를 잘 나눌 수 있는 선 == 분류를 잘하는 좋은 모델이다.

⇒ 이 선은 보통 “결정 경계선”Decision Boundary 이라고 한다�⇒ 선을 그리는 요소는 기울기(m)와 y절편(b) 으로, 이 값이 적절히 조정되어야 함을 의미한다

이때 모델은 학습당시의 데이터를 잘 설명하기보다

학습때 보지 못한 데이터까지 수용할 수 있는 포괄적인 선이 그어지는 것이 중요하다

모델의 일반화정도가 좋음

76 of 213

최적화에 대한 소개

: 출생률에 대한 데이터셋의 소개(1)

문제의 정의: 모든 영아들이

필요한 의료 케어를 받을 수는 없다

완벽히 제어되는 세상에서라면,

모든 신생아/영아들은 건강상태에 따라서, 적절한 의료 케어를 받을 수 있을 것이다.

하지만, 신생아/영아들이 태어난 직후, 의료진의 부족 및 대처 시간 소요등 어려운 점이 많다.

따라서, 태어나기전 건강 상태를 미리 파악이 가능하다면, 적절한 조치가 수월하게 이뤄질 것이다.

문제는 애기들이 산모 뱃속에 있을때, 미리 태어난 후에 대한 건강상태를 예측하는 것은 어려운 숙제이다

어떻게 아기들의 건강상태를

태어나기 전에 예측할 수 있을까?

모델에 사용될법한 Feature로는 어떤것이 있을까?

산모의 나이

아기의 몸무게

무엇을 레이블로 사용할 것인가?

머신러닝으로 해당 문제에 접근하기로 마음을 정했다면,

Feature 및 레이블에 대한 브레인스토밍을 해볼 수 있을 것이다

⇒ 뭐가 맞고, 아니고란 것은 없음

다만, 특정문제의 해결은

특정분야에 대한 지식이 필요하다

출생 시기 (아직 태어나지 않은 아이가 대상이므로 사용불가)

77 of 213

최적화에 대한 소개

: 출생률(natality)에 대한 데이터셋의 소개(2)

아기의 몸무게를 레이블로 사용한다면, 어떤 종류의 머신러닝 문제라고 볼 수 있을까?

힌트] 아기의 몸무게는 연속적인 값으로 이뤄져 있을 것이다

⇒ 값의 연속성이 있는 문제는, 우선 회귀문제로써 접근해 볼 수 있을 것이다.

아래 그래프는 아기의 몸무게와 산모의 나이의 상관관계를 보여준다

⇒ 설명의 간소화를 위해서, Feature를 하나만 선택하였음 (산모의 나이)

좌측 그래프의 데이터는 US 정부가 수집한 것으로, “출생률 데이터셋” 으로써,�빅쿼리Big Query 플랫폼에서는 이 데이터셋을 개방하여 제공한다.

머신러닝 모델을 만들기위한 일반적인 첫번째 단계는 데이터 그 자체를 분석해 보는 것이다.Data Analysis

⇒ 데이터의 분석으로, 데이터 사이의 연관관계 등, 어떤 인사이트를 얻을 수 있게된다.

좌측 그래프는 스캐터 플롯Scatter Plot 이라는 종류의 그래프인데, 아래와 같은 특징을 가진다�⇒ 보통, 전체 데이터셋의 일부를 샘플링해서 좌표평면에 도포한다. �⇒ 그 이유는, 1. 전체 데이터셋이 너무 큰 경우, 도포하는데 너무 많은 컴퓨팅 자원이 필요함� 2. 만약 도포했다고 하더라도, 현실적으로 모든 점들을 알아볼 수가 없음

산모의 나이

아기의 몸무게 (파운드)

78 of 213

최적화에 대한 소개

: 출생률(natality)에 대한 데이터셋의 소개(3)

좌측 그래프아기의 몸무게와 산모의 나이의 상관관계를 보여준다.

스캐터 플롯의 경우 데이터 하나하나를 모두 좌표평면에 뿌려주는것 대비

좌측의 그래프는 데이터를 백분율단위로 그룹화하여 보여준다.

사용된 데이터의 크기는 약 22GB 이지만, �좌측 그래프를 그리는데 소요된 시간은 1분 미만이 소요되었다고 한다.

⇒ 나중에 어떻게 이런 그래프를 그리는지도 다뤄질 것임

산모의 나이와 아기의 몸무게간의 어떤 연관성을 발견했는가?

산모 나이가 약 30정도일때, 아기의 몸무게가 최대치가 되는 경향이 있다

반면, 30을 기준으로 젊거나/늙은 경우, 아기의 몸무게가 줄어드는 경향도 있다�⇒ 이러한 패턴은, 비선형적인 관계가 있음을 알 수 있게 해 준다.�⇒ 스캐터 플롯으로는 알기 어려웠던 사실임

비선형적인 관계의 데이터에 선형적인 모델을 적용한다면 “편향 또는 희소적합”Underfitting 이 발생하게 된다.

⇒ 왜 지금당장 더 복잡한 모델을 사용하지 않느냐? 라고 질문할 수 있겠지만, � 강사왈, 희소적합/과적합의 개념 및 모델의 선정 방법론을 추후 효과적으로 설명하기 위해서, � 우선은 선형모델을 사용해 보겠다고 함

산모의 나이

아기의 몸무게 (파운드)

79 of 213

최적화에 대한 소개

: 출생률(natality)에 대한 데이터셋의 소개(4)

직선의 기울기는 w가 결정한다

x는 Feature로 (산모의 나이) 임

w는 x에 대한 가중치임

스캐터 플롯으로 돌아가서, 산모 나이와 아기의 몸무게는 �미세하게 서로 증가하는 관계가 있어보인다.

일단 무작정 파란색 선을 그어봤다고 가정해 보자.

⇒ 그러면, 이 선이 제일 좋은 것인지는 어떻게 알 수 있나?

또 다른 빨간색 선을 그어본다. 그리고 또 다른 선을 그어본다…(반복)

⇒ 전통적인 통계학에서, 이런 선들 중 최고의 선을 구하는 기법을� 최소평방회귀Least Squared Regression 분석이라는 것이 있다�

⇒ 이는 “분석적"인 방법으로 최고의 가중치를 찾아내는 것이다

최소평방회귀의 문제점은 특정 크기의 데이터셋에 대해서만 잘 동작한다는 것이다.

현실적인 입장에서 엄청나게 큰 데이터셋을 다뤄야 하는경우, �분석학적인 방법으로 최고의 모델을 찾아내는것은 비현실적이다.

⇒ 대신에, 경사하강법 이라는 것을 사용하게 된다

산모의 나이

아기의 몸무게 (파운드)

80 of 213

최적화에 대한 소개

: 출생률(natality)에 대한 데이터셋의 소개(5)

경사 하강법Gradient Descent 이란, 좌측 그래프와 같은 파라메터들의 공간에서�최고/최적의 파라메터 값의 조합을 찾아나가는 기법이다

선형모델의 파라메터는 두 개로, 기울기(가중치Weight)와 bias가 존재한다.

⇒ 두 파라메터의 값이 될 수 있는 수 많은 값의 조합들 중에서, � 최고/최적의 성능 결과를 낼 수 있는 조합을 찾아야 하는 것이다

한 파라메터 값의 조합을 다른 조합과 비교하기 위해서는,�두 조합을 비교 및 측정하기 위한 어떤 수단이 필요할 것이다.

⇒ 이때 사용되는 측정 수단으로 손실함수Loss Function 이라는 것이 사용된다

파라메터 #1 (weight)

파라메터 #2 (bias)

81 of 213

최적화에 대한 소개

: 손실 함수에 대한 소개(1) / 손실(에러)란?

에러 = 실제값(레이블) - 모델에의해 예측된 값

일단, 각각의 데이터에 대한

에러는 이해가 될 것이다.

그런데, 이들 모두를 함께 고려할 수 있을까?

(더해보는건 어떨까?)

산모의 나이

아기의 몸무게 (파운드)

모델

에러

가장 손쉬운 방법이긴 하지만.. 양수/음수가 서로의 크기를 줄여버린다

레이블

82 of 213

최적화에 대한 소개

: 손실 함수에 대한 소개(2) / 모든 에러를 함께 고려하기

이를 위한 한 가지 손실함수로, Root Mean Squared Error (RMSE)라는 것이 있음

: RMSE 값이 클 수록, 예측의 퀄리티가 떨어진다

1. 학습 데이터 � 샘플들에 대한 � 에러를 구한다

2. 에러 값들 각각의 � 제곱된 값을 구한다

3. 제곱된 에러값들의 평균을 구한다

4. 그 평균값에 루트를 씌운다

예측된 값

레이블 값

제곱을 하여, 음수를 제거한다

RMSE 에서, R만 빼버린 �MSE 라는 손실 함수도 있다.�⇒ R은 루트Root 를 의미함

RMSE와 MSE의 다른점은 �단계 4에서 루트적용의 유무이다

레이블의 값이�사람의 이해가 쉬운 값 이라면,

이 값을 제곱 하게 되면, 그 값의�특성을 이해하기가 어려워질 것이다

예] 달러/몸무게/키 등..

이때, MSE 대신 RMSE를 사용하면, �이해하기 쉬운 형태로 바뀌게될 것이다�(제곱된 값에 루트 적용)

83 of 213

최적화에 대한 소개

: 손실 함수에 대한 소개(3) / 손실함수로 모델 비교

더 낮은 RMSE값은 더 좋은 성능의 모델을 의미한다

산모의 나이

아기의 몸무게 (파운드)

산모의 나이

아기의 몸무게 (파운드)

오른쪽보다 더 나은 파라메터

손실의 함수의 값을 비교하여, 어느 모델이 더 좋고 나쁨은 알 수 있게 되었다.�그렇다면 weight와 bias에 대한 최고/최적의 값은 어떻게 검색해야 할것인가?�⇒ 무작위로 하나하나 모든 선을 긋고 비교해보는 것도 좋지만(?), � 훨씬 효율적으로 이를 수행하는 optimizer라는 것이 존재한다

84 of 213

최적화에 대한 소개

: 손실 함수에 대한 소개(4) / 바이너분류에 대한 손실함수

범주형 데이터(예] 성별) 같은 경우, 일반적으로 레이블에는 이산적인 정수 값이 할당된다.�예] 성별: 남자 0, 여자 1�

그렇다는 것은 모델이 예측하는 값도 그 범주 내에 속해야 한다는 뜻이다

예] 모델의 예측 범위 0 ~ 1

모델의 예측

손실(에러)

RMSE, 레이블 값=0

RMSE, 레이블 값=1

선형적인 근사치

레이블이 1인 경우, 예측은 0 (완전한 헛다리)

레이블이 0인 경우, 예측은 1 (완전한 헛다리)

약 3배 차이

RMSE는 회귀문제에 대해서는 잘 동작하지만, �분류문제에 대해서는 잘 동작하지 못한다.

왜 그런가?

예측 결과가 나쁘면 나쁠 수록, 그에대한 패널티(에러)가 더 높게 � 부과되어야 하는데, RMSE를 바이너리 분류문제에 사용하면� 패널티에 큰 차이가 생기지 않는다.

따라서, 분류 문제를 위한 새로운 손실함수가 필요하다

85 of 213

최적화에 대한 소개

: 손실 함수에 대한 소개(5) / 바이너리 분류에 대한 손실함수

앞서 제기된 RMSE의 분류문제 적용에 대한 문제를 해결하기 위하여

Cross Entropy 손실 함수 (또는 로그손실) 라는 것이 사용된다�⇒ 앞서 분류 몇번 언급된 적이 있음

RMSE와 비슷하게 생겼지만, 레이블과 예측의 결과가 엇나갈 수록 �비례하여 더 큰 손실값 (패널티)가 부여되도록 디자인된 함수이다

분류를 잘 한 경우 = 0.13

손실값이 낮다

사람아닌 것을 잘못 분류한 경우 = 0.42

둘 중 하나만 잘못 분류했는데도 3배 이상 손실값이 올라감

86 of 213

최적화에 대한 소개

: 손실 함수에 대한 소개(6) / 바이너리 분류에 대한 손실함수

레이블이 1일때 살아남는 부분 (그래서 positive)

레이블이 1일때, 예측된 값에 대한 로그

레이블이 0일때 살아남는 부분 (그래서 negative)

레이블이 0일때, (1 - 예측된 값)에 대한 로그

87 of 213

최적화에 대한 소개

: 경사하강법(1)

손실함수를 이용하면, 파라메터들의 조합으로 이뤄진 손실값의 공간에서 �한 파라메터 조합을 다른 조합과 비교하고, 그 차이를 수치화 할 수 있었다.

조합간 비교를 한 후, 이전 파라메터 조합보다 현재의 조합에 대한 손실이 더 적다면

현재의 파라메터 조합이 가리키는 방향으로 뻗어나갈 필요가 있을 것이다.

그런데, 어떻게? 얼마나?방향으로 뻗어나갈 것인지에 대한 방법이 필요하다.

그 방법이 최적화Optimization 기법으로, 이를 실현하는 방법중 하나로 “경사 하강법”Gradient Descent 이 있다.

좌/우측 그래프는 파라메터 조합에 대한�손실값의 공간을 보여준다

좌측 처럼모든 파라메터들의 조합을

우리가 알고 있다는 것을 전제로 그려진 것이다.

하지만, 당연히? 모든 조합을 알 수는 없다.

우측 처럼 일부만을 알고 있는것이 보통이다.

88 of 213

최적화에 대한 소개

: 경사하강법(2)

손실값의 공간에서, 우리가 원하는 목표는 바로

“최소 손실값”이 있는 지점에 도달하는 것이다.

그러기 위해서는 오른쪽 그림과 같이

방향보폭(거리)Step Size라는 두 정보가 필요하다.

어느 방향으로 가야하나?

얼마나 멀리 가야하나?

문제의 이해를 쉽게 하기 위해서, 두번째 요소인 보폭은 고정된 크기로 정해둔다

손실값이 “매우 작은 값”Epsilon 보다만 크면, 방향을 계산한다.

그리곤, 모든 파라메터값을 그 방향으로약간의 보폭step size 만큼 움직여진 값으로 업데이트 한다.

다음으로는, 움직여진 다음 위치에서 손실값을 다시 측정한다

89 of 213

최적화에 대한 소개

: 경사하강법(3)

손실값의 공간은 “등고선”과 비슷하다고 생각하면 편하다.�

각 등고선들이 의미하는 것은 특정 크기의 “깊이” 이다.

또한, 각 선들이 가까우면 가까울수록, 경사가 가파르다는 것을 의미한다.

학습이 시작되기전, 선택된 파라메터값에 대한 손실 지점

⇒ 가장 높은 손실값이 있는 지점 중 한 곳이다

학습이 종료된 시점의 업데이트된 파라메터값에 대한 손실 지점

⇒ 동시에, 손실값에 대한 공간의 최소값이 위치한 지점 이기도 하다

⇒ 학습이 종료되는 시점이 된다

경사하강법에 의해 이동되는 구간

90 of 213

최적화에 대한 소개

: 경사하강법(4)

고정된 보폭의 크기였기 때문에, �각 점들 사이의 거리는 일정함을 알 수 있다

만약 보폭의 크기가 아주 작으면 어떤가?

⇒ 최소지점까지 가는데 무한대의 시간이 걸릴것이다

만약 보폭의 크기가 아주 크다면 어떤가?

⇒ 최소지점 부근까지 도달했음에도 불구하고,� 다음 스텝에서, 최소지점을 건너뛴 반대편으로 가게된다

손실(에러)

가중치 weight

시작지점

작은 학습률은

시간이 오래걸림

시작지점

최소지점을

완전히 벗어나 버림

91 of 213

최적화에 대한 소개

: 경사하강법(5)

보폭을 고정된 크기로 고르는 것은 어려운 일이다. �

왼쪽 그래프에서 퍼펙트하게 동작하는 보폭의 크기가 �오른쪽 그래프 입장에서는 큰 값이기 때문에, 최저지점의 검색을 실패한다.

유니버설하게 들어맞는 유일한 보폭의 크기란 없다.

92 of 213

최적화에 대한 소개

: 경사하강법(6)

방향과 크기는 어떻게 결정될 수 있는가?

⇒ 현재의 손실값 지점을 미분해 보면, 기울기 값을 구할 수 있다.

기울기 값은 두 가지 정보를 포함하는데, 가파른 정도와 방향이다.

A 지점의 기울기는 음수

가파른 정도는 5 이다

⇒ 오른쪽 방향으로 크게 점프

손실 함수에 의해

계산된 w에 대한 손실값 공간

손실함수에 대한 기울기 공간

(미분)

B 지점의 기울기는 양수

가파른 정도는 5

⇒ 왼쪽 방향으로 크게 점프

C 지점의 기울기는 양수

가파른 정도는 2

⇒ 왼쪽 방향으로 조금만 점프

93 of 213

최적화에 대한 소개

: 경사하강법(7)

전) 방향만 구한 후, 고정된 � 크기만큼의 보폭 크기

현) 방향과 보폭의 크기를

미분을 구하는 함수로 얻음

현재 위치에서, 손실함수를 미분하여 기울기를 구하면,�나아가야할 방향 + 보폭의 크기를 얻을 수 있다.

최저 지점까지 매 순간 다른 정도의 점프를 한다

94 of 213

최적화에 대한 소개

: 손실 곡선에 대하여(1)

일반적인 손실 곡선 그래프

경사하강 기법을 사용하여 손실의 최저점을 찾아나가게 된다.

초기에는 손실이 클 수밖에 없기 때문에, �그 지점의 손실값에 대한 기울기도 클 수 밖에 없다

⇒ 따라서, 최소지점을 향해서 큰 보폭의 크기 만큼 이동한다� (큼직하게 손실이 줄어든다)

하지만, 어느정도 학습이 진행이 된 상태라면 최소 손실의 지점에 �가까워져 있을 것이기 때문에, 큼직하게 이동 하면 곤란할 수 있다.�⇒ 따라서, 최소지점을 향해서 적은 보폭의 크기 만큼 이동한다� (아주 천천히 손실이 줄어든다)

손실값이 크게 떨어진다

(큼직하게 점프)

점점 최소지점에 가까워지면서

작은 점프를 여러번 수행

95 of 213

최적화에 대한 소개

: 손실 곡선에 대하여(2)

학습이 진행되면서 손실값이 상단 그래프 처럼 �왔다갔다 변하는 경우가 발생할 수 있다.

⇒ 보폭의 크기가 너무 큰 것을 이유로 생각해 볼 수 있다.

(최소지점 부근을 갔다가 다시 튕겨져 올라왔다가를 반복)

학습이 진행되면서 손실값이 하단의 그래프 처럼 �손실값이 미세하게 점점 작아질 수 있다.

⇒ 보폭의 크기가 너무 작다고 생각해 볼 수 있다.

(미세하게 조금씩 손실값이 줄어듬)

96 of 213

최적화에 대한 소개

: 손실 곡선에 대하여(3)

학습률Learning Rate 이라는 하이퍼-파라메터를 사용하면,

경사도에 의해 업데이트 되는 파라메터들의 값들을 �스케일링 할 수 있다.

(일반적으로는 1보다 작은 숫자들이 사용된다)

�⇒ 기울기에 의해 구해진 보폭의 크기를 스케일링하는 것임

하이퍼-파라메터Hyper-Parameter는 학습전에 미리 정해주는 상수값이라고 했다.�⇒ 따라서, 학습률도 마찬가지로 미리 정해져야 하는 상수값이다.

그렇다면, 좋은 학습률이란 무엇일까?�⇒ 여러가지 종류의 값을 일일이 시도해서, 좋은값을 찾아내는 것이 일반적이다� (점점 좋다고 직감되는 값으로 범위를 좁혀나가는 것이 가능)�⇒ 하이퍼-파라메터를 튜닝하는 기법/라이브러리가 존재한다.� (여기선 다루지 않음, ML Engine을 비롯한 오픈소스 프로젝트들이 존재한다)

97 of 213

최적화에 대한 소개

: 머신러닝 모델의 위험요소(1)

문제점: 학습을 다시 수행할 때마다, 모델의 일관성이 유지되지 않는다.

하나의 글로벌 최소지점만이 존재하는 손실 표면

하나 이상의 최소에 근사한 지점이 존재하는 손실 표면

현실세계의 문제에서는 우측 손실 표면을 거의 항상 마주하게 된다

왜 하나 이상의 저점들이 존재하는가?

⇒ 파라메터들의 조합들 중 어느정도 비슷한 수준의 모델 성능을 보여줄 수 있는것들이 여러개 존재할 수 있다

보통 하나의 글로벌한 최저지점이 존재하고, 여러개의 지역적인 최저 지점들이 군데군데 있을 수 있다

따라서, 모델을 학습시킬때 마다 항상

완전히 동일한 결과가 재생산 되기가 어렵다.

98 of 213

최적화에 대한 소개

: 머신러닝 모델의 위험요소(2)

문제점: 모델의 학습이

여전히 너무 느리다

미분의 계산

한단계

경사하강

손실 측정

학습종료

학습 Loop

데이터의 수

모델 파라메터의 수

모델 학습은 크게 세 단계로 구성될 수 있다.

  • 미분(경사도) 계산
  • 계산된 미분을 기반으로, 한단계 경사하강을 수행
  • 새로 이동된 지점에서의 손실 측정

원하는 손실지점까지 도달했다면, 학습을 종료한다

그렇지 않다면, 다시 1번 단계로 돌아가서 반복한다.

학습의 시간에 관여하는 것은 크게

  • 학습 데이터의 양
  • 모델을 구성하는 파라메터의 수

즉, 학습을 빠르게 수행하기 위해선 위 두 가지 요소에 대해

  • 전체 데이터 중 일부(샘플)만 사용하거나
  • 모델의 파라메터 수를 줄인다거나

같은 방법을 시도해 봐야 할까?

아쉽지만, 두 가지 모두 권장되지 않는다.

모델 파라메터의 개수

데이터의 개수

모델 파라메터의 개수

모델 파라메터의 개수

데이터의 개수

측정 빈도

99 of 213

최적화에 대한 소개

: 머신러닝 모델의 위험요소(3)

그러면, 무엇을 해야 학습 시간을 줄일 수 있을까?

두 가지 방법이 학습 시간을 줄여줄 수 있다.

  • 한번에 모델이 학습할 대상을 전체 데이터셋 (X), �대신에, 그 중 일부만을 대상으로 한다 (O)�⇒ 전체를 부분들로 쪼개서, 한번에 하나씩� ⇒ 마지막 부분까지 학습하면, 전체 데이터셋을 학습한 것이다 �
  • 손실을 측정하는 빈도를 줄여보자

각각에 대한 좀 더 자세한 설명은 다음장에 있다

문제점: 모델의 학습이

여전히 너무 느리다

미분의 계산

한단계

경사하강

손실 측정

학습종료

학습 Loop

100 of 213

최적화에 대한 소개

: 머신러닝 모델의 위험요소(4)

1. 모델이 한번에 학습할 대상을 전체 데이터셋의 일부분으로 하자�

  • 결국 전체 데이터가 학습에 사용되지만,�한번에 학습되는 데이터의 크기를 조절한다�
  • 배치크기(한번에 학습되는 크기)는 또 다른 하이퍼-파라메터이다

학습 단계의 질

비용

매 단계마다 전체 데이터셋을 몽땅

학습시키는 것은 매우 비용이 비싸다

“미니패치"는 질은 보존 하면서도 비용은 절감해준다

2. 손실이 측정되는 빈도를 줄여보도록 하자

  • 손실이 매 학습때마다 다시 측정되어야 한다
  • 비용이 많이 든다.
  • 따라서, 특정 시간마다 (주기적으로) 또는�학습의 단계 횟수 마다 손실을 측정 가능할 것이다

101 of 213

최적화에 대한 소개

: TensorFlow 플레이 그라운드(1)

가중치

(마우스로 값 확인 가능)

출력 결과]

전체 데이터 (점)�

배경색 (모델이 만들어낸 경계선)

입력 Feature

전체 데이터의 경계선을 긋기 위해 사용할 Feature 선택

리셋

학습(계속 Epoch)

학습(1 Epoch)

진행중인 Epoch의 횟수

1 Epoch ⇒ 전체 데이터셋을 모두 한번씩 학습에 이용

학습률 설정

오른쪽의 모델은

선형적인 모델을 보여줌

(y_hat = WX + b)

단순히 입력에 가중치를

곱해서, 출력을 뽑아냄

현재 선택된 x_1, x_2는 각각 수직/수평선이므로, 선형적인 특성만을 가짐

손실값과

그래프를 보여줌

102 of 213

최적화에 대한 소개

: TensorFlow 플레이 그라운드(2)

학습(1 Epoch) 버튼 클릭

손실값의 변화 확인

⇒ 학습할때마다, 결과는 항상 다름

1 Epoch 동안 학습된 결과 확인

⇒ 흐릿하게 경계선이 생김

가중치의 변화 확인

⇒ 값이 클수록,

선이 굵음

학습 버튼 클릭

손실값이 0.002 이하로 내려갈때 까지 진행 후, 멈춤 버튼 클릭

(학습 버튼이 토글됨)

약 50 Epoch 동안 학습된 결과 확인

⇒ 선명하게 경계선이 생김

⇒ 성공적으로 모델 학습이 되었음

103 of 213

최적화에 대한 소개

: TensorFlow 플레이 그라운드(3) / 동영상내 퀴즈 (1)

Lab: Introducing the TensorFlow Playground 동영상의 약 4:04 부터 시작됨�⇒ 새로운 플레이 그라운드 링크 오픈 (https://goo.gl/3pmeKj)

현재(초기)의 학습에 대한 손실은 얼마인가?

(초기) X1에 대한 가중치는 얼마인가?

학습률을 0.001로 조정후, 리셋버튼 클릭.

그리고, 약 200 Epoch 정도 학습을 수행한다.

학습에 대한 손실은 얼마인가?

학습률을 0.1로 조정후, 리셋버튼 클릭.그리고, 약 100 Epoch 정도 학습을 수행한다.

얼마나 빠르게 손실곡선이 하강 하는가?

손실 곡선은 0.0001 학습률때 보다, 느리게 하강한다

손실 곡선은 0.0001 학습률때 보다, 빠르게 하강한다

[1]

[2]

[3]

[4]

104 of 213

최적화에 대한 소개

: TensorFlow 플레이 그라운드(3) / 동영상내 퀴즈(2)

[5]

학습률을 10로 조정후, 리셋버튼 클릭.

그리고, 1번의 Epoch 동안 학습을 수행한다.

가중치에 대한 크기가 얼마인가? 100 Epoch 까지 추가 학습 진행

학습률이 증가함에 따라서, 가중치의 크기는 감소한다

학습률이 증가함에 따라서, 가중치의 크기도 증가한다

105 of 213

최적화에 대한 소개

: TensorFlow 플레이 그라운드(4)

매번 리셋하면서, 학습률을 조정한 후 학습을 해 본다.

{0.00001 | 0.001 | 0.1 | 10}

대충 아래 표와 비슷한 손실 그래프가 얻어짐을 알 수 있다. (완전히 일치할 수는 없음)

학습률이 증가함에 따라서, 손실이 0에 가까워지는 시기가 점점 앞당겨 짐을 알 수 있다

106 of 213

최적화에 대한 소개

: TensorFlow 플레이 그라운드(4) / 동영상내 퀴즈(3)

[6]

Weight1 컬럼에 대해서,

학습률이 증가할수록 가중치도 증가하는 양상을 보인다. 왜 그렇다고 생각하는가?

큰 학습률이 사용된 모델은 크게 점프(Step) 하기 때문

큰 학습률이 사용된 모델은 작게 점프(Step) 하기 때문

작은 학습률이 사용된 모델은 작게 점프(Step) 하기 때문

107 of 213

최적화에 대한 소개

: TensorFlow 플레이 그라운드 심화(1) / 동영상내 퀴즈(1)

https://goo.gl/ou9iMB 링크를 연다

500 Epoch 정도 학습을 수행한다

손실 그래프에 대해서 어떻게 생각하는가?

0에 가까워지는 순간을 목격할 수 있는가?

새로운 데이터셋에서 손실이 0으로 더 빠르게 수렴해간다

새로운 데이터셋에서 손실이 0으로 느리게 수렴해나가지만, 결국엔 0에 가까워진다

이 모델에 대해서는 손실에 0 근처에 가지도 못한다

108 of 213

최적화에 대한 소개

: TensorFlow 플레이 그라운드 심화(2) / 동영상내 퀴즈(2)

대충 오른쪽 화면과 비슷한 상황을 겪게 될 것이다.

⇒ 손실이 0.5 부근에서 더이상 낮아지지 않는다.

이는 선형적인 모델의 한계라고 볼 수 있다�⇒ 데이터는 둥글게 퍼져 있는데, � 직선 두개로 경계선을 만들려고 하다보니 힘에 부치는 것

결정 경계선이 두 범주를 나누는데 있어서 꽤나 애처로울 정도로 임무 수행을 못했다.

왜 그럴것이라고 생각하는가?

데이터가 비선형적인 관계를 가지고 있기 때문에

이 데이터는 어떤 모델도 제대로 학습할 수가 없는 것임

데이터 자체에 문제가 있음

109 of 213

최적화에 대한 소개

: TensorFlow 플레이 그라운드 심화(3)

다시 플레이 그라운드 화면으로 돌아가서

입력 Feature의 조합을 바꿔가면서, 리셋하고 다시 학습 시키고를 반복해 보자.

X1, X2 Feature로 해결하지 못했던, 데이터를

잘 분류해내는 조합이 있다.

그 조합이 무엇인지 확인해 보자.

110 of 213

최적화에 대한 소개

: TensorFlow 플레이 그라운드 심화(4)

X1^2, X2^2 의 조합이 분류할 수 있음을 알 수 있다.

모델 자체는 아직도 선형적인 모델인데, 어떻게 �학습이 이뤄질 수 있었을까?

입력 데이터 자체를 가공하여 모델에 던져주었다.

⇒ 2차 함수가 그리는 패인 곡선 두개(수직/수평)이 모여서� 원 형태로 데이터를 분류할 수 있게 되었음

111 of 213

최적화에 대한 소개

: TensorFlow 플레이 그라운드 심화(5)

https://goo.gl/1v28Pd 링크를 연다

왼쪽과 같은 데이터셋이 준비되어 있을 것이다.

앞서 터득한(?) 개념으로, �새로운 데이터셋을 분류 할 수 있는지를 실험해 보자.

아마도 어려울 것이다.

나선형 그래프를 그리는 함수를 입력 Feature로 활용하면 될 지도..�⇒ 이렇게 새로운 Feature들을 만들어 내는 것을 Feature 엔지니어링 이라고함

⇒ 근데, 그런 함수가 있는지도 모르겠고, 일단은 플레이그라운드엔 없음

Feature 엔지니어링에 쏟아붓는 시간이 상당히 오래 걸린다.

⇒ 하지만, 과거에는 Feature 엔지니어링에 많이 매달렸다� (모델로 핸들리이 어려운 차원의 문제, 그리고 학습 시간등의 문제 때문에)

⇒ 다행히도? 최근의 “딥 뉴럴넷" 이라는 모델은 엄청나게 복잡한 모델링이 가능하다� + 계산 가능한 알고리즘 + 계산에 필요한 우수한 컴퓨팅 자원도 있음

112 of 213

최적화에 대한 소개

: TensorFlow 플레이 그라운드 뉴럴넷(1)

https://goo.gl/VyoRWX 링크를 열어서, Feature는 건드리지 말고� 은닉계층과 계층마다의 뉴런을 추가해서 학습 수행

⇒ 일단, 원형 데이터셋이 잘 학습할 수 있는지 확인해 보자

은닉 계층을

추가하거나 삭제

각 은닉계층마다의

뉴런의 추가/삭제 버튼이 있음

113 of 213

최적화에 대한 소개

: TensorFlow 플레이 그라운드 뉴럴넷(2)

알다시피, 이 가중치라는 것은 기울기이다

⇒ 은닉계층의 4개 뉴런과 연결됨

⇒ 수직/수평선의 각각의 기울기가, 각 뉴런마다 별도로 존재함

⇒ 각 뉴런마다 두 선이 선형적으로 조합되어 새로운 선을 만들어냄

입력 Feature들은 은닉계층에 의해서 1차 가공된 값으로 변한다.

⇒ 1차 가공된 값들끼리 다시한번 조합을 한다

⇒ 뉴런의 수가 많으면 많을수록, 훨씬 더 많은 패턴을 학습할 수 있게 된다. (정말 엄청나게 다양한 기울기의 선들)

⇒ 단, 일부 뉴런들은 거의 동일한 패턴을 학습하는 경우도 존재함

보다시피, 다양한 기울기로 이뤄진 선들이 뭉치면

다각형 모양을 만들어낼 수 있게 된다.

입력 Feature가 선형이었기 때문에, 각진 도형이 되었다.

⇒ 은닉계층의 뉴런수가 많아질수록, � 각진 정도가 뭉게지게 될 것이다.

114 of 213

최적화에 대한 소개

: TensorFlow 플레이 그라운드 뉴럴넷(3)

http://goo.gl/hrXd9T 링크를 열어서, 은닉계층과 계층마다의 뉴런을 추가해서 학습 수행�⇒ 저는 몇번의 시도 후, 아래와 같은 결과를 얻었습니다.� (매번 학습의 결과는 바뀔 수 있음, 따라서 사람마다 결과가 다 다를 것임)

115 of 213

최적화에 대한 소개

: TensorFlow 플레이 그라운드 뉴럴넷(4)

앞서 실험해본 모델에서, 서로다른 배치크기를 실험해보자�{ 1 | 10 | 30 } �⇒ 아래의 테이블과 같은 형태로 손실이 줄어드는 것을 알 수 있다

배치크기란, 한번에 모델에게 학습을 시킬 전체 데이터셋의 일부 데이터셋이다.�⇒ 전체 데이터셋에서 몇개씩 뽑아내서, 뉴럴넷을 학습 시킬 것인가?�⇒ 부분 배치들이 모두 수행되어 전체 데이터셋을 한번 다 돌아야 1 epoch가 수행된 것이다

116 of 213

최적화에 대한 소개

: TensorFlow 플레이 그라운드 뉴럴넷(5)

학습을 진행하다보면, 손실값이 0의 수렴과는 차이가 많음에도 불구하고, 더이상 줄어들지 않는 경우가 발생한다.

파라메터 vs 손실값의 평면에서,�손실값들이 표현하는 등고선을 떠올려보자

수 많은 지역적 최저점 중 하나에 빠져서�헤어나오지 못하고 있는 상황일 수 있다. (유일한 글로벌 최저점이 목표인데…)

이런 문제를 해결하기 위한 많은 최적화 기법들이 존재한다. 가장 기본이 되는 것은 순수한 경사하강법인데,�“확률적 경사하강", “모멘텀", “Adadelta”, “Adam” 같은 발전된 기법들이 존재함�⇒ 있다는 것만 일단 알아두자.. (이번 스터디잼에서 더 다루지는 않음)

117 of 213

최적화에 대한 소개

: 성능지표(1)

부적절한 최소값

부적절한 최소값

Feature와 레이블간의 관계를 잘 반영하지 못함

일반화가 잘 되지 않음

주차장에서, 특정 자리가 비어 있는지를 예측하는 모델을 개발하고 싶다고 가정해보자

이때, 모든 주차 자리가 비어있거나, 주차가 되어있거나를 예측하려고 문제 해결 전략을 세운다면, 이는 부적절한 전략일 수 있을 것이다.��모두 주차되거나/비어있거나 처럼 한쪽으로만 치우친 데이터셋만이 존재한다면 상관 없을지도 모르나, 현실적으로 일부는 주차/일부는 비어 있을 것이다.�⇒ 학습당시에는 Nice! 할지 모르지만, 다른 데이터셋이 주어지면 폭망

또한, 이러한 전략으로는 Feature와 레이블간의 관계를 진정으로 이해하는 것이 불가능하다. (한쪽으로만 치우쳐져 있어서, 비어있다는 것에 대한 개념을 알기 어려움

118 of 213

최적화에 대한 소개

: 성능지표(2)

그렇다면, 비어 있는 주차자리를 분류하려면 어떻게 해야 할까?

완벽한 손실함수가 있다고 가정해보자.�⇒ 이 함수는 결국 잘못 분류된 (주차가 안되어 있는데, 되어 있다고 분류같은)� 케이스의 수를 최소화 하게 될 것이다.

손실함수는 우리가 어떤 문제를 풀어나가야 하는지를 설명해 주지는 않는다.

하나의 주차 자리가 비어있는지 주차가 되어 있는지를 판단하는 것은 기냐 아니냐(0/1)�이지만, 모든 주차 자리들 마다 예측하는 것은 여러개의 숫자(0/1)들의 나열이 될 것이다

이렇게 나열된 숫자들은 어떤 연속성이 없고, 단순히 개별적으로만 의미를 가진다.�그렇다는 것은, 이들에 대한 손실함수는 경사하강이 어려운 곡선을 그리게 될 것이다.

따라서, 손실함수 말고 모델을 평가하기 위한 또다른 지표가 필요하다.�⇒ 그 지표로, 성능지표라는 것을 배우게 될 것이다.

119 of 213

최적화에 대한 소개

: 성능지표(3)

손실 함수

성능 지표

학습 도중에 측정

학습이 끝난 후 측정

이해하기가 어려움

이해하기가 쉬움

비지니스 목적에

직접적으로 연결되지 않음

비지니스 목적에

직접적으로 연결되어 있음

손실함수란, 모델의 손실을 최적화 할때, 손실을 측정하는 함수다.�⇒ 학습을 진행하면서 지속적으로 측정이 된다.�⇒ RSME나 Cross Entropy 같은 값이 의미하는 바는 직관적으로 이해하기 어렵다�

성능지표는 중간중간/완전히 학습이 끝난 후, 모델을 평가하는 용도로 사용된다.�⇒ 이해가 쉽다. 예를 들어서, 정확도 같은 경우이다. (100개중 99개를 잘 분류했다 ⇒ 99%)

비지니스 목적은 정확도 같은 지표에 의해 대변되는 것이 더 직관적일 것이다

120 of 213

최적화에 대한 소개

: 성능지표(4) / 오차행렬

아래와 같은 표를 만든다. �⇒ 모델의 분류 성능을 평가할 수 있는 테이블로, 오차행렬이라고 불린다.

모델의 예측 입장에서, Positive라는 것은 원하는 범주를 잘 분류했다고 판단하는 것이다.�⇒ 예] 사진을 사람인지 아닌지 구분하는 모델� 실제 사진이 사람인데 사람이라고 예측(Pos), 실제 사람이 아닌데 모델은 맞다고 예측 (Pos)

모델의 예측

레이블

제대로 예측한 케이스

잘못 예측한 케이스

121 of 213

최적화에 대한 소개

: 성능지표(5) / 오차행렬

프리시전 = TP / (TP+FP)

리콜 = TP / (TP+FN)

모델의 예측

레이블

모델(O), 레이블(O)

TP

모델(O), 레이블(X)

FP

모델(O), 레이블(O)

TP

모델(X), 레이블(O)

TP

모델이 맞다고 예측한것 중에서�실제로 맞는것의 비율

실제로 맞는 데이터 중에서�실제로 모델이 맞다고 판단한 비율

122 of 213

최적화에 대한 소개

: 성능지표(6) / 오차행렬 / 동영상내 퀴즈(1)

어떤 요소의 값이 커지면, 프리시전이 줄어드는가?

주차장 문제를 생각해 보자. 10개의 주차공간이 비어 있을 때, 모델은 1개의 공간만이 비어 있다고 분류해냈다. 리콜은 얼마인가?

123 of 213

최적화에 대한 소개

: 성능지표(7)

아래와 같은 예제 데이터를 생각해보자�⇒ 왼쪽이 레이블(사람이 분류한것), 오른쪽이 모델이 분류한것

고양이를 분류하는것이 목적이다. (노란색 = 고양이, 회색 = 고양이 아님)

124 of 213

최적화에 대한 소개

: 성능지표(8)

전체 데이터셋이 8개로 구성되어 있는데, 이 중 모델이 3개만 잘 구분 했으므로�⇒ 정확도가 ⅜ ~ 0.375가 된다

125 of 213

최적화에 대한 소개

: 성능지표(9) / 동영상내 퀴즈(2)

프리시전은 얼마인가?

리콜은 얼마인가?

126 of 213

최적화에 대한 소개

: 성능지표(10)

프리시전, 리콜 모두를 함께 고려해서 성능을 평가하고 싶으면, F1 Score 라는 것도 존재한다.

⇒ 아래 수식을 확인

127 of 213

최적화에 대한 소개

: 퀴즈

RMSE와 MSE의 주요 다른 점은?

똑같은 결과를 도출한다

MSE의 출력은 직접적으로 해석 가능한 형태이다

RMSE의 출력은 직접적으로 해석 가능한 형태이다

MSE와 RMSE 모두 에러를 제곱하여 음수를 양수로 바꾸고, 루트를 씌운다

다음중 성능 지표가 아닌것은?

모델의 학습 Loop 에서, 일반적으로 수행되는 수순이 아닌것은?

정확도

리콜

크로스 엔트로피

프리시전

손실함수의 미분을 계산

손실 곡선을 하강

손실을 계산

학습률을 증가시킴

128 of 213

목차

강의 및 퀵랩에 대한 소개

실용적인 머신러닝에 대한 소개

  • 지도학습
  • 머신러닝의 역사적 흐름과 알고리즘
  • 퀴즈

최적화에 대한 소개

  • 머신러닝 모델 정의
  • 손실함수, 경사하강
  • TensorFlow 플레이 그라운드
  • 성능 지표 (메트릭)
  • 퀴즈

일반화와 샘플링

  • 머신러닝 모델과 일반화
  • 언제 모델의 학습을 멈춰야 하는지
  • BiqQuery를 이용한 반복적인 샘플생성
  • 퀵랩1
  • 퀵랩2
  • 퀴즈

129 of 213

일반화와 샘플링

: 개요

일반화와 샘플링(Generalization and Sampling)에서 다루는 주제는 다음과 같다

  • 모델이 과적합 되는지를 평가하는것�
  • 언제 모델의 학습을 중단해야 하는지 판단하는것�
  • 반복적인 학습/검증/테스트 데이터셋을 생성하는것�
  • 성능 벤치마크를 수립하는것

130 of 213

일반화와 샘플링

: 머신러닝 모델과 일반화(1) / 동영상내 퀴즈(1)

왼쪽의 그래프는 앞서 소개된 “출생률" 데이터셋의 일부를 사용한 것이다.

두 데이터는 꽤나 명확한 연관성을 가지고 있어 보인다.

퀴즈1) What model would you typically want to call on first for this dataset? � [이 데이터들을 보면 어떤 모델을 우선적으로 사용해봐야 하는가?]

  1. Cross Entropy [크로스 엔트로피]
  2. Linear Regression [선형 회귀]
  3. Classification [분류]

산모의 몸무게 증가에 기반,

임신의 기간을 예측

산모의 몸무게 증가

임신의 기간

131 of 213

일반화와 샘플링

: 머신러닝 모델과 일반화(2)

정답은 “선형회귀" 모델을 시도해봐야 한다는 것이다.�복습]

회귀 문제에서, 사용되는 손실함수로는 다음 두가지가 있다.� - MSE (Mean Squared Error)� - RMSE (Root Mean Squared Error)

이 두가지 손실함수는 모델과, 데이터간의 거리를 측정한다. 이 거리를 “손실/에러" 라고 한다�제곱(Square)은 음수값들을 제거하기 위해 필요하다. �⇒ 거리가 + 또는 - 인것들이 섞여 있으면, 이들을 더할때 그 특성이 사라지게 된다

RMSE와 MSE는 루트가 씌워지는지의 여부만 제외하면 동일하다.�왜 루트가 필요한가?�⇒ 제곱을 하는 순간, 값들의 해석이 어려워진다. (예를 들어서, 몸무게/화폐단위/거리등)�⇒ 제곱값을 다시 루트를 씌움으로써, 원래의 성질로 돌아가서 해석이 용이해짐

132 of 213

일반화와 샘플링

: 머신러닝 모델과 일반화(3)

모델1: 선형 회귀를 사용한

선형 모델

산모의 몸무게 증가

임신의 기간

빨간색: 학습 Example�파란색: 각 산모들에 대한 모델의 예측 가이드라인

모델1은 보다시피, 2차원 공간에서 직선을 그리는 함수이다. (선형성)

또한, RMSE의 값이 2.224 정도이다.

손실이 0과는 거리가 멀지만, 퍼져있는 데이터 점들을 일반화 하기에는�적당하다고 판단된다.

다음장에서, 만약 손실이 0이 되는 경우는 어떤지 살펴보도록 하자

133 of 213

일반화와 샘플링

: 머신러닝 모델과 일반화(4)

보다시피 RMSE가 0이다.

왜 그런가?�⇒ 모델이 모든 점들을 몽땅 이어버리기 때문에,� 모델과 점들간의 거리가 0이 되어 버렸다.

이렇게 많은 굴곡을 만들어서, 수 많은 데이터를 완벽하게�학습하는데는 그만큼 많은, 학습 가능한 파라메터들이 모델에 존재해야 한다.

그런데, 과연 손실이 0에 도달한�이 모델이 좋은 모델이라고 할 수 있을까?

모델2: 학습 가능한

파라메터가 더 많음

산모의 몸무게 증가

임신의 기간

134 of 213

일반화와 샘플링

: 머신러닝 모델과 일반화(5)

모델1과 모델2를 전혀 새로운 데이터셋에 대해서 얼마나 손실이 발생하는지를 확인해 보자.�(전혀 새로운 = 모델이 학습할때 접해보지 못한)

모델1의 경우, �이전 데이터셋에서의 손실과의 차이가�2.224 ⇒ 2.198 로 미비하다. �큰 차이가 없기 때문에, 괜찮다고 판단 가능하다

모델2의 경우, �이전 데이터셋에서의 손실과의 차이가�0 ⇒ 3.2 로 엄청 크다�전혀 예측을 못하고 있는것을 알 수 있다

135 of 213

일반화와 샘플링

: 머신러닝 모델과 일반화(6)

모델2 처럼, 엄청나게 많은 파라메터를 이용하여, 모든 데이터를 학습한다는 것은�말 그대로, 모든 데이터를 그냥 “외워” 버리는 것이라고 볼 수 있다. 또한, 응용능력은 현저히 낮아지게 된다

학습용 데이터를 일반화하여 응용능력을 키우지 못하고, �있는 그대로 외우게 되는 현상을 “과적합" 되었다고 말한다.

그러면, 어떻게 과적합을 피할 수 있는가?

왼쪽 그림처럼, 전체 데이터셋을 �학습(Training)과 검증(Validation)용으로 분리하면 된다.�학습용 데이터셋은 모델의 학습에만 사용되고, �검증용 데이터셋은 모델의 성능및 손실등을 검증하는데 사용하게 된다.�매번 접해보지 못한 새로운 데이터를 어디선가 구해올 수 있다면 좋겠지만�현실적으로 불가능 하므로, 그림처럼 두개로 나눈 뒤 검증용 데이터셋은 �모델이 학습에 이용하지 않는 것으로 정해두는 것임

136 of 213

일반화와 샘플링

: 머신러닝 모델과 일반화(7)

학습 중간중간에 “항상”�모델의 손실정도를 학습용과 검증용�데이터셋 모두에게 평가해본다

만약 학습용 데이터셋에 대한 손실과�검증용 데이터셋에 대한 손실이�얼추 비슷하다면, 이는 편차가 없는 것으로�일반화가 잘 되고 있는 것이다

만약 학습용 데이터셋에 대한 손실보다�검증용 데이터셋에 대한 손실이�눈에 띄게 크다면, 이는 편차가 심한 것으로�거의 무조건 과적합이 발생한 것이다

137 of 213

일반화와 샘플링

: 머신러닝 모델과 일반화(8)

모델의 적합성 정도는 세 가지로 나뉘어진다. � - 희소적합 (Underfit)� : 전혀 똥오줌 못가리는 상태 (모델 자체가 잘못 설계되었거나, 학습 초기단계)� - 적합 (Fit)� : 아주 일반화가 잘된 케이스 (적절하게 학습이 되었다)� - 과적합 (Overfit)� : 너무 암기를 많이한 케이스 (많은 파라메터를 써서, 너무 오랫동안 학습을 시켰다)

138 of 213

일반화와 샘플링

: 언제 모델의 학습을 멈춰야 하는가(1)

정해진 하이퍼-파라메터로 뉴럴넷 모델을 만듬

학습 데이터셋을 사용하여 모델을 학습시킴

모델의 복잡도를 증가시켜 본다

과적합이 발생하는가?

(검증용 데이터셋을 활용하여 판단)

아니오

맞소

학습

정지

과적합이 발생한다고 느낌이 오는 그 순간의

하이퍼-파라메터로 구성된 모델로, 예측을 수행

⇐ 과적합이 발생했다고 판단되는 순간 정지해야함

넋놓고 있으면 점점더 과적합되면서 폭망

139 of 213

일반화와 샘플링

: 언제 모델의 학습을 멈춰야 하는가(2)

사실상 데이터셋은 세 종류로, 앞서 언급된 두 개 이외에�“테스트" 데이터셋 이라는 것이 있다.

학습/검증 데이터셋은 원래의 학습용으로 존재했던 데이터셋을 �쪼개서 만들어낸 것이라면,

테스트 데이터셋은 학습용 데이터셋과 완전히 독립적으로 �어디선가 구해온 데이터셋으로 구성된다.

세 종류의 데이터셋이 모두 모델이 배포되어 동작할 환경을 잘 반영해야 겠지만�테스트 데이터셋이 진정으로 실제상황을 가장 잘 반영한 것이어야 할 것이다.

일반적으로, 학습을 하다보면 원하는 임계치의 손실까지 더이상 도달을 못하는 경우가 발생할 수 있다. 그럴땐, 검증용 데이터셋을 추가적으로 튜닝을 하는데 사용할 수도 있을 것이다.

하지만, 테스트 데이터셋은 절대로 네버! 건드려서는 안되는 데이터셋임�⇒ 오로지 테스트 목적만을 위한것

140 of 213

일반화와 샘플링

: 언제 모델의 학습을 멈춰야 하는가(3)

그러나, 테스트 데이터셋까지 구축하기엔 �내가 가지고 있는 데이터셋의 양이 많지 않을 수 있다.

그럴때는 Cross Validation (교차 검증) 방법을 활용해 보는 것도 좋다.

학습을 할 때마다 (기준은 정하기 나름 1 Epoch? 10 Epoch?), �학습되어야 하는 데이터셋의 부분과�검증되어야 하는 데이터셋의 부분을 �계속 바꾸어준다. (바꿀 횟수를 k-fold 라고 함)

이렇게 되면, 언젠가는 검증에 사용된 데이터가 학습시에도 재활용될 수 있을 것이다.

하지만, 학습용으로 쪼개진 데이터를 계속적으로 학습하면, 점점 그 데이터에�오리엔트되어 가기 때문에, 이전 학습때 사용되었던 검증 데이터일지라도�검증용으로써 의미를 가지게 된다.

141 of 213

일반화와 샘플링

: BigQuery를 이용한 반복적인 샘플 생성(1)

앞서 배운것 처럼, 학습/검증/테스트용 데이터셋으로 데이터를 나누고자 할때�무엇을 기준으로 나눔을 수행해야 할까?

또한, 전체 데이터셋이 무지막지하게 크다면, 그 데이터를 몽땅 다 이용하는것이 �과연 바람직한 것일까?

이번 섹션에서는, 구글의 빅쿼리 플랫폼을 사용하여

데이터를 어떻게 분리해낼 수 있는지와

이때 고려해야할 사항들에 대해서 알아본다

142 of 213

일반화와 샘플링

: BigQuery를 이용한 반복적인 샘플 생성(2)

공개된 데이터셋

: 비행기 시간대 데이터셋

> 7천만건의 비행기 데이터

구글 빅쿼리 플랫폼에서 기본 제공하는 공개된 데이터셋임

143 of 213

일반화와 샘플링

: BigQuery를 이용한 반복적인 샘플 생성(3)

초간단 방법이다.

SQL 문법을 모르는 사람을 위해서,��SELECT: 긁어오고자 하는 컬럼 리스트 �FROM: 어느 테이블에서?�WHERE: 어떤 조건에 부합하는 데이터만?�RAND(): 0~1 사이의 값을 랜덤하게 뽑아내는 함수

그런데, 안타깝게도 이 방법은 항상 무작위이다. 뭐가 문제인가?�⇒ 모델의 학습/검증을 실험하는 입장에서, � 항상 동일한 데이터에서 실험해 보는 것이 중요하다.�⇒ 매번 데이터가 바뀌게 되면, 모델의 어떤 부분이 문제인지를 � 특정하는것이 너무나도 어렵다.�⇒ 반복적인 (매번 동일한) 샘플이 필요하다

전체 데이터셋에서 80%를 무작위로 들고와서 학습용 데이터셋으로 만들어보기

144 of 213

일반화와 샘플링

: BigQuery를 이용한 반복적인 샘플 생성(4)

반복적인 (매번 동일한) 데이터를 뽑아내기 위해서는 �MOD와 FARM_FINGERPRINT 두 가지 함수가 필요하다.

FARM_FINGERPRINT는 해쉬값을 들고오는 함수�MOD는 나머지 연산자 함수

해쉬값은 데이터간에 중복성이 없을 것이다. (무결성)

즉, date 컬럼의 모든 데이터 값을 해쉬값으로써 바라본 후, 그들의 값을 모듈러 연산자로 10으로 나누면, 나머지가 0~9인 녀석들로 추려질 것이다.

그 추려진 녀석들 중, 값이 8보다 작은 녀석 (즉 10개 중 8개)들만 모은다면, 약 80%의 데이터를 얻는 것이 가능하다

또한, 해쉬값은 변하지 않기 때문에 항상 똑같은 데이터를 뱉어내게 될 것이다

날짜 (12-10-18)에 대한 해쉬값의 예

145 of 213

일반화와 샘플링

: BigQuery를 이용한 반복적인 샘플 생성(5)

단, 해쉬값을 이용해서 데이터를 쪼갤 때, 어떤 필드(컬럼)을 대상으로 �FARM_FINGERPRINT를 수행할지를 정하는 것이다.

예를 들어서, date(날짜)가 두 개밖에 없는데, 전체 데이터의 양은 1백만개 존재한다면�날짜에 대한 해쉬값으로 데이터를 쪼개는 것은 바람직하지 못하다. (50:50으로 밖에 못 쪼갬)�⇒ 원하는 비율로 나눠질 수 있는 컬럼으로 선정되어야한다.

또한, 일단 해쉬값을 기반으로 나눠지면, �학습용 데이터셋에 있는 데이터 종류는 검증용 데이터셋에서는 더 이상 찾아볼 수 없을 것이다

즉, 데이터를 쪼개긴 하지만, 그 쪼개지는 기준이 되는 �컬럼이 모델이 학습/검증하는데 사용되지 않는 것이어야 한다.

146 of 213

일반화와 샘플링

: BigQuery를 이용한 반복적인 샘플 생성(6)

아무리 강력한 컴퓨팅 자원을 갖추고 있더라도�전체 데이터셋의 크기가 크다면 (Peta-byte 급)

모델이 전체 데이터셋을 학습하는데는 최소 수일~수주가 걸릴 수 밖에 없다. 당연히 이런 식으로는 뭔가를 개발할 수 없다.�⇒ 현실성이 없음

따라서, 전체 데이터셋의 일부를 사용해서 모델을 만들고, 그 일부에 대해서 괜찮다고 판단되면, 그 부분 데이터를 확장해나가면서 모델을 검증하는 것이 좋을 것이다.

다음 섹션 (데모) 에서는, �앞서 반복적인 (동일한) 데이터가 추출되었을 때�그 중에서 일부 데이터를 Uniform 하게 샘플링하는 방법을 배우게 될 것이다

147 of 213

일반화와 샘플링

: 퀴즈 (1)

머신러닝에서, 테스트 데이터셋 없이�모든 데이터를 학습에 사용하면�여전히 좋은 결과를 얻을 수 있는가?

데이터셋의 80%를 학습 20%를 검증용으로 분리해야 하는 작업이 요구되었다.

직장 동료가 아래의 SQL을 작성했는데, �이 SQL을 사용해서 데이터셋을 생성해야 할까?

그렇다 - RAND() 함수는 초기에 한번만 호출되므로, 모든 데이터들이

반복적으로 학습/검증으로 동일하게 분리될 것이다

아마도(?) - WITH 문을 사용하는것 대신에, 학습과 테스트 데이터셋을 별도로� 저장해두게 되면 항상 동일한 학습/검증 데이터셋을 얻을 수 잇을 것이다

그렇다 - 이 SQL문은 80%의 학습용, 20%의 검증용 데이터셋을 만들어낸다. � 왜냐하면, RAND()가 이러한 필터링 작업을 수행하기 때문이다.

아니다 - RAND()의 사용이 초기에 한번만 발생하더라도� 반복적으로 동일한 데이터셋을 얻을 수 없다�� 대신에, 해쉬 함수와 나머지 연산자를 사용해야한다

148 of 213

일반화와 샘플링

: 퀴즈 (2)

해당되는 모든것을 선택하시오.

  • 아직 접해보지 못한 실세계의 데이터를�추정가능한 모델을 만드는 방법이 무엇인가?

- 불가능하다. 왜냐하면 실세계의 데이터는 모델링이 될 수 없기 때문이다

- 데이터셋을 학습/검증/프로덕션 이라는 세 개의 버킷으로 분리한다. � 각 데이터셋들에 대해서 모델을 학습시킨 후, 어느 데이터셋에서 가장 잘 동작하는지를 찾아낸다� 그리고, 그 데이터셋만을 사용하여 상용화될 모델을 학습시킨다

- 가지고 있는 데이터의 질을 향상시킨다. 데이터의 질이 좋을 수록, 학습이 더 용이해질 것이다

- 데이터셋을 별도의 버킷들로 분리하고, 그 중 한 부분으로만 모델을 학습시킨다.� ( 그리곤, 나머지 부분은 아직 접해보지 못한 데이터로써 보존한다)

SQL을 사용해서, 반복적으로 동일한,

분리된 데이터셋을 얻기 위해 추천되는 방법은?

- 나머지 연산자와 RAND() 함수의 이용

- RAND() 함수를 사용해서 무작위 샘플링이 가능하도록 함

- 나머지 연산자와 해쉬 함수의 이용

- 방법이 없음

- 해쉬 함수와 RAND() 함수의 이용

149 of 213

일반화와 샘플링

: 퀴즈 (3)

데이터셋을 분리할때 마주할 수 있는 일반적인 장애요소를 모두 고르시오

- 데이터셋을 분리하기 위한 필드(컬럼)은 별로 노이즈(여러 범주)가 없을지도 모른다. � 그래서, 데이터셋을 나누는데 작은 단위로 활용되기 어려울 것이다

- 학습/검증/테스트 데이터셋으로 분리하기에 충분한 양의 데이터가 없다

- 데이터셋을 분리하는데 사용된 필드(컬럼)은 더이상, 모델 예측에 사용될 수 없다

- 검증 데이터셋은 결코 학습 데이터셋만큼 좋을 수가 없다

모델이 검증 과정을 통과 했는데도, 테스트에 실패한다면 뭘 해야 하는가?�(두 개의 올바른 답을 선택하시오)

- 새로운 모델을 가지고 처음부터 다시 시작

- 동일한 모델을 다른 하이퍼-파라메터를 사용해서 다시 학습시킨다.� 그래서, 테스트 데이터셋에 대한 더 낮은 손실 값으로 최적화 한다

- 모델의 학습을 중지시키고, 동일한 모델을 다시 시도해보기 전에 � 더 많은 새로운 데이터를 수집한다.

150 of 213

일반화와 샘플링

: 퀵랩1) Creating Repeatable Dataset Splits in BigQuery� BigQuery를 사용해서 반복가능한 데이터셋의 분할을 만들어보기

해설 비디오

체크!

클릭!

151 of 213

Qwiklab

진행 방법 (공통-1)

  1. Start Lab 버튼 클릭
  2. 왼쪽 패널에서 Connection Details 부분을 찾아서,�⇒ 사용자 이름 (username)을 클립보드로 복사
  3. “Open Google Console” 버튼을 클릭 ⇒ 구글 로그인 화면이 나타날 것임
  4. 사용자 계정을 선택(Choose an account)해야 한다면,�⇒ 다른 계정으로 로그인 버튼(Use another account)을 클릭
  5. 복사해 둔 사용자 이름을 넣고, 다음(Next) 버튼을 클릭
  6. 2번 화면으로 돌아가서, 비밀번호 (password)를 클립보드로 복사

152 of 213

Qwiklab

진행 방법 (공통-2)

  1. 비밀번호 입력 후, Next 버튼 클릭
  2. Welcome to your new account 단계에서�⇒ “Accept the terms and conditions” 체크 후, Next 버튼 클릭
  3. Protect your account 단계는 별다른 조작 없이 건너뜀
  4. Updates to Terms of Service 단계에서 ⇒ 모두 Yes 선택 후 진행
  5. 클라우드 쉘 접속이 필요한 경우, 아래 그림의 빨간 박스를 클릭하여 �⇒ Google Cloud Shell 프로그램을 실행.

153 of 213

Qwiklab

진행 방법 (공통-3)

  • datalab create mydatalabvm --zone asia-east1-a 쉘 명령을 실행�⇒ 약 5분 이상이 소요됨⇒ asia-east1-a 이외의 지역을 선택하고 싶은 경우,� gcloud compute zones list 쉘 명령으로 목록을 파악해 본다��⇒ 우측과 같은 화면이 � 출력 되어야 함�

Y 누른 후 엔터

엔터 (두번)

154 of 213

Qwiklab

진행 방법 (공통-4)

  • Web Preview 포트번호를 8081로 변경����
  • DataLab 화면으로 넘어가진 것을 확인���⇒ 구글 클라우드에서 제공하는 IPython Notebook 환경 (주피터 노트북 같은것)

155 of 213

Qwiklab

진행 방법 (공통-5)

  • Notebooks 폴더로 이동�
  • 새 Notebook 생성�
  • Notebook의 이름을 repocheckout으로 변경 (상단 untitled를 클릭)�
  • 첫 번째 셀에, 아래의 내용을 입력한 후, Shift+엔터 키조합을 누른다���⇒ 실습에 필요한 소스코드(노트북)을 복사해오는 과정

%bash

git clone https://github.com/GoogleCloudPlatform/training-data-analyst

rm -rf training-data-analyst/.git

156 of 213

Qwiklab

진행 방법 (공통-6)

  • 아래와 같은 화면�����
  • 다시 폴더목록이 있던 화면으로 돌아가면, 아래 화면과 같이 �폴더가 생겨 있는 것을 확인 가능

여기를 눌러서,

셀의 내용을 실행해 볼 수도 있음

157 of 213

Qwiklab

진행 방법 (노트북 선택)

  • 아래와 화면에 보이는것 처럼,�datalab/training-data-anlayst/courses/machine_learning/deepdive/02_generalization 폴더에 있는�repeatable_splitting.ipynb 파일을 클릭한다�

  • 노트북이 열리면, 각 셀의 내용을 순차적으로 실행해 보면된다. �(Shift+엔터, 또는 셀 좌측의 옵션 활용)�
  • 동일한 셀을 여러번 실행해 봐야 하는경우도 있다.�⇒ 이때는 해당 셀을 선택한 후, Shift+엔터 또는 해당 셀 좌측 옵션을 활용한다

158 of 213

본 노트북 실습의 목적은 머신러닝 데이터셋을 생성하는 여러가지 방법들이 있는데, 그들 각각의 영향을 살펴볼 것이다

반복성 이라는 것은 머신러닝에서 매우 중요하다. 똑같은 작업을 지금, 그리고 5분후 수행했을때 서로다른 결과를 얻게 된다면, 실험 과정이 매우 어려워질 것이다.

다시 말해서, 어떤 변화를 줬는데 그 변화가 결과를 향상시켰는지, 그러지 못했는지를 가늠하기가 어려워진다는 것이다.

구글의 BigQuery를 사용하기 위해서, google.datalab.bigquery 라이브러리를 import 한다.�⇒ import google.datalab.bigquery as bq

159 of 213

간단한 머신러닝 모델의 생성�목적: 비행기 출발 지연시간에 기반하여, 도착 지연시간을 예측해 본다�모델: 사용될 모델은 bias가 없는 단순한 선형모델이다 ⇒ � ( 모델을 학습시킴으로서, 좋은 값을 추정해 내게 된다) �“비행기 도착 데이터셋"이 사용되는데, 이는 BigQuery의 개방된 데이터셋 중 하나이다. 해당 링크를 클릭하여 다음사항을 확인한다 �1. Schema 탭에서, 어떤 컬럼들이 있는지를 확인해 보자. �2. Details 탭으로 이동해서, 데이터(레코드)의 갯수가 총 7천만개 임을 확인해 보자. �3. 다음으로 Preview 탭으로 이동해서, 실제 데이터 몇개가 어떻게 생겼는지를 확인해 보자.

160 of 213

좋은 값을 추정하기 위한, 한 가지 방법으로 아래의 공식을 사용해볼 수 있다

New York ⇒ Los Angeles로 가는 비행기와 Austin ⇒ Indianapolis로 가는 비행기 사이의 관계의 다름을 담아내고 싶기 때문에, 각각의 공항간의 쌍(출발, 목적지)에 대한 서로다른 값을 계산해야한다.

여기 예제에서는 문제를 쉽게 다루기 위해서, Denver ⇒ Los Angeles로 가는 비행기 만을 다룬다.

161 of 213

가장 원초적인 무작위 분할 (반복적인 동일 결과 X)

공식 그 자체를 쿼리문으로 작성�SAFE_DIVIDE: 나눗셈�SUM: 덧셈�AS alpha: alpha에 대입

쿼리문 안의 쿼리문 (중첩 쿼리)

  • 하위 쿼리문의 결과에서 선정된 컬럼 및 데이터가�상위 쿼리문의 WHERE 및 SELECT에서 상요됨

0 ~ 1 의 값을 발생, splitfield 라는 컬럼명을 부여

BigQuery에서 제공하는 테이블에 접근

언급된것 처럼, Denver ⇒ Los Angeles로 가는 비행기만을 대상으로하여, 필터링

하위 쿼리문에서 만들어진 컬럼 aplitfield가 0.8보다 작은 경우만을 대상으로함. 즉, 약 80% 데이터가 대상이된다

작성된 쿼리문을 실행한 후, 그 결과를 반환받는다. �반환받은 결과는 pandas 의 dataframe 형태의 객체로 변환된다.

dataframe 에서, alpha 컬럼의 값을 가져오고 출력한다.

162 of 213

다음과 같이, 학습/테스트 데이터셋에 대한 RMSE를 계산하면 뭐가 문제인가?

RMSE

3항 연산자. < 0.8 이면 train, 아니면 eval

dataset 이라는 이름으로 참조함

⇒ 약 80%의 데이터를 train�⇒ 약 20%의 데이터를 eval

전과 동일

dataset 으로 그룹핑한다. (즉, train 끼리, test 끼리 나누는것)

⇒ train, test 마다 RMSE를 계산해야 하기 때문

앞장에서 구해진 alpha를 대입

⇒ alpha는 모델이 도출한 값이다. 이 값과 레이블간의 차를 구해야함

compute_rmse 쿼리와 compute_alpha 쿼리가 동일한 학습train 데이터셋을 사용하는게 확실한가?

compute_alpha와 compute_rmse 를 재실행 해볼때 마다, 매번 같은값이 계산되는게 확실한가?

163 of 213

WITH 구문은 여러개의 서브-쿼리에 대해서, 참조이름을 부여할 수 있게 해준다.

첫 번째 서브-쿼리로, 그 결과를 alldata 로써 참조한다

앞에서와 마찬가지로�80%의 데이터는 train, 20%의 데이터는 eval이라는 컬럼을 가지게 한다�(현재 화면의 전체 쿼리에서는 dataset으로 통용됨)

두 번째 서브-쿼리로,

그 결과를 training 로

참조한다

값을 train에 대해서만 구하는 쿼리

dataset (train or test) 별로 그룹핑한 후,

두 번째 서브-쿼리에서 구해진 값을 활용하여 RMSE 계산

올바른 학습과 테스트란?

아래 SQL은 실제 학습/테스트 데이터를 사용해서, RMSE를 계산하는 옳바른 방법을 보여준다.

비록 계산이 올바르게 되긴 하지만, 그 결과는 반복적으로 동일하지는 못하다

아래 SQL을 여러번 실행해 보자; 같은 결과를 얻을 수 있는가?

164 of 213

데이터를 분리하기 위한 방법으로, date에 대한 해쉬를 사용해 보는것

공식 그 자체를 쿼리문으로 작성�SAFE_DIVIDE: 나눗셈�SUM: 덧셈�AS alpha: alpha에 대입

FARM_FINGERPRINT(date): date의 해쉬값 구하기

ABS: 음수가 있다면 ⇒ 양수로 변환 (해쉬를 양수화)

MOD 연산하여, 10으로 나눈 나머지 (0~9)를 구함

0~9 중 8보다 작은 수에 대한 것 (즉, 약 80%)의 데이터만을 선택해서 계산에 이용

다시 처음의 접근 방식대로, 를 먼저 계산한다.

⇒ 그리고 나서, 계산된 를 RSME를 계산하는데 활용하게 된다 (다음장)

그 이유는, 해쉬값을 기반으로 데이터를 나눠서 를 계산해 두면 그 결과는 나중에도 불변

165 of 213

앞서 계산된 를 이용하여 RMSE를 계산한다. � 값이 반복적으로 동일한 값으로 계산되기 때문에, 아래의 SQL에서 참조될 가 똑같은 값을 가진다고 볼 수 있다.

해쉬의 MOD 결과가 �< 8 이면 train, 아니면 eval 값을 가진다.

⇒ 약 80%의 데이터를 train�⇒ 약 20%의 데이터를 eval

데이터 분리가 정상적으로 이뤄지면, eval 데이터셋에 대한 RMSE가 train 데이터셋에 대한 RMSE보다 큰 결과가 나올 것이다.

166 of 213

일반화와 샘플링

: 퀵랩2) Exploring and Creating ML Datasets� 머신러닝 데이터셋을 만들고, 살펴보기

해설 비디오

체크!

클릭!

167 of 213

Qwiklab

진행 방법 (공통-1)

  • Start Lab 버튼 클릭
  • 왼쪽 패널에서 Connection Details 부분을 찾아서,�⇒ 사용자 이름 (username)을 클립보드로 복사
  • “Open Google Console” 버튼을 클릭 ⇒ 구글 로그인 화면이 나타날 것임
  • 사용자 계정을 선택(Choose an account)해야 한다면,�⇒ 다른 계정으로 로그인 버튼(Use another account)을 클릭
  • 복사해 둔 사용자 이름을 넣고, 다음(Next) 버튼을 클릭
  • 2번 화면으로 돌아가서, 비밀번호 (password)를 클립보드로 복사

168 of 213

Qwiklab

진행 방법 (공통-2)

  • 비밀번호 입력 후, Next 버튼 클릭
  • Welcome to your new account 단계에서�⇒ “Accept the terms and conditions” 체크 후, Next 버튼 클릭
  • Protect your account 단계는 별다른 조작 없이 건너뜀
  • Updates to Terms of Service 단계에서 ⇒ 모두 Yes 선택 후 진행
  • 클라우드 쉘 접속이 필요한 경우, 아래 그림의 빨간 박스를 클릭하여 �⇒ Google Cloud Shell 프로그램을 실행.

169 of 213

Qwiklab

진행 방법 (공통-3)

  • datalab create mydatalabvm --zone asia-east1-a 쉘 명령을 실행�⇒ 약 5분 이상이 소요됨⇒ asia-east1-a 이외의 지역을 선택하고 싶은 경우,� gcloud compute zones list 쉘 명령으로 목록을 파악해 본다��⇒ 우측과 같은 화면이 출력 되어야 함�

Y 누른 후 엔터

엔터 (두번)

170 of 213

Qwiklab

진행 방법 (공통-4)

  • Web Preview 포트번호를 8081로 변경����
  • DataLab 화면으로 넘어가진 것을 확인���⇒ 구글 클라우드에서 제공하는 IPython Notebook 환경 (주피터 노트북 같은것)

171 of 213

Qwiklab

진행 방법 (공통-5)

  • Notebooks 폴더로 이동�
  • 새 Notebook 생성�
  • Notebook의 이름을 repocheckout으로 변경 (상단 untitled 클릭)�
  • 첫 번째 셀에, 아래의 내용을 입력한 후, Shift+엔터 키조합을 누른다���⇒ 실습에 필요한 소스코드(노트북)을 복사해오는 과정

%bash

git clone https://github.com/GoogleCloudPlatform/training-data-analyst

rm -rf training-data-analyst/.git

172 of 213

Qwiklab

진행 방법 (공통-6)

  • 아래와 같은 화면�����
  • 다시 폴더목록이 있던 화면으로 돌아가면, 아래 화면과 같이 �폴더가 생겨 있는 것을 확인 가능

여기를 눌러서,

셀의 내용을 실행해 볼 수도 있음

173 of 213

Qwiklab

진행 방법 (노트북 선택)

  • 아래와 화면에 보이는것 처럼,�datalab/training-data-anlayst/courses/machine_learning/deepdive/02_generalization 폴더에 있는�create_datasets.ipynb 파일을 클릭한다������
  • 노트북이 열리면, 각 셀의 내용을 순차적으로 실행해 보면된다. �(Shift+엔터, 또는 셀 좌측의 옵션 활용)�
  • 동일한 셀을 여러번 실행해 봐야 하는경우도 있다.�⇒ 이때는 해당 셀을 선택한 후, Shift+엔터 또는 해당 셀 좌측 옵션을 활용한다

174 of 213

이번 노트북에서는 New York City에서 택시 탑승에 관련된 데이터를 살펴보고,

머신러닝 모델을 만들어서, 택시비를 추정하는것을 해 볼 것이다.

이 모델의 목적은 택시 이용객이, 택시비가 얼마정도 나올지를 미리 알 수 있게 해 주기 위함이다.

(예상한것과 실제금액에 큰 차이가 있다면, 어떤 항의를 할 수도 있으니까..)

머신러닝 데이터셋을 생성하고, 그 내용을 살펴보자

BigQuery 관련 패키지

matplotlib 기반. 좀 더 리치한 시각화 패키지

pandas 데이터프레임 패키지

수학관련 연산을 효율적으로 수행하는 패키지

쉘 관련 유틸리티 패키지

175 of 213

BigQuery로 부터, 샘플 데이터를 추출해 보자

택시 탑승관련 데이터셋은 BigiQuery에서 제공하는 개방된 데이터셋이다.

해당 링크를 클릭해서, 어떤 컬럼들이 존재하는지를 살펴보자.

  • 또한, Details 탭에서 얼마만큼의 데이터가 존재하며 (1백만개),
  • Preview 탭으로 이동해서 그들 중 몇개의 예제 데이터를 살펴보도록 하자

SQL문을 만들어서, 아래에 열거된 컬럼(필드)들을 선택해 보도록 한다 (다음장)

176 of 213

BigQuery로 부터, 샘플 데이터를 추출해 보자

데이터셋의 작은 일부분을 살펴보도록 한다. 그 일부분의 데이터가 반복적으로 동일한것이 선택될 수 있도록 해야함을 신경쓰자.

(이 노트북의 내용을 누군가 다른사람이 실행해 볼때, 동일한 결과를 얻을 수 있게끔..)

CAST: 캐스팅 연산자� 날짜 데이터(pickup_datetime)을 문자열 데이터로 변환

MOD 연산의 나눗셈에서, 나누는 수를 �EVERY_N으로 변수처럼 설정 가능하도록 해둠

pickup_datetime을 문자열로 바꾼것에 대한

해쉬값을 구한다. 그 해쉬값을 EVERY_N으로 �나누었을때, 나머지가 1인 녀석들만을 선택함

즉, 1 / EVERN_N 수준으로 샘플링 한다는 뜻임

이 예제에서는 1 / 100,000 비율로 샘플링하였음

177 of 213

데이터 살펴보기�

데이터셋을 살펴보고, 필요한만큼 정리를 수행한다.�Python의 Seaborn 패키지를 사용해서, 그래프를 시각화 하게될 것이다.

또한, Pandas 패키지를 사용해서, 데이터를 쪼개고 필터링하는 작업을 수행하게 된다.

Seaborn로, 선형회귀 그래프 그리는 코드�

- data: 그래프 그리는 대상 데이터�

- x, y: x, y 축으로 사용될 컬럼 이름 (data의� 컬럼이름이 문자열로 제공되어야함)�

- ci: confidence interval로,� 신뢰구간을 설정 (None 이면 없음)�- truncate: True로 설정되면, 정확히 x축 값의� 범위가 끝나는 구간에서 그래프가 종료

그래프를 그려보고 (단순히 위의 코드를 실행), 어떤 문제가 있음을 눈치챌 수 있는가?

수 많은 유효하지 않은 데이터가 있을 것이다. (거리가 0이거나, 택시비가 터무니 없거나)�분석을 통해서 알게된 유효하지 않은 데이터를 삭제하도록 한다.

이는 BigQuery 쿼리를 사용하여 거리가 0 보다 크고, 택시비가 최소한 $2.50 이상은 되는 것으로 추려볼 수 있다.

$45 ~ $50 사이의 구간을 보면, 가격은 똑같은데, 거리는 여러종류가 존재함을 알 수 있다.

그 이유는 JFK, La Guardia 공항에서 택시를 타면, 맨하튼의 어디를 가던지 고정된 금액만이 들기 때문

⇒ 데이터를 이해하기 위해서, 특정 백그라운드 지식이 필요한경우

178 of 213

통행료tolls_amount 가 전체비용total_amount 에 포함된 경우를 살펴보자

pandas의 문법으로, ‘toll_amount’통행료 가 0보다 큰 기록만을 선택

⇒ 그렇게 필터링된 데이터프레임을 tollrides 에 저장

몇 개의 출력된 샘플 데이터를 살펴보면, 전체비용total_amount 은 택시요금fare_amount에 반영되는 반면 �통행료tolls_amount 와 팁tip 은 일관성 없는 크기임을 알 수 있다. ⇒ 그 이유는 탑승객이 현금으로 비용을 지불하는 경우, 팁이 얼만지 알 수가 없기 때문이다.

따라서, 택시요금fare_amount 와 통행료tolls_amount 를 더한값을 예측대상 값으로 사용해야할 것이다.

(팁은 임의의 크기 (사람들마다) 이기 때문에, 비용을 측정하는데 포함되면 곤란하다)

179 of 213

각 컬럼들이 가지는 값들에 대한, 분포도를 확인해 보자

pandas의 함수로, 데이터프레임에 포함된 컬럼들의

값 분포를 한눈에 확인 가능하도록 요약해준다

경도logitude 의 최대/최소값이 좀 이상하다고 한다

⇒ 대충 지도를 살펴보면, 맨하튼의 경도의 범위가 저렇게 나올 수가 없음

붉은색 경계선 구역이 New York City임 ⇐

180 of 213

몇 여행의 위치상 시작과 끝이 어떨지를 시각화 해본다

showrides 함수를 정의

  • 인자 값: df - 원하는 대상 데이터프레임(테이블)과, � numlines - 그 중 몇개의 여정을 시각화 할지�
  • 앞서본 경도가 이상한 녀석들은 필터링한다�
  • numlines 수 만큼의 여정에 대해서�각각 위도lats, 경도lons 를 추출한 후, 배열에 담아낸다�
  • 배열의 내용은�탑승 시작지점, 택시를 내린지점, None 이 하나의 여정을 의미한다.�⇒ 즉, None은 서로 다른 여정을 구분짓는 구분자 역할을 함

통행료가 0일 수도 있는 여정(좌측)과

통행료가 무조건 0이상인 여정(우측)을

비교해보면, 당연히 통행료가 있는 여정들의

여행의 위치상 이동이 길다는 것을 알 수 있음

181 of 213

데이터의 퀄리티를 조절하는 것과 기타 전처리 작업

다음과 같이 데이터를 정리(청소)할 필요가 있다는 것을 알게 되었다.

  1. New York City의 경도longitude 는 -74 쯤되고, 위도latitude 는 41 쯤된다.
  2. 탑승객 수가 0명이면 안된다
  3. 전체비용total_amount 이 택시요금fare_amount 과 통행료tolls_amount 만을 반영하도록 정리한다. (전체비용과 통행료 컬럼은 삭제, 퉁쳐서 택시요금으로 통합)
  4. 여정이 시작되기 전, 탑승위치와 택시를 내리는 위치를 알 수는 있지만,�여행의 거리trip_distance 를 알 수는 없다. ⇒ 따라서, 거리 컬럼은 데이터셋에서 삭제한다.�(왜냐하면, 거리는 시작/끝 위치와 상관 없이 어느 경로를 통해서 목적지까지 갔느냐를 반영하기 때문)�
  5. 타임스탬프timestamp 컬럼을 삭제

위 조건을 만족하는 데이터만을 선별하는 BigQuery의 쿼리문을 작성해 본다. (다음장)

실제 프로덕션에서는 실시간으로 들어오는 입력 데이터에 대해서도 동일한 전처리 작업을 수행해야 할 것이다.

182 of 213

3

2

1

샘플링에 대한 추가 규칙

(해쉬를 이용)

183 of 213

학습/검증/테스트 데이터셋을 각각 샘플링하는 함수 정의

각각의 비율은 70%/15%/15% 로 전체 데이터셋을 나눈다

데이터프레임을 CSV 파일로 저장하기 위한 함수 정의

; 원래 pandas 는 데이터프레임을 CSV로 저장하는 라이브러리가 내장되어 있음 ⇒ 단, 저장하기 전에 추가 작업을 하려고 함

배열 인덱스를

key 라는 컬럼에 할당

fare_amount를

첫번째 컬럼으로 이동한다 (타겟 컬럼)

pandas의 라이브러리인 to_csv() 함수로,

CSV 파일로 저장한다

184 of 213

앞서 작성된 create_query() 함수와 to_csv() 함수를 이용해서,

학습/검증/테스트 데이터셋을 샘플링한 결과를 CSV파일로 저장한다

파일이 정상적으로 저장되어 있음을 확인

벤치마크

간단한 모델을 만들어서, 벤치마크 해 보는 것도 좋다 (일종의 러프한 베이스라인 설정)

(다음장에서) 만들게될 모델은 단순히 “택시요금"을 “평균 여정 거리"로 나누는 것으로, 거리와 요금의 비율을 계산하여 이를 예측하는데 활용한다.

또한, 이 모델에 대한 RMSE도 계산해 보도록 하자.

185 of 213

여정의 시작 위도/경도를 비교해서

거리를 구하는 함수

distance_between() 함수를 활용,�데이터프레임에 있는 모든 여정의 거리를 구한다

RMSE를 계산

모델에 사용될 Feature 리스트를 특정

모델이 예측할 대상 컬럼

학습 데이터셋에 대한

거리:비용 비율을 계산

학습/검증/테스트 데이터셋 각각에 대한�RMSE 값을 산출하여 출력

파일로 저장해둔

학습/검증/테스트 CSV를 불러오기

186 of 213

단순한 거리-기반의 규칙의

검증 데이터셋에 대한 RMSE는 $9.35 정도를 보여준다.

⇒ 베이스라인을 설정한 것으로, 이 결과를 상회하는 방법을 찾아내야 한다. (하지만 시도해본다면, 쉽지 않다는 것을 알게 될것)�⇒ 또한 RMSE의 목표치를 테스트 데이터셋으로 잡으면 안된다. 왜냐하면, 검증하는 중간중간 모델의 구조를 바꿔나가야 할 지도 모르기 때문이다.� ⇒ 검증 데이터셋을 통해서, 모델의 평가가 어느정도 완료되면, 그때마다 한번씩 테스트 데이터셋에 대해서도 평가를 해보는 것이 바람직하다

187 of 213

한가지 도전적인 연습문제

스택오버플로우의 어떤 질문이 있는데, 그 질문에 대한 답변이 달릴것인지 말것인지를 예측하고 싶다고 가정해 보자. �

링크의 데이터셋을 사용해서, 분류를 할 수 있는 머신러닝 데이터셋을 만들어보자.

  • 이 문제를 해결하기 위해 설정 가능한 벤치마크는 어떤게 있을까?
  • 또, 어떤 Feature를 사용해야 할까?

위 두 질문에 대한 답을 쉽게 찾을 수 있었다면, 이번에는�스택오버플로우의 질문에 대한 답변이 2일 이내에 달릴것인지를 예측하는 문제를 생각해보자. 데이터셋을 어떻게 만드는것이 바람직한가?

[참고] 이 문제를 꼭 해결해야만, 스터디잼 수료가 되는 것은 아님

188 of 213

Auto ML 퀵랩

189 of 213

Auto ML 퀵랩

  • 링크[Classify Images of Clouds in the Cloud with AutoML Vision]
  • 이번 퀵랩의 목적
    1. 레이블링된 데이터셋을 구글 클라우드 스토리지(GCS)에 업로드하고,�AutoML Vision을 레이블링된 CSV파일과 연결해보기
    2. AutoML Vision을 이용해서, 모델을 학습시키고 정확도를 측정해 보기
    3. 학습된 모델을 이용하여, 예측값들을 생성해 보기
  • AutoML은 데이터셋과 레이블만 주어지면, 자동으로 최적화된 모델을 찾아서 학습시켜주는 서비스 (현재는 Vision까지만 되는 것으로 알고 있음)

190 of 213

Qwiklab

진행 방법 (공통-1)

  • Start Lab 버튼 클릭
  • 왼쪽 패널에서 Connection Details 부분을 찾아서,�⇒ 사용자 이름 (username)을 클립보드로 복사
  • “Open Google Console” 버튼을 클릭 ⇒ 구글 로그인 화면이 나타날 것임
  • 사용자 계정을 선택(Choose an account)해야 한다면,�⇒ 다른 계정으로 로그인 버튼(Use another account)을 클릭
  • 복사해 둔 사용자 이름을 넣고, 다음(Next) 버튼을 클릭
  • 2번 화면으로 돌아가서, 비밀번호 (password)를 클립보드로 복사

191 of 213

Qwiklab

진행 방법 (공통-2)

  • 비밀번호 입력 후, Next 버튼 클릭
  • Welcome to your new account 단계에서�⇒ “Accept the terms and conditions” 체크 후, Next 버튼 클릭
  • Protect your account 단계는 별다른 조작 없이 건너뜀
  • Updates to Terms of Service 단계에서 ⇒ 모두 Yes 선택 후 진행
  • 클라우드 쉘 접속이 필요한 경우, 아래 그림의 빨간 박스를 클릭하여 �⇒ Google Cloud Shell 프로그램을 실행.

192 of 213

Auto ML 퀵랩

: Set up AutoML Vision (AutoML 비전 설정 하기)

  • 네비게이션 메뉴의 “APIs & Services” ⇒ “Library” 를 선택한다����
  • 검색창에서, “Cloud AutoML API”를 검색한 후 나타나는 �“Cloud AutoML API”를 클릭 ⇒ 그리고 “Enable”을 클릭 (수분 소요)

클릭

검색창

결과

화면

193 of 213

Auto ML 퀵랩

: Set up AutoML Vision (AutoML 비전 설정 하기)

  • 브라우져의 새로운 탭을 연 후, AutoML UI 주소로 접속한다.�⇒ 퀵랩에서 부여받은 사용자이름, 비밀번호를 사용하여 로그인한다����

Allow 클릭 후,

500 internal error 발생시

크롬 부라우저의

Incognito window 모드로 다시 시도해 본다

194 of 213

Auto ML 퀵랩

: Set up AutoML Vision (AutoML 비전 설정 하기)

  • AutoML UI에서, 부여받은 GCP 프로젝트 ID를 선택 하고 Continue를 클릭한다��������
  • 다음 화면에서, Set up Now를 클린한다�(시간이 약간 소요됨)�

195 of 213

Auto ML 퀵랩

: Set up AutoML Vision (AutoML 비전 설정 하기)

  • 다시 GCP 콘솔로 돌아가서, 클라우드 쉘을 실행한다
  • export PROJECT_ID=$DEVSHELL_PROJECT_ID�export QWIKLABS_USERNAME=<QWIKLABS_USERNAME>�쉘 명령을 수행하여, 두 개의 환경변수를 등록한다.�⇒ 이 때, <QWIKLABS_USERNAME> 은 할당받은 사용자 ID로 대체되어야함��아래의 예와 같이… ���

196 of 213

Auto ML 퀵랩

: Set up AutoML Vision (AutoML 비전 설정 하기)

  • 아래 세 개의 쉘 명령을 수행하여, �현재 사용자에 대한 AutoML 에 대한 권한을 부여한다.��gcloud projects add-iam-policy-binding $PROJECT_ID \� --member="user:$QWIKLABS_USERNAME" --role="roles/automl.admin"��gcloud projects add-iam-policy-binding $PROJECT_ID \� --member="serviceAccount:custom-vision@appspot.gserviceaccount.com" --role="roles/ml.admin"��gcloud projects add-iam-policy-binding $PROJECT_ID \� --member="serviceAccount:custom-vision@appspot.gserviceaccount.com" --role="roles/storage.admin"

197 of 213

Auto ML 퀵랩

: Set up AutoML Vision (AutoML 비전 설정 하기)

  • 아래 쉘 명령을 수행하여, 구글 클라우드 스토리지 (GCS)의 버킷을 생성한다�gsutil mb -p $PROJECT_ID -c regional -l us-central1 gs://$PROJECT_ID-vcm/��

⇒ 버킷은 데이터를 담는 하나의 논리적 단위�⇒ gsutil mb 명령의 mb는 (make bucket) 버킷을 만들어라는 의미�⇒ -p 옵션: 버킷이 만들어질 프로젝트 ID를 지정⇒ -c 옵션: 저장소의 등급(class)관련 내용으로, 링크에서 지정 가능한 의미를 참조�⇒ -l 옵션: 저장소가 생성될 지역(location)을 지정�⇒ 맨 마지막의 gs:// 문자열은, 저장소의 주소(이름)을 지정해준 것임

198 of 213

Auto ML 퀵랩

: Upload training images to GCS (GCS에 학습 이미지 업로드)

  • 네비게이션 메뉴에서, Storage를 선택한다.
  • 직전 단계에서 생성한 버킷의 존재를 확인한다.���
  • 클라우드쉘 에서, �export BUCKET=YOUR_BUCKET_NAME 명령을 수행한다�⇒ 이 때, YOUR_BUCKET_NAME은 2번 단계에서 확인한 � 버킷 이름으로 대체 되어야함��

199 of 213

Auto ML 퀵랩

: Upload training images to GCS (GCS에 학습 이미지 업로드)

  • gsutil -m cp -r gs://automl-codelab-clouds/* gs://${BUCKET} 쉘 명령을 실행한다�⇒ 공개된 GCS 저장소인 “automl-codelab-clouds”로 부터� 방금 생성한 로컬 GCS 저장소로 내용을 복사해 온다.��⇒ 아래 화면과 같이 복사의 진행상황을 확인 가능하다

200 of 213

Auto ML 퀵랩

: Upload training images to GCS (GCS에 학습 이미지 업로드)

  • 복사가 종료되면, GCP 콘솔로 돌아가서 �⇒ Refresh 버튼을 클릭한 후, 해당 버킷을 클릭한다�⇒ 아래 화면과 같이 복사된 폴더들이 보이는 것을 확인한다

201 of 213

Auto ML 퀵랩

: Create a dataset (데이터셋 생성)

  • gsutil cp gs://automl-codelab-metadata/data.csv . 쉘 명령을 실행한다.�⇒ 미리 만들어진 CSV 파일을 현재 로컬 머신으로 복사해 온다.�⇒ CSV 파일의 내용은 “이미지 ⇔ 레이블" 의 연관성이 기술된 단순한 � 컬럼 구조의 데이터들의 연속이다
  • sed -i -e "s/placeholder/${BUCKET}/g" ./data.csv 쉘 명령을 실행한다.�⇒ CSV 파일에 명시된, 모델 학습시 사용될 이미지의 위치를� 현재 우리가 만든 버킷의 주소로 변경시켜주는 작업� (기존 파일은 단순 템플릿이기 때문)
  • gsutil cp ./data.csv gs://${BUCKET} 쉘 명령을 실행한다.�⇒ 변경된 CSV 파일을 GCS 버킷에 업로드(복사) 한다.

202 of 213

Auto ML 퀵랩

: Create a dataset (데이터셋 생성)

  • 다시 AutoML Vision 브라우저 탭으로 이동하여, “NEW DATASET”를 클릭한다�⇒ 아래 화면과 같이 설정한 후, “CREATE DATASET”을 클릭한다.�

데이터셋의 이름�⇒ clouds

데이터셋 생성 규칙이 담긴 CSV 파일 선택�⇒ gs://프로젝트-ID/data.csv

203 of 213

Auto ML 퀵랩

: Inspect Images (이미지 살펴보기)

  • 데이터셋의 생성이 끝나면, 자동으로 아래 화면으로 페이지가 바뀌게 된다.

전체 이미지 (All Images)

레이블된 이미지 (Labeled)�레이블되지 않은 이미지 (Unlabeled)

별로 나눠서 볼 수 있음

레이블의 종류별로 필터링 해서�각 레이블별 이미지를 볼 수 있음�(이 데이터셋에는 총 3개의 레이블이 존재)��참고로, 각 레이블의 의미는�cirrus(새털구름), cumulonimbus(적란운),�cumulus(두루마리 구름)으로 사진이 어떤�구름인지를 판별하는 모델을 만들게 될 것임

204 of 213

Auto ML 퀵랩

: Inspect Images (이미지 살펴보기)

  • 상용화 수준의 모델을 만들려면, 최소한 �레이블당 100장의 이미지를 두는 것이 추천된다.�
  • 이미지를 살펴보다가 잘못 레이블된 이미지를 발견하는 경우,�해당 이미지를 클릭하여 아래 화면처럼 올바른 레이블링을 해줄 수 있다

205 of 213

Auto ML 퀵랩

: Inspect Images (이미지 살펴보기)

  • 레이블별로, 존재하는 이미지들의 통계적 수치를 �상단바의 “LABEL STATS” 메뉴로 확인 가능하다

206 of 213

Auto ML 퀵랩

: Train your model (모델을 학습시켜보기)

  • 최 상단 바로 아래의, 메뉴들 중 “TRAIN”을 클릭한다�⇒ 바뀐 화면에서, “START TRAINING” 버튼을 클릭한다.

모델 훈련시 전체 데이터셋을

얼만큼의 비율로 학습/검증/테스트

데이터셋으로 쪼개지는지를 알려준다�(자동으로 결정되는 사항)

207 of 213

Auto ML 퀵랩

: Train your model (모델을 학습시켜보기)

  • 아래와 같은 팝업 창이 뜨는 것을 확인한다.�⇒ Model name에 원하는 모델명을 입력한다 (내버려둬도 무관하다)

모델 타입을 선택한다

Cloud-hosted: 클라우드 (데이터센터)의 자원을 이용� 학습 이후, 클라우드와 연동하여 실시간� 예측 작업을 수행할 수 있다.��Edge: 엣지 디바이스용 모델을 다운로드� 엣지라 함은, 안드로이드/iOS/Edge TPU 를 말한다� (보통 Cloud-hosted 보다 정확도가 떨어짐)

학습에 사용할 자원을 선택한다�(오래 학습할 수록, 더 좋은 정확도를 얻을 수 있을 확률이 커짐)

비용에 대한 자세한 정보를 얻을 수 있는 링크

: 처음 1시간 사용에 대해서는 무료로 이용이 가능함

208 of 213

Auto ML 퀵랩

: Evaluate your model (모델을 평가해 보기)

  • 모델의 학습이 끝난 후,�최 상단 바로 아래의, 메뉴들 중 “EVALUATE”을 클릭한다�⇒ 아래 화면과 비슷한 형태의 Precision, Recall 결과가 얻어짐을 확인한다

209 of 213

Auto ML 퀵랩

: Evaluate your model (모델을 평가해 보기)

  • 화면 하단부에서, “Score Threshold” 값을 조절해 볼 수도 있음������
  • 또한, 화면 최하단에서는 �오차행렬(Confusion matrix)도 �한눈에 알아볼 수 있게 정리되어 있음

스코어 임계값에 따라서, �Precision과 Recall 값의 범위를 확인해볼 수 있다

210 of 213

Auto ML 퀵랩

: Generate Predictions (예측 생성해 보기)

  • 최 상단 바로 아래의, 메뉴들 중 “PREDICT”을 클릭한다�⇒ 웹상에서 직접적으로, 이미지를 업로드하여 예측해 볼 수 있다 �����
  • 또한, 외부에서 학습된 모델에 �접근하여 예측할 수 있도록�REST API도 지원한다

211 of 213

Auto ML 퀵랩

: Generate Predictions (예측 생성해 보기)

  • 아래 이미지 두 개를 다운로드 한다

212 of 213

Auto ML 퀵랩

: Generate Predictions (예측 생성해 보기)

  • UPLOAD IMAGES 버튼을 클릭하여, 다운로드된 이미지를 업로드 한다 �����
  • 다음과 같이 각 사진마다 예측된�결과값을 확인할 수 있다��(각 숫자들은 모두 합쳐서 1이 되는� 0~100% 확률값들임)

213 of 213

수고하셨습니다

그리고 감사합니다