TigerCow.Door


안녕하세요. 문범우입니다.

오늘은 ReLU(Rectified Linear Unit)에 대해서 알아보겠습니다.


* 해당 포스트의 모든 내용은 김성훈 교수님의 '모두를 위한 딥러닝'을 바탕으로 제작되었습니다.

관련한 상세 내용은 아래 링크를 참고해주세요.

https://hunkim.github.io/ml/




1. NN for XOR


우리가 지난 시간에 XOR문제를 위와 같은 모델로 하여 풀이를 진행해보았습니다.

실제로 텐서플로우를 이용하여 구현해보기도 하였습니다.

그때 각 유닛의 결과에 우리가 Sigmoid 함수를 붙여서 결과값이 0~1이내로 출력되게 했었습니다.



이러한 Sigmoid함수를 activation function 이라고 합니다.

각 모델들에게 어떤 값을 보내게 될 때 일정값 이상이면 active되게 하고 그렇지 않으면 active하지 않게 하기 때문에 주로 그렇게 불린다고 합니다.


그리고 우리는 아래와 같이 각각의 W, b를 만들고 layer를 이용하여 2단의 네트워크를 만들었습니다.


그럼 3단을 가진 네트워크는 어떻게 할까요?

당연히 2단때와 같이, 쉽게 구현할 수 있습니다.

이때, 제일 처음이 layer를 input layer라고 부르며, 가장 바깥쪽(마지막)에 있는 layer를 output layer라고 부릅니다. 그리고 그 사이에 있는 layer들을 hidden layer라고 합니다.


그럼 더 깊게 한번 만들어볼까요?

hidden layer가 9단이 되게끔 구현해보도록 하겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
W0 = tf.Variable(tf.random_uniform([2,5], -1.01.0), name = 'weight0')
 
W1 = tf.Variable(tf.random_uniform([5,5], -1.01.0), name = 'weight1')
W2 = tf.Variable(tf.random_uniform([5,5], -1.01.0), name = 'weight2')
W3 = tf.Variable(tf.random_uniform([5,5], -1.01.0), name = 'weight3')
W4 = tf.Variable(tf.random_uniform([5,5], -1.01.0), name = 'weight4')
W5 = tf.Variable(tf.random_uniform([5,5], -1.01.0), name = 'weight5')
W6 = tf.Variable(tf.random_uniform([5,5], -1.01.0), name = 'weight6')
W7 = tf.Variable(tf.random_uniform([5,5], -1.01.0), name = 'weight7')
W8 = tf.Variable(tf.random_uniform([5,5], -1.01.0), name = 'weight8')
W9 = tf.Variable(tf.random_uniform([5,5], -1.01.0), name = 'weight9')
 
W10 = tf.Variable(tf.random_uniform([5,1], -1.01.0), name = 'weight10')
 
b0 = tf.Variable(tf.zeros([5]), name = 'bias0')
 
b1 = tf.Variable(tf.zeros([5]), name = 'bias1')
b2 = tf.Variable(tf.zeros([5]), name = 'bias2')
b3 = tf.Variable(tf.zeros([5]), name = 'bias3')
b4 = tf.Variable(tf.zeros([5]), name = 'bias4')
b5 = tf.Variable(tf.zeros([5]), name = 'bias5')
b6 = tf.Variable(tf.zeros([5]), name = 'bias6')
b7 = tf.Variable(tf.zeros([5]), name = 'bias7')
b8 = tf.Variable(tf.zeros([5]), name = 'bias8')
b9 = tf.Variable(tf.zeros([5]), name = 'bias9')
 
b10 = tf.Variable(tf.zeros([5]), name = 'bias10')
 
L1 = tf.sigmoid(tf.matmul(X, W0) + b0)
L2 = tf.sigmoid(tf.matmul(L1, W1) + b1)
L3 = tf.sigmoid(tf.matmul(L2, W2) + b2)
L4 = tf.sigmoid(tf.matmul(L3, W3) + b3)
L5 = tf.sigmoid(tf.matmul(L4, W4) + b4)
L6 = tf.sigmoid(tf.matmul(L5, W5) + b5)
L7 = tf.sigmoid(tf.matmul(L6, W6) + b6)
L8 = tf.sigmoid(tf.matmul(L7, W7) + b7)
L9 = tf.sigmoid(tf.matmul(L8, W8) + b8)
L10 = tf.sigmoid(tf.matmul(L9, W9) + b9)
 
