🐙

【Transformerとは? - 第二回】ニューラルネットワークとは何か

に公開

1. はじめに

本記事は、「機械学習素人が Transformer を理解するまでの記録」 という連載の第二回です。
ChatGPT は使っているものの、Transformer の中身はよく分かっていない、という立場から、基礎に立ち返って理解していく過程をまとめています。

1.1. 今回の内容

前回は、Transformer や LLM がどのような位置づけにあるのかを、かなり引いた視点から整理しました。
今回はその続きとして、Transformer を理解する前提となる「ニューラルネットワークとは何か」 について整理していきます。

1.2. シリーズの目次

導入回:【Transformerとは? - 導入回】機械学習素人が Transformer を理解するまでの記録

  1. Transformerとは(概要)
  2. ニューラルネットワークとは何か 👈 今回
    • 重み・バイアス・活性化関数
    • 脳との関係(比喩として)
  3. ニューラルネットワークの推論と学習
  4. 自然言語処理とは何をしているのか
  5. 文章の意味と系列モデル(RNN)
  6. 言語モデル・系列変換モデル
  7. Transformerを改めて見る
  8. モデルのチューニング手法の整理
  9. RAGとは何をしているのか
  10. PEFT / Fine Tuning
  11. なぜプロンプトエンジニアリングは効くのか

なお、本シリーズは完成された解説ではなく、学習ログとして公開しています。
理解が更新された場合、過去記事を修正することもあります。

2. 導入

前回の記事で Transformer はニューラルネットワーク (NN) の一種だと分かった。
ということは、Transformerを理解するなら NN の理解が必要では?
とういうことで NN 学んでみました。

3. ニューラルネットワークは脳を真似している

3.1. ニューロン(神経細胞)の仕組み

ニューラルネットワークは脳の仕組みを真似しているそうです。
ちょうど今心理学の勉強をしているのですが、読んでいる本[1]の冒頭が脳の話でして、少し遠回りして脳の話から NN を勉強してみます。


ニューロンとは から引用

脳はニューロン(神経細胞)が繋がり合ってできています。
ニューロンは、主に「細胞体」「軸索」から成っており、軸索の先端に「神経終末」があります。
あるニューロン(ニューロンA)の「神経終末」が、別のあるニューロン(ニューロンB)の「細胞体」に繋がります。
この「神経終末」と「細胞体」の接続部分を「シナプス」と呼ぶそうです。
ニューロンは 1:1 でつながっておらず、多:多の関係で繋がっています。

ニューロンAの神経終末とニューロンBの細胞体の電位差ができることで、ニューロンBから次のニューロンに信号が伝達されます。
ただ、ニューロンAの電位差だけでは足りず、他の複数のニューロンの合計の電位差が、ある閾値を超えた時にニューロンBから信号が出ます。
この閾値を超えて信号がでることを「発火」と言います。

3.2. ニューラルネットワークはニューロンを真似ている

と、ニューロン(神経細胞)のことをざっと書いたところで、ニューラルネットワークの話に戻ります。
ニューラルネットワークはニューロンの以下の要素を含んでいるように思います。

  • 信号が伝播する仕組み
  • ノード同士の、多:多、の接続関係
  • 「発火」という考え方

厳密には完全な対応ではありませんが、
概念的には
ノード ≒ 神経細胞
エッジ ≒ 信号の伝達経路
と考えるとイメージしやすいです。

4. ニューラルネットワークの中身

4.1. 1つのノードを数式で表す

では、ニューラルネットワーク (NN) の中身を見ていきましょう。
まずは一つのノードに着目しますが、その前に、「身近な現象をどのように数式に落とし込むか」、から始めましょう。

例えば、娘が生まれて服を買う時に、どのサイズを買えば良いか迷うと思います。月齢に対する身長が予想できれば嬉しいですよね。
そんな時に数式の出番です。
例えば、身長の予想が単純な式 y = a \times x + b で表せたとします。
これは、月齢を x、出産時の身長 b、その人の身長の伸び具合 a と置いた時に、身長 y がいくらになるかという式です。
別の言い方をすると、x を入力した時の出力が y になると言えます。

NN のノードはこの式の入力が複数あるバージョンと考えることができます。
前節で、ニューロンは多:多の関係だと言いました。
ですので、あるノードには複数の入力が存在します。

これを式で表すと以下になります。
ここで、x は各ノードからの入力、w は各ノードの入力に対する重み、b はバイアス(重み1の入力とも言える)です。

y = (x_1 \times w_1) + (x_2 \times w_2) + (x_3 \times w_3) + b

y の値がある閾値を超えたら「発火」するようにしたいので、ノードの中に活性化関数が存在しています。
活性化関数は「非線形関数」が使われており、詳細は後述します。

ノードの基本はこれであり、ノードがつながり合っているものがニューラルネットワーク です。

