티스토리 뷰

머신러닝의 정의와 사용 이유

사람이 정의한 알고리즘으로 특정 문제를 풀려면 규칙이 간단하다면 쉽겠지만 복잡할수록 어려워진다.

게다가 들어오는 데이터가 변화하고 규칙도 변화한다면? 매번 사람이 알고리즘을 뜯어 고쳐야한다.

하지만 기계에게 데이터를 던져주고 알아서 규칙을 학습하여 적용한다면? 난이도가 쉬워진다.

게다가 기계가 학습한 규칙을 분석한다면 우리가 알지 못하던 패턴을 알아낼 수 있다 (데이터 마이닝)

 

기계가 그렇다면 데이터를 어떻게 학습할까? 우선 4가지로 분류가 가능하다.

 

1. 지도학습 (supervised learning)

지도학습을 위해 투입되는 모든 훈련 데이터에는 그에 해당하는 답인 "레이블"이 포함된다.

보통 기계가 데이터들을 읽어서 원하는 레이블을 출력하도록 학습시키는 분류(classification)가 지도 학습에 속한다.

 

또는 데이터를 읽고 특정 값, 수치를 예측하는 회귀(regression) 또한 지도학습에 속한다.

(원래는 예측 변수라고 부르는 특성을 이용하여 예측한다고 하는데 여기서 특성 속성(attribute)에 값이 붙은 것이다)

물론 회귀는 특정 클래스에 속할 확률을 출력하는 분류 문제에 이용될 수 있다. (로지스틱 회귀)

 

이외에도 K-최근접 이웃, 선형 회귀, 서포트 벡터 머신, 결정 트리와 랜덤 포레스트, 신경망이 지도학습에 포함된다.

 

2. 비지도 학습 (unsupervised learning)

지도학습과 달리 훈련 데이터에 레이블이 없다. 따라서 기계가 알아서 데이터만 가지고 학습해야 한다.

우선 데이터들을 비슷한 특징을 가지는 그룹으로 묶어주는 군집(clustering)이 가능하다.

더 나아가 계층 군집(hierarchical clustering)을 이용하면 각 그룹을 더 세부적인 그룹으로 나눌 수 있다.

 

그리고 레이블이 없는 대규모의 고차원 데이터들을 시각적으로 어떻게 조직되어 있는지 2D나 3D형태로 보여주는

시각화 알고리즘 또한 비지도 학습에 속한다. 

 

처음에는 엄청 섞여있었지만 사진처럼 나누어진다.

 

그리고 차원축소(dimensionality reduction)라고 해서 정보를 잃지 않으면서 데이터를 단순화 시켜주는 작업이 있다.

이를 구현하기 위해 상관관계가 있는 여러 특성들을 하나의 특성으로 묶어줄 수 있고 (특성추출)

반대로 필요없는 특성들을 제거하고 필요한 특성들만 선택할 수 있다 (특성선택)

 

그리고 이상치 탐지(outlier detection) 특이치 탐지(novelty detection)과 같이 한 샘플에 대하여 이전 샘플들과 같은 그룹에 속하는지를 알아낼 수 있다. 

보통 남기고 싶은 샘플들을 good, clean data라고 부르는데 이상치 탐지는 현재 보유한 데이터 샘플들에 대하여서 이상치를 찾아내는 것이고 특이치 탐지는 새로 들어오는 샘플에 대하여 깨끗한 샘플들과 유사한지를 확인한다.

 

3. 준지도 학습 (semi supervised learning)

일부만 레이블이 붙은 데이터를 다루는 경우 지도학습과 비지도 학습을 조합하여서 이용할 수 있다.

보통은 레이블이 없는 샘플이 있는 샘플보다 훨씬 많기 때문에 이런 경우 준지도 학습이 이용된다.

비지도 학습을 통해 군집된 데이터들이 지도 학습을 통해 알아낸 가장 가까이 있는 데이터들과 유사하다고

생각할 수 있고 해당 데이터의 레이블을 가진다고 할 수 있다.

 

저기 있는 데이터의 클래스는 세모라고 추측할 수 있다.

 

예를 들어 심층 신뢰 신경망 (Deep Belief Network)는 여러 겹으로 쌓인 제한된 볼츠만 머신에 기초한다.

Restricted Boltzmann Machine (RBM)이 비지도 학습 방식으로 훈련되면 전체 시스템인 DBN이 지도학습으로 훈련된다.

