Activation Function (비선형 활성화 함수)

3단 분석법

순서
분석
단어
내용
1
정의
비선형 활성화 함수
인공신경망에서 뉴런의 출력을 결정하는 비선형 함수
2
알아야하는 이유
비선형 활성화 함수
신경망이 XOR 문제와 같이 선형으로 해결할 수 없는 문제를 해결하고, 더 높은 정확성을 얻기 위해 입력 신호를 비선형적으로 변환하기 때문
3
사용 방법
비선형 활성화 함수
1. 입력값 계산 2. 활성화 함수 적용 3. 출력값 전달

정의

비선형 활성화 함수
인공신경망에서 뉴런의 출력을 결정하는 비선형 함수
비선형 활성화 함수는 인공신경망에서 뉴런의 출력을 결정하는 비선형 함수입니다.
이는 뉴런이 입력 신호를 받아 가중합을 계산한 후, 이를 비선형 함수에 적용하여 최종 출력을 생성하는 역할을 합니다.
비선형 활성화 함수는 신경망의 학습 능력과 예측 성능에 큰 영향을 미치며, 네트워크의 복잡한 패턴 인식을 가능하게 합니다.
딥 러닝에서 가장 중요한 구성 요소 중 하나가 비선형 활성화 함수 입니다.
활성화 함수로는 렐루 함수, 시그모이드 함수가 있습니다.
선형함수가 무엇이고 비선형함수는 무엇인가요?
선형 함수와 비선형 함수의 정의는 아래와 같습니다.
선형 함수: 전체 구간에서 동일한 기울기를 가지는 직선입니다.
비선형 함수: 전체 구간에서 동일한 기울기를 가지지 않는 함수입니다.

시그모이드 (Sigmoid)

시그모이드 함수는 모든 입력 값을 0과 1 사이로 매핑하는 S자 형태의 함수입니다.
이전에는 많이 사용했지만, 0과 1 사이로만 매핑을 하게 되면 기울기 소실(Vanishing gradient) 문제가 발생할 확률이 높아지기 때문에, 현재는 잘 사용하지 않습니다.
장점
단점
출력값이 0과 1 사이에 위치하여, 확률값을 표현하는 데 적합합니다.
기울기 소실(vanishing gradient) 문제가 발생할 수 있습니다.
출력이 0이나 1에 가까워질수록 기울기가 작아져서, 역전파 과정에서 가중치 업데이트가 거의 이루어지지 않습니다.
훈련이 느려질 수 있습니다.

하이퍼볼릭 탄젠트 함수(tanh)

하이퍼볼릭 탄젠트 함수(Tanh)는 시그모이드 함수와 유사한 S자 형태의 함수로, 모든 입력 값을 -1과 1 사이로 매핑합니다. Tanh 함수는 출력 범위가 시그모이드 함수보다 넓기 때문에, 중심이 0에 가까운 데이터의 표현이 필요할 때 더 유용합니다.
장점
단점
출력값이 -1과 1 사이에 위치하여, 데이터의 중심을 0으로 맞출 수 있습니다.
기울기 소실(vanishing gradient) 문제가 발생할 수 있습니다. * 기울기 소실은 ‘경사 하강법’ 페이지에서 설명합니다.
시그모이드 함수에 비해 학습 성능이 더 좋습니다.
출력이 -1이나 1에 가까워질수록 기울기가 작아져서, 역전파 과정에서 가중치 업데이트가 거의 이루어지지 않습니다.
대칭성이 있어 학습이 더 빠를 수 있습니다.
훈련이 느려질 수 있습니다.

렐루 (ReLU, Rectified Linear Unit)

‘고르게 한다’는 뜻의 Rectified와 ‘직선으로 이루어진’이라는 뜻의 Linear Unit이 결합된 것.
렐루 함수는 입력이 0보다 작으면 출력이 0이 되고, 입력이 0 이상이면 출력이 입력과 동일해지는 함수입니다.
렐루 함수는 시그모이드의 한계를 극복하기 위해서 사용하기 시작했습니다.
현재의 딥 러닝에서는 보편적으로 렐루 함수를 기본으로 사용합니다.
장점
단점
계산이 간단하고 빠릅니다. 단순한 max(0,x) 연산으로 구성되어 있어, 계산이 매우 간단하고 빠릅니다
음수 영역에서 뉴런이 죽는 문제(dead neurons)가 발생할 수 있습니다.
기울기 소실(vanishing gradient) 문제를 완화합니다. 기울기가 1로 일정하게 유지되므로, 기울기 소실 문제를 완화할 수 있습니다. 이는 깊은 신경망에서도 효율적인 학습을 가능하게 합니다.
입력값이 음수일 때 기울기가 0이 되어, 이 뉴런은 더 이상 학습되지 않습니다.
대규모 신경망에서 자주 사용됩니다.
렐루 함수가 왜 비선형 함수인가요?
ReLU 함수는 두 구간의 특성이 다르기 때문에 비선형 함수로 분류됩니다. 구체적으로:
x가 0 이하일 때는 출력이 0으로 고정되어 상수 함수처럼 행동합니다. 기울기는 0입니다.
x가 0보다 클 때는 출력이 입력 값을 그대로 따라가며, 기울기는 1입니다.

