본문 바로가기
  • 데이터에 가치를 더하다, 서영석입니다.
공부하는 습관을 들이자/Deep Learning (NLP,LLM)

[딥러닝 자연어처리] 8. 1) 퍼셉트론 ~ 2) 2. 인공 신경망 훑어보기

by 꿀먹은데이터 2023. 12. 14.

딥러닝을 이용한 자연어처리 입문 # 8. 1) 퍼셉트론 ~ 5) 인공 신경망 훑어보기

1. 퍼셉트론

x는 입력값, w는 가중치, y는 출력값을 의미

  • 가중치의 값이 크면 해당 입력값이 중요하다고 의미하고, 각 입력값에 각각의 가중치를 곱해줘서 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에 가까운 아주 작은 값. 초록색 : 0.25 ( 최대)

 

  • 시그모이드 함수를 활성화 함수로 지정해 층을 쌓는다면, 계속해서 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()