정확히는 RBM은 현재 가중치값을 기반으로 입력값이나 출력값(정확히는 확률분포)을 예측하도록 훈련되는데 이 때는 비지도 학습 방식으로 진행된다. 이후 다수의 훈련된 RBM값들을 가지고 이어줄 때는 지도학습 방식으로 진행된다.

(그 와중 RBM 자체는 이분 그래프이고 DAG라는 것이 보장된다)

 

 

초보자용 RBM(Restricted Boltzmann Machines) 튜토리얼

RBM의 정의와 구조

medium.com

 

4. 강화학습

기존에는 학습하는 시스템을 모델이라 불렀지만 강화학습에서는 에이전트라고 부른다.

에이전트가 실행되는 환경을 관찰하여 행동을 실행하였을 때 보상 또는 패널티를 받을 때

시간이 지나고 가장 큰 보상을 얻기 위해 정책이라고 부르는 최상의 전략을 학습한다.

2017년에 바둑으로 세계를 휩쓴 알파고 역시 강화학습을 통해 학습되었다.

 

 

이외에도 학습방식에 따라 차이를 둘 수 있다.

 

오프라인 학습과 온라인 학습

배치 학습이라고 부르는 오프라인 학습에서는 시스템이 점진적으로 학습될 수 없다.

원래는 가용한 모든 데이터를 사용하여 훈련시켜야 하지만 이러면 시간과 자원이 많이 소모된다.

그렇기에 시스템이 먼저 훈련된 뒤에 훈련을 종료하고 적용될 때는 더 이상의 학습이 이루어지지 않는다.

단지 모델은 배운 내용을 기반으로 돌아갈 뿐이며 이를 오프라인 학습이라고 부른다.

 

이렇다보니 새로운 데이터를 학습하려면 이전 데이터까지 포함한 전체 데이터를 다시 처음부터 훈련시켜야한다.

과정이야 자동으로 이루어지니 상관없지만 시간이 꽤나 걸리고 많은 컴퓨팅 자원이 필요하다 (CPU, GPU, 메모리등)

 

온라인 학습은 데이터를 순차적으로 미니 배치라고 부르는 묶음 단위로 시스템을 훈련시킨다.

이렇다보니 매번 학습단계마다 적은 시간과 컴퓨팅 자원이 소모된다. 그래서 점진적 학습이라고 부르기도 한다.

 

게다가 컴퓨터안에 모든 데이터를 저장할 수 없더라도 일부만 가져와서 훈련시킴으로서

아주 큰 데이터 셋을 훈련시킬 수 있다. 이를 외부 메모리 (out of core) 학습이라고 한다.

 

온라인 학습에서는 한번에 얼마나 시스템을 변화시킬지를 정하는 학습률 파라미터가 중요하다.

학습률이 높을수록 시스템이 빠르게 적응하겠지만 이전 데이터를 잘 잊어버리게 된다.

반대로 학습률이 낮아면 시스템이 느리게 학습되겠지만 안좋은 데이터에 대해 덜 민감해진다.

 

특히 온라인 학습에서는 모든 데이터에 대해 업데이트가 일어나므로 잡음이나 대표성이 부족한 데이터가 들어온다면

시스템 전체 성능이 감소하게 된다. 따라서 사람이 데이터와 시스템을 모니터링하고 있다가 성능이 감소한다면

즉시 정지시켜야하는 필요가 있다.

 

사례 기반 학습과 모델 기반 학습

사례기반 학습은 기존에 있던 샘플들을 기억하고 새로운 데이터에 대해서 비교하는 식으로 진행된다.

즉, 모든 훈련 샘플을 기억하고 있다가 입력 샘플에 대하여서 가장 가까운 샘플을 찾는 식으로 진행된다.

예를 들면 어떤 샘플이 들어왔는데 이 샘플이 개보다는 고양이와 더 많은 유사도를 가진다면 고양이로 판정하는 식으로.

 

모델 기반 학습은 샘플들을 기반으로 모델을 만들어 이를 예측하는데 사용하는 것이다.

가장 대표적인 예시로는 선형 회귀가 있다.

GDP와 삶의 만족도가 비례하는 샘플이 있고 GDP가 주어졌을 때 삶의 만족도를예측하는 모델을 만들어보자.

그러면 데이터들을 봤을 때, 하나의 선형 함수를 통해 표현할 수 있을것이다. (이 둘은 비례하니까)

