[DL] 5.1. Model hyper-parameter: Weight initialization

2024. 2. 18. 13:45ML/DL

이전 글에서, "매개변수 초깃값에 따라 학습의 성공 여부가 좌우된다"고 이야기했다.

왜냐하면, 매개변수 초깃값에 따라 도달 위치(최솟값 or 극솟값)가 달라지기 때문이다.

물론 이 말고도 여러 이유가 존재한다.

 

그렇기 때문에, 이번 글에서는 매개변수 초깃값 설정에 대해 알아볼 것이다.

역전파의 분포 구하기!!!, n-rank에서 1-rank를 빼면 어떻게 되는지 고찰해보기!!!


그 전에 벡터-행렬 곱 연산의 결과값과 미분값에 대해 알아보자.

다시 말해, 벡터($\mathbf{x}$)와 행렬($\mathbf{W}$)이 주어졌을 때,

벡터-행렬 곱 연산 $\mathbf{W}\mathbf{x}$의 결과값($\mathbf{Y}$)과 미분값(${\partial \mathbf{Y} \over \partial {\mathbf{W}}}, {\partial \mathbf{Y} \over \partial \mathbf{x}}$)을 구해보자.

$$\mathbf{x}= \begin{bmatrix} x_1 \\ x_2 \\ x_3 \end{bmatrix}, \mathbf{W} = \begin{bmatrix} w_{11} & w_{12} & w_{13} \\ w_{21} & w_{22} & w_{23} \\ w_{31} & w_{32} & w_{33} \end{bmatrix}, \mathbf{Y} = \begin{bmatrix} y_1 \\ y_2 \\ y_3 \end{bmatrix}$$

$${\partial \mathbf{Y} \over \partial {\mathbf{W}}} = \begin{bmatrix} {\partial y_1 \over \partial w_{11}} & {\partial y_1 \over \partial w_{12}} & {\partial y_1 \over \partial w_{13}} & {\partial y_1 \over \partial w_{21}} & {\partial y_1 \over \partial w_{22}} & {\partial y_1 \over \partial w_{23}} & {\partial y_1 \over \partial w_{31}} & {\partial y_1 \over \partial w_{32}} & {\partial y_1 \over \partial w_{33}} \\ {\partial y_2 \over \partial w_{11}} & {\partial y_2 \over \partial w_{12}} & {\partial y_2 \over \partial w_{13}} & {\partial y_2 \over \partial w_{21}} & {\partial y_2 \over \partial w_{22}} & {\partial y_2 \over \partial w_{23}} & {\partial y_2 \over \partial w_{31}} & {\partial y_2 \over \partial w_{32}} & {\partial y_2 \over \partial w_{33}} \\ {\partial y_3 \over \partial w_{11}} & {\partial y_3 \over \partial w_{12}} & {\partial y_3 \over \partial w_{13}} & {\partial y_3 \over \partial w_{21}} & {\partial y_3 \over \partial w_{22}} & {\partial y_3 \over \partial w_{23}} & {\partial y_3 \over \partial w_{31}} & {\partial y_3 \over \partial w_{32}} & {\partial y_3 \over \partial w_{33}} \end{bmatrix}, {\partial \mathbf{Y} \over \partial \mathbf{x}} = \begin{bmatrix} {\partial y_1 \over \partial x_1} & {\partial y_1 \over \partial x_2} & {\partial y_1 \over \partial x_3} \\ {\partial y_2 \over \partial x_1} & {\partial y_2 \over \partial x_2} & {\partial y_2 \over \partial x_3} \\ {\partial y_3 \over \partial x_1} & {\partial y_3 \over \partial x_2} & {\partial y_3 \over \partial x_3} \end{bmatrix}$$

 

벡터-행렬 곱 연산을 수행하면 다음과 같은 결과가 나온다.

