2024년이 '생성형 AI의 태동기'였다면, 2025년은 '리얼타임(Real-time) 상호작용의 시대'라고 볼 수 있습니다.

 

텍스트 채팅을 넘어, 사람과 대화하듯 끊김 없이 음성을 주고받고,

심지어 화면을 보며 이야기하는 멀티모달 경험이 필수가 되고 있습니다.

 

OpenAI Realtime API와 Gemini Live API을 모두 써보면서 느낀점을 적어보겠습니다.

참고로 Open AI Realtime API은 2025년 10월 기준, Gemini Live API는 2025년 12월 기준으로 사용한 경험을 토대로 합니다.

 


요약

비교 항목 OpenAI Realtime API Gemini Live API
기반 모델 gpt-realtime (2025.10) gemini-2.5-flash (2025.12)
음성 품질 (감성) 매우 좋음 매우 좋음
MCP (도구 사용) 다소 불안정, 복잡한 로직에서 헤맴 첫 턴은 완벽, 멀티 턴에서 급격히 저하
맥락 유지 (Context) 비교적 무난함 프롬프트가 길어지면 성능 저하 뚜렷
멀티모달 (Vision) 이미지 전송 방식 (다소 번거로움) Native 지원 (실시간 영상 처리 강점)
주요 한계 기능 수행 시 맥락을 종종 놓침 지속적인 대화 시 집중력(성공률) 저하

 

 

 


Open AI Realtime API 
: 음성 대화는 훌륭하지만, MCP 처리는 불안함

2025년 10월 gpt-realtiem 모델 기준

OpenAI Playground - Open AI Realtime API

 

OpenAI의 Realtime API는 처음 써보자마자 "진짜 사람 같다"는 느낌이 들 정도로 음성 경험(Voice Experience) 자체는 좋았습니다. 하지만 개발 단계에서 MCP(Model Context Protocol, Function Calling)를 붙이는 순간 아래와 같은 문제점을 발견했습니다.

  • 불안정한 도구 호출:
    - 단순한 대화는 잘하지만, 특정 API를 호출해서 데이터를 가져오거나 로직을 수행해야 할 때 의도한 대로 동작하지 않는 경우가 잦았습니다.
    - 유저의 질문에 답변을 할 때 이해를 돕기위한 이미지를 생성하는 MCP를 붙였으나, 3번 중 1번만 이미지를 생성해 줬습니다.
    - 시스템 프롬프트를 아무리 수정해도 이 문제는 해결되지 않았습니다.
    - 다만, 시스템 프롬프트가 짧을 수록 더 잘 동작하는 것 같다는 느낌을 받았습니다.
  • 느낌: 비유하자면 "말은 정말 청산유수인데, 심부름을 시키면 자꾸 까먹거나 딴청을 피우는 친구" 같습니다. 순수 대화용으로는 최고지만, 복잡한 기능을 수행하는 앱에 적용하기에는 신뢰도가 다소 아쉬웠습니다.

 


Gemini Live API
: 첫 번째 대화에는 완벽하게 MCP를 수행하지만, 갈수록 성공률이 낮아짐

2025년 12월 gemini-2.5-flash-native-audio-preview-09-2025 모델 기준

 

Google AI Studio - Gemini Live API

 

  • 놀라운 첫 턴 처리 능력:
    - 첫 번째 질문에 대해서는 MCP(Function Calling)를 포함한 복잡한 명령도 완벽하게 수행합니다.
    - 유저의 첫 번째 질문에는 원하는 이미지 생성 MCP를 90% 이상 호출해 주었습니다.

  • 멀티모달 네이티브:
    - 비디오나 화면을 보면서 대화하는 기능도 매우 빠르고 안정적이어서 시각 정보를 처리하는 능력은 확실히 우위에 있습니다.

  • 급격한 성능 저하:
    - 첫 번째 대화 이후, 두 번째, 세 번째 턴으로 넘어갈수록 MCP 성공률이 현저하게 떨어집니다.
    - 방금 전까지 잘하던 친구가 갑자기 멍해지는 느낌입니다.

  • 시스템 프롬프트 희석:
    - 특히 페르소나나 복잡한 규칙을 정의하기 위해 시스템 프롬프트가 길어질수록 이 문제가 더 심해졌습니다.
    - 긴 맥락(Context)을 유지하면서 도구(Tool)까지 사용하는 것을 버거워하는 듯했습니다.

  • 느낌: "첫 심부름은 기가 막히게 해내는데, 일을 계속 시키면 집중력이 급격히 떨어지는 직원" 같습니다. 단발성 명령에는 강하지만, 호흡이 긴 연속적인 작업에서는 신뢰하기 어려웠습니다.

 

 


