Data Science/자연어 처리

RNN LM

Boxya 2025. 4. 11. 22:32

[KT] AIVLE SCHOOL 13일차

 

RNN LM

  • 순환 신경망(RNN)을 활용하여 언어 모델(Language Model)을 구축하는 방법
  • RNN을 활용한 언어 모델의 개념
    • 기존의 N-gram 모델이나 통계 기반 언어 모델은 문맥 정보를 한정된 개수의 단어(e.g. 3-gram, 5-gram)까지만 고려하는 한계
    • 시퀀스 데이터를 다룰 수 있는 구조(RNN) : 문맥(Context)을 길게 유지하며 언어 모델링 수행
    • 입력된 단어들의 연속적인 흐름을 따라 현재까지의 문맥을 기억하여 다음 단어의 확률을 동적으로 계산
  • RNN LM 모델링 순서
    • 전체 프로세스
      1. 준비된 데이터셋
      2. 데이터 전처리
        • 토크나이즈
        • Vocab 생성
        • 정수 인덱스 반환
        • 패딩
      3. 모델링
        • 임베딩
        • 모델링
    • 학습을 위한 데이터 전처리 순서
      • 토크나이즈
        • 데이터 셋의 텍스트 문장을 단어 또는 서브 워드 단위로 분할
      • Vocab 생성
        • 전체 데이터에서 등장하는 토큰들을 모아 고유한 단어 사전 생성
      • 정수 인덱스 변환
        • 생성된 단어 사전을 기반으로 문장의 각 토큰을 고유한 정수 인덱스로 변환
      • 패딩(Padding)
        • 길이가 다른 각 문장의 시퀀스를 동일한 길이로 맞추기 위해 특정 토큰(0 또는 PAD 토큰)을 추가

전처리

  • 토크나이즈 적용
    • 텍스트를 소문자로 변환
    • 토크나이즈
    • 불필요한 단어 제거
    • 토큰화 결과 칼럼으로 저장
  • Vocab 만들기
    • 데이터셋의 모든 단어 모으기
    • 각 단어별 빈도수 계산 (고유한 단어로 집계)
    • 각 단어에 인덱스 부여 (빈도순으로 정렬 후 순차적으로 인덱스 부여)
    • 특수 토큰 추가 (PAD = 0, UNK(Unknown) = 마지막 인덱스)
  • 정수 인덱스로 변환하기
    • 각 문장의 토큰들을 정수 인덱스로 변환
    • Vocab에 없는 단어는 <UNK> 지정
  • Padding
    • 딜레마
      • 문장은 다양한 길이의 시퀀스
      • RNN은 고정 길이의 시퀀스를 입력으로 받음
    • 해결책
      • 모든 문장의 길이를 똑같이 맞추자
    • 길이 맞추기
      • 각 문장별 길이 분포(꼬리가 오른쪽으로 치우친 분포)를 살펴보고 결정 --> 정답은 없음
      • 몇 가지 방법
        • 데이터셋이 크다면 전체 문장의 약 95% 길이에 맞추기
        • 메모리와 성능을 고려해서 적절한 길이 선택 (보통 50 ~ 512 범위)

모델링

  • 기본 입력 값
    • num_layers : LSTM Layer 수 (만약, RNN Layer를 2개 층으로 쌓으려면, num_layer = 2)
    • hidden_size : LSTM의 노드 수
    • output_size : 모델의 최종 출력 노드 수
    • dropout : nn.rnn계열 함수는 dropout 옵션 제공(단, 다층일때만 지원, num_layers=2 -> rnn1 > dropout > rnn2)
  • Embedding
    • 학습을 통해 텍스트 데이터를 벡터화(임베딩)하는 레이어
    • vocab_size 개의 단어를 embedding_dim 차원의 벡터로 변환
    • padding_idx = 0 : <PAD> 토큰 0에 대해 무시(임베딩 안함) -> 임베딩 벡터를[0, 0, ..., 0]으로 고정
    • 학습을 통한 embedding matrix 생성
      • 초기헤는 랜덤 값으로 시작
      • 모델이 학습하면서 의미 있는 단어 벡터로 업데이트 됨
      • 데이터셋 안에서 문장의 주변 단어들에 의해 중심 단어의 의미를 찾아 감
      • 가중치 개수 = vocab_size X embedding_dim
    • 학습에 embedding을 포함시킬 때 장점
      • 특정 태스크(Task)에 맞춘 최적화된 임베딩 학습 가능
        • e.g. "charge" : 금융 도메인 - 요금, 법률 도메인 - 기소
      • 동적 업데이트 가능
        • 모델 학습 과정에서 업데이트되므로 새로운 데이터가 추가될 때 점진적으로 성능을 개선할 수 있음
  • LSTM
    • num_layers = num_layers : LSTM 층(LSTM Layer)의 개수
    • batch_first = True : 입력 데이터의 차원을 (batch_size, seq_length, feature_dim)으로 설정
    • bidirectional = True : 양방향(순방향 + 역방향) LSTM을 함께 학습 -> 문맥을 더 잘 이해
  • 출력 층(Output Layer)
    • hidden_size * 2 : 양방향 LSTM이므로 hidden state의 크기가 2배
    • self.fc(self.dropout(lstm_out[ : , -1 , : ]))
      • 마지막 시점의 hidden state에 dropout을 적용하고 출력층으로 여결
      • LSTM 옵션 dropout은 마지막 LSTM 층에는 적용 안됨 (num_layers = 2 -> rnn1 > dropout > rnn2)

'Data Science > 자연어 처리' 카테고리의 다른 글

RNN(순환 신경망)과 LSTM  (0) 2025.04.11
임베딩 벡터  (0) 2025.04.11
토큰화와 형태소 분석  (2) 2025.04.10
자연어 처리  (2) 2025.04.10