인간에게는 쉽고 기계는 어려운 작업

컴퓨터는 쉽지만, 사람에게는 어려운 작업 : 수백만 개 숫자의 곱셈 연산

컴퓨터는 어렵지만, 사람에게는 쉬운 작업 : 사진 속 사람의 얼굴 인식


간단한 예측자

컴퓨터는 입력 -> 연산 -> 출력 시스템이다.

인공 신경망도 마찬가지다.

어떤 것의 동작 원리를 정확히 파악할 수 없을 때 취할 수 있는 한 방식은 우리가 조정할 수 있는 매개변수 값을 포함하는 모델을 만들어 보는 것이다.

우리는 킬로미터를 마일로 어떻게 변환해야 할지 모른다고 가정하고, 이를 조정 가능한 매개변수를 포함하는 선형함수 모델로 만들었다.

모델을 정교화해나가는 좋은 방법은 오차에 기초해 매개변수 값을 조절해나가는 것이다.


분류자 학습시키기

간단한 계산을 통해 선형 분류자의 오차와 기울기 매개변수 간의 관계를 이해할 수 있다.

오차를 제거하기 위해 얼마만큼 기울기를 조정해야 하는지 알 수 있다.

이러한 조정 과정의 문제점은 이전의 학습 데이터는 무시하고 최종 학습 데이터에만 맞춰 업데이트된다는 것이다.

이를 해결하기 위해 학습률을 도입해 업데이트의 정도를 조정해준다.

이를 통해 단일 학습 데이터가 학습에 지배적인 영향을 주는 것을 방지할 수 있다.

현실에서 학습 데이터는 잡음이 섞여 있거나 오차를 가진다.

학습률을 이용한 업데이트는 이러한 데이터의 오류의 영향을 제한하는 효과도 있다.


분류자 1개로는 충분치 않을 수 있다

데이터 자체가 단일 선형 프로세스에 의해 좌우되지 않는 경우라면 단순한 선형 분류자로 데이터를 분류해낼 수 없다.

예를 들어 배타적 논리합에 의해 좌우되는 데이터는 단일 선형 분류자에 의해 분류가 불가능함.

이런 경우 해결법으로 여러 개의 선형 분류자를 이용해 데이터를 분류하면 되는 것이다.


대자연의 컴퓨터 뉴런

생물학적 뇌는 최첨단 컴퓨터에 비해 저장 능력과 연산 속도가 떨어져 보이지만,

하늘을 날고 음식을 찾아내고 언어를 학습하고 포식자로부터 도망가는 등 수준 높고 정교한 업무를 잘 수행한다.

생물학적 뇌는 손상되었거나 완전하지 않은 신호에 대해 전통적인 컴퓨터 시스템에 비해 놀라울 정도로 탄력적인 반응을 한다.

인공 신경망은 상호 연결된 뉴런으로 구성된 생물학적 뇌로부터 영감을 받아 구축되었다.


행렬 곱은 유용하다

신경망에서 신호를 전달하는 연산은 행렬 곱을 통해 표현할 수 있다.

행렬 곱을 활용하면 그 크기에 상관없이 신경망을 간결하게 표현할 수 있다.

많은 컴퓨터 프로그래밍 언어는 행렬을 잘 인식하고 행렬 연산을 빠르고 효율적으로 처리할 수 있다.


다중 계층에서의 오차의 역전파

인공 신경망에서 학습이란 연결 노드의 가중치를 업데이트하는 과정을 의미한다.

가중치의 업데이트는 오차에 의해 주도되는데, 오차는 학습데이터로부터 주어진 정답과 출력 값 간의 차이를 의미한다.

출력 노드의 오차는 실제 값(정답)과 출력 값 사이의 차이를 의미한다.

한 가지 접근 방법은 출력 계층의 노드들의 오차를 이와 연결된 가중치의 크기에 비례해 나눠서 역전파하고 이를 재조 합하는 방법이다.

중간 계층에 존재하는 노드들의 오차는 명백하지 않다.

