cs [COURSERA] Deep Neural Networks with PyTorch by IBM 강의 리뷰 3-1
본문 바로가기
  • 매일 한걸음씩
  • 매일 한걸음씩
개발/Deep Neural Networks with PyTorch 리뷰

[COURSERA] Deep Neural Networks with PyTorch by IBM 강의 리뷰 3-1

by 시몬쯔 2020. 3. 29.
728x90
반응형

본 포스팅은 2주차의 3.1-3.3 강의에 대한 리뷰이다.

(lab 실습 내용을 기준으로 포스팅하다보니 강의 번호와는 차이가 있을 수 있다.)

 

3.1 Linear regression 1D: Training Two Parameter Stochastic Gradient Descent (SGD)

 

앞에서부터 계속해서 언급해왔던 Gradient Descent에 관한 내용이 나온다.

학부 때부터 계속 들어서 익숙한 method인데 들어가기 전에 대략적으로 살펴보자.

 

iterative하게 local minimum을 구하는 알고리즘 중 하나로 미분값을 이용해야 하므로 미분가능한 함수에 한해 사용한다. local maximum을 찾는 방법으로 gradient ascent도 있다.(단순히 부호만 바꾸면 됨)

Gradient descent는 수학 전공생이라면 누구나 아는 Cauchy에 의해 제안되었다.

Gradient descent는 steepest descent라고도 불린다. 근데 적분을 예측하는 method of steepest descent와는 다르다!

 

  • Make Some Data
  • Create the Model and Cost Function(Total Loss)
  • Train the Model : Batch Gradient Descent
  • Train the Model : Stochastic Gradient descent
  • Train the Model : Stochastic Gradient descent with Data Loader

1) Make Some Data

먼저, 언제나와 같이 torch를 import하고 그림을 그리는데 필요한 matplotlib.pyplot와 numpy를 import 해주자.

 

또 plotting을 3차원으로 해주는 mpl_toolkits에서 mplot3d또한 import 해준다.

 

random seed를 설정해주고,

-3부터 3까지의 0.1간격으로 데이터 X를 만들고 열을 갯수를 1로 맞춘다.

이에 대응하는 데이터 f는 X-1로 설정한다.

 

Y는 f에 노이즈를 더한 것!(분산을 0.1로 함)

 

그래프를 그려보면 이런식으로 된다.

 

2) Create the Model and Cost Function (Total Loss)

 

forward 함수는 weight w, bias b를 가지고 있는 y = w*x + b 형태이고 criterion은 MSE loss를 뜻한다.

 

3) Train the Model: Batch Gradient Descent

 

weight, bias를 정의하고,

 

learning rate와 loss를 저장할 리스트도 만들어둔다.

 

train_model을 정의한다. 앞 포스팅과 같기 때문에 설명은 생략한다.

 

 

4) Train the Model: Stochastic Gradient Descent

 

각 data x,y에 따라 weight를 업데이트하는 SGD방법이다.

 

 

3) SGD with Dataset DataLoader

 

위에선 X와 f를 직접 만들어 training했는데 이제 DataLoader를 통해 data를 불러와서 training해보자.

위에서와 같이 x는 -3부터 3까지 0.1간격의 데이터이고 y는 x-1의 형태이다

getitem은 각 index에 해당하는 x, y데이터를 return하고 len는 데이터 길이를 return한다. 여기서는 60

(Dataset를 상속받아 class를 작성하려면 반드시 get item과 len method를 만들어야 한다.)

 

-3부터 3까지 0.1간격이므로 총 60개 데이터임을 알 수 있다.

 

이제 DataLoader를 이용하여 training에 필요한 data를 load하는 trainloader를 만든다.

 

batch_size는 각 iteration에서 몇 개의 데이터를 쓸 지를 말한다.

위에서 dataloader를 사용하지 않고 zip을 이용해 x,y를 각 뽑아냈던 것과는 달리 여기서는 새로 만든 trainloader를 이용하여 x, y를 뽑아낸다.

 

epoch = 10으로 하여 돌려보자.

 

.

.

.

.

 

시간이 지남에 따라 graph가 우리가 원하는 데이터(빨간점들)로 수렴하고 loss 함수 또한 최소값으로 가는 것을 확인할 수 있다.

 

Q. 여기서 왜 iteration이 600번까지 진행했을까?

우리는 stochastic gradient descent를 했기 때문이다. 현재 batch size를 1로 설정했으므로 각 iteration에 1개의 데이터를 이용하여 parameter(w,b)가 업데이트되고 데이터는 60개이다. 그리고 epoch를 10번으로 설정했으니 총 600번의 iteration을 거친다. 즉 1epoch를 하려면 60번의 iteration을 거친다. 이것이 (batch) gradient descent와 stochastic gradient descent의 차이이다.(batch gradient descent에서는 1 epoch = 1 iteration 이였다.)

 

batch gradient descent에 비해 파란선이 iteration에 따라 변동이 큼을 알 수있다.

(데이터 1개가 그 iteration의 weight update를 담당하기 때문에 그 데이터에 영향을 많이 받는다.)

 

 

 

