본문 바로가기

생물정보학(바이오인포매틱스)

[40일차] 프로그래밍 & 수학 책 정리 02 : 딥러닝을 위한 수학

 

 

이번 글에서는 저번 글에 이어 '딥러닝을 위한 수학' 책 정리를 해보겠습니다.

 

 

[39일차] 프로그래밍 & 수학 책 정리 01 : 딥러닝을 위한 수학

안녕하세요, 이번엔 최근에 완독한 '딥러닝을 위한 수학' 책을 정리해보려고 합니다.   본 책은 수학책이면서 수학을 프로그래밍으로 구현하며 여러 심층학습 개념들을 소개해주는 게 좋았는

tkmstudy.tistory.com

 

 

7번째 챕터에서는 심층학습에서 중요한 '미분'이라는 개념에 대해 설명합니다.

 

심층학습에서 미분은 신경망을 학습시킬 때 경사하강법을 이용해 신경망의 가중치들을 갱신하기 위해, 역전파 알고리즘으로 도함수를 구할 때 사용됩니다. 이때, 곡선의 점 x에서의 접선의 기울기를 x에서의 도함수(serivative)라고 하죠. 직관적으로, 도함수는 함수가 점 x에서 어떻게 변하는지, 즉 x의 값이 극히 미세하게 변할 때 함수의 값이 어떻게 변하는지를 말해줍니다.

 

 

이 책은 도함수를 한 대상의 변화에 따른 다른 한 대상의 변화 속도 또는 변화율로 취급한다. 심층학습에서는 신경망의 한 매개변수가 변함에 따라 손실함수(신경망의 오차, 즉 신경망이 출력했어야 할 값과 실제로 출력한 값의 차이)가 어떻게 변하는지를 알아야 하는데, 바로 그 지점에서 도함수가 쓰인다. 1)

 

 

그렇게 신경망은 도함수를 활용해 신경망의 오차를 가장 빠르게 최소화할 수 있는 매개변수 값을 찾아갑니다.

 

신경망 학습에서의 손실함수에는 여러 매개변수(가중치, 치우침항 값)가 활용됩니다. 즉, f(x0, x1,.. xn) 같은 여러 변수에 대한 미분을 해야 하는데요. 우리는 각 매개변수값들이 신경망의 손실에 기여하는 정도를 구해야기 때문입니다. 이는 신경망의 손실을 최소화하는데 활용되며, 이러한 여러 변수에 대한 미분 계산에 필요한 것이 바로 '편미분'입니다. 편미분은 '여러 변수 중 특정한 변수 하나에 대한 미분'을 말하며, 다른 변수들을 상수로 간주합니다. 

 

자코비안 행렬(아코비 행렬)은 여러 변수로 구성된 벡터 함수의 편미분들을 모아 행렬로 나타낸 것입니다. 즉, 벡터 함수를 벡터 변수에 미분했을 때 얻어지는 행렬이 바로, 자코비안 행렬입니다. 기호로는 다음과 같이 나타낼 수 있습니다. 

 

출처 : 챗GPT

 

 

자코비안 행렬이 일계도 함수의 일반화라면, 헤세 행렬은 이계도 함수의 일반화라고 합니다. 그러면서도 헤세 함수는 스칼라장 즉, 벡터를 받고 스칼라값을 돌려주는 함수에만 한정된다는 특징이 있습니다.  

 

출처 : 챗GPT

 

 

심층학습에서 헤세 행렬은 주로 최적화에 쓰인다. 신경망을 훈련한다는 것은, 1차 근사까지는 하나의 최적화 문제이다. 이때 목표는 손실함수가 극솟값이 되는, 다른 말로 하면 손실함수 지형의 극소점에 도달하게 만드는 가중치들과 치우침 항(bias term)들을 구하는 것이다. 1)

 

 

이렇게 행렬 미분에 대한 내용을 마친 후에는 본격적으로, 앞서 소개한 개념들을 바탕으로 신경망 데이터의 흐름을 소개해줍니다. 전통적인 신경망인 순방향 신경망(feedforward neural network)은 데이터 집합은 물론, 층과 층 사이의 가중치들을 행렬로 저장합니다. 만약 층 i의 노드가 n개이고, 층 i-1의 출력이 m개라고 하면, 두 층 사이의 가중치 행렬 Wi는 nxm행렬입니다. 이 가중치 행렬에 층 i-1의 출력으로 이루어진 mx1 열벡터를 곱하면, nx1 행렬이 나오며, 거기에다가 층 i의 치우침항 bi를 더한 뒤, 활성화함수(시그모이드 함수, 소프트맥스 함수 등)를 적용해 활성화 값을 구하고, 이는 다음 층 i+1에 입렬값으로 활용됩니다. 이에 대한 공식은 다음과 같습니다. 

 

 

 