한 가지 접근 방법은 출력 계층의 노드들의 오차를 이와 연결된 가중치의 크기에 비례해 나눠서 역전파하고 이를 재조 합하는 방법이다.


행렬 곱을 이용한 오차의 역전파

오차의 역전파를 행렬 곱으로 표현할 수 있다.

오차의 역전파를 행렬 곱으로 표현함으로써 우리는 네트워크의 크기에 상관없이 이를 간결하게 표현할 수 있으며,

컴퓨터를 통해 더욱 효율적으로 빠르게 업무를 처리하게 할 수 있다.

전파법과 역전파 모두 행렬곱을 통해 효율적으로 처리할 수 있다.


가중치의 진짜 업데이트

경사 하강법은 함수의 최저점을 구하기 위한 좋은 접근 방법이다.

특히 함수가 매우 복잡하고 어려워 대수학을 이용해 수학적 접근 방식으로 풀기 어려울 때도 잘 동작한다.

매개변수가 많아서 다른 접근 방법들이 실패하거나 현실적이지 못한 경우도 경사 하강법은 잘 동작한다.

데이터가 불완전하거나 함수가 완벽하게 표현되지 못하거나 잘못된 발걸음을 내디딘 경우에도 경사 하강법은 탄력적으로 대응한다.


신경망의 오차는 가중치의 함수이다.

신경망을 개선한다는 것은 가중치의 변화를 통해 오차를 줄인다는 뜻이다.

최적의 가중치를 직접 찾는 것은 매우 어렵다.

이를 대체하는 접근 방법은 작은 발걸음으로 오차 함수를 줄여가면서 반복적으로 가중치를 개선해가는 방법이다.

각 발걸음은 현재 위치에서 볼 때 가장 급격히 낮아지는 경사의 방향으로 취해진다. (경사 하강법)

오차 기울기는 미분을 이용해 계산할 수 있다.


데이터 준비하기

신경망의 디자인과 실제 풀고자 하는 문제에 적합하게 입력 값, 출력 값, 가중치의 초기값을 설정해야 신경망이 잘 동작함.

흔히 발생하는 문제로는 포화가 있다.

포화란 보통 큰 가중치에 의해 커진 신호 때문에 활성화 함수의 기울기가 매우 얕은 곳에 존재하게 되는 현상을 의미한다.

포화가 되면 더 나은 가중치로 업데이트해가는 학습 능력이 저하된다.

또 다른 문제로는 신호 또는 가중치가 0의 값을 가지는 문제가 있다.

이 또한 가중치 학습 능력을 죽이게 된다.

가중치는 임의의 작은 값으로 설정되어야 한다. (0은 반드시 피해야 함!)

노드로의 연결 노드가 많을 수록가중치의 크기를 줄이는 등의 정교한 방법을 이용하기도 한다.

입력 값은 작은 값으로 조정되어야 하되, 0으로 설정해서는 안 된다.

일반적인 범위는 0.01 ~ 0.99 또는 -1 ~ 1이다.

문제에 따라 적합한 범위를 선택한다.

출력 값은 활성화 함수가 생성할 수 있는 범위 내에 있어야 한다.

로지스틱 시그모이드 함수에서 0 이하 또는 1 이상의 값은 불가능하다.

학습의 목표 값을 이 범위 외의 값으로 설정하면 이는 더 큰 가중치를 만들어내게 될 것이며 그 결과는 포화로 이어질 것이다. (적당한 범위 0.01 ~ 0.99)



반응형

'Programming > Blah Blah' 카테고리의 다른 글

123  (0) 2018.06.21
비주얼 스튜디오 확장(vsix)  (0) 2018.05.05
.tt 확장자 예제  (0) 2018.04.19
배치파일  (0) 2018.04.10
C# 가비지 컬렉터(Garbage Collector) 원리  (0) 2018.02.03
CCU와 MCU란?  (0) 2018.01.25
[Visual Studio Code] 단축키 및 플러그인 추천  (0) 2018.01.13
Readme Driven Development(RDD)  (0) 2018.01.12