학습률(Learning Rate)

  • 경사 하강법 수식에서 가중치 변화량 앞에 붙은 알파(α)를 학습률이라고 한다.

[ 경사 하강법 수식 ]

  • 학습률은 극소점으로 파라미터를 이동시키는 변화량이라고 볼 수 있다. 따라서 학습률이 클수록 가중치 변화가 커지고, 학습률이 작을수록 가중치 변화가 작아진다.

  • 가중치 변화가 커진다는 의미는 학습을 빨리 진행하는 것으로 볼 수 있으나, 학습률이 너무 클 경우 극소점으로 가는 방향과 반대로 그래프를 이탈하는 문제(극소점에 가까워질수록 극소점에서 멀어지는 방향으로 파라미터가 튈 수 있다)가 발생할 수 있다. 역으로 학습률이 너무 작으면 학습이 매우 천천히 진행된다는 단점이 있다.

  • 적절한 학습률을 설정하는 것은 경험에서 나오기 때문에 많은 실험이 요구된다.

[ 학습률(=c)에 따른 파라미터 이동 간격 ]

 

에포크(Epoch), 배치 크기(Batch Size), 이터레이션(Iteration)

  • 에포크(Epoch)는 전체 데이터에 대해 순전파(feed-forward)와 역전파(back-propagation)가 끝난 상태를 뜻한다.

  • 배치크기(Batch Size)는 학습 데이터셋에서 샘플 단위(나눠서 학습)로 역전파를 수행할 때의 샘플의 크기를 의미한다.

  • 한 번에 데이터셋을 모두 넣고 학습하는 경우는 잘 없다.

  • 이터레이션(Iteration)은 한 번의 에포크를 수행하는데 필요한 배치의 수인데, 전체 데이터셋의 크기를 배치 크기로 나눈 것으로 정의된다.

  • 아래 그림을 설명하자면, 학습 데이터의 개수가 2000일 때, 배치 크기가 200일 경우, 200개의 데이터 단위로 학습을 진행한다. 그러면 총 10번의 반복으로 모든 데이터셋에 대해 학습을 끝낼 수 있고, 1 Epoch 당 10 Iteration 이라고 말한다.

[ 에포크, 배치 크기, 이터레이션의 도식화 ]

 

가중치 초기화(Weight Initialization)

  • 학습을 진행하기 전에 가중치(=파라미터)의 값은 학습 속도나 결과에 영향을 준다. 적절한 가중치에 가까운 값으로 초기화할 경우 빠른 속도로 학습되어 높은 정확도에 도달할 것이다.

  • 단, 절대로 해서는 안되는 방법 중 하나는 모든 가중치를 0으로 초기화하는 것이다. 모든 가중치가 0이 되면 역전파 과정에서 동일한 미분 결과를 낼 것이고 결과적으로 모든 가중치는 동일한 값으로 초기화될 것이기 때문이다. 이는 노드들의 비대칭성(asymmetry)을 야기할 요소를 사라지게 한다.

    • 신경망에서 가중치는 이전 레이어의 노드로부터 얼마나 영향을 받을지를 의미한다. 가중치가 0이라는 의미는 모든 노드가 이전 노드로부터 받는 영향이 없다는 것이다. 가중치 갱신 과정에서 영향을 받는 정도가 수정되겠지만 계산 방식이 미분을 구하는 과정이기 때문에 결국 모두 동일한 값으로 갱신되는 것이다.

    • 노드들의 비대칭성이란 학습 데이터셋의 서로 다른 특성(대부분 전처리로 얻어진 feature 특성들)을 포함하는 노드들의 "다름"의 정도를 의미한다.

  • 가중치를 초기화하는 방법은 다양한데 자세한 정보는 cs231n 문서를 참고.

  • 0에 가까운 난수로 초기화하기

    • 모든 가중치들은 난수를 이용하여 고유한 값으로 초기화되기 때문에 모두 서로 다른 값으로 갱신된다. 결과적으로 전체 신경망 내에서 서로 다른 특성을 보이는 다양한 부분으로 분화될 수 있다.

    • 단, 항상 좋은 성능을 내는 것은 아니며, 매우 작은 가중치로 초기화된 노드는 미분 결과 또한 매우 작은 값이 된다. (미분 값은 가중치 값에 비례하기 때문이다.)

  • 분산 보정(LeCun Initialization)

    • 가중치를 입력 데이터의 개수의 제곱근 값으로 나누는 방법으로 노드의 출력값의 분산을 1로 정규화할 수 있다. 이는 위 방법에서 입력 데이터 수에 비례하여 학습 결과의 분포가 커지는 것을 방지한다.

    • 이 방법은 근사적으로 동일한 출력 분포를 갖게할 뿐만 아니라 신경망의 수렴률 또한 향상시키는 것으로 알려져 있다.

  • 이 외에도 분산 보정을 활용하여 가중치를 초기화하는 다양한 방법이 있다.

 