활성화 함수 중 대표적인 것으로는 시그모이드(sigmoid), 하이퍼볼릭 탄젠트(tanh), 렐루(ReLU), 소프트맥스(softmax) 함수 등이 있습니다. 먼저 시그모이드 함수는 출력값을 0과 1 사이로 제한하여 확률로 해석할 수 있어, 주로 이진 분류 문제의 출력층에 활용됩니다. tanh 함수는 출력값이 -1과 1 사이를 가지며, 입력값이 양의 무한대로 갈수록 1에, 음의 무한대로 갈수록 -1에 근접하는 S자 형태의 곡선을 가집니다.

 

ReLU 함수는 입력값이 음수일 때 0, 양수일 때는 입력값을 그대로 출력하는 매우 간단한 형태로, 양수 영역에서 기울기가 일정하게 '1'이기 때문에 경사 소실(vanishing gradient) 문제를 완화하는 장점이 있습니다. 무엇보다 음수 입력에 0을 출력하는 만큼 일부 노드를 비활성화시켜 모델의 과적합을 줄이는데 도움이 될 수 있습니다. 마지막으로 소프트맥스 함수는 다항 분류 문제에서 사용되며, 각 범주(category)에 해당하는 예측 확률을 개별 z값을 기반으로 계산합니다. 이는 이진 분류 문제에서 주로 사용되는 시그모이드 함수와 구분됩니다. 이러한 활성화함수는 신경망의 각 층사이의 값들에 비선형성을 도입하여 복잡한 데이터를 효과적으로 학습할 수 있게 한다2)고 합니다. 실제 특징 간의 패턴은 선형적인 경우보다(x가 많아지면 y가 많아지는 일정한 선형 관계) 비선형적인 경우가 많으니까요. 심층신경망에 주로 사용되는 활성화함수는 이중에서도 학습속도가 빠르고 경사소실 문제를 완화할 수 있는 '렐루 함수'입니다. 그렇지만 연구 목적에 따라 적합한 활성화함수는 달라질 수 있겠죠. 좋은 모델, 나쁜 모델은 결국 연구 목적이 무엇이냐에 따라 달라지는 상대적인 비교이니까요.

 

다음으로, 합섭곱 신경망(CNN)에서의 합성곱 연산은 한 함수를 다른 함수 위로 밀어 이동하는 방식(sliding) 혹은 도장을 찍는 방식으로 진행됩니다. 책에서의 표현을 따라 적어봤습니다.

 

 

 

요건 벡터 연산이지만, 행렬 함수끼리도 합성곱 연산이 가능합니다. 이때, 위의 '-1 0 1'에서 처럼 도장을 찍을 때 가장 자리에서는 어떻게 계산을 할까요? 즉, f.g에서 6은 어떻게 계산한 걸까요? 0은 2와 곱하고, 1은 6과 곱하면 되는데, -1은 애매해집니다. 이러한 가장자리 문제를 해결하기 위해 가장 많이쓰이는 방식은 바로 인위적으로 0들을 채워넣는 는 'zero padding(세임 페딩)' 방식입니다. 이를 통해 합성곱 연산 출력의 크기를 입력의 크기와 동일하게 맞춰줄 수 있습니다.

 

CNN의 위력은 새 표현의 학습과 분류자의 학습을 결합한 것에서 비롯된다. 입력의 새 표현을 배우는 데는 학습된 합성곱 핵(kernel)들의 집합이 중요하게 작용한다. 핵들이 CNN을 통과하는 데이터 흐름을 변환함으로써 핵들의 집합이 중요하게 작용한다. 핵들이 CNN을 통과하는 데이터 흐름을 변환함으로써 새 표현이 만들어진다. 경사하강법과 역전파로 CNN을 훈련함으로써 CNN은 적절한 핵들을 만들어내는 방법을 배우게 된다. 1)

 

 

합성곱 층의 출력에도 활성화함수가 적용되는데요. 이를 통해 합성곱층들이 그냥 하나의 층으로 축약되는 일을 방지할 수 있습니다. 참고로, 출력층에는 활성화함수가 적용되지 않습니다. 출력층 값은 손실함수에 적용되죠. 암튼 이러한 심층신경망에 합성곱층이 도입된 이유 중 하나는 '매개변수들의 개수를 줄이기 위함'이라고 합니다. 합성곱 층의 출력은 '풀링층'에 적용됩니다. 여기서 풀링층은 입력 텐서의 채널 수는 유지하며 높이와 너비를 줄이는, 그렇게 차원을 줄이는 용도로 사용됩니다. 

 

 

