블로그 이미지
윤영식
Application Architecter, Full Stacker, KnowHow Dispenser and Bike Rider

Publication

Statistics Graph

Recent Comment

2018.08.14 16:00 Deep Learning/Read Paper

Data2Vis는 seq2seq를 통해 입력되는 데이터를 기반으로 출력으로 차트를 자동생성한다.




개념


 - Data2Vis의 데모 사이트에 가면 간략한 설명이 나와 있다.


    

  

  - Attention mechanism을 이용한 encoder-decoder 아키텍쳐 모델이다.  

  - key/value 쌍의 데이터를 입력으로 하고 Vega-Lite기반의 출력을 생성한다. Vega-Lite는 JSON기반으로 차트를 생성해주는 스펙이다. 

  - 특징

     + encoder는 최종 context vector 하나로 만든다. 이것을 C 라고 표현한다. 위이 그림에서 가운데 위치한 C이다. 

     + decoder는 학습할 때 encoder의 "C"와 "<go>답안"을 입력받아 "답안<eos>"를 출력하는 학습을 한다. (참조)

     + encoder, decoder의 길이를 정해야 한다. 무한정일 수 없다.

     + 여기서 encoder, decoder는 동시에 학습할 수 있다. (참조)

     + 정답이 있는 데이터만 S2S 학습이 가능하다.

     + 단어들에 대한 벡터화한 수치 사전이 필요하다. (참조)





소스 설치










<참조>


  - Data2Vis 소개글, 깃헙 소스, Arxiv 링크

  - deeep 블로그
     seq2seq 에 대한 쉬운 설명글

     Attention 메카니즘설명 (소개한 Arxiv 링크)

  - ratsgo 블로그
     seq2seq를 이용한 뉴스 제목 추출하기
     설명에 대한 소스 (2018년 tensorflow 버전에 맞지않다)

  - 구글 제공
     seq2seq 문서

  - Tensorflow의 seq2seq 한글 설명, 2014년 Arxiv에 소개된 seq2seq pdf

  - 라온피플 블로그
     RNN, LSTM, GRU 소개

'Deep Learning > Read Paper' 카테고리의 다른 글

[Data2Vis] 자동으로 차트 만들기  (0) 2018.08.14
posted by peter yun 윤영식
2018.08.11 16:12 Deep Learning

텐서플로우 강좌를 들으면서 다음의 모델을 실습으로 쥬피터에 코딩을 했다. 여기서 Cost function을 짤때 log함수를 왜 사용하고 앞에 - (마이너스)값은 왜 붙이는지 정리해 본다. 



준비

  - 아나콘다 설치

  - jupyter notebook 실행

  - python v3 


import tensorflow as tf


input_data = [[1, 5, 3, 7, 8, 10, 12]]

label_data = [0, 0, 0, 1, 0]


INPUT_SIZE = 7

HIDDEN1_SIZE=10

HIDDEN2_SIZE=8

CLASSES = 5

Learing_Rate = .05


x = tf.placeholder(tf.float32, shape=[None, INPUT_SIZE])

y = tf.placeholder(tf.float32, shape=[CLASSES])


feed_dict = {x: input_data, y: label_data}


W_h1 = tf.Variable(tf.truncated_normal(shape=[INPUT_SIZE, HIDDEN1_SIZE], dtype=tf.float32))

b_h1 = tf.Variable( tf.zeros([HIDDEN1_SIZE]), dtype=tf.float32)

hidden1 = tf.sigmoid(tf.matmul(x, W_h1) + b_h1)


W_h2 = tf.Variable(tf.truncated_normal(shape=[HIDDEN1_SIZE, HIDDEN2_SIZE], dtype=tf.float32))

b_h2 = tf.Variable( tf.zeros([HIDDEN2_SIZE]), dtype=tf.float32)

hidden2 = tf.sigmoid(tf.matmul(hidden1, W_h2) + b_h2)


W_o = tf.Variable(tf.truncated_normal(shape=[HIDDEN2_SIZE, CLASSES], dtype=tf.float32))

b_o = tf.Variable( tf.zeros([CLASSES]), dtype=tf.float32)

output = tf.sigmoid(tf.matmul(hidden2, W_o) + b_o)


cost = tf.reduce_mean(-y*tf.log(output)-(1-y)*tf.log(1-output))

train = tf.train.GradientDescentOptimizer(Learing_Rate).minimize(cost)


sess= tf.Session()

init = tf.initialize_all_variables()

sess.run(init)


for i in range(10):

    _, loss = sess.run([train, cost], feed_dict = feed_dict)

    print('step:', i)

    print('lost:', loss)


//결과

step: 0
lost: 0.794413
step: 1
lost: 0.780786
step: 2
lost: 0.767388
step: 3
lost: 0.754181
step: 4
lost: 0.741128
step: 5
lost: 0.728179
step: 6
lost: 0.715276
step: 7
lost: 0.702345
step: 8
lost: 0.689285
step: 9
lost: 0.675957



cost(비용) 함수의 목적은 비용 판단을 통해 올바른 W(가중치, 기울기)와 b(바이어스, 시작점)을 찾는 것이다. 다시 말하면 목표하는 W과 b를 찾을 수 있다면, 어떤 형태가 되었건 비용함수라고 부를 수 있다는 뜻이다. 



Step-1) 가설함수 

  - matmul 은 Matrix Mutiply의 약어이다. 

  - sigmoid는 binary classification의 한계를 넘기 위해 적용. sigmoid 그래프는 중심축 0을 중심으로 좌측은 0으로, 우측을 1로 수렴한다.

  - 가설함수 (Hyphothesis):  H(x) = sigmoid(Wx + b) 로 결과값은 0 또는 1의 값을 갖는다. 수학 공식으로 하면,

     H(x) = 1 / (1 + math.exp(-(Wx + b))

     소스에서는  output = tf.sigmoid(tf.matmul(hidden2, W_o) + b_o) 이 가설함수이다.



Step-2) 비용함수

  - 가설함수를 정의했다면 해당 가설 함수의 적정한 W, b를 찾기 위해 비용(Cost) 함수를 정의한다.

     비용함수는 예측값과 실제값의 차이에 대한 평균값을 구한다. 로지스틱 회귀에 사용되는 실제 비용함수를 수학 공식으로 하면,

     cost = (1/n) * sum( -y_origin * log(sigmoid(Wx + b)) - (1 - y_origin) * log(1 - (sigmoide(Wx + b))) 

       n: 트레이닝 데이이터 수

       y_origin: 트레이닝에 에 사용될 x에 대한 입력값

     소스에서는  cost = tf.reduce_mean(-y*tf.log(output)-(1-y)*tf.log(1-output)) 이 비용함수이다. 


  - 비용함수에서 가설함수의 e를 사용하는게 아니라 log를 사용하는 이유는 e를 통해 비용함수를 그리면 다음과 같이 나오기 때문에 매끈한 경사를 만들기 위해 e의 역치함수인 log를 사용한다. 

    비용함수는 y=1 일때와 y=0 일때는 나누어 계산한다. 


  - 측정(실제 입력)값 y=1 일때는 -log(H(x)), -log(가설함수) 즉 -log(sigmoide(Wx + b)) 를 사용하고 그래프로 보면 sigmoid(Wx+b)가 0~1사이에 있고 -log(0~1)을 그린다. 

     H가 1이면 cost(1) = 0 이 되고, H가 0이면 cost = 무한대가 된다.

     좌측의 밥그릇이 된다.

     측정(실제 입력)값 y=0 일때는 가설값이 0이 되어야 한다. 이는 0에 가까울 수록 cost는 0에 가까워야 한다. -log(1 - sigmoid(Wx + b)) 되고 log(1 - (0~1)) 이 된다. 

    우측의 밥그릇이 된다.

     요약하면 -log(h)는 좌측, -log(1-h)는 우측이다. 


  * 주의할 것은 Linear Regression (binary classification)을 하기 위해 평균에 제곱을 하지 않는다. 

 

  - y=0 일때와 y=1일때의 각 수식을 하나의 수직으로 만들기 위해 다음 공식을 사용해 합쳐서 표현한다. 소스에서는 -y*tf.log(output)-(1-y)*tf.log(1-output) 이 된다. 

  


      y * A + (1-y) * B => y * -log(H(x)) + (1-y) * -log(1 - H(x)) => -y*log(H(x)) - (1-y)*log(1 - H(x))  => -( y*log(H(x)) + (1-y)*log(1 - H(x)) )


  - 이것을 다시 재구성하면 다음과 같다. 소스에서는 cost = tf.reduce_mean(-y*tf.log(output)-(1-y)*tf.log(1-output)) 이다.

  



Step-3) 옵티마이저

  -  코스트함수가 정해지면 옵티마이저를 설정한다. 

      경사하강법 (GradientDescent)는 cost(W)을 미분을 적용해서 W의 다음 위치를 계산하는 공식이다. 다음 위치로 이동하는 것은 Learning Rate (이동하는 Step 크기)로 정해진다.

  - W 와 b의 적정값을 계산하기 위해 비용함수를 만들었다면 학습을 통해 GradientDescent가 W와 b값을 구한다. 여기서 나온 W,b를 통해 예측을 수행한다.

  - 소스는  tf.train.GradientDescentOptimizer(Learing_Rate).minimize(cost) 이다.

  - GradientDescent Optimizer는 gradient를 계산해서 변수에 적용하는 일을 동시에 하는 함수이다. W와 b를 적절하게 계산해서 변경하는 역할을 하며, 그 진행 방향이 cost가 작아지는 쪽으로 수행한다. train을 수행하게 되면 텐서 그래프의 모든 변수의 값이 자동 변경되며 계산된다. 소스는 _, loss = sess.run([train, cost], feed_dict = feed_dict) 이다.


  - 또한 텐서를 run하기 전에 그래프에 연결된 모든 variable을 초기화해야 한다. 

  - 옵티마이저 설명 참조

  



