[논문 리뷰] SLM (Segmental Language Model): 중국어를 위한 비지도 신경 단어 분할

2023. 10. 23. 15:35AI/NLP

중국어 ⓒ인프런

논문 링크

 

요약

SLM은 중국어 단어 분할을 위한 비지도 신경 모델로, 중국어의 특성상 명확한 단어 경계가 없기 때문에 중요한 연구 주제입니다. 이 모델은 중국어의 세그먼트 특성에 집중하여 설계되었습니다.

본 모델의 핵심은 두 가지 주요 구성 요소에 있습니다.

Context Encoder: 이전의 콘텍스트를 인코딩하여 현재 세그먼트의 생성에 필요한 정보를 제공합니다. Segment Decoder: 인코딩된 콘텍스트를 기반으로 각 세그먼트를 점진적으로 생성합니다.


전통적인 언어 모델링은 문자 시퀀스의 결합 확률 함수를 학습하는 것을 목표로 합니다. 그러나 SLM에서는 세그먼트 언어 모델링을 도입하여 문자의 세그먼트 시퀀스의 결합 확률 함수를 학습합니다. 이를 통해 모델은 주어진 문장을 생성하기 위한 모든 가능한 세그먼트의 결합 확률을 계산할 수 있습니다.

SLM은 비지도 학습 방식을 사용하며, 대량의 중국어 텍스트 데이터를 사용하여 학습됩니다. 이 모델은 중국어 단어 분할에 대한 최신 통계 모델과 경쟁력 있는 성능을 보여주며, 중국어 NLP에서의 새로운 접근 방식을 제시합니다.

 

소개

 

중국어는 그 구조와 특성상 명확한 단어 경계가 없는 언어로 알려져 있습니다. 이러한 특성 때문에 중국어 단어 분할은 중요한 연구 주제로 여겨져 왔습니다. 단어 분할은 정보 검색, 기계 번역, 감정 분석 등 다양한 자연어 처리 응용 프로그램에서 핵심 전처리 단계로 사용됩니다.

최근 몇 년 동안, 지도 학습 방식을 사용한 신경 네트워크 기반의 중국어 단어 분할 방법이 큰 관심을 받았습니다. 이러한 방법은 주로 대량의 레이블이 지정된 데이터를 사용하여 모델을 학습시킵니다. 그러나 레이블이 지정된 데이터는 비용이 많이 들고, 모든 도메인이나 응용 프로그램에 적합하지 않을 수 있습니다.

이 문제를 해결하기 위해, 본 연구에서는 중국어 단어 분할을 위한 새로운 비지도 학습 방식을 제안합니다. 이 방식은 Segmental Language Model (SLM)이라고 불리며, 중국어의 세그먼트 특성에 집중하여 설계되었습니다. SLM은 이전 콘텍스트를 인코딩하는 콘텍스트 인코더와 각 세그먼트를 점진적으로 생성하는 세그먼트 디코더로 구성됩니다.

SLM의 주요 목표는 주어진 문장을 생성하기 위한 모든 가능한 세그먼트의 결합 확률을 학습하는 것입니다. 이를 통해, 모델은 주어진 문장의 최적의 단어 분할을 예측할 수 있습니다.

 

아키텍처

 

SLM은 중국어 단어 분할을 위한 비지도 신경 모델로, 중국어의 세그먼트 특성에 중점을 둔 아키텍처를 가지고 있습니다. 이 모델은 주어진 문장을 생성하기 위한 모든 가능한 세그먼트의 결합 확률을 학습하는 것을 목표로 합니다.

1. Context Encoder

이전의 컨텍스트를 인코딩하는 역할을 합니다.
콘텍스트 인코더는 RNN (Recurrent Neural Network)을 사용하여 문자 시퀀스를 처리하고, 이를 통해 현재 세그먼트의 생성에 필요한 정보를 제공합니다.


2. Segment Decoder

인코딩 된 콘텍스트를 기반으로 각 세그먼트를 점진적으로 생성합니다.
세그먼트 디코더는 2-layer LSTM (Long Short-Term Memory)을 사용하여 세그먼트를 생성합니다.


3. Training and Decoding

SLM의 학습은 주어진 텍스트 데이터의 로그 가능도를 최대화하는 방식으로 이루어집니다.
동적 프로그래밍을 사용하여 선형 시간 복잡도로 손실 목표 함수를 계산할 수 있습니다.
최적의 세그먼트를 찾기 위해 동적 프로그래밍을 사용하여 선형 시간 복잡도로 디코딩을 수행할 수 있습니다.


4. Implementation Details

