본문 바로가기
AI/딥러닝

06. 비선형 활성화 함수

by 사라리24 2024. 6. 20.
SMALL



1. 비선형 활성화 함수(Activation Functions)

* 신경망의 성능을 향상시키기 위해 사용
* 선형 함수는 입력값과 가중치를 곱한 결과를 그대로 출력하기 때문에 신경망에서 여러 개의 선형 활성화 함수를 사용한다면 
최종 출력값은 입력값과 가중치의 선형 조합으로 표현되므로 이는 입력 데이터의 비선형 관계를 표현할 수 없음

* 신경망이 입력 데이터의 비선형 관계를 잘 학습할 수 있도록 하기 위해서 비선형 활성화 함수를 사용

 

  • import

       
        import numpy as np
        import matplotlib.pyplot as plt


 

 

 

1. 시그모이드(Sigmoid )
Sigmoid 함수는 주어진 입력에 대해 출력을 0과 1 사이의 값으로 변환하는 비선형 활성화 함

 

  • Sigmoid 함수를 정의하고 그래프로 그리기


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

        x = np.arange(-5.0,5.0,0.1)
        y = sigmoid(x)

        plt.plot(x,y)
        plt.plot([0,0],[1.0,0.0],':') #가운데 점선 추가

        plt.title('Sigmoid Function')
        plt.show()

 
  1. Sigmoid 함수 정의
    • sigmoid(x): 입력 x에 대해 Sigmoid 함수 값을 계산하여 반환합니다.
      Sigmoid 함수의 수식은 σ(x)=11+e−x\sigma(x) = \frac{1}{1 + e^{-x}} 입니다.
  2. 입력 데이터 생성
    • np.arange(-5.0, 5.0, 0.1): -5.0부터 5.0까지 0.1씩 증가하는 배열을 생성합니다. 이 배열은 x 축의 값으로 사용됩니다.
  3. Sigmoid 함수를 이용한 출력값 계산
    • sigmoid(x): 앞서 정의한 Sigmoid 함수를 사용하여 입력 x에 대한 출력 y 값을 계산합니다.
  4. 그래프 그리기
    • plt.plot(x, y): x를 입력으로, y를 출력으로 하는 선 그래프를 그립니다. 이는 Sigmoid 함수의 그래프를 나타냅니다.
    • plt.plot([0, 0], [1.0, 0.0], ':'): x축에 수직으로 가운데 점선을 추가합니다. 이 점선은 Sigmoid 함수의 출력이 0.5인 지점을 나타냅니다.
    • plt.title('Sigmoid Function'): 그래프의 제목을 설정합니다.
    • plt.show(): 그래프를 화면에 출력합니다.

결과 해석

이 코드를 실행하면, x 축 값에 따라 Sigmoid 함수의 출력이 시각적으로 표현됩니다.
Sigmoid 함수는 입력이 음수에 가까울수록 0에 가까운 값을 출력하고, 입력이 양수에 가까울수록 1에 가까운 값을 출력합니다. 따라서 Sigmoid 함수는 이진 분류 문제에서 확률을 표현하는 데 사용됩니다.

 

2. 하이퍼볼릭탄젠트( Hyperbolic Tangent)
 Tanh 함수는 입력이 음수에 가까울수록 -1에 가까운 값을 출력하고, 입력이 양수에 가까울수록 1에 가까운 값을 출력