Step-4) 가절 검증

  - output 은 hypothesis 가설함수로 이것을 실제 테스트를 해본다. 

  - Linear에서 x, y 데이터를 placeholder를 통해 train 시키고, 최종 W,b가 구해진 가설함수에 대해서 test 데이터를 넣어 보고 예측이 맞는지 검증한다. 

  - Linear Regression 예 (Linear Regression에 대한 이해 참조)

import tensorflow as tf

x_data = [1.,2.,3.]

y_data = [1.,2.,3.]


W = tf.Variable(tf.random_uniform([1], -100., 100.))

b = tf.Variable(tf.random_uniform([1], -100., 100.))


X = tf.placeholder(tf.float32)

Y = tf.placeholder(tf.float32)


h = W * X + b

cost = tf.reduce_mean(tf.square(h - Y))


rate = tf.Variable(0.1)

op = tf.train.GradientDescentOptimizer(rate)

train = op.minimize(cost)


init = tf.initialize_all_variables()


sess = tf.Session()

sess.run(init)


for step in range(2001):

    sess.run(train, feed_dict = {X: x_data, Y: y_data})

    if step % 100 == 0:

        print(step, sess.run(cost, feed_dict={X: x_data, Y: y_data}), sess.run(W), sess.run(b))


print('Test:', sess.run(h, feed_dict={X: 5}))




<참조>

- 김성훈 교수님 강좌 요약 블로그

- 조대협의 로지스틱 회귀 분석 블로그

- Tensorflow 유튜브 강의

- 로지스틱 회귀 이해

- 선형, 비선형 회귀 모델의 이해

- Tensorflow의 자료형 이해, 상수/변수/플레이스홀더 이해

- 선형 회귀를 Tensorflow로 구현하기

posted by peter yun 윤영식
2018.07.31 15:25 Deep Learning

인공지능 공부하기 위한 여정을 정리하고 계속 업데이트 한다.  하루에 2시간 이상 꼭 공부를 해야 강좌를 완료할 수 있다. 





Machine Learning & Deep Learning


김성훈 교수님의 인프런 강좌

   - 모두를 위한 딥러닝 - 기본적인 머신러닝과 딥러닝 강좌

   - 모두를 위한 딥러닝 - Deep Reinforcement Learning



앤드류응 교수님의 코세라 강좌

   - 머신러닝



머신러닝 Engineer 학습경로

 Machine Learning Engineer 커리큘럼


    + Supervised Learning: Hypothesis  set <-> DAG (비순환 그래프)를 만드는 과정
    + Disttribution: Binary classification (이진분류), Multicase classification (다중 분류), Linear regression (선형 회귀), Multimodal linear regression (다항 회귀)


  - 테리님 왈 다음과 같은 과정으로 공부하길 추천함
   <초급>
    - 조대협님의 머신러닝 블로그글 (내가 추가한 것임)
   <중급>


T 아카데미의 인공지능 강좌

   - 인공지능을 위한 머신러닝 알고리즘

     + 김성훈 & 앤드류응 교수님의 강좌수강 후 개념 정리용 (단, 수학공식이 많이 나옴, 수학방을 이용하자)

     + 설명중 회귀 모델에 대한 보다 자세한 설명

     + 설명중 우도(가능도-Likelihood) 자세한 설명



Microsoft의 데이터 과학 전문 프로그램

  - 필수 과목 11개

  - 과정당 12시간: 하루 2시간 계산하면 과정당 1주가 걸림 -> 총 11주 프로그램     

  - 필요한 것을 선별해서 보면 좋을 듯함.




Interactive Data


Python 배우기

  - T 아카데미의 Python 프로그래밍: 파이썬 3 기반 기초 

  - T 아카데미의 Python을 활용한 데이터분석 기초: Jupyter Notebook기반으로 Pandas, Seaborn 실습

  - T 아카데미의 Python을 이용한 데이터분석 실습

  - Edwith의 머신러닝을 위한 Python



Tensorflow 배우기 

  - Tensorflow 공식 홈페이지

  - 골빈해커의 텐서플로우 강좌

  - 이찬우님의 텐서플로우 유튜브 강좌

  - Tensorflow로 MNIST 실습 SlideShare



CNN 이해

  - 초보자가 이해하기 좋은 CNN 이해 SlideShare

  - CNN 스탠포드 강좌 - CS231n



RNN 이해

  - 초보자가 이해하기 좋은 CNN, RNN 이해 SlideShare

  - RNN LSTM 이해 - Colah




용어 이해

 - Softmax 이해

 - Activation Function 이해

 - Back Propagation 이해. 수식으로 설명, 코드로 설명

 - ReLu 이해: 역전파의 오류 방지

 - 알고리즘 복잡도 이해 - Big O == "최악의 경우(시간복잡도가 클 경우)에도 이 시간 정도면 된다" 라는 의미

 - Log 함수 이해

 - tanh 이해

 - LSTM 이해




To be continued... 


사실 계속 공부해도 감 잡기는 정말 힘들다. 프로젝트를 해봐야 뭐라도 하나 잡고 갈듯하다. 




<참조>

- 인공지능과 머신러닝 학습 경로

테리님 블로그

조대협님 블로그

- 조경현 교수님의 뉴욕댁 머신러닝 강좌 소개소스

- 조경현 교수님이 참조하였다는 머신러닝의 강의 자료

- 시그모이드 함수 설명

- Activation Function 설명

- 역전파(Backpropagation) 설명, 잘 이해해야 함 (Adnrej Karpathy), Andrej의 RNN 이야기

- 로그함수 설명

- 수학방로그함수 좀더 기초적 설명

- 수학 기호 명칭 - 수식을 볼려면 기호의 의미를 알아야 한다.

- 미분에 대한 쉬운 이해

- MNIST - yann.lecun.com

