Machine Learning/[Kaggle Course] ML (+ 딥러닝, 컴퓨터비전)

[Kaggle Course] A Single Neuron _ Define a linear model

WakaraNai 2020. 12. 17. 22:46
728x90
반응형

Introduction 

 Tensorflow와 Keras를 앞으로 이용하여 배우게 될 것들은,

  • fully-connected neural network 아키텍쳐 생성하기
  • 기초적인 머신러닝(regression, classification) 기법에 neural nets 적용하기
  • stochastic gradient descent로 neural net 훈련하기(train)
  • dropout, batch normalization 등의 기법으로 성능 향상시키기

What is Deep Learning?

수없이 쌓인 계산(deep stacks of computations)해야 할 때 그 중의 특징을 잡아내어 기계에 학습시키는 것

계산의 양은  딥러닝 모델에 어떻게 현실의 데이터 속 복잡하고 계층적인 패턴을 적용 가능하는가에 달려있습니다.

neural networks는 딥러닝 모델 정의의 한 가지 방법입니다. 수많은 neurons로 구성되어,

각각의 neuron이 독립적으로 한 개의 간단한 계산을 수행합니다.

neural network는 성능은 이러한 neurons의 관계도(연결) 형성의 복잡성에 달려있습니다.

 

 

The Linear Unit

neural network의 아주 기초적인  구성요소부터 봅시다. 바로 neuron이요. 

옆의 사진은, 하나의 입력값 'x' 에 대한 neuron (or unit)의 모습입니다.

 

'w'는 weight(가중치)를 의미합니다. 

어떤 값이 한 연결선을 거쳐가야 한다면, 무조건 그 선의 가중치와 곱해야 합니다. 그럼 input 'x'는 neuron에서 'w*x'의 값이 되어 도착합니다.

neural network는 이처럼 선마다 있는 가중치를 수정하며 학습합니다.

 

'b'는 bias(편향)을 의미합니다.

bias는 입력값과 무관합니다. 사진처럼 b에 1을 넣으면, neuron에는 (1*b=b이므로) b값이 도착합니다.

bias는 해당 입력값에 따른 neruon의 출력 결과을 수정할 수 있게 해줍니다.

 

'y'는 그 neuron의 최종 출력 결과값입니다.

그러므로 사진 속 neuron ( or unit)의 공식은 y=wx+b입니다.

잘 보시면 w는 일차함수의 기울기(slope), b는 일차함수의 y절편(intercept)이네요!

 

sigle unit은 linear unit과 같은 의미이며

커다란 network를 구성하기 전 프로토타입으로 single neuron부터 시작하는 것이 좋습니다.

 

 

Ex. The Linear Unit as a Model

www.kaggle.com/crawford/80-cereals

위 링크 속 dataset을 위한 liner unit의 계산방식들

1인분당 설탕 함유량(g) 값을 가진 'sugar'를 입력으로, 1인분당 칼로리 값을 가진 'calories'를 출력으로하여 모델을 학습시킵니다.

적당한 편향과 가중치가 각각 b=90, w=2.5임을 미리 알고있는 상태라고 가정합시다.

 

 위의 사진은, 1인분당 설탕 함유량이 5g 이상인 시리얼의 칼로리를 조사하는 방법입니다.

그렇게 도출된 공식인  calories=2.5x+90에 입력값 5를 넣어  2.5*5+9=102.5 검산도 해줍시다.

 

 

 

Multiple Inputs

위의 예제 속 dataset에는 'sugar' 외에도 다양한 feature가 존재합니다.

섬유질 또는 단백질 함유량을 모델에 추가하여 확장해보려면 어떻게 할까요?

그저, neuron에, 추가하고 싶은 featrue 수만큼, 입력값 연결선(input connections)을 하나 더 그려주면 됩니다.

 

옆의 사진은 입력값이 3개인 하나의 linear unit이며,

이 neuron의 공식은, y=w0*x0+w1*x1+w2*x2+b입니다. 모든 연결선의 아웃풋을 총합하여 y인 output에 보냅니다.

 

linear unit에 input을 더욱더 추가할 수록 해당 unit은 hyperplane에 적합하게 됩니다. 2개의 input이라면 하나의 평면에 적합하고요.

 