실시간 음성 대화 모델의 한계
: 대화가 길어지거나, MCP가 복잡해질 수록 원하는 결과를 잘 받지 못함

두 모델 모두 훌륭하지만, 실제 서비스를 개발하면서 뼈저리게 느낀 공통적인 한계가 있었습니다.

바로 '대화의 길이'와 '복잡도'를 감당하지 못한다는 점입니다.

 

  1. 토큰 과부하와 맥락 유지 실패:
    - 실시간 음성 대화는 텍스트보다 토큰 소모가 빠릅니다.
    - Gemini는 프롬프트가 길어지거나 대화 턴이 쌓이면 지시 사항을 잊어버리는 경향이 강했고,
    - OpenAI는 MCP 호출 자체가 불안정했습니다.

  2. 서버 터짐 이슈:
    - 대화(Streaming)를 유지하면서 이미지 생성(Heavy Function) 같은 무거운 작업을 요청하면, 응답 지연은 물론이고 웹소켓 연결이 끊어지는 등 서버가 터지는 이슈가 빈번했습니다.

 

현재 기술로는 "복잡한 페르소나를 유지하며 긴 대화를 나누는 것"과 "무거운 기능 수행"을 동시에 완벽히 해내기 어렵다고 느꼈습니다. 결국 대화 턴을 짧게 끊거나, 중요 기능은 첫 턴에 몰아서 처리하는 식의 편법이 필요해 보입니다.

ROC 곡선(Receiver Operating Characteristic Curve)

ROC 곡선(Receiver Operation Characteristic Curve:  수신자 조작 특성 곡선)은 모든 분류 임계값(Classification Thresholds)에서 분류 모델의 성능을 보여주는 그래프입니다. 이 곡선은 두 매개변수를 갖습니다.

  • TPR(True Positive Rate): 참 양성 비율(= 재현율)
    => TPR = TP / (TP + FN)

  • FPR(False Positive Rate): 허위 양성 
    => FPR = FP / (FP + TN)

ROC 곡선은 다양한 분류 임계값의 TPR과 FPR을 나타냅니다. 분류 임계값을 낮추면 더 많은 데이터가 양성으로 분류되어 거짓 양성(FP)과 참 양성(TP) 모두 증가하게 됩니다. 아래의 그림은 일반적인 ROC 곡선을 나타냅니다.

ROC 곡선은 FP 비율에 대한 TP의 비율을 나타내는 곡선으로 FP 비율값이 낮으면서 TP 비율값은 높은 것이 더 좋은 정확도를 보이는 좋은 모델입니다. 이에 따라 곡선이 위로 볼록할 수록 더 좋은 모델입니다.

(참고 링크: 조대협의 블로그 - 분류모델(Classification)의 성능 평가)



AUC(Area Under the ROC Curve: ROC 곡선의 아래 영역)

AUC는 ROC 곡선의 아래 영역을 의미하며 예측이 얼마나 잘 평가되었는지 측정 할 때 사용합니다. 아래의 그림과 같이 ROC 곡선의 아래 영역이 AUC가 됩니다.


AUC를 통해 모델이 임의 양성 예제를 임의 음성 예제보다 더 높게 평가할 확률을 구할 수 있습니다. 에를 들어 다음 예에서는 로지스틱 회귀 예측의 오름차순으로 왼쪽에서 오른쪽으로 정렬되어 있습니다.


여기서 AUC는 임의의 양성(초록색) 예제가 임의의 음성(빨간색) 예제의 오른쪽에 배치되는 확률을 나타냅니다.


