loading

cs231n 내용 요약 (7) - Regularization, Loss function


Lecture summary

Published on November 08, 2022 by JunYoung

AI Deep learning cs231n

13 min READ

들어가며…

바로 이전 게시글에서 batch normalization에 대한 개념과 해당 요소를 실제 딥러닝에서 어떻게 연산하는지 코드를 통해 확인해보았다. 이번 게시글에서는 batch normalization과 같이 정규화 역할을 하지만, layer 사이의 covariance shift를 줄이기 위한 목적보다는 overfitting을 방지하기 위한 목적으로 사용되는 여러 regularization term에 대해 알아보고, 딥러닝에서 다루는 supervised learning task 중 가장 대표적인 classificationregression에 대한 loss function에 대해서 알아보도록 하자.
사실 대부분의 내용은 이전 게시글을 잘 살펴보면 이미 언급한 내용이긴 하지만, 대부분 perceptron이나 linear classifier 등등 설명하면서 보조적으로 곁들인 경우가 많아서 이렇게 따로 다루고자 한다.


Regularization

Regularization이라는 단어가 가지는 딥러닝에서의 의미를 보기 전에 일반적 의미에 집중하면 다음과 같다. 수학에서나, 통계학, 경제학 그리고 컴퓨터 과학에서의 정규화는 얻고자 하는 정답이 ‘단순‘하고자 할 때 사용한다.

Regularization이 사용되는 방법은 크게 두가지로 구분할 수 있는데, 각각을 살펴보면 다음과 같다.

  • Explicit Regularization이란, optimization 과정에서 explicit term을 더해주는 것이다. Prior, penalty 혹은 constraints가 될 수 있다. 흔히 regularization term이나 penalty term은 optimization function에 cost를 주어 optimal solution을 unique하게 만들어준다.

  • Implicit Regularization이란 explicit regularization을 제외한 모든 형태의 regularization을 의미한다. Early stopping(학습 도중 적당히 fitting되었다면 멈추는 것)이나 robust loss function을 사용하는 등의 방법이 될 수 있다.

이러한 여러 방법들 중 오늘 살펴볼 $L_1$, $L_2$ regularization은 explicit한 constraints로 적용되는 경우가 많으며(weight decay라는 property로 조절된다), 네트워크 구조상 regularization으로 사용되는 dropout과 같은 방법은 implicit regularization에 해당된다.
앞서 Linear classifier에 대한 게시글에서도 살펴보았듯, 특정 $W$가 SVM loss를 최적화할 수 있다면 $1$보다 큰 모든 $\alpha$에 대해 $\alpha W$ 또한 같은 조건을 만족하기 때문에 non-unique solution 문제가 발생하고 이로 인해 학습 속도가 저하되거나 수렴하지 못하는 문제가 발생한다고 했었다. SVM loss와는 다르게 softmax와 관련된 task에서 해석했던 내용은 $W$가 커지면 커질수록 각 노드별 output value의 차이가 벌어지게 되고, 이로 인해 복잡한 함수에 수렴하는 neural network가 overfitting될 수 있다고 했다. 그렇기 때문에 결국 weight parameter $W$를 너무 커지지 않도록 조절하는 것이 explicit regularization의 한 방법이 될 수 있고, 이러한 방법들 중 일부를 소개하면 다음과 같다.

L2 regularization

가장 일반적인 형태의 regularization이다. 모든 parameter value의 squared magnitude를 penalize함으로써, 최소화하는 loss term에 더해주어 weight parameter 또한 줄일 수 있게 해주는 방법이다. 딥러닝 네트워크는 여러 layer와 각 layer를 구성하는 parameter로 연결되어있는데, 이에 대한 regularization term은 loss weight $\lambda$에 대해 다음과 같이 정의할 수 있다.

[ \frac{1}{2} \vert \lambda W \vert^2
]