hypothesis = tf.sigmoid(tf.matmul(L10, W10) + b10)
cs


위와 같이 hidden layer가 총 9단이 되도록 구현해보았습니다.

그리고 텐서보드를 이용하기 위해서는 추가적으로 name_scope를 사용하면 됩니다.


그리고 이러한 모델을 실제로 훈련시키고 결과를 확인해보면 다음과 같습니다.

Accuracy 가 0.5가 나왔습니다.

왜그럴까요?

우리가 지난번에 했을때보다 더 깊고, 더 넓게 훈련을 시켰는데 오히려 더 좋지 않은 결과가 나와버렸습니다.



2. Vanishing Gradient


우리가 지난 시간에 알아본, backpropagation에 대해서 다시한번 살펴보도록 하겠습니다.


우리가 위와 같은 구조를 공부했었는데, 이때 backpropagation에서 chain rule을 사용한다고 했었습니다.

지난 포스트에서 알아본것에 따르면, 빨간 동그라미, dg/dx = y의 값을 갖게되고 이에 따라 df/dx = df/dg * dg/dx = df/dg * y 가 됩니다.

근데 이때 y가 어떤 값을 가질지 한번 살펴볼까요?

y가 input layer가 아니었다면, 다른 유닛에 통과하고 sigmoid 함수를 통과했을 것입니다. 그럼 우리가 정확한 y의 값을 알지는 못해도 sigmoid 함수의 특성때문에 0~1사이의 값을 갖는다고 생각할 수 있습니다.

그럼 이때 y의 값이 예를 들어 0.01정도라고 생각해보겠습니다.

이렇게 된다면, 다시 올라가서 df/dx = df/dg * 0.01 이 됩니다.


이렇게 되는 것의 단점이 무엇이냐면, 결국에 값들이 sigmoid 함수를 지나게 되면서 그 값이 1보다 작게 되며 경우에 따라서는 굉장히 0에 가까운 값들이 계속 곱해지게 됩니다.

그러면 결국적으로 굉장히 작은 값을 갖게 됩니다.


즉, 그렇게 되면 결과 단에서 점점 깊어질 수록 그 영향을 찾기 힘들다, 예측하기 힘들다라는 결론을 가져오게 됩니다.

이런 현상을 Vanishing gradient 라고 합니다.



3. Rectified Linear Unit, ReLU


그리고 Hilton 교수님은, 이러한 현상에 있어서 sigmoid가 잘못되었다라는 것을 찾게되었습니다.

sigmoid함수 때문에 1보다 큰 값을 가지지 못하게 되었고, 이로 인해 layer가 깊어지면서 오히려 그 값이 작아져 영향을 찾기 힘들어지기 때문입니다.

그리고 새롭게 생각한 함수가 ReLu, Rectified Linear Unit 입니다


ReLU 함수는 단순합니다. 입력값이 0보다 작을 때는 아예 non-activate로 꺼버리고, 0보다 클때에는 그 값을 그대로 반환합니다.


이러한 ReLU를 사용하는 방법도 매우 간단합니다.

단순히 우리가 sigmoid를 사용하던 곳에 대신 ReLU를 사용하면 됩니다.

물론 텐서플로우에서도 위와 같이 매우 간단하게 사용할 수 있습니다.


실제로 우리가 위에서 제대로 값을 얻지못한 9단 hidden layer를 가진 모델에서 sigmoid 대신 ReLU를 사용하면 다음과 같은 cost를 가지게 됩니다.


ReLU를 여러번 돌리면서 약간의 차이는 존재하지만, sigmoid에 비해서는 훨씬 더 올바른 학습을 가지는 것을 볼 수 있습니다.

물론, layer에서 제일 마지막에선 sigmoid함수를 사용하여 결과 값이 0~1 사이로 나오게끔 해야합니다.


오늘 우리가 알아본 ReLU 이외에도 아래와 같이 다양한 activation function이 있습니다.



블로그 이미지

Tigercow.Door

Back-end / Python / Database / AI / Algorithm / DeepLearning / etc