4.2. なぜ「活性化関数(非線形関数)」が必要なのか

ここまでで、ニューラルネットワークの 1 つのノードは、
入力に重みを掛けて足し合わせた、次のような式で表せることが分かりました。

y = (x_1 \times w_1) + (x_2 \times w_2) + \dots + b

これは見ての通り、線形な式です。
ニューラルネットワークは「ネットワーク」と言う言葉の通りノードが繋がりあっています。
ということは、線形な式が繋がり合うと言うことです。
では、この線形な式が繋がり合うと、何が起きるのでしょうか。
これを見ていくことで「活性化関数(非線形関数)」が必要な理由がわかります。

4.2.1. 線形な式の限界

まず、極端な例から考えてみます。

入力が 1 つだけのノードを 2 層重ねたとします。

1 層目:

y_1 = a x + b

2 層目:

y_2 = c y_1 + d

これを展開すると、

y_2 = c(ax + b) + d = (ca)x + (cb + d)

となります。

つまり、2 層にしても結局は「x に係数を掛けて、定数を足すだけの式」= 線形の式 です。
3 層にしても、10 層にしても本質は変わりません。

線形な式をどれだけ重ねても、全体としては 1 つの線形な式にまとめられてしまう

これが「線形モデルの限界」です。

4.2.2. 具体的なイメージ:直線しか引けない

線形な式 y = ax + b ができることは、とてもシンプルです。

  • グラフにすると 直線 になる
  • 右肩上がりか、右肩下がりか、そのどちらか

という世界です。

例えば、

  • 「入力が小さいときは出力を抑えたい」
  • 「ある値を境に急に振る舞いを変えたい」
  • 「曲線的な関係を表現したい」

といったことは、直線では表現できません。

どれだけノードを増やしても、
どれだけ層を深くしても、
中身が線形のままだと 「できることは直線を引くことだけ」 なのです。

4.2.3. 「発火」を表現するには線形では足りない

ここで、3 章で出てきた「発火」を思い出します。

ニューロンは、

  • 入力が小さいうちは反応しない
  • ある閾値を超えたら一気に信号を出す

という振る舞いをします。

これは明らかに、「入力と出力が比例する」という線形な関係ではありません。

「ある条件を満たしたときに、挙動が切り替わる」

こうした振る舞いを数式で表すには、非線形な関数 が必要になります。

4.2.4. 活性化関数=非線形を入れるための装置

そこで登場するのが 活性化関数 です。

ノードの中で、

  1. 重み付き和を計算する(線形)
  2. その結果を活性化関数に通す(非線形)

という構造にすることで、

  • ノード単体はシンプル
  • しかし全体としては複雑な関係を表現できる

ようになります。
ですので先に出していたノードは正式には以下の形になります。

次の節では、実際によく使われている活性化関数(ReLU 関数)がどんな形をしていて、なぜその形なのかを見ていきます。

5. 活性化関数とは何か

前節で、線形な計算だけでは限界がある ことを見ました。
その限界を突破するために使われるのが「活性化関数」です。

5.1. よく使われる活性化関数:ReLU

活性化関数には様々な種類がありますが、ここでは代表的な ReLU 関数だけを見ます。
他にはシグモイド関数などがあるそうですが[2]、ここでは深追いしないことにします。

5.1.1. ReLU(Rectified Linear Unit)

現在の深層学習で最もよく使われているのが ReLU だそうです。
ReLU は非常にシンプルで、

  • 入力が 0 以下なら出力は 0
  • 入力が 0 より大きければ、そのまま出力

という関数です。

グラフにすると、


【2026】ニューラルネットワークで使われる活性化関数まとめ!コードを詳しく解説 | DX/AI研究所 から引用

という形になります。

直感的には、「一定以上の入力が来たときだけ反応する」という「発火」のイメージにかなり近い関数です。

5.2. 微分できることの重要性(深追いしない)

活性化関数には、重要な性質があります。

それは 「微分できること」 です。

ニューラルネットワークの学習では、

  • 出力の誤差を計算し
  • その誤差を逆向きに伝えて
  • 重みを少しずつ調整する

という処理が行われます。
※ 学習についての詳細は第三回以降で書いていこうと思います。

この「どれくらい調整すれば良いか」を計算するために、微分 が使われています。

ここでは詳細には立ち入りませんが、
活性化関数は「非線形であり、かつ微分できる」
という条件を満たす必要がある、という点だけ押さえておけば十分です。

※ 実際には ReLU は 0 の点で微分できませんが、x が ちょうど 0 になる確率はほぼ 0 なので問題ありません。

個人的に、ステップ関数がニューロンの発火を一番表していると思ったのですが、
微分しても傾きが常に 0 なので、勾配が消えてしまってニューラルネットワークの学習ができないそうです。
その点 ReLU は微分できるため、勾配を減衰させずに後段まで勾配を伝える役割を果たしているそうです。