AUC는 두 가지 이유로 유용하게 사용 될 수 있습니다.

  • AUC는 척도 불변(Scale-Invariant): 절대값이 아닌, 예측이 얼마나 잘 평가되었는지는 측정

  • AUC는 분류 임계값 불변(Classification-Threshold-Invariant): 어떤 분류 임계값이 선택되었는지와 무관하게 모델의 에측 품질을 측정



분류 모델을 평가하는 방법으로 정확도(Accuracy) 외에도 정밀도와 재현율 이란 것이 있습니다. 이에 대한 이해를 도울 수 있는 좋은 자료를 아래의 링크로 첨부하겠습니다. 한 번 읽어 보시는 걸 추천드립니다!


링크: 조대협의 블로그 - 분류모델(Classification)의 성능 평가


이 포스트에서는 Machine Learning Crash Course에서 다루는 정밀도와 재현율에 관한 내용을 정리하도록 하겠습니다.



정밀도(Precision)

정밀도(Precision): 양성으로 식별된 사례 중 실제로 양성이었던 사례의 비율은 어느 정도인가요?


정밀도는 다음과 같이 정의 됩니다.(거짓 양성이 없을 경우 모델의 정밀도는 1.0)



그럼 이번에는 이전 포스트에서 다룬 예시를 통해 정밀도를 계산해 보도록 하겠습니다.


이 모델에서는 어떤 종양이 악성일 것이라고 평가했을 때, 이 평가가 정확할 확률이 50%입니다.



재현율(Recall)

재현율(Recall): 실제 양성 중 정확히 양성이라고 식별된 사례의 비율은 어느 정도인가요?


재현율은 다음과 같이 정의 됩니다.(거짓음성이 나오지 않는 모델의 재현율은 1.0)



위의 예시 이미지에서 종양 분류 모델의 재현율을 계산해면 다음과 같습니다.



이 모델에서는 모든 악성 종양 중 11%만 정확하게 식별됩니다.



정밀도 및 재현율의 줄다리기

모델이 좋은 모델인지 평가하는데 정밀도와 재현율을 모두 검사해야 합니다. 정밀도와 재현율은 서로 상충하는 관계에 있는 경우가 많아, 보통 정밀도가 향상되면 재현율이 감소하게 됩니다.


스팸 메일을 분류하는 예제를 통해 정밀도와 재현율이 줄다리기를 하는 모습을 알아보도록 하겠습니다.


로지스틱 회귀 모델로 출력된 결과를 특정 지점을 분류 임계값으로 정해 스팸 메일을 분류하도록 하겠습니다. 위의 예시를 토대로 나타나는 이진 분류 표는 다음과 같습니다.



이 분류 임계값에서 산출되는 정밀도와 재현율은 다음 같습니다.




여기서 정밀도는 정확하게 분류된 스팸으로 신고된 이메일의 비율 말하며, 재현율은 정확하게 분류된 실제 스팸 이메일의 비율을 나타냅니다.

분류 임계값을 증가 시킬 경우


분류 임계값을 위와 같이 좀 더 높게 설정해 보도록 하겠습니다. 이 경우 이진 분류 표와 산출되는 정밀도와 재현율은 다음과 같습니다.





분류 임계값을 증가 시켰을 경우, 허위 양성(FP)의 수는 감소하지만 허위 음성(FN)의 수는 증가하게 됩니다. 이로 인해 정밀도는 증가하는 반면 재현율은 감소합니다.


분류 임계값을 감소 시킬 경우

분류 임계값을 위와 같이 낮게 설정해 보도록 하겠습니다. 이 경우 이진 분류 표와 산출되는 정밀도와 재현율은 다음과 같습니다.





분류 임계값을 감소 시켰을 경우, 허위 양성(FP)의 수는 증가하지만 허위 음성(FN)의 수는 감소하게 됩니다. 이로 인해 정밀도는 감소하는 반면 재현율은 증가합니다.


이렇게 분류 임계값에 따라 정밀도와 재현율은 줄다리기를 하는 것을 알 수 있습니다.

이번 포스트에서는 분류 작업에 로지스틱 회귀를 사용하는 방법과 분류 모델의 효과를 평가하는 방법에 대해서 알아보겠습니다.