y=ax+b꼴에서 기울기인 a값과 y절편값인 b값을 적절하게 정해주면 들어오는 새로운 데이터에도 가장 실제와 유사하게 값을 예측할 수 있을 것이다. 이 과정을 선형 회귀(Linear regression)라고 부른다.

 

이처럼 하나의 모델을 생성하여 이를 기반으로 예측을 하는 것을 모델 기반 학습이라고 부른다.

 

머신러닝의 주요 도전 과제

적은 훈련 데이터

최근에는 적은 훈련 데이터 (가장 최근에 봤던건 20개로 95%이상의 정확도를 보였다)를 가지고도 높은 정확도를 보일 수 있지만 여전히 머신러닝이 원활히 작동되기 위해서는 풍부한 데이터를 필요로 한다.

물론 복잡한 문제를 해결하기 위해서 좋은 알고리즘을 이용하는 것보다 데이터를 더 주는 것이 더 효율적임을 "믿을 수 없는 데이터의 효과" 논문에서 보여주고 있지만 여전히 데이터가 적은 경우가 많기에 알고리즘도 중요하다.

 

(참고로 저 논문에서는 문장의 모호함을 해결하는 문제를 다룰 때, 라벨이 안붙었지만 양이 많은 데이터가 이미 많은

디테일들을 포함하기에 라벨이 붙어있지만 양이 적은 데이터와 비교했을 때 거의 비슷한 성능을 가진다는 것을

보여주었다)

 

나쁜 데이터

앞선 문제에서 GDP와 행복은 비례한다고 나와있지만 만약 GDP는 낮지만 행복한 나라가 데이터로 존재한다면 모델 파라미터가 엄청나게 수정될것이다. 실제로 앞선 모델은 실제 세계와 달리 GDP가 적지만 행복한 나라나 그 반대인 국가들을 포함하고 있지 못하다. 따라서 대표성이 부족한 데이터 (샘플링 편향, sampling bias라고 부른다)를 이용할 경우 정확한 예측을 하기가 힘들어진다. 이 때 샘플링 잡음 (sampling noise), 즉 우연에 의해 대표성이 없는 데이터가 생기며 이 경우 데이터 크기가 커지더라도 대표성을 못가질 수 있다.

 

그리고 이상치(outlier)나 에러, 잡음과 같이 데이터가 오염되어 있다면 당연하게도 모델이 잘 돌아갈리가 없다.

이상치는 제외해주는 것이 맞고 샘플 중에 몇몇 특성이 빠져있다면 그 값을 어떻게 채워줄 것인지 결정해야 한다.

(fill_na로 0으로 채울지, 평균으로 채울지 정해주는 것 처럼)

 

그리고 예측과 크게 상관이 없는 특성이 데이터에 존재한다면 특성 선택을 통해 제외해주는 과정이 필요하며

특성 추출과 같이 서로 상관 관계가 있는 특성들을 결합하여 더 유용한 특성을 만드는 과정이 요구된다.

이 모든 과정들을 특성 공학(feature engineering) 이라 부르며 데이터 전처리 과정에서 이루어진다.

 

오버피팅

족보만 외운다고 시험을 잘 볼 수 있는 것이 아니듯이 모델 또한 훈련 데이터에 너무 익숙해지면 새로운 데이터가 들어왔을 때 낮은 acc를 보일 수 있다. 모델 자체가 훈련 데이터에 편향되는 경우 이를 과대적합(overfitting)이라고 부른다.

 

물론 훈련 데이터에 잡음이 많다면 은닉층을 늘리거나 이런 식으로 모델을 복잡하게 짜줄 필요가 있겠지만 그렇지도 않은데 모델이 너무 복잡하다면 훈련 데이터의 불필요한 특성들까지 학습할 가능성이 높아진다.

따라서 은닉층과 같은 파라미터 수를 줄이거나 훈련 데이터를 늘리고 잡음을 줄여줘야한다.

 

또는 모델을 단순하게 만들어주는 과정이 필요한데, 이를 위해 모델에 제약을 가하는 것을 규제라고 부른다.

여러 규제가 있지만 앞선 선형 회귀에서 적용될 수 있는 규제에는 자유도를 조절하는 것이다.

기울기와 절편같이 학습되는 파라미터에 대하여 규제를 걸어서 단순함을 유지하면서도 데이터를 잘 예측할 수 있도록 해주는 것이 중요하다. (물론 진짜 단순하게 기울기를 0으로 두면 정확도가 떨어질테니까)

 

