ゼロからAI理論を再構築する

ー 文系エンジニアがAIの内部構造をゼロから理解する記録 ー

シリーズまとめ:線形回帰からLLMまで

このシリーズでは線形回帰から始めて、誤差逆伝播、CNN、RNN、Transformer、事前学習と進んできました。最終回は、ここまでの流れを振り返りつつ、2026年現在の状況について少し触れます。

ここまでの流れ

前半(第1〜6回)では、最小二乗法による予測から出発して、ニューロンの結合による非線形な境界線の学習、誤差逆伝播による勾配計算まで扱いました。機械が自分で重みを調整する仕組みの基本です。

中盤(第7〜11回)では、勾配消失問題とその対策を見ました。ReLU、バッチ正規化、Dropout、そしてLSTMのゲート機構。深いネットワークで学習を安定させるための工夫が続きます。

後半(第12〜15回)では、CNNの局所的な構造の利用から、Attention、Transformer、事前学習へと進みました。Self-Attentionで系列内の任意の位置間を直接参照できるようになり、RNNの逐次処理が不要になった。事前学習によってラベルなしデータでの大規模学習が可能になり、BERTとGPTが生まれました。

振り返ると、各ステップは前の段階の限界に対する対処でした。線形モデルでは表現力が足りないので多層にする、多層にすると勾配が消えるのでReLUやバッチ正規化を入れる、系列データの長期依存にはLSTMを使う、逐次処理が遅いのでAttentionに切り替える。派手な跳躍はなくて、問題と対策の繰り返しです。

2026年時点の話

現在のLLMでは、推論時にも計算量を使う手法が注目されています。モデルが即座に回答を出すのではなく、内部でChain-of-Thought(思考の連鎖)を実行して、自分の推論を検証してから出力する。Test-Time Computeと呼ばれる考え方です。数学やプログラミングのような論理的なタスクで、この手法による精度向上が報告されています。

また、LLMを使ってブラウザ操作やコード実行を自律的に行うAgentic AIと呼ばれる方向も出てきています。ただ、このあたりは変化が速くて、半年後にどうなっているかはわかりません。

まとめ

このシリーズで扱ってきたのは、結局のところ

\[ f(x) = \sigma(Wx + b) \]

この変換の積み重ねです。入力を線形変換して非線形関数を通す。これを何層も重ねて、勾配でパラメータを更新する。仕組みとしてはそれだけで、個々のパーツはどれも数式で書き下せます。

それがパラメータとデータを増やすだけで文章生成や対話をこなすようになった。数式を1つずつ追っているときは理解できている気がするのに、全体を見ると「なぜこれで動くのか」がよくわからない。16回書いてきて、この感覚は最後まで消えませんでした。


参考文献

事前学習とBERT・GPTの違い

前回までにTransformerの仕組みを見てきました。ここからの問題は、そのTransformerに何をどう学習させるかです。

人間がラベルを付けたデータで学習させる(教師あり学習)には量の限界があります。一方、インターネット上にはラベルのないテキストが大量にある。このテキストそのものを使って、ラベルなしで学習できないか。それが事前学習の発想です。

事前学習:ラベルなしで学習する仕組み

事前学習では、テキストに対して自動的に「問題」を作り出します。方法は主に2つあります。

穴埋め問題(Masked Language Modeling)は、文章の一部を隠して、周囲の文脈からそこに入る単語を当てさせるものです。次単語予測(Next Token Prediction)は、ある位置までのテキストを見せて、次の単語を予測させます。

どちらも正解ラベルを人間が用意する必要がありません。テキスト自体が問題と正解を兼ねているので、データさえあれば学習を続けられます。これを自己教師あり学習と呼びます。

BERT:双方向に文脈を読む

2018年にGoogleが発表したBERT(Bidirectional Encoder Representations from Transformers)は、TransformerのEncoder部分を使ったモデルです。