과적합(Overfitting)

  • 파라미터에 비해 학습 데이터가 너무 적은 경우, 학습 데이터 외의 데이터에 대해 잘못된 학습 결과를 보이는 현상을 의미한다. 잘못된 학습 결과란 신경망 학습의 정확도가 낮은 것을 의미하며, 예를 들어 학습 데이터에 대해 정확도가 100%라 하더라도 다른 데이터에 대해 60%가 나오는 경우가 있다.

  • 과하게 훈련되었다고 표현하는데, 이를 방지하기 위해 학습 데이터에서 테스트 데이터셋과 검증 데이터셋을 샘플로 뽑아내서 두 개의 데이터셋을 제외하고 학습을 시킨다. 이렇게 학습 데이터셋(Training Set), 테스트 데이터셋(Test Set), 검증 데이터셋(Validation Set)으로 데이터셋을 3개로 나누어 학습을 진행하는 것을 일반화(Generalization)라고 한다. 일반화의 목적은 학습에 사용되지 않은 데이터에 대한 정확도를 높이는 것이다.

[ 일반화 ]

  • 신경망 학습을 진행하면 에포크당 데이터셋에 대해 오류율을 측정해서 정확도를 판단한다. 모든 데이터셋에 대해 학습을 진행한 후 검증 데이터셋에서 오류율이 다시 올라가는 부분(정확도가 올라갔다가 내려가는 부분)이 나타나면 적절하게 학습을 진행한 것으로 판단하고 학습을 해당 에포크까지만 진행한다. 이는 과적합을 막는 방법 중 하나로, 조기 종료라고 명명한다.

  • 과적합을 막는 방법을 정규화(Regularization)라고 한다. 지금까지 연구된 정규화 방식은 L2 정규화, L1 정규화, Max norm constraints, 그리고 드롭아웃 이렇게 4가지가 있다.

  • L2 정규화는 가장 일반적으로 사용되는 정규화 기법으로, 모든 파라미터 제곱 만큼의 크기를 손실 함수에 더하는 방식으로 구현된다. 이렇게 파라미터 제곱만큼 더하게 되면 큰 값이 많이 존재하는 파라미터에는 제약을 걸게 되고, 파라미터 값을 최대한 널리 퍼지는 효과를 주게 된다.

  • L1 정규화는 파라미터의 L1 norm 을 손실 함수에 더하는 방식으로, 파라미터 행렬을 sparse 하게(거의 0에 가깝게) 만드는 특성이 있다. 즉, L1 정규화가 적용되면 노드들은 입력 데이터의 sparse한 부분만을 사용하고 noisy 한 입력 데이터에는 영향을 받지 않는다. 반면에, L2 정규화를 적용하면 최종 파라미터 행렬들은 작은 값이 널리 퍼진 형태가 된다. 두 정규화 방식을 합쳐서 쓰는 경우도 있다.

  • Max norm constraints은 파라미터 행렬의 길이(L1 norm)가 미리 정해 놓은 상한 값을 넘지 못하도록 제한하면서 미분 연산도 제한된 조건 안에서 계산한다. 

  • 드롭아웃(DropOut)은 신경망 학습 중에 파라미터(가중치) 말고 p라는 어떤 확률을 추가로 받아 p라는 확률로 일부 노드들을 학습에서 제외(비활성화)시키는 방법이다. 드롭아웃의 목적은 레이어에 수많은 노드가 있다보니 노드들의 조합에 의존적이게 되는 것을 방지하고 다양한 조합으로 학습을 시키는 것이다. 이 작업은 매 학습(배치 단위의 학습을 의미)마다 확률 p에 따라 무작위로 노드들을 비활성화시킨다.

    • 여기서 p는 하이퍼파라미터(hyperparameter)라고 한다.

 

