qordnswnd123 2025. 1. 13. 19:48

1. 활성화 함수 (activation function)

1) 활성화 함수의 필요성

인공신경망이 정말 복잡한 문제들을 풀 수 있도록 만들기 위해서는, 단순히 입력 신호와 가중치의 곱만 계산하는 것으로는 부족합니다.

이를 위해 활성화 함수라는 것이 필요합니다.

이 함수는 신호와 노드가 받은 입력값을 처리한 지점에서, 다음 단계로 어떤 신호를 보낼지 결정하게 해줍니다.

활성화 함수의 주된 역할은 노드가 얼마나 활성화 될지를 결정하는 것입니다.

만약 신호의 크기가 중요하다면, 활성화 함수는 노드 활성화가 다음 레벨로 강한 신호를 보낼지 약한 신호를 보낼지 결정해줍니다.

신경망을 복잡하게 만들거나 전혀 보내지 않을 경우, 이러한 활성화 함수는 네트워크의 성능에 큰 영향을 미칩니다.

결론적으로, 활성화 함수는 신경망이 단순히 선형 계산만 하는 데에서 벗어나, 곡선이나 더 복잡한 관계를 배울 수 있도록 도와줍니다.

2) 활성화의 의미

활성화란, 인공 신경망에서 특정 노드가 충분한 신호를 받았을 때 다음 레이어로 정보를 전달한다는 것을 의미합니다.

활성화 함수가 노드를 켜진 상태(보통 1 또는 다른 양의 값)로 만들면, 노드는 신호를 다음 단계로 전달합니다.

반대로 꺼진 상태(0 또는 음의 값)면, 노드는 신호를 보내지 않습니다.

입력 x1, x2가 각각의 가중치 w1, w2를 통해 전달되고, 편향 bias이 더해져서 a를 생성합니다.

a는 다시 활성화 함수 h를 통과하여 최종 출력 y가 됩니다.


2. 계단 함수 (step function)

1) 계단 함수란

기본적인 활성화 함수 중 하나인 계단 함수는 이름처럼 계단 모양을 하고 있습니다.

계단 함수는 입력값이 특정 임계값보다 크거나 작을 때 두 가지의 고유한 값(보통 0과 1) 중 하나를 출력하는 함수입니다. 이는 신경망에서 초기 활성화 함수로 사용되며, 뉴런의 출력이 활성화 되거나 비활성화 되는 이진 결과를 제공합니다.

일상적인 예로, 시험에서 특정 점수 이상을 받아야 합격하는 것을 생각해보겠습니다.

만약 임계값이 80점이라면, 80점을 넘는 사람은 합격한다는 것처럼, 신경망에서도 활성화 함수가 이런 "합격선"을 결정해줍니다.

이 방식으로 신경망은 어떤 입력 정보가 중요한지를 판단하고, 이에 따라 학습해 나갑니다.

2) 언제 사용하는가?

계단 함수는 초기 신경망과 퍼셉트론에서 출력을 결정하기 위해 사용되었습니다.

이 함수를 사용하는 주된 이유는 출력을 간단한 이진 값으로 처리하기 위해서입니다.

이를 통해 노드가 "켜짐(1)" 또는 "꺼짐(0)" 상태를 갖도록 하며, 간단한 결정을 내려 문제를 해결할 수 있습니다.

3) 계단 함수의 장단점 & 특징

  • 장점: 간단히 매우 간단하며, 이해하기 쉽습니다.
  • 단점: 임계값을 기준으로만 판단이 되기 때문에, 임계값에 가중치를 업데이트할 때 사용되는 값의 변화가 매우 제한적이고, 비선형 문제를 해결하기 어렵습니다.
  • 특징: 입계값에 따라 0 또는 1을 출력만을 가지며, 비선형 함수입니다.

3. 계단 함수와 그 한계

1) 그래프와 수식

계단 함수는 매우 간단한 형태의 활성화 함수로, 입력값이 특정 임계값 이상일 때는 1을, 그렇지 않을 때는 0을 출력합니다.

 

왼쪽 그림

  • 빨간색 실선: 계단 함수의 그래프를 나타냅니다. 이 함수는 입력 x가 임계값 theta보다 클 때 1의 값을 출력하고, theta 이하일 때는 0을 출력합니다. 이 그래프에서 임계값 theta는 0으로 설정되어 있습니다.
  • 파란색 점선: 계단 함수의 미분을 나타내는 그래프입니다. 계단 함수는 x = 0에서 불연속적이며, 대부분의 지점에서 0입니다.