3.2 Linear Regression 1D: Training Two Parameter Mini-Batch Gradient Decent

  • Make Some Data
  • Create the Model and Cost Function ( Total Loss )
  • Train the Model : Batch Gradient Descent
  • Train the Model : Stochastic Gradient Descent with Dataset DataLoader
  • Train the Model : Mini Batch Gradient Descent : Batch size equals 5
  • Train the Model : Mini Batch Gradient Descent : Batch size equals 10

1)-4)는 3.1의 내용과 겹치니 5)부터 하겠다.

 

5) Train the Model : Mini Batch Gradient Descent : Batch size equals 5

 

 

epoch 10로 돌려보자. 위의 설명에서는 10 iterations으로 되어있는데 잘못된 표현이다.

Q. 여기서 iterations은 총 몇 번일까?

batchsize = 5이고 데이터 수 = 60 epoch = 10이다.

정답은 60/5 * 10 = 120이 된다. 

즉, iterations 수 = data 수 / batch size * epoch 수 가 됨을 알 수 있다.

 

 

.

.

.

 

여기서는 13번을 간격으로 그래프를 그리는데 점점 데이터에 맞게 함수가 수렴하고 loss 또한 최소값으로 수렴함을 확인할 수 있다.

 

 

6) Train the Model : Mini Batch Gradient Descent : Batch size equals 10

 

batch size를 10으로 했을 때는 어떨까?

iterations수를 계산해보면 60/10 * 10 = 60번이라는 것을 알 수 있다.

 

이제까지 수집한 loss로 그래프를 그려보면,

 

각 epoch에 따른 loss를 그린 것이다. batch size = 5로 했을 때 가장 먼저 loss function이 작게 나오는 것을 알 수 있다.

위의 주황선인 stochastic gradient descent 즉 batch size = 1일때는 batch size =10일 때보다도 느리게 loss가 줄어드는 것으로 보아 최적의 batch size를 찾는 것 또한 중요함을 알 수 있다.

(batch size 와 learning rate등을 hyper parameter라 하는데 validation set으로 정한다. 그에 대한 내용은 다음 포스팅에서...)

 

 

 

3.3 Linear Regression 1D: Training Two Parameter Mini-Batch Gradient Descent 

 

2) Create the Model and Cost function the PyTorch way

 

 

torch로 부터 neural network nn와 optimization optim를 import한다.

class linear regression을 만드는데 반드시 상속 클래스 nn.Module을 써줘야 한다.

 

언제나와 같이 MSE loss를 사용하는데 nn를 import 했기 때문에 torch.mean을 이용하여 직접 MSE를 정의하지 않아도 된다.

 

이제 linear regression model를 만들어보자.

input 과 output size를 모두 1로 하여 만든다

또한 optim 패키지에 SGD가 있기 때문에 optim.SGD와 같이 간단하게 써줄 수 있다.

만들어준 model의 parameter를 list로 만들어 확인해보면 w와 b가 random 하게 설정되어있음을 확인할 수 있다.

 

여기서 주의할 점은,

 

optim.SGD(model.parameters(), lr = 0.01)와 같이 optim를 이용할 때 parameter를 넘겨줘야 한다는 것이다.

여기서의 model.parameters()는 위에서도 보았듯이 w와 b이다.

 

model의 parameters를 넘겨 만든 optimizer에 .state_dict()를 이용하여 살펴보면 param_groups에 learning rate, momentum등이 있다. regularization과 같은 것에 이용되는 사항들이다. momentum과 weight decay에 대해서는 알지만 나머지는 더 알아봐야 할 것 같다.

 

batch size = 1로 trainloader를 만들어 본다.

위에서 model.state_dict()했을 때 random하게 만들어진 w,b를 확인했는데

random 하게가 아니라 정해주고 싶으면 model.state_dict()를 이용하여 바꿔줄 수 있다.

 

이제까지 만든 criterion, optimizer를 이용해 train model를 정의한다.

 

w.data = w.data - lr.~~와 같이 직접 gradient descent식을 쓰지 않아도 optimizer.step()를 이용해서 weight를 update할 수 있다.

batchsize = 1로 한 SGD이므로 itertation은 총 600번이다

 

Training 후에 weight와 bias를 확인해보면,

1과 -1에 가까운 값이 나오는 것을 알 수 있다.( f = 1*X - 1로 설정하고 약간의 noise를 더했었음)

 

위  train model에 대해 부연설명을 붙이자면,

 

x를 model에 넣어 yhat이 나오고(forward 함수 이용) -> 이 yhat과 y를 criterion에 넣어 loss를 구한다. 이 loss를 줄이는 방향으로 loss.backward()를 통해 gradient값을 구하고 -> optimizer.step()를 이용해 파라미터를 업데이트 -> 이 업데이트된 파라미터로 된 함수(forward)에 다시 x넣음 -> 반복....

 

여기서 또다시 optimizer 설정시 왜 model.parameters()를 넣어야 하는지 확인할 수 있다.

어떤 model의 paramter를 최적화해야하는지에 대한 정보가 필요하기 때문이다.

 

오늘의 포스팅은 여기까지!

 

 

다음포스팅은 3.6 Linear regression: Training and Validation Data에 대해 다룰 예정이다.

(Hyperparameters에 관한 내용이 나온다.)

 

728x90
반응형

댓글