posted by peter yun 윤영식

선형 대수학 강좌를 정리한다. 




Matrix vs Vector vs Scalar


Matrix = m * n = 행*렬 = row * column

Vector = m * 1 형태의 Matrix  = 크기와 방향을 가짐

Scalar = Matrix * 상수 = 크기만 가짐



Matrix Vector Multiplication (곱)


[ m * n ] [ n * 1 ] = [ m * 1 ]


가설 방정식을 이와 같이 표현할 수 있음. 예로 집값 예측 방정식을 수식으로 표현하면 4차원 벡터가 (4 dimensional vector) 나온다. 





Matrix Matrix Multiplication


matrix vector 곱의 결과를 모아 놓은 형태로 보면됨.



결과는 다음의 형태가 된다. 




각 가설을 다시 matrix matrix multiplication으로 만들면 각 가설의 결과값이 column으로 나온다.




Matrix properties (속성)


A, B가 일반 행렬이고, I 가 항등 행렬이라고 하면 


- 교환 법칙:  A * B != B * A  성립하지 않는다. 

- 행렬곱 주의: A * (B * C) = (A * B) * C

- 항등행렬: n*n 으로 행과 열이 같으면서 대각선은 1이고 나머지는 0인 행렬 (identity matrix),  A * I = I * A = A




Inverse matrix (역행렬)


Matrix을 inverse해서 역행렬하고 matrix과 곱하면 항등행렬을 얻는다. 이때 역행렬을 얻을 수 있는 것은 정방행렬(행과 열의 수가 같은 행렬)뿐이다. 



역행렬을 가질 수 없는 예로 0으로 채워진 행렬은 역행렬을 가질 수 없다. 이를 singular matrix 또는 degenerate matrix라 칭한다. 



Matrix transpose (전치행렬, transposition)


m * n 을 n * m으로 만들기





참조


- 앤드류응 교수의 선형대수학 강좌

posted by peter yun 윤영식

앤드류 응교수님의 ML 강좌를 정리한다.





Gradient Descent


hypothesis 함수를 적절한 parameter를 가지고 검증할 필요가 있다. 아래 그림과 같이 특정 파라미터 값에 따라 하강한 위치가 틀려 질 수 있다. cost 함수를 최소값을 찾는 것인데, 잘 못된 곳으로 내려가면 해당 값이 최소인것으로 오인할 수 있다. 


- 하강의 스텝(learning rate, 얼마의 보폭으로 하강하는지 정도)은 알파이다. 

- 하강의 방향(direction)-기울기-는 미분(derivative)으로 계산한다.

- starting point가 틀리면 도착한 지점이 틀리게 나왔다. 



- 수학적으로 Gradient descent algorithm을 사용한다. 

   알파: Learning rate * 미분계수

   := 대입기호, = truth assertion

   temp0, temp1을 구한다음 세타0, 세타1에 대입한다. 







미분계수를 이용한 Gradient Descent 알고리즘 이해 


함수의 tanzent값을 구함. 즉, 기울기를 구함. 


- 세타1이 최소값보다 클때 미분계수에 의한 탄젠트 기울기값은 양수이다. 

- 세타1이 최소값보다 작을때 미분계수에 의한 탄젠트 기울기값은 음수이다. 




- 알파(learning rate)에 따라 하강 step이 정해진다.

  + 알파값이 작으면 최소값을 찾는데 느리고

  + 알파값이 크면 최소값을 못 찾고 멀어진다. 




- 하강 기울기가 줄어들 때마다 세타1의 값이 점점 작아진다. 이것은 공식에서 세타1 - 알파*미분계수(기울기 slop값) 을 빼주기 때문에 가능하다. 알파값은 상수 유지 가능.

- J(세타1) 이라는 cost function 그래프에서 미분계수값이 최소가 되는 곳의 세타1의 값을 알 수 있다.

즉, 미분계수 0을 찾는게 목적이다. 


세타1 := 세타1 - 알파 * 0 







비용함수와 기울기 하강 함수를 같이 사용하기


Gradient Descent 알고리즘과 비용 함수 J(세타1, 세타2)




- 좌측 좌표가 가운데로 하강을 할 수록 기울기가 점점 변경된다. 선형 회귀는 항시 하나의 최적값을 갖는 밥그릇의 Convex(볼록) 모양을 갖는다. 




결론 Cost function j의 해답을 얻기 위해 하강 기울기 알고리즘을 사용한다. 






Gradient Descent for Linear Regression


선형 회귀의 경우 새로운 형태의 Gradient Descent방정식이 도출된다. 

 - m: training set 사이즈

 - 세타0: 초기시작값 - 상수

 - 세타1: 기울기값 - 변경값 

 - xi, yi: training data set



Gradient Descent 식에 J(세타)즉 cost founction을 넣어서 식을 간략히 하면 다음과 같이된다. 





참조


posted by peter yun 윤영식

앤드류응 교수님의 코세라 강좌를 정리한다. 





Supervised Learning


지도학습과 자율학습에 대한 개념이해 


지도학습

- 정답을 주고 학습

- regression과 classification이 있음

- regression: 여러 개 중 하나 

- classification: 0 또는 1

In supervised learning, we are given a data set and already know what our correct output should look like, having the idea that there is a relationship between the input and the output.


Supervised learning problems are categorized into "regression" and "classification" problems. In a regression problem, we are trying to predict results within a continuous output, meaning that we are trying to map input variables to some continuous function. In a classification problem, we are instead trying to predict results in a discrete output. In other words, we are trying to map input variables into discrete categories.


Example 1:


Given data about the size of houses on the real estate market, try to predict their price. Price as a function of size is a continuous output, so this is a regression problem.


We could turn this example into a classification problem by instead making our output about whether the house "sells for more or less than the asking price." Here we are classifying the houses based on price into two discrete categories.


Example 2:


(a) Regression - Given a picture of a person, we have to predict their age on the basis of the given picture


(b) Classification - Given a patient with a tumor, we have to predict whether the tumor is malignant or benign.


예) Housing Prices 예측 - regression 문제



linear regression


training set을 통해 학습 알고리즘을(learning algorith) 적용해서 가설식(hypothesis)을 만든다. 



cost function

- 가설의 정확도를 측정하기 위해 사용한다

- 공식: 가설의 결과값 - 실제값의 제곱의 합 

- 점진적 감소 (gradient descent)를 위해 1/2를 사용한다. 

- 정확도 측정 J 함수를 얻음.




 세타0을 값 zero로 놓고 간략히 표현한 수식

-  x 값을 줄 때 시작점 세타0과 기울기 세타1의 상수 값을 찾아야 한다. 

- 비용함수인 J(세타0, 세타1)에서 세타0 을 zero로 놓으면 시작점이 zero부터 시작해서 비용함수 J(세타1)을 구하는 것이다. 





- J 공식 결과가 0 이면 가장 작은 비용을 들인 경우이다. 이때 J(세타1)에서 세타1의 값이 1일 때 비용이 전부 0으로 나온다. 



- 만일 세타1값이 0.5라면 cost function 처리 값은 다음과 같이 0.58이 나온다. 



- 음수의 영역을 이동하면 cost function 은 가설값 - 실제값의 제곱의 합이므로 다음과 같이 등고선 그래프가 나온다. 





등고선 그래프로 세타0, 세타1 눈으로 확인하기 


등고선을 입체적으로 보면 다음과 같다. 

- 수평선은 세타1, 세타0 이다.

- 수직선은 cost function의 결과값 J(세타0, 세타1) 이다.

세타1=기울기, 세타0은 시작점



이것을 다시 평면으로 H(x) 와 비교하기위해 평면 등고선을 가지고 눈으로 세타0, 세타1의 값을 가지고 가설의 선을 검증할 수 있다. 

