Skip to main content
Summary

뉴런의 점수에 표정을 입히는 함수

앞 장에서 뉴런은 입력에 가중치를 곱하고, 편향을 더해 하나의 점수 z를 만든다고 했습니다.

z = w1 × x1 + w2 × x2 + b

이 식만 보면 뉴런은 꽤 성실한 계산기입니다. 입력을 받고, 중요도를 곱하고, 기준점을 더합니다. 그런데 여기서 한 가지 질문이 남습니다.

이 점수 z를 그대로 다음 뉴런으로 넘기면 충분할까요?

겉으로 보기에는 충분해 보입니다. 점수가 크면 강한 신호, 작으면 약한 신호라고 생각하면 되니까요. 하지만 신경망이 정말 복잡한 패턴을 배우려면 z를 그대로 넘기는 것만으로는 부족합니다. 신경망에는 점수를 한 번 비틀어 주는 장치가 필요합니다.

그 장치가 바로 활성화 함수입니다.

활성화 함수는 뉴런이 만든 점수 z를 받아 새로운 값으로 바꿉니다. 보통 이렇게 씁니다.

a = f(z)

여기서 f가 활성화 함수이고, a는 활성화 함수를 거친 출력입니다. 이름은 조금 딱딱하지만 의미는 쉽습니다. 뉴런이 만든 점수에 "이 신호를 얼마나 통과시킬지", "어떤 모양으로 바꿔 다음 층에 넘길지"를 결정하는 함수입니다.

비유하자면 뉴런의 선형 계산은 재료를 섞는 과정이고, 활성화 함수는 그 재료를 굽거나 자르거나 눌러 새로운 형태로 만드는 과정입니다. 밀가루와 물을 섞기만 하면 반죽입니다. 하지만 굽는 순간 빵이 됩니다. 활성화 함수는 신경망의 계산을 단순한 반죽에서 쓸모 있는 모양으로 바꾸는 열기와 같습니다.

활성화 함수

선형 계산만 쌓으면 왜 부족할까

활성화 함수가 왜 필요한지 이해하려면 먼저 무서워 보이지만 아주 중요한 사실 하나를 알아야 합니다.

선형 함수만 아무리 많이 쌓아도 결국 하나의 선형 함수와 같습니다.

여기서 선형 함수란 입력에 어떤 숫자를 곱하고 더하는 계산을 말합니다. 앞 장에서 본 뉴런의 계산이 바로 선형 계산입니다.

z = w × x + b

입력이 하나일 때 이 식은 직선입니다. 입력이 두 개면 평면 위에 선을 긋고, 입력이 더 많으면 더 높은 차원의 평평한 경계를 만듭니다. 핵심은 여전히 같습니다. 선형 계산은 데이터를 곧은 방식으로 나눕니다.

그렇다면 이런 선형 계산을 여러 층으로 쌓으면 복잡해질까요? 직관적으로는 복잡해질 것 같습니다. 계산이 여러 번 이어지니까요. 하지만 활성화 함수 없이 선형 계산만 이어 붙이면 결과는 다시 하나의 선형 계산으로 정리됩니다.

아주 단순한 예를 보겠습니다.

첫 번째 층이 이렇게 계산한다고 합시다.

z1 = 2x + 3

두 번째 층은 첫 번째 층의 결과를 받아 이렇게 계산합니다.

z2 = 4z1 + 5

이제 z1을 두 번째 식에 넣어 보겠습니다.

z2 = 4(2x + 3) + 5

정리하면 다음과 같습니다.

z2 = 8x + 17

두 번 계산했지만 결국 8x + 17이라는 하나의 선형 함수가 되었습니다. 층을 두 개 쌓은 것처럼 보였지만, 실제로는 더 큰 가중치와 다른 편향을 가진 뉴런 하나와 다르지 않습니다.

이것은 신경망에서 아주 중요한 문제입니다. 활성화 함수가 없다면 층을 10개 쌓아도, 100개 쌓아도, 결국 하나의 선형 변환으로 합쳐질 수 있습니다. 마치 투명한 자를 여러 개 겹쳐도 여전히 곧은 선만 그을 수 있는 것과 같습니다. 자가 많아졌다고 곡선을 그릴 수 있는 것은 아닙니다.