오른쪽 그림

  • 계단 함수의 수식을 나타냅니다. 수식 f(x) = {0 if x ≤ θ, 1 if x > θ}은 입력 x가 theta보다 큰 경우에만 1을, 그렇지 않을 때는 0을 반환하는 함수입니다.
  • 계단 함수의 주요 한계는 불연속적이고, x = θ인 모든 지점에서 값이 정의되지 않습니다. 이로 인해 계단 함수가 분석적으로나 미분이 필요한 학습에 적합하지 않습니다.

2) 주의사항

계단 함수를 사용할 때는 그래디언트 기반의 학습 방법을 적용할 수 없다는 점을 유의해야 합니다.

따라서 신경망이 복잡한 문제를 해결하는 데는 적합하지 않습니다.

 

3) 해결 방안

계단 함수의 한계를 극복하기 위해, 신경망에서는 시그모이드나 ReLU 같은 다른 활성화 함수들이 널리 사용됩니다.

이 함수들은 연속적으로 미분 가능하므로, 그래디언트 기반 학습에 적합합니다.


4. 시그모이드(Sigmoid) 함수

1) 시그모이드 함수

시그모이드 함수는 자연스러운 S자 형태의 곡선을 그리는 함수입니다.

이 함수는 실수 입력값을 받아 0과 1 사이의 값으로 변환해 줍니다.

이러한 특성 때문에 확률을 나타내거나, '예' 또는 '아니오'로 구분되는 이진 분류 문제에서 중요한 결정을 내리는 데 아주 적합합니다.

2) 언제, 왜 사용하는가?

시그모이드 함수는 주로 뉴런의 활성화를 결정하는 데 사용됩니다.

이는 뉴런의 출력 값을 단순한 직선 형태가 아닌 비선형 함수이기 때문입니다.

비선형성은 신경망이 단순한 문제뿐만 아니라, 음성 인식이나 이미지 인식과 같은 복잡한 패턴을 학습할 수 있게 해줍니다. 신경망은 이러한 비선형성을 통해 사이의 복잡하고 추상적인 관계를 모델링할 수 있게 됩니다.

또한, 이 함수의 결과를 확률로 해석하기 쉬우며, 이는 분류 문제에서 결정적인 요소가 됩니다.

예를 들어, 이 함수는 환자의 병이 특정 질병인지 아닌지를 예측하거나, 특정 입력에 따른 증상이 특정 질병을 나타내는지를 결정하는 데 매우 유용하게 쓰입니다.

3) 그래프와 수식

왼쪽 그림

  • 빨간색 실선: 시그모이드 함수의 곡선을 보여줍니다. x값에 대해 0에서 1 사이의 값을 부드럽게 전환하는 S자 형태의 곡선입니다.
  • 파란색 점선: 시그모이드 함수의 미분을 나타내는 곡선입니다. x=0 근처에서 가장 높은 값을 가지며, x의 값이 커지거나 작아질수록 0에 접근하는 형태를 보입니다.

오른쪽 그림

  • 시그모이드 함수의 수식과, 시그모이드 함수를 미분한 결과입니다. 이 미분 공식은 그래프에 나타난 미분 곡선의 모양과 관계가 있으며, 시그모이드 함수가 어떻게 변화하는지, 즉 그 기울기가 어떻게 변하는지를 수학적으로 표현해 줍니다.

5. 기울기 소실

1) 기울기 소실이란

기울기 소실이란 신경망을 학습시킬 때 발생하는 문제로, 네트워크의 깊이가 깊어질수록 그래디언트가 점차 작아져 가중치 업데이트가 제대로 이루어지지 않는 현상입니다.

이는 시그모이드와 같은 일부 활성화 함수에서 그 미분값이 0에 근접하는 영역이 존재하기 때문에 발생합니다.

2) 기울기 소실의 발생 원인

기울기 소실은 주로 신경망에서 활성화 함수로 시그모이드 함수를 사용할 때 발생합니다.

시그모이드 함수의 출력값이 0에 가까워지거나 1에 가까워질 때, 이 함수의 미분값은 매우 작아집니다.

역전파 과정에서 이 작은 미분값들이 곱해지면서, 초기 층으로 전파될 때까지 점점 더 작아져서 실질적으로 가중치를 업데이트하는 데 필요한 그래디언트가 거의 없어지게 됩니다.

3) 기울기 소실, 심층 신경망의 문제

위쪽 그림은 "깊은 신경망"의 구조를 나타내며, 많은 계층(layer)을 통과하며 정보가 처리되는 것을 보여줍니다.

