[KT] AIVLE SCHOOL 13일차
RNN LM
- 순환 신경망(RNN)을 활용하여 언어 모델(Language Model)을 구축하는 방법
- RNN을 활용한 언어 모델의 개념
- 기존의 N-gram 모델이나 통계 기반 언어 모델은 문맥 정보를 한정된 개수의 단어(e.g. 3-gram, 5-gram)까지만 고려하는 한계
- 시퀀스 데이터를 다룰 수 있는 구조(RNN) : 문맥(Context)을 길게 유지하며 언어 모델링 수행
- 입력된 단어들의 연속적인 흐름을 따라 현재까지의 문맥을 기억하여 다음 단어의 확률을 동적으로 계산
- RNN LM 모델링 순서
- 전체 프로세스
- 준비된 데이터셋
- 데이터 전처리
- 토크나이즈
- Vocab 생성
- 정수 인덱스 반환
- 패딩
- 모델링
- 임베딩
- 모델링
- 학습을 위한 데이터 전처리 순서
- 토크나이즈
- 데이터 셋의 텍스트 문장을 단어 또는 서브 워드 단위로 분할
- 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" : 금융 도메인 - 요금, 법률 도메인 - 기소
- 동적 업데이트 가능
- 모델 학습 과정에서 업데이트되므로 새로운 데이터가 추가될 때 점진적으로 성능을 개선할 수 있음
- 특정 태스크(Task)에 맞춘 최적화된 임베딩 학습 가능
- 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 |