728x90

1. Vectorization

파란색 박스까지만 취급을 한다면 빨간색 벡터처럼 나온다. 즉, 1번 loss, 2번 loss,.., n번 loss를 벡터화된 모습일 것이다. 이때 cost는 어떤 역할을 할까?

forward 일때는 평균값을 구하여 스칼라값이 나오고, backward일때는 1/n값이 아래처럼 계산 될것이다.

각 loss들에 대해서 1/n씩 곱해진다. n=10이면 1/10씩 각 loss에 곱해진다.

data의 값이 크면 loss도 크기 때문에 위에 그림 세타5처럼 튀는 값이 생길수 있다. 이러한 큰 수의 data를 이상치라고도 불리는데 FE과정에서 이상치를 제거하기도 한다. 하지만 무조건 제거하는 건 좋지 않다. 왜냐하면 소수의 case를 제거 하는 것과 마찬가지이기 때문이다. 가장 best 모델은 이상치를 포함한 (학습 방해가 되지 않는 선에서) 전 범위를 커버 할수 있는 것이다. 따라서 cost를 사용하면 위 그림의 초록색 세타 처럼 협의점?을 활용하여 제거 없이 학습을 시킬수 있다.

만일 배치 사이즈가 위 예시처럼 5개 아닌 더 많을 경우엔 어떻게 해석을 해야 할까? 각 data 마다 loss값으로 업데이트하게 되면 누구 장단에 맞춰야 할지 몰라서 예측 선이 분주하게 증감을 반복 할것이다. 반면 배치사이즈가 8이라고 한다면 모든 데이터가 납득할만한 예측선을 찾아서 학습 시킬 것이다. 즉, 데이터의 특성들을 반영한 예측선이 나오게 된다. 하지만 local optimal 빠질수도 있기 때문에 마냥 배치사이즈를 늘리는게 좋은건 아니다. 단지 늘릴수록 dataset의 전반적인 특성을 따라간다 라는 의미이다.

 

*Numpy 계산

backpropagation 연산은 numpy가 이용된다. numpy는 Hadamard Product를 이용한다. hadamard는 element-wise 해주는 방법이다. 이에 대해 조금 자세히 알아본다.

왼쪽은 기존에 알고 있던 방법인 matrix Multiplication이다. B 매트릭스는 대각성분만 남기 때문에 오른쪽 b벡터같이 표현이 가능하게 된다. 그래서 a벡터 O b벡터를 hadamard 이용하면 그림과 같이 표현이 가능하다.

왼쪽과 오른쪽의 결론이 같으면서 hadamard 연산이 간결함을 한눈에 알수가 있다. 이러한 원리가 backpropagation 에서 사용이 되는 것이다. 아래 그림은 적용한 모습이다.

*벡터로 연산되는 과정보기

x_data,y_data 각 100개를 한번에 넣어서 계산 했을때의 과정을 본다

1)forward

2)backward

one sample의 빨간박스 dth은 스칼리였기 때문에 바로 lr을 곱해도 되었지만 vetorized samples은 데이터가 복수개 이므로 dth을 싹다 더한 다음에 lr을 곱해줘야 한다.(각 loss들에 대한 편미분 값을 모조리 더함)

 

2. batche gradiant methods

미니배치가 정해지면 네트워크를 통해 세타가 한번 업데이트가 된다. 이를 1iteration이라고 부르고, 이런 과정을 통해 전체 데이터가 한번돌아갔다면 1epoch라 부른다. 이때 batch사이즈를 어떻게 조정하느냐에 따라 여러 테크닉 이름으로 불린다.

 

2-1. batch gradient descent method

전체 dataset을 한번에 이용하는 것이다. 즉, 미니배치를 전체 데이터로 이용한 것이다.

전체 데이터를 X,Y에 받아 놓고(굳이 객체를 따로 생성 안해도된다) forward 및 backward를 진행한다.

1epoch마다 전체 dataset이 사용되므로 스무스한 감소를 보인다. 즉, dataset 전체의 특성을 반영한다.

 

2-2. stochastic gradient descent method

mini-batch size=1로 설정한 방법이다. 요즘에는 1로 학습하는 경우가 거의없다.

윗 부분은 without replacement 비복원 방법일 채택한 경우이다. 데이터 하나를 뽑고 interation 돌린 뒤에, 뽑았던 데이터를 제외한다. 반대로 replacement 방법은 뽑았던 데이터를 다시 포함시키는 방법이다. 이때 주의할점이 있다. epoch은 전체 데이터가 한번씩 돌렸을때 1epoch이라 한다. 이런 측면에서 비복원은 epoch이라 말할수 있다. 반면 복원은 같은 데이터가 또 뽑힐 수가 있기 때문에 전체 데이터가 한번씩 interation 했다고 확신할 수가 없게 된다 따라서 복원은 epoch이라는 명칭 대신 interation이라 말한다. 그래서 아랫부분 2번을 보면 for iteration이라고 적혀있다.

 

*without Replacement

epoch을 돌릴때마다 셔플을 해줘야 오버핏팅, 반복적인 같은 패턴의 학습을 지양할수 있다.

데이터를 하나씩 뽑기 때문에 loss에 대한 fluctuation이 심하다. 왜냐면 데이터의 크기에 따라 loss도 비례하기 때문이다. loss가 많이 잡히는 곳은 그만큼 세타에 많이 업데이트가 되므로 기울기 경사가 급해진다.

 

*Replacement

random.choice를 사용하여 0~99번 인덱스 중 하나를 뽑아서 forward 및 backward를 진행한다. 전체 데이터를 한번씩 사용 못하므로 epoch 대신 iteration으로 표현했다.

 

2-3. mini-batch gradient descent method

mini-batch size=n로 설정한 방법이다. 적당한 n개를 적용하며 이 또한 without replacement, replacement로 나눌수 있다.

*without Replacement

if 절에 있는 것은 100개 데이터를 16개씩 쪼갠 후 마지막 나머지 4개를 사용하기 위함이다.

loss 그림에서 같은 형태의 fluctation이 있다. 랜덤셔플을 이용하지 않았기 때문에 미니배치가 순서대로 반복학습이 일어나서 저러한 형태를 보인다. 이는 학습 시 좋은 모습이 아니므로 랜덤 셔플을 이용하는게 좋다.

랜덤셔플을 추가 한 후 loss 그래프를 보면 반복되는 형태가 사라졌다.

*Replacement

복원방식이므로 epoch가 빠졌다. random.choice는 batch_size 만큼 뽑아서 각 데이터에 적용한다.

 

*실습과제

PA_03_09 Stochastic Gradient Descent Method.ipynb
0.09MB

 

728x90

+ Recent posts