본문 바로가기
Tech Blog/AI 인공지능

[딥러닝] 신경망 구성

by Cloud 9 2022. 2. 1.
728x90
반응형
728x90
오늘의 목표 :
인공 신경망의 실제 구현 원리를 이해하기 위해,
프레임워크 내부에서 일어나는 일을 Numpy를 활용해 직접 구현하고 이해하기!

신경망이란?

뉴런들이 거대한 그물망과 같은 형태를 이루고 있는 것을 말한다. 

 

퍼셉트론

  • 우리 뇌 속의 신경망 구조에 착안해서 퍼셉트론(Perceptron)이라는 제안한 형태이다.
  • 인공신경망(Artificial Neural Network)라고 부른다.  
  • 여러 개의 신호가 들어오면 이를 조합해서 다음으로 0 또는 1의 신호 중 신호를 보낼지 말지를 결정한다. 

 

다층 퍼셉트론(Multi-Layer Perceptron;MLP)

  • 단일 퍼셉트론이 MLP으로 발전하는 과정에서 신호 전달 유무가 아니라 전달 강도를 정하게 되었다.
  • 2개 이상의 레이어를 쌓아서 만든 인공 신경망을 말한다. 
  • [ 입력층과 출력층을 제외한 은닉층이 많아지면 많아질수록 인공신경망이 deep 해졌다고 말할 수 있다. ]
  • * 여기서 "입력층-은닉층-출력층"의 구조로 이루어져 있을 때, 은닉층에서의 레이어가 몇 개든 간에, 입력층과 출력층 사이에 있는 것은 전부 은닉층이다. 

 

Fully-Connnected Nerual Network
 : 서로 다른 층에 위치한 노드 간에는 연결 관계가 존재하지 않는다.

인접한 층에 위치한 노드들 간의 연결만 존재한다는 의미를 내포함.

 

 

 

- bias node : https://stackoverflow.com/questions/2480650/what-is-the-role-of-the-bias-in-neural-networks

 

What is the role of the bias in neural networks?

I'm aware of the gradient descent and the back-propagation algorithm. What I don't get is: when is using a bias important and how do you use it? For example, when mapping the AND function, when I u...

stackoverflow.com

 

 