$$\begin{bmatrix} w_{11} & w_{12} & w_{13} \\ w_{21} & w_{22} & w_{23} \\ w_{31} & w_{32} & w_{33} \end{bmatrix} \begin{bmatrix}  x_1 \\ x_2 \\ x_3 \end{bmatrix} = x_1 \begin{bmatrix} w_{11} \\ w_{21} \\ w_{31} \end{bmatrix} + x_2 \begin{bmatrix} w_{12} \\ w_{22} \\ w_{32} \end{bmatrix} + x_3 \begin{bmatrix} w_{13} \\ w_{23} \\ w_{33} \end{bmatrix} = \begin{bmatrix} x_1(w_{11} + w_{12} + w_{13}) \\ x_2(w_{21} + w_{22} + w_{23}) \\ x_3(w_{31} + w_{32} + w_{33}) \end{bmatrix}$$

위 수식에서 볼 수 있듯이, 결과값은 방향마다 서로 다른 크기를 가지고 있다.


"행렬의 각 요소 변화에 따른 결과값 변화"(${\partial \mathbf{Y} \over \partial {\mathbf{W}}}$)는 벡터-행렬 곱 연산 과정을 자세히 살펴보면 충분히 추측할 수 있다.

1행1열에 있는 가중치($w_{11}$)는 결과값에 "x 방향에서 $x_1$크기" 만큼 영향을 준다.

1행2열에 있는 가중치($w_{12}$)는 결과값에 "x 방향에서 $x_2$크기" 만큼 영향을 준다.

1행3열에 있는 가중치($w_{13}$)는 결과값에 "x 방향에서 $x_3$크기" 만큼 영향을 준다.

2행1열에 있는 가중치($w_{21}$)는 결과값에 "y 방향에서 $x_1$크기" 만큼 영향을 준다.

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

$${\partial \mathbf{Y} \over \partial {\mathbf{W}}} = \begin{bmatrix} x_1 & x_2 & x_3 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & x_1 & x_2 & x_3 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & x_1 & x_2 & x_3 \end{bmatrix}$$

이처럼, 벡터-행렬 곱 연산에서 행렬의 각 요소는 결과값에 오직 한 방향으로만 영향을 준다.

그리고, 같은 행에 있는 모든 요소는 동일한 방향으로, 같은 열에 있는 모든 요소는 동일한 크기로 영향을 준다.


"벡터의 각 요소 변화에 따른 결과값 변화"(${\partial \mathbf{Y} \over \partial \mathbf{x}}$)도 벡터-행렬 곱 연산 과정을 자세히 살펴보면 충분히 추측할 수 있다.

$x_1$은 결과값에 "x, y, z 방향에서 각각 $w_{11}, w_{21}, w_{31}$ 크기"만큼 영항을 준다.

$x_2$은 결과값에 "x, y, z 방향에서 각각 $w_{12}, w_{22}, w_{32}$ 크기"만큼 영항을 준다.

$x_3$은 결과값에 "x, y, z 방향에서 각각 $w_{13}, w_{23}, w_{33}$ 크기"만큼 영항을 준다.

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

$${\partial \mathbf{Y} \over \partial \mathbf{x}} = \begin{bmatrix} w_{11} & w_{12} & w_{13} \\ w_{21} & w_{22} & w_{23} \\ w_{31} & w_{32} & w_{33} \end{bmatrix}$$


더 나아가, 손실값($L$)에 대한 $\mathbf{W}$의 미분값($\partial L \over \partial {\mathbf{W}}$)을 구해보자.

$$\text{if } {\partial L \over \partial {\mathbf{Y}}} = \begin{bmatrix} {\partial L \over \partial {y_1}} & {\partial L \over \partial {y_2}} & {\partial L \over \partial {y_3}} \end{bmatrix} \text{ then, } {\partial L \over \partial {\mathbf{W}}} = {\partial L \over \partial {\mathbf{Y}}}{\partial \mathbf{Y} \over \partial {\mathbf{W}}} = \begin{bmatrix} {\partial L \over \partial {y_1}}x_1 & {\partial L \over \partial {y_1}}x_2 & {\partial L \over \partial {y_1}}x_3 \\ {\partial L \over \partial {y_2}}x_1 & {\partial L \over \partial {y_2}}x_2 & {\partial L \over \partial {y_2}}x_3 \\ {\partial L \over \partial {y_3}}x_1 & {\partial L \over \partial {y_3}}x_2 & {\partial L \over \partial {y_3}}x_3 \end{bmatrix}$$

