AI/Deep learning

1. The 'Hello World' of Deep Neural Networks

Jinlib 2022. 1. 1. 18:02

서론

Introduction to TensorFlow for Artificial Intelligence, Machine Learning, and Deep Learning
에서 얻은 지식을 토대로 간단하게 딥러닝의 기본적인 개념들을 살펴보고 넘어가보자.

본론

일반적으로 프로그래밍은 어떠한 룰이 주어지고, 여기에 데이터를 넣었을때 결과값이 나오는 형태이다.
반면, 머신러닝은 이와는 다르게 어떠한 데이터를 주고 이에 대한 결과값은 무엇인지 데이터를 줘서 이것의 룰이 무엇인지 도출한다.

가령, y= 2x - 1 라는 방정식이 있다고 해보자.
일반적인 프로그래밍 방식은

def twox(n):
  return 2*n - 1

와 같이 함수를 선언하고 여기에 n값을 넣어 결과값을 얻는 방식이다.

이제 머신러닝 방식을 알아보자
기존 프로그래밍 방식보다는 조금 복잡하다고 느낄 수 있다. 딥러닝의 초석이 되는 일이니 한번 차근차근 살펴보자.
대표적으로 딥러닝은 Python과 TensorFlow 그리고 Keras라는 tensorflow내 API 라이브러리를 주로 사용한다.
이 라이브러리는 인공지능을 통해 만든 Model(위 그림에서 말한 Rule)을 최적화하고자 할 때 사용되는데, TensorFlow의 케라스에 모두 최적화를 위한 수학적 수식이 구현되어 있어 neural net을 이용한 AI model을 만들떄 용이하다.

import tensorflow as tf
import numpy as np
from tensorflow import keras

def twoXminusOne(n):
  xs = np.array([-1.0, 0.0, 1.0, 2.0, 3.0, 4.0], dtype=float)
  ys = np.array([-3.0, -1.0, 1.0, 3.0, 5.0, 7.0], dtype=float)
  model = keras.Sequential([keras.layers.Dense(units=1, input_shape=[1])])
  model.compile(optimizer='sgd', loss='mean_squared_error')
  model.fit(xs, ys, epochs=500)
  return model.predict(n)[0]

prediction = twoXminusOne([10])
print(prediction)
  1. Line 1-3: tensorflow, keras, numpy라는 라이브러리 사용 선언하는 코드이다.
  2. Line 6-7: 학습 데이터를 정의
    numpy를 사용하여 인풋데이터와 아웃풋 데이터를 정의한다.
  3. Line 8: 인공지능 모델을 정의하는 코드
    1. Sequential
      계층(layer)가 순서대로 정의된다는 의미에서 Sequential이라는 단어를 사용한다.
    2. layers(층)
    3. Dense(밀도)
      연결된 뉴런의 층(layer)을 정의하기 위해 Dense라는 단어를 사용한다.
    4. units
      뉴런의 갯수를 의미한다. (여기선 1개로 정의)
    5. input_shape
      입력값(input) 데이터의 차원을 정의 어떻게 들어오는지 나타낸다. (일반적으로 numpy의 array형태로 입력되어 사용한다.)
  4. Line 9: 모델을 정의하고, optimizer과 loss function설정
    1. loss function
      앞서 말했다싶이 머신러닝 학습을 통해서 Rule을 만드는데 예측이 얼마나 잘됐는지? 혹은 얼마나 못했는지? 평가해야
      의사결정을 할 수 있을것이다. 여기서 loss function은 이를 위한 함수이고 loss가 적을수록 '수렴'된다고 표현한다. 
      여기서 사용된 loss function은 평균 제곱 오차(mean squared error)로 실제값과 예측값의 차이를 계산한다.
    2. Optimizer
      Optimizer는 loss function의 데이터를 사용하여 추측이 얼마나 잘 수행되었는지 또는 얼마나 잘못 수행되었는지에 대해 판단하여 모델을 최적화하기 위해 어떻게 할것인지 나타낸다. 여기서는 확률적 경사 강하방식(stochastic gradient destanct)를 사용한다. 측정하고 데이터를 optimizer한테 줘서 다음 추측값을 찾는다.
  5. Line 10: 모델을 학습시켜 Rule을 만드는 단계
    input과 output을 앞서 정의한 model에 넣고 학습을 시킵니다.
    500의 의미는 training을 500번 거치는 것을 의미합니다. line 4에서 정의한것을 토대로 loss function으로 추측이 얼마나 좋은지, 나쁜지 추측하고 optimizer을 통해 다른 추측을 하여 반복합니다.
  6. Line 13: 학습시킨 모델을 사용하는 단계
    이제 학습시킨 모델에 10을 넣었을때 어떤값이 나오는지 추측합니다.

원래 y= 2x-1에서 x가 10을 넣었을때 19여야 하는데 18.984303과 같은 아주 애매하게 다른 값이 나온다.

왜 19값이 안나올까? 19값에 더 근접하게 하려면 어떻게 해야할까?

1. 데이터를 늘린다.
현재 학습 데이터 6개 밖에 없다
-1, 0, 1, 2, 3, 4 밖에 없어서 우리가 보기에는 딱봐도 선형데이터지만 컴퓨터는 이를 알기 쉽지 않다.
만약 데이터를 늘린다면 좀 더 19에 근사하게 나올것이다.

마무리

매우 러프하게 deep learning 모델을 제작하는 법을 알아보았다.
앞으로 이런식으로 러프하게 진행하여 전체 숲을 먼저 확인한 다음에 각 구성요소에 대해서
좀 더 깊이 알아보도록 하자.