본문 바로가기
AI / DL/생명과학을 위한 딥러닝

[생명과학을 위한 딥러닝] 2장. 딥러닝 소개

by bri9htstar 2022. 10. 3.

머신러닝으로 문제를 해결할 때는 수식으로 표현하는 것이 가장 중요하다.

 

$y = f(x)$

 

위의 수식에서 $x$와 $y$는 수학적 표현인 벡터(vector)를 의미한다.
함수 $f(x)$는 입력 벡터를 받아 출력 벡터를 만든다.

 

아래의 목록은 다양한 문제를 어떻게 수학적 함수로 표현할 수 있는지 보여주는 예시이다.

  • 사진의 모든 픽셀 정보가 벡터 $x$에 들어있고 함수 $f(x)$는 고양이 사진인 경우 1을 출력하고, 그렇지 않으면 0을 출력한다. → 이진 분류?
  • 위의 예시와 동일하지만 함수 $f(x)$의 출력값이 숫자로 구성된 벡터다. 예를 들어 벡터의 첫 번째 요소는 이미지에 고양이가 포함돼 있는지를, 두 번째 요소는 개가 포함돼 있는지를, 세 번째 요소는 비행기가 포함돼 있는지를 나타낸다.
  • $x$는 염색체의 DNA 염기서열 정보를 포함하고, $y$는 염색체의 전체 염기 수의 길이를 나타내는 벡터이다. 각각의 요소는 해당 부분이 단백질을 암호화하고 있다면 숫자 1을, 그렇지 않은 경우 숫자 0을 값으로 가진다.
  • $x$는 분자의 화학 구조 정보가 들어있는 벡터이고, $y$는 해당 분자의 물리적 특성을 요소로 가진 벡터다. 분자의 물리적 특성에는 용해도와 다른 분자와의 결합력 등이 포함돼 있다.

그런데 단순하게 입력값을 살펴본다고 해서 함수의 결과값을 유추하기는 매우 어렵다. 함수 $f(x)$는 아주 긴 벡터를 입력값으로 사용하기 때문이다.

과거에는 수작업으로 함수 $f(x)$를 직접 작성했는데, 머신러닝은 완전히 다른 접근 방식을 사용한다. 사람이 직접 함수 $f(x)$를 작성하는 대신 컴퓨터에게 많은 데이터를 주고 거꾸로 함수를 만들어낸다. 예를 들어 개발자가 고양이 존재 여부를 표시한 사진을 적게는 수천에서 많게는 수백만 개까지 모아서 머신러닝을 수행한다. 그러면 컴퓨터는 사진에 고양이가 있다면 1에 가까운 숫자를 출력하고, 반대로 고양이가 없다면 0에 가까운 값을 출력하는 함수 $f(x)$를 만든다.

머신러닝은 기본적으로 몇 개의 클래스를 가진 함수를 정의하는 모델을 사용한다. 모델에는 매개변수와 모든 값을 포함하는 변수가 포함돼 있고, 매개변수의 값이 데이터에 의해 변경되면서 클래스의 함수 중에서 알맞은 것을 선택하게 된다. 즉, 머신러닝이란 컴퓨터가 이러한 모델의 올바른 매개변수 값을 찾는 과정이다. 다시 말해 학습 데이터를 입력값으로 받아서 모델의 출력값이 실제 데이터와 최대한 비슷해지도록 하는 매개변수의 값을 찾는 과정이 머신러닝이다.

 

선형 모델

선형 모델(linear model)은 머신러닝 모델 중 가장 간단하다. 수식으로 표현하면 다음과 같다.

 

$y = Mx + b$

 

M은 행렬(가중치, weight라고도 한다)이고, b는 벡터(편향, bias라고도 한다)다. 각각의 크기는 입력값과 출력값의 수에 따라 결정된다. $x$ 길이가 T이고 $y$ 길이는 S인 경우, $M$은 S × T 크기의 행렬이 되고 $b$는 길이가 S인 벡터가 된다. 이런 것들이 모여서 모델의 매개변수를 구성한다. 이 방정식에서는 단순하게 각 출력의 구성 요소가 입력값의 구성 요소와 선형 관계를 이룬다고 가정한다. 즉, 매개변수($M$과 $b$)를 설정해 각 구성 요소에 대한 선형 결합을 만든다.

