TinyML이란?

- Tiny Machine Learning

- 평균 1 milliwatt 이하의 저에너지 시스템에서 구현되어 임베디드 장치에서 실행하는 머신러닝

- 가격이 착함..ㅎㅎ

 

Software for TinyML?

Tensorflow : 머신러닝을 위한 오픈소스 플랫폼

- Tensorflow lite 기기 내 추론을 위한 오픈소스 딥 러닝 프레임워크(Deep learning framework for on-device inference)

 

작동방식                    

1. 모델 선택

- 새로운 모델을 선택하거나 재학습시킬 모델 선택

- Python Tensorflow Using colab

2. 모델 변환

- TensorFlow 모델을 압축된 플랫 버퍼로 변환

- Tesorflow lite converter : convert to C array

3. 기기에 배포

- 압축된 .tflite 파일을 가져와서 모바일 또는 임베디드 기기에 로드

- c++ library

4. 최적화

- 32비트 부동 소수점을 좀 더 효율적인 8비트 정수로 변환하여 양자화하거나 GPU에서 실행

 

Hardware for TinyML

- Arduino nano 33 BLE Sense : no "Person detection(Face detection)"

- ESP-EYE : no "Gesture recognition"

 

 

 

 

 

참고: www.tensorflow.org/lite?hl=ko

MNIST database 

- 손으로 쓴 숫자들로 이루어진 대형 데이터 베이스이며, 다양한 화상 처리 시스템을 training하기 위해 일반적으로 사용됨

- 60,000개의 트레이닝 이미지와 10,000개의 테스트 이미지 포함

- NIST의 테스트 데이터셋으로부터 취합됨  

※NIST

더보기

NIST

28x28 픽셀의 바운딩 박스와 앤티엘리어싱 처리되어 그레이스케일 레벨이 들어가 있도록 평준화 되어 있음

KERAS(딥러닝 네트워크를 구축하기 위한 텐서플로의 고수준 API)

- 진입장벽이 낮고, 추상화가 잘 되어 있어 코드 가독성이 높기 때문에 주로 사용

- Backend인 Theano, TesorFlow, CNTK를 골라서 사용 가능

mnist model 구축 및 학습

1. import required modules

import numpy as np
import tensorflow as tf 
from tensorflow import keras
from keras.layers import Dense
from keras.models import Sequential
from keras.datasets import mnist

import mnist 모듈을 통해 data를 준비한다. 

2. load mnist data

(X_train, Y_train),(X_test,Y_test) = mnist.load_data()

(X_train, Y_train) : train dataset으로, 60000, 28*28 그레이스케일 이미지의 10digits인 dataset이다. 

(X_test, Y_test) : test dataset으로, trained model을 테스트하기 위한 10000, 28*28 그레이스케일 이미지이다. 

3. Reshape

X_train = X_train.reshape(60000,28*28).astype('float32')/255.0
X_test = X_test.reshape(10000,28*28).astype('float32')/255.0

Y_train = keras.utils.to_categorical(Y_train, 10)
Y_test = keras.utils.to_categorical(Y_test, 10)

60000은  x_train.shape[0]와 동일하고, 28*28은 784이므로 X_train = X_train.reshape(x_train.shape[0],784)라 작성하여도 무방하다. 