하지만 현실의 데이터는 곧은 선 하나로 설명되지 않는 경우가 많습니다. 스팸 메일은 특정 단어 하나로만 결정되지 않습니다. 고양이 사진은 귀, 눈, 털, 자세, 배경이 복잡하게 얽혀 있습니다. 문장의 의미도 단어 하나하나의 단순 합보다 훨씬 복잡합니다. "별로인 줄 알았는데 의외로 좋았다"라는 문장은 앞부분만 보면 부정처럼 보이지만, 끝까지 읽으면 긍정에 가깝습니다.

이런 패턴을 배우려면 신경망이 직선만 그어서는 안 됩니다. 구부러진 경계, 꺾인 경계, 여러 조각으로 나뉜 경계를 만들 수 있어야 합니다. 활성화 함수는 바로 이 일을 가능하게 합니다.

비선형성이 신경망에 힘을 준다

활성화 함수의 가장 중요한 역할은 신경망에 비선형성을 넣는 것입니다. 비선형성이라는 말은 어렵게 들리지만, 단순히 말하면 "곧은 선 하나로 표현되지 않는 성질"입니다.

예를 들어 어떤 데이터를 분류해야 하는데, 한쪽에 동그랗게 모인 점들과 그 바깥쪽에 퍼진 점들을 나눠야 한다고 합시다. 직선 하나로는 안쪽과 바깥쪽을 깔끔하게 나누기 어렵습니다. 선을 어떻게 그어도 한쪽이 새어 나갑니다. 이때 필요한 것은 곧은 선 하나가 아니라, 데이터를 감싸는 구부러진 경계입니다.

활성화 함수는 각 층의 계산 중간에 작은 꺾임을 만듭니다. 이 꺾임이 여러 뉴런과 여러 층을 지나며 조합되면 신경망은 훨씬 복잡한 모양의 판단 기준을 만들 수 있습니다.

다시 말해, 신경망이 똑똑해지는 이유는 단순히 뉴런이 많아서가 아닙니다. 뉴런이 만든 선형 계산 사이사이에 활성화 함수가 들어가 계산의 흐름을 비틀어 주기 때문입니다. 이 비틀림 덕분에 신경망은 단순한 직선 분류기를 넘어 복잡한 패턴을 표현하는 모델이 됩니다.

층을 쌓는 일이 의미를 갖는 것도 이 지점부터입니다. 활성화 함수가 없다면 층을 쌓아도 하나의 큰 계산으로 접혀 버립니다. 하지만 활성화 함수가 들어가면 각 층은 이전 층의 출력을 새로운 방식으로 해석하고, 다음 층은 그 해석을 다시 조합합니다.

이제 신경망은 단순히 숫자를 더하는 기계가 아니라, 입력을 단계적으로 변형하며 더 좋은 표현을 찾아가는 시스템이 됩니다.

ReLU: 음수는 끄고, 양수는 통과시킨다

현대 딥러닝에서 가장 자주 만나는 활성화 함수 중 하나는 ReLU입니다. ReLU는 "Rectified Linear Unit"의 줄임말입니다. 이름은 길지만 동작은 아주 단순합니다.

ReLU(z) = max(0, z)

즉 입력이 0보다 작으면 0으로 만들고, 0보다 크면 그대로 통과시킵니다.

입력 zReLU 출력
-30
-10
00
22
55

ReLU를 문장으로 표현하면 이렇습니다.

"음수 신호는 끄고, 양수 신호는 그대로 보낸다."

이 단순함이 ReLU의 큰 장점입니다. 계산이 빠르고, 이해하기 쉽고, 많은 문제에서 잘 작동합니다. 신경망 안의 뉴런이 어떤 입력에 강하게 반응하면 양수 값이 나오고, ReLU는 그 신호를 다음 층으로 보냅니다. 반대로 별로 중요하지 않거나 반대 방향의 신호가 나오면 음수가 되고, ReLU는 그것을 0으로 잘라냅니다.

이것은 마치 수많은 스위치가 달린 회로와 비슷합니다. 어떤 뉴런은 켜지고, 어떤 뉴런은 꺼집니다. 모든 뉴런이 항상 애매하게 반응하는 것이 아니라, 필요한 뉴런만 강하게 반응할 수 있습니다. 이런 성질은 신경망이 복잡한 입력에서 중요한 특징을 골라내는 데 도움이 됩니다.