풀링 연산은 간단하다. 하나의 이동 구간을 이미지 위로 이동하면서 다수의 값을 하나로 합친다. 흔히 쓰이는 이동 구간(sliding window)의 크기는 2x2이고 보폭은 2이다. 이동 구간에 속하는 성분들을 하나로 합칠 때는 흔히 최댓값이나 평균을 이용한다. 최댓값 풀링은 이동 구간에 속한 성분들에서 최댓값만 남기고 나머지는 폐기한다. 평균값 풀링은 이동구간에 속한 성분들의 평균을 취한다. 1)

 

 

풀링층은 합성곱층과 달리, 일반적으로 2×2 크기의 필터를 보폭(stride) 2로 적용하기 때문에 영역이 서로 겹치지 않습니다. 이로 인해 일부 공간적 정보가 손실될 수 있으며, 객체 간의 관계가 왜곡될 가능성이 있습니다. 이러한 이유로 심층학습 분야에서는 풀링의 사용을 우려하는 의견도 존재합니다. 그럼에도 불구하고, 많은 분류 기반 심층 신경망에서는 합성곱층과 풀링층의 조합을 활용하여 특징을 추출한 후, 이를 완전 연결층(Dense layer)으로 전달하는 구조를 따릅니다. 이 과정에서 중간층은 텐서를 평탄화(flattening) 하여 벡터 형태로 변환하게 됩니다. 결국, 저자가 말하길, 합성곱 신경망의 모든 합성곱층과 첫 번째 밀집층의 역할은 주어진 입력을 단순 분류기가 처리하기 쉬운 형태로 변환하는 것이라고 볼 수 있다네요.

 

다음으로 중간 중간 소개했던 역전파에 대한 내용이 나옵니다. 역전파의 바탕이 되는 것은 '손실함수'로, 신경망 훈련에 있어 최적화는 손실함수가 형성하는 지형에서 극소점에 도달하는 방향으로 이루어집니다. 손실함수에 대해 본 책에서는 '신경망 매개변수들(가중치, 치우침값)의 함수'이자, '주어진 입력(훈련 데이터)'에 대한 신경망의 성과가 어느정도인지 말해주는 함수'라고 정의합니다. 다른 책에서는 손실함수를 머신러닝이 어느정도로 엉터리인지 말해주는 기준 이런식으로 소개했던 기억이 나네요.

 

 

손실함수를 수식에서 L(Θ)로 표기하는데, 여기서 Θ(세타)는 신경망의 모든 가중치와 치우침 값으로 이루어진 벡터이다. 훈련의 목표는 손실함수가 정의하는 지형을 탐색하면서 극소점, 즉 Θ에 대한 손실함수 L의 값이 최소가 되는 매개변수 값들의 집합을 찾는 것이다. 이 과정에서 L(Θ)의 기울기가 쓰인다. 그러므로, 경사하강법으로 신경망을 훈련하려면 각 가중치와 치우침 값이 손실함수에 어떻게 기여하는지 알아야 한다. 다른말로 하면, 주어진 가중치(또는 치우침 값) w에 대한 ∂L/∂w를 구해야 한다. 1)

 

 

여기서 역전파는 '각 가중치와 치우침 값들이 신경망 손실에 기여하는 정도를 구하는 알고리즘'이라고 설명합니다. 즉, 순전파를 통해(입력층에 가중치를 곱하고 치우침값을 더하고, 활성화함수를 적용하고 그 활성화 값을 다음 층의 입력값으로 보내고, ....) 얻은 최종 출력값이 실제값과 어느정도 다른지 그 '오차'를 파악하고 오차를 최소화하는 방식으로 모델의 매개변수들을 갱신하기 위해, 각 가중치와 치우침값들이 손실함수에 어떻게 기여하는지 그 편미분값들을 구하는 것입니다. 이후 역전파로 구한 편미분값들로 가중치들과 치우침항들을 갱신함으로써 훈련 집합에대한 신경망의 성과를 개선합니다.

 

 

역전파는 신경망의 제일 끝에서 신경망의 출력과 그에 대한 손실함수로 출발해서 신경망의 제일 앞쪽으로, 즉 역방향으로 나아간다. 오차 신호를 모든 층을 거쳐 역방향으로 전파시켜서 각 가중치와 치우침 항에 대해 ∂L/∂w를 구하는 알고리즘이라서 ‘역전파’라는 이름이 붙었다. 1)

 

 

 