로지스틱 회귀 모형에서 특정 이메일에 관해 스팸일 확률이 0.95가 반환 되었다면 이 이메일은 스팸일 가능성이 매우 높은 메일로 예측 할 수 있습니다. 이와 반대로 동일한 로지스틱 회귀 모형에서 예측 점수가 0.03인 이메일이라면 이 이메일은 스팸이 아닐 가능성이 높습니다.


그렇다면 만약 스팸이 확률이 0.6인 이메일은 어떻게 처리해야 할까요?


임계값(Threshold)

우리는 이렇게 애매한 값을 이분법으로 확실히 분류를 할 기준이 필요로 합니다. 이 기준을 바로 임계값(Threshold)라고 합니다. 로지스틱 회귀 값을 이진 카테고리에 매핑(Mapping)하려면 분류 임계값(Classification Threshold, 결정 임계값이라고도 함)을 정의해야 합니다.


임계값보다 높은 값은 '스팸'을 나타내고 임계값보다 낮은 값은 '스팸이 아님'을 나타냅니다. 분류 임계값은 항상 0.5여야 한다고 생각하기 쉽지만 임계값은 문제에 따라 달라지므로 값을 조정해야 합니다.



참(True)과 거짓(False), 양(Positive)과 음(Negative)

이솝 우화를 통해 발생할 수 있는 4가지 결과를 요약해 보도록 하겠습니다. 



위의 내용에서 다음과 같이 정의해 보겠습니다.

  • "늑대다"는 양성 클래스(Positive Class)라 하겠습니다.
  • "늑대가 없다"는 네거티브 클래스(Negative Class)라 하겠습니다.

'늑대 예측' 모델에서 발생할 수 있는 4가지 결과를 요약하면 다음과 같이 2X2 혼동행렬(Confusion Matrix)을 사용해 나타낼 수 있습니다. 


  • 참양성(True Positive)는 모델에서 Positive Class정확하게 평가하는 결과입니다. 마찬가지로 참음성(True Negative)은 모델에서 Negative Class정확하게 평가하는 결과입니다.
  • 거짓양성(False Positive)는 모델에서 Positive Class잘못 예측한 결과입니다. 거짓음성(False Negative)은 모델에서 Negative Class잘못 예측한 결과 입니다.


혼동행렬이란, 라벨과 모델의 분류 사이의 상관관계를 요약한 NxN 표입니다. 혼동행렬의 축 중 하나는 모델이 예측한 라벨이고, 다른 축은 실제 라벨입니다.


앞서 우리는 선형 회귀를 통해 주어진 데이터가 연속적인 값일 경우 하나의 선으로 회귀시키는 예측 모델을 만들었습니다. 그런데 만약 주어지는 데이터가 범주형이거나 특정 분류로 나눠지는 데이터일 경우 어떻게 해야 할까요?


예를 들어서 동전이 앞면이 나올지 뒷면이 나올지, 아니면 내일 비가 올지, 맑을지, 구름이 낄지 등과 같이 수량이 아닌 확률과 같은 범주형으로 데이터가 주어지는 경우 처럼 말이죠.


이때 사용하는 방법이 바로 로지스틱 회귀(Logistic Regression)입니다.


로지스틱 회귀(Logistic Regression)

로지스틱 회귀법은 주어진 데이터가 1, 2, ..., 100 처럼 연속적인 값이 아닌, 동전이 앞면이 나올 확률, 내일 비가 올 확률과 같이 특정 분류로 나누어 지거나, 확률적으로 나타나는 데이터를 하나의 선으로 회귀 시켜 예측 모델을 만드는 방법입니다.


어떤 강아지가 밤에 짖는 확률은 로지스틱 회귀 모델로 아래처럼 표현 할 수 있습니다.


p( bark | night ) = 밤에 강아지가 짖을 확률