[ 드롭아웃 ]

 

데이터 확장(Data Augmentation)

  • 이미 존재하는 샘플 데이터를 일정하게 가공하여 양을 늘리는 방법

    • 이미지의 평행이동, 대칭이동, 회전 등의 기가학적 변환

    • 픽셀의 명암값, 색에 변동을 가한 결과 이미지

    • 가우스 분포를 따르는 랜덤 노이즈 추가

    • 배경 음악의 일부를 랜덤 샘플링하여 음성과 합성하는 것

  • 학습 데이터셋이 부족할 경우 과적합이 발생하는데, 새로운 데이터셋을 가져오기 보다는 기존의 데이터셋에서 확장하여 과적합을 방지하는 방법이다.

 

경사 하강법(Gradient Descent)

  • 손실 함수를 최소화하는 방법은 그래프 상에서 최소인 지점을 찾는 것이다. 그래서 그래프 상에서 경사를 내려간다고 하여 경사 하강법이라는 이름이 붙었다.

  • 평균 제곱 오차(MSE)를 그래프에서 살펴보면, 밑으로 움푹 파인 부분이 있는데 수학에서는 극소점이라고 불리는 위치로, 극소점에 해당되는 파라미터를 찾는 것이 신경망의 목적이다.

    • 결국, 신경망에서 학습이란 파라미터를 계속 움직여서(갱신해서) 극소점으로 이동시키는 과정이라고 볼 수 있다.

[ 극소점으로 이동하는 파라미터 ]

  • 극소점은 함수를 파라미터에 대해 미분 했을 때 0이 나오는 파라미터를 의미(위 그래프로 따지면 x좌표)한다. 파라미터가 여러 개인 경우 각 파라미터마다 손실 함수의 미분 결과를 알아내야 한다. 여기서 미분 결과는 신경망에서는 파라미터가 손실 함수에 영향을 미치는 정도로 해석한다.

  • 그래프 상에서 미분은 해당 위치의 기울기이며, 0보다 작으면 \ 모양이고, 0보다 크면 / 모양이다. 미분 값이 0보다 작으면 그래프 상에서 양수로 움직이는 방향(->)이 되고 0보다 크면 음수로 움직이는 방향(<-)이 된다.

    • 즉, 미분 값의 부호와 움직이는 방향은 반대이다.

[ 경사 하강법 ]

  • 신경망에서는 경사 하강법을 적용할 때 연쇄 법칙(Chain Rule)을 활용한다.

    • 먼저 연쇄 법칙이 어떤 원리로 계산되는지 살펴볼 필요가 있다.

    • 어떤 두 파라미터 x, y에 대한 함수 f(x, y)가 있다고 가정하자. 각 파라미터에 대해 편미분을 하면 df / dx = y 그리고 df / dy = x 이다. 다음으로 함수 f를 파라미터로 하는 g(f(x,y)) 가 있다고 할 때, g를 x에 대해 편미분하면 dg / dx = (dg / df) * (df / dx) 이다. 만약 함수 g를 파라미터로 하는 h(g(f(x,y))) 가 있으면, h를 x와 y에 대해 각각 편미분 했을 때 도출되는 식은 다음과 같다.

dh / dx = (dh / dg) * (dg / dx) = (dh / dg) * (dg / df) * (df / dx)