Loss term의 앞부분에 $1/2$이 곱해진 이유는 gradient를 구했을 때 weight에 2가 곱해져서 실제로는 $2 \times \lambda$ 만큼의 weight가 최적에 관여하기 때문이다. 해당 term이 포함된 loss function은 다음과 같이 표현할 수 있다.

[ \text{Cost} = \frac{1}{n} \sum_{i=1}^n L(y_i, \hat{y_i}) + \frac{\lambda}{2} \vert W \vert^2
]

L2 regularization을 사용하는 regression model을 ridge regression model이라고 부른다. L2 penalize는 직관적으로 보게 되면 peaky한 값들에 더 많은 페널티를 부여한다. 그래서 뒤에 추가로 설명하게 될 L1 regularization보다 이상치에 대한 용인성이 낮다는 특징이 있다. Weight decay, regularization은 training dataset에 지나치게 적응된 weight가 학습되는 것을 방지하는 효과가 생긴다. 예컨데 weight의 특정 node의 값이 지나치게 커져야만 training dataset에 대한 성능을 높일 수 있다면, regularization term 없이는 결국 해당 parameter가 지나치게 커지는 양상을 보이게 된다. 이런 문제는 모든 위치의 parameter에 동일한 양상을 보이며, 결국 학습이 완료된 후 parameter는 앞서 본 것과 같이 complexity가 높은 polynomial을 그리게 된다. 일반화의 성능을 높이기 위해서는 training dataset에 대한 overfitting이 아닌, training dataset이 포함된 전체 분포에 대한 정보를 학습해야하기 때문에 정규화를 진행하는 것이 중요하다.

L1 regularization

위에서는 L2 norm을 사용한 L2 regularization이었고, 이번엔 L1 norm을 사용한 L1 regularization에 대해서 살펴보도록 하자.

[ \text{Cost} = \frac{1}{n} \sum_{i=1}^n L(y_i, \hat{y_i}) + \lambda \vert W \vert ]

L1 regularization을 사용하는 regression model을 Lasso regression model이라고 부른다. L1 penalize는 앞서 보았던 L2 regularization보다는 이상치에 대해서 더 큰 페널티를 부여하지 않기 때문에, 용인성이 보다 크다고 할 수 있다. 만약 특정 modality를 학습하는 과정에서 이상치에 대한 정보를 유지하면서 학습하고 싶다면 L1 regularization 방법이 좋을 것이고, 그게 아니라 평균적인 weight를 만들고 싶다면 L2 regularization 방법이 더 좋을 것이다.

두 개의 vector가 있다고 생각해보고, 각각의 L1 norm과 L2 norm에 대해 구하면 다음과 같다.

[ \begin{aligned} v_1 = (0.5,~-0.5,~0) \newline v_2 = (0.3,~0.3,~-0.4) \newline \vert\vert v_1 \vert\vert_1 = \vert\vert v_2\vert\vert_1 = 1 \newline \vert\vert v_1 \vert\vert_2 = \sqrt{0.5} \newline \vert\vert v_2 \vert\vert_2 = \sqrt{0.34} \end{aligned}
]

여기서 알 수 있는 내용은 L1 regularization의 경우 서로 다른 weight parameter에 대해서도 동일한 값을 가질 수 있지만, L2 regularization의 경우 weight parameter가 달라지게 되면 무조건 다른 값을 가지게 되고, L2 norm의 기준은 sparse한 parameter일수록 더 큰 값을 가진다는 것이다. 따라서 weight parameter를 기준으로 생각했을때 모델을 sparse하게 구성하고 싶다면 L1 regularization을 사용하고, dense하게 구성하고 싶다면 L2 regularization을 사용하는 것이 일반적이다.

Elastic network regularization

물론 L2와 L1 loss를 동시에 사용하는 경우도 있는데, 이를 Elastic network regularization이라고 부르고 다음과 같이 사용한다.