예1) 같은 등고선에 있는 3개의 x는 값은 높이 값, 즉 비용함수 결과값을 갖는다. 이것을 h(x)상에 세타0, 세타1을 이용해 그리면 다음과 같이 나온다. 

데이터셋과 h(x) 선의 거리가 전혀 맞아 들어가지 않아 가설 선이 맞지 않음을 알 수 있다. 


예2) 좀 더 중심으로 이동한 빨간색 x는 등고선에서 세타0=360, 세타1=0 값을 가즌다. 이를 세타1=기울기, 세타0은 시작점으로 보면 h(x)는 수평선이 나온다. 이동 실 데이터의 거리값이 작지 않음을 보여준다.



중심으로 이동할 때 다음과 같이 최적의 가설 세타0과 세타1을 얻을 수 있다. 

세타0 = 250

세타1 = 0.12







Unsupervised

자율학습

- 확인된 답을 제공하지 않음 

   예) 고객이 어디 고객군에 속하는지 알 수 없다. 천문학등

- clustringr과 non-clustering 

Unsupervised learning allows us to approach problems with little or no idea what our results should look like. We can derive structure from data where we don't necessarily know the effect of the variables.


We can derive this structure by clustering the data based on relationships among the variables in the data.


With unsupervised learning there is no feedback based on the prediction results.


Example:


Clustering: Take a collection of 1,000,000 different genes, and find a way to automatically group these genes into groups that are somehow similar or related by different variables, such as lifespan, location, roles, and so on.


Non-clustering: The "Cocktail Party Algorithm", allows you to find structure in a chaotic environment. (i.e. identifying individual voices and music from a mesh of sounds at a cocktail party).





참고


- 앤드류 응교수님의 머신러닝 강좌

- 회귀 분석 예제

- 선형 회귀 분석 데이터 이해



posted by peter yun 윤영식
2018.07.13 16:10 Deep Learning/NN by Sung Kim

Q Network 강좌를 정리한다. 





Q Network 개념


실제 문제를 풀어가기에는 Q Table 구성 사이즈가 너무나 크다. 따라서 Network을 구성해서 푼다. 주어진 입력, 출력을 사용자가 조절하면서 State, Action주어 원하는 Output을 얻어낸다. 적은 table을 사용해서 원하는 결과를 얻어내는 것 



Gym Game에서 출력을 Action 4개로 보면 다음과 같다. 


상태만 주고 모든 가능한 액션을 얻어내자. 앞으로 아래 모델을 사용한다. 



 

비용에 대한 최소화를 공식화 하면 

- W: Weight, 

- y: 실제값

- cost: 비용




목표는 Optimal Q인 Q* 즉, y값을 구한다. Ws는 네트워크가 만들어낸 Q prediction이라 할 수 있다.  




Q hat을 붙이면 hat이 prediction을 의미한다. "시타 = 세타"를 weight 이다. 




이 알고리즘을 문장으로 풀어쓰면

- 초기 weight을 random하게 준다.

- 첫번째 상태를 준다. @(s) == 파이(에스) - one hot을 해준다.

- E-greedy를 사용해 가장 좋은 action을 취한다.

- 결과로 상태랑 reward를 준다.

- 학습을 한다. 


해당 알고리즘은 deep mind의 핵심 알고리즘이다. 코드화 하면



다음으로 학습을 시킨다. 



Yj값으 두개인데, Done이면 Rj이고, 중간 진행은 Rj + rmaxxQ(@=1,a:세타)이다. 

Q Network의 결과는 Q Table 보다 성능이 안좋다. 이를 좀 더 빠르게 할려면?

diverge(다이버즈): 분산되어 결과가 안 좋다의 뜻






DQN 개념 


강화학습의 가장 중요한 알고리즘이다. (강좌) 두가지 큰 문제는 2가지 이다. 



  - 샘플데이터간의 correlation: 샘플이 다양하지 않고 연관성(correlation)이 있다.   

  


  - target이 흔들린다. target은 Y Label 이다. 예) 화살을 쏘자 과녁이 움직이는 경우




DQN의 3가지 솔루션


1) Go deep

네트워크가 깊게 갈 수록 좋다. 


2) Experience replay

action의 state를 buffer에 저장한후 사용한다. D = buffer

 


buffer에서 random하게 가져오면 sample의 correlation을 해결할 수 있다. 



3) non-stationary targets 

타겟이 움직인다. 세타 Weight을 update하면 target도 움직인다. Target의 세타를 그대로 둔다. 두개의 Network에서 첫번째 Network에서 target을 가져와서 두번째 Network에서 사용한다. 




2015년 Deep Mind가 Nature에 연재한 논문 알고리즘






참조


- 김성훈 교수님의 Q Network 강좌

- 김성훈 교수님의 DQN 강좌

'Deep Learning > NN by Sung Kim' 카테고리의 다른 글

[Reinforcement Learning] Q Network  (0) 2018.07.13
[Reinforcement Learning] 강화학습  (0) 2018.07.12
[RNN] Basic & Training 하기  (0) 2018.07.11
[RNN] Recurrent Neural Network 개념  (0) 2018.07.11
[CNN] Class, tf.layers, Ensemble  (0) 2018.07.11
[CNN] MNIST 99% 도전  (0) 2018.07.11
posted by peter yun 윤영식
2018.07.12 16:36 Deep Learning/NN by Sung Kim

강화학습 강좌를 정리한다.





RL 개념


환경(세상, Environment)에서 행동하는 액터(Actor)는 환경속에서의 상태가 변경됨. 매순간마다 잘했다 못했다는 보상(Reward)을 줌.

- 1997년 Tom Mitchell 나온 이야기이다. 

- 2013, 2015년에 부활함: 벽돌깨기 게임에서 사용




옛날 게임에 적용해서 학습해 보니 reinforcement learning이 사람보다 더 잘하더라~~~. 알파고가 deep-reinforcement-learning 사용한다. 

- 빌딩 에너지 관리

- 로보틱스

- 투자

- E-commerce 추천

- 광고 ads


Q = r + Q 수학 기본을 사용한다. Tensorflow/Python으로 실습가능 






OpenAI GYM Games


Agent가 움직이고, 상태와 보상을 받는다. gym 환경을 별도 제공한다. 




gym 코드






Q Learning


RL의 핵심이다. 

입력

  - 내가 있는 상태

  - 이런 행동을 할려고 합니다.

    Q(s, a) => s-state, a-action

출력

  - Q가 결과를 내줌




Optimal Policy = 파이*별표

Q가 있다고 가정했지만 Q를 어떻게 학습할 것인가가 중요 사항임.



==> r + maxQ(s1, a1)

r: reward

max: argmax

Q

s: state

a: action




Q값이 학습을 통해서 다음과 같이 생긴다. 



전체 Q 알고리즘 정리하면

- 그림처럼 Q(s,a) 테이블을 만들고 0으로 초기화 한다.

   

- state s 상태를 가져온다. 

- 끝날때까지 무한 반복하면서 action을 취하고 reward를 받으면서 S -> S1(prime)으로 이동한다. 

- Q 학습이 진행된다. 



r: 현재의 reward 값

maxQ(s1,a1): 다음에 얻을 수 있는 최고의 reward 값



Tensorflow 구현 코드 


-  Q table초기화: np.zeros

- env.reset() 현재의 상태값

- while not done 돌며 끝날때 까지 Q Learning(학습) 수행






Exploit vs Exploration


Exploit: 현재 있는 값을 이용한다.

Exploration: 모헙을 해본다.

예) 평일에는 가던곳을 하고 주말에는 안가보던 곳을 모험해 본다. 



E-greedy: exploration의 정도

Discounted future reward: 감마(0.9) 를 곱하여 미래의 reward를 줄여서 계산한다. 


Tensorflow code







참조


- 김성훈교수님의 강화학습 강좌

- 김성훈교수님의 Q Learning 강좌

- OpenAI GYM 설명

- 강화학습 이해하기

