본문 바로가기

Python/[모두의 딥러닝]

[모두의 딥러닝] #3. 신경망의 이해

728x90
반응형
모두의 딥러닝 P.102 ~

6장 퍼셉트론

인공 신경망이란

우리의 뇌는 약 1,000억 개의 뉴런으로 구성된 복잡한 시스템이다. 뉴런은 서로 시냅스라는 연결 부위를 통해 신호를 주고받는다. 신경 말단에서 자극이 오면 시냅스에서 화학 물질이 방출되고, 이는 전위 변화를 일으킨다. 이 전위가 특정 임계 값을 넘으면 다음 뉴런으로 신호가 전달된다. 만약 임계 값에 도달하지 못하면 아무 일도 일어나지 않는다.

 

이러한 뉴런의 작동 방식은 로지스틱 회귀와 매우 유사하다. 입력 값이 주어지면 활성화 함수에 의해 일정 수준 이상일 때 "참"을, 그렇지 않을 때 "거짓"을 출력한다. 이 단순한 구조가 뉴런의 기본 작동 원리이며, 이러한 메커니즘을 모방해 만들어진 것이 바로 인공 신경망(Artificial Neural Network, ANN)이다.

뉴런과 인공 신경망의 관계

우리 몸의 뉴런은 긴밀히 연결되어 신호를 전달하고, 다양한 역할을 수행한다. 이러한 복잡한 조합이 우리의 사고와 행동을 가능하게 한다. 과학자들은 "뉴런과 비슷한 메커니즘을 인공적으로 구현하면 '생각'하는 시스템을 만들 수 있지 않을까?"라는 상상에서 연구를 시작했다. 그 결과 탄생한 것이 신경망이다.

 

신경망뉴런처럼 단순한 기본 단위를 반복적으로 연결해 복잡한 문제를 해결할 수 있도록 설계되었다. 뉴런이 새로운 연결을 만들고, 필요에 따라 역할을 조정하듯이, 신경망도 여러 층(layer)으로 구성된 구조를 통해 데이터를 처리

하고 학습한다.

신경망의 기본 단위: 퍼셉트론

신경망을 구성하는 가장 작은 단위는 퍼셉트론(perceptron)이다. 퍼셉트론은 입력 값과 활성화 함수를 사용해 출력 값을 계산하고, 이를 다음 단계로 전달하는 역할을 한다. 퍼셉

트론의 작동 방식은 다음과 같다:

 

1. 입력 값과 가중치의 결합 : 여러 입력 값에 각각의 가중치를 곱해 가중합을 계산

2. 활성화 함수 적용 : 계산된 가중합은 활성화 함수를 거쳐 출력 값을 결정

3. 출력 전달 : 활성화 함수의 결과가 다음 층의 퍼셉트론으로 전달

1. 가중치, 가중합, 바이어스, 활성화 함수

기존의 용어를 딥러닝 용어와 통일하면 다음과 같다.

 

기울기 가중치
절편 바이어스

 

퍼셉트론에서 기울기 a가중치(weight)로 표기된다. 입력 데이터에 대해 해당 데이터의 중요도를 나타내는 값으로, 퍼셉트론의 학습 과정에서 조정된다. 한편, y 절편 b바이어스(bias)로 표기되며, 이는 "편향" 또는 "선입견"이라는 의미를 가지고 있다. 바이어스는 모델이 특정 방향으로 출력값을 조정할 수 있도록 돕는 역할을 한다.

가중합과 활성화 함수

퍼셉트론에서 가중합(weighted sum)은 입력값과 가중치를 곱한 뒤, 그 값들을 모두 더하고 바이어스를 추가한 값이다.

쉽게 말해, 방정식에 기울기(a)와 변수(x)를 모두 대입하여 더한 값이다!

 

이를 수식으로 표현하면 다음과 같다.

z = w1 * x1 + w2 * x2 + ... + wn * xn + b

 

가중합 는 퍼셉트론의 핵심이며, 이를 통해 입력 데이터를 종합적으로 평가할 수 있다.

값을 기준으로 출력값을 0 또는 1로 결정하는데, 이 과정을 수행하는 것이 활성화 함수(activation function)이다.

 

활성화 함수는 가중합 결과를 바탕으로 출력값을 0 또는 1로 변환하는 역할을 한다. 대표적인 활성화 함수로는 시그모이드 함수가 있다. 시그모이드 함수는 입력값을 0과 1 사이의 확률로 변환하며, 수식은 다음과 같다.

h = 1 / (1 + exp(-z))

 

다시 말해, 활성화 함수가중합 결과를 0 또는 1로 결정하는 함수를 말한다. 어렵게 생각하지 말자.