BERTは穴埋め問題で学習します。隠された単語を推測するとき、その前後両方の文脈を使います。「彼は__に行って牛乳を買った」なら、「行って」と「牛乳を買った」の両方から「スーパー」や「コンビニ」を推測できる。双方向に読めるのがBERTの特徴です。

この性質のおかげで、BERTは文章の意味理解が得意です。感情分析や質問応答といったタスクで高い性能を出しました。一方で、文章を新しく生成する用途には向いていません。穴埋めは得意でも、ゼロから文章を書き出す構造になっていないからです。

GPT:左から右へ次の単語を予測する

OpenAIが開発したGPT(Generative Pre-trained Transformer)は、TransformerのDecoder部分がベースです。

GPTは次単語予測で学習します。文章を左から右に読み、常に次に来る単語を予測し続ける。後ろの文脈を見て前の単語を修正することは構造上できません。

やっていることはこれだけです。ただ、パラメータ数とデータ量を増やしていくと、文法や事実知識、ある程度の推論のようなものまで出てくる。ChatGPTはこの仕組みの延長線上にあります。文章生成や対話では、双方向に文脈を読むよりも「次に何を出力するか」が直接問われるので、GPTの構造が合っていたわけです。

まとめ

BERTとGPTは同じTransformerから出発しながら、学習方法と得意分野が異なります。BERTは穴埋め問題を双方向で解くことで文章理解に強く、GPTは次単語予測を一方向で繰り返すことで文章生成に強い。

事前学習によって、人手でラベルを付けたデータの量に縛られなくなりました。その後のLLMブームでGPT系が中心になったのは、「次の単語を当てる」という目的関数がデータとパラメータの増加に素直に反応したからだと考えられています。次回はこのシリーズのまとめとして、ここまでの流れを振り返ります。


参考文献

Transformer:RNNを捨てて並列処理する

2017年にVaswaniらが発表した"Attention Is All You Need"は、タイトルの通り「Attentionだけでいい」という提案でした。RNNもLSTMも使わず、Attentionだけで系列データを処理する。このモデルがTransformerです。

前回、Attentionがあれば入力のどの位置にも直接アクセスできると書きました。Transformerはその考えを徹底して、逐次処理を完全にやめたモデルです。

Self-Attention:入力内部の関連を測る

前回のAttentionはEncoderとDecoderの間で働いていましたが、TransformerのSelf-Attentionは入力文の中の単語同士の関連を測ります。

たとえば「銀行に行って、お金を下ろして、近くのそこで昼食を食べた」で、「そこ」が何を指しているかを判定するには、文中の他の単語との関連を見る必要があります。Self-Attentionは文中のすべての単語ペアについて関連度を計算し、文脈に応じた表現ベクトルを作ります。

\[ \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V \]

前回のQuery, Key, Valueの枠組みがそのまま使われています。\( \sqrt{d_k} \) で割っているのはスコアが大きくなりすぎてソフトマックスが飽和するのを防ぐためで、Scaled Dot-Product Attentionと呼ばれます。

RNNを捨てた理由は並列化

RNNは前の単語の処理が終わるまで次の単語を処理できません。系列長が長いほど学習に時間がかかる。Transformerは全単語を同時に処理できるので、GPUの並列計算能力をフルに活かせます。これが大規模データでの学習を可能にした実用上の大きな要因です。

ただし、全単語を同時に処理すると順番の情報が消えます。「犬が猫を追いかけた」と「猫が犬を追いかけた」が同じになってしまう。Transformerではこの問題をPositional Encodingで解決しています。各位置に対応するベクトルを入力に加算して、位置情報を明示的に与えます。

逐次処理をやめたのに位置情報を後から足し算で入れるのは、初めて読んだときかなり力技に感じました。ただ、結果的にはこれで十分機能しています。

Multi-Head Attention