예를 들어 이미지 분류 모델을 생각해 봅시다. 어떤 뉴런은 세로 선에 반응하고, 어떤 뉴런은 둥근 모양에 반응하고, 어떤 뉴런은 특정 질감에 반응할 수 있습니다. 입력 이미지에 세로 선이 뚜렷하면 해당 뉴런은 양수 신호를 내보내고, ReLU는 그 신호를 통과시킵니다. 반대로 그 특징이 없으면 신호가 0에 가까워지거나 잘려 나갑니다.

ReLU의 또 다른 장점은 학습을 비교적 빠르게 만든다는 점입니다. 뒤에서 역전파를 배울 때 더 자세히 보겠지만, 신경망은 오차를 줄이기 위해 기울기를 거슬러 올라가며 가중치를 고칩니다. 이때 ReLU는 양수 구간에서 기울기가 일정합니다. 신호가 너무 작게 줄어들지 않고 뒤쪽 층에서 앞쪽 층으로 비교적 잘 전달됩니다.

물론 ReLU가 완벽한 함수는 아닙니다. 음수 구간에서는 출력이 항상 0이기 때문에, 어떤 뉴런이 계속 음수만 내보내면 학습 중에 거의 반응하지 않는 상태가 될 수 있습니다. 이런 현상을 흔히 "죽은 ReLU"라고 부릅니다. 이름이 조금 섬뜩하지만 의미는 단순합니다. 뉴런이 계속 꺼져 있어서 더 이상 유용한 신호를 보내지 못하는 상태입니다.

그래도 ReLU는 단순함과 성능의 균형이 좋아서 많은 신경망의 기본 선택지로 쓰입니다. 처음 딥러닝 모델을 만들 때 은닉층의 활성화 함수로 ReLU를 선택하는 것은 꽤 안전한 출발점입니다.

Sigmoid: 값을 0과 1 사이로 눌러 담기

ReLU보다 먼저 널리 쓰인 대표적인 활성화 함수로 Sigmoid가 있습니다. Sigmoid는 어떤 입력이 들어와도 출력을 0과 1 사이로 바꿉니다.

Sigmoid(z) = 1 / (1 + e^(-z))

수식은 조금 복잡해 보이지만 모양은 부드러운 S자 곡선입니다. 입력이 아주 작으면 출력은 0에 가까워지고, 입력이 아주 크면 출력은 1에 가까워집니다. 입력이 0이면 출력은 0.5입니다.

입력 zSigmoid 출력의 느낌
매우 작은 음수0에 가까움
00.5
매우 큰 양수1에 가까움

이 성질 때문에 Sigmoid는 "확률처럼 해석하고 싶은 값"을 만들 때 자주 등장합니다. 예를 들어 이메일이 스팸일 확률을 하나의 숫자로 출력하고 싶다면 Sigmoid가 잘 어울립니다. 출력이 0.91이라면 "스팸일 가능성이 높다", 출력이 0.08이라면 "스팸일 가능성이 낮다"고 해석할 수 있습니다.

하지만 Sigmoid를 깊은 신경망의 중간층에 많이 넣으면 문제가 생길 수 있습니다. 입력이 너무 크거나 너무 작을 때 Sigmoid 곡선은 거의 평평해집니다. 출력이 0이나 1 근처에 붙어 버리기 때문입니다. 곡선이 평평하다는 것은 기울기가 작다는 뜻입니다.

딥러닝에서 기울기는 학습의 방향을 알려 주는 신호입니다. 기울기가 작아지면 가중치를 어떻게 고쳐야 할지에 대한 신호도 약해집니다. 특히 층이 깊어질수록 이 작은 기울기들이 계속 곱해지면서 앞쪽 층까지 거의 전달되지 않을 수 있습니다. 이것을 기울기 소실이라고 부릅니다.

기울기 소실은 깊은 신경망을 학습하기 어렵게 만드는 대표적인 문제입니다. 모델이 틀렸다는 사실은 알지만, 앞쪽 층의 가중치까지 "어떻게 고쳐야 하는지"라는 메시지가 희미하게 전달되는 상황입니다. 마치 맨 뒤에서 "조금 왼쪽으로!"라고 외쳤는데, 여러 방을 거치며 목소리가 작아져 맨 앞 사람에게는 거의 들리지 않는 것과 같습니다.

그래서 Sigmoid는 오늘날 깊은 은닉층 전체에 무작정 넣기보다는, 주로 이진 분류의 마지막 출력층처럼 0과 1 사이 값이 필요한 곳에서 자주 사용됩니다.

Tanh: -1과 1 사이에서 균형 잡기

Sigmoid와 비슷하지만 출력 범위가 다른 함수로 Tanh가 있습니다. Tanh는 "하이퍼볼릭 탄젠트"라고 읽습니다. 이름은 어렵지만 핵심은 간단합니다.

Tanh는 입력을 -1과 1 사이 값으로 바꿉니다.

입력 zTanh 출력의 느낌
매우 작은 음수-1에 가까움
00
매우 큰 양수1에 가까움

Sigmoid는 출력이 0과 1 사이이므로 항상 양수입니다. 반면 Tanh는 음수와 양수를 모두 가질 수 있고, 중심이 0입니다. 이 점은 학습에서 장점이 될 수 있습니다. 출력이 0을 중심으로 퍼져 있으면 다음 층이 신호를 해석할 때 한쪽으로 치우친 값만 받지 않아도 되기 때문입니다.

쉽게 말해 Sigmoid는 "꺼짐에 가까움"과 "켜짐에 가까움"을 0과 1 사이로 표현합니다. Tanh는 "반대 방향으로 강함"과 "정방향으로 강함"을 -1과 1 사이로 표현합니다. 그래서 어떤 상황에서는 Tanh가 Sigmoid보다 균형 잡힌 신호를 보낼 수 있습니다.

하지만 Tanh도 Sigmoid와 비슷한 약점을 가집니다. 입력이 너무 크거나 너무 작으면 출력이 -1이나 1 근처에 붙어 버리고, 곡선이 평평해집니다. 그러면 기울기가 작아지고, 깊은 신경망에서는 기울기 소실 문제가 생길 수 있습니다.

정리하면 Sigmoid와 Tanh는 출력을 일정한 범위 안에 부드럽게 눌러 담는 함수입니다. 이 부드러운 성질은 장점이지만, 깊은 모델에서는 학습 신호를 약하게 만들 수 있습니다. 그래서 현대의 많은 기본 신경망에서는 은닉층에 ReLU 계열 함수를 먼저 고려하는 경우가 많습니다.

활성화 함수는 기울기의 길을 바꾼다

지금까지 활성화 함수가 순전파, 즉 입력에서 예측으로 가는 길에서 어떤 역할을 하는지 보았습니다. 하지만 활성화 함수는 반대 방향에서도 중요합니다. 바로 학습할 때입니다.

딥러닝의 학습은 크게 보면 이런 흐름입니다.

모델이 예측한다 → 틀린 정도를 손실로 계산한다 → 어느 가중치가 오차에 얼마나 영향을 줬는지 본다 → 조금씩 수정한다 → 반복한다

여기서 "어느 가중치가 오차에 얼마나 영향을 줬는지"를 계산할 때 기울기가 필요합니다. 기울기는 손실을 줄이기 위해 가중치를 어느 방향으로 움직여야 하는지 알려 주는 나침반입니다.

그런데 신경망에는 가중치 계산만 있는 것이 아닙니다. 중간중간 활성화 함수가 들어 있습니다. 따라서 오차 신호가 뒤에서 앞으로 되돌아갈 때도 활성화 함수를 지나야 합니다. 이때 활성화 함수의 기울기가 크면 신호가 비교적 잘 전달되고, 기울기가 아주 작으면 신호가 약해집니다.

Sigmoid와 Tanh는 양 끝으로 갈수록 곡선이 평평해집니다. 평평한 구간에서는 기울기가 거의 0입니다. 만약 여러 층에서 이런 작은 기울기가 계속 곱해지면 어떻게 될까요? 처음에는 작았던 신호가 점점 더 작아져 거의 사라집니다. 이것이 기울기 소실의 직관입니다.