중요한 것은 신경망 출력의 오차를 역방향으로 전파할 때, 그때 오차는 개별 훈련 견본의 손실이 아닌, 훈련 집합 전체의 평균 손실이라는 점입니다. 따라서 각 훈련 견본에 대한 가중치들과 치우침값들이 손실에 기여하는 정도를 모두 누적해 계산해야 한다고 합니다. 그렇게 갱신된 가중치와 치우침 값들은 다음 세대의 순전파와 역전파에 사용됩니다. 이때 갱신 정도는 학습률 또는 단계크기에 비례하게 됩니다. 다시 말해, 학습률 조정을 통해 갱신 정도를 다르게 설정할 수 있습니다. 그렇게 학습률은 경사하강법이 손실함수 지형에서 극솟값을 향해 이동하는 속도를 결정할 수 있습니다. 결국, 역전파의 핵심은 '가중치들과 치우침값들의 변화가 오차에 어떻게 영향을 미치는지 계산하는 것'이라고 볼 수 있겠습니다. 

 


 

 

경사하강법 갱신 공식은 다음과 같습니다 : W <- W - η(학습률)ΔW, b <- b - η(학습률)Δb

 

여기서 W는 가중치, b는 치우침 항이라고 보면 되겠습니다. ΔW와 Δb는 편미분으로부터 얻은 값입니다. 

 

함수에서 극소점이 하나라면, 경사하강법은 언젠간 그 극소점에 도달하게 된다고 합니다. 물론, 학습률이 너무 작으면 반복횟수가 지나치게 늘어날 것이고, 너무 크면 극소점을 지나치면서 극소점 주위를 진동할 위험이 있다고 하네요. 극소점이 여러 개인 경우에는 출발점에 따라 손실함수의 지형에서 빠지게 되는 극소점이 달라질 수 있습니다. 책의 표현을 빌리자면,  "경사하강법은 항상 더 낮은(깊은) 곳으로 이동할 뿐, 더 나은 극소점을 찾기 위해 언덕을 오르지는 않기 때문"입니다. 그래도 심층학습 모형의 경우 다수의 극소점이 존재하더라도 그 극소점들이 대체로 상당히 비슷하다고 여겨진다고 합니다(따라서 여러 극소점 중 하나만 찾아도 좋은 성과를 낼 수 있다고 합니다). 

 

이렇듯 신경망의 훈련은 기본적으로 '손실함수의 최소화 문제'이긴 하지만, 최소화에만 치중하면 일반화 능력을 잃을 수 있습니다. 즉, 훈련 집합에 과대 적합될 가능성이 있습니다. 따라서 일반화 능력을 유지하기 위해 다양한 형태의 '정칙화(regularization)'를 적용합니다. 앞서 말했듯 정칙화항으로 쓰이는 가중치 감쇠에는 'L-2 노름'이 사용됩니다.   

 

다음으로 '확률적 경사하강법(stochastic gradient descent, SGD)'에 대한 소개가 등장합니다. 이 책을 공부하기 전에 '혼공머신(혼자공부하는머신러닝+딥러닝)'이라는 책을 읽었는데요. 그 책에서는 확률적 경사하강법이 훈련세트에서 랜덤하게 하나씩 샘플을 선택하여 손실함수의 가파른 경사를 조금씩 내려가고, 그렇게 모든 샘플 모두 사용하면(에포크를 한번 훑고나면) 모든 샘플을 다시 채워넣고, 그렇게 가장 가파른 경사를 찾아 조금씩 내려가는 방식이라고 소개합니다. 3).   

 

출처 : AI DALLE

 

 

본 책에서는 작은 미니배치(전체의 부분집합인 샘플)로 얻은 기울기가 더 큰 미니배치로 얻은 기울기보다 '잡음'이 많이 있고, 잡음이 많이 있다는 건 '무작위성'이 존재한다는 뜻이며, 무작위성을 가진 대상엔 대체로 '확률적 방법'이 유용하기에, 미니배치에 대한 경사하강법에 있어서 '확률적 경사하강법'이 유용하다고 설명합니다. 그리고 작은 미니 배치의 잡은 많은 기울기는 약간 틀린 방향을 가리키긴 해도, 나쁜 극소점에 빠지지 않게 하는 효과가 있다고 하네요. 앞에선 여러 극소점이 비슷하다고 믿는다고 슬쩍 언급하긴 했지만 그래도 항상 그런건 아닌가 봅니다. 그렇다면 미니배치의 크기는 어느정도로 잡는 것이 좋을까요?  

 