각 계층은 뉴런으로 이루어져 있으며, 이 뉴련들은 앞선 계층의 뉴런들과 완전히 연결되어 있습니다.

이러한 연결을 통해 데이터는 입력층에서 출력층으로 흐르게 되고, 각 뉴런은 입력 데이터 기반으로 활성화된 출력을 생성합니다.

 

아래쪽 그림은 깊은 신경망에서 "기울기 소실"이 일어나는 상황을 보여줍니다.

이 문제를 해결하기 위해 가중치는 지속적으로 조정되어야 하는데, 이 조정 과정은 출력층에서부터 시작하여 역전파 방향으로 각 뉴런들로 기울기를 전달하며 이루어집니다.

그런데 네트워크가 깊어질수록 이 기울기의 값이 작아져(미분값이 작아지면서), 초기 층에 도달할 때는 거의 사라지게 되는, 이를 기울기 소실이라고 합니다.

 

이렇게 되면, 네트워크의 초기 계층에 있는 뉴런들은 충분한 오류 신호를 받지 못하게 되어, 학습이 제대로 진행되지 않게 됩니다.

그림에서는 이를 표현하기 위해 연결선이 점점 희미해지는 것으로 나타냈습니다.

이로 인해 신경망의 가중치가 적절히 조정되지 않고, 따라서 모델이 효과적으로 학습되지 않는 문제가 발생합니다.

 

기울기 소실은 신경망 학습의 효율성을 크게 저하시킵니다.

특히 깊은 신경망에서는 초기 층의 학습이 거의 일어나지 않게 됨으로써, 전체적인 학습 과정에 악영향을 미칩니다.

4) 기울기 소실의 해결 방안

기울기 소실 문제에 대한 가장 효과적인 해결책 중 하나는 ReLU(Rectified Linear Unit) 함수나 그 변형들을 사용하는 것입니다.

이 활성화 함수들은 미분값이 0으로 떨어지지 않게 해줌으로써, 기울기 소실 문제를 크게 완화시킬 수 있습니다.


6. 시그모이드 함수 코드

1) 문제 1 : 시그모이드 함수 적용

  • [-1.0, 0.0, 1.0]이라는 리스트(list)를 텐서(tensor) 형태로 변환합니다.
  • 주어진 텐서에 대해 요소별로 시그모이드 함수를 적용합니다. 시그모이드 함수는 1 / (1 + exp(-x))로 정의됩니다. 여기서 x는 입력 텐서의 각 요소입니다.
  • 시그모이드 함수는 torch.sigmoid() 함수를 사용하여 적용할 수 있습니다.
  • torch.sigmoid() 함수의 인자에는 적용하고자 하는 텐서(linear_output)를 인자로 전달합니다.
import torch

torch_data = torch.tensor([-1.0, 0.0, 1.0])
sigmoid_torch_result = torch.sigmoid(torch_data)

print(sigmoid_torch_result)
tensor([0.2689, 0.5000, 0.7311])

2) 문제 2 : 파이토치를 이용한 신경망 구성 기초

  • torch: 텐서 조작 및 딥 러닝 모델을 위한 주요 PyTorch 라이브러리입니다. 다양한 수학 함수가 포함되어 있으며, GPU에서 실행할 수 있는 기능을 제공합니다.
  • torch.nn: 신경망을 구축할 때 필요한 다양한 도구와 레이어가 포함된 PyTorch의 서브모듈입니다. 여기에는 레이어, 활성화 함수, 손실 함수 등이 포함됩니다.
  • 2개의 입력 특성을 받아서 1개의 출력 특성을 생성하는 선형 레이어를 정의합니다. 선형 레이어는 입력에 대해 output = input * weight + bias 형태의 선형 변환을 적용합니다. 여기서 가중치(weight)와 편향(bias)은 모두 훈련 중에 레이어가 학습하게 될 매개변수입니다.

 

import torch
import torch.nn as nn

