딥러닝 모델, 특히 자연어 처리(NLP)와 같은 시퀀스 데이터를 다루는 분야에서는 입력 데이터의 길이가 가변적인 경우가 많습니다. 이러한 상황에서는 패딩(padding) 기법을 통해 입력 데이터의 길이를 동일하게 맞추지만, 패딩된 부분은 실제 의미 있는 데이터가 아니므로 모델이 이를 학습에 반영하지 않도록 마스킹(masking) 작업이 필요합니다. TensorFlow의 tf.sequence_mask
함수는 이러한 마스킹 작업을 간단하게 수행할 수 있도록 도와주며, 시퀀스 데이터의 효율적인 처리와 모델 학습에 큰 도움을 줍니다.
본 포스팅에서는 tf.sequence_mask 함수의 개념과 사용법, 그리고 자연어 처리 모델에서의 응용 사례를 심도 있게 다루어 보겠습니다.
자연어 처리 모델에서는 문장, 단락, 문서 등 길이가 서로 다른 시퀀스 데이터를 다루게 됩니다. 예를 들어, 한 문장은 10단어로 구성될 수도 있고, 다른 문장은 20단어로 구성될 수도 있습니다. 이를 동일한 배치(batch)로 처리하기 위해서는 보통 가장 긴 시퀀스에 맞춰 나머지 시퀀스에 패딩을 추가합니다. 하지만 패딩된 부분은 실제 정보가 아니므로, 모델이 이를 무시하도록 마스킹 처리가 필요합니다.
마스킹은 다음과 같은 이유로 중요합니다.
TensorFlow의 tf.sequence_mask
함수는 주어진 시퀀스 길이를 기반으로 불리언(boolean) 텐서를 생성합니다. 이 텐서는 각 시퀀스의 실제 길이를 반영하여, 패딩된 부분과 실제 데이터를 구분할 수 있게 해줍니다. 예를 들어, 시퀀스 길이가 [3, 5, 2]인 경우, 각 시퀀스에 대해 True 값은 실제 데이터 부분을, False 값은 패딩된 부분을 나타냅니다.
기본 사용법은 매우 간단하며, 다음과 같이 작성할 수 있습니다.
import tensorflow as tf
# 예시: 각 시퀀스의 실제 길이를 나타내는 배열
sequence_lengths = [3, 5, 2]
# 최대 시퀀스 길이를 5로 설정한 마스크 생성
mask = tf.sequence_mask(sequence_lengths, maxlen=5)
print("생성된 마스크:\n", mask.numpy())
위 코드를 실행하면, 각 시퀀스에 대해 True와 False가 포함된 2차원 텐서가 생성되며, 이는 시퀀스 데이터의 패딩 부분을 식별하는 데 사용됩니다.
tf.sequence_mask 함수는 주로 다음과 같은 상황에서 활용됩니다.
예를 들어, 손실 함수 계산 시 마스킹을 적용하는 방법은 다음과 같습니다.
import tensorflow as tf
# 시퀀스 데이터 예제 (배치 크기: 3, 최대 시퀀스 길이: 5)
# 각 행은 시퀀스 데이터이며, 패딩은 0으로 채워짐
sequences = tf.constant([
[1, 2, 3, 0, 0],
[4, 5, 6, 7, 8],
[9, 10, 0, 0, 0]
], dtype=tf.float32)
# 각 시퀀스의 실제 길이
sequence_lengths = [3, 5, 2]
# 마스크 생성 (True: 실제 데이터, False: 패딩)
mask = tf.sequence_mask(sequence_lengths, maxlen=5)
mask = tf.cast(mask, tf.float32) # 마스크를 실수형으로 변환
# 예시: 시퀀스의 각 원소 제곱의 합을 계산할 때, 패딩은 제외
squared = tf.math.square(sequences)
masked_squared = squared * mask
sum_per_sequence = tf.reduce_sum(masked_squared, axis=1)
print("마스킹 적용 후 각 시퀀스의 제곱 합:", sum_per_sequence.numpy())
이 예제에서는 tf.sequence_mask를 사용해 각 시퀀스의 실제 데이터를 식별한 후, 패딩된 부분은 0으로 처리하여 각 시퀀스의 제곱 합을 올바르게 계산합니다.
자연어 처리 모델에서는 시퀀스 데이터의 길이가 가변적이기 때문에 마스킹 작업이 필수적입니다. 특히, RNN, LSTM, GRU, Transformer 등의 모델에서 패딩된 부분을 마스킹하여, 모델이 의미 없는 패딩 토큰에 주의를 기울이지 않도록 하는 것이 중요합니다.
RNN 계열 모델의 예시
RNN 모델에서는 입력 시퀀스에 대해 패딩이 포함되어 있을 경우, tf.sequence_mask를 활용해 각 타임스텝에 대한 마스크를 생성하고, 이를 통해 손실 계산이나 어텐션 가중치 계산 시 패딩된 부분을 무시할 수 있습니다.
# RNN 모델 예시: 손실 계산 시 마스킹 적용
import tensorflow as tf
# 임의의 예측 값과 실제 값 (배치 크기: 2, 최대 시퀀스 길이: 4)
predictions = tf.constant([[0.1, 0.3, 0.6, 0.0],
[0.2, 0.5, 0.3, 0.0]], dtype=tf.float32)
targets = tf.constant([[0, 1, 0, 0],
[1, 0, 0, 0]], dtype=tf.float32)
sequence_lengths = [3, 2] # 첫 번째 시퀀스는 3, 두 번째 시퀀스는 2개의 실제 데이터
# 마스크 생성
mask = tf.sequence_mask(sequence_lengths, maxlen=4)
mask = tf.cast(mask, tf.float32)
# 손실 계산: 예를 들어, 각 시퀀스의 예측과 실제 값 사이의 차이 제곱의 평균 (패딩은 무시)
loss_per_time_step = tf.math.square(predictions - targets)
masked_loss = loss_per_time_step * mask
loss = tf.reduce_mean(masked_loss)
print("마스킹 적용 손실:", loss.numpy())
Transformer 모델의 예시
Transformer와 같이 어텐션 메커니즘을 사용하는 모델에서는, 어텐션 스코어 계산 시 마스크를 적용하여 패딩 토큰에 대한 영향을 제거합니다. 이는 모델이 불필요한 부분에 주의를 분산하지 않도록 보장해줍니다.
# Transformer 모델 어텐션 마스킹 예제
import tensorflow as tf
# 예시: 어텐션 스코어 행렬 (배치 크기: 1, 시퀀스 길이: 5)
attention_scores = tf.random.uniform([1, 5, 5])
# 실제 시퀀스 길이
sequence_lengths = [3]
mask = tf.sequence_mask(sequence_lengths, maxlen=5)
mask = tf.cast(mask, tf.float32) # [1, 5]
# 어텐션 마스크 확장: [batch, 1, maxlen]
mask = tf.expand_dims(mask, axis=1)
# 패딩 부분에 매우 낮은 값(-1e9)을 할당하여 softmax 후 0에 가까운 가중치를 부여
masked_attention_scores = attention_scores + (1 - mask) * -1e9
print("마스킹 적용 어텐션 스코어:\n", masked_attention_scores.numpy())
이와 같이 tf.sequence_mask를 활용하면, 자연어 처리 모델에서 패딩 토큰으로 인한 노이즈를 제거하고, 보다 정밀한 학습과 추론을 수행할 수 있습니다.
TensorFlow의 tf.sequence_mask
함수는 가변 길이 시퀀스 데이터를 효과적으로 처리하기 위한 강력한 도구입니다. 본 포스팅에서는 tf.sequence_mask의 기본 개념과 사용법, 그리고 이를 활용하여 패딩된 데이터를 올바르게 마스킹하는 방법을 다양한 실습 예제를 통해 살펴보았습니다. 또한, 자연어 처리 모델에서 RNN, LSTM, Transformer 등 다양한 모델에 마스킹 기법을 적용하여 불필요한 패딩 토큰을 무시하고, 모델의 성능을 최적화하는 사례를 확인할 수 있었습니다.
이러한 마스킹 기법은 데이터 전처리 및 손실 계산, 어텐션 메커니즘 등 여러 영역에서 필수적으로 고려되어야 할 요소로, 모델의 학습 효율과 정확도를 크게 향상시킬 수 있습니다. 개발자 여러분께서는 tf.sequence_mask 함수를 적극 활용하여, 가변 길이 시퀀스 데이터를 보다 효율적으로 처리하고, 자연어 처리 모델의 성능을 최적화하는 데 도움을 받으시길 바랍니다.
DeepSeek-R1: 강화학습으로 스스로 진화하는 추론 특화 언어모델 DeepSeek-R1은 순수 강화학습(RL)과 소량의 Cold-start 데이터를 결합한 다단계…
TensorFlow Extended(TFX): 프로덕션 레벨의 E2E 기계학습 파이프라인 플랫폼 TensorFlow Extended(TFX)는 구글에서 자체 머신러닝 제품을 안정적으로…
AutoML-Zero: ‘zero’에서부터 스스로 진화하는 기계학습 알고리즘 기계학습 알고리즘 설계의 혁신, AutoML-Zero 단 몇 줄의 코드도…
TensorFlow Lite: 모바일 & IoT 디바이스를 위한 딥러닝 프레임워크 엣지 인텔리전스를 향한 경량화된 딥러닝 TensorFlow…
Graph Convolutional Networks(GCN) 개념 정리 최근 비정형 데이터의 대표격인 그래프(graph)를 처리하기 위한 딥러닝 기법으로 Graph…
Graph Neural Networks(그래프 뉴럴 네트워크) 기초 개념 정리 딥러닝은 이미지·음성·텍스트와 같은 격자(grid) 형태 데이터에서 뛰어난…