우리는 로지스틱 회귀를 통해 반환된 확률을 두 가지 방법으로 사용할 수 있습니다.

  • 반환된 확률을 있는 그대로 사용
    => p( bark | night ) = 0.05 라고 가정하겠습니다. 우리는 이 정보를 통해 1년에 강아지가 얼마나 짖는지를 로지스틱 회귀 값을 그대로 사용하여 알아 낼 수 있습니다. (p( bark | night ) * 365 = 0.05 * 365 = 18)

  • 반환된 확률을 이진 카테고리로 변환하여 사용
    => 내일 비가 온다/안 온다와 같이 Yes or No의 형태로 매핑(Mapping)하여 사용할 수 있습니다.

시그모이드 함수(Sigmoid Function)

로지스틱 회귀 모델 결과 값이 어떻게 항상 0 과 1 사이의 값으로 나타나는지 궁금할 수 있습니다. 이는 아래와 같이 정의된 시그모이드 함수로 인해 0과 1사이의 값을 출력해 냅니다.


  • y: 특정 예에 대한 로지스틱 회귀 모델의 출력

  • z: b + W1X1 + W2X2 + ... + WnXn    (b: 편향(Bias), w: 모델이 학습된 가중치(weight), x: 특정 값(Feature))

시그모디으 함수의 그래프는 다음과 같이 S자 모양으로 나타납니다. 실제로 많은 자연, 사회현상에서는 특정 변수에 대한 확률값이 선형으로 나타나지 않고, S자 커브 형태로 나타나는 경우가 많습니다.



로그 손실(Log Loss)

로그시틱 회귀 모델에서의 손실 함수는 로그 손실(Log Loss)로 다음과 같이 정의 됩니다.


  • (x,y) ∈ D: 라벨이 있는 예(x, y 쌍)가 많이 포함된 데이터 세트

  • y: 라벨이 있는 예의 라벨(로지스틱 회귀이므로 y 값은 모두 0 또는 1)

  • y': x의 특성 세트에 대한 예측 값(0 ~ 1 사이의 값)


앞의 포스트에서 우리는 L2 정규화를 통해 모델이 학습 데이터에 과적합 되는 것을 막는 방법을 배웠습니다. 그럼 우리는 어느정도 정규화를 해야 좋은 모델을 얻을 수 있을까요?


이번 포스트에서는 정규화 항에 람다(Lambda)라는 정규화율(Regularization Rate)을 곱하여 정규화의 정도를 조정하는 것에 대해서 알아보도록 하겠습니다.


람다(Lambda)

람다(Lambda)란 얼마나 정규화를 할지 조정하는 정규화율(Regularization Rate)입니다. 

만약 람다 값을 높인다면 정규화 효과가 강화되어 아래와 같이 정규 분포 모양의 그래프가 그려집니다.


람다 값이 높은 모델 가중치 분포 그래프를 보면, 가중치의 평균 값에 가장 많은 빈도가 발생하는 뚜렷한 정규 분포의 모양을 나타내는 것을 알 수 있습니다.


만약 람다 값을 낮춘다면 아래와 같이 좀 더 평평한 모델 가중치 분포 그래프가 그려집니다.



단순성(Simplicity)과 학습 데이터 적합성(Training-Data-Fit)의 균형

우리가 적절한 람다 값을 선택할 때 고려해야하는 것은 바로 단순성과 학습 데이터 적합성 사이에 적절한 균형을 맞추는 것입니다.

  • 람다 값이 너무 높은 경우: 모델은 단순해지지만 데이터가 과소적합해질 위험이 있음
    => 모델이 학습 데이터에 대해 충분히 학습하지 못할 수 있음

  • 람다 값이 너무 낮은 경우: 모델은 더 복잡해지고 데이터가 과적합해질 위험이 있음
    => 모델이 학습 데이터의 특수성을 너무 많이 학습하게 되어 새로운 데이터로 일반화하지 못함


이번 포스트에서는 우리가 학습시키는 모델이 주어진 데이터 세트에만 과적합 되는 것을 방지하기 위해 정규화를 하는 방법에 대해서 다뤄보도록 하겠습니다.


위의 그림은 반복 학습 횟수에 대해 학습 세트(Training Data)와 검증 세트(Validation Data)의 손실을 일반화된 곡선으로 보여줍니다.


이를 보면, 학습 손실은 점차 감소하지만 검증 손실은 어느 순간부터 증가하는 것을 나타냅니다. 즉, 이 일반화 곡선은 모델이 학습 세트에 과적합되어 있다는 것을 의미합니다.



