반응형

텐서플로우에서 옵티마징은 보통 예제에는,


gradient decent 알고리즘을 사용하는데, CNN , NN 등에서는 AdamOptimizer를 권장하는군요.


옵티마이징 그래프를 확인해보면, 확실히 성능이 더 좋아 보입니다.



gradient descent : tf.train.GradientDecscentOptimizer

Adam : tf.train.AdamOptimizer

'머신러닝 & 텐서플로 & 파이썬' 카테고리의 다른 글

Tensorflow training을 save하고 restore하는 방법  (0) 2018.03.22
Matplotlib 사용하기  (0) 2018.03.20
Softmax  (0) 2018.01.26
drop out 과 앙상블(ensemble)  (0) 2018.01.26
초기값  (0) 2018.01.26
반응형

softmax 는 multinomial classificatioin 즉, 2개 이상의 data 그룹을 나누기 위한 모델입니다.





'머신러닝 & 텐서플로 & 파이썬' 카테고리의 다른 글

Matplotlib 사용하기  (0) 2018.03.20
adam and gradient descent optimizer  (0) 2018.01.29
drop out 과 앙상블(ensemble)  (0) 2018.01.26
초기값  (0) 2018.01.26
Sigmoid , ReLU  (0) 2018.01.26
반응형

drop out




NN 에서 drop out 기법은 여러 입력 변수들 중에서 일부 뉴런들을 disable 시키고 나머지 내용들로 학습시킵니다.


주의점 : 학습할때만 dropout 시킴!!!!



방법 


dropout_rate = tf.placeholer("float")

_L1 = tf.nn.relu(tf.add(tf.matmul(X,W1), B1))

L1 = tf.nn.dropout(_L1, dropout_rate)




TRAIN:

   sess.run(optimizer, feed_dict={X:batch_xs, Y: batch_ys, dropout_rate:0.7})


EVALUATION:

  print "Accuracy:", accuracy.eval({X: mnist.test.images, Y:mnist.test.labels, dropout_rate:1})





앙상블

똑같은 NN을 여러개 구성 해놓고 같은 training data로 각각의 NN에 트레이닝 시키고 나서

나중에 합치게 되면 성능개선이 3~5% 이상 올라간다.


이유 : W 초기 값이 random이기 때문에 똑같이 구성된 NN이라 하더라도 트레이닝 동작이 달라지게 됨.

이로 인해서 서로 약간씩 다른 결과가 나오는데 이를 합치게 되면 더 많은 traning data로 training한 효과가 나오게 됨.





[김성 모두를 위한 딥러닝 강좌]

https://www.youtube.com/watch?v=wTxMsp22llc&index=32&list=PLlMkM4tgfjnLSOjrEJN31gZATbcj_MpUm


'머신러닝 & 텐서플로 & 파이썬' 카테고리의 다른 글

adam and gradient descent optimizer  (0) 2018.01.29
Softmax  (0) 2018.01.26
초기값  (0) 2018.01.26
Sigmoid , ReLU  (0) 2018.01.26
tensorboard: 학습 모니터  (0) 2018.01.26
반응형

머신러닝에서 초기 weight 값은 매우 중요합니다.

딥러닝 알고리즘들이 발표되고 나서 오랜 기간동안 학습 효율이 안나와서 외면받아왔었습니다.

이렇게 효율이 안나오게 된 이유중 하나가 이 초기 값의 잘못된 설정 때문이었습니다.


그후 여러가지 방식으로 초기값을 결정하려고 하는 노력들이 있었습니다.


Not all 0's

절대로 모든 값을 0을 주면 안된다.



RBM - restriced boltzmann machine

입력 값을 줘서 출력을 만들고 , 출력 레이어에서 입력 레이어 쪽으로 반대로 전달한다.

이렇게 했을때 초기 입력 값과 출력에서 보내서 입력 레이어를 거치고 나온 값이 유사하도록 W값을 조정한다.



PRE-TRAINING

RBM 을 각 레이어별로 계산함..



- 좋은 방식임 -

- 그러나 복잡함.


-------------------------------------


Xavier/He initialization

너무나도 간단한 방식으로 RBM과 유사한 결과를 만들어 낼 수 있는 방법이 생겼습니다.

Simple methods are OK


몇개의 입력인지와 몇개의 출력인지를 보고 이를 비례하게 결정해주면 됩니다.


