본문 바로가기

Programming Project/Tensorflow Tutorials

Tensorflow 튜토리얼 04 - Logistic Regression


투명한 기부를 하고싶다면 이 링크로 와보세요! 🥰 (클릭!)

바이낸스(₿) 수수료 평생 20% 할인받는 링크로 가입하기! 🔥 (클릭!)

해당 내용에 대한 개념은 정리하지 않고, tensorflow로 해당 구현을 어떻게 하면 될까 ? 만을 다룹니다 :)

모두를 위한 딥러닝 시즌2 텐서플로 동영상을 참고하여 만든 글임을 밝힙니다.

 

 

로지스틱 리그레션은 주로 분리(구분)되는 데이터에 대해서 사용하고 linear regression은 주로 연속적인 데이터에 사용되게 된다.

시그모이드는 g(z) = 1/(1+e^(-z))

요 위의 g 함수를 의미한다.

 

이 이미지는 linear / non-linear decision boundary에 대한 설명이다. sigmoid는 decision boundary가 linear 인걸 볼 수 있죠?

그럼 tf code에서는 오른쪽의 코드처럼 sigmoid가 0.5를 기준으로 오른쪽 왼쪽으로 나뉘니까 우리도 0.5를 기준으로 참 거짓과 같은 결과를 구분해낼 수 있게 된다. (0.5보다 크면 1 아니면 0)

 

세타는 주로 우리가 선언한 파라미터들(weight)의 집합을 의미하는 기호로써 많이 쓰인다.

 

cost function에 대한 코드는 위와 같이 표현될 것이다.

label이 1이나 0이라는 가정 하에서의 cost 함수이다.

정답이 1인 친구는 hypothesis도 1로 맞춰야 하고 0인 친구는 0으로 맞춰야 한다는 의미로, 정답을 맞추면 cost가 0이고 아니면 cost가 e임을 알 수 있다.

 

 

위는 파라미터 optimization하는 코드이다.

우선 우리가 하고 싶어하는 것이 cost 를 미분한 결과를 가지고 파라미터에 대해서 해당 기울기를 learning_rate(alpha) 만큼 곱해서 cost의 값을 낮추는 것을 목표로 변경해 나간다는 것.

그리고 이를 구현해줄 수 있는 optimizer이라는 것을 선언하게 되면 훨씬 편하게 파라미터를 optimize할 수 있다.

위 코드에서 gradient descent optimizer을 사용하는 방법에 대해 볼 수 있다.

 

gradientTape라는 함수는 가설과 라벨을넣으면 loss가 나오는데 tape.gradient라는 과정을 통해서 loss 값에 대한 파라미터들의 기울기를 알려 주는데에 사용할 수 있는 함수이다.

 

optimizer에 grads (위의 grad 함수의 결과값) 과 함께 모델의 파라미터를 넘겨주면 optimizer을 적용할 수 있게 된다.

 

총 코드를 보면 위와 같이 볼 수 있다. (설명을 위해 간소화)

우선 윗줄부터 차례로 설명하자면 x_train , y_train을 데이터로 삼아서 tf.data.Dataset 라이브러리의 tensor slices로부터 데이터를 불러오는 데이터 로더를 준비하는 과정이다. batch사이즈는 x_train의 사이즈와 일치시킨다.

이제 dataset이라는 변수는 데이터로더가 된다.

그 아래는 W와 B를 선언하는 과정이다.

 

그 아래에는 logistic regression에 대한 함수이다.

내부 코드는 우리의 hypothesis를 구하기 위해 linear function의 결과를 sigmoid함수 안에 넣어주는 과정이다.

 

그 아래에는 loss function인데, hypothesis를 통해서 cost를 구하는 과정이다.

식 자체는 위에서 설명한 그대로이다.

 

그 아래는 grad를 구하는 과정이다.

학습을 위해서 hypothesis와 label이 나오면 우리의 loss값을 구해주고 tape를 통해서 gradient를 리턴해주도록 한다.

 

그 아래 optimizer에 GradientDescentOptimizer을 통해서 learning_rate설정과 함께 optimizer을 선언해준다.

 

기존의 텐서플로우는 그래프라는 것을 그려 넣은 session안에서 실행시켰던 반면, 2.0버전부터는 eager모드를 통해서 바로바로 실행할 수 있게 바뀌었다. 단순히 loop을 돌면서 함수를 호출하는 형태로 바뀌었다.

 

for loop 안에서 epoch만큼 돌리며 학습을 진행할 수 있게 된다.

optimizer.apply_gradients 함수를 통해서 구한 gradient에 대한 적용을 시켜준다. (이전 글의 뺄셈을 직접 안해주고 이제 옵티마이저를 통해서 진행하게 되는 것) W와 b가 업데이트 싹 싹 되는 것.

 

아래쪽에서는 accuracy function 을 통해서 새로운 데이터를 확인할 수 있게 된다.

가설과 함수를 비교할 수 있는 함수이다.

x를 넣었을 때 예측이 0.5보다 크다며는 1 아니면 0이 되는 것.

그래서 마지막으로 equal의 개수를 센 후 맞춘 개수의 평균을 구하면 accuracy가 나오게 된다.

 

(https://github.com/deeplearningzerotoall/TensorFlow에 관련 코드 있음)

 

 

 

 

우리는 이런 것을 했다는 정리 슬라이드이다.

decision boundary로 데이터 종류를 분리하는 것을 볼 수 있다.