가중치의 초기값을 0으로 해도 괜찮을까?

허준현·2021년 8월 5일
0

Review

목록 보기
2/3

밑바닥부터 시작하는 딥러닝

이 게시글은 밑바닥부터 시작하는 딥러닝을 읽고 인상깊었던 부분에 대해서 작성하고자 한다.

가중치를 0으로 해도 괜찮을까?

결론부터 이야기를 하면 0으로 하게 되면 학습이 올바르게 진행되지 않는다.
정확히는 가중치를 동일한 값으로 통일해서도 안된다.그 이유는

역전파시에 모든 가중치의 값이 똑같이 갱신 되기 때문이다.

예를 들어 2층 신경망에서 첫번째와 두 번째 층의 가중치가 0이라고 하였을 때 feed-foward 시에 입력층의 가중치가 0 이기 때문에 두번째 층의 뉴런에 모두 같은 값이 전달된다. 이는 가중치의 값들을 초기값에서 시작하고 갱신을 거쳐도 한 가지의 값을 가지고 있기 때문에 가중치를 여러개 , 즉 노드를 여러개 가지는 것이 무의미 하기 때문입니다.
책에서는 표준편차를 0.01로 한 정규분포의 경우, Xavier 초깃값, He 초깃값을 사용 했을 때의 활성화 값 분포를 나타내고 각 초깃값에 해당하는 학습 정도를 표로 제시한다.

책을 읽게 된 계기

쏘마에서 딥러닝 역할을 맡자마자 pytorch로 딥러닝 공부를 시작하게 되었다. pytorch는 나에게 있어서 레이어를 생성하는 것부터 시작하여 신경망을 구성하는데 있어서 간단한 코드로 구현이 되기 때문에 매력적이었다.

어느 정도 딥러닝에 대한 기반을 갖추었다고 생각하고 딥러닝 오픈 채팅방에서 추천하는 밑바닥 부터 시작하는 딥러닝 시리즈 책으로 복습하고자 하였다. 하지만 복습 이외에도 pytorch 나 tensorflow 를 사용하지 않고
직접 신경망을 구성하고 activate funcion 도 직접 구현한다.
마치 파이썬으로 sort()로 정렬하던 것을 C언어로 퀵정렬을 짜는 듯한 느낌이었고 지금까지의 공부는 딥러닝의 겉표면만 공부했다는 생각이 들었다.

어떤 사람이 책을 읽으면 좋을까?

앞의 타이틀을 넘어서 가중치의 초기값에 대해 의문을 가졌던 경우
소프트 함수의 손실함수로 왜 교차 엔트로피 오차를 사용하는지에 대답할 수 없는 경우
최적화를 할 때 각 기법만의 차이점을 모르고 adam만 사용한 경우
역전파를 하는 이유가 단순히 미분값을 재활용하기 위해서 라고 생각하는 경우

책을 읽으면서 인상깊었던 점

  1. 퍼셉트론 개념 설명시 and,or 게이트로 설명 다중퍼셉트론을 xor로 설명, 모델의 수치를 측정할때 왜 정확도를 사용하지 않고 손실함수를 사용하는가, 실제로 모델의 가중치의 기울기를 구해보고 변하는 과정 살펴보는 과정이 인상깊었다.

  2. 해당 코드는 스탠퍼드 대학교 딥러닝 수업의 파이썬 코드를 사용하였기에 기초를 다지는데 유익한 점

  3. 계산 그래프를 통한 역전파에 대한 이해를 높이는데 예시를 사과 가격에 대한 지불 금액에 대한 미분으로 풀어 설명한다. 최대한 어려운 내용을 쉽게 풀어쓰려고 한 점

  4. 신경망의 순전차 때 수행하는 행렬의 곱은 기하학에서는 어파인 변환이라고 하는데 처음 들어본 단어였던 점

  5. 학습을 높이는 방법으로 sgd가 나왔고 sgd에 대한 설명을 깊은 골을 찾는 모험가에 비유하였고 sgd의 한계를 쉽게 설명 한 후 모멘텀, adagrad, adam에 대해 구체적인 설명으로 이해를 쉽게 한 점.

부연설명

정확도를 측정 할 때 왜 손실함수를 사용하는가?

왜 우리는 정확도라는 지표를 놔두고 손실 함수의 값이라는 우회적인 방법을 선택하는 것일까?
신경망 학습에서는 최적의 매개변수(가중치와 편향)를 탐색 할 때 손실 함수의 값을 가능한 작게 하는 매개변수를 찾는다.
이 때 매개변수의 미분을 계산하고, 그 값을 갱신는 과정을 반복한다.
이 때 가중치 매개변수의 손실 함수의 미분이란 가중치 매개변수의 값을 아주 조금 변화 했을때 손실함수가 어떻게 변하나라는 의미이다.
미분 값이 음수이면 가중치 매개변수를 양의 방향으로 변화하여 손실함수를 줄이고 그 반대도 동일하다. 그러나 미분값이 0이면 가중치 매개변수를 어느쪽으로 움직여도 손실 함수의 값은 줄어 들지 않는다.
이 때 정확도를 지표로 삼게 된다면 대부분의 미분값이 0으로 수렴하여 매개변수를 갱신 할 수 없게 된다.

정확도를 지표로 삼으면 왜 미분값이 대부분 0 일까?

예를 들어 100장의 훈련 데이터 중에서 32장만 올바르게 인식하는 신경망에서 정확도를 지표로 하게 된다면 가중치 매개변수를 바꾸어도 정확도는 32이거나 , 33 , 34 처럼 불연속적인 값으로 바뀌게 된다.
하지만 손실함수를 지표로 삼게 된다면 손실 함수의 값은 0.92543 ..~~ 처럼 연속적인 값으로 변화하게 된다.

비슷한 예시가 뭐가 있을까?

조금만 넓은 관점에서 살펴보면 우리가 활성화 함수로 왜 계단 함수를 사용 안하는지에 정답이 있다. 계단 함수의 미분은 대부분이 0이기 떄문에 매개변수의 작은 변화가 주는 파장이 계단함수가 무시하기 때문이다.

소프트 맥스 함수의 손실함수는 교차 엔트로피 오차를 사용한다.

소프트맥스 함수의 손실 함수로 교차 엔트로피 오차를 사용하면 역전파가 (y1t1,y2t2,y3t3)(y1-t1,y2-t2,y3-t3) (y는 예측값, t는 실제값) 으로 깔끔하게 나오기 때문이다. 비슷한 유형으로 항등 함수의 손실 함수로 오차제곱합을 이용하게 된다면 역전파시 (y1t1,y2t2,y3t3)(y1-t1,y2-t2,y3-t3) 가 나오기 때문이다.

profile
best of best

0개의 댓글