Transformerは1つのAttentionではなく、複数のAttentionを並列に実行するMulti-Head Attentionを使います。各ヘッドが異なるQuery, Key, Valueの変換を学習するので、あるヘッドは文法構造に注目し、別のヘッドは代名詞の参照先に注目する、といった分業が起きます。

各ヘッドの出力を結合して線形変換をかけたものが最終的な出力です。1つのAttentionだと1種類の関連性しか捉えられませんが、複数走らせることで異なる種類の関係を同時に扱えます。

まとめ

Transformerの要点は2つです。Self-Attentionで文中の任意の位置間の関連を直接計算できること。そしてRNNの逐次処理をやめたことで、GPUによる大規模な学習が現実的になったこと。

BERTもGPTも、このTransformerのアーキテクチャがベースです。次回はTransformerを使った事前学習の仕組みと、BERTとGPTの設計の違いについて書きます。


参考文献

Attention(注意機構):必要な情報を都度参照する

前回、Encoder-Decoderモデルでは入力を固定長ベクトルに圧縮するため、長い入力で情報が失われるという話を書きました。Attention(注意機構)は、この問題を「入力の全ステップの情報を保持しておき、必要なときに参照する」という方法で解消します。

Encoderの全状態を保持する

従来のEncoder-DecoderではEncoderの最後の隠れ状態だけをDecoderに渡していましたが、Attentionを導入したモデルではEncoderの全ステップの隠れ状態を捨てずに保持します。

Decoderは出力を1トークン生成するたびに、Encoderの隠れ状態のリストを見て「今の自分にとってどの入力が重要か」をスコアとして計算します。

\[ a_{ts} = \frac{\exp(\text{score}(h_t, \bar{h}_s))}{\sum_{s'} \exp(\text{score}(h_t, \bar{h}_{s'}))} \]

\( a_{ts} \) が注意の重みです。Decoderの現在の状態 \( h_t \) とEncoderの各状態 \( \bar{h}_s \) の相性をスコアリングし、ソフトマックスで正規化して確率分布にします。

重み付き和でコンテキストを作る

計算された重みを使って、Encoderの全状態の重み付き和を取ります。

\[ c_t = \sum_{s} a_{ts} \bar{h}_s \]

これが新しいコンテキストベクトルです。固定長ベクトル1つにすべてを押し込むのではなく、生成する単語ごとに異なるブレンドを作る。入力系列のどの位置にも直接アクセスできるので、100単語前の情報でも参照できます。

イメージとしては、要約メモだけを頼りに話すのをやめて、原文を開いたまま、必要な箇所を指で差しながら訳すような感じです。

Query, Key, Valueという一般化

Attentionの仕組みをさらに一般化すると、Query(何を探しているか)、Key(各情報のインデックス)、Value(情報の中身)という3つの役割に分けられます。

先ほどの例だとDecoderの状態がQuery、Encoderの各状態がKeyとValueを兼ねています。この3つを明示的に分離することで、Attentionは翻訳に限らず「あるデータ群の中から、今の文脈に関連する情報を選んで集約する」汎用的な操作として使えるようになりました。

このQuery-Key-Valueの枠組みが、次回扱うTransformerの基盤になっています。

まとめ

Attentionは、出力を生成するたびに入力の全位置を参照して、文脈に応じた重み付き和を計算する仕組みです。固定長ベクトルのボトルネックが解消され、長い系列でも情報が失われにくくなりました。

Attentionで入力のどの位置にも直接アクセスできるなら、そもそもRNNで順番に処理する必要はあるのか。2017年のTransformerの論文はまさにこの問いを出発点にしています。次回はTransformerについて書きます。


参考文献

Encoder-Decoder:入力と出力の長さが違う問題を解く

翻訳を考えると、入力と出力の長さが違います。「こんにちは」は4文字で"Hello"は5文字。単語数も文法構造も言語によって異なるので、入力と出力を1対1で対応させることができません。

