画像認識の世界をDeep Learning(CNN)が劇的に変えたように、言語(テキスト)を扱う「自然言語処理(NLP)」の世界にパラダイムシフトをもたらしたのが、2017年にGoogleが発表した「Transformer」モデルです。
現在の世界を席巻しているChatGPT(Generative Pre-trained Transformer)も、名前の通りこのアルゴリズムを土台としています。本記事では、このTransformerがなぜ旧来の手法(RNN/LSTM)を完全に駆逐したのか、その中心にある「Self-Attention(自己注意機構)」の概念を軸に解説します。
1. RNNの限界と、Transformerの「並列化」革命
文章を処理するにあたり、以前の主流であったRNN(再帰的ニューラルネットワーク)は「前から順番に単語を読んでいく」という人間のような処理をしていました。このため、「長い文章の最初の方の言葉を忘れてしまう(勾配消失)」という重大な欠点と、何より「順番に処理するからGPUの並列計算(一気にドカンと計算する力)を全く活かせず、学習が絶望的に遅い」という構造的な限界を抱えていました。
Transformerは「文章の全ての単語を一気に同時に(並列で)見せる」というアプローチを取りました。これにより計算速度が劇的に向上し、何千億パラメータという「大規模言語モデル(LLM)」の超長期間学習が可能になったのです。
2. Self-Attention(自己注意機構):誰が誰に注目すべきか?
全ての単語を同時に放り込まれると、AIは「どの単語が一番重要で、どれがどの単語を修飾しているのか」という文脈(Context)が分からなくなります。これを解決する魔法の数式がSelf-Attentionです。
Self-Attentionは、文章内のそれぞれの単語に対して「Query(探す人)」「Key(名札)」「Value(本来の意味)」という3つのベクトルを作り出し、ベクトルの内積(似ている度合い)を計算することで、「『銀行』という単語は『川手』よりも『お金』という言葉と強い関連性を持っている(注目・Attentionすべきである)」というスコアを全単語の総当たり戦で計算します。
import torch
import torch.nn as nn
import math
class SelfAttention(nn.Module):
def __init__(self, d_model, heads):
super(SelfAttention, self).__init__()
self.d_model = d_model
self.heads = heads
self.d_k = d_model // heads
# Q, K, Vを生成するための線形変換 (特徴量を学習)
self.queries = nn.Linear(d_model, d_model)
self.keys = nn.Linear(d_model, d_model)
self.values = nn.Linear(d_model, d_model)
self.fc_out = nn.Linear(d_model, d_model)
def forward(self, x):
N, seq_length, _ = x.shape
# Q, K, Vの計算と、複数ヘッド(Multi-head)への分割
q = self.queries(x).view(N, seq_length, self.heads, self.d_k)
k = self.keys(x).view(N, seq_length, self.heads, self.d_k)
v = self.values(x).view(N, seq_length, self.heads, self.d_k)
# (N, heads, seq_length, d_k)の形に変形
q = q.transpose(1, 2)
k = k.transpose(1, 2)
v = v.transpose(1, 2)
# Attentionスコアの計算: Q と K の内積 (Query x Key)
attention_scores = torch.matmul(q, k.transpose(-1, -2))
# スケール調整(重要:勾配爆発を防ぐため次元の平方根で割る)
attention_scores = attention_scores / math.sqrt(self.d_k)
# Softmax関数で確率表現 (0〜1) に変換
attention_weights = torch.softmax(attention_scores, dim=-1)
# 重みと Value (本来の意味ベクトル) の掛け合わせ
out = torch.matmul(attention_weights, v)
# 元の形に戻して最後の全結合層へ
out = out.transpose(1, 2).contiguous().view(N, seq_length, self.d_model)
out = self.fc_out(out)
return outまとめ:言語からマルチモーダルへ
上記で実装した「Q・K・Vの内積によるAttention機構」のピュアで美しい数式が、現在の人類最高のAIの根幹を支えています。
さらに最近では、テキストだけでなく、画像を小さなパッチ(断片)に切り分けて単語のようにTransformerに並列処理させる「Vision Transformer (ViT)」という技術が登場し、長らく画像界の王様であったCNNですらその玉座を脅かされつつあります。
Transformerの「Attention Is All You Need(注意機構さえあれば他は要らない)」という論文タイトルの通り、この構造はAIの究極の汎用アーキテクチャとなりつつあります。ぜひ基礎となる論文や実装に触れてみてください。


コメント