dh / dy = (dh / dg) * (dg / dy) = (dh / dg) * (dg / df) * (df / dy)

  • h(g(f(x,y))) 같은 함수를 복합 함수(composed function)라고 하는데, 복함 함수를 미분할 때 연쇄 법칙(중첩된 함수의 미분을 연쇄적으로 곱하는 것)을 활용하면 쉽게 계산할 수 있게 된다.

  • 신경망에서는 입력층을 제외한 모든 층의 각 노드는 함수의 형태(이전 레이어의 값을 입력으로 받고, 연산을 수행한 뒤 다음 레이어의 연결된 노드로 출력)이기 때문에 출력층에서 출력된 결과가 굉장히 많은 함수의 곱인 것을 알 수 있다. 실제로 노드끼리 연결된 간선은 무수히 많기 때문에 두 레이어 사이의 연산은 행렬 곱에 의해 수행되며, 결과적으로 손실 함수는 엄청나게 복잡한 복합 함수가 된다. 따라서 손실 함수를 최소화하는 파라미터를 찾기 위해 경사 하강법을 필요로 하며, 미분을 계산하는 과정에서 연쇄 법칙을 적용하는 것이다.

  • 극소점이 있는 위치로 파라미터를 움직이기(갱신시키기) 위해 미분 값에 -1을 곱해서 파라미터에 더해진다. 음수를 곱하는 이유는 그래프에서 기울기의 부호와 움직여야 하는 방향이 반대이기 때문이다.

[ 파라미터를 갱신하는 수식 ]

  • 손실 함수(=비용 함수)를 미분한 결과에 알파(α)를 곱하는데, 이는 움직이는 간격을 조절하는 역할을 하며 학습률(learning rate)이라고 부른다. 값이 클수록 많이 움직이고, 값이 작을수록 적게 움직이기 때문에 실험을 통해 적절한 값을 찾아야 한다. 보통 0 ~ 1 사이의 값이다. 참고로 위의 수식은 모든 파라미터에 대해 적용된다.

  • 참고: 경사 하강법에 대한 보다 직관적인 이해를 위해 cs231n 의 문서를 보는 것을 추천한다.

 

역전파법(Backpropagation)

  • 입력층에서 출력층 방향으로 입력값과 가중치(=파라미터)를 곱해서 다음 층으로 전달하는 과정(즉, 손실 함수를 계산하는 과정)을 feed-forward 라고 한다. 그리고 오차를 계산하여 가중치를 갱시하는 과정을 역전파법(backpropagation)이라고 한다.

  • 경사 하강법이 파라미터를 조정하는 과정은 크게 두 단계를 반복한다.

    1. 연쇄 법칙으로 미분을 계산한다.

    2. 파라미터에서 미분 * 알파를 빼서 갱신한다.

  • 연쇄 법칙은 복잡한 함수의 미분을 쉽게 계산하게 해주지만 파라미터가 많을 수록 연산량이 많아지는 단점이 있다. 그러나 수식으로 살펴보면 다음과 같이 중복되는 연산이 많다는 것을 알 수 있다. 예를 들어, 복합 함수 h(g(f(x,y))) 를 x와 y에 대해 편미분 했을 때 아래의 밑줄 친 부분이 겹친다. 다시 말해, 파라미터가 많고, 함수가 복잡할수록 미분을 계산할 때 많은 연산이 중복된다.

dh / dx = (dh / dg) * (dg / dx) = (dh / dg) * (dg / df) * (df / dx)

dh / dy = (dh / dg) * (dg / dy) = (dh / dg) * (dg / df) * (df / dy)

  • 파라미터에 z가 추가되어 똑같이 겹치는 부분이 생겼을 것이다. 따라서 실제로 구현할 때는 중복 연산을 피하기 위해 동적 계획법(Dynamic Programming)을 활용한다.

  • 프로그램 관점에서 각 노드의 연산은 다음과 같이 수행된다.

    • Upstream gradient: 다음 레이어의 노드에서 이미 계산된 미분으로 현재 레이어의 노드의 입력으로 들어온다.

    • Local gradient: 현재 노드의 함수를 들어오는 간선의 가중치에 대해 각각 편미분한 결과이다.

    • Downstream gradient: 위의 두 미분을 곱한 결과이며, 이전 레이어의 노드로 각 결과를 보낸다.

