딥러닝은 사람의 신경망을 모방하여 구현한다.
신경망에 대해 알아보기 전에 더 단순한 퍼셉트론부터 알아보자.
퍼셉트론이란?
퍼셉트론은 다수의 신호를 받아서 하나의 신호를 출력하는 알고리즘이다.
출력하는 신호는 0 혹은 1이다. (이진 출력)
아래 그림은 2개의 신호를 받는 퍼셉트론의 예다.
가중치
입력 신호와 가중치를 이용하여 출력을 내는데, 이때 사용되는 함수를 활성함수라고 한다.
퍼셉트론의 활성함수는 아래와 같다.
가중치가 큰 신호일수록 출력 신호에 주는 영향도 클 것이다.
즉, 가중치는 입력 신호의 중요도를 결정한다.
편향
하지만 실제 구현에서는 가중치 외에도 편향이라는 값을 사용한다.
위 식에서는 θ가 편향에 해당한다.
편향을 좌변으로 옮기면 -θ가 되는데, b라는 변수로 치환하여 아래와 같이 표현할 수 있다.
가중치가 입력 신호간의 중요도를 정해준다면, 편향은 출력 신호가 활성화되기 위한 전체 입력값의 최소 크기를 정해준다.
즉, 신경 세포에서의 역치를 대신한다고 볼 수 있다.
사실 퍼셉트론을 이용하면 논리 게이트도 구현이 가능하다.
퍼셉트론에서 편향을 잘 조절해 주면 AND, OR, NAND 게이트까지는 구현이 가능하다.
하지만 XOR, XAND 게이트 같은 비선형 데이터는 표현이 불가능하다.
NAND 게이트
모든 게이트는 NAND 게이트로 구현이 가능하다.
이게 핵심이다. 퍼셉트론으로 NAND 게이트 구현이 가능하다는 것은, 이를 이용해서 모든 데이터를 표현할 수 있다는 것이다.
여러 NAND 게이트를 조합하여 다른 게이트를 구현하듯이, 퍼셉트론을 여러 겹으로 쌓아서 모든 데이터를 표현할 수 있다.
하지만 퍼셉트론은 가중치를 사람이 직접 설정해주어야 한다는 단점이 있다.
이를 극복하기 위한 방법이 신경망이다.
신경망
신경망은 학습을 진행하며 가중치를 스스로 조절한다.
아래의 그림은 2층 신경망인데, 은닉층이 n개일 때 n+1층으로 표현된다. (퍼셉트론과 크게 다르지 않다)
활성화함수
퍼셉트론에서는 활성화함수로 계단함수를 사용했었다.
출력을 구하는 공식을 입력과 활성화함수로 나누면 다음과 같이 표현이 가능하다.
입력에 가중치를 적용하여 편향을 더한 값이 입력으로 들어가고 있다.
이 값을 x로 치환했을 때 계단함수를 활성화함수로 사용하면 다음과 같다.
입력과 활성화함수를 분리해서 표현할 수 있다는건 프로그래밍으로 모듈화하여 로직을 분리할 수 있다는 것이다.
위 내용을 그림으로 표현하면 다음과 같다.
이제 계단함수 외의 다른 활성화함수를 알아보자.
은닉층
은닉층에서 사용되는 활성화함수를 알아보자.
시그모이드 함수
시그모이드 함수는 입력을 0~1 사이로 필터링해준다.
시그모이드 함수 식을 보기 전에 그래프부터 보자.
실선이 시그모이드 함수이고, 점선은 계단함수다.
그래프를 보면 x의 크기에 따라 y가 1에 수렴한다.
이는 계단함수와 거의 흡사하지만, 함수가 연속적이라는 점이 다르다.
위에서 가중치는 중요도를 결정한다고 설명하였다.
시그모이드와 같은 연속함수를 사용하는 이유는 미분이 가능하기 때문이다.
1. 미분이 가능하다는 것은 기울기를 구할 수 있다는 것이고
2. 학습시 기울기를 이용하여 출력값의 증감폭을 추정할 수 있고
3. 이 증감폭을 기준으로 모델이 스스로 가중치를 설정할 수 있게 된다.
(위에서 언급하지 않았지만, 선형 문제에 대해서는 퍼셉트론도 학습이 가능하긴 하다.)
만에 하나, 입력이 실수로 들어오더라도 가중치에 따른 중요도를 계단함수보다 더 세밀하게 조절할 수 있다는 장점도 있다.
시그모이드 함수의 출력은 항상 1보다 작기 때문에 함수를 통과하면 할수록 출력값은 점점 줄어든다.
즉, 원래는 큰 값이더라도 학습을 진행할 수록 영향이 미미해지면서 결국 기울기가 0에 수렴한다.
이를 '기울기 소실 문제'라고 한다.
요약하면 다음과 같다.
- 출력이 0~1 사이로 필터링 된다.
- 연속함수라서 스스로 가중치를 조절할 수가 있다.
- 학습이 진행될수록 0에 수렴하므로 기울기가 0으로 소실되는 문제가 발생할 수 있다.
ReLU 함수
ReLU 함수는 입력이 0 이하일 때는 0을 출력하고, 0보다 클 때는 입력값을 그대로 출력한다.
그래프와 식은 다음과 같다.
ReLU는 양수일 때 기울기가 변하지 않는다.
즉, 가중치를 세밀하게 조정해야한다면 어울리지 않을 수 있다.
또한 기울기가 0 이하일 때는 출력이 0이므로 해당 뉴런은 항상 죽어있는 상태가 되어 더이상 학습에 기여하지 못한다는 문제가 있다.
하지만 그럼에도 시그모이드에 비해 자주 사용되는 이유는 양수일 때 출력값이 무조건 1이므로 기울기가 소실 되지 않기 때문이다.
계산도 입력값을 그대로 출력하기 때문에 훨씬 간단하여 빠르다.
뉴런이 죽는 문제를 해결하기 위해 ReLU의 변형들이 등장하였는데, 이 덕분에 죽은 ReLU를 해결하고, 가중치를 보다 세밀하게 조정할 수 있게 됐다.
요약하면 다음과 같다.
- 입력값이 양수일 경우 기울기가 항상 1이므로 기울기가 소실되지 않는다.
- 기울기가 고정되어 있기 때문에 세밀한 조정에는 어울리지 않는다.
- 입력값이 음수라면 출력이 0이므로 해당 뉴런은 가중치 조절에 기여하지 못하는 문제가 있다.
- 이러한 문제를 해결하기 위해 ReLU의 변형들이 등장하였다.
출력층
은닉층을 지나서 출력층에 도달했을 때 사용하는 활성화함수를 소개한다.
일반적으로 회귀에는 항등 함수를 사용하고, 분류에는 소프트맥스 함수를 사용한다.
항등 함수
항등 함수는 입력을 그대로 출력한다.
소프트맥스 함수
분류에서 사용하는 소프트맥스 함수의 그림과 식은 다음과 같다.
소프트맥스 공식을 그대로 사용하면 오버플로우 문제가 발생한다.
입력값을 자연상수의 지수로 받고 있어서 입력값이 커지면 출력이 급격하게 증가하기 때문이다.
이를 해결하기 위해 분모와 분자에 임의의 정수 C를 곱하면 다음과 같이 변형이 가능하다.
C를 지수로 올려주면 곱셈이 합으로 변환된다.
즉, 입력값을 어떠한 값을 더하거나 뺌으로써 오버플로우가 일어나지 않게 방지해줄 수 있다.
(일반적으로 입력값 중 최댓값을 C로 선택하여 빼준다.)
지금까지 소프트맥스 함수에 대해 설명을 했지만, 이 함수를 분류 문제에서 왜 사용하는지는 설명하지 않았다.
개선된 소프트맥스 함수를 사용하여 입력값에서 최댓값을 빼면 지수는 음수 혹은 0이 될 것이다.
즉, 출력값은 0~1 사이로 정규화 된다.
0~1 사이로 정규화가 되면 확률적으로 해석이 가능해진다.
입력값별로 정답에 얼마나 가까운지 확률적으로 해석을 할 수 있게 된다.
또한, 확률로 표현이 가능하기 때문에 손실함수와 함께 사용하면 정답에 해당하는 출력값의 가중치를 더 끌어올리도록 학습이 가능해진다.
(손실함수 : 출력 레이블과 정답 레이블의 차이를 측정하는 함수)
요약하면 다음과 같다.
- 소프트맥스 함수는 확률분포를 출력한다.
- 확률분포를 이용하여 클래스 분류가 가능하다.
- 손실함수와 함께 사용하여 정확도를 높이도록 가중치를 조정할 수 있다.
Reference
'프로그래밍 > 기타' 카테고리의 다른 글
테스트코드에 대한 생각 (0) | 2024.12.29 |
---|---|
항해99 백엔드 플러스 1주차 회고 - TDD (1) | 2024.12.22 |
사이드 프로젝트에 사용하기 좋은 서비스 (0) | 2023.12.18 |
깃허브 블로그에 댓글 기능 추가하기 (feat. Utterances, Disqus) (+ react, vue) (2) | 2022.02.08 |
차근차근 해보는 Docker 개발환경 세팅 방법 (0) | 2022.02.04 |