2010

W = np.random.randn(fan_in, fan_out)/np.sqrt(fan_in)



2015

W  =np.random.randn(fan_in, fan_out)/np.sqrt(fan_in/2)

image net의 오류가 3%로 떨어뜨림.





def xavier_init(n_inputs, n_outpus, uniform=True)

  if uniform:

     init_rangle = math.sqrt(6.0(n_inputs + n_outputs))

     return tf.random_uniform_initializer(-init_range, init_range)

  else

     stddev = math.sqrt(3.0/(n_inputs + n_outputs))

     return tf.truncated_normal_initializer(stddev=stddev)


'머신러닝 & 텐서플로 & 파이썬' 카테고리의 다른 글

Softmax  (0) 2018.01.26
drop out 과 앙상블(ensemble)  (0) 2018.01.26
Sigmoid , ReLU  (0) 2018.01.26
tensorboard: 학습 모니터  (0) 2018.01.26
데이타 프로세싱(data processing)  (0) 2018.01.25
반응형


Sigmoid 함수는 주어진 값을 0~1사이의 값으로 변환 시켜주는 함수입니다.


머신러닝에서 많이 사용하는 함수입니다. 값이 커지거나 작아지거나 할때 가중치가 너무 무리하게 커지는 것을 방지 하기 위한 용도로 사용합니다.


sigmoid 함수 : 

 



입력-- 입력 레이어  -- 히든 레이어 1---- 히든 레이어 2 ------- 히든 레이어 N -- 출력 레이어 -- 출력


레이어 

  x = ax*b 

  x' = sigmoid(x) 


  0<x'<1


아주 많이 사용하는 함수였죠.!!!


그러나 Back propagation 시에 sigmoid 함수를 사용하게 되면, 깊이가 깊은 중첩된 레이어에서는 좋은 결과를 내지 못하게 됩니다.


이유는 sigmoid 함수를 통하게 되면 어떤 값이든 0~1 사이 값이 됩니다.

예를 들면 -10 이라는 결과를 sigmoid를 통과 시키고 나면 0.001 과 같이 0에 가까운 값이 되어 버립니다.

0에 가까운 값이 나오면, 이를 이용해서 어떤 입력에 곱해졌을때 영향이 매우 미미해지게 되죠.



2006년까지 이 문제가 풀리지 않았습니다.


하지만 ReLU의 등장으로 이 문제를 극복해냈습니다.


ReLU

Rectified Linear Unit


알고리즘 : x = max(0, x)


0보다 작은 값은 0

0보다 큰 값은 계속 커짐


큰값, 즉, 영향을 많이 미치는 값은 그 영향력을 그대로 이전 함수에 전달합니다.


ReLU 함수를 사용함으로 해서 영향력이 큰 변수 값들은 계속 다음 레이어에 큰 영향을 미치도록 만들었고,

Back propagation 될때도 변화량이 크게 되어 깊이가 깊은 Deeeeeeeeep learning에서도 좋은 결과를 얻게 되었습니다.




두 함수의 사용법은 아래와 같습니다.


L1 = tf.sigmoid(tf.matmul(X,W1) + b1)   <- sigmoid

L1 = tf.nn.relu(tf.matmul(X1,W1) + b1)   <- ReLU



이외의 다양한 Activation 함수들이 있는데 다음과 같습니다.


Activation Function

Sigmoid

ReLU

Leaky ReLU

ELU

Maxout

tanh



'머신러닝 & 텐서플로 & 파이썬' 카테고리의 다른 글

drop out 과 앙상블(ensemble)  (0) 2018.01.26
초기값  (0) 2018.01.26
tensorboard: 학습 모니터  (0) 2018.01.26
데이타 프로세싱(data processing)  (0) 2018.01.25
머신러닝 : Overfitting (오버피팅)  (0) 2018.01.25
반응형



텐서플로우의 학습 내용을 로그를 통해서 확인하는 것 보다는 그래프와 같은 비쥬얼 툴을 이용해서 확인하는 것이 훨씬 더 효과적일 것입니다.


텐서보드(TensorBoard) 가 이런 면에서는 매우 유용한 툴 입니다.



학습과정에서 모니터링 하고 싶은 값들, 입력, 또는 출력, 등등... 을 그래프로 볼수 있도록 도와주는 툴입니다.


