Codong's Development Diary RSS 태그 관리 글쓰기 방명록
2021-05-31 20:46:41

개요


딥 러닝을 이용한 자연어 처리 입문

AI는 여러 의미를 포괄하고 있지만, 지금에 이르러 사람들이 말하는 AI는 바로 머신 러닝(Machine Learning)과 머신 러닝의 한 갈래인 딥 러닝(Deep Learning)을 의미한다. 스스로 규칙을 찾아내가는 머신 러닝이 새로운 프로그래밍의 패러다임이 될 것이라 말하기도 한다. 그럼 머신러닝이란 도대체 무엇인가... 시작해보자!



1. 머신러닝이란(Machine Learning)?


왜 이것이 나오게 되었는가 부터 찬찬히 살펴보자.


1.1 머신러닝이 아닌 접근 법의 한계

예를들어 '주어진 사진으로부터 고양이 사진인지 강아지 사진인지 판별하는 일' 이라는 해결 해야 할 문제가 주어졌다고 가정하자.

이미지 출처 : 사진1 사진2 사진3

이 문제를 사람이라면 구분을 잘 하겠지만, 컴퓨터가 이것을 구분하게 한다는 것은 쉽지가 않다. 전통적인 방식으로 개발자가 직접 규칙을 정의하여 프로그램을 작성한다면 다음과 같을 것이다.

def prediction(이미지파일):
    if 눈코귀가 있을 때:   
        if 근데 강아지는 아닐때
    if 털이 있고 꼬리 있을 때:
        if 다른 동물이 아닐 때
    ...
    어캐하누...
    return 결과

위의 사진에서 볼 수 있는 것처럼, 고양이 자세나 색상 등이 너무 다양해서 공통된 명확한 특징을 모두 잡아내는 것은 사실상 불가능에 가깝다고 볼 수 있다. 존재하지도 않지만, 있다해도 어떻게 저런 것을 사람이 다 일일이 정의를 하나...

그래서 이미지 인식 분야에서 특징을 잡아내기 위한 시도들이 있었다. 이미지의 shape이나 edge와 같은 것들을 찾아내서 알고리즘화 하려고 시도하고, 다른 사진 이미지가 들어오면 전반적인 상태를 비교하여 분류하려고 한 것이다. 그렇지만 여전히 공통된 명확한 특징을 찾아내는 것에 한계가 있을 수 밖에 없기에, 머신러닝이 이에 대한 해결책이 될 수 있다.


1.2 정리

간단하게 설명하자면,

  • 기존의 프로그래밍이 개발자가 직접 규칙을 정의하여 input(data)을 넣어서 output(해답)을 도출했다.

Ex) input(사진) ---> fucntion(정의한 규칙 : 꼬리와 털이 있으면 고양이다.) ---> output(고양이다)

  • 하지만 머신러닝은 개발한 알고리즘을 통해 만든 model에 input(data와 해답)을 넣어 규칙을 도출해낸다.

Ex) input(사진, 고양이다) ---> model(학습) ---> output(학습한 규칙 : 꼬리와 털이 있으면 고양이다.)

  • 이렇게 학습한 모델은 기존 프로그래밍처럼 input으로 data가 들어온다면 해답을 예측(추론)할 수 있게 된다.

Ex) input(사진) ---> model(학습한 규칙) ---> output(고양이다)

결과적으로 머신러닝은 주어진 데이터로부터 결과를 찾는 것에 초점을 맞추는 것이 아니라, 주어진 데이터로부터 규칙성을 찾는 것에 초점이 맞추어져 있다. 주어진 데이터로부터 규칙성을 찾는 과정을 학습(training)이라고 한다.

대충 느낌은 왔으니 조금만 더 들어가 보자!



2. 머신러닝 훑어보기


머신 러닝의 특징들에 알아보자. 딥 러닝 또한 머신 러닝에 속하므로 머신러닝의 특징들은 모두 딥러닝의 특징이기도 하다.


2.1 머신 러닝 모델의 평가