# 선형 층 정의 (입력 특성 2개, 출력 특성 1개)
linear_layer = nn.Linear(in_features=2, out_features=1)

 

  • 정규분포를 이용하여 '(1, 2)' 형태의 랜덤 텐서를 생성합니다. 이는 배치 크기가 1이고 2개의 입력 특성을 가진 단일 데이터 샘플을 나타냅니다.배치 크기(batch size)란 모델을 훈련시킬 때, 한 번에 네트워크로 전달되는 데이터 샘플의 수를 말합니다. 여기서는 '배치 크기가 1'이라고 하였으니, 이는 모델이 한 번에 하나의 데이터 샘플만을 처리한다는 의미입니다. 각 데이터 샘플은 입력 특성을 가지고 있으며, 여기서는 2개의 입력 특성을 가진 단일 데이터 샘플을 사용합니다.
  • 생성된 입력 텐서는 앞서 생성한 선형 레이어를 통과합니다. 이 작업의 출력은 입력 텐서에 선형 변환이 적용된 새로운 텐서입니다.
  • 마지막으로 선형 레이어의 출력에 시그모이드 활성화 함수가 적용됩니다. 시그모이드 함수는 sigmoid(x) = 1 / (1 + exp(-x))로 정의되며 입력 값을 0과 1 사이로 압축합니다. 이는 이진 분류 문제 또는 마지막 레이어에 유용합니다. 확률 예측을 목표로 하는 신경망의 예입니다.
# 임의의 입력 텐서 생성 (배치 크기 1, 입력 특성 2개)
input_tensor = torch.randn(1, 2)
print("랜덤으로 생성한 입력 텐서:\n", input_tensor)

# 선형 층을 통과
linear_output = linear_layer(input_tensor)
print("\n선형(Linear) 레이어 출력:\n", linear_output)

# 시그모이드 활성화 함수 적용
sigmoid_output = torch.sigmoid(linear_output)
print("\n시그모이드(Sigmoid) 출력:\n", sigmoid_output)
랜덤으로 생성한 입력 텐서:
 tensor([[-0.7357,  0.3785]])

선형(Linear) 레이어 출력:
 tensor([[0.1862]], grad_fn=<AddmmBackward0>)

시그모이드(Sigmoid) 출력:
 tensor([[0.5464]], grad_fn=<SigmoidBackward0>)

 

※ 결과 해석

1) 랜덤으로 생성한 입력 텐서

이 입력 텐서는 두 개의 요소를 가지고 있습니다.

이는 신경망에 입력될 데이터 포인트 하나를 나타냅니다. 여기서 각 요소는 선형 레이어로 전달될 두 개의 입력 특성에 해당합니다.

2) 선형(Linear) 레이어 출력

선형 레이어는 입력 텐서에 대해 output = input * weight + bias 형태의 계산을 수행합니다.

여기서 weight와 bias는 레이어의 학습에 해당하는 매개변수입니다.

출력된 값은 이 선형 변환의 결과입니다.

grad_fn=<AddmmBackward>는 부분은 PyTorch의 자동 미분 기능이 이 연산에 대한 미분을 어떻게 처리할지를 나타내는 정보입니다.

3) 시그모이드(Sigmoid) 출력

선형 레이어의 출력에 시그모이드 활성화 함수가 적용됩니다.

시그모이드 함수는 입력값을 받아 0과 1 사이의 값으로 변환합니다.

이는 확률 예측을 돕기 위해 출력값을 확률로 해석할 수 있게 유용합니다.

이 예제에서는 모의 모델이 데이터 포인트가 특정 클래스에 속할 확률을 예측한 결과입니다.

grad_fn=<SigmoidBackward>는 이 연산이 미분에 어떻게 기여하는지에 대한 정보를 포함합니다.


7. 하이퍼볼릭 탄젠트(Tanh) 함수

1) Tanh 함수란

하이퍼볼릭 탄젠트 함수, 또는 단순히 Tanh 함수는 그 형태가 우아한 S자 곡선을 그리는 활성화 함수입니다.

이 함수는 신경망의 입력을 받아 -1과 1 사이의 값으로 압축하여 출력함으로써, 데이터의 스케일을 조정하고 중심을 0 주위로 맞춥니다.

이런 특성은 모델의 학습 과정에 매우 유리한 효과를 가져다주며, 신경망이 더욱 효과적으로 가중치를 조정하게 합니다.

2)언제, 왜 사용하는가

Tanh 함수는 특히 신경망의 은닉층에서 자주 볼 수 있습니다.

그 이유는 이 함수가 출력 값을 -1과 1 사이로 조정함으로써, 데이터를 0을 중심으로 분포되게 하여 학습 과정을 안정시키고 가속화하기 때문입니다.

Sigmoid 함수와 달리 출력 범위를 가지기 때문에, 올리기 더 견고하며 학습 중 발생할 수 있는 기울기 소실 문제에 더 강건합니다.

3) 그래프와 수식

 

