본문 바로가기
Theory/Pytorch

[파이토치 트랜스포머 #6] 3장 파이토치 기초 - 5) 활성화 함수

by 남디윤 2024. 3. 17.

활성화 함수

  • 활성화 함수 Activation Function
    • 인공 신경망에서 사용되는 은닉층을 활성화하기 위한 함수
      • 활성화: 인공 신경망의 뉴런의 출력값을 선형에서 비선형으로 변환하는 것
    • 네트워크가 데이터의 복잡한 패턴을 기반으로 학습하고 결정을 내릴 수 있게 제어함
    • 가중치와 편향으로 이루어진 노드를 선형에서 비선형으로 갱신하는 역할
    • 예) 출근 시간 예측 모델 구현
      • 일어난 시간(x1), 기상 상태(x2)
      • 기상 상태(x2)보다 일어난 시간(x1)이 더 영향력이 크다는 것을 직관적으로 알 수 있음
      • → 연산 과정에서 일어난 시간(x1)은 더 많이 활성화(Activate)돼야 하며, 기상 상태(x2)는 비교적 비활성화(Deactivate)돼야 함
    • 비선형 구조를 가져 역전파 과정에서 미분값을 통해 학습이 진행될 수 있게 함
      • 활성화 함수가 선형 구조라면, 미분 과정에서 항상 상수가 나오므로 학습 진행이 어려움
      • 활성화 함수는 입력을 정규화하는 과정으로 볼 수 있음

 

이진 분류

  • 활성화 함수를 활용해 이진 분류 모델 예측 진행
  • 이진 분류: 규칙에 따라 입력된 값을 두 그룹으로 분류하는 작업
    • 참 또는 거짓으로 결과를 분류하기 때문에 논리 회귀(Logistic Regression) 또는 논리 분류(Logistic Classfication)라고 부름
    • 관측치는 0~1 범위로 예측된 점수를 반환
    • 데이터를 0 또는 1로 분류하기 위해 임계값을 0.5로 설정
    • Y가 0.5보다 작은 값은 거짓, 0.5보다 큰 값은 참
    • Y값이 0~1의 범위를 갖게 하기 위해 시그모이드 함수(Sigmoid Function)와 같은 활성화 함수를 적용함

 

시그모이드 함수

  • S자형 곡선 모양
  • 반환값은 0~1 또는 -1~1의 범위를 가짐
  • 수식
    • 시그모이드의 함수의 x의 계수: S자형 곡선의 경사 결정
      • 계수가 0에 가까워질수록 완만한 경사
      • 0에서 멀어질수록 급격한 경사
  • $$
    Sigmoid(x) = \frac{1}{1 + e^{-x}}
    $$
  • 주로 로지스틱 회귀에 사용됨
    • 독립 변수(X)의 선형 결합을 활용하여 결과를 예측
    • 로지스틱 회귀는 분류에서도 사용 가능
  • 출력값이 0.5보다 낮으면 거짓으로 분류, 0.5보다 크면 참으로 분류
  • 장점
    • 유연한 미분값을 가짐. 입력에 따라 값이 급격하게 변하지 않는다는
    • 출력값의 범위가 0~1사이로 제한 → 정규화 중 기울기 폭주(Exploding Gradient) 문제가 발생하지 않고 미분 식이 단순한 형태를 가짐
  • 단점
    • 기울기 소실(Vanishing Gradient) 문제 발생
      • 신경망은 기울기를 이용해 최적화된 값을 찾아가는데, 계층이 많아지면 점점 값이 0에 수렴되는 문제가 발생해 성능이 떨어짐
    • Y값의 중심이 0이 아님. 입력 데이터가 항상 양수라면, 기울기는 모두 양수 또는 음수가 되어 기울기가 지그재그 형태로 변동하는 문제점 발생 → 학습 효율성 감소

 

이진 교차 엔트로피

  • 이진 분류에 비용 함수로 평균 제곱 오차를 사용하면 좋은 결과를 얻기 힘듦
    • 예측값과 실제값의 값 차이가 작으면 계산되는 오차 또한 크기가 작아져, 학습 진행 어려움
    • → 이진 교차 엔트로피 (Binary Cross Entropy, BCE)를 오차 함수로 사용
  • 이진 교차 엔트로피

 

이진 분류: 파이토치

  • 예제
    • x, y, z와 pass의 관계: x, y, z가 모두 40 이상, 평균 60이상일 때 True 반환
  • 사용자 정의 데이터세트