가중합 : 입력값(x)과 가중치(a)를 곱한 뒤, 그 값들을 모두 더하고 바이어스(b)를 더한 값

2. 퍼셉트론의 과제

사람의 뇌에서 하나의 뉴런으로 아무것도 할 수 없다. 마찬가지로, 인공 신경망 또한 하나의 퍼셉트론으로 할 수 있는 것은 매우 제한적이다.

이를 해결하기 전에 인공 신경망에 대해 알아보자.

 

아래 사각형 종이에 직선의 한쪽 편에는 검은 점만 존재하고 다른 한쪽은 흰점에 있게끔 선을 그을 수 있을까?

 

그림에서 볼 수 있듯, 직선으로 아무리 그어도 하나의 직선으로 흰점과 검은 선을 구분할 수 없다.

이처럼 선을 아무리 그어도 분류할 수 없을 땐 어떤 방식을 사용해야 할까?

3. XOR 문제

퍼셉트론은 선형 데이터를 분류할 수 있지만, 비선형 데이터를 처리하는 데 한계가 있다. XOR 문제는 이러한 한계를 설명하는 대표적인 예로, 논리 게이트에서 등장하는 문제이다. XOR 게이트는 입력값 중 하나만 1일 때 출력값이 1이 되는 논리 회로이다. 퍼셉트론은 XOR 문제를 해결할 수 없는데, 이는 XOR 데이터가 선형적으로 구분되지 않기 때문이다.

 

XOR 문제는 단순한 직선으로 데이터를 분리할 수 없으므로 퍼셉트론 하나로 해결할 수 없다. 이러한 한계를 극복하기 위해 다층 퍼셉트론(MLP)과 같은 신경망 구조가 도입되었으며, 비선형 활성화 함수와 다층 구조를 통해 XOR 문제를 포함한 다양한 비선형 문제를 해결할 수 있다.

XOR, AND, OR 게이트 표

XOR은 두 입력값이 다를 때, 참의 값(1)을 가진다.

 

x1 x2 AND OR XOR
0 0 0 0 0
0 1 0 1 1
1 0 0 1 1
1 1 1 1 0

 

진리표의 입력값 는 좌표평면의 축과 축에 대응한다.

 

x1 = 0, x2 = 0은 좌표평면의 원점(0, 0)에 해당한다.

 x1 = 0, x2 = 1은 좌표 (0, 1)에 해당한다.

 x1 = 1, x2 = 0은 좌표 (1, 0)에 해당한다.

 x1 = 1, x2 = 1은 좌표 (1, 1)에 해당한다.

 

진리표의 출력값(0 또는 1)은 해당 좌표에서 점의 색상이나 형태로 표시된다.

 

 출력값 0: 하얀 원(비활성)으로 표시

 출력값 1: 검은 원(활성)으로 표시

 

좌표 평면에 점을 표현한 후 선을 그어 같은 점끼리 나눈 결과는 아래 이미지와 같다.

 

 

위 그림에서 볼 수 있듯이, AND와 OR 게이트는 하나의 직선으로 참(흰점)과 거짓(검은 점)을 분리할 수 있지만 XOR 게이트는 하나의 직선으로 분리할 수 없다. 이 문제가 앞선 XOR 문제와 같은 그림이다.

 

1969년, MIT의 마빈 민스키(Marvin Minsky) 교수는 퍼셉트론즈(Perceptrons)라는 논문에서 이 한계를 명확히 지적했다. 퍼셉트론이 XOR 문제를 해결하지 못한다는 사실은 당시 인공지능 연구에 큰 충격을 주었고, 인공지능 연구는 한동안 침체기(AI의 겨울)를 겪게 된다. 

다층 퍼셉트론의 등장

약 10여 년 후, XOR 문제를 해결할 수 있는 새로운 개념이 등장하게 된다. 그것이 바로 다층 퍼셉트론(Multilayer Perceptron)이다.

 

다층 퍼셉트론은 퍼셉트론을 여러 층으로 쌓아, 비선형적인 문제를 해결할 수 있도록 설계되었다. 이러한 구조는 XOR 문제와 같은 비선형 문제도 처리할 수 있으며, 이후 딥러닝의 발전에 큰 기여를 하게 된다.


7장 다층 퍼셉트론의 등장

퍼셉트론의 한계는 기존의 고정관념을 깨고 새로운 방법으로 해결해야 했다. 바로 좌표 평면 자체의 변화를 주는 것이었다.

다층 퍼셉트론

 

XOR 문제를 해결하기 위해서는 두 개의 퍼셉트론을 한 번에 계산해야 한다.

 