$${\partial L \over \partial {\mathbf{W}}} = \begin{bmatrix} x_1{\partial L \over \partial{\mathbf{Y}^\top}} & x_2{\partial L \over \partial{\mathbf{Y}^\top}}  & x_3{\partial L \over \partial{\mathbf{Y}^\top}} \end{bmatrix}$$

 

수식을 해석해보자면, "$\partial L \over \partial {\mathbf{W}}$의 column space의 차원이 1이다." 즉, rank($\partial L \over \partial {\mathbf{W}}$) = 1이다.


이제 다시 돌아와, 매개변수 초깃값 설정에 대해 본격적으로 살펴보자.

1. 모두 동일한 값으로 초기화

우선 가장 간단한 방법은 매개변수를 모두 같은 값으로 초기화하는 것이다.

결론부터 말하자면, 이 방식은 매우 안 좋은 방식이다.

왜냐하면, (각 은닉층의) 모든 가중치를 똑같은 크기로 업데이트하기 때문이다.

 

그럼 두 가지 질문이 들 수 있다.

첫번째, 진짜로 모든 가중치를 똑같은 크기로 업데이트하는지? HOW

두번째, 모든 가중치를 똑같은 크기로 업데이트하면 뭐가 안좋은지? WHY

 

1. HOW?

위 내용이 사실인지를 확인하기 위해 "입력층, 은닉층, 출력층"으로 나누어 살펴보겠다.

 

동일한 값으로 초기화 상태에서, 

1). 순전파를 진행하면, 입력층에서 서로 다른 입력값을 전달 받지만 상류에 계속 동일한 계산값을 전달한다.

2). 역전파를 진행하면, 출력층에서 서로 다른 미분값을 전달 받지만 하류에 계속 동일한 미분값을 전달한다.

(입력층은 입력 데이터 때문에, 출력층은 라벨 데이터 때문에 서로 다른 입력값/미분값을 전달 받는 것이다.)

 

하지만 첫 순전파/역전파에서, 입력층과 출력층은 각각 서로 다른 입력값과 미분값을 전달 받기 때문에,

다음 수식과 같이 서로 다른 미분값을 가지게 될 것이다.

(참고로, 은닉층은 같은 계산값/미분값을 전달 받기 때문에 동일한 미분값을 가지게 될 것이다.)

$${\partial L \over \partial {\mathbf{W}_\text{in}}} = {\partial L \over \partial \mathbf{h}} {\partial \mathbf{h} \over \partial \mathbf{W}_\text{in}} = \begin{bmatrix} {\partial L \over \partial h}x_1 & {\partial L \over \partial h}x_2 & {\partial L \over \partial h}x_3 \\ {\partial L \over \partial h}x_1 & {\partial L \over \partial h}x_2 & {\partial L \over \partial h}x_3 \\ {\partial L \over \partial h}x_1 & {\partial L \over \partial h}x_2 & {\partial L \over \partial h}x_3 \end{bmatrix}, {\partial L \over \partial {\mathbf{W}_\text{out}}} = {\partial L \over \partial \mathbf{o}} {\partial \mathbf{o} \over \partial \mathbf{W}_\text{out}} = \begin{bmatrix} {\partial L \over \partial o_1}h & {\partial L \over \partial o_1}h & {\partial L \over \partial o_1}h \\ {\partial L \over \partial o_2}h & {\partial L \over \partial o_2}h & {\partial L \over \partial o_2}h \\ {\partial L \over \partial o_3}h & {\partial L \over \partial o_3}h & {\partial L \over \partial o_3}h \end{bmatrix}$$

 