[ 노드에서 역전파법이 수행되는 모습 ]

  • 신경망을 큰 그림에서 살펴보면 연산이 수행되는 순서는 다음과 같을 것이다. 출력층에서 입력층 방향으로 간선들이 빛나는데 모두 각 노드의 미분(gradient)을 계산하여 이전 레이어와 연결된 간선의 가중치를 갱신하는 과정이다. 아래의 예시는 이미지 분류이다.

출처: https://gfycat.com/discover/backpropagation-gifs

  • 신경망에서는 위 예시처럼 현재 레이어의 노드와 연결된 다음 레이어의 노드가 하나가 아닌 여러개인 경우가 많다. 그런 경우에 upstream gradient는 모두 합해서 local gradient 와 곱한 뒤 이전 레이어로 전달된다. 더해지는 이유는 cs231n 문서를 찾아보면 알겠지만 다변수 연쇄 법칙을 따른 것이다.

[ 신경망 ]

  • 위와 같은 신경망을 가정해보면 노드 간의 연산은 다음의 수식으로 설명된다.

    • x_k 입력값(=열 벡터)

    • W_kj 레이어 k와 i를 연결하는 간선의 가중치(=행렬)

    • net_i = W_kj * x_k (=행렬 곱)

    • f() 활성화 함수

    • O_i = f(net_i) = 레이어 j의 입력값(=열 벡터)

    • W_ij 레이어 i와 j를 연결하는 간선의 가중치(=행렬)

    • net_j = W_ij * O_i (=행렬 곱)

    • O_j = f(net_j) = 손실 함수의 입력값(=열 벡터)

    • E = loss(O_j)

    • 각 결과를 미분해보면 E를 W_ki에 대해 미분한 결과를 다음과 같은 수식으로 구할 수 있다.

[ 신경망의 역전파법 수식 ]
[ 수식의 각 항과 매칭되는 미분 ]

  • upstream 의 노드가 여러개인 경우는 다음과 같이 정리된다.

    • 빨간색 delta_i 와 delta_j 는 캐싱되는 부분이다.

  • 다음은 역전파법을 C++로 작성한 코드의 일부이다. 참고로 동적 계획법으로 구현하는 과정에서 캐싱되어야 하는 부분은 upstream gradient를 계산하는 부분이다. 중첩 for문에서는 upstream gradient 가 이미 계산되었다고 가정하고 현재 노드의 local gradient 를 먼저 곱한다.

void Classifier::update_weights()
{
    _delta[_layer_count-1][0] = _derivative[_layer_count-1][0]; // dE/dO
    for (int l=_layer_count-1; l>0; l--)
    {
        int order = (l == 1) ? _input_order : 0;
        int node_cnt_in_curr_layer = _node_count[l];
        int node_cnt_in_input_layer = _node_count[l-1];
        for (int i=0; i<node_cnt_in_curr_layer; i++)
        {
            _delta[l][i] *= _derivative[l-1][i];     // local gradient 곱하기
            for (int j=0; j<node_cnt_in_input_layer; j++)
            {
                // 각 입력 노드로 upstream gradient 계산해서 저장 (output node 개수만큼 더해짐)
                _delta[l-1][j] += _delta[l][i] * _weight[l-1][i][j];
                double delta_w = -_learning_rate * _delta[l][i] * _input[l-1][j][order];
                _weight[l-1][i][j] += delta_w;
            }
        }
    }
}

 

분류기(Classifier)

  • 학습 데이터셋(Training Set)이 주어졌을 때, 데이터를 클래스(class) 별로 적절히 분류(classification)하는 것

  • 분류가 잘 되는 함수를 찾으면, 이후 그 함수를 활용하거나 새로운 데이터가 추가될 경우 (또 다시?) 많은 실험을 거듭하여 함수를 갱신해준다.

  • 함수를 찾는다는 것은 예를 들어 y = f(x) = ax + b 라고 했을 때 a와 b(=매개변수=Parameter)를 찾는 것을 의미한다.

  • y = f(x) 에서 x는 데이터의 feature 또는 variable 이라고 표현이 되는데 대부분 데이터의 전처리(preprocessing) 과정에서 추출된다. 실세계의 데이터를 가공하지 않고 넣는 경우는 거의 없다. feature 마다 매개변수는 다르기 때문에 예시에서는 2개이지만 매개변수는 100개가 넘을 수도 있다. 참고로 b는 bias 라고 편향치를 나타내는 상수값인데 없는 경우가 많다. 아무튼 신경망은 이렇게 많은 매개변수를 찾는데 최적화되어 있다.

  • 보통 학습 데이터가 주어질 때 입력으로 들어가는 값을 feature values (예: 크기, 강도, 색, 위치 등) 라고 하고, 출력으로 주어져야하는 값은 different classes (예: 종류, 글자, 단어, 이미지 등)라고 한다.

 