댓글을 달아 주세요


안녕하세요.

이번 포스팅에서는 지난 포스팅에 이어, Logistic Regression의 cost함수에 대해 알아보도록 하겠습니다.


* 해당 포스트의 모든 내용은 김성훈 교수님의 '모두를 위한 딥러닝'을 바탕으로 제작되었습니다.

관련한 상세 내용은 아래 링크를 참고해주세요.

https://hunkim.github.io/ml/



1. Logistic Regression의 Cost Function


우리가 지난 Linear Regression에서 Cost 함수에 대해서 이야기 해볼때는 아래와 같은 형태로 나왔습니다.



그래프를 보면 2차함수꼴로 최저점을 보다 쉽게 찾을 수 있었습니다.


그런데 지난 포스팅에서 알아보았듯이 Logistic Regression 에서는 Hypothesis가 다르게 세워졌습니다.

그럼 Cost 함수는 어떻게 될까요?

결론부터 말씀드리면 Cost 함수 또한 다르게 세워야합니다.


Linear Regression에서는 단순한 2차함수로써 우리가 Gradient decent 함수를 통해 최저점을 찾음으로써 cost를 최소화 하는 것이 가능했으나, Logistic Regression에서는 다릅니다.



Logistic Regression에서 우리가 세운 Hypothesis의 그래프는 위의 그래프의 형태를 띄게 됩니다.

그리고 그래프에서 나왔듯이 저러한 형태의 그래프는 Local Minimum(지역 최저점), Global Minimum(전역 최저점)을 가지고 있습니다. 우리가 지난 Linear Regression에서 사용한 Gradient decent를 사용한다면 지역 최저점에 걸려 진짜 최저점인 전역최저점을 찾을 수 없게 됩니다.


따라서 우리는 아래와 같이 새로운 Cost 함수를 정의해야 합니다.



새로운 Cost 함수는, 어떤 것의 평균을 내는데, 하나의 요소에 대한 cost를 산출하는 것에 대해 더 살펴보면, 총 2가지 case로 나눠서 산출합니다. y가 1일때와 0일때로 나누는데 왜 이렇게 할까요?



우리가 정의한 Cost 함수를 살펴보기 위해 아래 그래프를 함께 보도록 하겠습니다.



위의 그래프는 대략적으로 -log(x) 함수의 형태를 가지고 있습니다.


이제 2가지 case로 Cost함수에 대해서 살펴봅니다.

먼저, y = 1일때 입니다. 이때 Cost 함수는 -log(H(x)) 입니다.

이때 우리가 제대로 예측하여, H(x) = 1 값을 갖는다고 생각해봅시다.

그럼 Cost 함수에 대한 결과가 매우 작은 값(거의 0)에 가깝게 나와서 cost가 작게됩니다.

반대로, 우리가 제대로 예측하지 못하여 H(x) = 0 값을 갖는다면

Cost 함수에 대한 결과는 매우 큰값(거의 무한대)에 가깝게 나와서 cost가 매우 크게됩니다.


그리고 같은 방식으로 y = 0 일때를 생각해봅니다. 이때 Cost 함수는 -log(1-H(x)) 입니다.

이때 우리가 제대로 예측하여 H(x) = 0 이라면 

Cost 함수에 대한 결과가 -log(1-0) 으로써 매우 작은 값을 갖게 되어 cost가 작게 되고

우리가 제대로 예측하지 못하여 H(x) = 1이라면

Cost 함수에 대한 결과가 -log(1-1) 으로써 매우 큰 값을 갖게되어 cost가 매우 크게됩니다.


다시 한번 Cost 함수를 확인하면 아래와 같이 식으로써 정의할 수 있습니다.



위의 식들 중 맨 아래 식에서와 같이 y = 1일때와 y = 0일때의 식을 코드에서 if문을 사용하지 않도록 하나의 식으로 나타낼 수 있습니다.

( ylog(H(x))가 아닌 -ylog(H(x))입니다. )


그럼 이제 그 다음 단계인, cost를 최소화 하는 단계입니다.



이는 위에서 우리가 새로운 Cost 함수를 세웠기 때문에 이전과 같이 Gradient decent 알고리즘을 통해 Cost 함수의 최저점을 찾도록 합니다.