정규화를 통한 과적합 줄이기

정규화란, 모델의 복잡도에 패널티를 줌으로써 과적합을 줄이는 것을 말합니다. 정규화 전략에는 크게 2가지가 있습니다.

  • 조기중단: 학습 데이터에 대해 손실이 특정 값에 수렴하기 전에 학습을 중단하는 방법
    => 위의 그림에서 검증 세트에 대한 손실율이 올라가는 지점, 즉 학습 데이터에 대해 손실율이 수렴하기 전에 학습을 중단하는 것입니다.

  • 모델 복잡도에 패널티를 부여: 학습하는 동안 모델에 패널티를 주어 학습 데이터에 과적합하지 않게 복잡성을 줄이는 방법

다음으로 모델 복잡도에 패널티를 부여하여 모델을 일반화하는 정규화 방법을 알아보도록 하겠습니다.


경험적 위험 최소화 -> 구조적 위험 최소화

우리는 이전까지 모델이 데이터에 대해 발생하는 손실을 최소화하는 것만을 목표로 삼았습니다. 이를 경험적 위험 최소화라고 합니다.


경험적 위험 최소화(Empirical Risk Minimization): minimize( Loss( Data | Model ) )


경험적 위험 최소화 방법은 학습 데이터에 대한 최소 손실을 알려주지만, 학습 데이터에만 과적합한 모델이 될 수 있습니다.]

이제부터 우리는 손실을 최소화하는 목표에 모델의 복잡도를 낮추어 좀 더 일반화된 모델을 만드는 목표를 추가하도록 하겠습니다. 이를 구조적 위험 최소화라고 합니다.


구조적 위험 최소화(Structural Risk Minimization): minimize( Loss( Data | Model ) + complexity( Model ) )


지금부터 우리의 학습 최적화 알고리즘은 모델이 데이터에 얼마나 적합한지 측정하는 손실 항(Loss Term)과 모델 복잡도를 측정하는 정규화 항(Regularization Term)의 함수가 됩니다.


모델 복잡도를 정의하는 방법

본 머신러닝 스터디 과정에서는 일반적으로 사용되는 2가지 방법으로 모델 복잡도를 표현할 것 입니다.

  • 모든 특성(Feature)의 가중치(Weight)에 대한 함수
    => 가중치의 절대값이 낮은 것을 더 선호(높은 절대값을 사용하는 특성 가중치는 낮은 절대값을 사용하는 특성 가중치보다 더 복잡함)

  • 0이 아닌 가중치를 사용하는 특성(Feature)의 총 개수에 대한 함수
    (차후 포스트에서 이 접근 방식을 다룸)

이번 포스트에서는 정규화 방법 중 L2 정규화(L2 Regularization)공식에 대해서 알아보도록 하겠습니다. 



L2 정규화(L2 Regularization)

L2 정규화란, 가중치의 제곱의 합에 비례하여 가중치에 패널티를 주는 정규화 방법입니다. 즉, 가중치가 클수록 큰 패널티를 부과하여 과적합을 억제하는 것 입니다.

L2 정규화 공식을 통해 복잡도를 수치화할 수 있습니다.



이 공식에서 0에 가까운 가중치는 모델 복잡도에 거의 영향을 미치지 않는 반면, 어떤 값이 비이상적으로 크다면 큰 영향을 미칠 수 있습니다.


L2 정규화를 통해 가중치들은 전체적으로 고르고 작은 값을 선호하게 됩니다. 만약 튀는 값(이상점)이 있거나 전체적으로 가중치의 크기가 커지면 정규화 손실(R(w))값이 커집니다.

https://de-novo.org/tag/regularization/


L2 정규화가 모델에 끼치는 영향

  • 가중치 값을 0으로 유도(정확히 0은 아님)
  • 정규 분포(종 모양)를 사용하여 가중치 평균을 0으로 유도


앞에서 우리는 주어진 데이터 세트에만 과적합한 모델을 만드는 것을 방지하기 위해서 두 개의 하위 세트(학습 세트, 테스트 세트)로 나누어 일반화 시킨 모델을 만들었습니다.