'Deep Learning > NN by Sung Kim' 카테고리의 다른 글

[Reinforcement Learning] Q Network  (0) 2018.07.13
[Reinforcement Learning] 강화학습  (0) 2018.07.12
[RNN] Basic & Training 하기  (0) 2018.07.11
[RNN] Recurrent Neural Network 개념  (0) 2018.07.11
[CNN] Class, tf.layers, Ensemble  (0) 2018.07.11
[CNN] MNIST 99% 도전  (0) 2018.07.11
posted by peter yun 윤영식
2018.07.11 17:13 Deep Learning/NN by Sung Kim

RNN Basic 강좌를 정리한다. 






RNN Basic


cell단위로 다루어 Tensorfllow 코딩으로 OUTPUT이 다시 INPUT으로 들어오게 한다. 

- xxxRNNCell 의 output 사이즈를 정해주고 cell을 만든다. 

- cell을 dynamic_rnn에서 cell을 실제 구동시켜본다. 


cell 학습: BasicRNNCell, BasicLSTMCell등을 바꾸어 사용할 수 있다.








Cell 만들기 



문자를 one hot encoding 을 이용해 vector로 표현한다. 

- input dimenstion

- hidden size를 우리가 정하기 나름에 따라 정해질 수 있다. 

위 두가지는 cell을 만들 때 정의하는 것이다. 




Tensorflow로 표현한다. 

- BasicLSTMCell 사용

- outputs, states를 얻음 

hidden_size 2여서 값은 2개의 shape 가 나온다. 






Unfold 풀어놓기


이것을 풀어서 (unfold) 보자.

- sequence_length 5는 unfold 5개 한다는 것이다. 입력데이터의 모양에 따라 결정된다. 



Tensorflow에서 h, e, l, o에 대한 변수를 만들어 np.array([h, e, l, l, o]..)를 생성한다. dimenstion 2개인 5개 output이 나옴. 이것은 입력을 줄 때 어떤 Shape이 나오는지 출력해 본 것이다. 







Batch Size 만들기



문자를 다양하게 주어 (Batch Size)를 여러개 넣어서 만들어 본다. 




Tensorflow 코드 






Hi Hello Training 시키기


h를 입력하면 다음은 i 나옴을 학습시킨다. 




훈련시킬 단어: "hihello" 에서 Unqiue한 Vocabulary를 만든다. 문자열에 대해 index를 표현한다. 해당 index를 one hot encoding으로 변환한다.



여기서 다음을 정한다.

- 입력 차원

- Sequence 갯수

- 출력(hidden) 차원

- Batch size 정하기 




Creating NN Cell 


cell의 size는 출력값 5로 정한다. 

- rnn_cell.BasicRNNCell(rnn_size)

- rnn_cell.BasicLSTMCell(rnn_size)

- rnn_cell.GRUCell(rnn_size)




RNN Parameters


output from the LSTM : hidden_size = 5 

one-hot size : input_dim = 5

one sentence : batch_size = 1

/ihello/ == 6 : sequence_length = 6



Data Creation 




Feed to RNN


None은 batch가 많아도됨을 의미. cell을 만들고, batch_size주고, dynmaic_rnn을 호출한다. 


Cost: sequence_loss


얼마나 Output이 정확한가를 sequence_loss를 사용하여 예측을 해본다. 예측값이 얼마나 좋은지를 loss값으로 알 수 있다. 



모델을 만든다. 


지금은 output을 간단히 logits에 넣어서 사용한다. 실제는 이렇게 사용하진 않는다. 


Training을 시킨다. 





결과


prediction한 charactor에 대해 시간이 지날 수록 그 다음 문자에 대한 예측(prediction) 이 높아진다. 





참조


- 김성훈 교수님의 RNN Basic 강좌

- 김성훈 교수님의 RNN Training 강좌

- RNN Basic, LSTM 이해

'Deep Learning > NN by Sung Kim' 카테고리의 다른 글

[Reinforcement Learning] Q Network  (0) 2018.07.13
[Reinforcement Learning] 강화학습  (0) 2018.07.12
[RNN] Basic & Training 하기  (0) 2018.07.11
[RNN] Recurrent Neural Network 개념  (0) 2018.07.11
[CNN] Class, tf.layers, Ensemble  (0) 2018.07.11
[CNN] MNIST 99% 도전  (0) 2018.07.11
posted by peter yun 윤영식
2018.07.11 15:43 Deep Learning/NN by Sung Kim

RNN 기본 강좌를 정리한다. 






RNN 개념


음성인식, 자연어 같은 Sequence data일 경우 처리 네트워크

- 이전의 결과가 다음 series에 영향을 미쳐야 한다. 



해당 그림을 풀어 놓으면 결과 state가 다음 연산에 영향을 미침. Series data에 적합한 모델




계산식화 하면 

- old state (ht-1) 과 x를 input로 사용하여 new state (ht)를 구한다. 




가장 기초적인 (Vanilla) RNN을 만들때 Wx를 사용한다. tanh는 sigmoid다른 형태이다. 

- ht는 다음 rnn로 넘기는 값

- y는 w x ht하여 값을 구함




Weight값으 전체  cell에 나 똑같은 값을 사용한다.







RNN 예측 사용


예) 예제에서 helo를 넣었을 때 예측으로 hello 라고 예측하는 시스템을 RNN으로 만듦 



- h,e,l,o를 1또는 0값의 벡터로 만들고 이전과 현재를 계산한다. 처음에는 0을 사용한다. 


여기서 y값을 구한다. 

softmax의 label(결과)를 취한다. 두번째 자리는 error가 발생. output layer의 값을 가지고 learning 하고 예측을 한다. 

- language model - 연관 검색어 찾기

- Speech Recognition

- Machine Translation

- Conversation Modeling/Question Answering

- Image/Video Captioning

- Image/Music/Dance Generation



RNN을 어떻게 사용하느냐가 관건이다. 



Multi Layer RNN을 사용할 수도 있다.



RNN에서 Vanilla Model가 복잡하면

- Long Short Term Memory (LSTM)을 쓰거나

- GRU by Cho et al. 2014를 쓸수도 있다.





참조


- 김성훈교수님의 RNN 기본 강좌

'Deep Learning > NN by Sung Kim' 카테고리의 다른 글

[Reinforcement Learning] 강화학습  (0) 2018.07.12
[RNN] Basic & Training 하기  (0) 2018.07.11
[RNN] Recurrent Neural Network 개념  (0) 2018.07.11
[CNN] Class, tf.layers, Ensemble  (0) 2018.07.11
[CNN] MNIST 99% 도전  (0) 2018.07.11
[CNN] Tensorflow CNN 기본  (0) 2018.07.11
posted by peter yun 윤영식
2018.07.11 15:08 Deep Learning/NN by Sung Kim

Class, tf.layers, Ensemble 강좌를 정리한다.




Python Class로 관리하기 


파이썬의 클래스로 만들어 사용하자. 복잡한 layer를 만들 때 사용하자.



예제