모델을 학습시켰다면, 평가를 빼놓을 수가 없다. 모델을 학습시켰는데 이것이 잘된건지 아닌지 확인을 해야 사용할 수 있을지 아닐지 판단할 수 있지 않겠는가? 그래서 실제 모델을 평가하기 위해 데이터를 훈련용, 검증용, 테스트용 이렇게 세 가지로 분리하는 것이 일반적이다.

근데 훈련이랑 테스트로 한 번만 테스트하면 되지, 굳이 검증까지 넣어뒀을까 싶다. 역시 사람들이 만들어둔 것은 다 이유가 있다. 검증용 데이터는 모델의 성능을 평가하기 위한 용도가 아니라, 모델의 성능을 조정하기 위한 용도이다. 더 자세히는 과적합이 되고 있는지 판단하거나 하이퍼파라미터의 조정을 위한 용도이다.

👆 여기서 하이퍼파라미터(hyper parameter)란?

  • 값에 따라서 모델의 성능에 영향을 주는 매개변수를 말한다.
  • 경사하강법에서 학습률(learning rate), 딥러닝에서 은닉층의 수, 뉴런의 수, 드롭아웃 비율 등이 이에 해당한다.
  • 반면, 일반 매개변수(일반 파라미터)는 가중치와 편향과 같은 학습을 통해 바뀌어져가는 변수이다.

정리하면, 하이퍼파라미터 = 사람이 정하는 변수 / 파라미터(매개변수) = 기계가 훈련을 통해 바꾸는 변수

아무튼! 훈련용 데이터로 훈련을 모두 시킨 모델은 검증용 데이터를 사용하여 정확도를 검증하며 하이퍼파라미터를 튜닝(tuning)한다. 그러면 이 모델의 매개변수는 검증용 데이터에 대해 일정 부분 최적화가 된다. 튜닝하면서 다시 훈련을 검증용 데이터를 사용했기에 검증을 아직까지 보지 못한 데이터로 하는 것이 바람직하다. 그래서 이제 테스트 데이터로 모델의 진짜 성능을 평가한다.

결과적으로 훈련 과정을 수험생으로 비유를 하자면 훈련데이터(문제집) -> 검증데이터(모의고사) -> 테스트데이터(수능) 이라고 볼 수 있다. 문제집을 쭉 풀다가 모의고사를 보고 아 유형이 이런식이구나 하면서 모의고사에 맞춰서 공부하는 것이다. 그런 다음 마지막으로 수능을 치는 것과 같이 평가를 하는 것이다. 데이터가 충분하지 않으면 이렇게 3개로 나누는 것이 힘들 것이다. 그럴 때 k-폴드 교차 검증이라는 또 다른 방법을 사용하기도 한다.

👆 K-폴드 교차검증(K-fold cross Validation)이란?

k-fold

이미지 출처

간단하게 말하자면, 테스트 세트를 제외한 데이터셋을 K개로 분할하여 나눈뒤, 검증용 데이터 부분을 바꿔가면서 각 case별로 정확도를 측정해보는 것이다. 자세히 알고싶다면 이곳을 살펴보자.


2.2 분류(Classification)와 회귀(regression)

다음으로는 머신러닝이 어떤 문제를 해결하는데 사용되는지 알아보자. 전부라고는 할 수 없지만, 머신 러닝의 많은 문제는 분류 또는 회귀 문제에 속한다.

1️⃣ 이진 분류 문제(Binary Classification)

  • 이진 분류는 주어진 입력에 대해서 둘 중 하나의 답을 정하는 문제이다.
  • 시험 성적에 대해 합격/불합격 또는 메일로부터 정상메일인지 스팸메일인지를 판단하는 문제 등이 이에 속한다.

2️⃣ 다중 클래스 분류(Multi-Class Classification)

  • 주어진 입력에 대해 두개 이상의 정해진 선택지 중에서 답을 정하는 문제이다.
  • 서점을 예로 들면 책 분야를 과학, 영어, IT, 만화 라는 레이블이 각각 붙어있는 4개의 책장이라 하면, 새 책이 입고 되면 이 책을 분야에 맞는 적절한 책장에 넣어야 한다. 이 때의 4개의 선택지를 카테고리 또는 범주 또는 클래스라고 한다. 결과적으로 주어진 입력으로부터 정해진 클래스 중 하나로 판단하는 것이다.