반면 ReLU는 양수 구간에서 기울기가 1입니다. 1을 곱하면 신호의 크기가 줄지 않습니다. 그래서 ReLU는 깊은 신경망에서 학습 신호를 더 잘 흘려보내는 데 도움이 됩니다. 물론 음수 구간에서는 기울기가 0이므로 그쪽 길은 막힙니다. 하지만 전체적으로 보면 Sigmoid나 Tanh를 깊게 쌓았을 때보다 학습이 수월한 경우가 많습니다.

활성화 함수는 단순히 출력 모양을 예쁘게 바꾸는 장식이 아닙니다. 예측이 앞으로 흘러가는 길도 만들고, 오차가 뒤로 돌아오는 길도 바꿉니다. 그래서 활성화 함수의 선택은 모델의 표현력뿐 아니라 학습 안정성에도 큰 영향을 줍니다.

어떤 활성화 함수를 선택해야 할까

처음 딥러닝을 배울 때는 활성화 함수의 종류가 많아 보여 혼란스럽습니다. ReLU, Sigmoid, Tanh뿐 아니라 Leaky ReLU, GELU, Softmax 같은 이름도 등장합니다. 하지만 처음부터 모든 함수를 외울 필요는 없습니다. 먼저 각 함수가 어떤 상황에서 자주 쓰이는지 감각을 잡으면 됩니다.

실전에서 출발점으로 삼을 만한 기준은 다음과 같습니다.

  • 은닉층에서는 보통 ReLU 계열 함수를 먼저 고려합니다. 계산이 단순하고 깊은 모델에서도 비교적 학습이 잘됩니다.

  • 이진 분류의 마지막 출력층에서는 Sigmoid를 자주 사용합니다. 출력을 0과 1 사이 값으로 만들어 확률처럼 해석하기 좋기 때문입니다.

  • 값의 중심을 0 근처에 두고 싶거나 순서 데이터 모델의 일부 구조에서는 Tanh가 쓰일 수 있습니다. 다만 깊은 은닉층 전체에 사용할 때는 기울기 소실을 조심해야 합니다.

  • 여러 클래스 중 하나를 고르는 문제의 마지막 출력층에서는 Softmax를 사용합니다. Softmax는 여러 점수를 클래스별 확률처럼 바꿔 주는 함수인데, 뒤에서 분류 모델을 만들 때 다시 만나게 됩니다.

중요한 것은 "어떤 함수가 항상 최고인가"가 아닙니다. 문제의 종류, 모델의 깊이, 데이터의 성격, 출력값을 어떻게 해석하고 싶은지에 따라 선택이 달라집니다. 다만 초보자라면 은닉층은 ReLU, 이진 분류 출력은 Sigmoid라는 기준으로 시작해도 좋습니다. 그다음 모델이 잘 학습되지 않을 때 다른 선택지를 탐색하면 됩니다.

작은 코드로 보는 활성화 함수

활성화 함수는 개념적으로 중요하지만, 코드로 보면 매우 단순합니다. NumPy로 세 가지 함수를 써 보면 다음과 같습니다.

import numpy as np

def relu(z):
    return np.maximum(0, z)

def sigmoid(z):
    return 1 / (1 + np.exp(-z))

def tanh(z):
    return np.tanh(z)

x = np.array([-3, -1, 0, 1, 3])

print(relu(x))
print(sigmoid(x))
print(tanh(x))

출력의 모양을 눈으로 상상해 봅시다. ReLU는 음수를 모두 0으로 만들고 양수는 그대로 둡니다. Sigmoid는 모든 값을 0과 1 사이로 부드럽게 밀어 넣습니다. Tanh는 모든 값을 -1과 1 사이로 밀어 넣되, 0을 중심으로 양쪽에 펼칩니다.

이 작은 함수들이 신경망의 층 사이에 끼어 들어가면 모델의 성격이 크게 달라집니다. 같은 가중치 계산을 하더라도 어떤 활성화 함수를 통과하느냐에 따라 다음 층이 받는 신호가 달라지고, 학습 중에 되돌아오는 기울기도 달라집니다.

딥러닝에서는 작아 보이는 선택이 종종 큰 차이를 만듭니다. 활성화 함수가 바로 그런 선택입니다.

