Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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
Tags
more
Archives
Today
Total
관리 메뉴

네박자대로

[모두의 딥러닝2] 3Lab. Simple linear regression 본문

딥러닝 공부

[모두의 딥러닝2] 3Lab. Simple linear regression

ysyang 2022. 7. 19. 11:54

https://youtu.be/TvNd1vNEARw

 

지난 시간 배웠던 simple linear regression을 tensorflow를 활용하여 직접 코드로 작성해보는 수업이다. 

 

여기서 잠깐!

본 강의는 tensorflow와 pytorch로 나누어 실습 수업을 진행하는데, 둘의 차이는 무엇일까??

 

 

 

 

 

 

 

[딥러닝 프레임워크]

[출처] https://wikidocs.net/156950

텐서플로우와 파이토치 모두 오픈 소스이다.

다만, 텐서플로우는 구글에서 개발했고, 파이토치는 페이스북에서 개발했다. 

 

이 둘의 가장 큰 차이는 "계산 그래프 정의하는 방식"

텐서플로우는 정적 그래프를 생성하지만 (먼저 모델의 전체 계산 그래프 정의 후, ML모델을 실행)

파이토치는 동적 그래프를 생성한다. (동작 중에 그래프를 정의, 조작할 수 있음)

 

아무래도 텐서플로우가 상대적으로 먼저 등장했기 때문에 리소스가 훨씬 많다. 

(그렇다고 텐서플로우가 더 우수한 것이 아님)

 

 

둘의 상세한 비교는 웹상에 많지만, 일단 강의 영상이 짧고 이미 어느 정도 익숙한 텐서플로우를 선택했으므로

텐서플로우를 조금 더 자세히 들여다보도록 하자.

 

 

 

 

 

 

 

 

 

[TensorFlow란?]

구글에서 만든 딥러닝 라이브러리로, C++로 구현되어 있으며 다양한 언어 지원하기는 하지만 파이썬을 최우선으로 지원.

Tensor란 딥러닝에서 데이터를 표현하는 방식이다.

Tensor는 matrix로 표현할 수 있는 2차원 형태의 배열을 고차원으로 확장한 다차원 배열이다. 즉, matrix의 집합.

(무슨 말인지 이해가 안가므로 예시를 통해 살펴보도록 하자)

 

 

[출처] https://rekt77.tistory.com/102

 

[출처] https://rekt77.tistory.com/102

 

 

 

 

 

 

 

 

 

[Hypothesis and Cost]

 

지난 시간 살펴봤듯이, hypothesis와 cost 공식은 위와 같다. 

이를 코드로 나타내려면 어떻게 할까?

 

x_data = [1,2,3,4,5]

y_data = [1,2,3,4,5]

가 있다고 할 때, 이에 따른 hypothesis가 되는 선형방정식을 구해보자.

(사실 암산으로 y=x 임을 알 수는 있지만, 이보다 더 복잡하고 많은 데이터들 사이의 선형식은 더 이상 암산으로 구할 수 없다)

 

weight와 bias는 일단 임의로 정해준다. 

이 때 적절한 값으로 초기화해주지 않으면 overfitting / underfitting 혹은 local minimization 문제를 겪을 수 있다.

덧붙여 bias는 보통 작은 값으로 초기화하는데, 예전엔 0.01 등의 값으로 초기화 했다면, 요즘은 훈련기법의 발전 덕에 0으로 초기화해도 문제가 없다고 한다. (https://deepestdocs.readthedocs.io/en/latest/002_deep_learning_part_1/0025/)

 

최적의 가중치로 초기화하는 기법들이 있으나, 이번 시간에는 임의의 실수로 초기화하도록 하겠다. 

(weight = 2.9, bias = 0.5 초기화)

 

 

※잠깐!

cost함수에서, 평균과 제곱에 대한 함수가 왜 굳이 tf.reduce_mean(), tf.square()일까??

 

이 연산이 tensor, 그러니까 n차원의 matrix끼리의 연산임을 잊지말자.

reduce_mean() 이란 사용자 지정에 맞게 차원을 축소하며 평균을 구하는 함수이다.

square() 은 matrix 요소끼리 제곱할 수 있게 해주는 함수이다. 

 

 

 

 

 

 

 

 

 

 

 

[Gradient descent _ 경사하강법]

cost를 minimize하는 기법에 대해서는 다음 강의에서 살펴볼 것이므로, 이번 실습에는 대략 이해하고 넘어가도록 하자.

 

경사하강법은 학습 시 사용하는 optimizer (최적화 방법) 중 하나이며, 

다음과 같은 과정을 통해 비용을 최소화하는 지점을 찾아나간다.

[출처] 핸즈온 머신러닝 2판

 

그렇다면 이러한 알고리즘을 tensorflow에서는 어떻게 구현하느냐?

tf.gradientTape를 이용한다.

= 자동 미분 해주는 API로, 자동 미분이란 결국 gradient를 계산한다는 것이다. 

 

그렇다면 tape 변수는 뭐냐? 

tf.gradientTape 안에서 실행된 모든 연산을 기록한 변수다. 

 

[출처] https://junstar92.tistory.com/148

tape.gradient(reg_loss, w)는 cost를 w에 대해 미분한 값, tape.gradient(reg_loss,b)는 bias에 대해 미분한 값이다.

이 과정이 epoch 1사이클이다. 

 

 

최종 코드는 다음과 같다.

 

 

 

90epoch 돌며 학습했을 시 w,b 결과 변화

Comments