[ \text{Cost} = \frac{1}{n} \sum_{i=1}^n L(y_i, \hat{y_i}) + \lambda_1 \vert W \vert^2 + \lambda_2 \vert W \vert ]

Max norm constraints

Infinity norm을 정의하는 방식도 있다. 다만 infinity norm의 경우 norm의 정의에 따라 weight parameter의 최댓값으로 정의되는데, 이를 통해 weight parameter가 가질 수 있는 최댓값을 제한하는 형태의 loss가 된다.

[ \text{Cost} = \frac{1}{n} \sum_{i=1}^n L(y_i, \hat{y_i}) + \lambda \max(W) ]

Dropout

지금까지 언급했던 내용은 object/cost function에 추가로 줄 수 있는 penalty term, regularization term에 대한 내용이었으며 모두 explicit한 loss term을 더해주는 방식을 사용했다. 그러나 정규화 방법에는 직접 최적화에 사용될 object function을 정의하는 방식이 아닌 학습법에 대한 내용인 implicit regularization이 있고, 여러 방법들 중 고전적이고 가장 유명한 방법인 dropout에 대해서 살펴보도록 하자.
기존 neural network가 overfitting되는 문제는 deep neural network의 representation power가 크고, 이에 따라 신경망 구조가 묘사할 수 있는 functional complexity가 높아진다는 점이었다. 실생활의 여러 task를 해결하기 위해서 neural network의 representational power가 증가하는 것은 어쩌면 당연하지만, 오히려 증가한 표현력 때문에 training data에 대해 과적합이 발생할 수 있다는 문제는 이전 게시글에서도 다뤘던 내용이었다.
그렇기 때문에 neural network의 모든 노드를 학습 과정에서 update하지 않고, 일부 노드만 update함으로써 간접적으로 network의 구조를 단순화시키는 방법이 제시되었다. 바로 이 방법이 학습 과정에서 특정 확률($p$)에 따라 일부 노드를 turn off하는 drop-out 방식이며, 이름을 보면 알 수 있듯이 네트워크 학습 시 특정 노드를 버리는 듯한 효과를 보여준다.

좌측의 그림을 보게 되면 일반적인 neural network(multilayer perceptron)의 경우 모든 노드가 엣지로 연결되어, output 연산을 할 때 네트워크 전체가 관여하는 한편 우측의 그림은 일부 노드를 turn off 함으로써 학습 과정에서 네트워크 전체가 관여하지 않고 일부 노드만 학습되게끔 한다.
여기서 중요한 점은 ‘학습 과정에서만’ 해당 regularization이 적용된다는 것인데, 예를 들어 batch normalization과 같은 regularization에서도 training, inference 시에 해당 layer가 작동하는 방식이 달랐던 것을 기억해보면 이해하기 쉽다. 결국 overfitting을 방지하기 위한 layer modification 작업이기 때문에 training 단계에서는 랜덤한 node 추출(stochastic)을 통해 네트워크 구조를 단순화시킬 필요가 있지만, 학습이 완료된 후 parameter가 고정된 후에는 굳이 네트워크 구조를 단순화시킬 필요가 없기 때문이다.


Loss function

위에서 다룬 내용은 regularization 방법이었다. Model의 complexity를 직접 조절하거나 loss term을 추가해주는 방식을 줌으로써 training dataset에 과적합되지 않고 generalization 효과를 높여주는 수단으로 해석할 수 있었다.
특히 explicit regularization 방법으로 제시된 $L_1,~L_2$ loss 혹은 Max norm 방식은 기존 task에 맞는 data loss에 더해지는 형태로 보여지는데, 여기서 regression이나 classification과 같이 task에 맞는 loss function의 구체적인 형태를 정의하지 않고 단순히 data loss를 $\frac{1}{n} \sum_{i=1}^n L(y_i, \hat{y_i})$로 표현했었다. 여기서 $n$이 의미하는 것은 training data의 갯수를 의미하고, 만약 batch 단위로 학습이 된다면 각 batch를 구성하는 sample 수를 의미한다.
따라서 이번에는 실제로 위에서 표현한 loss term이 어떻게 표현될 수 있는지 간단하게 소개하도록 하겠다. 수식 전개를 위해 layer weights $W_k$에 의한 Neural network $f$를 각 input sample $x_i$에 대해 합성함수 꼴인