6. ニューラルネットワークの構造

ここまでで「1 つのノード」の中身は見えてきました。
次は、それらがどう繋がって全体を構成しているのかを見ます。

6.1. ノード・重み・バイアス

ニューラルネットワークは、基本的に次の要素でできています。

  • ノード:計算を行う単位
  • 重み:入力をどれだけ重要視するか
  • バイアス:全体をずらすための調整項

各ノードは、

  1. 入力に重みを掛ける
  2. 足し合わせる
  3. 活性化関数に通す

という処理を淡々と行っています。

賢さはノードそのものではなく、重みとバイアスの組み合わせ に宿っています。

6.2. 入力層 / 隠れ層 / 出力層

ニューラルネットワークは、層(レイヤ)構造を持っています。

  • 入力層
    データをそのまま受け取る層(計算はほぼしない)

  • 隠れ層
    入力を変換・抽象化する層
    ニューラルネットワークの「本体」

  • 出力層
    最終的な結果を出す層

入力層 → 隠れ層 → 出力層
という流れで、情報が一方向に伝わっていきます。


7. ニューラルネットワークはどう使われるのか

では、このニューラルネットワークは、実際にはどのように使われているのでしょうか。
ここから先は、これまで整理した NN が実際に LLM でどう使われているかをかなりラフに見ていきます。

7.1. 次の単語予測の例

LLM では、「これまでの単語列が与えられたとき、次に来そうな単語は何か?」を予測しています。

例えば、
「今日はとても天気が」
という入力が来たら、

  • 良い
  • 悪い
  • 晴れだ
  • 寒い

など、次の単語の候補を考えます。

7.2. 入力 → 計算 → 確率分布

内部では、

  1. 単語を数値に変換して入力
  2. ニューラルネットワークで計算
  3. 出力層で「確率分布」を作る

ということが起きています。

最終的な出力は、

  • 「良い」が 40%
  • 「悪い」が 5%
  • 「晴れだ」が 30%

のような 確率の集合 です。

その中から 1 つを選ぶことで、文章が生成されます。

7.3. 「学習済み重み」を使って推論している

重要なのは、ChatGPT が毎回学習しているわけではないという点です。

事前に大量のデータで学習し、

  • 重み
  • バイアス

が決まった状態のニューラルネットワークを使って、入力に対する計算(推論)だけを行っています。

つまり、LLM は「学習済みの巨大な計算装置」 として動いている、ということです。


8. Transformer とニューラルネットワークの関係

最後に、Transformer とここまでの話をつなげます。

8.1. Transformer は NN の塊

Transformer は、特殊なニューラルネットワークの構造 です。

中身を分解すると、

  • 全部ノード
  • 全部重み
  • 全部行列計算

でできています。

「Transformer は NN とは別物」ではなく、かなり発展した NN と考えるのが自然です。

8.2. Attention と FFN の立ち位置

Transformer の中には、

  • Attention
  • Feed Forward Network(FFN)

と呼ばれるブロックがあります。

このうち FFN は、ほぼそのまま「これまで見てきたニューラルネットワーク」です。

Attention は、

  • 入力同士の関係性を計算する
  • どこに注目すべきかを決める

という役割を持ちますが、中身はやはり行列計算と非線形変換です。

ここまで来ると、Transformer = NN をベースに、Attention という仕組みを追加したもの、と理解できます。

9. 終わりに

今回は、Transformer を理解する前提として「ニューラルネットワークとは何か」をかなり基礎から整理しました。

正直なところ、
ニューラルネットワークという言葉には

  • 数式が多そう
  • 難しそう
  • ブラックボックスっぽい

という印象がありましたが、
中身を分解してみると、

  • 重み付き和を計算して
  • 非線形な関数に通して
  • それをひたすら積み重ねている

という、意外と素朴な構造だということが分かってきました。

「賢さ」はノードそのものにあるのではなく、
重みとバイアスがどう決まっているかに宿っている、
という点も、個人的には大きな発見でした。

また、
活性化関数がなぜ必要なのか、
なぜ線形だけではダメなのかを
自分なりの言葉で整理できたことで、

ニューラルネットワークは
ただの数式の集合ではなく、
「振る舞いを作るための装置」

という感覚も少し掴めた気がします。

まだまだ理解は浅く、今後考えが変わる部分も多いと思いますが、その変化も含めて記録として残していこうと思います。

同じように
「Transformer をちゃんと理解したい」
と思っている方の遠回りの参考になれば幸いです。

10. 参考

文中で引用しているもの下部に記載しています。
これらに加えて、自然言語処理や Transformer、もっと広く機械学習について非常に参考になるものをこちらで記載しておきます。
シリーズ通して何度も参照することになると思います。

脚注
  1. 心理学新版 | 有斐閣 ↩︎

  2. 【活性化関数】02 活性化関数の種類5つ ↩︎

Discussion