x_train.astype('float32'/255.0 : 그레이스케일 color 0~255.0을 0~1로 다시 스케일링 한다는 의미이다. 

keras.utils.to_categorical(Y_train,10) : 10개의 값을 one hot encoding한다는 의미이다. 

4. design model(Architecture) by using Keras Sequential model

model = Sequential()
model.add(Dense(units=4, input_dim=(28*28),activation='sigmoid'))
model.add(Dense(units=10,activation='softmax'))
model.summary() 

Sequential model : 뉴런의 각 레이어가 다음 레이어 위에 쌓이는 모델을 의미한다. 

model.add는 말그대로 model에 레이어를 추가한다는 의미이다. 

Dense는 "Dense 레이어"임을 나타내 주고, fully connected 레이어라고도 한다. 예측할 때 입력이 뉴런의 모든 단일 뉴런으로 전달됨을 의미한다. 

그런 다음 각 뉴런은 어느 정도 활성화(activated)되는데, 활성화 정도는 훈련 중 학습된 가중치, 편향과 활성화 함수(activation function)을 기준으로 한다. 첫번째 레이어에서의 활성화 함수는 "sigmoid"함수이고, 두번째 레이어의 경우 "softmax"이다. 

model.summary() 를 통해 작성한 model의 구조를 확인할 수 있다. 

네트워크 레이어, 출력형태, 파라미터 수를 확인할 수 있다. 네트워크 크기(메모리 용량)은 대부분의 파라미터 수에 따라 달라지며 총가중치와 편향 수를 의미한다. 

5. Compile model

model.compile(optimizer='sgd',loss='categorical_crossentropy',metrics=['accuracy'])

model을 compile하는 단계는, 학습 과정에서 사용되는 몇 가지 중요한 인수를 설정하고 훈련할 모델을 준비하는 과정이다. 

optimizer : 훈련 중에 네트워크가 입력을 모델링하도록 조정하는 알고리즘을 지정하고, 여기선 'sgd'를 사용

loss : 훈련 과정에서 네트워크 예측이 실제 값에서 얼마나 멀리 떨어져있는지 계산하기 위해 사용하는 방법을 지정하고, 여기서는 'categorical_crossentropy'함수를 사용, 이 함수를 보통 손실함수라 한다. 이 외에도 mse(Mean Squared Error 평균 제곱 오차법),등이 있다. 

metrics : 모델의 성능을 판단할 때 사용하는 함수를 지정하고, 여기선 'accuracy'함수 사용, 이 외에도 mae(Mean Absolute Error 평균 절대 오차법),등이 있다. 

6. Train designed model

history=model.fit(X_train, Y_train, batch_size=10, epochs=10, validation_split=0.3)

X_train, Y_train : 훈련데이터의 x,y값

batch_size : 배치크기는 정확도를 측정하고 가중치와 편향을 업데이트하기 전에 네트워크에 공급할 훈련 데이터 수를 지정해 주는 것이다. 위의 경우, 10으로 설정했으므로 각 에폭은 네트워크를 10번 업데이트할 것이다. 

epochs : 에폭은 전체 훈련 데이터셋이 훈련 중 네트워크를 통해 몇 번이나 실행될 것인지 지정한다. 따라서 에폭이 클 수록 학습을 더 많이한다. 

validation_split : 검증 데이터셋을 지정한다. 검증 데이터셋의 데이터는 전체 훈련 과정을 마친 네트워크에 투입되어 네트워크의 예측값과 기대 출력값을 비교한다. 

이렇게 Epoch이 10이 될 때까지 실행 후 출력한다. 

loss : loss함수의 출력값. 당연한 얘기지만, 작을수록 좋음. 첫번째 에폭의 loss값과 마지막 에폭의 loss값을 비교하여 개선이 되었는지 판단할 수 있다. 

accuracy : 훈련데이터의 정확도이다. 

val_loss : 검증 데이터에 대한 손실 함수 출력이다. 훈련손실이 검증 손실보다 낮을 경우, 네트워크가 과적합 될 수도 있음을 암시한다. 

val_accuracy : 마찬가지로 검증 데이터에대한 정확도이다. 

 

※ 에폭이 클수록 학습을 더 많이 하니까, 항상 네트워크가 더 좋아질까?

No, 일부 네트워크는 특정 수의 에폭 이후에 훈련 데이터에 과적합될 수도 있다. 과적합이 없는 경우에도 일부 네트워크는 일정량의 훈련 후에 네트워크 개선이 중단되는 경우도 있다. 

따라서, 네트워크가 개선되지 않을 시 훈련하지 않는 것이 좋다. 

7. Evaluate model

loss,accuracy=model.evaluate(X_test,Y_test)

테스트 데이터셋의 손실을 계산하고 출력한다. 정확히, 손실과 정확도를 계산하고 출력하여 모델 예측값이 실제값과 얼마나 차이나는지 계산한다. 

8. draw plot of accuracy

import matplotlib.pyplot as plt
plt.plot(history.history['accuracy'])
plt.plot(history.history['val_accuracy'])
plt.title('model accuracy')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.legend(['training', 'validation'], loc='best')
plt.show()

 

9. draw plot of loss

plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('model loss')
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend(['training', 'validation'], loc='best')
plt.show()

 

 

 

선형회귀알고리즘의 목표 : 입력 데이터(x) 와 타깃 데이터(y)를 통해 기울기(a)와 절편(b)를 찾는 것

                       = 산점도 그래프를 잘 표현하는 직선의 방정식을 찾는 것 

                 - 푸는 방법 : 경사 하강법 (gradient descent) , 정규방정식(normal equation), 결정트리, 등

 

경사하강법

- 모델이 데이터를 잘 표현할 수 있도록 기울기(변화율)를 사용하여 모델을 조금씩 조정하는 최적화 알고리즘

 

예측값과 변화율

- 딥러닝에서는, 기울기 a를 가중치를 의미하는 w나 계수를 의미하는 θ 로 표기

- y(타깃데이터)는 y ̂(y-hat)으로 표기

- y=ax+b 를 y ̂=wx+b로 

- 가중치 w와 절편 b는 알고리즘이 찾은 규칙, y ̂는 예측값(우리가 예측한 값)

 

 

훈련데이터에 잘 맞는 w와 b찾기

from sklearn.datasets import load_diabetes
diabetes = load_diabetes()  #diabetes에 당뇨병 데이터 저장
x=diabetes.data[:,2]
y=diabetes.target

 

1. w와 b 무작위로 초기화 하기

예시)