언더피팅

반면 모델이 훈련 데이터를 적게 받거나 모델이 단순한 나머지 제대로 학습되지 못한다면 정확도가 낮아진다.

이를 과소적합(under fitting)이라고 부르고 모델 파라미터를 더 늘려서 복잡하게 만들거나 특성 공학을 통해 학습이 더 쉬워지도록 좋은 특성을 제공하고 아니면 모델의 제약을 더 풀어주면 해결할 수 있다.

(아니면 데이터를 더 주거나)

 

모델 평가

홀드아웃 검증 + K-fold 검증

그동안 훈련 셋과 테스트 셋으로만 나누었지만 데이터를 이제는 훈련 셋, 검증 셋, 테스트 셋 이렇게 3가지로 나누자.

(종종 검증 셋을 dev set이라고도 부른다.)

 

보통은 검증 셋을 훈련 셋보다 작게 두지만 검증 셋이 너무 작으면 제대로 평가가 안되니 적당히 작게만 두면 된다.

 

당연하게도 테스트 셋은 모델이 학습하면 안된다!

 

우선 훈련 세트를 가지고 여러 하이퍼 파라미터를 가진 모델들을 학습 시키고 모든 모델들을 가지고 검증 셋에 대한

정확도를 측정한다.

 

이중에 검증 셋에서 가장 높은 정확도를 가지는 모델을 가지고 훈련셋과 검증셋을 합친 데이터셋으로 훈련 시키고

마지막으로 테스트 셋에서 한번더 돌려봄으로서 모델을 평가한다.

 

이렇게 검증을 두번이나 하는 것은 우리가 검증 셋에서 높은 정확도를 가지더라도 이 모델이 검증 셋에 특화된 가중치를가질 수 있기 때문이다. 

 

그리고 검증 단계에서 여러 검증 셋을 이용하는 방식도 있는데 이를 K-Folds Cross Validation이라고 한다.

우선 전체 훈련 데이터를 K개로 쪼개놓고 홀드아웃 처럼 진행하되, 여기서 나온 에러값들을 평균낸다.

여기서 에러값들의 평균이 가장작은 모델을 선정해서 테스트 셋에서 최종 검증을 진행하게 된다.

 

이렇게 되면 모든 훈련 데이터에 대하여 검증이 가능하므로 unbalanced data에 대해서도 안정적인 모델을 뽑아 낼 수 있으며 정확한 성능을 측정 할 수 있다.

 

다만 시계열 데이터에서는 잘 작동하지않으며 검증 횟수가 K배가 되므로 훈련시간 또한 늘어나게 된다.

 

훈련-개발 셋 (train - dev set)

데이터 불일치

종종 훈련데이터를 다수 얻을 수 있지만 실제 사용되는 데이터와의 대표성이 떨어질 때가 있다.

예를들어 사진작가가 찍은 사진들은 인터넷에 널려있으니 많이 얻을 수 있지만 일반 유저가 특정 어플로 찍은 사진은 되게 얻기가 힘들다. 이때는 검증 셋과 테스트 셋이 최대한 실전에서 기대되는 데이터를 가장 잘 표현하는 것이 중요하다.

따라서 보통은 대표성이 있지만 적은 데이터들을 반반 나누어서 검증 셋과 테스트 셋에 나누어 담는다.

하지만 이렇게 되면 당연하게도 대표성이 떨어지는 데이터를 가지고 훈련한 모델이 검증 셋에서 낮은 정확도를 보이게 된다. 이 경우 이게 대표성 문제인지 아니면 과소, 과대 적합되어 이런 결과가 나온것인지 알 수가 없다.

 

따라서 대표성이 떨어지는 데이터로 구성된 훈련 셋에서 일부를 때어내서 검증을 시도하면 과소, 과대 적합 여부를 판단할 수 있다. 이런 셋을 훈련-개발 셋이라고 부르고 이 셋에서 검증한 다음에 검증 셋에서 검증을 시도한다.

만약 훈련-개발 셋에서는 좋은 성능을 보이지만 검증 셋에서 정확도가 떨어진다면 이는 데이터 불일치에서 온다는 것을 알 수 있다. 만약 훈련-개발 셋에서 나쁜 성능을 보인다면? 그냥 모델 자체가 과소,과대 적합된 것임을 알 수 있다.

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday