728x90

저번 포스팅 딥러닝 수학10에 이어서 포스팅 하겠습니다.

*실습링크

2021.09.04 - [실습 note] - 딥러닝 수학 실습과제 모음 9~12

 

딥러닝 수학 실습과제 모음 9~12

실습파일이 없는 줄 알았는데 있더라구요 그래서 쌓여 있는 실습을 진행했습니다. 각 구분선에 따라 이론내용과 실습을 분리했습니다. 순서는 맨 위부터 아래 순입니다. 2021.08.19 - [Data 일기] - 20

ghdrldud329.tistory.com

 

1. mini batch

3번의 iteration 학습 과정을 보려 봤을 때, 각 cost function에 projection 방향으로 다가가고 있다. interation 돌릴 때마다 cost function이 달라진다는 점 헷갈리지 말아야 한다.

계속 interation 학습과정을 보면 가장 왼쪽의 cost function의 기울기가 급하게 그러져 있다. 즉, 입력 데이터의 크기가 크다는 점을 뜻하게 되고, X 값이 크면 Gradient도 크게 계산되기 때문에 껑충 뛰는 모습을 볼 수 있다. 반대로 가운데 그림의 기울기는 x축과 평행할수록 x의 값이 작아지며 또한 학습 속도가 느리게 된다는 걸 저번 시간에 배웠었다. 따라서 가운데 그림의 학습 속도가 갑자기 느려졌음을 알 수 있다.

빨간색 크로스 되는 지점이 본래의 Opimal point이다. 노이즈가 있기 때문에 빨간색 교차점과 다소 떨어진 곳에 Opimal point가 생긴 것이다. 가장 오른쪽 그림을 보면 빨간색 교차점에 도달했을 때 학습을 멈췄어야 했지만 노이즈가 포함된 optimal point 때문에 아래 방향으로 학습된 걸 볼 수 있다. 만일 노이즈가 더 컸더라면 교차점과의 거리가 더 멀어지기 때문에 결국 학습이 되지 않는다.

batch size 2일 때보다는 전체적으로 안정적인 모습을 가지고 있다. batch size가 커지면서 평균적인 위치를 나타내기 때문에 상대적으로 안정적이다.

32로 설정 시, 위처럼 거의 동글동글한 모양을 취한다. 또한 noise의 효과도 거의 사라졌기 때문에 교차점과 optimal point의 위치가 비슷하게 위치해 있다. 하지만 실제 딥러닝에서 32를 적용하기란 문제가 있다. '복잡한 함수'를 만들지 못하게 된다. 동글동글하게 만들어지는 함수를 추구하기 때문에 적당히 batch size를 줄여 줘야 data sample들에 맞는 gradient를 반영할 수 있다.

noise 효과가 거의 없다시피 학습이 이뤄지고 있는데 실제 딥러닝에서는 noise가 오버 핏팅을 방지 역할을 하기 때문에 noise가 아~주 없는 것도 문제가 될 수 있다.

 

 

 

2. for one sample-Theory

노드들을 활용하여 이론을 정리하는 시간을 가져본다. 하나의 sample에 대해서 진행하기 때문에 cost가 아니라 loss의 forward, backward이다..

bias term을 추가하면 위처럼 표현할 수 있겠다. back propagation은 어떻게 되는지 아래 그림을 통해 알아본다.

bias인 theta0도 학습 대상이기 때문에 BP를 해줘야 한다. Z1과 theta0에 대한 미분 값이 각각 1씩 나왔으므로 위 식처럼 계산이 된다.

실제 숫자를 넣어서 어떻게 적용되는지 알아보자.

노이즈가 없는 dataset y=x+1이 있다고 가정했을 때, 초기값은 각각 0.1로 설정한다. 그럴 때의 Gradient가 그림처럼 표현이 가능한데, 이 gradient의 특징이 data에 따라서 어떻게 변화하는지 확인해 본다.

(1,2)을 넣었을 때 theta0,1의 값이 같고 norm이 5.09이다. x=1이라는 것 theta 0,1이 같은 비율로 학습이 된다는 의미이다. 또한 -3.6 값이 둘 다 값으므로 y=x 방향과 평행하다는 것이다(y=-x와도 평행할 수도 있다) 학습이 균등하게 갈 수 있는 이유가 이 때문이다.