미니배치 크기는 하나의 초매개변수(hyperparameter)이다. 모형의 훈련에 영향을 미치지만 모형 자체의 일부는 아닌 어떤 설정이나 매개변수를 초매개변수라고 한다. 적절한 미니배치 크기는 데이터 집합에 따라 다르다. 극단적인 예로, 견본들 하나하나에 경사하강법 단계를 수행해서 좋은 성과를 얻을 수도 있다. 이런 방식을 흔히 온라인 학습(online learning)이라고 부른다. 그렇지 않은 경우에는, 특히 배치 정규화 층(batch normalization layer)이 있는 모형에서는 계산된 평균과 표준편차가 데이터의 특징을 잘 반영할 수 있을 정도로 큰 미니배치가 필요하다. 1)

 

 

경사하강법은 한 미니배치의 처리가 끝날 때마다 가중치를 업데이트하고, 한 에포크는 전체 데이터셋을 한번 모두 처리하는 것을 의미합니다. 결국 미니배치 크기가 크면 전체 데이터 한 에포크를 커버하는데 필요한 미니배치의 수가 줄어듭니다. 즉, 미니배치가 크면 에포크 당 경사하강법 단계 수가 적어집니다. 그렇기에 실제 응용에서 에포크를 사용하는 도구 모음을 사용할 땐 미니배치 크기에 맞게 에포크 수를 적절히 조정해 경사하강법 단계 수를 확보할 필요가 있다고 합니다. 

 

다음으로 '운동량'에 대한 개념을 소개합니다.

 

 

손실함수 지형에 극소점이 여러 개이면 평범한 경사하강법은 나쁜 극소점에 빠져서 헤어나지 못할 가능성이 있다. 지형의 경사가 급하지 않으면 더욱 그렇다. 이를 보정하는 한 방법은 평범한 경사하강법에 운동량(momentum) 항을 도입하는 것이다. 운동량 항은 이전 단계의 갱신량의 일부를 사용한다. 이 항을 경사하강법에 도입하면 손실함수 지형에서 움직이는 알고리즘의 이동(’운동’)에 관성이 붙어서 나쁜 극소점에서 벗어날 가능성이 생긴다. 1)

 

 

결국 운동량 항은 신경망의 손실을 최소화하는데 도움이 되기에 여러 심층학습 도구 모음들에서 경사하강법 적용시 이 운동량을 적용한다고 합니다. 

 

출처 : AI DALLE



다음으로 '적응적 경사하강법'에 대해 소개합니다. 적응적 경사하강법은 말그대로 경사하강법에 '적응 능력'을 도입한 적응적 경사하강법인데요. 이중 널리 사용되는 방법으로 'RMSprop'가 있습니다. RMSprop은 알고리즘이 진행되는 동안 감쇠 항(decay term) '감마'를 이용해서 기울기들의 이동 평균을 계산하고, 이 기울기 크기를 반영해 학습률을 적응적으로 조정한다고 합니다. 즉, 경사하강 시 각 단계에서 학습률이 적응적으로 조정된다는 것입니다. 

 

 

RMSprop은 최적화 과정이 시변(nonstationary)일 때 강건하다고 알려져 있다. 어떠한 과정이 시변이라는 것은 그 과정의 통계량들이 시간에 따라 변한다는 뜻이다. 반대로, 시불변 과정에서는 통계량들이 시간에 따라 변하지 않는다. 강화학습에서는 시간이 하나의 요인이며, 데이터 집합의 통계량들이 시간에 따라 변할 수 있다. 따라서 강화학습은 시변 최적화 과정일 수 있다. 1)

 

 

그 외에도 AdaGrad, ADAELTA, 그리고 현재 선호되는 방법인 Adam까지 여러 적응적 경사하강법에 대해서 책에서는 소개해줍니다. 쭉 정리를 하긴 했지만 여전히 딥러닝은 어려운 듯 합니다. 그래도 생물정보학에 딥러닝이 앞으로 자주 활용될 듯 하니 조금씩 알아두면 좋을 것 같습니다. 다음에 또 정리할 게 생기면 찾아오겠습니다. 감사합니다!

 

 

참고자료

 

1) 로널드 크노이젤 저/류광 역, 딥러닝을 위한 수학, 제이펍, 2022

 

2) 위키독스, 활성화함수, URL : https://wikidocs.net/250622

 

3. 활성화 함수: 종류와 선택 기준

활성화 함수는 인공신경망에서 입력 신호를 출력 신호로 변환하는 역할을 한다. 활성화 함수는 신경망의 비선형성을 도입하여 복잡한 문제를 해결할 수 있도록 도와준다. 이 장에서는 …

wikidocs.net

 

3) 박해선, 혼자공부하는 머신러닝 + 딥러닝, 한빛미디어, 2020