[ \begin{aligned} f(x_i; W_k),~(i =& 1,~2,~\cdots,~n\text{ and }k = 1,~2,~\cdots,~l) \newline \text{Let }&k^{th}\text{ perceptron’s function as } f_k(\cdot,~W_k), \newline \newline f(x_i; W_k) =& f_l \circ f_{l-1} \circ \cdots \circ f_1(x_i; W_1) \end{aligned}
]

처럼 표현 가능하다. 위의 notation을 기억한 채로 다음 파트의 수식을 이해하면 된다.

Classification task

Classification은 앞서 linear classifier 글에서도 주로 소개했던 대표적인 task이며 computer vision이나 NLP를 통틀어 deep learning의 가장 기본이 되는 task이기 때문에 따로 설명을 하지는 않겠다. 어떠한 modality를 지닌 dataset이 있고, dataset sample 각각은 사전에 정의된 distribution에 따라 매칭되는 label이 있다. Classification loss는 SVM(Support Vector Machine), Softmax가 있는데 이 중에서 SVM이라는 cost function에 대해 먼저 살펴보면,

[ L_i = \sum_{j \neq y_i} \max \left( 0, f_j - f_{y_i} + 1 \right) ]

score margin($\Delta$)가 $1$인 SVM에 대해 위와 같이 표현 가능하다. Hinge loss는 구조상 margin이 되는 기준점에서 미분이 불가능하기 때문에 squared hinge loss를 사용하는 경우도 있다.

[ L_i = \sum_{j \neq y_i} \max \left( 0, f_j - f_{y_i} + 1 \right)^2
]

물론 위와 같이 사용하게 되면 제곱으로 penalty가 들어가기 때문에 SVM loss를 사용했을 때와 결과는 달라지지만, 특정 task에서는 squared hinge loss를 사용하는 것이 성능 향상에 더 효과적이었다는 경우도 존재한다.
Score function $f$의 output을 토대로 hinge loss를 사용하는 SVM 방식 대신, softmax probability를 사용(normalized probability)하여 확률 분포 개념으로 접근한 softmax classifier도 있다.

[ L_i = -\log \left( \frac{e^{f_{y_i}}}{\sum_{j} e^{f_j}} \right)
]

Classification 문제는 보통 class의 개수가 합리적일 때 사용하는 것이 좋다. 그러나 NLP task와 같이 단어 수가 절대적으로 많이 필요한 경우(English dictionary)에는 전체 softmax를 계산하는 과정에서 정답이 되는 class가 제외하고 나머지 class가 distracting factor(방해 요소)로 작용하며, 단순히 성능을 제외하고 보아도 연산 과정이 많은 cost를 차지>하게 된다.
이러한 문제들을 직면한 몇 가지의 task에서 조금 다르게 변형한 classification loss도 존재한다. NLP task에서 제안된 hierarchical softmax는 단어를 하나의 tree로 구성하게 된다(참고 링크). 그렇게 되면 각 label은 tree를 따라가는 하나의 path로 대표될 수 있고, softmax classifier는 모든 label에 대해 동일한 softmax로 학습되는 형태가 아니라 left/right branch를 구분하는 식으로 학습되게 된다. 만약 전체 label에 대해 연산을 진행한다면 word 갯수 $W$ 만큼의 softmax 연산을 진행해야하지만, 이와 같은 메커니즘으로는 좌/우 중 하나의 branch만 선택하면 되므로 $\log_2(W)$의 연산만 진행할 수 있다.
Hierarchical softmax에 대해 조금 더 자세히 살펴보면 다음과 같다. 만약 $n(w,~j)$가 root로부터 $w$까지의 path를 구성하는 node 중에서 $j$번째 노드를 의미하며, $L(w)$는 이 path의 길이를 의미한다고 생각해보자. 따라서 $n(w,~1) = \text{root}$이며 $n(w,~L(w)) = w$이다. 내부의 임의의 노드 $n$에 대해서 $\text{ch}(n)$은 노드 $n$에 대한 fixed child를 의미하며 $\left< x \right>$는 $x$가 참이라면 $1$, 거짓이라면 $-1$의 값을 내보낸다고 생각하자. Hierarchical softmax $p(w_O \vert w_I)$은 다음과 같이 정의된다.