(2,3) 일 경우엔 theta1의 편미분 값이 크게 증가함에 따라 norm길이도 5.09에 비해서 크게 증가했다. 즉 벡터의 길이가 길어졌다는 뜻이며 이는 곧 크게 학습이 되었다는 것과 연결된다.

x가 더욱 증가함에 따라 norm도 증가를 하게 되고, theta1에 지배적인 학습이 이뤄지므로 theta0은 천천히 학습하게 된다.

반대로 X에 1보다 작은 값들을 넣게 되면 어떻게 변하는지 한 번에 보도록 한다.

X값이 점점 줄어들수록 norm길이도 줄어들게 된다.

정리를 하게 되면 X가 1보다 크면 클수록 norm의 길이도 커지기 때문에 지그재그로 학습될 가능성이 크다. 이렇게 되면 norm길이가 커서 학습도 무조건 빨리된다는 보장이 없는 것이다. 지그재그로 이동하기 때문에 학습이 더욱 느려질 수 있다.

반대로, 1보다 작으면 지그재그로 이동하는 건 없지만 norm길이가 짧기 때문에 학습이 굼벵이처럼 느리게 진행된다.

그래서 x=1일 때, 즉 y=x or y=-x 대칭일 때 어느 한쪽으로 쏠리지 않고 공평하게 학습이 이뤄진다(학습되는 비율이 같으므로)

 

 

3. for one sample Implementation

앞서 배운 one sample Theory를 직접 코드를 통해 구현해 보는 시간을 갖도록 한다.

실습을 위해서 y=5x+2의 dataset을 생성해 준다.

각 과정에 맞는 노드를 정의해준다.

 

 

파라미터를 설정한 후 그간의 실습에서 했던 내용과 동일하게 forward, backward를 진행한다. dth1은 x라는 term이 추가로 붙는다는 사실을 잊지 말아야 한다.

 

 

y=5x+2에서 만들어진 데이터를 가지고 th1, th0을 학습한 그래프이다. th1, th0가 각각 5와 2에 잘 수렴되고 있다. 학습 시 이용된 데이터는 평균이 아닌 각각의 데이터를 이용했으므로 loss가 위 그림처럼 파동이 생기면서 학습이 진행된다. 설명을 추가하자면, 큰 데이터가 뽑히면 큰 loss가 생기고 작은 데이터로 학습하면 작은 loss가 생기기 때문에 loss 그래프가 커졌다 작아졌다 반복하면서 학습된다.

이번엔 다양한 input data가 들어왔을 때 어떻게 학습이 되는지 그래프를 통해 알아본다.

 

 

가장 이상적인 상태인 standard normal 분포를 가지고 학습을 시킬 때 모습이다. 즉, th1, th0가 "공평하게" 학습이 진행된다.

 

 

평균인 높아지면 x값이 증가한다는 뜻이다. 이는 즉 학습 시 th1에 지배적으로 학습이 된다는 것이다. 지난 포스팅에서 x값이 커질수록 loss function이 아래처럼 수직에 가까워진다. 그래서 th1이 th0보다 더 빨리 학습이 진행된다.

x의 값이 더 높아지면 th1에 대해서 더욱 지배적인 학습이 이뤄진다. 반면 th0은 아주 천천히 학습이 된다.

 

 

반면 x값이 1보다 작은 값일 땐, th0이 th1보다 빠른 학습을 보인다. 엄밀히 말하자면 th0 학습 속도가 빨라지는게 아니라 th1 학습속도가 느려지는 것이다. 왜냐하면 th1의 gradient 식에서 -2*x*lr*(y-y^), 즉 x가 곱해지기 때문이다. 소수점을 곱하면 당연히 업데이트 양 또한 줄어들기 마련이다. 그래서 무지개색 그래프를 보면 th0가 먼저 학습되기 때문에 기울기보다는 위아래 위치가 업데이트에 따라 먼저 변하게 되는 것이다.

728x90

+ Recent posts