XOR 문제를 해결하기 위해 두 개의 퍼셉트론을 한 번에 계산해야 하는 이유는 XOR 문제의 본질이 비선형 분류 문제이기 때문이다.

비선형 분류 문제는 하나의 직선으로 해결할 수 없다.

 

1. XOR 문제와 선형 분류의 한계

• 퍼셉트론 하나는 직선으로 데이터를 나누는 선형 분류만 가능하다.

XOR 문제는 직선 하나로 검은 점(출력값 1)과 흰 점(출력값 0)을 분리할 수 없다.

2. 새로운 방법: 좌표 평면을 휘어주는 아이디어

그림에서 보여주는 것처럼, XOR 문제는 평면상에서 해결이 불가능하다. 그러나 좌표 평면을 휘어주거나 차원을 추가하면 선형 분류가 가능해진다. 이 개념은 단순히 데이터를 다른 공간으로 변환하는 것과 같다.

 

예를 들어, 원래 평면에서는 두 클래스를 나눌 수 없지만 데이터를 변환한 새로운 공간에서는 두 클래스를 선형적으로 나눌 수 있다.

3. 두 개의 퍼셉트론과 은닉층의 역할

하나의 퍼셉트론은 입력값을 선형적으로 처리할 수밖에 없다.

XOR 문제를 해결하기 위해, 입력값을 변환하거나 가공해 새로운 차원으로 바꿔주는 은닉층(hidden layer)이 필요하다.

은닉층은 각 입력값을 비선형적으로 변환하는 역할을 하며, 이 과정에서 두 개 이상의 퍼셉트론이 사용된다.

 

첫 번째 퍼셉트론 : 입력값을 가공하여 하나의 출력값(새로운 특징)을 생성

두 번째 퍼셉트론: 이 출력값(특징)을 다시 가공해 최종 결과 생성

두 번의 가공을 위해 두 개의 퍼셉트론이 필요하다!

 

입력층과 은닉층의 그래프를 집어넣으면 다음과 같다.

 

은닉층이 기존 입력층의 좌표평면을 왜곡시키는 결과를 가져온다는 것을 알 수 있다.

 

입력층에서 파란색과 빨간색의 두 영역이 곡선이므로 하나의 직선으로 두 색을 분리할 수 없다. 하지만 은닉층을 통해 공간을 왜곡하면, 두 영역을 하나의 직선으로 분리할 수 있다. 이것이 은닉층을 사용하는 이유이다.

 

은닉층을 통해 공간을 왜곡하여 하나의 직선으로 분리할 수 없는 두 영역을 하나의 직선으로 분리한다.

1. 다층 퍼셉트론의 설계

다층 퍼셉트론이 입력층과 출력층 사이에 숨어있는 은닉층을 만드는 것을 도식화하면 다음과 같다.

입력층의 데이터가 은닉층을 거치면서 출력층으로 이동한다.

 

이때 은닉층은 정해진 규칙이 아니라, 앞서 언급한 XOR 문제처럼 선형적으로 해결할 수 없는 문제를 "공간을 왜곡"하는 개념으로 해결하는 특정 알고리즘을 의미한다.

가운데 숨어있는 은닉층으로 퍼셉트론이 각각 자신의 가중치(w)와 바이어스(b) 값을 보내고,이 은닉층에서 모인 값이 한 번 더 시그모이드 함수를 이용해 최종 값으로 결과를 보낸다. 은닉층에 모이는 중간 정거장을 노드(node)라고 하며,여기서는 n1과 n2이라 한다.

 

n1과 n2의 값은 각각 단일 퍼셉트론의 값과 같으며 출력층에서는 역시 시그모이드 함수를 통해 y 값이 정해진다.

각각의 가중치(w)와 바이어스(b) 값은 2차원 배열로 표현이 가능한데, 은닉층을 포함해 가중치 6개와 바이어스 3개가 필요하다.

2. XOR 문제의 해결

XOR 문제를 해결하기 위해 바이서스의 각 변숫값을 정해보자. 임의의 바이서스 값을 대입하면 다음과 같다.

 

 

위 사진의 바이서스와 가중치, 그리고 XOR에 적용한 표는 다음과 같다.

 

  x1 x2 w B(1) B(2) y
n1 0 0 -2 3 1 0
n2 0 1 2 -1 1
n1 1 0 -2 3 1
n2 1 1 2 -1 0

 

n1, n2, y 구하는 공식에 차례로 대입하니 우리가 원하는 결과를 구할 수 있었다. 숨어있는 두 개의 노드를 둔 다층 퍼셉트론을 통해 XOR 문제가 해결할 수 있음을 증명했다.

3. 코딩을 통한 XOR 문제의 해결

앞서 작성한 논리표에서 AND 논리의 정반대인 NAND를 추가해 보자.

 

x1 x2 AND NAND OR XOR
0 0 0 1 0 0
0 1 0 1 1 1
1 0 0 1 1 1
1 1 1 0 1 0

이를 바탕으로 다시 [바이서스와 가중치, 그리고 XOR에 적용한 표]를 확인하면, NAND 논리의 해당하는 값이 n1에, OR 논리에 해당하는 값이 n2에 할당된 것을 확인할 수 있다.

 

이 말은 즉슨 NAND 게이트와 OR 게이트, 이 두 가지를 내제 한 각각의 퍼셉트론이 다중 레이어안에서 작동하고 이 두 가지 값에 대해 AND 게이트를 수행한 값이 우리가 찾는 XOR 게이트의 값 (y)인 것이다. 순서를 표현하면 다음과 같다.

 

1. x1, x2를 설정한다.

2. x1에 적용되는 가중치와 바이서스를 결합한 값 n1, x2에 적용되는 가중치와 바이서스를 결합한 값 n2 생성한다.

3. n1은 x1와 x2의 NAND 게이트를 거친 값, n2는 x1와 x2를 OR 게이트를 거친 값과 동일하다.

4. 결괏값 y는 n1과 n2를 AND 게이트를 거친 값과 동일하다.

 

코딩을 통해 확인하기 위해 정해진 가중치와 바이어스를 numpy 라이브러리를 사용해 다음과 같이 코드를 작성해 보자.

import  numpy as np

w11 = np.array([-2,-2]) # 첫 번째 가중치 (1행)
w12 = np.array([2,2]) # 첫 번째 가중치 (2행)
w2 = np.array([1,1]) # 두 번째 가중치


b1 = 3 # 첫 번째 바이서스 (1행)
b2 = -1 # 첫 번째 바이서스 (2행)
b3 = -1  # 두 번째 바이서스 

# 퍼셉트론 함수 : 0과 1 중에서 값을 출력하게 설정

# x : 입력값
# w : 가중치
# p : 바이어스

def MLP(x,w,b):
    y = np.sum(w * x) + b
    if y <= 0 :
        return 0
    else :
        return 1
        
# NAND 게이트
def NAND(x1, x2):
    return MLP(np.array( [x1, x2]), w11, b1)
#OR 게이트
def OR(x1, x2):
    return MLP(np.array( [x1, x2]) , w12, b2)

#AND 게이트
def AND(x1, x2):
    return MLP(np.array([x1, x2]), w2, b3)
#XOR 게이트
def XOR(x1, x2):
    return AND(NAND(x1, x2),OR(x1, x2))
    
if __name__ == '__main__':
    for x in [(0,0), (1,0),(0,1),(1,1)]:
            y = XOR(x[0],x[1])
            print("입력값: " + str(x) + "출력값 : "+ str(y))

 

이 코드에서 NAND, OR, AND 함수는 MLP 함수를 사용하지만, XOR 함수는 그렇지 않은 이유는 XOR 문제를 해결하기 위해 다층 퍼셉트론(Multi-Layer Perceptron, MLP) 구조를 사용하기 때문이다.

AND, OR, NAND 게이트는 하나의 퍼셉트론(단층 신경망)만으로 구현할 수 있다. 각각 고유한 가중치(weight)와 바이어스(bias)를 설정하면, 선형 분류가 가능하다. 따라서 이들은 단순히 MLP 함수를 사용해 하나의 퍼셉트론만 계산하면 된다. 하지만 XOR 문제를 해결하기 위해서는 하나의 퍼셉트론이 아니라 두 개 이상의 퍼셉트론을 조합해야 한다. 코드에서 XOR을 구현하는 방식은 다음과 같다.

 

 

1. NAND 게이트 계산 : 입력값을 NAND(x1, x2)로 변환한다.

2. OR 게이트 계산 : 입력값을 OR(x1, x2)로 변환한다.

3. AND 게이트로 최종 결과 계산 : AND(NAND(x1, x2), OR(x1, x2))을 수행한다.

 

표로 정리하면 다음과 같다. 결국 복잡한 시그모이드 함수는 여러 개의 논리 게이트(단일 퍼셉트론의 결합)로 표현이 가능하다.

 

x1 x2 AND NAND OR AND(NAND,OR) XOR
0 0 0 1 0 AND(1,0) = 0 0
0 1 0 1 1 AND(1,1) = 1 1
1 0 0 1 1 AND(1,1) = 1 1
1 1 1 0 1 AND(0,1) = 0 0