신경망의 구조

  • 컴퓨터 과학에서 신경망은 레이어(Layer)노드(Node) 그리고 가중치(Weight)라는 것으로 설명이 되는데, 노드는 뉴런(Neuron)이라고도 불린다. 참고로 위키피디아에 따르면 인공 신경망의 구조는 실제 인간의 중추 신경계를 많이 참고하여 설계되었다고 한다.

  • 레이어는 여러 노드로 이루어져 있고, 신경망은 여러 레이어로 이루어져 있다. 레이어는 배치된 위치에 따라 다음과 같이 3가지로 나뉜다.

    • 입력층(Input Layer): 데이터를 입력으로 받는 부분으로, 연산을 수행하지 않는다.

    • 은닉층(Hidden Layer): 복잡한 계산을 수행하는 부분으로, 모든 노드는 연산을 수행하는 함수이다.

    • 출력층(Output Layer): 계산 결과를 내보내는 부분으로, 마찬가지로 모든 노드는 연산을 수행한다.

  • 인접한 두 레이어는 간선(edge)으로 연결되는데, 간선의 정점은 두 레이어의 각 노드이며, 같은 레이어의 노드끼리는 연결되지 않는다. 즉, 무수히 많은 간선이 존재하는 것이다. 가중치(Weight)는 간선에 부여되는 값으로 신경망에서는 정보를 기억 또는 학습하는 역할로 설명된다. 가중치는 값이 클수록 해당 입력이 중요하다는 것을 의미한다.

  • 원하는 결과를 내는(정답을 잘 찾는) 가중치를 찾는 것이 이전에 설명했던 신경망을 이용해서 함수(=매개변수)를 찾는 것과 상동한다.

  • 레이어끼리 연산하는 과정: 출력층을 제외한 모든 레이어는 바로 다음 레이어의 입력층에 해당되며, 그 이유는 이전 레이어의 연산 결과(노드의 값)를 가중치(간선의 값)와 곱해서 현재 노드의 출력으로 보내면 다음 레이어의 각 노드의 입력으로 들어가기 때문이다. 이 과정을 쉽고 빠르게 하기 위해 내적(Dot Product) 연산을 수행한다.

출처: https://ko.wikipedia.org/wiki/인공_신경망

 