class Model:


    def __init__(self, sess, name):

        self.sess = sess

        self.name = name

        self._build_net()


    def _build_net(self):

        with tf.variable_scope(self.name):

            # dropout (keep_prob) rate  0.7~0.5 on training, but should be 1

            # for testing

            self.keep_prob = tf.placeholder(tf.float32)


            # input place holders

            self.X = tf.placeholder(tf.float32, [None, 784])

            # img 28x28x1 (black/white)

            X_img = tf.reshape(self.X, [-1, 28, 28, 1])

            self.Y = tf.placeholder(tf.float32, [None, 10])


            # L1 ImgIn shape=(?, 28, 28, 1)

            W1 = tf.Variable(tf.random_normal([3, 3, 1, 32], stddev=0.01))

            #    Conv     -> (?, 28, 28, 32)

            #    Pool     -> (?, 14, 14, 32)

            L1 = tf.nn.conv2d(X_img, W1, strides=[1, 1, 1, 1], padding='SAME')

            L1 = tf.nn.relu(L1)

            L1 = tf.nn.max_pool(L1, ksize=[1, 2, 2, 1],

                                strides=[1, 2, 2, 1], padding='SAME')

            L1 = tf.nn.dropout(L1, keep_prob=self.keep_prob)

            '''

            Tensor("Conv2D:0", shape=(?, 28, 28, 32), dtype=float32)

            Tensor("Relu:0", shape=(?, 28, 28, 32), dtype=float32)

            Tensor("MaxPool:0", shape=(?, 14, 14, 32), dtype=float32)

            Tensor("dropout/mul:0", shape=(?, 14, 14, 32), dtype=float32)

            '''


            # L2 ImgIn shape=(?, 14, 14, 32)

            W2 = tf.Variable(tf.random_normal([3, 3, 32, 64], stddev=0.01))

            #    Conv      ->(?, 14, 14, 64)

            #    Pool      ->(?, 7, 7, 64)

            L2 = tf.nn.conv2d(L1, W2, strides=[1, 1, 1, 1], padding='SAME')

            L2 = tf.nn.relu(L2)

            L2 = tf.nn.max_pool(L2, ksize=[1, 2, 2, 1],

                                strides=[1, 2, 2, 1], padding='SAME')

            L2 = tf.nn.dropout(L2, keep_prob=self.keep_prob)

            '''

            Tensor("Conv2D_1:0", shape=(?, 14, 14, 64), dtype=float32)

            Tensor("Relu_1:0", shape=(?, 14, 14, 64), dtype=float32)

            Tensor("MaxPool_1:0", shape=(?, 7, 7, 64), dtype=float32)

            Tensor("dropout_1/mul:0", shape=(?, 7, 7, 64), dtype=float32)

            '''


            # L3 ImgIn shape=(?, 7, 7, 64)

            W3 = tf.Variable(tf.random_normal([3, 3, 64, 128], stddev=0.01))

            #    Conv      ->(?, 7, 7, 128)

            #    Pool      ->(?, 4, 4, 128)

            #    Reshape   ->(?, 4 * 4 * 128) # Flatten them for FC

            L3 = tf.nn.conv2d(L2, W3, strides=[1, 1, 1, 1], padding='SAME')

            L3 = tf.nn.relu(L3)

            L3 = tf.nn.max_pool(L3, ksize=[1, 2, 2, 1], strides=[

                                1, 2, 2, 1], padding='SAME')

            L3 = tf.nn.dropout(L3, keep_prob=self.keep_prob)


            L3_flat = tf.reshape(L3, [-1, 128 * 4 * 4])

            '''

            Tensor("Conv2D_2:0", shape=(?, 7, 7, 128), dtype=float32)

            Tensor("Relu_2:0", shape=(?, 7, 7, 128), dtype=float32)

            Tensor("MaxPool_2:0", shape=(?, 4, 4, 128), dtype=float32)

            Tensor("dropout_2/mul:0", shape=(?, 4, 4, 128), dtype=float32)

            Tensor("Reshape_1:0", shape=(?, 2048), dtype=float32)

            '''


            # L4 FC 4x4x128 inputs -> 625 outputs

            W4 = tf.get_variable("W4", shape=[128 * 4 * 4, 625],

                                 initializer=tf.contrib.layers.xavier_initializer())

            b4 = tf.Variable(tf.random_normal([625]))

            L4 = tf.nn.relu(tf.matmul(L3_flat, W4) + b4)

            L4 = tf.nn.dropout(L4, keep_prob=self.keep_prob)

            '''

            Tensor("Relu_3:0", shape=(?, 625), dtype=float32)

            Tensor("dropout_3/mul:0", shape=(?, 625), dtype=float32)

            '''


            # L5 Final FC 625 inputs -> 10 outputs

            W5 = tf.get_variable("W5", shape=[625, 10],

                                 initializer=tf.contrib.layers.xavier_initializer())

            b5 = tf.Variable(tf.random_normal([10]))

            self.logits = tf.matmul(L4, W5) + b5

            '''

            Tensor("add_1:0", shape=(?, 10), dtype=float32)

            '''


        # define cost/loss & optimizer

        self.cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(

            logits=self.logits, labels=self.Y))

        self.optimizer = tf.train.AdamOptimizer(

            learning_rate=learning_rate).minimize(self.cost)


        correct_prediction = tf.equal(

            tf.argmax(self.logits, 1), tf.argmax(self.Y, 1))

        self.accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))


    def predict(self, x_test, keep_prop=1.0):

        return self.sess.run(self.logits, feed_dict={self.X: x_test, self.keep_prob: keep_prop})


    def get_accuracy(self, x_test, y_test, keep_prop=1.0):

        return self.sess.run(self.accuracy, feed_dict={self.X: x_test, self.Y: y_test, self.keep_prob: keep_prop})


    def train(self, x_data, y_data, keep_prop=0.7):

        return self.sess.run([self.cost, self.optimizer], feed_dict={

            self.X: x_data, self.Y: y_data, self.keep_prob: keep_prop})








Layer API


conv2d: convolution layer

dense: fully conntected

예제








Ensemble 사용하기 


여러개를 조합해서 조화롭게 만든다. 여러개의 독립된 Model을 training시키고, 각 예측을 조합하여 최종 결과를 만든다. 





Ensemble Training 하기


- Model을 만든다

- 각각의 독립된 Model 을 꺼내와서 학습을 시킨다. 




각각의 합치는 것으로 조화롭게 만들어 본다.  결과 중 가장 높은 값을 선택한다.




Tensorflow 코드에서 prediction은 최종 결과의 값들이다. 정확도가 0.9952 까지 올라간다. 







참조


- 김성훈 교수님의 Class, tf.layers, Ensemble 강좌

'Deep Learning > NN by Sung Kim' 카테고리의 다른 글

[RNN] Basic & Training 하기  (0) 2018.07.11
[RNN] Recurrent Neural Network 개념  (0) 2018.07.11
[CNN] Class, tf.layers, Ensemble  (0) 2018.07.11
[CNN] MNIST 99% 도전  (0) 2018.07.11
[CNN] Tensorflow CNN 기본  (0) 2018.07.11
[CNN] Convolution Neural Network  (0) 2018.07.10
posted by peter yun 윤영식
2018.07.11 14:53 Deep Learning/NN by Sung Kim

MNIST 99% 도전 강좌를 정리한다. 






Simple CNN Tensorflow 코딩


Convolution Layer 2개와 Fully-conntect Layer를 코딩한다. 




Conv layer 1 만들기


- 784 개 값을 가진다. None 은 n개 이미지

- reshape 28x28x1로 만듦

- X image가 입력

- filter 3x3x1 로 하고, 32개 filter를 만듦

- filter의 stride 1 로 한다. 

- L1  출력은 input image사이즈가 동일하게 나옴 (padding SAME)

- relu 통과 시킨후 max_pooling한다. 2 stride 여서 최종결과는 14x14x32 로 나옴



Conv layer 2 만들기 


- 14x14x32 최종결과를 입력으로 사용한다.

- 64 개 filter를 사용한다. 1 stride 사용

- relu 사용하고 max_pool통과 한다. 2 stride 이므로 size는 7x7x64가 된다. 

- Fully conntected 넣기 전에 reshape 한다. 최종 3136 개가 된다.  





Fully Connected (FC, Dense) Layer 만들기 


- hypothesis를 만든다. 




학습(Learning) 시키고 테스트하기 


- 에폭(epoch) 단위로 학습 

- cost, optimizer를 수행

- 0, 1을 true, false로 나누어 계산

- 정확도: 0.9885







더 많은 Conv Layers


Conv layer 3개 FC 2개를 사용한다. 




- 정확도: 0.9938 로 높아진다. 