w=1.0
b=1.0

 

2. 훈련데이터의 첫번째 샘플 데이터로 y ̂얻기

- 훈련데이터의 첫번째 샘플 x[0]에 대한 y ̂계산 -> y_hat변수에 저장

y_hat = x[0] * w + b
print(y_hat)	#1.0616962065186886

 

3. 타깃과 예측 데이터 비교하기

y[0]과 y_hat값 비교

print(y[0])	#151.0

 

4. w값 조절해 예측값 바꾸기

y_hat 과 타깃(y[0])의 차이가 큼 -> w와 b 무작위 설정

-> w와 b 조금씩 변경

w_inc = w+0.1	#1차 함수의 기울기를 0.1만큼 높여준다고 생각
y_hat_inc = x[0] * w_inc + b
print(y_hat_inc)	#1.0678658271705574

- y_hat보다 조금 증가 

 

5. w값 조정한 후 예측값 증가 정도 확인하기

- w가 0.1만큼 증가했을 때 y_hat이 얼마나 증가했는지 계산 (y_hat증가량 / w증가량)

w_rate = (y_hat_inc - y_hat)/(w_inc -w)
print(w_rate)	#0.061696206518688734

- w_rate 는 첫번째 훈련 데이터 x[0]에 대한 w의 변화율

- 변화율은 양수 이므로 w값을 증가시키면 y_hat값 증가

- 변화율이 음수라면? w값을 감소시키면 y_hat값 감소

- w_rate에 대한 코드를 수식으로 적어 정리하면 변화율 = 훈련 데이터의 첫번째 샘플인 x[0]

w_rate = (y_hat_inc - y_hat) / (w_inc - w) = ((x[0] × w_inc + b) - (x[0] × w + b)) / (w_inc - w)

        = (x[0] × ((w + 0.1) - w)) / ((w + 0.1) - w) = x[0]

 

변화율로 가중치(w) 업데이트하기

(1) 변화율이 양수일 때

- w가 증가 y_hat증가

(2) 변화율이 음수일 때

- w가 감소 y_hat증가

- w에 w_rate(변화율) 더하는 방법! 

w_new = w + w_rate

 

변화율로 절편(b) 업데이트하기

- 절편 b에 대한 변화율을 구한 다음 변화율로 b 업데이트

- b 0.1만큼 증가시킨후 y_hat이 얼만큼 증가했는지 계산

b_inc = b + 0.1
y_hat_inc = x[0] * w + b_inc
print(y_hat_inc)  #1.1616962065186887

- 변화율 계산

b_rate = (y_hat_inc - y_hat) / (b_inc - b)
print(b_rate) #1.0

- 변화율의 값은 1 : b가 1만큼 증가하면 y_hat도 1만큼 증가

b_rate=(y_hat_inc-y_hat)/(b_inc-b) = ((x[0]×w+b_inc)-(x[0]×w+b))/(b_inc-b)

        = ((b+0.1)-b)/((b+0.1)-b)=1

 

- 즉 b를 업데이트하기 위해서는 변화율이 1이므로 1을 더하면 됨

b_new = b + 1
print(b_new)  #2.0

 

위의 방법들은 수동적인 방법!

이유 1) y_hat이 y에 한참 미치지 못하는 값의 경우, w와 b를 더 큰 폭으로 수정 X, 앞에서 변화율만큼 수정  했지만 특별한 기준 잡기 어려움

이유 2) y_hat이 y보다 커지면 y_hat을 감소시키지 X

 

오차역전파(backpropagation)사용 - 가중치와 절편 보다 적절하게 업데이트

오차역전파 : y ̂과 y 차이를 이용하여 w와 b 업데이트

 

1. 오차와 변화율을 곱하여 가중치 업데이트하기

x[0]일때 w의 변화율과 b의 변화율에 오차를 곱한다음

업데이트 된 w_new와 b_new 출력

err=y[0]-y_hat
w_new=w+w_rate*err
b_new=b+1*err
print(w_new,b_new)
# 10.250624555904514 150.9383037934813

 

2. 두번째 샘플 x[2]를 사용하여 오차를 구하고 새로운 w와 b 구하기

w_rate식을 정리하면 샘플값과 같아지므로 w_rate별도로 계산 X, 샘플값그대로 사용

y_hat = x[1]*w_new+b_new
err=y[1]-y_hat
w_rate=x[1]
# w_rate식을 정리하면 샘플값과 같아지므로 w_rate별도로 계산 X, 샘플값그대로 사용
w_new=w_new+w_rate*err
b_new=b_new+1*err
print(w_new,b_new)
# 14.132317616381767 75.52764127612664

 

3. 전체 샘플 반복하기

for x_i,y_i in zip(x,y):
  y_hat = x_i * w + b
  err = y_i - y_hat
  w_rate = x_i
  w=w+w_rate *err
  b=b+1*err
print(w,b)
# 587.8654539985689 99.40935564531424

cf) python의 zip()함수 : 여러개의 배열에서 동시에 요소를 하나씩 꺼내줌

위의 코드 : 입력 x와 타깃y 배열에서 요소를 하나씩 꺼내여 err계산 후 w와 b 업데이트

 

4. 그래프 그려 위에서 얻어낸 모델이 전체 데이터를 잘 표현하는지 확인

plt.scatter(x,y)
pt1=(-0.1,-0.1*w+b)
pt2=(0.15,0.15*w+b)
plt.plot([pt1[0],pt2[0]],[pt1[1],pt2[1]])
plt.xlabel('x')
plt.ylabel('y')
plt.show()

 

그래프그리기 전에 아래 코드 까먹지 말고 입력하기

입력하지 않으면 NameError: name 'plt' is not defined 과 같은 에러가 뜸

import numpy as np
import matplotlib.pyplot as plt

 

5. 여러 에포크(epoch)를 반복하기

for i in range(1,100):
  for x_i,y_i in zip(x,y):
    y_hat = x_i * w + b
    err = y_i - y_hat
    w_rate = x_i
    w=w+w_rate *err
    b=b+1*err
print(w,b)
#913.5973364345905 123.39414383177204

다시 그래프로 나타내면

plt.scatter(x,y)
pt1=(-0.1,-0.1*w+b)
pt2=(0.15,0.15*w+b)
plt.plot([pt1[0],pt2[0]],[pt1[1],pt2[1]])
plt.xlabel('x')
plt.ylabel('y')
plt.show()

위의 경우 머신러닝 모델:  y ̂=913.6x + 123.4

 

6. 모델로 예측하기

입력 x에 없었던 새로운 데이터가 발생했다고 가정

   -> 이 데이터에 대한 예측값을 얻으려면?

   -> 우리가 찾은 모델에 x를 넣고 계산

 

ex. x=0.18일때

x_new = 0.18
y_pred = x_new * w +b
print(y_pred)
# 287.8416643899983

이 데이터를 산점도 위에 나타내면

plt.scatter(x,y)
plt.scatter(x_new,y_pred)
plt.xlabel('x')
plt.ylabel('y')
plt.show()

선형회귀함수

- "기울기와 절편을 찾는것" 

- 머신러닝 알고리즘 중 하나

 

당뇨병환자의 1년 후 병의 진전된 정도를 예측하는 모델 만들기

 

당뇨병 환자 데이터 가져오기

- 머신러닝 딥러닝 패키지에는 인공지능 학습을 위한 dataset가 준비되어있음

- 사이킷런, 케라스 : 다양한 데이터 세트 제공

 

1. load_diabetes( ) 함수로 당뇨병 데이터 준비하기

from sklearn.datasets import load_diabetes
diabetes = load_diabetes( )  #diabetes에 당뇨병 데이터 저장 # Bunch 클래스

   cf) Bunch 클래스 : 파이썬 딕셔너리와 유사. 예제 데이터 세트를 위해 준비된 것. 특별한 기능 X

 

2. 입력과 타깃 데이터의 크기 확인하기

diabetes 속성 중 data속성과 target 속성 : 우리가 필요한 입력과 타깃 데이터가 넘파이 배열로 저장되어있음

shape 속성 : 넘파이 배열의 크기 저장되어있음

print(diabetes.data.shape, diabetes.target.shape)
# (442, 10) (442,)

- data 는 422 X 10 크기의 2차원 배열 , target은 442개의 요소를 가진 1차원 배열

- diabetes.data는 442개의 행과 10개의 열로 구성

- : sample : feature(샘플의 특성)

- ex. 당뇨병 데이터에는 환자의 혈압,혈당,몸무게,키,등(feature)이 있음

       이 특성의 수치를 모아 1세트로 만들면 1개의 샘플(sample)이 나옴

- 입력 데이터의 특성 : 속성/독립변수(independent variable)/설명변수(explanatory variable), 등

 

3. 입력 데이터 자세히 보기 (slicing 사용)

diabetes.data[0:3]
#array([[ 0.03807591,  0.05068012,  0.06169621,  0.02187235, -0.0442235 ,
#        -0.03482076, -0.04340085, -0.00259226,  0.01990842, -0.01764613],
#       [-0.00188202, -0.04464164, -0.05147406, -0.02632783, -0.00844872,
#        -0.01916334,  0.07441156, -0.03949338, -0.06832974, -0.09220405],
#       [ 0.08529891,  0.05068012,  0.04445121, -0.00567061, -0.04559945,
#        -0.03419447, -0.03235593, -0.00259226,  0.00286377, -0.02593034]])

 

- 10개의 요소로 구성된 샘플 

- array([ [1번째 샘플의 요소들], [2번째 샘플의 요소들], [3번째 샘플의 요소들]])

4. 타깃 데이터 자세히 보기

diabetes.target[:3]
# array([151.,  75., 141.])

타깃 데이터는 10개의 요소로 구성된 샘플 1개에 대응

즉 위에서 출력한 1번째 샘플의 요소들[ 0.03807591,  0.05068012,  0.06169621,  0.02187235, -0.0442235 , -0.03482076, -0.04340085, -0.00259226,  0.01990842, -0.01764613]은 151.이라는 타깃 데이터에 대응됨

 

5. 당뇨병 환자 데이터 시각화하기

맥플롯립의 scatter( ) 함수로 산점도 그리기