하지만 여전히 이 방법에도 문제점이 하나 있습니다. 바로 학습 세트로 학습 시키고 테스트 세트로 테스트를 진행해 초매개변수를 조정하여 얻어낸 모델이 이번에는 테스트 세트에 과적합한 모델이 될 수 있다는 것입니다.


세 개의 세트로 분할: 학습 세트(Training Set), 검증 세트(Validation Set), 테스트 세트(Test Set)

이렇게 데이터 세트를 두 개로 나누는 것 보다 더 좋은 방법이 있습니다. 주어진 데이터를 세 개의 세트로 나누는 것입니다. 데이터 세트를 학습 세트(Training Set), 검증 세트(Validation Set), 테스트 세트(Test Set)로 나누어 테스트 세트에 과적합한 모델이 될 가능성을 크게 낮출 수 있습니다.


학습 세트를 통해 학습된 모델을 바로 테스트 세트로 결과를 얻는 것이 아닌, 검증 세트를 사용하여 학습 세트의 결과를 평가합니다. 검증 세트의 결과에 따라 모델을 조정하여 가장 우수한 결과를 보이는 모델을 선택한 후, 이 모델을 테스트 세트를 사용하여 다시 평가하는 것입니다.


검증 세트를 활용한 우수한 모델 선택 과정

  1. 학습 세트로 모델을 학습
  2. 학습된 모델을 검증 세트 모델로 평가
  3. 검증 세트 결과에 따라 모델을 조정하고 다시 학습
  4. 검증 세트에서 가장 우수한 결과를 보이는 모델을 선택
  5. 그 모델을 테스트 세트로 모델을 평가

Tip

테스트 세트와 검증세트는 반복적으로 사용함에 따라 마모됩니다. 즉, 초매개변수 설정 또는 기타 모델 개선을 결정할 때와 같이 데이터를 더 많이 사용할수록 이러한 결과가 아직 주어지지 않은 새로운 데이터까지 일반화될 가능성이 낮아지게 되는 것 입니다.
(일반적으로 검증 세트보다 테스트 세트의 마모 속도가 더 빠름)

가능하면 데이터를 더 수집하여 테스트 세트와 검증 세트를 갱신하는 것이 좋습니다. 각 세트를 초기화하고 데이터 세트로 부터 처음부터 다시 설정하는 것도 좋은 재설정 방법입니다.


앞의 포스트를 통해 우리는 일반화를 하기 위해서는 주어진 데이터 세트를 두 개의 하위 세트(학습 세트와 테스트 세트)로 나눠야 한다고 했습니다.


학습 세트와 데이터 세트의 개념

  • 학습 세트(Training Set): 모델을 학습시키기 위한 데이터 세트의 일부분
  • 테스트 세트(Test Set): 모델을 테스트하기 위한 데이터 세트의 일부분

그렇다면 주어진 데이터 세트를 학습 세트와 테스트 세트로 나눌 때 몇 대 몇의 비율로 나누는 것이 좋을까요?


데이터 분할


보통 학습 세트와 테스트 세트로 나눌 때 보통 8:2의 비율이 되게 데이터 세트를 분할 합니다. 이는 데이터 분석자의 편의에 따라 임의로 조절이 가능합니다. 테스트 세트는 반드시 다음의 두 가지 조건을 만족해야 합니다.


테스트 세트의 조건

  • 통계적으로 유의미한 결과를 도출할 만큼 테스트 데이터가 커야 한다.
  • 데이터 세트를 전체적으로 나타내야 한다.
    => 테스트 세트가 한 쪽에 치우치치 않고 학습 세트와 같은 특징을 가지도록 선별해야 한다.

유의 사항: 테스트 데이터로 학습하지 말 것!

모델을 학습 시킬 때 주의해야 할 것이 있습니다. 바로 테스트 데이터로 모델을 학습시키지 않는다는 것입니다. 모델 학습은 학습 세트로만 진행하며 테스트 데이터는 일반화가 잘 되었는지 확인하는 척도로만 사용되어야만 합니다.