활성화 함수(Activation Function)

  • 두 레이어간의 연산은 이전 레이어의 각 노드의 출력값(혹은 입력층의 노드 값)과 현재 레이어의 각 노드로 연결된 간선의 가중치를 곱해서 다음 레이어의 노드에 입력으로 내보내는 과정이다. 현재 레이어의 각 노드의 출력 결과를 구할 때 함수가 사용되는데, 그 함수를 활성화 함수(Activation Function)이라고 한다.

    • 함수가 사용되는 이유는 퍼셉트론의 개념을 알아야 한다. 퍼셉트론(Perceptron)은 초기 인공 신경망의 모델로, 다수의 입력으로부터 하나의 결과를 내보내는 알고리즘이다. 처음에는 은닉층이 1개(단층 퍼셉트론)였으나 입력의 개수가 많아짐에 따라 은닉층을 늘려서 다층 퍼셉트론(Multi-Layer Perceptron)이라고도 부른다.

    • 퍼셉트론에 대한 자세한 이론은 여기를 참고

  • 활성화 함수는 단순히 임계값을 넘으면 1, 아니면 0을 출력하는 계단 함수(step function) 부터 복잡한 비선형 함수까지 종류가 다양하다. 이름의 의미는 어떤 임계값을 넘으면 활성화를 시킨다는 뜻에서 지어진거라고 한다.

  • 레이어 마다 활성화 함수가 다를 수 있으나, 같은 레이어 내의 각 노드는 동일한 활성화 함수를 사용하며, 보통 은닉층에서는 비선형 함수가 많이 사용되고 출력층에서 최종 계산 결과로 class 를 분류할 때 선형 함수를 사용하기도 한다.

  • 비선형 함수를 쓰는 이유는 레이어가 둘 이상일 때 선형 함수를 쓰면 단일 계층의 효과가 나기 때문이다. 즉, 선형 함수로는 은닉층을 여러개 추가하더라도 은닉층이 1개일 때 가중치의 배수인 단층 퍼셉트론과 차이가 없다.

  • 활성화 함수의 종류

    • Sigmoid function: 입력값을 0과 1사이의 값으로 조정하여 반환하는 함수로, 그래프 상에서 S자 모양을 보인다. 주로 이진 분류(Binary Classification) 문제를 해결하기 위해 출력층에서 사용된다.

    • ReLU function: Rectified Linear Unit 의 약자이다. 입력값이 0보다 작을 경우 0을 반환(흔히 음수를 cutting 한다고 한다)하고 0보다 클 경우 입력값을 그대로 반환한다. 이미지 인식 분야에서 은닉층에서 많이 사용되는 함수로, 음수를 버릴 때(흔히 cutting 이라고 표현함) 사용한다.

    • Leaky ReLU function: 음수일 때 값을 버리지 않고 약간의 기울기를 곱한 결과를 반환하는 함수로, 은닉층에서 역전파 과정에서 미분할 때 기울기가 0이어서 발생하는 문제점들을 보완하기 위해 사용된다. 기본적으로 기울기가 0인 함수는 사용하지 않는 것이 좋은데 그 이유는 미분할 때 기울기가 소실되는 문제가 발생하면 학습이 제대로 이루어지지 않기 때문이다.

    • ELU function: Exponential Linear Unit 의 약자로, Leaky ReLU 와 모양이 거의 똑같은데 음수 부분이 지수 함수로 생겼다는 점이 다르다. 음수값이 커지는 부분에 영향을 덜 받도록 개선했다. 마찬가지로 ReLU 의 문제를 보완하기 위해 사용된다.

    • Tahn function: 입력값을 -1과 1사이의 값으로 조정하여 반환하는 함수로, 시그모이드 함수처럼 그래프 상에서 S자 모양을 보인다. 은닉층에서 종종 사용되는 함수로, 자연어 처리 분야에서 시그모이드 함수와 함께 주로 사용된다.

    • Maxout function: 입력으로 들어오는 값들 중 최댓값을 반환하는 함수이다. 은닉층이 둘 이상일 때 많이 사용되며, ReLU 와 Leaky ReLU 의 합친 것으로 보면 된다. 단점은 단일 뉴런에 대해 파라미터의 수가 2배로 증가한다는 것이다. 성능은 ReLU와 함께 가장 높게 나온다.

    • Softmax function: 3개 이상의 정답을 가지는 multi-class 데이터셋을 분류(=다중 분류)할 때 사용하는 함수이다. N개의 feature가 있을 때 softmax의 입력은 각 원소가 데이터값인 N차원의 벡터를 가정하며, 클래스의 개수가 K일 때 softmax의 출력값은 K차원의 벡터가 된다. 출력값의 각 원소는 주어진 입력이 각각의 클래스일 확률을 나타낸다. softmax는 각 클래스별로 이진 분류(로지스틱 회귀의 결과)한 결과를 원소로 가진다. 예를 들어, i번째 클래스에 대해 이진 분류할 때 i번째 클래스만 1이고 나머지 클래스에 대해 정답이 0인 것으로 간주하는 방식이다. 출력 벡터의 원소의 합은 1이라는 특징을 가집니다. K차원의 벡터를 출력하기 위해 입력값에 가중치를 곱할 때 K x N 차원의 가중치 행렬에 입력 벡터를 곱하게 됩니다.