다시 말해 퍼셉트론 하나로 은닉층을 만들어 문제를 해결할 수 있다는 것을 보일 수 있다. 이처럼 은닉층을 여러 개 쌓아 복잡한 문제를 해결하는 과정을 인공신경망 혹은 신경망이라고 부른다.


8장 오차 역전파

1. 오차 역전파의 개념

오차 역전 파는 딥러닝에서 가장 중요한 개념 중 하나이며, 다층 퍼셉트론이 효과적으로 학습할 수 있도록 도와주는 핵심 원리이다. 이전까지의 학습에서 입력 값과 출력 값을 알고 있는 상태에서 은닉층이 추가된 다층 퍼셉트론의 구조를 이해했다면, 이제는 이 모델이 실제로 학습할 수 있도록 가중치와 바이어스를 어떻게 최적화하는지 살펴볼 필요가 있다.

 

XOR 문제를 해결할 때는 정답이 되는 가중치와 바이어스를 미리 알고 있었기 때문에 직접 설정할 수 있었다. 하지만 실제 프로젝트에서는 이러한 최적의 가중치를 미리 알 수 없으며, 학습을 통해 찾아야 한다. 이 문제를 해결하는 방법이 바로 오차 역전파이다. 오차 역전파는 모델의 예측 값과 실제 값 사이의 오차를 계산한 후, 이를 바탕으로 가중치를 조정하는 과정이다.

 

 

[모두의 딥러닝] #2. 딥러닝의 동작원리

3장 가장 훌륭한 예측선 긋기 : 선형회귀1. 선형 회귀회귀는 데이터를 이용해 입력 변수(독립 변수)와 결과 값(종속 변수) 사이의 관계를 찾아내는 방법이다. 회귀(Regression)는 데이터에서 변수들

udangtangtang-cording-oldcast1e.tistory.com

 

경사 하강법은 이미 학습한 개념으로, 미분을 활용해 오차를 줄이는 방향으로 가중치를 조정하는 방식이다. 이를 통해서 실제 프로젝트에서 필요한 가중치를 얻을 수 있다. 이를 다층 퍼셉트론에 적용하면 출력 값에서 발생한 오차를 거꾸로 전달하면서 각 층의 가중치를 업데이트하는 방식으로 확장할 수 있다. 즉, 다층 퍼셉트론에서의 학습은 출력층에서 오차를 계산한 후, 이를 은닉층 방향으로 거슬러 올라가면서 가중치를 수정하는 방식으로 진행된다.

 

쉽게 설명하면 다음과 같다:

 

1. XOR 문제를 해결하기 위해서는 가중치와 바이서스를 알아야 한다.

2. 경사하강법을 이용해 임의의 가중치를 선언하고 결괏값을 이용해 오차가 최소인 지점을 찾는 과정을 통해 가중치를 찾는다.

- 이는 단일 퍼셉트론의 경우로서 다중 퍼셉트론이 경우 은닉층을 계산해야 한다.

- 단일 퍼셉트론에서 결괏값을 얻기 위해서는 오차를 구한 후 앞 단계에서 구한 가중치를 조정한다.

- 다중 퍼셉트론에서는 단일 퍼셉트론과 마찬가지로, 앞선 가중치를 차례로 거슬러 올라가며 가중치를 조정한다.

 

단일 퍼셉트론 다중 퍼셉트론

 

오차 역전파 구동 방식은 다음과 같이 정리할 수 있다.

 

1 I 임의의 초기 가중치(W)를 준 뒤 결과를 계산한다.

2 | 계산 결과와 우리가 원하는 값 사이의 오차를 구한다.

3 | 경사 하강법을 이용해 바로 앞 가중치를 오차가 작아지는 방향으로 업데이트한다.

4 | 위 과정을 더 이상 오차가 줄어들지 않을 때까지 반복한다.

 

여기서 ‘오차가 작아지는 방향으로 업데이트한다’는 의미는 미분 값이 0에 가까워지는 방향으로 나아간다는 것을 의미한다. 이 말은 가중치에서 기울기를 뺐을 때 가중치의 변화가 전혀 없는 상태를 말한다. 따라서 오차 역전파를 다른 방식으로 표현하면 가중치에서 기울기를 빼도 값의 변화가 없을 때까지 계속해서 가중치 수정 작업을 반복하는 것이다.


오차 역전파에서 사용되는 경사 하강법은 오차 함수(비용 함수)를 최소화하는 방향으로 가중치를 조정하는 방법이다. 경사 하강법에서 가중치 w는 다음과 같이 업데이트된다. 