이렇게 해서 Logistic Regression에 대해서 알아보았습니다.

다음 포스팅에서는 Multinomial에 대한 개념을 알아보도록 하겠습니다.

블로그 이미지

Tigercow.Door

Back-end / Python / Database / AI / Algorithm / DeepLearning / etc

댓글을 달아 주세요


안녕하세요.

지난 포스팅에서는 single-variable linear regression에 대해서 알아보았습니다.

이번 포스팅에서는 multi-variable linear regression에 대해서 알아보도록 하겠습니다.


* 해당 포스트의 모든 내용은 김성훈 교수님의 '모두를 위한 딥러닝'을 바탕으로 제작되었습니다.

관련한 상세 내용은 아래 링크를 참고해주세요.

https://hunkim.github.io/ml/



1. Linear Regression(선형 회귀)


먼저 지난 포스팅에서 학습했던 내용을 잠깐 살펴보도록 하겠습니다.

지난 포스팅에서는 선형 회귀, Linear Regression을 위해서 Hypothesis와 Cost function, Gradient descent algorithm등에 대해서 알아보았습니다.



먼저 어떤 문제를 다루기 위해 가설, Hypothesis를 세웠고

해당 hypothesis를 검증하는 단계로써 cost function을 통해 cost를 계산하였습니다.

그리고 이때, cost를 최소화 하기 위해 Gradient descent algorithm에 대해서도 알아보았습니다.


이를 통해서 우리는 아래 사진과 같은 하나의 input, 즉 하나의 변수에 대한 문제를 다루었습니다.다.



하지만 실질적으로는 아래와 같이 변수가 다수인, multi-variable에 대한 문제가 존재합니다.



그럼 이러한 것은 어떻게 다루고 처리할까요?

먼저 single-variable에서 다루었던 것처럼 hypothesis와 cost function을 확인합니다.




2. Matrix(행렬)


하지만 위와 같은 식으로 variable을 나열하는데에도 한계가 있을 것입니다.



위의 사진보다도 더 많은 데이터가 있을때는 어떻게 할까요?



바로 Matrix, 행렬을 이용합니다.

행렬이 나와 당황하시는 분들도 있겠지만 여기서 사용되는건 Matrix product, 행렬 곱에 대한 개념입니다.

따라서 행렬 곱에 대한 개념만 아신다면 문제가 없을 것입니다.


그럼 이러한 행렬을 우리에게 필요한 hypothesis에 적용시켜 봅니다.




위의 식과 같이, 단순히 우리가 그전에 배웠던 hypothesis를 행렬로써 나타냅니다.

그럼 이제 실제 데이터와 함께 생각해보도록 합니다.



위의 사진을 보시면 3개의 x 변수가 있고 이에 따른 하나의 y변수가 있습니다.

사진 좌측의 테이블을 보시면 총 5쌍의 데이터를 보실 수 있는데, 이때 하나하나를 인스턴스라고 합니다.

즉, 첫번째 인스턴스는 (73, 80, 75, 152) 인 것입니다.


우리는 이러한 다수의 인스턴스를 행렬에서 매우 심플하게 정리할 수 있습니다.

각각의 인스턴스를 오른쪽의 식에 대입하는 것이 아니라, 아래의 사진과 같이 식을 변형합니다.




위의 사진에서는 모든 인스턴스를 추가하며, w는 그대로 고정하였습니다.

단순히 식으로써 나열하는 것보다 매우 깔끔하고 심플합니다.





즉, 우리는 행렬을 이용한 hypothesis를 위의 사진과 같이 진행하게 됩니다.




다시한번 정리하자면 우리는 이전 포스팅에서 하나의 변수에 대한 hypothesis를 식으로 정리하였습니다.

하지만 행렬을 이용함으로써 multi-variable에서도 매우 간단하게 hypothesis를 나타낼 수 있습니다.



이렇게 해서 multi-variable linear regression에 대해서 알아보았습니다.

실질적인 multi-linear regression의 구현은, 텐서플로우 탭에서 확인하실 수 있습니다.

블로그 이미지

Tigercow.Door

Back-end / Python / Database / AI / Algorithm / DeepLearning / etc

댓글을 달아 주세요