Encoder-Decoder(Seq2Seq)モデルは、入力系列を一旦ベクトルに圧縮して、そこから別の系列を生成するという構造でこの問題に対処します。

Encoderが入力を圧縮し、Decoderが出力を生成する

構造はシンプルです。Encoder(符号化器)が入力系列を順に処理して、最終ステップの隠れ状態を1つの固定長ベクトル \( v \) にまとめます。これをコンテキストベクトルと呼びます。

Decoder(復号化器)は、このベクトル \( v \) を初期状態として受け取り、出力系列を1トークンずつ生成していきます。

数式で書くと、Decoderは中間ベクトル \( v \) を介して条件付き確率 \( P(y_1, \dots, y_m \mid x_1, \dots, x_n) \) を最大化しようとしています。EncoderもDecoderもRNN(やLSTM)で実装されることが多く、前回までの知識がそのまま使えます。

固定長ベクトルがボトルネックになる

この構造の弱点は、入力がどれだけ長くても1つの固定長ベクトルに圧縮しなければならない点です。

10単語の文も100単語の文も同じサイズのベクトルに押し込むので、長い文では情報が落ちます。特にEncoderがRNNベースだと、系列の後半の情報ばかりが強く残り、冒頭の情報が薄れる。前回書いたRNNの長期記憶ের 限界が、ここでも効いてきます。

2014年にSutskeverらが発表したSeq2Seqの論文では、入力文を逆順にするという工夫で冒頭の情報をDecoder側に近づけていました。効果はあったようですが、根本的な解決にはなっていません。

振り返りができない

人間が翻訳するとき、文章全体を一度要約してからそれだけを頼りに訳すということはしません。原文を見ながら、必要な箇所を都度参照して訳語を選んでいます。

Encoder-Decoderモデルにはこの「振り返り」がない。コンテキストベクトルに圧縮した時点で、入力の個々の単語に戻ることができなくなる。この問題意識が、次回扱うAttention(注意機構)の出発点になっています。

まとめ

Encoder-Decoderは、入力を固定長ベクトルに圧縮してから出力を生成する構造です。入力と出力の長さが異なるタスクに対応できますが、長い入力では情報が失われるボトルネックがあります。

次回は、このボトルネックを解消するAttentionメカニズムについて書きます。


参考文献

LSTM:忘れる・覚える・取り出すを制御する

前回、RNNは長い系列で勾配消失が起きるため、長期的な依存関係を学ぶのが苦手だという話を書きました。LSTM(Long Short-Term Memory)は、この問題に対処するためにゲート機構を導入したRNNの拡張です。

セル状態という別経路

LSTMが通常のRNNと違うのは、隠れ状態とは別に「セル状態(Cell State)」という経路を持っている点です。

通常のRNNだと、情報は毎ステップ行列演算と活性化関数を通るので、ステップを重ねるうちに劣化していきます。LSTMのセル状態は、この複雑な計算を通さずに情報を次のステップへ流せる経路です。不要な変換を経由しないぶん、勾配が消えにくい。

3つのゲートで情報を選別する

セル状態にどの情報を残し、何を捨てるかを制御するのがゲートです。シグモイド関数の出力(0から1)を使って、情報の通過量を調整します。

忘却ゲートは、過去のセル状態のどの部分を捨てるかを決めます。

\[ f_t = \sigma(W_f \cdot [h_{t-1}, x_t] + b_f) \]

入力ゲートは、新しい情報のどの部分をセル状態に書き込むかを決めます。

\[ i_t = \sigma(W_i \cdot [h_{t-1}, x_t] + b_i) \]

出力ゲートは、更新されたセル状態のどの部分を隠れ状態として外に出すかを決めます。

\[ o_t = \sigma(W_o \cdot [h_{t-1}, x_t] + b_o) \]

それぞれのゲートは学習されるパラメータを持っていて、どのタイミングで何を忘れ、何を覚え、何を出力するかをデータから学びます。名前だけ見ると複雑ですが、やっていることは「0から1の値で情報を絞る」という同じ操作の繰り返しです。