또 텐서플로우 내의 노드들, 텐서들의 graph 들도 GUI적으로 구성해서 볼 수 있습니다.



writer = tf.summary.FileWriter("./logs/xor_logs")


[터미널]

$ tensorboard -logdir = ./logs/xor_logs




리모트 서버에서 텐서플로우를 돌리고 모니터링 할 경우에 텐서보드의 결과를 서버에 접속해서 볼 수 도 있습니다.


ssh -L local_port:127.0.0.1:6006 username@serv.com


remote port: 6006 은 정해져 있는 포트입니다.


local> $ ssh -L 7007:127.0.0.1:6006 myid@277.333.444.555

server> $ tensorboard -logdir =./logs/xor_logs



local PC 에서 http://127.0.0.1:7000 로 접속 (browser)


이렇게 하면 port forward된 서버쪽의 텐서보드가 서버 역할을 하면서 브라우저에 확인할 수 있습니다.


'머신러닝 & 텐서플로 & 파이썬' 카테고리의 다른 글

초기값  (0) 2018.01.26
Sigmoid , ReLU  (0) 2018.01.26
데이타 프로세싱(data processing)  (0) 2018.01.25
머신러닝 : Overfitting (오버피팅)  (0) 2018.01.25
머신러닝 스터디를 위한 youtube 강의  (0) 2018.01.23
반응형

머신러닝에서 경사하강법(gradient decent )이라는 변화량이 최소인 곳으로 이동하면서 트레이팅을 하는 기법이 있는데,

이때 하강 거리? 속도를 조절하기 위해서 learning rate 이라는 것을 사용하게 됩니다.

그런데 이 learning rate이 너무 크게 잡히게 되면, 변화량을 측정할 수 있는 값보다 커지게 되어 원하지 않는 방향으로 벗어나게 됩니다.


그래서 learning rate은 작은 값(적당히 .. 작은... 얼마로 잡아야 하는지는 데이타에 따라 다름)으로 하여야 합니다.



그런데 learning rate과 관련해서 또다른 주의 사항이 있는데,입력된 데이타가 한 방향으로 치우친 경우입니다.

치우쳤다는 표현은, 

예를 들면 2차원 data가 있는 경우에, 이 데이타들이 x축이나 y축 또는 어떤 직선형태로 길게 늘어져 있는 형태로 이뤄져 있는 경우들입니다.


learning rate이 어떤 축으로는 적당하지만 어떤 축으로는 적당하지 않고 너무 큰 값이 되거나 작은 값이 될 수 있습니다.


이경우 정상적인 트레이닝이 이뤄지지 않을 가능성이 생기는 것이죠.


이를 위해 data를 보정이 필요하게 됩니다.



그런 기법중 몇가지를 예로 들어보겠습니다.



중심축 이동 : data가 특정 축에 편중되어있을때, 원점을 중심으로 이동하는 벙법

normalize :  넓게 펼쳐져 있는 값들을 특정 구간으로 비율 변화를 시키는 방법


텐서플로우의 MinMaxScaler : 양 축의 값들을 균등하게 배치하는 방법.








반응형

오버피팅이란 것은 무엇인가?



머신러닝은 학습에 의핸 판단을 하는것입니다. 그래서 학습을 위한 데이타들이 필요하고 이 데이타를 기반으로 판단하게 되는데,

이 학습데이타에 너무 딱 맞게 모델을 설계하게 되면, 학습 데이타 이외의 실제 데이타에서 나쁜 결과가 나오게 됩니다.



오버피팅을 줄이는 방법~


1. 트레이닝 데이타를 많이 가지는것.

2. feature의 개수를 줄이는 방법

3. Regularization



Regularization 은 일반화 시키자는 것.


데이타들을 트레이닝 할때 모델을 결정하는 선들이 구불어지게 되는데,

이 구부러지는 것들을 좀 펼쳐서 처리하는 방법입니다.




L = loss

i = training set

\lambda = regularization strength

               0 이면 일반화 하지 않겠다.

               1 이면 매우 강하게 하겠다.

               0.001 크게 중요하진 않아..



l2reg = 0.001 * tf.reduce_sum(tf.square(W))





layer가 깊을 수록 overfitting 가능성이 커집니다.

이유는 layer 가 깊을수로 변수들이 추가되고 해당 변수들에 가중치가 커지게 되면서 유연성이 떨어지게 됩니다.


+ Recent posts