이처럼, 입력층은 열 단위로 동일한 미분값을 가지고, 출력층은 행 단위로 동일한 미분값을 가질 것이다.

가중치 갱신을 하면, 입력층은 열 단위로 동일한 가중치를 갖고, 출력층은 행 단위로 동일한 가중치를 갖는다.

 

하지만, 이러한 가중치 변화에도 차후 순전파/역전파에서,

"입력층은 상류에 동일한 계산값을 전달하고, 출력층은 하류에 동일한 미분값을 전달"하게 될 것이다.

 

그렇기 때문에, 은닉층은 계속 동일한 미분값을 가져, 동일한 값으로 업데이트가 될 것이다.


2. WHY?

똑같은 가중치를 똑같은 값으로 업데이트하면, 여전히 동일한 가중치를 가지게 된다.

그러면, "표현력이 강하게 제한"된다.

모든 가중치가 동일하다는 것은 가중치 행렬의 column space의 차원 즉, rank가 1이라는 것이다.

다른 말로, 행렬을 거쳐 나오는 벡터들의 공간이 1차원이라는 의미이다.

즉, "n차원까지 표현할 수 있는데, 이보다 훨씬 낮은 1차원 밖에 표현 못한다"는 것이다.

 

$n \times n$ 가중치 행렬의 rank가 1이라는 것은 "N-D to 1-D 선형변환"임을 의미한다.

이는 $n \times n$ 행렬보다 훨씬 작은 $1 \times n$ 행렬로도 표현할 수 있기 때문에,

"여러 가중치를 갖는 의미도 사라진다".

 

추가. Rank of $\mathbf{W}_\text{in}$ and $\mathbf{W}_\text{out}$

$\partial L \over \mathbf{W}_\text{in}$과 $\partial L \over \mathbf{W}_\text{out}$은 행/열 단위로 동일한 값이기 때문에, $\mathbf{W}_\text{in}$와 $\mathbf{W}_\text{out}$은 행/열 단위로 동일한 값을 가지고 있다.

그럼, rank는 무엇일까? 여전히 rank가 1이다.

왜냐하면 $\partial L \over \mathbf{W}_\text{in}$/$\partial L \over \mathbf{W}_\text{out}$의 임의의 행/열로 다른 행/열을 나타낼 수 있기 때문이다.

 

즉, $\partial L \over \mathbf{W}_\text{in}$과 $\partial L \over \mathbf{W}_\text{out}$도 표현력이 제한되었다고 볼 수 있다.


그렇기 때문에, 서로 다른 값으로 가중치의 초깃값은 서로 달라야 한다.

서로 다른 값을 가지도록 하는 방법에는 (균등분포 혹은 정규분포를 사용한) 무작위 선정이 있다.

그 중에서도 가장 널리 사용되는 정규분포로 가중치 초깃값을 초기화하는 방법에 대해 살펴볼 것이다.

2. 정규분포로 가중치 초기화

정규분포에서도 수 많은 분포가 존재한다.

그럼 그 중에서, 어느 분포가 적절한지를 판단할 수 있어야 한다.

여러 판단 기준이 있겠지만, 대표적으로 "은닉층 활성화값 분포"가 있다.

인닉층 활성화값 분포를 관찰하면 중요한 정보를 얻을 수 있어, 좋은지 안좋은지를 어느정도 가늠할 수 있다.

 

간단한 예시로 중요한 정보가 무엇인지 그리고 권장하는 가중치 초깃값(=정규분포)은 무엇인지 살펴보자.


그전에 중심극한정리로 $a_{j} = \sum_{i=1}^n x_i w_{ij}$의 분포를 유도해보자.