왼쪽 그림

  • 빨간색 실선: 하이퍼볼릭 탄젠트 함수의 곡선을 보여줍니다. x의 값에 따라 -1에서 1까지의 값을 부드럽게 전환하는 S자 형태의 곡선입니다. 이 함수는 중앙에서 가장 가파르고, x가 증가하거나 감소함에 따라 포화 상태로 접근합니다.
  • 파란색 점선: 하이퍼볼릭 탄젠트 함수의 미분을 나타내는 곡선입니다. x=0 근처에서 최대값을 가지며, x의 절대값이 증가함에 따라 0에 접근하는 형태를 보입니다. 이는 함수가 x가 매우 클 때 또는 매우 작을 때 변화율이 거의 없음을 의미합니다.

오른쪽 그림
하이퍼볼릭 탄젠트 함수의 수식과 그 미분 결과입니다.

하이퍼볼릭 탄젠트 함수는 입력 x에 대해 -1에서 1까지의 값을 가지며, 미분 함수는 미분값이 함수의 출력값에 의존하는 것을 수학적으로 나타냅니다.

이 관계는 그래프에 나타난 미분 곡선의 모양과 일치하며, 하이퍼볼릭 탄젠트 함수가 어떻게 변화하고 그 기울기가 어떻게 변하는지를 보여줍니다.


8. Tanh 함수의 활용성과 한계점

1) Tanh의 장단점

장점

  • 출력의 중심이 0이므로 학습이 더 안정적이고 빠릅니다.: 이는 가중치의 초기화가 더 효율적으로 이루어질 수 있게 하며, 학습 과정에서의 발산 문제를 줄여줍니다.
  • Sigmoid 함수에 비해 기울기 소실 문제를 다소 완화합니다.: Tanh 함수는 Sigmoid 함수보다 출력값 범위가 넓어 (-1, 1), 기울기 소실 문제가 덜 발생합니다.
  • 대칭성 때문에 네트워크 초기 학습에서 더 나은 성능을 보일 수 있습니다.: 대칭성이 있는 함수는 초기 학습 단계에서 가중치를 더 효율적으로 조정할 수 있게 합니다.

단점

  • 여전히 깊은 신경망에서는 기울기 소실 문제가 발생할 수 있습니다.: 비록 Sigmoid 함수보다는 나은 성능을 보이지만, 매우 깊은 신경망에서는 여전히 기울기 소실 문제가 발생할 수 있습니다.
  • ReLU와 같은 다른 활성화 함수에 비해 계산이 복잡합니다.: Tanh 함수는 지수함수를 포함하고 있어, 계산 비용이 더 높습니다.
  • 포화 문제로 인해 학습이 느려질 수 있습니다.: 입력값의 절대값이 클 경우 Tanh 함수의 기울기가 매우 작아져서 학습이 느려질 수 있습니다.

2) 주의사항

  • 네트워크가 깊어질수록 기울기 소실 문제에 주의해야 합니다. Tanh 활성화 함수를 사용하는 깊은 네트워크를 설계할 때는 드롭아웃(dropout)과 같은 기법을 함께 적용하여 기울기 문제를 완화할 수 있습니다.
  • 출력 범위가 -1에서 1까지이므로 출력층에서는 사용하지 않는 것이 일반적입니다. 분류 문제에서는 소프트맥스나 시그모이드와 같은 확률적인 해석을 위한 함수가 더 적합합니다.
  • 입력 데이터의 스케일에 주의해야 합니다. Tanh 함수는 입력값의 범위에 민감하며, 입력 데이터의 사전 처리 과정에서 정규화나 표준화를 통해 적절한 값을 조정하는 것이 중요합니다.

9. 문제 3

torch_data = torch.tensor([-1.0, 0.0, 1.0])
tanh_result = torch.tanh(torch_data)

print(tanh_result)
tensor([-0.7616,  0.0000,  0.7616])

10. 문제4

# 선형 층 정의 (입력 특성 3개, 출력 특성 1개)
linear_layer = nn.Linear(in_features=3, out_features=1)

 

1) 선형 층 정의

입력 특성이 3개이고 출력 특성이 1개인 선형 층을 생성합니다. 선형 층은 입력 데이터에 대해 선형 변환 output = input * weight + bias를 적용합니다. 여기서 가중치(weight)와 편향(bias)은 학습 과정에서 최적화될 파라미터입니다.

2) 임의의 입력 텐서 생성

(1, 3) 크기의 랜덤 텐서를 생성합니다. 이 텐서는 배치 크기가 1이고, 3개의 입력 특성을 가진 단일 데이터 샘플을 나타냅니다. PyTorch의 torch.randn 함수는 표준 정규 분포에서 무작위 값을 생성합니다.