import matplotlib.pyplot as plt
plt.scatter(diabetes.data[:,2],diabetes.target)		# 3번째 특성과 타깃 데이터로 산점도 그리기
plt.xlabel('third characteristic of diabetes.data')		
plt.ylabel('diabetes.target')		
plt.show()

 

1. 넘파이(파이썬 패키지 중 하나)

-

cf) 파이썬 리스트

my_list=[10,'hello list',20]
print(my_list[1])	# list의 index는 0부터 시작
# 실행결과 : hello list

 

2차원 배열(중첩된 배열)

my_list_2 = [[10,20,30],[40,50,60]]

-> 2X3크기  / 2행 3열

 

파이썬 리스트로 만든 배열 : 배열의 크기가 커질수록 성능이 떨어진다는 단점

따라서 넘파이 사용

- 저수준 언어로 다차원 배열 구현

- 배열의 크기가 커져도 높은 성능 보장

- 배열을 이용한 다양한 통계, 수학 함수 제공

 

코랩에서 넘파이 임포트하고 버전 확인하기

import numpy as np		#numpy를 np라는 별칭으로 부를 것
print(np.__version__)

 

 

넘파이로 배열만들기 ( 파이썬 리스트처럼 문자열 함께 담을수없음)

 

1. array( ) 함수로 2차원 배열만들기

my_arr = np.array([10,20,30],[40,50,60])
print(my_arr)
# [[10 20 30]
# [40 50 60]]

 

2. type( ) 함수로 넘파이 배열인지 확인하기

type(my_arr)
# numpy.ndarray

my_arr : ndarray(넘파이 배열 클래스)의 객체

코드 셀의 마지막 줄은 print( )를 사용하지 않아도 출력됨

 

3. 넘파이 배열에서 요소 선택하기

파이썬 리스트에서 요소 선택하는 방법과 동일

 

4. 넘파이 내장함수 사용하기

ex. sum( ) 함수 

 

맥플롯립으로 그래프 그리기

import matplotlib.pyplot as plt # 별칭 plt

1. 선 그래프 그리기

# y = x*x 예시
plt.plot([1,2,3,4,5],[1,4,9,16,25])	# x축 값과 y축 값을 맥플롯립의 plot( )함수에 전달
plt.show( )	# show( )함수 사용하여 그래프 출력

2. 산점도 그리기(scatter plot)

- 산점도 : 데이터의 x축, y축 값을 이용하여 점으로 그래프 그린 것

plt.scatter([1,2,3,4,5],[1.4.9.16.25])
plt.show( )

3. 넘파이 배열로 산점도 그리기

 

x=np.random.randn(1000) #표준정규분포 따르는 난수 1000개 만듦
y=np.random.randn(1000) #표준정규분포 따르는 난수 1000개 만듦
plt.scatter(x,y)
plt.show()

구글 코랩 : 구글이 제공하는 주피터 노트북(jupyter notebook)

 

코랩이란?

-웹 브라우저(Web Browser)를 통해 제어하고 실제 파이썬 코드 실행은 구글 클라우드의 가상서버에서 이루어짐

- 노트북(코랩에서 만든 파일)은 구글 드라이브(Google Drive)에 저장하고 불러올 수 있음

- 구글 독스나 구글 스프레드 시트와 비슷한 방식으로 사용할 수 있는 프로그램

 

http://colab.research.google.com/

 

Google Colaboratory

 

colab.research.google.com

 

자주 사용하는 기능 [단축기]

1. 셀 삭제하기 [Ctrl + M D ] 

2. 셀 실행하고 바로 다음 셀로 이동하기 [Shift + Enter]

3. 셀 실행 (다음셀 이동 X) [Ctrl + Enter]

4. 셀 실행하고 바로 아래에 새 셀 삽입하기 [Alt+Enter]

5. 이 외에도 단축기 설정 가능 [Ctrl + M H]

6. 명령어 팔레트 [Ctrl + Shift + P] : 필요한 기능 검색 가능 

인공지능(Artificial Intelligence) : 사람의 지능을 만들기 위한 시스템이나 프로그램

 

1. 강 인공지능(strong AI) - 사람과 구분이 안될 정도로 강한 성능을 가진 인공지능 