$$\text{If } X_i \sim \mathcal N(\mu_x, \sigma_x^2) \text{ and } W_{ij} \sim \mathcal(\mu_w, \sigma_w^2) \text{ are i.i.d and } Y_{ij} = X_iW_{ij}, \\ \text{then } \text{E}[Y_{ij}] = \mu_x \mu_w, \text{Var}(Y_{ij}) = \sigma_x^2\sigma_w^2 + \sigma_x^2 \mu_w^2 + \sigma_w^2 \mu_x^2 \\ \text{By CLT, } A_{j} = Y_{1j} + Y_{2j} + \cdots + Y_{nj} \text{ is normal distribution} \\ \text{So, } A_{j} \sim \mathcal N(n\mu_x \mu_w, n(\sigma_x^2\sigma_w^2 + \sigma_x^2 \mu_w^2 + \sigma_w^2 \mu_x^2))$$


예시 신경망은 5층으로 각 층에는 100개의 뉴런과, sigmoid 활성화 함수로 구성되어 있다.

이때, 가중치 초깃값에 따라 은닉층 활성화값이 어떻게 분포되는지 살펴보자.

(참고로, 표준분포가 1인 정규분포로 입력값($\mathbf{x}$)을 샘플링했으며 입력 차원은 100이다.)

 

표준분포가 1인 정규분포

첫번째로 표준분포가 1인 정규분포를 사용해보자.

그 결과 아래 그림과 같이 활성화값이 0과 1에 치우쳐 분포되어 있다.

이러한 현상은 "가중치가 곱해진 입력 신호의 절대적 총합"$(\sum_{i=1}^n x_i w_{ij}=a_j)$이 대부분 5보다 커서 발생한다.

대부분의 $a_i$가 5보다 큰 이유는 $a_i$의 확률분포가 0을 중심으로 매우 넓게 분포되어 있기 때문이다.

$$\text{if } x_i \sim \mathcal N(0, 1), w_{ij} \sim \mathcal N(0, 1), \text{ then } a_i \sim \mathcal N(0, 100)$$

 

이처럼 활성화값($h$)이 0과 1에 치우쳐 분포하게 되면,

역전파 기울기값이 점점 작아지다 사라지는 기울기 손실(gradient vanishing) 문제가 발생한다.

 

결론, $a_i$의 확률분포가 매우 넓으면, 활성화값이 0과 1로 치우쳐 기울기 손실 문제를 발생시킨다.

이를 해결하기 위해서는 가중치의 표준편차($\sigma_w$)를 낮춰 $a_i$의 확률분포를 좁게 만들어야 한다.

 

표준분포가 0.01인 정규분포

이번에는 표준편차를 0.01로 많이 낮췄다. 그 결과, 활성화값이 0.5 부근에 집중되었다.

이러한 현상은 "가중치가 곱해진 입력 신호의 절대적 총합"$(\sum_{i=1}^n x_i w_{ij}=a_j)$이 대부분 0에 가까워서 발생한다.

대부분의 $a_i$가 0에 가까운 이유는 $a_i$의 확률분포가 0을 중심으로 매우 좁게 분포되어 있기 때문이다.

$$\text{if } x_i \sim \mathcal N(0, 1), w_{ij} \sim \mathcal N(0, 0.01^2), \text{ then } a_i \sim \mathcal N(0, 0.01)$$

 

이처럼 활성화값이 0.5 부근에 집중되어 있으면, 기울기 손실 문제가 일어나지 않는다.

하지만, 활성화값이 한 곳에 몰려있다는 것은 표현력 관점에서 큰 문제가 된다.

가중치 행렬 $\mathbf{W}$의 column space의 차원($\approx$공역)은 n이다.

하지만, 실제로 표현할 수 있는 공간($\approx$치역)은 그에 비해 매우 좁다.

 

이는 동일한 값으로 가중치로 초기화했을 때 발생하는 "표현력 제한 문제"와 매우 유사하다.

동일한 값으로 가중치를 초기화했을 때는 모든 활성화값이 균일값을 가졌는데,

정규분포로 가중치를 초기화했을 때는 모든 활성화값은 특정값을 가진다.

