TransformerモデルとTensorFlowを用いた自然言語処理(NLP)
はじめに
Transformerは、自然言語処理(NLP)における画期的なモデルであり、BERTやGPTなどの多くの最新AIモデルの基盤となっています。本記事では、TensorFlowを使用してTransformerモデルを構築し、テキスト分類タスクを実装する方法を紹介します。
Transformerの基本概念
Transformerは、以下の主要なコンポーネントから構成されます。
- Self-Attention: 文中の単語同士の関係を捉えるメカニズム
- Positional Encoding: 単語の順序情報をモデルに組み込む技術
- Multi-Head Attention: 異なる視点からテキストを処理
- Feed Forward Network: 非線形変換を行う層
TensorFlowでのTransformerの実装
まず、Transformerの基本構造を作成します。
import tensorflow as tf
from tensorflow.keras.layers import Dense, LayerNormalization, Dropout
class MultiHeadSelfAttention(tf.keras.layers.Layer):
def __init__(self, d_model, num_heads):
super(MultiHeadSelfAttention, self).__init__()
self.num_heads = num_heads
self.d_model = d_model
assert d_model % num_heads == 0
self.depth = d_model // num_heads
self.wq = Dense(d_model)
self.wk = Dense(d_model)
self.wv = Dense(d_model)
self.dense = Dense(d_model)
def call(self, inputs):
batch_size = tf.shape(inputs)[0]
q = self.wq(inputs)
k = self.wk(inputs)
v = self.wv(inputs)
q = tf.reshape(q, (batch_size, -1, self.num_heads, self.depth))
k = tf.reshape(k, (batch_size, -1, self.num_heads, self.depth))
v = tf.reshape(v, (batch_size, -1, self.num_heads, self.depth))
scores = tf.matmul(q, k, transpose_b=True) / tf.math.sqrt(float(self.depth))
weights = tf.nn.softmax(scores, axis=-1)
output = tf.matmul(weights, v)
output = tf.reshape(output, (batch_size, -1, self.d_model))
return self.dense(output)
Transformerエンコーダの実装
次に、Transformerエンコーダを構築します。
class TransformerEncoderLayer(tf.keras.layers.Layer):
def __init__(self, d_model, num_heads, dff, rate=0.1):
super(TransformerEncoderLayer, self).__init__()
self.mha = MultiHeadSelfAttention(d_model, num_heads)
self.ffn = tf.keras.Sequential([
Dense(dff, activation='relu'),
Dense(d_model)
])
self.norm1 = LayerNormalization(epsilon=1e-6)
self.norm2 = LayerNormalization(epsilon=1e-6)
self.dropout1 = Dropout(rate)
self.dropout2 = Dropout(rate)
def call(self, x):
attn_output = self.mha(x)
attn_output = self.dropout1(attn_output)
out1 = self.norm1(x + attn_output)
ffn_output = self.ffn(out1)
ffn_output = self.dropout2(ffn_output)
return self.norm2(out1 + ffn_output)
テキスト分類タスクへの応用
Transformerエンコーダを活用し、テキスト分類モデルを構築します。
class TextClassifier(tf.keras.Model):
def __init__(self, vocab_size, d_model, num_heads, dff, num_classes):
super(TextClassifier, self).__init__()
self.embedding = tf.keras.layers.Embedding(vocab_size, d_model)
self.encoder = TransformerEncoderLayer(d_model, num_heads, dff)
self.global_avg_pool = tf.keras.layers.GlobalAveragePooling1D()
self.classifier = Dense(num_classes, activation='softmax')
def call(self, x):
x = self.embedding(x)
x = self.encoder(x)
x = self.global_avg_pool(x)
return self.classifier(x)
まとめ
TensorFlowを使用してTransformerの基本的な構造を実装し、テキスト分類タスクへの応用を紹介しました。BERTやGPTのような高度なモデルも、この基本概念を応用することで理解しやすくなります。