class CustomDataset(Dataset):
    def __init__(self, file_path):
        df = pd.read_csv(file_path)
        self.x1 = df.iloc[:, 0].values
        self.x2 = df.iloc[:, 1].values
        self.x3 = df.iloc[:, 2].values
        self.y = df.iloc[:, 3].values
        self.length = len(df)

    def __getitem__(self, index):
        x = torch.FloatTensor([self.x1[index], self.x2[index], self.x3[index]])
        y = torch.FloatTensor([int(self.y[index])])
        return x, y

    def __len__(self):
        return self.length

호출 메서드 __getitem__ : x는 입력값 (x1, x2, x3)을 할당하고, y는 실제값(y)를 반환

 

  • 사용자 정의 모델
class CustomModel(nn.Module):
    def __init__(self):
        super().__init__()
        self.layer = nn.Sequential(
          nn.Linear(3, 1),
          nn.Sigmoid()
        )

    def forward(self, x):
        x = self.layer(x)
        return x
  • Module 클래스를 상속받아 사용자 모델 정의
    • super 함수를 통해 Module 클래스 초기화, 사용할 계층을 정의
    • 시퀀셜 Sequential을 활용해 여러 계층을 하나로 묶음. 묶어진 계층을 순차적으로 실행됨. 가독성을 높임
    • 선형 변환 함수의 입력 데이터 차원 크기(in_features)는 3을 입력
    • 출력 데이터 차원 크기 (out_features)는 1을 입력
    • 시그모이드 함수를 적용 예정. 시그 모이드 함수 (nn.Sigmoid)를 선형 변환 함수(nn.Linear) 뒤에 연결
  • 이진 교차 엔트로피
criterion = nn.BCELoss().to(device)
  • 이진 교차 엔트로피 클래스(nn.BCELoss)로 criterion 인스턴스 생성
    • 비용 함수로 criterion 인스턴스에서 순전파를 통해 나온 출력값과 실제값을 비교해 오차를 계산
    • 기존 평균 제곱 오차 클래스(nn.MSELoss) 클래스와 동일한 방식으로 적용

 

비선형 활성화 함수

  • 비선형 활성화 함수 Non-linear Activations Function
    • 네트워크에 비선형성을 적용하기 위해 인공 신경망에서 사용되는 함수
    • 입력이 단순한 선형 조합이 아닌 형태로 출력을 생성하는 함수를 의미
    • 실제 세계의 입출력 관계가 대부분 비선형적인 구조를 갖고 있기 때문
    • → 네트워크가 학습 데이터의 복잡한 패턴과 관계를 학습할 수 있게 지원
  • 계단 함수 Step Function
    • 이진 함수 Binary Activation Funcition이라고도 함
    • 퍼셉트론 Perceptron에서 최초로 사용한 활성화 함수 (초기의 퍼셉트론 모델은 (0, 1 출력 등)간단한 원리에 기반하여 설계되었고, 당신에는 주로 선형적으로 분리 가능한 문제에 초점을 두었기 때문에)
    • 입력값의 합이 임계값을 넘으면 출력이 1이 되고, 넘지 못하면 0을 출력
    • 딥러닝 모델에서는 사용되지 않는함수
      • 임계값에서 불연속점을 가지므로 미분이 불가능해 학습 진행 불가 (계단 함수를 사용하면, 미분값이 대부분의 구간에서 0이 되어, 가중치 업데이트가 제대로 이루어지지 않습니다.)
      • 역전파 과정에서 데이터가 극단적으로 변경되기 때문에 적합 X

이미지 출처: https://nongnongai.tistory.com/51

 

  • 임계값 함수 Threshold Function
    • 임계값보다 크면 입력값(x)을 그대로 전달, 임계값보다 작으면 특정 값으로 변경
    • 선형 함수와 계단 함수의 조합
    • 출력이 0 또는 1인 이진 분류 작업을 위해 신경망에서 자주 사용되는 효과적인 활성화 함수
    • 입력에 대한 함수의 기울기 계산 불가 → 네트워크 최적화 어려움 → 사용 x (특별한 경우만 사용)

 

  • 시그모이드 함수 Sigmoid Function
    • 모든 입력값을 0과 1 사이의 값으로 매핑
    • 이진 분류 신경망의 출력 계층에서 활성화 함수로 사용됨
    • 단순한 형태의 미분식을 가짐
    • 입력값에 따라 출력값이 급격하게 변하지 않음
    • 출력값이 0~1범위 가짐 = 기울기 폭주 현상 방지 가능
    • 출력값이 0~1 범위를 가지는 만큼 매우 큰 입력값이 입력돼도 최대 1의 값을 가지게 되어 기울기 소실이 발생
    • 출력값의 중심이 0이 아니므로, 입력 데이터가 항상 양수인 경우에, 기울기는 모두 양수 또는 음수가 되어 기울기가 지그재그 형태로 변동하는 문제 발생 → 학습 효율성 감소
    • 인공신경망은 기울기를 이용해 최적화된 값을 찾아가는데, 계층이 많아지면 점점 값이 0에 수렴하는 문제 발생 → 시그모이드 함수는 은닉층에서는 활성화 함수로 사용되지 x, 주로 출력층에서만 사용됨