2. 약 인공지능 (weak AI) - 특정 영역에서 작업을 수행하는 인공지능

                                - ex.Tesla의 자율주행자동차, 구글의 인공지능 스피커 Google Home,등

                                - 머신러닝, 딥러닝

 

인공지능, 머신러닝, 딥러닝의 관계

머신러닝이란?

 

1. "학습" / "훈련" 을 한다. ( 데이터의 규칙을 컴퓨터 스스로 찾아 수정한다. )

 

   (1) 지도학습(supervised learning)

        (훈련데이터 = 입력 + 타깃) 

        (입력 : 모델이 풀어야 할 일종의 문제 같은 것)

        (타깃 : 모델이 맞춰야 할 정답과 같은 것) 

        (모델 : 학습을 통해 만들어진 프로그램) - 후에 자세히 설명

        입력과 타깃으로 모델을 훈련시킴 (= 문제에 대한 답을 주는 방법으로 모델을 훈련시킴)

        ex. 내일의 날씨 예측, 스팸 이메일 분류, 등

        - 훈련 데이터 생성에 많은 시간 소요

 

   (2) 비지도학습(unsupervised learning)

        타깃이 없는 훈련 데이터 사용

        ex. 군집(clustering) - 기업이 고개의 소비성향에 따라 그룹 지정

        - 모델의 훈련결과를 평가하기 어려움

 

   (3) 강화 학습(reinforcement learning)

        머신러닝 알고리즘으로 에이전트 훈련

        -> 훈련된 에이전트 : 특정 환경에 최적화된 행동 수행, 수행에 대한 '보상'과 '현재상태'를 받음

       에이전트의 목표 "최대한 많은 보상을 받는 것" 

       대표적 알고리즘 : Q-learning, SARSA, Deep Q Network, 등

       ex. DeepMind, AlphaGo, 등과 같은 게임이나 온라인 광고, 등

 

2. 스스로 "규칙"을 찾는다. 

       대부분의 머신러닝 알고리즘은 훈련 데이터와 규칙의 관계를 식으로 표현 가능

       ex. 1.5 * x + 0.1 = y (y가 1 이상이면 A 실행) 

            x는 입력, y는 타깃, 1.5가중치, 0.1 절편 

            규칙 : 가중치(입력과 곱하는 수) & 절편(입력과 더하는 수)

       딥러닝은 많은 (10만, 100만)의 가중치와 절편을 가짐

 

3. 모델은 머신러닝의 수학적 표현

       앞에 예시로 든 수학식이 모델

       모델 : 훈련 데이터로 학습된 머신러닝 알고리즘

       모델 파라미터(model parameter) = 모델 + 가중치 + 절편

 

4. 손실 함수로 모델의 규칙을 수정한다.

        이전에 만든 모델에 새로운 입력과 출력을 넣었을 때 실제 타깃값과 맞지 않은 경우가 생김

        -> 모델의 규칙(가중치, 절편) 을 수정해야함

        손실 함수 (loss function) : 모델의 규칙을 수정하는 기준이 되는 함수

        최적화 알고리즘 : 손실 함수의 최솟값을 효율적으로 찾는 방법

 

딥러닝이란?

-복잡한 문제를 해결하기 위해 인공신경망(artificaial neural network)을 다양하게 쌓은 것

 

1. 딥러닝은 인공신경망으로 구성된다

         인공신경망을 여러 겹 쌓으면 위와 같은 모양이 되는 데 이것이 "딥러닝" 임

         딥러닝 ≠ 사람의 뇌

 

2. 딥러닝은 머신러닝이 처리하기 어려운 데이터를 더 잘 처리한다.

         "처리하는 데이터" - 머신러닝 vs 딥러닝

          머신러닝 : 데이터베이스, 레코드 파일, 엑실/CSV, 등에 담긴 정형 데이터 처리 

          딥러닝 : 이미지/영상, 음성/소리, 텍스트/번역 등의 비정형 데이터 처리 ('인지'와 관련된 문제 해결)

+ Recent posts