확률적 경사하강법은 가중치 1번 업데이트 할때 1개의 샘플을 사용하므로, 손실 함수의 전역 최소값을 불안 정하게 찾았다.
하지만, 배치 하강법은 가중치를 1번 업데이트 할때 전체 샘플을 사용하므로, 손실 함수의 전역 최소값을 안정적으로 찾는다.
여기에서 가장 핵심적으로 이야기 할 수 있는 그림은 아래와 같다.
점곱과 행렬곱의 차이 |
🚚벡터의 연산과 행렬 연산
아래 그림과 같이 점곱은 계산 된 것은 확률적 경사 하강법으로 가중치 한번에 한번씩 업데이터 하는 반면에
점곱과 행렬곱 |
행렬곱은 행방으로 놓인 첫번째 벡터와 열방향으로 놓은 두번째 벡터의 원소를 각각 곱한 후 모두 더하는 것과 같다.
아래 정방향 벡터와 연산은 알고리즘의 성능을 높인다. 이것은 벡터화 연산 행렬 하는 것으로 배치 경사 하강 법을 적용한다.
여기에서 맨 처음 보는 수학기호가 있다. 행렬은 대문자 굶은 알파벳을 표시 한다. 행렬X,
가중치 W를 곱하는 것은 위의 슬라이드와 같이 나와 있다.
🚚신경망 알고리즘 대한 벡터화
신경망 알고리즘 벡터화 |
한개의 가중치를 한꺼번에 행렬 곱으로 계산을 하니, 속도를 느리지만, 학습곡선이 안정적이다. 위의 그림에서 (m,n) $\cdot $ (n,k) = (m,k)의 예는 아래와 같다.
(10, 3) $\cdot $ (3,1) = (10,1) 이다.
아래의 코드를 보면 아주 간단하게 알 수 있다.
[[ 0 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]]
array([[ 5], [14], [23], [32], [41], [50], [59], [68], [77], [86]])
a 는 변수 3개의 10개의 행이 있고, b는 3개의 가중치가 있다. Z 값을 구할때는 np.dot()이나 np.sum() 결과 값은 같다. 하지만 방식은 다르다. np.sum 루프문을 돌려가면서 하나씩 연산 하여야 한다는 것이다.
🚚신경망 알고리즘 대한 벡터화
정방향 계산 |
정방향 계산은 매우 간단한데, 행렬곱의 원리만 알게 되면, 가중치를 30개를 주어서 계산만 하게 되면 364개의 Z 값이 나온다.
🚚역방향에 대한 벡터화
역방향에 대한 벡터 화 |
에러(e) 값은 y 값에서 a값 *a(activation) 값을 빼기 때문에, 364개 값이 나온다. 이것을 구하기 위해서는 $ X^T$ X에 Transpose 취하여야만, gradient값이 업데이트 된다. 1 epoch 당 가중치(w)가 업데이트 되는 것이다.
나는 책을 한번 붙들면 한권만 보기 때문에, 구입한 책에서 모든 정보를 얻는다.
반갑습니다!
답글삭제네 반갑습니다
삭제