3️⃣ 회귀 문제(Regression)

  • 회귀 문제는 분류 문제처럼 0 또는 1이나 다양한 분야가 있는 책 분류와 같이 분리된(비연속적인) 답이 결과가 아니라 연속된 값을 결과로 가진다.
  • 대표적으로 시계열 데이터를 이용한 주가 예측, 생산량 예측, 지수 예측 등이 이에 속한다.

2.3 지도 학습(Supervised Learning)과 비지도 학습(Unsupervised Learning)

그러면 어떤 방법으로 학습하는지도 알아야지 않겠는가. 머신러닝은 크게 지도 학습, 비지도 학습, 강화 학습으로 나눈다. 강화 학습은 이 책에서 다루지 않으므로 두 가지만 알아보도록 하겠다.

1️⃣ 지도 학습

  • 지도학습이란 레이블(Label)이라는 정답과 함께 학습하는 것을 말한다. 레이블이라는 말 외에도 y, 실제값 등으로 부르기도 한다.
  • 기계는 예측값과 실제값인 차이인 오차를 줄이는 방식으로 학습을 하게 된다. 예측값은 $\hat{y}$으로 표기하기도 한다.

2️⃣ 비지도 학습

  • 레이블이 없이 학습을 하는 것을 말한다. 예를들어 토픽 모델링의 LDA는 비지도 학습에 속하고 word2vec도 비지도 학습에 속한다.

2.4 샘플(Sample)과 특성(Feature)

중요 용어에 대해 알아보자. 많은 머신 러닝 문제가 1개 이상의 독립 변수 x를 가지고 종속 변수 y를 예측하는 문제이다. 많은 머신 러닝 모델들, 특히 인공 신경망 모델은 독립 변수, 종속 변수, 가중치, 편향 등을 행렬 연산을 통해 연산하는 경우가 많다. 그래서 행렬을 자주 보게 될 것인데, 독립 변수 x의 행렬을 X라고 했을 때, 독립 변수의 개수가 n개 이고 데이터의 개수가 m인 행렬 X는 다음과 같다.

이때 머신 러닝에서는 하나의 데이터, 하나의 행을 샘플(Sample)이라 부르고, 종속 변수 y를 예측하기 위한 각각의 독립 변수x를 특성(Feature)이라고 부른다.


2.5 혼동 행렬(Confusion Matrix)

머신 러닝에서는 맞춘 문제수를 전체 문제수로 나눈 값을 정확도(Accuracy)라고 한다. 하지만 정확도는 맞춘 결과와 틀린 결과에 대한 세부적인 내용을 알려주지는 않는다. 이를 위해 사용하는 것이 혼동 행렬이다.

예를 들어 양성(Positive)과 음성(Negative)을 구분하는 이진 분류가 있다고 했을 때 혼동 행렬은 다음과 같다.

confusion matrix

이미지 출처

True 는 정답을 맞춘 경우고, False는 정답을 맞추지 못한 경우다. 그리고 positive와 Negative는 예측된 값들이다. 이를 통해 다음과 같이 알 수 있다. FP는 양성이라 예측했는데, 실제론 음성인 경우이고, FN은 음성이라 예측했는데 실제론 양성인 경우이다.

이 개념을 사용하면 또 새로운 개념인 정밀도(Precision)과 재현율(Recall)이 된다.

1️⃣ 정밀도(Precision)

정밀도는 양성이라고 대답한 전체 케이스에 대한 TP(예측과 정답이 양성으로 같은 경우) 비율이다. 즉, 정밀도를 수식으로 표현하면 다음과 같다.

$ 정밀도 = \frac{TP}{TP + FP} $

2️⃣ 재현율(Recall)

재현율은 실제 값이 양성인 데이터의 전체 개수에 대해서 TP(예측과 정답이 양성으로 같은 경우)의 비율이다. 즉, 양성인 데이터 중에서 얼마나 양성인지를 예측(재현)했는지를 나타낸다.