알아야하는 이유

비선형 활성화 함수
신경망이 XOR 문제와 같이 선형으로 해결할 수 없는 문제를 해결하고, 더 높은 정확성을 얻기 위해 입력 신호를 비선형적으로 변환하기 때문
이유
설명
비선형성 도입
비선형 활성화 함수는 입력 신호의 가중합을 비선형적으로 변환합니다. 이는 신경망이 단순한 선형 모델을 넘어 복잡한 패턴을 학습할 수 있도록 하며, 선형적으로 분리할 수 없는 문제들을 해결할 수 있게 합니다.
학습 가능성 향상
비선형 활성화 함수는 신경망이 다양한 데이터 패턴을 더 잘 학습할 수 있게 합니다. 이는 신경망이 더 많은 정보를 학습하고, 더 복잡한 모델을 구축할 수 있도록 도와줍니다.
다층 신경망 구현
다층 신경망에서 각 층의 뉴런들이 비선형 활성화 함수를 사용함으로써, 전체 네트워크가 다층 퍼셉트론과 같은 복잡한 구조를 형성하고, 고차원적인 데이터의 특징을 학습할 수 있게 합니다.
XOR 문제는 왜 비선형으로 해결할 수 있는 문제인가요?
선형 분리가 불가능하기때문입니다. AND나 OR 문제는 직선 하나로 쉽게 해결할 수 있습니다. (각 점들을 한 직선으로 구분할 수 있음), XOR 문제에서는 그렇지 않습니다. 각 버튼의 조합을 좌표 평면에 찍어보면, (0,0), (1,1)은 0, (0,1), (1,0)은 1이 되는데, 이 점들을 한 직선으로 나눌 수 없습니다.

사용 방법

비선형 활성화 함수
1. 입력 값 계산 2. 활성화 함수 적용 3. 출력 값 전달

1. 입력값 계산

각 뉴런에서 입력값과 가중치를 곱한 후, 이 값들을 모두 합산합니다.
이 과정에서 편향(bias) 값도 더해집니다
import numpy as np # 입력 값, 가중치, 편향 값 정의 input_value = 0.5 weight = 0.8 bias = 0.1 # 가중합 계산 weighted_sum = input_value * weight + bias # 결과 출력 print(f"입력 값: {input_value}") print(f"가중치: {weight}") print(f"편향 값: {bias}") print(f"가중합: {weighted_sum}")
Python
복사

2. 비선형 활성화 함수 적용

합산된 값을 활성화 함수에 입력하여 뉴런의 출력을 계산합니다.
비선형 활성화 함수는 이 합산 값을 비선형적으로 변환하여, 최종 출력을 생성합니다.
대표적인 비선형 활성화 함수로는 시그모이드(sigmoid), 하이퍼볼릭 탄젠트(tanh), 렐루(ReLU) 등이 있습니다.
시그모이드 함수
출력값을 0과 1 사이로 변환하며, 연속적이고 매끄러운 출력값을 제공합니다.
하이퍼볼릭 탄젠트 함수(tanh)
출력값을 -1과 1 사이로 변환하며, 중심을 0으로 두어 대칭적인 출력을 제공합니다.
렐루 함수(ReLU)
양수 입력은 그대로 출력하고, 음수 입력은 0으로 변환하여 계산을 단순화하고, 학습 속도를 향상시킵니다.
# 활성화 함수 정의 def sigmoid(x): return 1 / (1 + np.exp(-x)) def tanh(x): return np.tanh(x) def relu(x): return np.maximum(0, x) # 시그모이드 함수 적용 output_sigmoid = sigmoid(weighted_sum) print(f"시그모이드 함수 출력: {output_sigmoid}") # 하이퍼볼릭 탄젠트 함수 적용 output_tanh = tanh(weighted_sum) print(f"하이퍼볼릭 탄젠트 함수 출력: {output_tanh}") # 렐루 함수 적용 output_relu = relu(weighted_sum) print(f"렐루 함수 출력: {output_relu}")
Python
복사

3. 출력값 전달

비선형 활성화 함수의 출력을 다음 층의 뉴런에 전달합니다. 이 출력값은 다음 층의 입력값으로 사용되며, 이를 통해 신경망 전체가 학습과 예측을 수행합니다. 출력층에서는 최종 예측 결과를 생성합니다.
# 출력 값 전달 예시 next_layer_input = output_sigmoid # 다음 층의 입력 값으로 시그모이드 함수의 출력을 사용 print(f"다음 층의 입력 값: {next_layer_input}")
Python
복사

Google Colab

미니퀘스트

1번 미니퀘스트 - 비선형 활성화 함수 적용 실습

문제 설명