새로운 가중치 = 기존의 가중치 - 학습률 * 기울기
가중치의 변화량 = | 새로운 가중치 - 기존의 가중치 |

 

여기서 기울기는 오차 함수의 미분 값이며, 이 미분 값이 0이면 기울기가 없는 평탄한 지점에 도달했음을 의미한다. 즉, 경사 하강법은 매 반복마다 미분 값(기울기)을 사용하여 가중치를 조정하며, 미분 값이 0에 가까워질수록 가중치의 변화량이 줄어든다.

미분 값이 0이 된다는 의미

미분 값이 0이라는 것은 오차 함수가 최소가 되는 지점, 즉 극소점(local minimum)에 도달했음을 의미한다. 경사 하강법은 처음에는 가파르게 내려가지만, 미분 값이 점점 작아지면서 오차가 줄어든다. 결국 미분 값이 0이 되는 지점에서는 더 이상 가중치를 조정해도 오차가 줄어들지 않으며, 이 상태에서 학습이 멈춘다.

 

즉, 미분 값이 0이 되면 가중치가 더 이상 변하지 않는다. 이는 더 이상 학습할 필요가 없는 상태에 도달했음을 의미하며, 오차 역전파가 종료되는 조건이 된다.

"기울기를 뺐을 때 가중치의 변화"의 의미

위 업데이트 식(새로운 가중치)에서 기울기(비용함수의 미분)가 크면 가중치가 크게 변하고, 기울기(비용함수의 미분)가 작으면 가중치 변화가 적어진다. 특히, gradient = 0이면 가중치 값이 변하지 않는다 : w_new = w_old - learning_rate * 0

 

따라서 "가중치에서 기울기를 뺐을 때 가중치의 변화가 전혀 없는 상태"란, 가중치를 조정하려고 하지만 기울기가 0이므로 가중치가 더 이상 변화하지 않는 상태를 의미한다. 이 상태가 바로 비용 함수(오차 함수)가 최소가 되는 지점이다.


2. 코딩으로 확인하는 오차 역전파

앞서 XOR 문제를 코딩으로 확인할 때는 가중치를 미리 알고 접근했었다. 오차 역전파는 이를 몰라도 문제를 해결하기 위해 개발된 방법으로, 실제 값과 다층 퍼셉트론의 계산 결과를 비교하여 가중치를 역전파 방식으로 수정해가야한다.

 

 

오차 역전파를 구현하는 과정은 몇 가지 주요 단계를 거친다. 각 단계는 신경망이 효과적으로 학습하도록 하는 핵심 과정이며, 이를 순서대로 정리하면 다음과 같다.

  1. 환경 변수 설정
    신경망이 학습을 시작하기 전에 필요한 변수들을 정의한다. 환경 변수에는 입력값과 타깃값이 포함된 데이터셋, 학습률, 활성화 함수, 초기 가중치 등이 포함된다. 이 단계는 신경망이 학습을 수행할 준비를 하는 과정이다.
  2. 신경망 실행 및 예측값 계산
    초기값을 입력하여 신경망을 실행하고, 활성화 함수와 가중치를 거쳐 예측 결과를 도출한다. 이 단계에서는 입력 데이터가 신경망을 통과하면서 출력값이 생성된다.
  3. 오차 측정 및 비교
    신경망이 예측한 결과를 실제 값과 비교하여 오차를 측정한다. 오차는 신경망이 학습을 얼마나 잘하고 있는지를 나타내며, 이를 줄이는 것이 목표이다. 이 과정에서 오차가 크면 가중치 조정 폭을 크게 하고, 오차가 작으면 조정 폭을 줄이는 방식으로 학습을 진행한다.
  4. 오차 역전파 실행
    출력층에서 발생한 오차를 은닉층을 거슬러 올라가며 가중치를 수정하는 방식으로 학습을 수행한다. 이 과정에서 경사 하강법을 활용하여 가중치를 업데이트하며, 신경망이 점점 더 정확한 예측을 할 수 있도록 한다.
  5. 결과 출력 및 학습 검증
    학습이 완료된 후 최종적으로 결과를 출력하여 신경망이 얼마나 잘 학습했는지 확인한다. 오차가 충분히 줄어들었다면 신경망이 XOR 문제와 같은 비선형 분류 문제도 해결할 수 있다.
  6. 신경망 라이브러리 활용 및 코드 이해
    파이썬을 이용하여 XOR 문제의 역전파 과정을 직접 구현할 수도 있으며, 이를 통해 신경망이 학습하는 원리를 더욱 명확히 이해할 수 있다. 다만, 대부분의 딥러닝 프로젝트에서는 이미 구현된 신경망 라이브러리인 케라스(Keras)나 텐서플로(TensorFlow)를 활용하여 보다 효율적으로 학습을 진행한다. 하지만 신경망이 내부적으로 어떻게 동작하는지를 이해하기 위해 직접 코드를 작성해보는 과정은 딥러닝의 핵심 개념을 익히는 데 중요한 역할을 한다.

9장 신경망에서 딥러닝으로

다층 퍼셉트론 이 오차 역전파를 만나 신경망이 되었고, 신경망은 XOR 문제를 해결할 수 있었다. 따라서 이제 신경망을 차곡차곡 쌓아올리면 마치 사람처럼 생각하고 판단하는 인공지능이 금방이라도 완성될 것처럼 보인다. 하지만 기대만큼 결과는 좋지 않다. 그 이유를 알아보자.

1. 기울기 소실 문제와 활성화 함수

오차 역전파는 출력층에서 시작하여 은닉층을 거쳐 입력층 방향으로 가중치를 수정하는 방법이다. 이 과정에서 가중치를 조정하려면 각 층에서의 기울기, 즉 미분 값이 필요하다. 하지만 신경망의 층이 깊어질수록 역전파를 통해 전달되는 기울기 값이 점점 작아지는 기울기 소실(vanishing gradient) 문제가 발생한다.

이 문제의 주요 원인은 활성화 함수로 사용된 시그모이드(sigmoid) 함수의 특성 때문이다. 시그모이드 함수를 미분하면 최댓값이 약 0.3 정도로, 1보다 작은 값이 된다. 따라서 여러 층을 거치며 미분 값을 계속 곱하면 0에 가까워지게 되고, 결국 초기 층에서는 의미 있는 가중치 업데이트가 이루어지지 않는다. 이는 신경망이 효과적으로 학습되지 않는 주요 원인 중 하나이다.

 

이를 해결하기 위해 다양한 활성화 함수가 연구되었다. 먼저, 시그모이드 함수를 개선한 하이퍼볼릭 탄젠트(tanh) 함수가 도입되었다. 이 함수는 출력 범위를 -1에서 1로 확장하여 미분 값의 범위도 넓히는 효과를 가져왔다. 하지만 여전히 미분 값이 1보다 작은 경우가 많아, 기울기 소실 문제를 완전히 해결하지는 못했다.

 

이후, 토론토대학교의 제프리 힌튼 교수가 제안한 렐루(ReLU, Rectified Linear Unit) 함수가 시그모이드의 대안으로 떠오르며 현재 가장 널리 사용되는 활성화 함수가 되었다. 렐루 함수는 입력값이 0보다 작을 때는 0을 출력하고, 0보다 클 때는 입력값을 그대로 출력하는 방식이다. 단순한 구조이지만, 0보다 큰 값에서는 미분 값이 항상 1이 되므로 여러 은닉층을 거쳐도 기울기가 소실되지 않는다. 이를 통해 신경망이 깊어져도 학습이 가능해졌고, 딥러닝 기술의 발전 속도를 가속화하는 계기가 되었다.

 

렐루의 단점을 보완한 변형된 함수들도 연구되고 있다. 예를 들어, 소프트플러스(softplus) 함수는 렐루 함수가 0에서 갑자기 값이 변하는 특성을 완화하여 더 부드러운 변화를 제공한다. 현재도 다양한 활성화 함수가 개발되고 있으며, 보다 효율적인 학습을 위한 연구가 지속되고 있다.

2. 속도와 정확도 문제를 해결하는 고급 경사하강법

딥러닝에서 가중치를 업데이트하는 방법으로 경사 하강법(Gradient Descent)을 배웠다. 경사 하강법은 가중치를 최적화하는 강력한 방법이지만, 한 번 업데이트할 때마다 전체 데이터셋을 미분해야 하므로 계산량이 많아 속도가 느려지는 단점이 있다. 또한, 복잡한 최적화 문제에서는 최적 해를 찾기 전에 학습이 멈추거나, 잘못된 방향으로 수렴하는 문제가 발생할 수 있다.

 

이를 보완하기 위해 여러 가지 고급 경사 하강법이 등장하면서 딥러닝 모델의 학습 속도와 정확도는 크게 향상되었다. 특히, 랜덤 한 데이터를 이용하는 확률적 경사 하강법, 이전 이동 방향을 고려하는 모멘텀 기법, 학습률을 자동 조정하는 방법들이 연구되었으며, 현재는 아담(Adam)과 같은 방법이 가장 널리 사용되고 있다.

확률적 경사 하강법 (SGD)

일반적인 경사 하강법은 모든 데이터를 사용하여 기울기를 계산하는데, 이는 불필요한 계산량을 증가시키고 속도를 저하시킬 수 있다. 확률적 경사 하강법(Stochastic Gradient Descent, SGD)은 이러한 단점을 보완하기 위해, 전체 데이터셋이 아니라 랜덤 하게 추출한 일부 데이터를 사용하여 가중치를 업데이트하는 방식이다.

이 방법을 사용하면 계산량이 줄어들어 더 빠르게 학습할 수 있고, 최적 해를 찾아가는 과정에서 자주 업데이트할 수 있다는 장점이 있다. 다만, 일부 데이터를 사용하기 때문에 중간 과정에서 진폭이 크고 불안정한 경향이 있다. 그러나 최적 해에 근사한 값을 빠르게 찾을 수 있어 딥러닝에서 널리 사용된다.

모멘텀 (Momentum)

모멘텀(momentum)은 물리학에서 사용하는 개념으로, 관성을 활용해 가속도를 부여하는 방식이다. 모멘텀 SGD는 경사 하강법이 단순히 기울기 방향만 고려하는 것이 아니라, 이전 업데이트 방향도 함께 반영하여 최적화 과정의 효율성을 높이는 방법이다.

기존 경사 하강법에서는 학습이 진행될 때 방향이 바뀌면서 지그재그 움직임이 발생할 수 있다. 하지만 모멘텀을 적용하면 이전 이동 방향을 참고하여 일정한 비율만 수정하게 되므로, 불필요한 진동이 줄어들고 최적해로 빠르게 수렴할 수 있다.

네스테로프 모멘텀 (NAG)

네스테로프 모멘텀(Nesterov Accelerated Gradient, NAG)은 모멘텀 방법을 더 개선한 방식이다. 기존 모멘텀 방식은 기울기를 계산한 후 이동하지만, 네스테로프 모멘텀은 먼저 이동한 후 기울기를 계산하여 불필요한 이동을 줄인다. 이를 통해 더욱 정밀한 최적화를 수행할 수 있다.

아다그라드 (Adagrad)

아다그라드(Adagrad)는 변수마다 다른 학습률을 적용하는 방법으로, 자주 업데이트되는 변수는 학습률을 작게 하고, 적게 업데이트되는 변수는 학습률을 크게 하여 학습 속도를 조절한다. 이를 통해 학습이 불균형하게 진행되는 문제를 해결할 수 있다.

이 방법은 각 변수의 변화량을 고려하여 학습률을 자동으로 조정하지만, 학습이 오래 지속될 경우 학습률이 너무 작아지는 문제가 있다.

알엠에스프롭 (RMSProp)

알엠에스프롭(RMSProp)은 아다그라드의 단점을 보완한 방법으로, 학습률이 너무 작아지는 문제를 해결하기 위해 최근 기울기의 변화량을 일부만 반영하도록 조정한다. 이를 통해 학습 속도를 유지하면서도 안정적인 최적화를 수행할 수 있다.

아담 (Adam)

아담(Adam, Adaptive Moment Estimation)은 모멘텀과 알엠에스프롭(RMSProp)을 결합한 방식으로, 현재 가장 널리 사용되는 최적화 알고리즘이다. 모멘텀을 이용하여 이전 기울기의 이동 방향을 반영하고, 알엠에스프롭을 이용하여 학습률을 자동 조정하는 방식으로 최적화 성능을 극대화한다. 아담은 대부분의 딥러닝 모델에서 기본적으로 사용될 만큼 안정적이고 효율적인 알고리즘이다.

경사 하강법 개요 효과 케라스 사용법
확률적 경사 하강법 (SGD) 랜덤한 일부 데이터를 사용하여 속도 향상 속도 개선 keras.optimizers.SGD(lr=0.1)
모멘텀 (Momentum) 기울기 방향을 고려하여 관성을 추가 정확도 개선 keras.optimizers.SGD(lr=0.1, momentum=0.9)
네스테로프 모멘텀 (NAG) 기울기 계산을 먼저 수행하여 이동 조절 정확도 개선 keras.optimizers.SGD(lr=0.1, momentum=0.9, nesterov=True)
아다그라드 (Adagrad) 변수별 학습률 조절 보폭 크기 개선 keras.optimizers.Adagrad(lr=0.01, epsilon=1e-6)
알엠에스프롭 (RMSProp) 아다그라드의 학습률 감소 문제 보완 보폭 크기 개선 keras.optimizers.RMSprop(lr=0.001, rho=0.9, epsilon=1e-08, decay=0.0)
아담 (Adam) 모멘텀과 RMSProp을 결합한 최적화 방법 정확도 및 보폭 크기 개선 keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)
728x90
반응형
댓글