* 하이퍼볼릭 사인 함수(sinh) 와 하이퍼롤릭 코사인 함수(cosh)로 정의
* 신경망의 활성화 함수로 자주 사용됨
* 출력값이 -1에서 1사이로 조정되어 학습과정에서 중심화된 데이터 분포를 유리
* 기울기 소실 문제로 완화하는데 도움

 

  • Hyperbolic Tangent 함수 (Tanh 함수)를 그래프로 그리기

       
        x = np.arange(-5.0, 5.0, 0.1)
        y = np.tanh(x)

        plt.plot(x, y)
        plt.plot([0,0], [1.0, -1.0], ':') # 가운데 점선 추가
        plt.axhline(y=0, color='orange', linestyle='--')
        plt.title('Tanh Function')
        plt.show()


  1. Tanh 함수 정의
    • np.arange(-5.0, 5.0, 0.1): -5.0부터 5.0까지 0.1씩 증가하는 배열을 생성합니다. 이 배열은 x 축의 값으로 사용됩니다.
    • np.tanh(x): 입력 x에 대해 Tanh 함수 값을 계산하여 반환합니다. Tanh 함수의 수식은 tanh⁡(x)=ex−e−xex+e−x\tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} 입니다.
  2. 그래프 그리기
    • plt.plot(x, y): x를 입력으로, y를 출력으로 하는 선 그래프를 그립니다. 이는 Tanh 함수의 그래프를 나타냅니다.
    • plt.plot([0, 0], [1.0, -1.0], ':'): x축에 수직으로 가운데 점선을 추가합니다. 이 점선은 Tanh 함수의 출력이 0인 지점을 나타냅니다.
    • plt.axhline(y=0, color='orange', linestyle='--'): y축에 수평으로 오렌지색 점선을 추가합니다. 이 점선은 Tanh 함수의 출력이 0인 지점을 나타내며, 함수의 대칭성을 보여줍니다.
    • plt.title('Tanh Function'): 그래프의 제목을 설정합니다.
    • plt.show(): 그래프를 화면에 출력합니다.

결과 해석

이 코드를 실행하면, x 축 값에 따라 Tanh 함수의 출력이 시각적으로 표현됩니다.
Tanh 함수는 입력이 음수에 가까울수록 -1에 가까운 값을 출력하고, 입력이 양수에 가까울수록 1에 가까운 값을 출력합니다. 따라서 Tanh 함수는 신경망에서 활성화 함수로 사용되며, 입력 값의 범위를 -1에서 1 사이로 압축하는 특성을 가지고 있습니다.




 


3. 렐루(Relu)

ReLU 함수는 주어진 입력에 대해 0 이상의 값을 반환하고, 음수 입력에 대해서는 0을 반환하는 비선형 활성화 함수

*신경망에서 널리 사용되는 화성화 함수
* 입력이 양수일 때에 그대로 츨력,
* 음수일 때는 0을 출력 

 

  • ReLU(Rectified Linear Unit) 함수를 정의하고 그래프로 나타내기

       

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

          x = np.arange(-5.0, 5.0, 0.1)
          y = relu(x)
          plt.plot(x, y)
          plt.plot([0,0], [5.0, 0.0], ':') # 가운데 점선 추가
          plt.title('Relu Function')
          plt.show()



  1. ReLU 함수 정의
    • relu(x): 입력 x에 대해 ReLU 함수 값을 계산하여 반환합니다. ReLU 함수의 수식은 ReLU(x)=max⁡(0,x)\text{ReLU}(x) = \max(0, x) 입니다. 즉, 입력 값이 0보다 작으면 0을 반환하고, 그렇지 않으면 입력 값을 그대로 반환합니다.
  2. 입력 데이터 생성
    • np.arange(-5.0, 5.0, 0.1): -5.0부터 5.0까지 0.1씩 증가하는 배열을 생성합니다. 이 배열은 x 축의 값으로 사용됩니다.
  3. ReLU 함수를 이용한 출력값 계산
    • relu(x): 앞서 정의한 ReLU 함수를 사용하여 입력 x에 대한 출력 y 값을 계산합니다.
  4. 그래프 그리기
    • plt.plot(x, y): x를 입력으로, y를 출력으로 하는 선 그래프를 그립니다. 이는 ReLU 함수의 그래프를 나타냅니다.
    • plt.plot([0, 0], [5.0, 0.0], ':'): x축에 수직으로 가운데 점선을 추가합니다. 이 점선은 ReLU 함수의 출력이 0인 지점을 나타냅니다.
    • plt.title('ReLU Function'): 그래프의 제목을 설정합니다.
    • plt.show(): 그래프를 화면에 출력합니다.

결과 해석

이 코드를 실행하면, x 축 값에 따라 ReLU 함수의 출력이 시각적으로 표현됩니다.
ReLU 함수는 입력이 음수일 경우 0을 반환하고, 양수일 경우 그 값을 그대로 반환하는 특성을 가지고 있습니다.
이 함수는 주로 신경망의 은닉층에 사용되며, 입력 값이 양수인 경우 비선형성을 추가하여 신경망의 학습을 개선합니다.

 


4 . 소프트맥스(SoftMax)