일반적으로 선형 모델은 적용되는 문제와 상관없이 동일한 형태를 가진다. 그래서 공식화하기 쉬운 편이다. 선형 모델 간의 유일한 차이점은 입력 및 출력 벡터의 길이다. 따라서 매개변수 값을 조절하는 것만으로 간단하게 사용할 수 있다. 머신러닝에는 해결하려는 문제와 독립적인 모델 및 알고리즘이 필요하고, 선형 모델은 그 역할을 잘 수행한다.그러나 선형 모델은 그 특성상 해결할 수 있는 문제가 매우 제한적이고 데이터의 차원이 늘어날수록 실제 데이터 형태와 맞지 않는 경향이 있다. 사실 대부분의 경우에는 비선형 모델이 필요하다.

 

다층 퍼셉트론

다층 퍼셉트론(multilayer perceptron)은 간단히 설명하면 선형 모델을 여러 겹으로 쌓는 것이다.

 

$y = M_2φ(M_1x+b_1) + b_2$

 

위 수식을 자세히 살펴보면 선형 모델 수식은 $M_1x+b_1$부터 시작한다는 것을 알 수 있따. 그런 다음 비선형 함수 $φ(x)$를 선형 모델에 적용하고 두 번째 선형 모델에 해당 결과를 넘겨준다. 활성 함수로 알려진 $φ(x)$는 다층 퍼셉트론에 필수적인 부분이다. 이 함수가 없다면 다층 퍼셉트론 모델은 선형 모델과 다를 바 없다. 다층 퍼셉트론은 단일 퍼셉트론(선형 모델)에 비선형 함수를 추가함으로써 훨씬 더 넓은 범위의 머신러닝을 할 수 있다.

 

다층 퍼셉트론은 우리가 원하는 만큼의 레이어를 쌓을 수 있다.

 

$h_1 = φ_1(M_1x + b_1)$

$h_2 = φ_2(M_2h_1 + b_2)$

$h_{n-1} = φ_{n-1}(M_{n-1}h_{n-2} + b_{n-1})$

$h_n = φ_n(M_nh_{n-1} + b_n)$

 

위의 수식처럼 단일 선형 모델을 여러 층으로 쌓는 것을 다층 퍼셉트론 혹은 줄여서 MLP(MultiLayer Perceptron)라 부른다. 중간 단계의 $h_i$는 은닉층(hidden layer)이라 부르며, 이름에서 알 수 있듯이 h와 i는 입력도 출력도 아닌 계산하는 과정에서만 사용되는 중간 산물 값이다. 또한 $φ(x)$ 함수도 계속 추가된다는 것을 알 수 있는데, 이것은 각각의 레이어가 서로 다른 비선형을 나타낸다는 의미다.

 

활성화 함수 $φ(x)$는 어떻게 정해야 할까? 놀랍게도 대부분의 경우 이것은 중요하지 않다. 물론 활성화 함수가 전혀 중요하지 않다는 뜻은 아니다. 거의 대부분의 활성화 함수들이 충분히 좋은 성능을 보여주기 때문이다.

현재 가장 인기 있는 활성화 함수는 ReLU다. 수식으로 $φ(x) = max(0,x)$라고 표현되며 아직 어떤 활성화 함수를 써야 하는지 모르는 상황이라면 먼저 사용해볼 것을 권한다.

 

또한 다층 퍼셉트론은 너비와 깊이라는 두 가지 속성을 선택해야 한다. 다층 퍼셉트론에서는 은닉층으로 인한 선택 사항이 존재한다. 너비는 숨겨진 층의 크기를 나타내고 우리가 원하는 크기를 가질 수 있도록 $h_i$ 값을 변경한다. 해결하려는 문제에 따라 입력값과 출력값보다 은닉층이 훨씬 커지거나 작아져야 할 필요가 있기 때문이다.