즉, n차원 공간에서 전자는 1차원 공간만 표현할 수 있고, 후자는 원점 주변만 표현할 수 있다.

때문에, 이도 여러 가중치를 둔 의미가 없어진다.

 

뿐만 아니라, 대부분의 가중치와 활성화값이 매우 비슷하기 때문에, 

대부분의 가중치가 거의 비슷한 크기로 업데이트될 것이다.

그렇기 때문에, 학습을 진행해도 "표현력 제한 문제"는 해결되지 않을 것이다.

 

결론, $a_i$의 확률분포가 매우 좁으면, 활성화값이 0.5로 집중되어 "표현력 제한 문제"가 발생한다.

이러한 이유로, 가중치의 표준편차($\sigma_w$)를 적당한 크기로 설정해, 활성화값이 광범위하게 분포시키게 해야 한다.

 

Xavier 초깃값(for sigmoid & tanh)

Xavier의 논문에서 활성화값을 광범위하게 분포시키기 위해,

표준편차가 $\frac{1}{\sqrt{n_\text{in}}}$인 정규분포를 사용하면 된다는 결론을 이끌었다.

직전 계층의 노드 개수가 많을수록 현 계층의 가중치 초깃값이 좁게 퍼지기를 의도했다고 볼 수 있다.

결과를 살펴보면, 층이 깊어지면 형태가 다소 일그러진다. 하지만, 앞에서 본 방식보다 훨씬 넓게 분포되었음을 알 수 있다. $a_i$의 확률분포의 표준편차와 $x_i$의 확률분포가 동일하기 때문이다.

$$\text{if } x_i \sim \mathcal N(0, 1), w_{ij} \sim \mathcal N(0, {1 \over \sqrt{100}}), \text{ then } a_i \sim \mathcal N(0, 0.1)$$

결론, Xavier 초깃값은 활성화값을 광범위하게 분포시켜, 기울기 손실 및 표현력 제한 문제가 없다.

때문에 학습을 효율적으로 할 수 있을거라 기대할 수 있다.

 

(참고로, tanh 함수를 활성화 함수로 사용하면 일그러지는 현상을 개선할 수 있다.

원점 대칭 함수가 활성화 함수로 더 바람직하다고 알려졌다.)

 

He 초깃값(for ReLU)

He 초깃값은 ReLU 활성화 함수에 특화된 초깃값이다.

He 초깃값은 표준편차가 $\sqrt{\frac{2}{n_\text{in}}}$인 정규분포를 사용한다.

Xavier 초깃값보다 큰 표준편차를 가진다.

그 이유를 "Relu는 음의 영역이 모두 0이라서 더 넓게 분포시키기 위해 2배의 계수가 필요하다"고 해석해볼 수 있다.

 

활성화 함수가 ReLU일 때, 지금까지 살펴본 초깃값 설정 방법에 따른 활성화값 분포가 어떠한지 살펴보자.

표준분포가 0.01인 정규분포
Xavier 초깃값
He 초깃값

std=0.01일 때의 초깃값은 모든 층에서 활성화값이 거의 0에 치우쳐 있다.

이어서 Xavier 초깃값은 층이 깊어짐에 따라 0쪽으로의 치우침이 조금씩 커진다. 

(참고로, 신경망에 흐르는 활성화값이 작을수록 기울기도 작아진다. 즉, 학습이 점점 이뤄지지 않는다.)

하지만, He 초깃값은 두 경우와 다르게 모든 층에서 균일하게 분포되어 있다.

그렇기 때문에, 전 두 경우보다 적절한 기울기값을 기대할 수 있다.


지금까지 살펴봤듯이 가중치 초깃값은 신경망 학습에 아주 중요한 요소이다. 가중치의 초깃값에 따라 학습의 승패가 갈리는 경우가 많다.

위 내용을 바탕으로, 이제부터는 활성화 함수로 ReLU를 사용할 때는 He 초깃값을, sigmoid를 사용할 때는 Xavier 초깃값을 사용하겠다.