Parameters/Weights

  • 입력층 - 은닉층, 은닉층 - 출력층 사이에는 각각의 행렬이 존재한다. 
    입력값이 50개, 은닉 노드가 20개라면 사실 이 입력층과 은닉층 사이에는 50*20의 형태를 가진 행렬이 존재한다.
  • 이 행렬들을 Parameter/Weight라고 부른다.  
    (Parameter와 Weight는 거의 비슷한 뜻으로 사용되지만, 실제로는 Parameter에는 bias 노드도 포함된다. 
  • 인접한 레이어 사이에는 다음과 같은 식이 성립된다. 

W는 가중치, X는 입력값, y는 출력값, b는 bias parameter


활성화 함수와 손실 함수

  • 활성화 함수 (Activation Functions) 
    • 단일 퍼셉트론이 다중 퍼셉트론으로 발전하는 과정에서, 뉴런은 신호의 전달 유무가 아닌 전달 강도를 정하게 되다.
    • 이때 전달하는 신호의 세기를 정하는 방법이 활성 함수다.
    • 일반적으로 비선형 함수를 사용한다. 
      이 비선형 함수를 MLP 안에 포함시키면서 모델의 표현력이 좋아진다. 

활성화 함수 종류 

1. Sigmoid 

  : 시그 모이드 함수는 모든 input을 (0,1)의 출력 범위로 압축한다. 

 

# 은닉층의 출력에 활성화 함수로 Sigmoid를 사용한 예시 
model.add(keras.layers.Dense(50, activation='sigmoid', input_shape=(784,)))

시그모이드 함수 식

# 위의 sigmoid 함수를 구현하자.

def sigmoid(x):
    return 1 / (1 + np.exp(-x))  


z1 = sigmoid(a1)  # 여기서 a1 은 첫 번째 은닉층의 출력이라는 의미이다.
print(z1[0])  # sigmoid의 출력은 모든 element가 0에서 1사이이다.

Sigmoid 함수는 활성화 함수로 예전부터 많이 써왔는데 기울기 소실 현상 발생과 Exp 함수 사용 시 비용이 크다는 단점이 있어 현재는 ReLU함수를 더 많이 사용하고 있다. 

 

  • 기울기 소실 현상 :
       신경망 활성 함수의 기울기 값이 계속 곱해지다 보면, 가중치에 따른 결괏값의 기울이가 0이 되어 경사 하강법을 이용할 수 없게 되는 문제다. (반대로 기울기 값이 증폭되는 경우에는 '기울기 폭발 문제(exploding gradient problem)'도 발생한다. )
       기울기값이 사라지는 문제로 활성화 함수를 선택하는 문제에 의존적으로 발생한다. sigmoid나 tanh 등은 매우 비선형적인 방식을 사용해서 input을 아주 작은 output range로 squash 하게 된다. 
    • Sigmoid를 예시로 들자면, Sigmoid의 출력은 모든 element가 0에서 1 사이가 된다. 
      그 결과, 넓은 input space region이 아주 작은 범위로 mapping 된다. 
      이렇게 되면 Gradient가 작기 때문에,  input space에서 큰 변화가 있어도 output에서는 작은 변화만 나타난다.
    • Gradient를 수축시키는 원인 중 하나는 활성화 함수의 미분 값이 있다. 
    • 해결 방법 :
      • 활성 함수를 개선하는 방법
        • Squashing 하지 않는 활성화 함수를 사용하면 된다 (ReLU : Rectified Linear Unit - max(0, x))
        • ReLU함수는 이러한 문제를 갖지 않는다. 왜냐면 Gradient가 x값이 0 이하일 때(0이나 음수)는 0이고, 양수가 input이면 항상 1이 된다.  
      • Why ReLu activation function doesn't have this problems?
        Because if the x value is under 0 (0이나 음수;Negative Number), its elements are "0(Zero)". if the x value is a positive value, the elements are always "1"
      • 가중치를 초기화하는 것도 Gradient에 영향을 줄 수 있는데, 초기화 문제는 Vanishing이 아니라 Exploding 하게 만든다.   
      • Batch Normalization 배치 정규화 : 한 번에 들어오는 배치 단위로 정규화하는 것
        • 장점
          • 가중치 초기화에 훨씬 덜 민감해진다. 
          • 훨씬 큰 학습률을 사용할 수 있어 학습 속도를 개선시킨다
          • Drop-out과 같은 효과를 낼 수 있다. (같이 사용하는 것이 좋다. )
        • 단점 : 모델을 복잡하게 하며 추가 계산을 하는 것이므로 테스트 데이터에 대한 예측 시에 실행 시간이 느려진다. 
        • 한계 
          • 배치 크기에 의존적이다. (너~무 작은 배치 크기에서는 잘 동작하지 않을 수 있다. )
          • RNN에 적용하기 어렵다. 
            • RNN은 각 시점별로 다른 통계치를 갖기 때문에 배치 정규화를 적용하는 것이 어렵다. 
      • Gradient Clipping : 기울기의 Exploding을 막기 위해서 값을 자르는 것으로 임계치를 넘지 않도록 해준다.
# Gradient Clipping 


from tensorflow.keras import optimizers

Adam = optimizers.Adam(lr=0.0001, clipnorm=1.)

 

      • Weight initialization 가중치 초기화 : 같은 모델을 훈련하더라도 초기 가중치에 따라 모델의 훈련 결과가 달라지기도 한다. 가중치 초기화만 적절하게 해 주어도 문제를 완화시킬 수 있다. 
        • Xavier Initialization 세이비어 초기화 = Glorot Initialization
        • 여러 층의 기울기 분산 사이에 균형을 맞춰서 특정층이 너무 주목받거나 뒤쳐지는 경우를 막는다.
        • Sigmoid나 하이퍼볼릭 탄젠트 함수처럼 S자 형태인 활성화 함수와 함께 사용하면 좋다. 
        • ReLU나 ReLU 변형 함수들을 활성화 함수로 사용할 경우에는 He 초기화 방법을 사용하는 게 좋다.  
        • 다음과 같은 두 개의 경우로 나뉜다.  
          • 균등 분포를 사용해서 초기화하는 경우
          • 정규 분포를 사용해서 초기화하는 경우

 

오차 역전파법 Backpropagate
:  Weight parameter의 기울기를 효율적으로 계산하는 방법

1. output을 손실 함수로 변환한다. 
2. 손실 함수의 기울기를 수치 미분
3. 기울기가 0이 되는 지점까지 가중치를 변화시킨다. 

수치 미분을 통한 기울기 산출은 단순하고 구현하기 쉽다는 장점이 있지만, 계산 시간이 오래 걸린다는 단점이 있다. 그래서 가중치 매개변수의 기울기를 가장 효율적으로 계산할 수 있는 오차 역전파법을 사용한다. 순전파의 방향은 왼쪽에서 오른쪽, 역전파의 방향은 오른쪽에서 왼쪽이다. 

 


2. Tanh 

  •  tanh 함수는 함수의 중심값을 0으로 옮겨 Sigmoid의 최적화 과정이 느려지는 문제를 해결할 수 있다.
  • 그러나 여전히 Vanishing Gradient 기울기 소멸 문제가 존재한다. 

 

3. ReLU 

  • Sigmoid와 tanh 함수에 비해 학습이 빠르다 
  • 연산 비용이 크지 않다
  • 구현이 매우 간단하다. 

손실 함수

손실 함수 (Loss Functions = 비용 함수 Cost 함수 )

  데이터를 토대로 산출한 모델의 예측값과 실제값의 차이를 표현하는 지표이다. 

이 차이를 줄이기 위해 각 파라미터들을 조정하는 것이 딥러닝의 전체적인 학습 흐름이다.

 

통계학적 모델은 회귀와 분류, 두 가지 종류로 나뉜다. 그에 따라 손실 함수도 두 가지로 나뉜다. 

  • 회귀 종류에 사용되는 손실 함수는 MAE, MSE, RMSE가 있다.
  • 분류 종류에 사용되는 손실함수는 Binary cross-entropy, Categorical cross-entropy 등이 있다. 

1. 회귀 타입 손실함수 

 : 평균 오차를 계산하는 방식에 따라서 구분된다. 

  • 평균 절대 오차 (Mean Absolute Error, MAE)
    • 장점 : 전체 데이터의 학습된 정도를 쉽게 파악할 수 있다. 
    • 단점 : 절댓값을 취했기 때문에 어떤 식으로 오차가 발생했는지, 양수인지 음수인지 판단할 수 없다. 

  • 평균 제곱 오차 (Mean Squared Error, MSE)
    • 장점 : 최적값에 가까워질수록 이동거리가 다르게 변화한다. 그래서 최적값을 수렴시키기에 용이하다. 
    • 단점 : 정답에 대한 정답률의 오차 뿐만 아니라 다른 오답들에 대한 정답률 오차 또한 포함되어 계산된다. 
              값의 왜곡이 있을 수 있다. 
    • 특징 : 제곱 연산으로 인해 오차를 누적값이 증가된다. 
    • 1보다 작은 값은 더 작아지고, 그 이상의 값은 더 커진다. 

  • 평균 제곱근 오차 (Root Mean Square Error, RMSE)
    • 장점 : MSE에 비해, 제곱된 값에 다시 제곱근을 취하기 때문에 값을 제곱하여 생겼던 왜곡이 줄어든다. 오차를 직관적으로 보여줄 수 있다. 
    • 단점 : 
    • 특징 : MSE에 Root를 씌운 형태로 장단점은 MSE와 비슷하다. 하지만, 제곱된 값에 다시 제곱근을 취하기 때문에 값을 제곱하여 생겼던 왜곡이 줄어든다. 
 

2. 분류 타입 손실함수 

  • Cross-entropy : 실제 분포 (q)에 대해서 모르는 상태로 시작해 모델링을 통하여 구한 분포인 p를 통해 q를 예측하는 것이다. 여기서 p와 q가 모두 식에 들어가기 때문에 Cross-entropy라는 이름이 되었다. 
    • 특징 
      • "실제값 = 예측값"인 경우 0으로 수렴하고, 값이 틀린 경우에는 값이 커진다. 
      • 실제값과 예측값을 줄이기 위한 방법이다. 
      • Label 값이 One-Hot Encoding인 경우에만 사용 가능하다 
        • 원-핫 코딩 One-Hot Encoding  : 단어 집합의 크기를 벡터의 차원으로 하고, 표현하고 싶은 단어의 인덱스에 1의 값을, 다른 인덱스에는 0의 값을 부여하는 단어의 벡터 표현 방식이다. 이렇게 표현된 벡터를 원-핫 벡터라고 부른다.  다중 분류에서 사용하는 인코딩 방법이다. 출력 값의 형태가 정답 값은 1이고 나머지는 0이 된다. 

  1. Binary Cross-Entropy
    : 이진 분류에 사용되는 방식이다.

    - True/False, Positive/negative...으로 class를 분류할 때 사용한다. 
    - 예측값은 0과 1 사이의 확률 값으로 표현된다. (1에 근접하면 True/Positive의 확률이 크다. 0에 근접하면 다른 클래스인 False/negative의 확률이 크다. )





  2. Categorical Cross-Entropy

     : 분류해야 하는 클래스가 3개 이상인 경우에 사용된다. 
    여러 클래스 중에서 가장 적절한 하나의 클래스로 분류해야하는 문제의 손실 함수로 사용되기에 적합하다. 



참고 자료

 

https://ydseo.tistory.com/41

기울기 소멸 문제 

 

Vanishing gradient problem이란 무엇인가?

2015년 12월 Quora 글 https://www.quora.com/What-is-the-vanishing-gradient-problem 의 번역 글쓴이 Nikhil Garg - Quora 엔지니어링 매니저 Vanishing Gradient Problem(기울기값이 사라지는 문제)는 인공신경..

ydseo.tistory.com

 

 

Vanishing gradient problem이란 무엇인가?

2015년 12월 Quora 글 https://www.quora.com/What-is-the-vanishing-gradient-problem 의 번역 글쓴이 Nikhil Garg - Quora 엔지니어링 매니저 Vanishing Gradient Problem(기울기값이 사라지는 문제)는 인공신경..

ydseo.tistory.com

 

https://brunch.co.kr/@chris-song/39 : 기울기 소멸 문제 

 

https://kerpect.tistory.com/184 : 오차 역전파법

 

https://reniew.github.io/12/ : 딥러닝에서 사용하는 활성화 함수 

 

https://pozalabs.github.io/Activation_Function/ : 활성화 함수 

 

https://wikidocs.net/60683 : [위키 독스] PyTorch로 시작하는 딥 러닝 입문 : 비선형 활성화 함수 

 

https://brunch.co.kr/@mnc/9 : Loss Funcion

 

 

반응형

 

728x90
반응형

'Tech Blog > AI 인공지능' 카테고리의 다른 글

[더북] 모두의 인공지능 기초 수학 (+계획)  (0) 2022.02.01