3) 선형 층 통과

생성된 입력 텐서를 선형 층에 전달하여, 선형 변환된 결과를 얻습니다. 이 결과는 선형 층의 가중치와 편향을 사용하여 계산됩니다.

4) 하이퍼볼릭 탄젠트 활성화 함수 적용

선형 층의 출력에 하이퍼볼릭 탄젠트 활성화 함수를 적용합니다. tanh는 입력 값을 범위를 (-1, 1)로 압축하는 비선형 활성화 함수입니다. 모델이 더 복잡한 패턴을 학습할 수 있게 도와줍니다.

 

총합하면, 이 코드는 선형 층을 정의하고, 임의로 생성된 입력 데이터와 이층을 통해 전달한 후, 결과에 비선형성을 추가하는 간단한 신경망의 예시를 보여줍니다. 탄젠트 활성화 함수는 출력 범위를 (-1, 1)로 제한하여 패턴 학습에 유용합니다.

# 임의의 입력 텐서 생성 (배치 크기 1, 입력 특성 3개)
input_tensor = torch.randn(1, 3)
print("Input Tensor:\n", input_tensor)

# 선형 층을 통과
linear_output = linear_layer(input_tensor)
print("\nLinear Layer Output:\n", linear_output)

# 하이퍼볼릭 탄젠트 활성화 함수 적용
tanh_output = torch.tanh(linear_output)
print("\nTanh Output:\n", tanh_output)
Input Tensor:
 tensor([[-0.5376, -0.2425, -0.2360]])

Linear Layer Output:
 tensor([[-0.1926]], grad_fn=<AddmmBackward0>)

Tanh Output:
 tensor([[-0.1902]], grad_fn=<TanhBackward0>)

 

※ 결과 해석

1) 랜덤으로 생성한 입력 텐서

이 텐서는 세 개의 입력 특성을 가진 단일 데이터 샘플을 나타냅니다. 각 숫자는 특성의 값을 의미하며, 이 값들은 임의로 생성된 것입니다.

2) 선형(Linear) 레이어 출력

입력 텐서가 선형 층을 통과한 결과입니다. 이 출력 값은 입력 텐서에 선형 층의 가중치를 곱하고 편향을 더함으로써 계산됩니다. 결과적으로, 선형 변환 후에는 단일 값 -0.1926을 가진 텐서가 생성됩니다.

3) tanh 활성화 함수 출력

선형 층의 출력에 tanh 활성화 함수를 적용한 결과입니다.

tanh 함수는 입력 값을 -1과 1 사이로 압축하는 비선형 활성화 함수로, 이 경우 -0.1926은 -0.1902로 변환됩니다.

이는 tanh 함수가 모델에 비선형성을 도입하여, 더 복잡한 데이터 패턴을 학습할 수 있게 해줍니다.

 

요약하자면, 입력 데이터를 먼저 선형 층을 통해 선형 변환하였고 그 결과는 -0.1926이었습니다.

이후, tanh 활성화 함수를 적용하여 최종 출력값으로 -0.1902을 반환했습니다.


11. 렐루(ReLU) 함수

1) ReLU 함수

ReLU 함수는 신경망에서 활성화되는 신호를 결정하는 단순하지만 강력한 함수입니다.

양수 입력에 대해서는 입력값을 그대로 보내는 반면, 음수 입력에 대해서는 0을 반환하여 신호를 '끄는' 역할을 합니다.

이 간단한 접근 방식은 복잡한 계산 없이 데이터를 효율적으로 처리하도록 돕습니다.

2) 언제 사용하는가

ReLU 함수는 특히 신경망의 은닉층에서 사용이 굉장히 많습니다.

이는 신경망이 비선형 문제를 해결하는 데 필수적인 비선형성을 제공하면서도 계산상의 부담을 최소화하기 때문입니다.

또한, ReLU는 그래디언트 소실 문제를 완화하여 더 깊은 층을 쌓을 수 있어, 신경망이 더 깊게 학습할 수 있게 합니다. ReLU의 도입은 신경망의 학습 속도를 가속화하는 효과가 있습니다.

3) ReLU 함수의 특징

ReLU 함수는 빠른 연산 능력을 가지며, 신경망의 기울기가 극단적으로 작아지거나 사라지지 않는 그래디언트 소실 문제를 완화시켜줍니다.

이로 인해 모델의 학습 단계에서는 진전을 만들 수 있고, 데이터의 복잡한 패턴을 효과적으로 모델링할 수 있습니다.

하지만 ReLU는 일부 단점도 존재합니다.