깊이는 모델의 레이어 수를 나타낸다. 따라서 은닉층의 개수가 하나인 것을 얕은 모델이라 하고, 개수가 많은 것을 깊은 모델이라 한다. 이것이 바로 '딥러닝'이라는 용어의 근원이다. 아래의 목록은 지금까지 알려진 정보를 통해 권장되는 머신러닝의 내용이다.

  1. 하나의 은닉층만 있는 상대적으로 얕은 모델은 보편적으로 근삿값을 구할 때 사용한다.
  2. 깊은 모델은 얕은 모델보다 적은 수의 매개변수를 요구하는 경향이 있다.
  3. 깊은 모델은 얕은 모델보다 학습이 오래 걸린다.

모델 학습하기

가장 먼저 해야 하는 일은 머신러닝에 필요한 데이터를 수집하는 것이다. 수집한 데이터셋은 학습 데이터세이라고 부르며, 아주 많은 수의 $(x, y)$ 쌍으로 구성돼 있어야 한다. 데이터셋의 각 샘플은 모델에 입력값과 해당 입력값의 출력값으로 구성돼 있어야 한다.

그 다음으로 손실 함수 $L(y, \hat y)$를 정의한다. 손실 함수는 모델의 예측 결과값과 실제값의 차이를 측정하는 함수다. 손실 함수에서 y는 모델의 예측값이고 $\hat y$는 학습 데이터의 실제값이다. 그런 다음 전체 학습 데이터셋에 대한 평균 차이를 계산한다.

 

average loss = $(1/N) * \sum_{i=1}^{N} L(y_i, \hat y_i)$

 

일반적으로 사용하는 손실 함수는 유클리드 거리 계산($L_2$ 거리라고도 함)이다. 위 식에서 $y_i$는 벡터 $y$의 $i$번째 성분을 의미한다.

 

$L(y, \hat y) = \sqrt {\sum_{i} L(y_i - \hat y_i)^2}$

 

만약 모델의 예측 결과가 확률분포일 때는 일반적으로 교차 엔트로피 손실 함수를 사용한다.

 

$L(y, \hat y) = -\sum_{i} y_i * log(\hat y_i)$

 

각 문제의 세부 사항에 따라 적절한 것을 골라야 한다.

 

손실 함수를 통해 모델이 얼마나 잘 작동하는지 측정할 수 있게 됐으니 함수를 사용해 모델의 성능을 개선해야 한다. 성능 개선을 위해서는 학습 데이터셋에 대한 평균 손실을 최소하하는 매개변수 값을 찾아야 한다. 매개변수 값을 찾는 다양한 방법이 있지만 딥러닝에서는 대체로 경사 하강법을 사용한다. θ가 모델의 모든 매개변수 집합을 나타낸다고 하면 경사 하강법은 다음과 같은 수식으로 나타낸다.

 

$θ ← θ - ε(θ/∂θ)〈L〉$

 

수식에서 $〈L〉$은 학습 데이터셋에 대한 평균 손실이다. 경사 하강법은 각 단계마다 '하강'하는 방향으로 약간씩 거리를 이동하기 때문에 지금과 같은 이름을 갖게 됐다. 다시 말해 평균 소실을 줄이기 위해 모델의 각 매개변수를 조금씩 변경한다. 위 수식의 $ε$은 학습 속도라고 불리며, 각 단계에서 매개변수가 변경되는 정도를 결정한다. 이 경사 하강법은 알고리즘은 각 학습 단계의 훈련 데이터에 포함된 모든 샘플을 계산한다는 문제가 있다.

확률적 경사 하강법(Stochastic Gradient Descent, SGD)은 학습 단계에서 학습 데이터의 배치(batch, 부분 데이터셋)를 만들고 평균값을 계산해 손실 함수의 경사를 계산한다. 각 단계에서 노이즈가 있는 추정을 기반으로 하는 단점이 있지만 학습 시간이 훨씬 짧아지기 때문에 많이 사용된다.

 

검증하기

학습 데이터셋뿐만 아니라 새로운 데이터에서도 모델이 잘 작동할지 검증(validation)하는 과정이 필요하다. 모델을 검증하기 위해서는 테스트 데이터셋이라고 하는 두 번째 데이터셋이 필요하다. 서로 같은 형태의 집합이지만 중복되는 데이터가 없어야 한다.

모델을 설계·학습하는 동안 어떤 방식이든 테스트 데이터를 사용하지 않아야 한다.

정규화

정규화는 과적합을 피하기 위한 방법을 총칭한다. 따라서 정규화의 목적은 전체 데이터에 일반적으로 적용할 수 있는 모델을 만드는 것이다. 정규화 기법을 배우기 전에 먼저 알아둬야 할 두 가지 내용이 있다.

  • 과적합을 피하는 가장 좋은 방법은 더 많은 학습 데이터를 사용하는 것이다.
  • 모든 경우에 사용할 수 있는 최고의 정규화 기법은 존재하지 않는다.

정규화 기법의 본질은 특정 유형의 모델을 다른 모델보다 선호하도록 학습 과정을 조절하는 것이다.

가장 단순한 정규화 기법은 모델의 학습 단계를 줄이는 것이다. 학습 단계가 많아질수록 특정 학습 데이터 샘플에 대한 세부적인 정보를 얻을 가능성이 높아져서, 학습 단계의 수를 제한함으로써 과적합 가능성을 줄일 수 있다.

다른 정규화 기법은 모델에서 매개변수의 크기를 제한하는 것이다. 예를 들어 $|θ|^2$에 비려하는 손실 함수에 항을 추가할 수 있다. 여기서 θ는 모델의 모든 매개변수를 포함하는 벡터다. 과적합은 종종 매개변수가 매우 커져서 발생하기 때문에 적당한 매개변수 값이 필요한 것보다 커지지 않게 된다.

또 다른 정규화 기법은 가장 많이 쓰이는 드롭아웃이다. 학습 모델의 은닉층을 일정 비율로 무작위로 선택해서 0으로 설정한다. 어떤 정규화 방법을 사용해야 하는지 잘 모른다면 먼저 드롭아웃 방법을 사용해보는 것이 좋다.

 

하이퍼파라미터 최적화

하이퍼파라미터는 모델 또는 학습 알고리즘에 의해 만들어지는 것이 아니라 사용자가 설정해주는 매개변수다. 모델의 레이어 수, 각 레이어의 너비, 수행할 학습의 단계 개수, 머신러닝 동안의 학습 속도, 드롭아웃을 사용할 때의 비율 등이다. 최적의 하이퍼파라미터 값을 아는 간단한 방법은 학습 데이터에서 손실 함수가 가장 낮은 하이퍼파라미터를 찾는 것이다. 그러나 학습 데이터가 아닌 테스트 데이터에서 손실 함수가 낮아야 한다는 것을 기억하자. 그래서 많은 값을 시도해 테스트 데이터셋에서도 손실 함숫값이 최소화되는 값을 찾아야 한다.

학습 데이터셋에서 잘 작동하는 하이퍼파라미터가 테스트 데이터셋에서도 그럴 것이라고 보장할 수 없다. 그렇기 때문에 테스트 데이터셋이 모델의 학습에 영향을 주지 않도록 하는 것이 중요하다. 이 문제를 해결하려면 유효성 검사 데이터셋이라는 새로운 데이터셋이 필요하다. 유효성 검사 데이터셋은 학습 데이터나 테스트 데이터 중 어떤 샘플과도 중복되지 않아야 하고 다음과 같이 작동해야 한다.

  • 각 하이퍼파라미터 값 집합에 대해 학습 집합에서 모델을 훈련시키고 유효성 검정 데이터셋의 손실을 계산한다.
  • 유효성 검정 데이터셋에서 가장 낮은 손실 함숫값을 나타내는 하이퍼파라미터로 최종 모델을 만든다.
  • 최종 모델로 테스트 데이터셋을 평가해 얼마나 잘 작동하는지에 대한 성능을 측정한다.

 

다른 유형의 모델들

합성곱 신경망(Convolution Neural Network, CNN)

이미지 처리와 컴퓨터 비전을 위해 개발됐으며 음성 신호(1차원 데이터), 이미지(2차원 데이터), 자기 공명 영상(MRI)(3차원 데이터) 등과 같이 사각형 틀(grid)에서 샘플링된 데이터를 처리하는 문제에 탁월한 성능을 보여준다.

합성곱 신경망의 첫 번째 입력층의 각 뉴런은 전체 시야의 작은 부분(수용 영역)을 입력값으로 받는다. 각각의 뉴런은 수평선이나 수직선 같은 특정 패턴이나 피처에 특화돼 있다. 두 번째 층은 첫 번째 입력층을 통해 얻은 결괏값의 부분 군집(cluster)을 입력값으로 사용해 더 넓은 구역의 패턴을 인식한다. 즉, 각각의 레이어는 이전 레이어보다 크고 더 추상적인 패턴으로 원본 이미지를 변환한다.

다층 퍼셉트론과 달리 합성곱 신경망은 입력값의 일부를 사용하는 합성곱층을 사용하기 때문에 이미지의 작은 해당 영역의 입력값에 의존적이다. 이것은 각 층을 정의하는 매개변수의 수를 엄청나게 줄여준다. 실제로 각 출력 요소는 적은 수의 입력값에만 의존하기 때문에 가중치 행렬 $M_i$의 대부분 요소는 0으로 간주한다.

합성곱층은 더 나아가 이미지의 부분 영역 매개변수가 동일하다고 가정한다. 따라서 각 층의 매개변수 수는 이미지의 크기와 무관하다. 이것이 합성 신경망 모델이 쉽게 과적합되지 않는 이유다.

 

순환 신경망(Recurrent Neural Network, RNN)

단어로 구성된 텍스트 문서, 염기로 구성된 DNA 등 일련의 단위들로 이뤄진 데이터를 처리하는 데 사용된다. 순환 신경망은 앞에서 배운 딥러닝 모델과 조금 다르다. 데이터의 구성 요소들이 하나씩 신경망에 입력되는 것은 동일하지만, 각각의 레이어에서 다음 레이어로 출력값을 넘길 때 출력값을 다시 입력값으로 받는다는 것이 다르다. 이렇게 하면 일종의 메모리 효과를 얻을 수 있다. 데이터의 요소가 신경망에 입력되면 각 레이어에 대한 입력은 이전 레이어의 입력값에 의존한다.

순환 신경망은 메모리라는 개념을 가짐으로써 앞에서 살펴본 다른 모델과 근본적으로 다르다. 합성곱 신경망 또는 다층 퍼셉트론의 출력은 전적으로 입력값에 의해 결정되지만 순환 신경망은 다르다. 순환 신경망은 입력값뿐만 아니라 모델 내부의 상태에 따라 출력값이 변한다. 마찬가지로 내부 상태는 각각의 새로운 입력값에 의해 변경된다. 순환 신경망의 이런 특징은 DNA와 같이 반복되는 단위로 구성된 데이터에서 유용하게 사용된다.


참고 자료

『Neural Networks and Deep Learning』_Michael Nielsen.pdf
18.41MB

https://www.deeplearningbook.org/

 

Deep Learning

What is the best way to print the HTML format? Printing seems to work best printing directly from the browser, using Chrome. Other browsers do not work as well.

www.deeplearningbook.org

https://www.oreilly.com/library/view/tensorflow-for-deep/9781491980446/

 

TensorFlow for Deep Learning

Learn how to solve challenging machine learning problems with TensorFlow, Google’s revolutionary new software library for deep learning. If you have some background in basic linear algebra and calculus, this … - Selection from TensorFlow for Deep Learn

www.oreilly.com

댓글