- dropout은 학습시 0.5~0.7 로 테스트시에는 1로 해야 한다. 






참조


- 김성훈교수님의 MNIST 99% 도전 강좌

posted by peter yun 윤영식
2018.07.11 14:31 Deep Learning/NN by Sung Kim

Tensorflow CNN 기본 강좌를 정리한다. 





CNN 정리


Image와 Text 인식에 특출하다

- Convolution layer를 만들고

- pool sampling을 하고 

- 특징을 뽑아내고 (feature extraction)

- FF 로 classification 한다. 



예) 3x3x1 image에서 2x2x1 filter 로 맨뒤 이미지와 같은 색 1을 갖는다. filter가 stride가 움직이며 1개의 값을 뽑아낸다. ]






Tensorflow 코드 이해


[1, 3, 3, 1] : 맨 앞은 한개의 이미지만을 사용하겠다. 3x3x1 의 image를 시각화 하면 imshow를 사용해 만들 수 있다. 



이것을 Simple Convolution layer로 만들어 시각화 하면

- filter size만큼 안에 있는 것을 더 함.




- stride가 1만큼 움직이며 다음 값을 더 함. 




Convolution을 직접 그리지 않고 Tensorflow 수식으로 표현할 때 conv2d를 사용한다.







Padding


SAME: convolution layer를 실제 image와 같은 사이즈가 되게 만든다.  즉, INPUT과 OUTPUT size를 같게한다. 



Tensorflow로 구현하면 



Filter를 여러개 사용할 경우, 1장의 image로 부터 3장의 filter 이미지가 나온다. 







Max Pooling


데이터를 줄여서 sub sampling을 하는 것이다. max_pool을 사용한다. max_pool이 CNN가 잘 동작한다. 







실제 이미지로 테스트 하기 


데이터를 읽어오고, 28x28 사이즈의 image를 읽는다. 



Convolution Layer를 만든다. 

-  -1은 n개의 image 읽음. 3x3 filter size, 5개 filter 사용, 2 stride, SAME padding

- filter 5개 이므로 이미지가 5개 이다. 2 stride 여서 결과는 14x14 이다.




max pooling을 수행한다. 14x14에 대한 2 stride를 하면 결과는 7x7이 나온다. 이미지가 sub sampling되어 이미지 해상도가 떨어져 있다.






참조


- 김성훈교수님의 Tensorflow CNN 기본 강좌

'Deep Learning > NN by Sung Kim' 카테고리의 다른 글

[CNN] Class, tf.layers, Ensemble  (0) 2018.07.11
[CNN] MNIST 99% 도전  (0) 2018.07.11
[CNN] Tensorflow CNN 기본  (0) 2018.07.11
[CNN] Convolution Neural Network  (0) 2018.07.10
[Neural Network] Softmax에 NN 적용하는 순서 팁  (0) 2018.07.09
[Neural Network] 종류  (0) 2018.07.09
posted by peter yun 윤영식
2018.07.10 16:56 Deep Learning/NN by Sung Kim

Convolutional Neural Network 강좌를 정리한다.





Convolutional Neural Network


하나의 입력이 계속 여러개인 경우는 fully Connected Network 이고 여러 입력 Layer를 가지고 있는 경우를 CNN이라 한다. 



CNN은 고양이가 이미지를 받아들이는 것이 한조각씩 나누어서 인지하고 이것을 합치는 실험에서 출발한다. 





CNN 처리과정


일정 부분을 처리하는 것을 filter라 부른다. 예로 32x32x3 image를 5x5x3 사이즈로 필터링한다. 그러면서 이 작은 이미지를 전체 이미지를 이동하며 Wx+b를 수행한다. 



이것을 이동해 가는 것을 그림으로 그려본다. 한칸을 Stride라고 한다. 2 stride는 두칸이 이동함을 의미한다. 



CNN을 사용할 때는 pad(모서리) 라는 개념을 사용함. 7x7 에 패딩을 줌으로 9x9가 된다. 하지만 INPUT과 OUTPUT은 7x7로 같아진다. 







Max Pooling 


pool을 sampling이라고 보면된다. 


각 한 Layer에 대해 크기를 줄여서 sampling한다. max pooling은 layer안에서 가장 큰값을 고르는 것이다. 



CONV -> ReLU -> POOL ==> 최종: FC (Fully Connected Layer)




ConvNet 활용 예


라쿤 교수의 LeNet




AlexNet


처음  ReLU사용 in ImageNet



GoogLeNet


2014년에 시도 



ResNet


2015년에 나옴. 많은 대회를 휩쓸면서 최강좌 자리차지함. 152 Layer를 사용한다. Fast Forward를 사용하여 학습하는 Layer를 줄여줌.





2014년 Yoon Kim 


Text에 대한 Classification이 가능해짐




그리고 CNN을 사용한 DeepMind사의 알파고가 있다. 





참조


김성훈교수님의 CNN 소개 강좌활용 예 강좌

ConvNetJS 데모를 통해 시각화



'Deep Learning > NN by Sung Kim' 카테고리의 다른 글

[CNN] MNIST 99% 도전  (0) 2018.07.11
[CNN] Tensorflow CNN 기본  (0) 2018.07.11
[CNN] Convolution Neural Network  (0) 2018.07.10
[Neural Network] Softmax에 NN 적용하는 순서 팁  (0) 2018.07.09
[Neural Network] 종류  (0) 2018.07.09
[Deep Learning] Dropout 과 앙상블  (0) 2018.07.09
posted by peter yun 윤영식
2018.07.09 17:27 Deep Learning/NN by Sung Kim

NN의 MNIST 98% 이상 올리기 강좌를 정리한다. 





일반 Softmax MNIST 예


정확도: 0.9035

softmax에 대한 개념 정리를 참조하면 Softmax는 결과 Label을 모두 합치면 1되도록 0과 1사이의 값으로 나오게 한다. 확률(Probability) 의미








일반 Softmax를 NN으로 구성하기 


정확도: 0.9455

Neural Network Layer를 3단 정도 구성해 준다. 이때 ReLU를 사용한다. 






Xavier사용한 초기화 잘 하기


정확도: 0.9783

샤비어(Xavier)를 적용한다. 구글 검색 "Xavier Initialization Tensorflow" . Xavier를 쓰면 처음부터 Cost값이 상당히 낮다. 이것은 초기값을 잘 썼음을 나타낸다. 


모델은 바꾸지 않고 초기값만 바꾸었을 때의 비교






깊고 넓게 적용할 때 Dropout 사용하기


정확도: 0.9804

깊게 사용시 중간의 값을 더 많이 쓴다. Overfitting이 발생할 수 있으므로 Dropout으로 이를 예방한다. 한 Layer에 대해 Dropout을 한다. 

dropout하지 않고 깊고 넓게 했을 때, 정확도가 0.9783보다 낮게 나온다. 네트워크가 깊어지면 학습된 것을 모두 기억해서 나중에 overfitting을 일을킬 수 있다. 이경우는 정확도가 낮아져서 Overfitting된 것이다. 



dropout시 몇 %를 Keep (학습 내용을 기억)할 것인지 - keep probability - 은 0.5~0.7 을 사용한다. 단, 테스트할 때는 1을 사용한다. 







Adam Optimizer 사용하기


기존은 GradientDescentOptimizer를 사용하였다. 여러 종류의 Optimizer가 있다.



ADAM이 Cost를 빠르게 감소시켜준다. 



공식






결론


최근은 입력값을 Normalization을 잘 하는 것도 사용한다. 



CNN을 사용하게 되면 Accuracy가 99%까지 올라간다. 






참조


- 김성훈교수님의 NN의 98% 정확도 올리기 강좌

- Xavier Initialization Tensorflow 구글 검색 첫번째

- Softmax 정리글 (강추)

posted by peter yun 윤영식
2018.07.09 16:45 Deep Learning/NN by Sung Kim

