👉이전글에서 봤던 것처럼 RNN이라는 딥러닝 모델은 자연어 문장과 같은 시퀀스 데이터를 입력으로 받아 학습시킬 수 있도록 설계된 모델입니다. 이를 통해 자연어처리 분야에 딥러닝 모델이 활용될 수 있었습니다.
이러한 RNN 모델을 활용하여 자연어 기반의 분류 모델을 구현하고자 하는데,
구현에 앞서 딥러닝이 무엇인지 짚어보겠습니다.
딥러닝 개요
딥러닝 모델은 위 그림과 같이 표현될 수 있습니다.
위 구조를 이루고 있는 파란색 원을 퍼셉트론
이라고 하는데,
입력층에서 입력으로 들어온 데이터가 다수의 퍼셉트론을 거쳐 사전 학습된대로 출력층에서 데이터를 출력하게 됩니다.
딥러닝이란?
딥러닝은 위 그림의 구조와 같은 심층신경망에 학습시키는 것을 가리키는 말입니다.
- 심층신경망 : 위 그림과 같이 다수의 퍼셉트론으로 이루어진 은닉층이 2개 이상인 신경망
딥러닝의 등장
위 그림과 같이 단층퍼셉트론을 활용해도 AND 게이트 연산을 위한 직선의 선형함수를 찾으면 AND 게이트 구현이 가능했습니다.
하지만 위 그림의 XOR 게이트는 직선의 선형함수로는 구현이 불가능한 게이트이고,
XOR 연산을 위해 다수의 은닉층으로 구성된 심층신경망이 등장하게 됩니다. 그리고 이러한 심층신경망을 학습시키는 일련의 과정인 딥러닝이 대두됩니다.
심층신경망의 학습 (딥러닝)
학습과정
👉이전글에서 봤던 것처럼 머신러닝의 학습과정은 각 뉴런의 가중치 W를 찾아가는 과정입니다.
이러한 학습과정은 딥러닝에도 동일하게 적용됩니다. (퍼셉트론의 가중치 W를 찾아가는 과정)
- 학습데이터 입력 : 학습데이터가 입력되면 심층신경망을 이루는 각 퍼셉트론을 단계별로 거치게되고, 거칠 때마다 초기화된 가중치 W와 바이어스b를 기반으로 출력값이 계산되어 다음 층 퍼셉트론의 입력값으로 전달됩니다.
- 예측값과 실제값 비교 : 심층신경망을 통해 출력된 예측값과 실제값의 차이를 기반으로 하는 Loss Function을 통해 차이를 최소화하는 가중치W와 바이어스b를 찾게됩니다. 어떤 모델이냐에 따라 최적의 Loss Function이 달라집니다. (회귀모델은 MSE(평균제곱오차)가 최적이라고 함) (👉Cost Function 글 참고)
- Back Propagation : 출력층부터 은닉층을 역방향으로 진행하면서 실제값-예측값 오차 기반의 미분 값을 활용하여 가중치W와 바이어스b를 업데이트 합니다. 해당 과정이 반복되면서 Loss가 최소가 되는 지점을 찾게되면, 최적의 가중치W/바이어스b 값을 찾을 수 있습니다.
- Optimizer : 어떤 Optimizer를 사용하느냐에 따라 결정되는 Loss의 최솟값이 달라집니다. Optimizer의 성능이 좋을수록 정확한 최솟값을 찾을 수 있습니다. 아래 그림을 예시로 잘못된 Optimizer를 선정했을 경우, 로컬 미니멈을 최솟값으로 선정하게될 것입니다. Optimizer의 예로 기본적인 경사하강법(Gradient Descent)과 좀 더 응용된 Adam이 있습니다.
- 수치기반 실제 학습과정 예시 (순전파->역전파)
: 수치를 통해 실제 학습되는 과정에 대한 예시는 아래 링크를 참고하면 됩니다.
https://wikidocs.net/37406
에포크/배치크기/이터레이션
아래 개념은 실제 모델에 학습을 시킬 때 모델의 성능을 좌우할 수 있는 파라미터입니다.
- 에포크 : 전체 학습데이터에 대해 순전파와 역전파 과정이 진행되는 단위입니다. 예를들어 50에포크는 전체데이터를 50번 학습한다는 의미입니다. 에포크가 너무 크거나 작으면 과적합이나 과소적합 현상이 발생할 수 있습니다.
- 배치크기 : 전체 데이터에서 몇 개 데이터 단위로 학습시킬지 결정하는 단위입니다.
- 이터레이션(step) : 전체 데이터를 모두 학습시키기 위해 배치크기 단위로 몇 번 학습 loop를 돌려야하는지 결정하는 단위입니다.
활성화 함수 (Activation Function)
활성화함수란? 심층신경망 은닉층/출력층의 출력값을 결정하는 함수입니다. 이러한 매커니즘은 실제 뇌를 구성하는 신경 세포 뉴런이 전위가 일정치 이상이 되면 시냅스가 서로 화학적으로 연결되는 모습을 모방한 것입니다.
사용이유 : 퍼셉트론의 출력 값은 보통 wx + b 함수의 형태로 선형함수의 출력 값으로 이루어짐 -> 인공신경망의 능력을 높이기 위해 은닉층을 계속 추가해줌 -> 활성화 함수 없이 선형함수의 출력 값이 중첩되기만 한다면 1개층의 은닉층을 사용하는 것이 여러층의 은닉층을 사용하는 것과 크게 차이가 없음 (ex. 0.20.20.2x 출력 값의 3개 은닉층은 0.004x 출력 값의 1개 은닉층과 차이가 없음) -> 비선형함수의 활성화 함수를 각 퍼셉트론의 연산에 활용하여 은닉층을 여러개 쌓았을 때 능력을 극대화시킬 수 있음 (각 퍼셉트론의 특성을 잘 살릴 수 있음)
활성화 함수 종류
- 시그모이드 함수 (Sigmoid function)
# 시그모이드 함수 그래프를 그리는 코드
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의 가까운 값을, 음수 값이 클수록 0에 가까운 값을 출력하게 됩니다.
- Vanishing Gradient (기울기 소실)
인공신경망을 Back Propagation(역전파)을 통해 학습시킬 때, Vanishing Gradient (기울기 소실) 문제가 발생할 수 있습니다.
학습시키는 과정에서 시그모이드 활성화 함수를 미분하게 되는데, 미분 최댓값은 0.25로 작은 값이고,
역전파가 진행되면서 미분 최댓값(0.25) 이하의 값이 중첩되어 곱해지면 0으로 수렴하게 되어
기울기가 앞단으로 잘 전달되지 않게 됩니다.
기울기 소실 문제를 방지하기 위해 가중치 초기화나 배치 정규화, 층 정규화 등의 기법이 활용될 수 있습니다.
그래서 시그모이드 함수는 은닉층에서의 사용은 지양되고, 이진 분류를 위해 출력층에서 활용하게 됩니다.
- 하이퍼볼릭탄젠트 함수 (Hyperbolic tangent function)
x = np.arange(-5.0, 5.0, 0.1) # -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로
은닉층에서 시그모이드 함수보다는 선호되는 함수입니다.
- 렐루 함수 (ReLU)
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()
렐루 함수는 음수는 0을 출력하고, 양수는 입력값 그대로 반환하는 함수입니다.
그리고 양수일 때의 기울기는 항상 1이라서 깊은 신경망의 은닉층에서 시그모이드 함수보다 훨씬 더 잘 작동합니다.
또한, 단순 임계값을 반환하는 연산이라서, 연산 속도도 빠릅니다.
그러나 음수일 때 기울기는 항상 0입니다. 그래서 기울기가 0인 경우는 퍼셉트론이 죽게되어 다시 회생하는 것이 매우 어렵게 되는 죽은 렐루(dying ReLU) 현상이 발생할 수 있습니다.
- 리키 렐루 (Leaky ReLU)
a = 0.1
def leaky_relu(x):
return np.maximum(a*x, x)
x = np.arange(-5.0, 5.0, 0.1)
y = leaky_relu(x)
plt.plot(x, y)
plt.plot([0,0],[5.0,0.0], ':')
plt.title('Leaky ReLU Function')
plt.show()
리키 렐루 함수는 죽은 렐루 현상을 보완하기 위해 등장한 함수 중 하나입니다.
입력 값이 음수일 경우에 0이 아니라 매우 작은수를 반환하도록 하여 0이 아닌 아주 작은 값의 기울기를 갖게됩니다.
이를 통해 ReLU는 죽지 않습니다.
Reference
- 딥러닝을 이용한 자연어 처리 입문 : https://wikidocs.net/book/2155
'개발 > AI' 카테고리의 다른 글
[LLM] LLM 발전기 (0) | 2025.01.05 |
---|---|
[AI] pandas/sklearn을 활용한 머신러닝 모델링 (0) | 2024.04.12 |
[AI] pandas를 활용한 데이터 핸들링 및 전처리 (2) | 2024.04.10 |
KT AI 해커톤 회고 (2) (1) | 2023.11.02 |
KT AI 해커톤 회고 (1) (0) | 2023.10.27 |