ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 혼공머신 CH 09 텍스트를 위한 인공 신경망
    Study/머신러닝 딥러닝 2025. 9. 29. 16:04

    목차

     

    들어가며

     

    1. IMDB 데이터 전처리: 텍스트를 숫자로 바꾸는 과정

     

    1-1. 데이터 로드 및 토큰

    1-2. 가변 길이 처리: 패딩

     

    2. 단어 표현 방식: 원-핫 인코딩 vs. 임베딩

     

    2-1. 비효율적인 방식: 원-핫 인코딩의 문제점

    2-2. 효율적인 방식: 임베딩 층의 도입과 성능 향상 

     

    3. 고급 순환 모델: LSTM과 GRU 셀

     

    3-1. LSTM 셀: 장기 의존성 해결을 위한 게이트 구조

    3-2. GRU 셀: LSTM의 간소화와 성능 비교

    3-3. 다층 순환 신경망 구성과 드롭아웃 적용

     

    4. GRU 모델의 최종 성능 확인

     

    마치며

     


     

    들어가며:

     

    순차 데이터의 구조적 학습 순환 신경망(RNN)은 텍스트, 음성, 시계열 데이터와 같이 순서가 중요한 순차 데이터를 처리하기 위해 설계된 딥러닝 모델입니다. 이전 시점의 정보를 기억하고 다음 시점의 처리에 활용하는 순환 고리(Recurrence Loop)를 통해 데이터의 문맥(Context)을 파악합니다. 본 포스팅에서는 IMDB 영화 리뷰 데이터셋을 활용하여 RNN의 기본 구조부터 고급 셀(LSTM, GRU)까지 단계적으로 구현하고 분석합니다.

     


     

    1. IMDB 데이터 전처리: 텍스트를 숫자로 바꾸는 과정

    IMDB 리뷰 데이터셋은 긍정(1)과 부정(0)을 분류하는 이진 분류(Binary Classification) 문제입니다.

    1-1. 데이터 로드 및 토큰화

    케라스는 리뷰의 각 단어를 빈도 순으로 고유한 정수 인덱스(토큰)로 변환한 상태로 데이터를 제공합니다.

    • 가장 자주 등장하는 500개의 단어(num_words=500)만을 사용해 데이터를 로드했습니다.
    from keras.datasets import imdb
    (train_input, train_target), (test_input, test_target) = imdb.load_data(num_words=500)
    
    # 훈련 데이터셋과 검증 데이터셋 분리 (8:2 비율)
    from sklearn.model_selection import train_test_split
    train_input, val_input, train_target, val_target = train_test_split(
        train_input, train_target, test_size=0.2, random_state=42)
    

    1-2. 가변 길이 처리: 패딩(Padding)

    리뷰마다 길이가 다르기 때문에, 모든 샘플의 길이를 100으로 통일하는 패딩을 적용합니다.

    • 리뷰 길이가 100보다 길면 앞부분을 자르고, 짧으면 앞부분에 0을 채워 넣습니다. (RNN은 마지막 타임스텝의 정보가 중요하므로, 패딩을 앞쪽에 채우는 것이 일반적입니다).
    • 이후 데이터는 (20000, 100)의 2차원 배열 형태가 됩니다.
    from keras.preprocessing.sequence import pad_sequences
    
    # 최대 길이 100으로 패딩 적용
    train_seq = pad_sequences(train_input, maxlen=100)
    val_seq = pad_sequences(val_input, maxlen=100)
    

     

     


     

    2. 단어 표현 방식: 원-핫 인코딩 vs. 임베딩

    2-1. 비효율적인 방식: 원-핫 인코딩 ()

    원-핫 인코딩은 단어의 개수만큼의 차원(길이)을 만들고, 해당 단어에만 1을 부여합니다.

    • num_words=200을 사용한 경우, 각 단어는 200차원의 벡터로 변환됩니다.
    • 훈련 데이터(train_oh)의 최종 형태는 (20000, 100, 200)으로, 메모리 크기가 3.2 GB에 달하는 등 매우 비효율적입니다.
    • 이러한 방식을 사용한 SimpleRNN 모델은 검증 정확도 72.74%를 기록했습니다.

    2-2. 효율적인 방식: 임베딩 () 층

    임베딩은 각 단어를 더 작고 밀집된 실수 벡터로 표현하며, 이 벡터는 모델 훈련 과정에서 학습되어 단어의 의미적 유사성을 반영합니다. 이는 메모리 효율성을 높이고 성능을 향상시키는 핵심 기술입니다.

    Layer Input/Output Shape Param # Role
    Embedding Input: , Output:  500개 단어를 16차원 벡터로 변환
    SimpleRNN Output:  순차 데이터를 처리하고 최종 은닉 상태(8개)를 출력
    Dense Output:  최종 출력을 0과 1 사이의 확률로 변환
    # Embedding 층을 사용한 SimpleRNN 모델 구성 (Embedding(단어 개수, 임베딩 차원))
    model_emb = keras.Sequential()
    model_emb.add(keras.layers.Embedding(500, 16))
    model_emb.add(keras.layers.SimpleRNN(8))
    model_emb.add(keras.layers.Dense(1, activation='sigmoid'))
    
    # 파라미터 수: 8,209개 (원-핫 인코딩 방식보다 훨씬 효율적)
    
    • 성능: Embedding 층을 사용한 SimpleRNN 모델은 검증 정확도 74.66%를 기록하며, 원-핫 인코딩 방식보다 개선된 성능을 보였습니다.

     

     


     

    3. 고급 순환 모델: LSTM과 GRU 셀

    SimpleRNN은 시퀀스가 길어질수록 앞쪽의 정보를 잃어버리는 장기 의존성(Long-Term Dependency) 문제가 있습니다. LSTM (Long Short-Term Memory)GRU (Gated Recurrent Unit)는 이를 해결하기 위해 등장한 모델입니다.

    3-1. LSTM 셀 ()

    LSTM 셀은 망각, 입력, 출력의 세 가지 게이트(Gate)를 통해 정보를 제어하고, 셀 상태()라는 별도의 장기 기억 통로를 유지합니다.

    • 파라미터 수: LSTM은 SimpleRNN보다 4배 많은 가중치를 사용합니다. SimpleRNN(8개 유닛)이 개의 파라미터를 가졌다면, LSTM(8개 유닛)은 개의 파라미터를 가집니다.
    • 성능: 드롭아웃 없이 훈련했을 때, LSTM 모델의 검증 정확도는 최고 80.92%를 기록하며 SimpleRNN보다 훨씬 강력한 성능을 보여줍니다.
    # LSTM 모델 구성: SimpleRNN을 LSTM 층으로 교체
    model_lstm = keras.Sequential()
    model_lstm.add(keras.layers.Embedding(500, 16))
    model_lstm.add(keras.layers.LSTM(8))
    model_lstm.add(keras.layers.Dense(1, activation='sigmoid'))
    

    3-2. GRU 셀 ()

    GRU 셀은 LSTM 셀의 구조를 간소화한 버전입니다.

    • LSTM의 두 가지 상태(셀 상태, 은닉 상태)를 하나로 통합하고, 게이트를 두 개(업데이트, 리셋)로 줄여 계산 효율성을 높였습니다.
    • 파라미터 수: GRU는 LSTM보다 파라미터 수가 적어 훈련 속도가 빠르며, 성능은 LSTM과 대등하거나 더 나은 경우가 많습니다. GRU(8개 유닛)는 개의 파라미터를 가집니다.

    3-3. 다층 순환 신경망 구성과 드롭아웃 적용

    성능 향상을 위해 순환 층을 두 개 이상 쌓는 다층(Stacked) RNN을 구성할 수 있습니다.

    • return_sequences=True: 중간 순환 층은 다음 순환 층이 모든 타임스텝의 정보를 입력받도록 모든 타임스텝의 은닉 상태를 출력해야 합니다.
    • 드롭아웃 (Dropout): 순환 층은 과대적합이 쉽게 발생하므로, dropout=0.2 매개변수를 사용하여 층 간의 연결을 20% 끊어 과대적합을 방지합니다.
    # 2개 층을 쌓은 LSTM 모델 (중간 층에는 return_sequences=True 필수)
    model_2lstm = keras.Sequential()
    model_2lstm.add(keras.layers.Embedding(500, 16))
    model_2lstm.add(keras.layers.LSTM(8, dropout=0.2, return_sequences=True)) # 다음 층에 모든 시퀀스 출력
    model_2lstm.add(keras.layers.LSTM(8, dropout=0.2))                       # 최종 시퀀스만 출력
    model_2lstm.add(keras.layers.Dense(1, activation='sigmoid'))
    
    • 성능: 2-Layer LSTM 모델은 검증 정확도 최고 81.92%를 기록하며 단일 층 LSTM보다 향상된 성능을 보였습니다.

     


     

    4. GRU 모델의 최종 성능 확인

    GRU 모델에 Embedding과 Dropout을 적용하여 훈련하고, 테스트 세트로 최종 성능을 평가했습니다.

    모델 검증 정확도 (최고)
    SimpleRNN (One-Hot)
    SimpleRNN (Embedding)
    LSTM (단일, Dropout)
    GRU (단일, Dropout)

    훈련된 최적의 GRU 모델(best-gru-model.keras)을 테스트 세트에 적용한 결과는 다음과 같습니다:

    지표 결과
    테스트 손실 (Loss)
    테스트 정확도 (Accuracy)

     

     


     

    마치며:

     

    순환 신경망의 기본인 SimpleRNN부터 시작하여, 장기 기억 능력을 갖춘 LSTM, 그리고 효율성을 높인 GRU에 이르기까지 모델의 발전 과정을 확인했습니다. 특히 GRU와 LSTM 같은 게이트가 있는 순환 셀을 사용할 때, 텍스트의 긴 문맥 정보를 효과적으로 포착하여 분류 정확도가 크게 향상됨을 실습을 통해 알 수 있었습니다.

    최종적으로 임베딩 층()드롭아웃()을 적용하여 훈련된 최적의 GRU 모델(best-gru-model.keras)을 테스트 세트로 평가한 결과는 다음과 같습니다. GRU는 LSTM보다 가벼우면서도 복잡한 텍스트 분류 문제에서 81.90%의 정확도를 달성하며 뛰어난 성능을 입증했습니다.

     

     

     

    코드 출처:

     

    https://github.com/rickiepark/hg-mldl2/blob/main/09-2.ipynb

     

    hg-mldl2/09-2.ipynb at main · rickiepark/hg-mldl2

    <혼자 공부하는 머신러닝+딥러닝(개정판)>(한빛미디어, 2025)의 코드 저장소입니다. Contribute to rickiepark/hg-mldl2 development by creating an account on GitHub.

    github.com

     

     

    https://github.com/rickiepark/hg-mldl2/blob/main/09-3.ipynb

     

    hg-mldl2/09-3.ipynb at main · rickiepark/hg-mldl2

    <혼자 공부하는 머신러닝+딥러닝(개정판)>(한빛미디어, 2025)의 코드 저장소입니다. Contribute to rickiepark/hg-mldl2 development by creating an account on GitHub.

    github.com

     

    강의 출처(내용 출처):

     

    https://www.youtube.com/watch?v=kwQjUGdgEc8&list=PLVsNizTWUw7E2RxZ4aspcR9vNamXccmFE&index=24

     

    https://www.youtube.com/watch?v=FjT77XtsvCE&list=PLVsNizTWUw7E2RxZ4aspcR9vNamXccmFE&index=25

     

     

    https://www.youtube.com/watch?v=TNkzZPmHieI&list=PLVsNizTWUw7E2RxZ4aspcR9vNamXccmFE&index=26

     

Designed by Tistory.