레고처럼 넷트웍 모듈 만들기 강좌를 정리한다. 





Fast Foward


이전 Layer의 결과를 n layer 앞읠 input값으로 사용한다. 예) 2015년도 Image Net




Split & Merge


나누어서 합치거나, 처음부터 나누어서 나중에 합침등





Recurrent network


밑에서 위로 가면서 옆으로도 확장됨



오직 개발자의 상상력으로 CNN, RNN, FF등을 사용하여 NN을 구축해서 할 뿐이다.





참조


- 김성훈교수님의 네트웍 모듈 만들기 강좌

- Machine Learning 용어 정리

posted by peter yun 윤영식
2018.07.09 16:33 Deep Learning/NN by Sung Kim

Dropout과 앙상블 강좌를 정리한다. 





Overfitting의 제거


데이터를 꼬부리는 것: 아는 것을 넣었더니 accuracy가 0.99 였지만 한번도 못지 못한 것을 넣을 때 accuracy가 0.85로 낮으면 이것을 overfitting되었다고 한다.



Training Accuracy와 Weight n layer 관계도 


overfitting이 되면 layer가 늘어날 수록 training은 잘되는 것 같지만 일정 시점에 test dataset의 정확도는 떨어지고 있다. 




Overfitting 제거 방법


- 학습데이터를 더 많이 사용한다.

- Regularization을 사용한다. W의 제곱의 최소화 => L2 Regularization


- Dropout: Neural Network 에서 사용하는 방법, 그만두기(Dropout), 학습시에 Neural Network을 끊어버리자. Random하게 어떤 뉴런들을 제거하고 나머지를 가지고 훈련시킨다. 그리고 최종적으로 dropout시킨 것을 다 사용해 예측한다. (상당히 잘 된다.)


수식을 사용하면 다음과 같다.

- 훈련시에만 dropout_rate을 주고, 테스트/평가 시에는 1로 주어야 한다.






Ensemble (앙상블, 언셈블)


여러 모델을 만들어 보고 이것을 합친다. 성능향상을 높일 수 있다. 실전에서 앙상블 모델을 사용하면 좋다.

 






참조


- 김성훈교수님의 Dropout과 앙상블 강좌

- Ensemble Concept

posted by peter yun 윤영식
2018.07.09 15:54 Deep Learning/NN by Sung Kim

Weight 초기화 잘하기 강좌를 정리한다. 





Deep Network의 문제점


- sigmoid를 ReLU(렐루)로 변경

- weight(초기) 값을 잘 못 사용하고 있다. 


sigmoid를 사용할 때 layer가 깊어져도 cost가 전혀 줄어들지 않았다. 

- 주의: 0 값은 절대 주지 말아야 한다.







RBM (Restricted Boatman Machine)


Hinton교수가 2006년 논문(A Fast Learning Algorithm for Deep Belief Nets) 에서 초기값을 잘 구하는 RBM을 소개함.

- forward: x (입력)값을 통해 w, b를 구한다

- backward: 생성된 w, b를 거꾸로 계산한다.

=> forward, backward의 결과를 보고 Weigth을 조정한다. 즉, Weight값을 학습을 통해 적절한 Weight값을 구한다.

 



Deep Belief Network


이전과 다음 Layer마다 RBM을 이용해 Weigth을 구하여 Multi Layer를 구성하 것을 Deep Belief Network이라고 한다. 

- RBM통해 Weight값 얻는 Training을 Fine Tunning이라고 부른다.


RBM 보다 더 간단한 초기화가 나옴. 



Xavier Initialization (샤이버)


- fan_in/2를 하면 쉽게 더 좋은 weight값을 얻을 수 있다.


정확도(Accuracy) 비교  테이블


- 최기화 메소드 쓰기

- ReLU 쓰기

등의 2가지 문제가 해결되었다. 







참조


- 김성훈교수님의 Weight 초기화 잘 해보자 강좌

- 다른 강좌 정리 블로글

- ReLU 소개 



posted by peter yun 윤영식
2018.07.09 14:46 Deep Learning/NN by Sung Kim

TensorBoard 사용하기 강좌를 정리한다





TensorBoard 사용하기 


5개의 step 을 거친다. 

1) 어떤것을 로깅할 것인지 정한다

2) all summary

3) summary 기록할 파일 위치 지정

4) session.run 실행

5) 별도 터미널에서 tensorboard --logdir=<지정폴더> 수행




Scalar (스케일러)





Histogram 

다차원 텐서의 경우 사용함. 



Graph

흐름도를 보고 싶을 경우 사용함.

- name_scope 사용하여 Layer를 구분하여 보기 좋게 한다. (접혔다 폈다 할 수 있음)




remote에 있는 tensorboard 보기





Multi run 하기 

부모 폴더만을 지정하면 child folder를 자동으로 보여줌 







9 Layer Tensorboard 구성시 문제점 


Deep Network을 다음과 같이 구성하고 Learning을 시킨 것이 Deep Learning이다. 



name_scope로 구분하여 Tensorboard에 표현 (강좌)

deep network를 구성할 때 코드로만 보면 어려울 수 있다. 이것을 시각화하여 다음과 같이 표현한다. 




결과 : 서로의 연결과 가중치(Weight)를 쉽게 볼 수 있다. 



9 layer를 거친다고 해서 정확도가 높아지는 것은 아니다. 2,3 layer는 잘 학습이 되지만 3 layer넘어가면 학습도가 떨어진다. 

이유: 결과의 1보다 작은 소숫점의 값을 multiply할 수록 더 작은 소숫점 값이 되어 버려서 gradient값이 살라진게 된다. 





Network으로 표현하면 좌측으로 갈 수록 점점 정확도가 떨어짐. 2006년까지 겨울이 찾아옮.

- 힌튼교수가 해결: Sigmoid를 잘 못 쓴것 같다. 

- ReLU를 적용해 보자. 








ReLU (Rectified Linear Unit, 렐루)


힌트 교수의 잘 못한 부분중 4번째 




ReLU 사용


- z값이 커질수로 1보다 작다라는 sigmoid를 0보다 커질 수록 갈 때까지 커진다.

- 대신 0보다 작으면 무조건 0이 된다. 


Sigmoid 대신 relu를 사용한다. 수식으로 표현하면 하고 앞으로 neural network에서는 최종 Layer를 빼고 hidden부분은 sigmoid를 사용하지 않고 relu를 사용해야 한다. 




9 layer의 relu와 sigmoid 사용 예




Activation Function

sigmoid와 relu등을 activation function이라고 하는데 다른 것들도 있다.

- sigmoid

- ReLU

- Leaky ReLU: 0이하일 때 약간 값을 살려줌

- ELU: 0이하일 때 원하는 값으로 살려줌

- Maxout



비교하면 LeRU 계열의 정확도가 높다.






참조


- 김성훈교수님의 TensorBoard 사용 강좌

- 김성훈교수님의 Backpropagation (chain rule) 희석 강좌

posted by peter yun 윤영식
2018.07.06 17:54 Deep Learning/NN by Sung Kim

미분 정리하기 강좌를 정리한다. 





미분


아주 작은 값을 대입하여 순간변화율을 구하는 것이다. 변화율은 기울기로 표현할 수 있다. 미분은 Gradient Descent에서 필수적인 공식이다.



편미분 (Partial derivative)


내가 관심있는 값은 미분하고 나머지는 상수로 치환하여 계산한다. 



- 상수 함수 미분하면 = 0

- 2x 는 x + x 이고 x를 각각 미분하면 각각 1 + 1 = 2가 됨

- x + 3 은 1 + 0 이므로 1이다. 


Chain rule에서 x가 f에 영향을 미치는 값을 알고 싶을 경우 미분으로 표현한다. 

 





참조


- 김성훈교수님의 미분강좌

- 칸아카데미의 Chain rule 강좌를 참조하자

posted by peter yun 윤영식