[ Softmax function ]

 

손실 함수(Loss Function)

  • 실측값(정답)과 예측값(출력층의 결과)의 차이를 수치화해주는 함수로, 비용 함수(cost function) 또는 목적 함수(objective function) 또는 오차 함수(error function)이라고도 한다.

    • 출력층에서 결과가 나왔다고 끝이 아니라, 손실 함수로 한 번 더 계산을 해주어야 한다.

  • 함수의 결과가 큰 값일수록 오차가 큰 것이며 작은 값일수록 오차가 작은 것이다.

  • 회귀(Regression)에서는 평균 제곱 오차(Mean Squared Error, MSE)가 쓰이고, 분류(Classification)에서는 크로스 엔트로피(Cross-Entropy)가 쓰인다.

    • 회귀(Regression)는 연속적인(continous) 값을 가진 결과를 예측하는 방법으로, 예를 들면 부동산 평수에 따른 집값 가격(연속된 숫자)을 예측하는 것(선형 회귀)이 있다. 만약 부동산 평수 외에 다른 변수가 추가되면 다항 회귀가 된다.

    • 분류(Classification)는 불연속적인(discrete) 값을 가진 결과를 예측하는 방법으로, 예를 들면 종양 크기에 따른 악성과 양성의 유무를 예측하는 것(이진 분류)이 있다. 만약 변수가 종양 크기말고 나이, 사는 장소, 종양의 색상(????) 등이 있으면 다중 분류가 된다.

  • 손실 함수의 값을 최소화하는 매개변수(=가중치=Weight)를 찾는 것이 신경망의 학습(learning)이라고 한다.

  • Mean Squared Error

[ Y는 실측값, Y hat은 예측값 ]

  • 이진 분류(Binary Classification): 예측값과 실측값은 모두 0(=false) 또는 1(=true)인 경우이다. 먼저, 가능도 함수(Likelihood)라는 것을 이해할 필요가 있는데, 이 함수는 관측 데이터에 대해 확률 분포의 파라미터가 얼마나 일관되는지를 나타낸다. 신경망에 대입시켜보면 관측 데이터는 학습 데이터(training set)이고 파라미터는 가중치(weight)가 될 것이다. 이진 분류에서는 베르누이 분포에 대한 가능도 함수를 이용해서 Binary Cross-Entropy 라는 것을 도출하는데 최종적으로 최소화해야 하는 수식은 다음과 같다. (개인적으로 링크를 꼭 읽어봐야 한다. 정리가 정말 잘되어 있다.)

    • 베르누이 분포는 확률의 곱이기 때문에 underflow(0으로 수렴하는) 문제가 발생할 수 있어서 가능도 함수에 log를 취한뒤 합한다. 가능도 함수는 일관되는 정도이므로 값을 최대화할 필요가 있는데, 이를 최대 우도 함수라고 한다. 그러나 최대 우도 함수를 비용 함수로 써버리면 반대로 최소화하는 상황이 되어버려 본래의 목적에 어긋난다. 따라서 -1을 곱하여 비용 목적의 함수로 사용한다.

    • 수식에 설명을 덧붙이자면 d는 실측값이고, y(x, w)는 예측값이다.

[ Binary Cross-Entropy ]

  • 다중 분류(Multinomial Classification): 출력층에서 softmax 의 반환 결과(=입력에 대한 확률값)에 각 원소에 대한 binary cross-entropy를 모두 더한 결과를 최소화한다. 이에 대한 수식은 다음과 같다.

    • 마찬가지로 d는 실측값이고 y(x, w)는 예측값이다.

    • K는 클래스의 개수, N은 데이터의 개수이다.

[ Cross-Entropy ]
[ 다중 분류의 도식화 ]

  • REMIND: 출력층의 활성화 함수와 비용 함수는 다른 것이며, 문제의 유형에 따라 조합되는 목록은 다음과 같다.

[ 손실 함수 ]
[ 출력층의 활성화 함수와 손실 함수 ]

 

+ Recent posts