그 중 하나는 음수 입력에 대해 뉴런이 0만을 출력하게 되면, 해당 뉴런이 다시 활성화되지 않는 '죽은 ReLU' 현상이 발생할 수 있다는 점입니다.

이는 일부 뉴런들이 학습 과정에 기여하지 않게 되어, 모델의 전반적인 학습 능력이 저하될 수 있습니다.

 

그럼에도 불구하고, ReLU 함수는 그 단순성과 효율성 덕분에, 다양한 신경망 구조에서 선호되는 활성화 함수입니다.

이는 입력값이 크게 중요하지 않은 경우 0으로 설정함으로써, 신경망이 중요한 특징에 더 집중할 수 있게 만들어주기 때문입니다.

따라서 신경망을 설계할 때 ReLU와 그 변형들을 적절히 활용하는 것이 중요하며, '죽은 ReLU' 문제에 대비하여 네트워크가 적절한 학습을 유지할 수 있도록 조치를 취하는 것이 필요합니다.

4) 그래프와 수식

왼쪽 그림

  • 빨간색 실선: ReLU(Rectified Linear Unit) 함수의 그래프를 나타냅니다. 이 함수는 입력 xx가 0보다 클 때는 입력값 xx를 그대로 출력하고, 0 이하일 때는 0을 출력합니다. 결과적으로 xx가 양수인 부분에서는 선형적으로 증가하고, 그렇지 않은 경우 0 값을 유지하는 특성을 보입니다.
  • 파란색 점선: ReLU 함수의 미분을 나타내는 그래프입니다. xx가 0보다 클 때는 미분값이 1이 되고, 0 이하일 때는 0이 됩니다. x=0x = 0에서는 함수가 불연속적이므로 미분이 정의되지 않습니다.

오른쪽 그림

  • ReLU 함수의 수식과 그 미분 결과입니다. 함수 f(x)=max⁡(0,x)f(x) = \max(0, x)는 입력 xx가 양수일 때는 xx를 반환하고, 음수일 때는 0의 값을 가집니다. 미분 함수 f′(x)f'(x)는 xx가 양수일 때는 1, 그렇지 않을 때는 0을 반환합니다. x=0x = 0에서는 미분값이 정의되지 않으며, 실제 값의 변화와 기울기의 관계를 보여줍니다.

ReLU 함수를 사용할 때는 "죽은 ReLU" 문제에 주의해야 합니다.

이 문제는 네트워크의 일부가 학습 과정에서 활성화되지 않게 되어 성능을 저하시킬 수 있습니다.

"죽은 ReLU" 문제를 해결하기 위해 변형된 ReLU 함수들이 제안되었습니다.

예를 들어, Leaky ReLU는 음수 입력 값에 대해서도 작은 양의 기울기를 제공하여 모든 뉴런이 죽지 않도록 합니다.


12. 문제 5

import torch

x = torch.tensor([-1.0, 2.0, -3.0, 4.0, -5.0])
relu_output = torch.relu(x)

print(relu_output)
tensor([0., 2., 0., 4., 0.])

13. 문제 6

import torch.nn as nn
# 선형 층 정의
linear_layer = nn.Linear(in_features=5, out_features=1)

 

※ 렐루 활성화 함수 적용

선형 레이어의 출력에 ReLU(Rectified Linear Unit) 활성화 함수가 적용됩니다.

ReLU 함수는 max(0, x)로 정의되어, 입력 값이 0보다 크면 그 값을 그대로 출력하고 0 이하이면 0을 출력합니다.

이는 모델에 비선형성을 도입하며, 특히 깊은 신경망에서는 ReLU가 더 잘 작동하고 학습이 더 빠르게 진행되는 경향이 있습니다.

input_tensor = torch.randn(1, 5)

linear_output = linear_layer(input_tensor)
print("\n선형(Linear) 레이어 출력:\n", linear_output)

relu_output = torch.relu(linear_output)
print("\n렐루(Relu) 레이어 출력:\n", relu_output)
선형(Linear) 레이어 출력:
 tensor([[-0.0005]], grad_fn=<AddmmBackward0>)

렐루(Relu) 레이어 출력:
 tensor([[0.]], grad_fn=<ReluBackward0>)

 

※ 결과 해석

1) 선형(Linear) 레이어 출력

입력 텐서가 선형 레이어를 통과한 결과 값, 출력값은 -0.0005입니다.

선형 레이어는 입력 값에 대해 output = input * weight + bias 형태의 계산을 수행합니다.