なぜ長期記憶が可能になるのか

セル状態の更新式を見るとわかります。

\[ C_t = f_t \odot C_{t-1} + i_t \odot \tilde{C}_t \]

前のセル状態に忘却ゲートをかけて(一部を忘れて)、新しい情報を入力ゲートで絞って足す。ポイントは「足し算」で更新されている点です。

RNNの勾配消失は、行列の掛け算が連鎖することで起きていました。LSTMではセル状態が足し算で更新されるので、勾配が過去へ遡るときに減衰しにくい。ResNet(残差接続)と似た発想で、足し算による勾配のバイパスが長期記憶を可能にしています。

まとめ

LSTMはセル状態という別経路と3つのゲートで、情報の忘却・記憶・出力を制御します。セル状態が足し算で更新されるため勾配が消えにくく、RNNでは難しかった長期的な依存関係を学習できます。構造は複雑に見えますが、勾配消失への対策としては「足し算でバイパスを作った」というシンプルな一点に帰着します。

ゲートによる「どの情報に注目するか」の制御は、後のAttentionメカニズムに通じる考え方です。次回はEncoder-Decoderモデルについて書きます。


参考文献

再帰型ニューラルネットワーク(RNN):順番のあるデータを扱う

これまでのネットワークは、入力を受け取って出力を返すだけで、過去の入力を覚えていませんでした。画像認識ならそれで問題ないのですが、文章や音声のように順番に意味があるデータだと困ります。「彼は」という主語を忘れたら、後に続く動詞の意味がわからなくなる。

RNN(Recurrent Neural Network)は、前のステップの出力を次のステップの入力に使い回すことで、系列データを扱えるようにしたモデルです。

内部状態がループする

RNNの特徴は、自分の出力を次のステップに渡すループ構造です。

\[ h_t = \sigma(W_{xh} x_t + W_{hh} h_{t-1} + b) \]

\( h_t \) は時刻 \( t \) の内部状態(隠れ状態)です。現在の入力 \( x_t \) に加えて、1ステップ前の内部状態 \( h_{t-1} \) が計算に入っています。

この \( h \) がRNNの「記憶」にあたります。といっても、明示的にどこかに情報を保存しているわけではなく、内部状態のベクトルに過去の情報が圧縮されて残っているという形です。系列が長くなると古い情報はどんどん上書きされるので、覚えていられる範囲には限界があります。

BPTTで時間方向に学習する

RNNの学習も勾配降下法ですが、時間が絡むぶん少し面倒です。ネットワークを時間方向に展開して、未来から過去に向かって勾配を伝播させます。BPTT(Backpropagation Through Time)と呼ばれる方法です。

通常の誤差逆伝播が層方向に遡るのに対して、BPTTは時間方向にも遡る。文章の結末の損失から、数ステップ前の重みに対する勾配を計算して更新します。

ここでも勾配消失が起きる

第7回で書いた勾配消失問題が、RNNでは時間軸方向にも発生します。ステップが長くなるほど、過去の入力に対する勾配が小さくなっていく。

数ステップ前の情報は活かせても、もっと前の情報は勾配が届かず学習できません。短い文なら文脈を拾えるけれど、段落をまたぐような長い依存関係は捉えられない。

「記憶を持てるモデル」と聞くと万能に感じますが、実際に覚えていられる範囲はかなり短い。自分はここが一番もどかしかったです。この限界を何とかしようとして生まれたのが、次回扱うLSTMやGRUといったゲート付きRNNです。

まとめ

RNNはループ構造で内部状態に過去の情報を持ち回り、系列データを処理します。ただし長い系列では勾配消失が起きるため、長期的な依存関係の学習が苦手です。この弱点がRNNの実用上の大きな制約で、それを解消するためにゲート機構が考案されました。

次回はLSTMについて書きます。


参考文献