모델은 2-layer LSTM을 사용하여 세그먼트 디코더를 구현하고, 1-layer LSTM을 사용하여 콘텍스트 인코더를 구현합니다.
초기 400단계 동안은 확률적 경사 하강법을 사용하여 모델 매개변수를 최적화하고, 이후에는 Adam 최적화기를 사용하여 모델을 더욱 최적화합니다.
모델의 성능 평가는 표준 단어 정밀도, 재현율, F1 측정 기준을 사용하여 세그먼트 성능을 평가합니다.

 

학습 방법

 

SLM은 주어진 텍스트 데이터의 로그 가능도를 최대화하는 방식으로 학습됩니다. 이를 위해 다음과 같은 핵심 방법론을 사용합니다.

# Google Colab에서 실행 가능한 SLM 코드

import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, TensorDataset, random_split

# 데이터 준비
inputs_data = torch.randint(0, 5000, (10000, 50))
targets_data = torch.randint(0, 5000, (10000, 50))
dataset = TensorDataset(inputs_data, targets_data)

# 데이터셋을 학습 및 검증 데이터셋으로 분할
train_size = int(0.8 * len(dataset))
val_size = len(dataset) - train_size
train_dataset, val_dataset = random_split(dataset, [train_size, val_size])

# DataLoader 설정
batch_size = 64
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
val_loader = DataLoader(val_dataset, batch_size=batch_size, shuffle=False)

class SLM(nn.Module):
    def __init__(self, vocab_size, embedding_dim, hidden_dim):
        super(SLM, self).__init__()
        self.embedding = nn.Embedding(vocab_size, embedding_dim)
        self.context_encoder = nn.LSTM(embedding_dim, hidden_dim)
        self.segment_decoder = nn.LSTM(embedding_dim, hidden_dim)
        self.fc = nn.Linear(hidden_dim, vocab_size)

    def forward(self, x):
        embedded = self.embedding(x)
        context_encoded, _ = self.context_encoder(embedded)
        segment_decoded, _ = self.segment_decoder(context_encoded)
        output = self.fc(segment_decoded)
        return output

# 모델 및 옵티마이저 설정
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = SLM(vocab_size=5000, embedding_dim=256, hidden_dim=512).to(device)
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)
epochs = 10

# 학습 및 검증 루프
for epoch in range(epochs):
    model.train()
    for inputs, targets in train_loader:
        inputs, targets = inputs.to(device), targets.to(device)
        
        optimizer.zero_grad()
        outputs = model(inputs)
        loss = criterion(outputs.view(-1, outputs.size(2)), targets.view(-1))
        loss.backward()
        optimizer.step()

    # 검증 단계
    model.eval()
    val_loss = 0.0
    with torch.no_grad():
        for inputs, targets in val_loader:
            inputs, targets = inputs.to(device), targets.to(device)
            outputs = model(inputs)
            loss = criterion(outputs.view(-1, outputs.size(2)), targets.view(-1))
            val_loss += loss.item()

    val_loss /= len(val_loader)
    print(f"Epoch {epoch+1}/{epochs}, Train Loss: {loss.item()}, Val Loss: {val_loss}")

# 모델 저장
torch.save(model.state_dict(), 'slm_model.pth')

 

결과 및 평가

 

본 연구에서는 Segmental Language Model (SLM)의 효과성을 평가하기 위해 다양한 실험을 수행하였다. 실험 결과, SLM은 기존의 언어 모델에 비해 텍스트 분할 성능에서 뛰어난 결과를 보였다.

1. 실험 환경

데이터셋: 중국어 및 영어 텍스트 데이터
평가 지표: F1 점수, 정확도, 재현율


2. 기본 성능 평가
SLM을 다양한 하이퍼파라미터 설정으로 학습시킨 결과, 최적의 조건에서 F1 점수가 0.92를 기록하였다. 이는 기존의 언어 모델보다 약 10% 높은 성능을 나타냈다.

3. 언어별 성능 비교
중국어 텍스트에서 SLM의 성능이 특히 뛰어났다. 영어에 비해 중국어에서의 성능 향상 폭이 크게 나타났는데, 이는 SLM이 복잡한 문법 구조와 다양한 어휘를 가진 언어에서 더욱 효과적임을 시사한다.

4. 모델 복잡도와 성능
모델의 크기를 증가시킬수록 성능이 향상되는 경향을 보였다. 그러나 특정 크기 이상에서는 성능 향상이 미미하였다, 이는 과적합의 가능성을 시사한다.

5. 결론
SLM은 텍스트 분할 작업에서 뛰어난 성능을 보여주었다. 특히, 복잡한 언어 구조를 가진 중국어에서 높은 성능 향상을 보였다. 이러한 결과는 SLM이 언어 모델링뿐만 아니라 다양한 자연어 처리 작업에서도 유용하게 활용될 수 있음을 시사한다.