hyperplane이란 3차원 공간 속의 평면을 일반화하여 얻는 개념입니다.

hyperplane 예시

 

 

 

Linear Unit in Keras

ex) 3개의 입력값(sugar, fiber, protein)과 하나의 출력값(calories)을 가진 linear model 정의하는 방법

from tensorflow import keras
from tensorflow.keras import layers

# Create a network with 1 linear unit
model = keras.Sequential([
    layers.Dense(units=1, input_shape=[3])
])

keras.Sequential() - 여러 개의 layer을 겹친 것처럼 neural network를 생성

[layers.Dense()]의 parameter 설명

  • units = num_outputs : output 개수 지정
  • input_shape = [ num_columns ] : 3개의 features를 입력으로 지정
    • int가 아닌 list 자료형을 쓰는 이유: 더 복잡한 dataset을 허용하기 위해서. 위의 예제는 (2차원 data이며,) linear unit(1차원)이므로 그저 column의 개수인 3만 적음. data가 3차원 자료형이라면 [height, width, channels] 처럼 써야함

 

Tensors

deep learning에 적합한 array로, numpy array와 조금 다른 TensorFlow의 array 버전을 의미

Keras는 tensors를 가진 neural network의 가중치들로 설명되기에, 모델의 가중치를 알아내는 것은 중요

 

tensors는 GPU 및 TPU와 호환 가능한 accelerators입니다.

TPU는 사실, tensor 계산을 위해 특별히 고안된 장치입니다.

 

 


Exercise

Setup

# Setup plotting
import matplotlib.pyplot as plt

plt.style.use('seaborn-whitegrid')
# Set Matplotlib defaults
plt.rc('figure', autolayout=True)
plt.rc('axes', labelweight='bold', labelsize='large',
       titleweight='bold', titlesize=18, titlepad=10)

import pandas as pd

red_wine = pd.read_csv('../input/dl-course-data/red-wine.csv')
red_wine.head()

 

Red Wine Quality dataset에는 1600산 포르투갈 레드와인의 물리화학적 측정값으로 구성되어 있습니다.

또한 블라인드 시음회들에서 얻은, 각 와인 별 품질평가(rating) 값도 있습니다.

red_wine.shape해보니 (row=1599, col=12)

 

Q1) 물리화학적 측정값으로부터 확증된 품질인 와인을 선별하려면 어떻게 해야할까요?

target은 'quality'이며, 나머지 columns는 모두 features하려 합니다.

keras의 parameter의 unit=1, input_shape=[11]입니다. 

from tensorflow import keras
from tensorflow.keras import layers

model = keras.Sequential([ layers.Dense(units=1, input_shape=[11])])

 

Q2) 위 모델의 가중치와 편향값을 알아내려면?

 -> model에 'weights' attribute를 적용 -> tensors를 리스트 형식으로 출력

w, b = model.weights
print("Weights\n{}\n\nBias\n{}".format(w, b))


 

+) Plot the output of an untrained linear model

5번째 튜토리얼 내용인 regression problems입니다.

이는 "curve-fitting" problems와 유사합니다. - data에 최고로 적합한 curve를 찾으려 합니다.

linear model이 생성한 curve를 한 번 볼까요.

 

앞서 말했듯 model의 가중치를들을 훈련하기 전에 무작위로 뒤섞여 두는 준비작업이 필요합니다.

 

아래의 코드블럭을 실행시킬 때마다 하단의 사진처럼 계속 다른 그래프가 그려집니다.

random initialization 때문입니다.

import tensorflow as tf
import matplotlib.pyplot as plt

model = keras.Sequential([
    layers.Dense(1, input_shape=[1]),
])

x = tf.linspace(-1.0, 1.0, 100)
y = model(x)

plt.figure(dpi=100)
plt.plot(x, y, 'k')
plt.xlim(-1, 1)
plt.ylim(-1, 1)
plt.xlabel("Input: x")
plt.ylabel("Target y")
w, b = model.weights # you could also use model.get_weights() here
plt.title("Weight: {:0.2f}\nBias: {:0.2f}".format(w[0][0], b[0]))
plt.show()

 

728x90
반응형