전에 배웠던 퍼셉트론에선 가중치를 설정하는 작업을 여전히 사람이 수동으로 했었다.
이런 점을 해결하기 위해 가중치 매개변수의 적절한 값을 데이터로부터 자동으로 학습하는 능력이 있는 신경망을 배운다.
퍼셉트론과 신경망
신경망을 그림으로 나타내면 위 그림처럼 된다.
여기서 가장 왼쪽 줄을 입력층, 맨 오른쪽 줄을 출력층, 중간 줄을 은닉층이라고 한다.
각층은 선으로 연결되어 있고, 이 선들은 각각의 가중치 값을 가진다.
은닉층의 뉴런은 보이지 않는다. 입력층에서 출력층 방향으로 차례로 0층, 1층..이라고 한다.
✨그림의 신경망은 3층이지만 가중치를 갖는 층은 2개뿐이기 때문에 2층 신경망이라고 한다.
하지만 글에 따라서는 3층 신경망이라고 하는 경우도 있으니 주의해야 한다.
그림을 보면 앞 장에서 본 퍼셉트론과 크게 다른 것은 보이지 않는다.
그럼 신호를 전달하는 방식은 어떨까?
퍼셉트론이 신호를 전달하는 동작을 식으로 표현하면 위처럼 식 1과 식 2가 나온다.
식 1에서는 전에 배웠던 것과 다르게 조건 분기의 동작을 다른 함수로 분리했다.
식 2는 조건 분기의 동작(0을 넘으면 1을 출력하고 그렇지 않으면 0을 출력)을 담은 함수로 h(x)라 하고 정의한 것이다.
식을 해석해 보면 입력 신호의 총합이 h(x)라는 함수를 거쳐 변환되어, 그 변환된 y의 출력이 됨을 보여준다.
✨단순 퍼셉트론은 단층 네트워크에서 계단 함수(임계값을 경계로 출력이 바뀜)를 활성화 함수로 사용한 모델이고
다층 퍼셉트론은 신경망(여러 층을 가지고 매끈한 활성화 함수를 사용하는 네트워크)을 가리킨다.
활성화 함수
h(x)처럼 입력 신호의 총합을 출력 신호로 변환하는 함수를 일반적으로 활성화 함수(activation function)라고 한다.
활성화라는 이름을 보면 알 수 있듯 전에 퍼셉트론 때 배웠던
시냅스의 신호가 강화되는 뉴런 활성화를 모티브로 만든 함수인 것이다.
그렇기에 활성화 함수는 신호 입력 신호의 총합이 활성화를 일으키는 지를 정하는 역할을 한다.
두 개의 함수식으로 나눴던 함수를 또 2단계로 나눠지는 처리과정으로 바꿔 식을 작성했다.
식 3은 가중치가 달린 입력 신호와 편향의 총합을 계산하고, 이를 a라고 한다.
식 4는 a를 함수 h()에 넣어 y를 출력하는 흐름의 식으로 진행된다.
✨참고로 이 글에선 뉴런과 노드라는 용어를 같은 의미로 사용한다.
활성화 함수의 종류
기계학습에 지도학습의 대표적인 문제로 회귀문제와 분류문제가 있다.
회귀 문제는 우리가 원하는 결괏값이 연속적인 변수인 것을 예측하는 문제다.
예를 들어 집값 예측, 온도 예측이 있다.
반면에 분류 문제는 우리가 원하는 결괏값이 클래스라고 하는 유한한 모임으로 분류되는 문제다.
이제 분류 문제에 주로 사용되는 활성화 함수들을 살펴보자.
계단 함수 (Step Function)
위에 식 2를 보자. 함수 h(x)는 임계값을 경계로 출력이 바뀐다.
입력이 임계값인 0을 넘으면 1을 출력하고. 그 외에는 0을 출력하는 함수인 것이다.
이 처럼 특정 임계값보다 크면 출력이 1이 되고, 그렇지 않으면 출력이 0이 되는 함수를 계단(step) 함수라고 한다.
계단 함수는 이러한 특성으로 인해 이진 분류문제에 자주 사용된다.
그래프를 보면 계단 함수는 0을 경계로 출력 0에서 1(또는 1에서 0)로 바뀌는 것을 확연하게 알 수 있다.
퍼셉트론에서는 활성화 함수로 계단 함수를 이용한다고 할 수 있다.
시그모이드 함수 (Sigmoid Function)
계단 함수는 비선형 함수이긴 했지만, Gradient(도함수)가 0인 지점이 많아
나중에 배울 역전파(backpropagation) 알고리즘과 같은 Gradient기반 최적화 방법에는 사용하기 어려웠다.
이러한 이유로 계단 함수는 주로 과거에 사용되는 함수였다.
✨기울기 Gradient의 의미는 머신러닝에서 손실함수의 미분값을 의미한다.
다음은 계단함수보다 신경망에서 자주 이용하는 시그모이드(sigmoid) 함수이다.
exp(-x)는 e^-x를 뜻하며, e는 자연상수로 2.7182... 의 값을 갖는 실수이다.
시그모이드는 모든 입력값에 대해 0과 1사이로 변환하는 역할을 하며 일반적으로 𝜎(sigma)로 표기한다.
시그모이드 함수는 0과 1사이의 값을 출력하며, 출력 값을 확률로도 해석할 수 있기에 이진 분류에 유용하다.
신경망에서는 활성화 함수로 시그모이드 함수를 이용하여 신호를 변환하고, 그 변환된 신호를 다음 뉴런에 전달한다.
시그모이드란 s자 모양이라는 뜻이다. 계단함수처럼 그 모양을 따 이름 지은 것이다.
그렇다면 그 두 모델의 차이점은 무엇일까?
시그모이드 함수는 곡선으로 입력에 따라 출력이 연속적으로 변한다.
계단함수는 뉴런 사이에 0 혹은 1이 흘렀다면, 신경망에서는 연속적인 실수가 흐른다.
두 함수는 차이점뿐만 아니라 공통점도 가지고 있다. 바로 크게 보면 둘은 같은 모양을 하고 있는 것이다.
두 함수 모두 입력이 중요하면 큰 값을 입력이 중요하지 않으면 작은 값을 출력한다.
그리고 입력이 아무리 작거나 커도 출력은 0에서 1 사이라는 것도 공통점이다.
정리 | 공통점 | 차이점 |
시그모이드 | 모양이 비슷하다. 입력이 작으면 출력은 0에 가깝고 입력이 커지면 출력이 1에 가깝다. |
곡선으로 입력에 따라 출력이 연속적인 실수가 흐른다. |
계단 | 뉴런 사이에 0 혹은 1이 흐른다. |
계단 함수와 시그모이드 함수의 공통점은 그 밖에도 있다.
둘 모두 비선형 함수라는 것이다.
비선형 함수란 함수에 무언가를 넣었을 때 출력이 입력의 상수배만큼 변하는 함수를 선형함수라고 하고,
비선형 함수는 선형이 아닌, 직선 한 개로는 그릴 수 없는 함수를 말한다.
다음은 두 함수의 그래프를 같은 평면 안에 그려놓은 것이다.
둘의 차이점과 공통점을 시각적으로 확인 할 수 있다.
이렇게 보면 계단함수보다 시그모이드 함수가 엄청 좋아 보이지만 시그모이드 함수 또한 문제점이 있다.
바로 모델의 깊이가 깊어지면 기울기가 사라지는 기울기 소멸 문제(vanishing gradient problem)가 발생한다는 것이다.
그래서 현재 layer(은닉층)을 많이 쌓는 모델들은 잘 사용하지 않는다.
✨기울기 소멸 문제(vanishing gradient problem)란 활성화 함수 계산 과정에서 도함수 값이 계속 곱해지면서 가중치의 결괏값이 0이 되어 더 이상 계산이 불가능한 상태를 말한다.
소프트맥스 함수 (Softmax Function)
소프트맥스 함수는 분류 문제에 최적화된 함수이다.
보통 세 개 이상으로 분류하는 다중 클래스 분류 문제에서 사용된다.
출력 벡터의 각 요소를 0과 1 사이의 값으로 변환하고, 모든 요소의 합이 1이 되도록 정규화한다.
이를 통해 다중 클래스에 대한 확률 분포를 얻을 수 있게 되는 것이다.
위는 이러한 소프트맥스 함수를 수식으로 나타낸 것이다.
n은 출력층의 뉴런 수, yk는 그중 k번째 출력임을 뜻한다.
소프트맥스 함수의 분자는 입력신호 ak의 지수 함수, 분모는 모든 입력 신호의 지수 함수의 합으로 구성된다.
하지만 위 수식으로 보고 바로 softmax()함수를 코드로 나타낸다면 문제가 생길지도 모른다.
바로 오버플로 문제이다. 오버플로란 컴퓨터는 유한한 크기의 데이터를 다루는데,
표현할 수 있는 수의 범위가 한정되어 너무 큰 값을 표현하게 되면 문제가 생기는 것이다.
그렇다면 소프트 맥스함수에서는 왜 오버플로우가 발생할까?
소프트맥스 함수는 지수 함수를 사용하는데,
지수 함수라는 것은 아주 쉽게 엄청 큰 값을 만들어 낼 수 있다.
그런 상태에서 큰 값들끼리 나눗셈을 하면 결과 수치가 불안정해질 수밖에 없다.
식을 풀이 해보자면 C라는 임의의 정수를 분자와 분모 양쪽에 곱한다.
그다음으로 C를 지수함수 exp() 안으로 옮겨 logC로 만든다.
마지믹으로 logC를 C’라는 새로운 기호로 바꾼다.
이 식이 의미하는 것은 소프트맥스의 지수 함수를 계산할 때 어떤 정수를 더해도 결과는 바뀌지 않는다는 것이다.
오버플로를 막을 목적으로는 입력 신호 중 최댓값을 이용하는 것이 일반적이다.
위는 소프트 맥스 함수의 출력 그래프이다.
소프트 맥스 함수의 출력값의 범위는 0 ~1.0 사이의 실수이고 출력 값들이 총합이 1이 되므로 확률로 볼 수 있다.
소프트맥스 함수를 이용함으로써 문제를 확률적으로 대응할 수 있게 되는 것이다.
✨ 소프트맥스 함수를 적용해도 각 원소의 대소 관계는 변하지 않는다.
그 이유는 지수함수가 단조 증가함수이기 때문이다.
단조 증가 함수란 정의역 원소 a, b가 a <= b일 때, f(a) <= f(b)가 성립하는 함수이다.
신경망을 이용한 분류에서는 일반적으로 가장 큰 출력을 내는 뉴런에 해당하는 클래스로만 인식한다.
그리고 소프트맥스 함수를 적용해도 출력이 가장 큰 뉴런의 위치는 달라지지 않는다.
결과적으로 신경망으로 분류할 때는 출력층의 소프트맥스 함수를 생략해도 된다는 뜻이다.
기계학습의 문제 풀이는 학습과 추론의 두 단계를 거쳐 이뤄진다.
학습 단계에서 모델을 학습하고, 추론 단계에서 앞서 학습한 모델로 미지의 데이터에 대해서 추론을 수행한다.
추론 단계에서는 출력층의 소프트맥스 함수를 생략하는 것이 일반적이다.
분류 문제에 적합한 활성화 함수들을 알아봤다.
마지막으로 출력층의 뉴런 수는 풀려는 문제에 맞게 적절히 정해야 한다.
분류에서는 분류하고 싶은 클래스 수로 설정하는 것이 일반적이다.
항등 함수 (identity Function)
지금까지 분류 문제에 적합한 활성화 함수들을 배웠다.
이제부터 회귀 문제에 적합한 활성화 함수를 알아본다.
첫 번째로는 항등(identity) 함수이다. 선형함수(linear) 함수라고도 부른다.
항등함수는 입력을 그대로 출력한다. 입력과 출력이 항상 같다는 뜻이 항등이다.
출력층에서 항등 함수를 사용하면 입력 신호가 그대로 출력신호가 된다.
선형함수의 식은 a(x) = ax + b 형태인데 a(x) = x인 경우는 이전 노드에서 계산되어 넘어온 값을 그대로 받는다.
항등함수의 그래프를 보면 다른 그래프들과 다르게 선에 굴곡이나 꺾이는 점이 없이 일직선이다.
이런 그래프를 선형 그래프라고 하는데 이렇게 선형 그래프를 그리는 선형 함수는
신경망에서는 활성화 함수로 사용하지 않고 비선형 함수를 사용해야 한다.
그 이유는 선형함수는 층을 아무리 깊게 해도 은닉층이 없는 네트워크로 똑같은 기능을 하게 만들 수 있게 때문이다.
ReLU 함수 (Rectified Linear Unit Function)
이제부터 소개할 ReLU(Rectified Linear Unit)함수는 최근 신경망에 분야에서 주로 이용하는 함수이다.
ReLU는 입력이 0을 넘으면 그 입력을 그대로 출력하고, 0 이하면 0을 출력하는 함수이다.
✨ReLU에서 Rectified란 정류된이란 뜻이다.
정류는 전기회로 쪽 용어로 예를 들어 반파정류회로는 +/-가 반복되는 교류에서 -흐름을 차단하는 회로이다.
x가 0 이하일 때를 차단하여 아무 값도 출력하지 않는 것이다.
그래서 ReLU함수를 정류된 선형 함수 정도로 옮길 수 있다.
두 개의 직선을 이어 만든 것으로 비선형 함수지만 선형과 매우 유사한 성질을 가지고 있다.
따라서 계산이 쉽고 미분도 쉽게 풀 수 있다.
또한 중요한 점은 모델 최적화의 유용한 선형적 성질들을 보존하고 있어서 최적화를 쉽게 할 수 있게 한다.
그래서 그런지 성능이 매우 좋다고 알려져 있다.
추가로 ReLU를 변형시킨 Leaky ReLU 함수가 있다.
렐루와 비슷한 특징을 가지고 차이점은 마이너스 값도 취할 수 있다.
하이퍼볼릭 탄젠트 함수(Tanh Function)
하이퍼볼릭 탄젠트(Tanh) 함수는 쌍곡선 탄젠트(hyperboilc tangent) 함수로 알려져 있다.
입력값이 들어오면 -1과 1 사이의 범위로 변환하는 비선형 함수이다.
시그모이드 함수와 비슷하지만 -1과 1 사이의 값을 취해 0과 음수값을 가질 수 있다.
또한 0 부근에서 시그모이드 함수보다 더 가파른 기울기를 갖는다.
하이퍼볼릭 탄젠트 함수는 입력이 0에 가까워질수록 출력은 0에 가까워진다.
또한 입력이 커질수록 출력은 점진적으로 1에 가까워지고, 입력이 음수로 갈수록 출력은 -1에 가까워진다
이로 인해 하이퍼볼릭 탄젠트 함수는 입력을 중심으로 대칭적인 형태를 가지게 된다.
하이퍼볼릭 탄젠트 함수의 특징으론 입력 범위 내에서 연속적이며 미분 가능하다.
따라서 역전파(backpropagation) 알고리즘 등의 그래디언트 기반 최적화 알고리즘에 적용하기 좋다.
지금까지 많은 활성화 함수들을 살펴봤는데 참고로 최근에는 글에서 언급된 것이 아닌 신경망에서 다양한 활성화 함수와 층 구조를 조합하는 여러 개선된 함수들이 등장하는 중이다.
예를 들어, ReLU 함수를 사용한 다층 퍼셉트론(MLP)은 많은 분류와 회귀 문제에서 성공적으로 적용되고 있다.
또한, 최근에는 GPT와 같은 트랜스포머(Transformer) 아키텍처에서 GELU(Gaussian Error Linear Unit)와 같은 새로운 활성화 함수도 사용되고 있다.
출력층 설계
신경망은 분류와 회귀 모두에 이용된다.
다만 둘 중 어떤 문제냐에 따라 출력층이나 은닉층에 사용하는 활성화 함수가 달라질 수 있다.
위 글에선 활성화 함수들을 분류와 회귀로 나눴다면 지금은 출력층과 은닉층에 적합한 함수로 나눠보려 한다.
- 출력층에 적합한 함수는 시그모이드함수, 소프트맥스 함수, 항등 함수등이 있다.
- 은닉층에 적합한 함수는 렐루 함수, 하이퍼볼릭 탄젠트 함수, GELU 함수 등이 있다.
이제 다음엔 지금까지 배운 것을 바탕으로 손글씨 인식 모델을 만들어보도록 하겠다.
'밑바닥부터시작하는딥러닝' 카테고리의 다른 글
다차원의 배열 계산 (1) | 2023.05.26 |
---|---|
손글씨 숫자 인식 (0) | 2023.05.25 |
퍼셉트론 (0) | 2023.05.16 |