[ p(w \vert w_I) = \prod_{j = 1}^{L(w) - 1} \sigma \left(~\left< n(w,j+1) = \text{ch} (n(w, j)) \right>~ \cdot {v_{n(w, j)}^\prime}^\top v_{w_I} \right) ]

Loss term을 보면 알 수 있듯이, 각 word는 path를 따라서 child node에 대한 softmax($\sigma$)만 연산하는 것을 알 수 있다.

Attribute classification

위에서 언급한 SVM, Softmax loss 모두 각 dataset $x_i$에 대해 하나의 correct answer $y_i$가 존재한다고 가정한다. 그러나 만약 class가 아니라 $y_i$가 각 attribute의 유/무를 표현하는 binary vector이고, 각 attribute가 exclusive(one-hot encoding처럼 오직 하나만 1이고 나머지는 0)인 경우가 아니라면 어떻게 해야할까? 예를 들어 인스타그램에 있는 이미지는 방대한 해시태그 중 몇몇의 hashtag로 라벨링될 수 있다. 그렇다면 각 이미지는 여러 해시태그로 mapping될 수 있다. 간단한 접근법으로는 각 attribute에 대해 binary classifier를 설계하는 것이다.

[ L_i = \sum_j \max (0, 1-y_{ij} f_j)
]

모든 attribute 카테고리 $j$에 대한 binary classifier loss를 더한 것과 같다. $y_{ij}$는 $i$번째 샘플이 $j$번째 attribute를 가지고 있다면 $+1$, 그렇지 않다면 $-1$의 값이 된다. $f_j$는 $j$번째 attribute에 대한 score가 될 것이고, 만약 잘못 예측된다면(실제 y_{ij}와 다른 부호를 가지게 되는 것) loss가 축적되는 형태가 된다.
위에서 언급한 loss는 hinge loss였고, 다르게 풀어볼 수 있는 것은 binary classifier로 logistic regression classifier를 사용하는 것이다. Binary logistic regression classifier는 binary class 값으로 $0$과 $1$을 가지게 되고, class $1$에 대한 probability는 다음과 같이 구할 수 있다.

[ P(y = 1 \vert x;~w,b) = \frac{1}{1 + e^{-(w^\top x + b)}} = \sigma (w^\top x + b)
]

Class $0$인 확률은 반대로 $1$에서 뺀 것과 같다. 따라서 해당 구조에서의 class $1$로 분류될 threshold는 $0.5$라고 할 수 있으며, 이는 $\sigma(w^\top x + b) > 0.5$이며 $w^\top x +b > 0$라고 해석할 수도 있다.

[ L_i = -\sum_j y_{ij} \log (\sigma (f_j)) + (1 - y_{ij}) \log (1 - \sigma (f_j))
]

결국 $y_ij$는 $0$ 혹은 $1$ 중 하나의 값을 가지게 되고 sigmoid function은 $\sigma$로 하여금 probability를 최대화하는 방향으로 학습하게 된다. 이를 negative log likelihood 관점에서의 binary cross entropy로 풀어쓴 식이 위와 같으며 attribute output $f_j$에 대한 gradient는 매우 간단하게 표현할 수 있다.

[ \partial L_i / \partial f_j = \sigma (f_j) - y_{ij} ]