$ 재현율 = \frac{TP}{TP + FN} $

🤔 근데 이것들을 왜 구해서 어디다 쓰는 것인가?

정의되는 문제의 종류에 따라 다르다.

  1. 재현율은 실제값이 positive일 때 예측한 값이 positive일 경우가 중요한 상황일 때 사용된다. 즉 잘못 예측해도 negative인 경우가 적은게 나을 때이다. 단적인 예로, 암 판단 분류 예측을 하는 문제에 있어서 실제로 암이 걸렸는데 예측을 암이 걸리지 않았다고 판단하게 되면 수반되는 위험이 매우 커지기 때문이다.
  2. 반대로 정밀도는 모델이 예측한 것이 틀려도 Posivite인 경우가 적은게 나을 경우에 사용된다. 예시로 스팸메일 분류를 생각해보자. 만약 분류 모델이 중요한 업무내용을 담고 있는 메일(Negative)을 스팸메일(Positive)이라 분류하게 된다면 전달되지 못하는 위험한 상황이 발생한다.

➕ F1-score

추가로 성능측정 지표로 F1-score 라는 것이 있는데, 이것은 정밀도와 재현율의 조화평균이다. 수식은 다음과 같다.

$F1Score = 2 * \frac{(재현율 * 정밀도)}{(재현율 + 정밀도)}$

주로 다중 클래스를 분류 모델의 성능 측정 지표로 많이 사용되는데, 이 이유는 단순 정확도(Accuracy)를 구할 때에 데이터가 특정 클래스로 쏠려있는 경우일 때 정확도가 높은 수치를 나타내지만 실제론 그렇지 않은 경우가 생기기 때문이다.

출처 : https://nittaku.tistory.com/295

위 사진과 같이 수치는 model2가 훨씬 정확하다고 하지만, model2는 B,C,D에서 10개중 1개 밖에 못맞추는 모델이다. 즉, A만 잘맞추는 모델이 된 것이다. 그렇기에 model2가 model1 보다 좋다고 얘기할 순 없는 것이다.

이렇게 데이터가 균등하지 못한 경우 성능측정을 f1-score를 사용한다. 즉, 조화평균은 단순하게 평균을 구하는 것이 아니라, 큰 값이 있다면 패널티를 주어서, 작은값 위주로 평균을 구하게 된다.


2.6 과적합(Overfitting)과 과소 적합(Underfitting)

학생의 입장이 되어 같은 문제지를 과하게 많이 풀어 문제 번호만 봐도 정답을 맞출 수 있게 되었다 가정하자. 그런데 다른 문제지나 시험을 보면 점수가 안 좋다면 그게 의미가 있을까?

머신러닝에서 이러한 경우와 같이 훈련 데이터를 과하게 학습한 경우를 과적합(Overfitting)이라고 한다. 즉 훈련 데이터에 대해 지나친 일반화를 한 상황이다. 그 결과 훈련 데이터에 대해서 오차가 낮지만, 테스트 데이터에 대해서는 오차가 높아지는 상황이 발생한다. 아래의 스팸 필터 분류기를 예제를 살펴보자.

훈련 횟수가 3~4회를 넘어가게 되면 오차(loss)가 점차 증가하는 양상을 보여준다. 훈련데이터에 대해서는 정확도가 높지만, 테스트 데이터는 정확도가 점차 낮아진다고 볼 수 있다.

그래서 과적합을 방지하기 위해 테스트 데이터에 대한 loss값이 크게 높아지기 전에 훈련을 멈추는 것이 바람직 하지만, 반대로 테스트 데이터의 성능이 올라갈 여지가 있음에도 훈련을 덜 한 상태가 있을 수 있다. 이러한 경우를 과소적합(Underfitting)이라 한다. 훈련자체가 부족한 상태이므로 훈련데이터에 대해서도 보통 정확도가 낮다는 특징이 있다.

딥 러닝을 할 때는 과적합을 막을 수 있는 드롭 아웃(Drop out), 조기 종료(Early Stopping)과 같은 몇 가지 방법이 존재한다.
그 전까지 차근차근 공부해 나가자~!



reference