여기서 weight와 bias는 레이어에 의해 학습된 매개변수입니다. 출력된 값이 선형 변환의 결과입니다.

 

2) 렐루(ReLU) 레이어 출력

선형 레이어의 출력에 ReLU 활성화 함수가 적용되어, 결과 값은 0입니다.

ReLU 함수는 입력값이 0보다 작으면 0을 반환하지만, 양수일때는 ReLU 함수를 통과해도 값이 유지됩니다.

ReLU 함수는 모델에 비선형성을 도입하며, 모델이 더 복잡한 학습을 할 수 있도록 도와줍니다.


14. 소프트맥스(softmax) 함수

1) Softmax 함수란

Softmax 함수는 다중 클래스 분류 문제에 사용되는 활성화 함수로, 입력받은 벡터를 확률 분포로 변환합니다.

이는 각 클래스가 선택될 확률을 나타내며, 각 원소의 값은 0과 1 사이에 위치하고 전체 합은 1이 됩니다.

이 함수는 특히 신경망의 출력층에서 유용하게 사용됩니다.

2) 언제 사용하는가?

Softmax 함수는 여러 카테고리 중 하나를 선택해야 하는 다중 분류 문제에 적용됩니다.

예를 들어, 이미지 분류, 문서의 주제 분류 등 다양한 분야에서 각 카테고리에 대한 확률을 계산해 가장 높은 확률을 가진 카테고리를 모델의 예측으로 선택할 수 있습니다.

3) Softmax의 장단점

장점

  • 확실성 제공: Softmax는 각 클래스에 대한 확률을 계산하여, 모델의 예측에 대한 확실성을 수치로 제공합니다. 이를 통해 결정의 신뢰도를 평가할 수 있습니다.
  • 다중 클래스 지원: 여러 클래스 중 하나를 선택하는 문제에 대해, 각 클래스의 확률을 명확하게 제시할 수 있습니다.

단점

  • 은닉층에서의 부적합: 각 출력이 다른 출력에 의존적이기 때문에, 은닉층에서는 간단한 독립적인 결정이 필요한 경우 사용하기 부적합합니다.
  • 이진 분류의 비효율성: 이진 분류 문제에서는 sigmoid 함수가 더 적절할 수 있습니다. Softmax는 주로 다중 클래스 분류 문제에 적합합니다.

15. 문제 7

logits = torch.tensor([2.0, 1.0, 0.1])

softmax_result = torch.softmax(logits, dim=0)

print(softmax_result)
tensor([0.6590, 0.2424, 0.0986])

※ 결과 해석

입력 텐서 [2.0, 1.0, 0.1]에 대한 소프트맥스 함수의 결과는 각 클래스에 대한 확률 분포를 나타냅니다. 소프트맥스 함수는 각 원소를 0과 1 사이의 값으로 변환하며, 이 값들의 합은 1입니다.

결과적으로, softmax_result는 모델이 각 클래스에 속할 확률을 나타내는 벡터로, 각 클래스에 대한 모델의 예측 확신도를 수치적으로 제공합니다. 이는 다중 클래스 분류 문제에서 모델의 출력을 해석하는 데 중요한 기준이 됩니다.


16. 문제 8

linear_layer = nn.Linear(in_features=3, out_features=1)
input_tensor = torch.randn(1, 3)

linear_output = linear_layer(input_tensor)
print("\nlinear_output:\n", linear_output)

softmax_output = torch.softmax(linear_output, dim=1)
print("\nSoftmax Output:\n", softmax_output)
linear_output:
 tensor([[-1.1314]], grad_fn=<AddmmBackward0>)

Softmax Output:
 tensor([[1.]], grad_fn=<SoftmaxBackward0>)

※ 결과 해석

소프트맥스 활성화 층 출력(Softmax Output)

출력값은 tensor([[1.]])입니다.

소프트맥스 함수는 입력 벡터의 요소를 확률 분포로 변환하는데, 이 경우 입력 벡터가 하나의 요소만 가지고 있으므로, 그 요소의 소프트맥스 변환 값은 1입니다.

이는 소프트맥스 함수의 특성상 입력 벡터의 모든 요소의 소프트맥스 변환 값의 합이 항상 1이 되어야 하기 때문입니다.

이 결과는 소프트맥스 함수가 입력값을 확률 분포로 변환하는 방법과 이 변환의 결과가 어떤 의미를 가지는지를 보여줍니다.

특히, 입력 벡터의 요소가 하나뿐인 경우, 그 요소의 소프트맥스 변환 값은 당연히 1이 됩니다.