이미지 출처: https://wikidocs.net/60683

 

 

  • 하이퍼볼릭 탄젠트 함수 Hyperbolic Tangent Function
    • 시그모이드 함수와 유사한 형태, 출력값의 중심이 0이다.
    • 출력값이 -1~1의 범위, 시그모이드에서 발생하지 않는 음수 값 반환 가능
    • 기울기 소실이 비교적 덜 발생 (출력값의 범위가 더 넓고 다양한 형태로 활성화 가능)
      • 입력값 x이 4보다 큰 경우 출력값이 1에 수렴. 동일하게 기울기 소실이 발생
    • 이미지 출처: https://wikidocs.net/60683

 

  • ReLU 함수 Rectified Linear Unit Function
    • 0보다 작거나 같으면 0을 반환, 0보다 크면 선형 함수에 값을 대입하는 구조
    • 선형 함수에 대입하기 때문에, 입력값이 양수라면 출력값이 제한 되지 않아 기울기 소실이 발생하지 않음
    • 수식 또한 매우 간단해, 순전파나 역전파 과정의 연산이 매우 빠름
    • 입력값이 음수인 경우 항상 0을 반환, 가중치나 편향이 갱신되지 않을 수 있음
    • 가중치의 합이 음수가 되면 해당 노드는 더 이상 값을 갱신하지 않아 죽은 뉴런 (Dead Neuron, Dying ReLU)이 됨
    • 딥러닝 네트워크에서 널리 사용되는 활성화 함수

이미지 출처: https://wikidocs.net/60683

 

 

  • LeakyReLU 함수 Leaky Recified Linear Unit Function
    • 음수 기울기를 제어, 죽은 뉴런 현상 방지하기 위해 사용
    • 양수인 경우 ReLU 함수와 동일, 음수인 경우 작은 값이라도 출력시켜 기울기를 갱신하게 함
    • 작은 값을 출력시키면 더 넓은 범위의 패턴을 학습할 수 있어 네트워크의 성능을 향상시키는 데 도움

이미지 출처: https://wikidocs.net/60683

 

 

  • PReLU 함수 Parametric Rectified Linear Unit Function
    • LeakyReLU 함수와 형태가 동일하지만, 음수 기울기 값을 고정값이 아닌, 학습을 통해 갱신되는 값으로 간주함
    • 음수 기울기는 지속해서 값이 변경됨
      • 값이 지속해서 갱신되는 매개변수이므로, 학습 데이터세트에 영향을 받음

 

  • ELU 함수 Exponential Linear Unit Function
    • 지수 함수를 사용하여 부드러운 곡선의 형태를 가짐
    • 기존 ReLU함수와 ReLU 변형 함수는 0에서 끊어지는데, ELU함수는 음의 기울기에서 비선형 구조를 가짐
    • → 입력값이 0인 경우에도 출력값이 급변하지 않아, 경사 하강법의 수렴속도가 비교적 빠름.
    • 더 복잡한 연산을 진행하기 때문에, 학습 속도는 느림
      • 수렴 속도: 몇 번의 학습으로 최적화된 값을 찾는가를 의미
      • 학습 속도: 학습이 완료되기까지의 전체 속도를 의미
    • 데이터의 복잡한 패턴과 관계를 학습하는 네트워크의 능력을 향상시키는 데 도움됨
    • 이미지 출처: https://deeesp.github.io/deep learning/DL-Activation-Functions/

 

  • 소프트맥스 함수 Softmax Function
    • 차원 벡터에서 특정 출력값이 k번째 클래스에 속할 확률을 계산
    • 클래스에 속할 확률을 계산하는 활성화 함수
    • 은닉층에서 사용하지 않고, 출력층에서 사용
    • 네트워크의 출력을 가능한 클래스에 대한 확률 분포로 매핑
    • 이 외에도 소프트민 함수 Softmin Function, 로그 소프트맥스 함수 Log Softmax Function 등이 있음