Softmax 함수는 입력 벡터의 각 원소를 확률값으로 변환하여 출력합니다.
입력 값이 클수록 해당 원소의 확률값이 높아지고, 입력 값이 작을수록 확률값이 낮아집니다.

 

  • Softmax 함수를 사용하여 입력 벡터의 원소를 확률값으로 변환하기

       
        x = np.arange(-5.0, 5.0, 0.1)
        y = np.exp(x)/np.sum(np.exp(x))

        plt.plot(x, y)
        plt.title('Softmax Function')
        plt.show()


  1. Softmax 함수 정의
    • np.arange(-5.0, 5.0, 0.1): -5.0부터 5.0까지 0.1씩 증가하는 배열을 생성합니다. 이 배열은 입력 벡터 x의 값으로 사용됩니다.
    • np.exp(x): 입력 벡터 x의 각 원소에 지수 함수를 적용하여 지수값을 계산합니다.
    • np.sum(np.exp(x)): 입력 벡터 x의 모든 원소에 대한 지수값의 합을 계산합니다.
    • y = np.exp(x) / np.sum(np.exp(x)): Softmax 함수의 수식에 따라 입력 벡터 x의 각 원소를 지수 함수로 변환하고, 이들을 모두 합한 값으로 나누어 각 원소를 확률값으로 변환합니다.
  2. 그래프 그리기
    • plt.plot(x, y): x를 입력으로, y를 출력으로 하는 선 그래프를 그립니다. 이는 Softmax 함수의 출력을 시각적으로 나타냅니다.
    • plt.title('Softmax Function'): 그래프의 제목을 설정합니다.
    • plt.show(): 그래프를 화면에 출력합니다.

결과 해석

Softmax 함수는 입력 벡터의 각 원소를 확률값으로 변환하여 출력합니다.
입력 값이 클수록 해당 원소의 확률값이 높아지고, 입력 값이 작을수록 확률값이 낮아집니다.
따라서 Softmax 함수는 주로 다중 클래스 분류 문제에서 출력층의 활성화 함수로 사용되며, 각 클래스에 대한 확률 분포를 반환합니다.

 

 

2. 역전파 (Backpropagation)


* 1969년 민스키 교수님 XOR는 "지금의 기술로는 풀 수 없다"라는 것을 수학적으로 증명함
* 1974, by Paul Werbos에 의해 박사 논문에서 해결됨 
  * W, b를 이용해 주어진 입력을 가지고 출력을 만들어 낼 수 있음 
   -> 출력이 우리가 가지고 있는 값과 다른 출력인 경우 W, b를 를 조절함
* 1986, By Hinton에 의해 위 같은 방법으로 독자적으로 만들어 냄 (재발견)

 

 

 

* 역전파는 인공신경망에서 학습을 수해하는 데 사용되는 알고리즘으로, 
네트워크 가중치를 업데이트하기 위해 오차를 출력층에서 입력층으로 전파하여 각 가중치의 기울기를계산
* 신경망이 주어진 데이터에 대해 예측을 얼마나 잘하는지 평가하고 
네트워크의 가중치를 조정하여 예측 성능을 향상시키는 중요한 과정

역전파 알고리즘 단계

  1. 순전파 계산
    * 입력 데이터를 각 층으로 통과시키며 내트워크의 출력을 계산
    * 출력층에서 손실 함수를 사용하여 출력과 실제 값의 오차를 계산

  2. 오차계산
    * 출력층에서 시작하여 이전 층으로 이동하며 오차를 계산
    * 출력층의 오차는 손실 함수의 미분으로 구함

  3. 기울기 계산
    * 각 층에서 가중치와 바이어스에 대한 기울기를 계산
    * 기울기는 오차와 활성화 함수의 미분을 사용하여 구함

  4. 가중치 업데이트
    * 경사 하강법을 사용하여 가중치와 바이어스를 업데이트 함

 

 



@. 과제 : 논문 리뷰

https://colah.github.io/posts/2015-09-NN-Types-FP/

 

 

'AI > 딥러닝' 카테고리의 다른 글

08. 간단한 CNN 모델 만들기  (0) 2024.06.20
07. CNN 기초  (0) 2024.06.20
05. 딥러닝  (0) 2024.06.20
04. 데이터로더(Data Loader)  (0) 2024.06.20
03. 논리회귀 (단항, 다중) | 시그모이드(sigmoid) 함수  (0) 2024.06.19