while (1): study();

Ch4. 신경망 학습 본문

독서

Ch4. 신경망 학습

전국민실업화 2021. 7. 18. 21:57
728x90

* 책 내용 요약이 아니니 유의하시기 바랍니다.

 

 신경망 학습 시에 '경사하강법'이라는 용어가 참 많이 나옵니다. 경사하강법이란 '손실함수가 각 가중치에 대해서 양의 기울기를 가지면 음의 방향으로, 음의 기울기를 가지면 양의 방향으로 업데이트시켜 결과적으로는 전역 최소해에 도달하게 만드는 방법'입니다. 

 일반적으로 다음과 같이 특정 지점의 기울기를 근사할 수 있습니다. 실제 기울기를 해석적으로 구하는 것은 컴퓨터에게 힘든 일이기 때문에, 우리는 수치 미분를 사용할 것입니다. 그중 아래와 같은 방식을 전방 차분이라고 합니다.

전방 차분

 다만 전방 차분은 실제 해석적 기울기와는 차이가 좀 있는 편입니다. 따라서 신경망을 학습할 때는 오차를 줄이기 위해 중앙 차분을 사용합니다.

중앙 차분

 이렇게 구한 기울기는 각 장소에서 함수의 출력 값을 가장 크게 줄이는 방향을 향하게 됩니다. 최종적으로 국소최적해나 안장점에 고립될지 여부는 알 수 없으므로, 일종의 그리디 알고리즘이라고 볼 수 있습니다.

 이제 중앙 차분을 이용하여 실제로 경사하강법을 수행할 수 있는 함수를 구현했습니다.

 다만 이 함수를 그대로 사용하기에는 정합성의 문제가 있습니다. 예시를 보겠습니다. 만약 다음과 같은 함수가 주어졌다고 생각해봅시다.

 이 함수의 (3, 4) 지점의 기울기를 구하고 싶습니다. 따라서 [3, 4]을 Input으로 주었으나 다음과 같은 결과가 나옵니다.

 반면 Input을 float 형태로 주었을 때는 정상적으로 기울기를 구할 수 있습니다.

 이는 1차원 이상의 배열에 대해서 인덱싱을 이용하여 편미분하기 때문입니다. 정수 타입의 넘파이 배열에 소수를 삽입해보겠습니다.

 다음과 같이 0.9999가 아닌 0으로 삽입되는 것을 알 수 있습니다. 즉, 타입이 정수인 배열에 소수를 집어넣을 경우 단순히 뒤의 소수점 자리가 날아가버립니다. 위의 기울이가 폭발한 것은 이로 인해 발생한 오차라고 할 수 있습니다. 따라서 다음과 같이 코드를 수정하면 정합성을 보장받을 수 있습니다.

배열의 타입을 float64로 미리 형변환시켜주었습니다. 이렇게 작성하면 어떤 경우에도 같은 결과를 반환하는 것을 확인할 수 있습니다.

728x90

'독서' 카테고리의 다른 글

Ch7. 합성곱 신경망  (0) 2021.07.22
Ch6. 학습 관련 기술들  (0) 2021.07.21
Ch5. 오차역전파법  (0) 2021.07.19
Ch3. 신경망  (0) 2021.07.18
Ch2. 퍼셉트론  (0) 2021.07.18
Comments