딥러닝을 이용한 자연어처리 입문 # 8. 1) 퍼셉트론 ~ 5) 인공 신경망 훑어보기
1. 퍼셉트론
- 가중치의 값이 크면 해당 입력값이 중요하다고 의미하고, 각 입력값에 각각의 가중치를 곱해줘서 y로 출력해주는 것
- if sum(xiwi) > 임계치 → y = 1, 작은 경우 0으로 출력.
- 임계치를 좌변으로 넘겨 편향 b로 표현도 가능. b또한 퍼셉트론 입력으로 사용
- 이런 식으로 값을 넘게 되면 y를 1, 아니면 0으로 이해한다.
- 출력값을 변경시키는 함수 → 활성화 함수
- 퍼셉트론은 이를 계단 함수로 用, 이후엔 다양한 활성화 함수 이용됨.
- 시그모이드 or 소프트맥수 함수 또한 이의 일부분.
- 퍼셉트론에서 활성화 함수만 시그모이드 함수로 바꿔주면 로지스틱 회귀랑 동일해지는 것을 알 수 있음
단층 퍼셉트론
- 값을 보내는 단계, 값을 받아 출력하는 단계 두 개로만 구성
- 단층 퍼셉트론을 이용해 AND, NAND, OR 게이트 구현
#AND_gate #둘다 1일 때만 y=1되는 구조
def AND_gate(x1, x2):
w1 = 0.5
w2 = 0.5
b = -0.7
result = x1w1 + x2w2 + b
if result <= 0:
return 0
else:
return 1
AND_gate(0, 0), AND_gate(0, 1), AND_gate(1, 0), AND_gate(1, 1)
(0, 0, 0, 1)
#NAND_gate : 두 입력값 1인 경우 출력 0, 나머지에선 모두 1
def NAND_gate(x1, x2):
w1 = -0.5
w2 = -0.5
b = 0.7
result = x1*w1 + x2*w2 + b
if result <= 0:
return 0
else:
return 1
NAND_gate(0, 0), NAND_gate(0, 1), NAND_gate(1, 0), NAND_gate(1, 1)
(1, 1, 1, 0)
#바꿔준 가중치의 값 이외에도 다른 경우에서도 이런 NAND의 경우를 만들 수 있다.
#둘 중 하나만 1이면 되는 것
def OR_gate(x1, x2):
w1 = 0.6
w2 = 0.6
b = -0.5
result = x1*w1 + x2*w2 + b
if result <= 0:
return 0
else:
return 1
OR_gate(0, 0), OR_gate(0, 1), OR_gate(1, 0), OR_gate(1, 1)
(0, 1, 1, 1)
- 이런 식으로 and, nand, or게이트는 구현할 수 있지만, xor게이트는 구현 할 수 없다.
- xor → 두 개가 서로 다른 값 ⇒ 1, 같은 값 ⇒ 0
- b/c = 단층 퍼셉트론은 직선 하나로 두 영역을 나눌 수 있을 때만 구현 가능하기 때문
이런 식으로 xor gate는 흰색 원, 검은색 원을 하나로 나누는 건 불가능 → 이를 위해선 다수의 선 필요. → 다층 퍼셉트론이 해답
- 중간에 은닉충을 넣어줘서 계산을 더욱 다양하게 도와주는 방식.
- 은닉층 2개 이상인 신경망 = 심층 신경망.
- 적절한 가중치를 기계가 훈련, 학습을 통해 얻어내야 할 것이고, 이 과정에서 손실 함수, 옵티마이저를 사용한다.
- 이 과정에서 심층 신경망이 학습되면 이를 딥러닝라고 함
2. 인공 신경망 훑어보기
1. 피드 포워드 신경망(FFNN)
- 순환 신경망
은닉층의 출력값이 다시 은닉층의 입력으로 이용되는 신경망.
2. 전결합층
- 모든 뉴런이 이전 층의 모든 뉴런과 연결되어 있는 층.
3. 활성화 함수
- 출력값을 결정해 주는 함수를 의미. ex) 계단 함수
4. 비선형 함수
- 인공 신경망의 능력을 높이기 위해선 은닉층을 추가해야 하는데 선형 함수로는 이를 쌓을 수 없음
- 결과값을 구분해주기 위해선 구분이 될 수 있는 비선형 함수 쓰는게 필요함
5. 계단 함수
- 잘 이용되진 않지만, 퍼셉트론 이용해 인공 신경망에 처음 접하게 되는 활성화 함수
6. 시그모이드 함수와 기울기 소실
- 학습 과정 : 순전파 연산(앞으로 가는 방향으로 先 계산) → 순전파 연산에서 나온 예측, 실제값의 오차 계산 by 손실 함수 → 손실 미분 → 기울기 구하기 → 이걸 출력층에서 입력층으로 역방향으로 가중치와 편향 업데이트 하는 역전파 과정 수행.(역시 경사 하강법 이용)
- 시그모이드 문제 → 미분 후 기울기 구할 때 발생
# 시그모이드 함수 그래프를 그리는 코드
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()
- 출력값이 0or 1에 가까워지면 기울기가 완만해지는 모습 발생
- 시그모이드 함수를 활성화 함수로 지정해 층을 쌓는다면, 계속해서 0에 가까운 값이 곱해지면서 기울기가 꽤나 손실되는 기울기 손실의 문제가 발생
- → 은닉층에선 이에 대한 문제로 시그모이드 함수 사용 지양, 이진 분류 위해 출력층으로 多 用
7.하이퍼볼릭탄젠트 함수
- 입력값을 -1~1 사이의 값으로 변환
- 하이퍼볼릭탄젠트 함수 역시 시그모이드 함수와 유사한 문제 발생
- but 차이점은 중심을 0으로 하고 있고, 미분 최대값 또한 1로 시그모이드보단 훨씬 큼 → 기울기 소실이 상대적으로 적기에 은닉층에서 더욱 선호.
1) ReLu
- 가장 은닉층으로 인기있는 함수, f(x) = max(0,x)로 발생
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 출력, 양수 입력 ⇒ 그대로 반환
- 0이상에선 미분값 항상 1. 그렇기에 깊은 신경망에서 훨씬 더 작동
- 그저 임계값이기 때문에 연산 속도도 빠름
- 문제점 : 입력이 음수면 미분값도 0이 됨
2) Leaky ReLu
- 죽은 렐루를 보완하기 위해
- leaky란 말에서 볼 수 있드시, leaky(’새는’) 정도란 의미로 조금만 고려해서 바라본다는 것.
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()
8. 소프트맥스 함수
- 시그모이드 함수처럼 출력층에서 주로 이용되고, class가 3개 이상인 경우에서 주로 이용
x = np.arange(-5.0, 5.0, 0.1) # -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()
'공부하는 습관을 들이자 > Deep Learning (NLP,LLM)' 카테고리의 다른 글
[딥러닝 자연어처리] 8-3. (4) 딥러닝의 학습 방법 (0) | 2023.12.18 |
---|---|
[딥러닝 자연어처리] 8-2. (3). 행렬곱으로 이해하는 신경망 (0) | 2023.12.15 |
[딥러닝 자연어처리] 7. 머신 러닝 개요 7) ~ 9) (0) | 2023.12.13 |
[딥러닝 자연어처리] 7. 머신 러닝 개요 4) ~ 6) (0) | 2023.12.12 |
[딥러닝 자연어처리] 7. 머신 러닝 개요 1) ~ 3) (0) | 2023.12.11 |