활성화 함수가 층에 의미를 부여한다

이 장의 핵심으로 다시 돌아가 봅시다. 왜 활성화 함수가 필요할까요?

가장 중요한 이유는 층을 쌓는 일이 진짜 의미를 갖게 만들기 위해서입니다. 선형 계산만 쌓으면 하나의 선형 계산으로 합쳐집니다. 아무리 층이 많아도 표현력이 크게 늘지 않습니다. 하지만 각 층 사이에 활성화 함수가 들어가면 계산이 접히고, 꺾이고, 잘리며 새로운 형태를 만듭니다.

이때부터 신경망은 입력을 단계적으로 변형할 수 있습니다. 첫 번째 층은 단순한 특징을 잡고, 다음 층은 그 특징들의 조합을 보고, 더 깊은 층은 더 추상적인 패턴을 만들 수 있습니다. 이미지 모델에서는 선과 모서리에서 출발해 눈, 코, 얼굴 같은 구조로 나아갈 수 있고, 텍스트 모델에서는 단어의 단서에서 출발해 문맥과 의미의 조합으로 나아갈 수 있습니다.

물론 이것이 자동으로 마법처럼 일어나는 것은 아닙니다. 좋은 데이터, 적절한 손실 함수, 안정적인 최적화, 충분한 학습이 필요합니다. 하지만 활성화 함수가 없다면 이 모든 과정은 훨씬 힘을 잃습니다. 신경망이 깊어져도 깊어진 만큼의 표현력을 얻기 어렵기 때문입니다.

활성화 함수는 신경망 안에서 작지만 결정적인 문지기입니다. 어떤 신호는 통과시키고, 어떤 신호는 줄이고, 어떤 신호는 0으로 막습니다. 그리고 그 선택들이 층층이 쌓이며 모델은 복잡한 세상을 조금씩 이해할 수 있는 형태로 바꿔 갑니다.

오늘의 핵심 정리

활성화 함수는 뉴런이 만든 점수 z를 변형해 다음 층으로 넘기는 함수입니다. 보통 a = f(z)처럼 표현하며, 신경망에 비선형성을 부여하는 핵심 장치입니다.

선형 함수만 여러 층으로 쌓으면 결국 하나의 선형 함수와 같아집니다. 그래서 활성화 함수가 없다면 깊은 신경망도 복잡한 패턴을 충분히 표현하기 어렵습니다. 활성화 함수가 들어가야 층을 쌓는 일이 단순한 덧셈 이상의 의미를 갖습니다.

ReLU는 음수를 0으로 자르고 양수는 그대로 통과시키는 단순한 함수입니다. 계산이 빠르고, 양수 구간에서 기울기가 잘 전달되어 많은 신경망의 은닉층에서 기본 선택지로 쓰입니다.

Sigmoid는 출력을 0과 1 사이로 만들기 때문에 이진 분류의 마지막 출력층에서 유용합니다. Tanh는 출력을 -1과 1 사이로 만들고 중심이 0이라는 장점이 있습니다. 하지만 두 함수 모두 입력이 너무 크거나 작으면 기울기가 작아져 기울기 소실 문제가 생길 수 있습니다.

활성화 함수는 앞으로 가는 예측 신호뿐 아니라 뒤로 돌아오는 학습 신호에도 영향을 줍니다. 따라서 활성화 함수의 선택은 모델의 표현력과 학습 안정성을 함께 좌우합니다.

다음 장에서는 이제 층을 쌓는다는 일이 정확히 무엇을 의미하는지 살펴보겠습니다. 뉴런 하나, 활성화 함수 하나를 넘어 여러 층이 협력할 때 신경망은 어떻게 단순한 입력을 더 깊은 표현으로 바꾸어 갈까요?

책 목록

처음 만나는 딥러닝: 신경망에서 Transformer와 LLM까지

전체 목차 보기

이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.

틸노트는 사용자가 AI를 활용해 노트를 쉽게 작성하거나 편집할 수 있는 서비스입니다.

AI 스퀘어 단톡방에 함께해요

AI 활용과 틸노트 사용 팁을 나누는 오픈채팅방입니다. 입장 비밀번호는 tilnote입니다.

참여하기