만약 모델의 예측 결과가 이상할 정도로 좋은 결과가 나온다면 실수로 테스트 세트로 학습을 시킨 것은 아닌지, 학습 세트에 테스트 세트가 들어간 것은 아닌지 확인을 해보아야 합니다.


학습 세트와 테스트 세트를 통해 일반화된 좋은 모델을 선택하는 과정


여기서 모델을 조정한다는 것은 초매개변수인 학습률(Learning Rate) 조절, 특성(Feature)의 추가 삭제, 완전히 새로운 모델 설계와 같이 모델에서 가능한 모든 요소를 조정하는 것을 의미합니다.

과적합(Overfit)과 일반화(Generalization)

아래의 같이 감기에 걸리 사람과 건강한 사람의 분포 데이터가 주어졌다고 가정하겠습니다. 이 데이터를 우리는 어떻게 분류할 수 있을까요?


과적합(Overfit)

아래와 같이 감기걸린 사람과 건강한 사람을 정확하게 나누는 경계를 그을 수 있을 것입니다.

정확하게 경게를 나눈다면 모델이 학습하는 동안에는 손실이 적지만, 새로운 데이터가 들어왔을 때 잘 예측을 하지 못하는 문제가 발생합니다. 이렇게 주어진 샘플을 필요이상으로 복잡하게 분류한 상태을 과적합하다라고 말합니다.


과적합한 모델: 현재 샘플에 필요 이상으로 정확한(복잡한) 모델


과적합은 모델이 새 데이터에 맞게 잘 일

아래의 그림은 과적합 모델에 새로운 데이터가 들어왔을 때 예측이 어긋나는 경우가 발생하는 것을 보여줍니다.



일반화(Generalization)

그렇다면 감기환자와 건강한 사람을 아래와 같이 나누면 어떨까요?

이렇게 단순하게 모델을 만든다면 모델을 학습시키는데 손실이 조금 발생하지만, 새로운 데이터에 대한 예측은 위에서 다룬 과적합한 모델보다는 더 뛰어날 것입니다.


이렇게 학습에 사용되는 데이터에는 조금 손실이 발생하더라도 새로운 데이터에 대해 올바른 예측을 수행하는 능력을 일반화라고 합니다.

일반화: 모델을 단순화시켜 새로운 데이터에 대한 에측성을 높이는 방법


머신러닝의 목표는 이전에 보지 못한 새 데이터를 잘 예측하는 것입니다. 즉, 학습에 사용되는 데이터에서 조금 손실을 보더라도 일반화를 통해 모델을 단순화시켜 새로운 데이터에 대한 예측 정확도를 높인다면 더 좋은 모델입니다.


어떻게 일반화(단순화) 시킬 것인가?

우리에게는 이미 발생한, 즉 주어진 데이터 밖에 갖고 있지 않습니다. 일반화를 하려면 학습 데이터 뿐만 아니라 새로운 데이터가 필요로 합니다. 그렇다고 새로운 데이터가 발생할 때마다 학습시켜 모델을 일반화 하는 것에는 한계가 있습니다.

그래서 우리는 주어진 데이터는 두 세트로 나누어 모델을 학습시키고 마치 새로운 데이터가 주어진 것처럼 테스트를 하여 일반화를 진행 할 수 있습니다.
  • 학습 세트(Training Set): 모델을 학습시키기 위한 데이터 세트
  • 테스트 세트(Test Set): 모델을 테스트하기 위한 데이터 세트

좋은 일반화를 하려면 테스트 세트가 다음의 조건을 만족해야 합니다.
  • 테스트 세트의 데이터가 충분히 많아야 한다.
  • 같은 테스트 세트를 반복해서 사용하지 않는다.

일반화를 하기 위한 전제 조건

모델을 일반화 하기 위해서는 다음의 세 가지 전제 조건을 총족해야 합니다.

  • 데이터를 독립적이고 동일하게(Independently and Identically => i.i.d) 추출해야 한다.
    즉, 각 예(Example)가 서로 영향을 미치지 않아야 한다.
  • 데이터가 변하지 않아야(Stationary) 합니다.
  • 같은 집단(Same Distribution)에서 데이터의 예를 추출해야 합니다.


+ Recent posts