Regression task

위에서 살펴본 classification과는 다르게 regression은 real-value 값을 추정하는 문제이다. 예를 들어 부동산에 올라온 매물의 특징(평수, 위치, 부대시설 등등)을 활용하여 시세(매매가)를 예측하는 문제거나, image 상에서 특정 object의 길이를 예측하는 문제가 이에 해당된다. Regression은 예시를 통해 확인할 수 있듯이 미리 정해진 class가 있거나 discrete한 attribute가 존재하지 않고 feature를 통해 연속적인 값을 예측하게 된다.
따라서 이 task에서는 네트워크가 예측한 값과 실제 값을 비교하는 metric을 사용하게 되고, 흔히 L2 squared norm이나 L1 norm 기반으로 차이를 연산한다.

[ L_i = \vert\vert f-y_i \vert\vert_2^2
]

L2 norm은 위의 식대로 계산되며, 제곱 term은 input에 대해 monotonic operation이므로($f - y_i$가 커질수록 증가함) optimal parameter를 변화시키지 않고 간단하게 연산이 가능하다는 장점이 있다. L1 norm의 경우에는 output 차이에 대한 연산식을 다음과 같이 적용한다.

[ L_i = \vert\vert f - y_i \vert\vert_1 = \sum_j \vert f_j - (y_i)j \vert
]

위와 같이 풀어쓴 이유는 gradient 연산이 L2와는 다르게 $f-y_i$의 값에 의존하지 않고 부호에 의존하기 때문이다. $j$는 norm 연산을 하는 dimension이라고 생각해보면 된다. $j$번째 dimension에 대해 sample $i$에 대한 prediction difference는 다음과 같이 표현할 수 있다.

[ f - y_i = (\delta_{i1},~\delta_{i2},~\cdots,~\delta_{ij})
]

각 input에 대한 local gradient는 앞서 설명했던 것과 같이 difference에 대한 부호와 관련된다.

[ \partial L_i / \partial f_j = sign(\delta_{ij}) ]

Regression 수렴이 어려운 이유

L2 loss나 L1 loss는 식에서 볼 수 있듯이 network의 output이 정확한 실수값을 예측해야하는 것을 알 수 있다. 그러나 softmax에서는 굳이 정확한 output을 내보내지 않더라도 probability도 normalize하는 과정을 통해 조정될 수 있기 때문에 최적화 관점에서는 optimal solution에 수렴할 수 있는 확률이 높다.
또한 L2 loss(MSE loss)의 경우에는 오차에 대해 민감하다는 단점이 있는데, 앞서 언급했던 L2 regularization의 특징과 같이 이상치에 대한 robustness가 떨어진다. 이런저런 문제들 때문에 regression task에서는 특정 범위 이내로 output을 안정화하기 어렵다.
만약 특정 영화 작품에 대해 대중들의 평가를 예측하는(별 1개부터 5개까지 예측하는) regression task를 생각해보자. 단순히 별 갯수를 regression으로 예측하는 것보다 5개의 class를 가진 classification task로 치환하여 풀게 되면, single output에 의한 supervision 뿐만 아니라 네트워크가 추출한 regression distribution을 함께 활용할 수 있다. 이는 각 class에 대한 confidence 지표로 사용될 수 있다는 장점이 있다.


마무리하며…

위에서 언급된 loss term 이외에도 graph나 tree와 같이 복잡한 구조를 예측하는 task들도 존재한다. 디테일한 부분까지 언급하게 되면 딥러닝 기본 개념에서 scope가 많이 벗어나게 되므로 최대한 관련된 부분까지만 언급하고 마무리하도록 하겠다. 이번에 알게된 것들은 regularization 방법이 있고, 해당 방법들을 활용하여 overfitting을 방지할 수 있다는 점과 동일한 task에도 다양한 형태의 loss function이 적용될 수 있다는 점이다.

A n o t h e r p o s t i n c a t e g o r y