1.
비선형 활성화 함수 정의
시그모이드, 하이퍼볼릭 탄젠트, 렐루 함수를 정의합니다.
2.
입력값 생성
-10에서 10까지의 값을 100개 생성합니다.
3.
비선형 활성화 함수 적용
각 입력값에 대해 정의한 활성화 함수를 적용합니다.
4.
결과 시각화
비선형 활성화 함수의 출력값을 그래프로 시각화하여 비교합니다.

코드

import numpy as np import matplotlib.pyplot as plt # 활성화 함수 정의 def sigmoid(x): return 1 / (1 + np.exp(-x)) def tanh(x): return np.tanh(x) def relu(x): return np.maximum(0, x) # 입력 값 생성 x = np.linspace(-10, 10, 100) # 활성화 함수 적용 y_sigmoid = sigmoid(x) y_tanh = tanh(x) y_relu = relu(x) # 결과 출력 print("시그모이드 함수 값:") print(y_sigmoid) print("\n탄젠트 함수 값:") print(y_tanh) print("\nReLU 함수 값:") print(y_relu) # 결과 시각화 plt.figure(figsize=(12, 3)) plt.subplot(1, 3, 1) plt.plot(x, y_sigmoid, label="Sigmoid") plt.title("Sigmoid Function") plt.grid(True) plt.subplot(1, 3, 2) plt.plot(x, y_tanh, label="Tanh", color='orange') plt.title("Tanh Function") plt.grid(True) plt.subplot(1, 3, 3) plt.plot(x, y_relu, label="ReLU", color='green') plt.title("ReLU Function") plt.grid(True) plt.tight_layout() plt.show()
Python
복사

결과 설명

시그모이드 함수
모든 입력값을 0과 1 사이로 변환합니다.
큰 음수 입력은 0에 가까운 값을, 큰 양수 입력은 1에 가까운 값을 반환합니다.
시그모이드 함수는 출력값이 연속적이고 매끄럽게 변합니다.
하이퍼볼릭 탄젠트 함수
입력값을 -1과 1 사이로 변환합니다.
시그모이드 함수와 비슷하지만 출력값이 -1에서 1 사이로 변환되고 중심이 0이기 때문에 대칭적입니다.
렐루 함수
양수 입력은 그대로 출력하고, 음수 입력은 0으로 변환합니다.
이는 출력값을 비선형적으로 변환하여 신경망의 학습 속도를 향상시킵니다.

코드 설명

미니퀘스트1 정답지

2번 미니퀘스트 - 비선형 활성화 함수 응용 실습

문제 설명

1.
비선형 활성화 함수 정의
시그모이드, 하이퍼볼릭 탄젠트, 렐루 함수를 정의합니다.
2.
입력값, 가중치, 편향 값 정의
신경망의 입력값, 가중치, 편향 값을 설정합니다.
3.
가중합 계산
입력값과 가중치의 곱에 편향 값을 더하여 가중합을 계산합니다.
4.
비선형 활성화 함수 적용
가중합에 각 비선형 활성화 함수를 적용하여 출력을 계산합니다.
5.
결과 출력
각 비선형 활성화 함수의 출력을 출력하여 비교합니다.

코드

import numpy as np # 가중치, 입력 값, 편향 값 정의 weight = 0.8 input_value = 0.5 bias = 0.1 # 활성화 함수 정의 def sigmoid(x): return 1 / (1 + np.exp(-x)) def tanh(x): return np.tanh(x) def relu(x): return np.maximum(0, x) # 가중합 계산 weighted_sum = weight * input_value + bias # 각 활성화 함수 적용 output_sigmoid = sigmoid(weighted_sum) output_tanh = tanh(weighted_sum) output_relu = relu(weighted_sum) # 출력 구분을 위한 섹션 추가 print("="*30) print("가중치, 입력 값, 편향 값") print("="*30) print(f"가중치: {weight}") print(f"입력 값: {input_value}") print(f"편향 값: {bias}") print(f"가중합: {weighted_sum}") print() print("="*30) print("활성화 함수 출력") print("="*30) print(f"시그모이드 함수 출력: {output_sigmoid}") print(f"하이퍼볼릭 탄젠트 함수 출력: {output_tanh}") print(f"렐루 함수 출력: {output_relu}") print("="*30)
Python
복사

결과 설명

가중합 계산
입력값 0.5, 가중치 0.8, 편향 값 0.1을 사용하여 가중합을 계산하면 weighted_sum = 0.5 * 0.8 + 0.1 = 0.5가 됩니다.
시그모이드 함수 출력
가중합을 시그모이드 함수에 입력하면 0.6224593312018546이라는 결과가 나옵니다.
이는 0과 1 사이의 값입니다.
하이퍼볼릭 탄젠트 함수 출력
가중합을 하이퍼볼릭 탄젠트 함수에 입력하면 0.46211715726000974이라는 결과가 나옵니다.
이는 -1과 1 사이의 값입니다.
렐루 함수 출력
가중합을 렐루 함수에 입력하면 0.5라는 결과가 나옵니다.
이는 양수 입력을 그대로 출력한 결과입니다.

코드 설명

미니퀘스트 정답지

ⓒ 2024 startupcode. 모든 권리 보유. 무단 복제 금지.