小さな言語モデルを作る30日間 — Day 1:ニューラルネットワーク

Reddit r/LocalLLaMA / 2026/4/4

💬 オピニオンIdeas & Deep AnalysisModels & Research

要点

  • 記事は「小さな言語モデルを作る30日間」のDay 1として、トークナイザや学習ループに入る前にニューラルネットワークの基礎を平易に説明している。
  • ニューラルネットワークは入力・隠れ層・出力層の「層」で構成され、データは前の層から次の層へ一方向に流れていき、各ユニットが値を更新していく。
  • 学習では、出力が正解に近づくようにネットワークが自ら調整され、ルールを逐一プログラムするのではなく例から学ぶと述べている。
  • 重み(weights)、バイアス(bias)、活性化(activation)、損失(loss)の4要素が多くのニューラルネットで共通して登場し、それぞれの役割の直感的な理解を提示している。
30 Days of Building a Small Language Model — Day 1: Neural Networks

ようこそ、Day 1へ。トークナイザー、トランスフォーマー、学習ループを紹介する前に、まずはほとんどの現代的な機械学習が最初に始める場所から始めます。それはニューラルネットワークです。最初の1日を、今後29日間で使い回すための土台を築く日だと思ってください。

もしニューラルネットワークがブラックボックスのように聞こえると思ったことがあるなら、この投稿はあなたのためです。簡単な絵を使います。これは犬か猫か? そして、モデルの中で実際に何が起きているのかを、平易な言葉で追っていきます。

ニューラルネットワークとは?

ニューラルネットワークは層でできています。各層には多数の小さなユニットがあります。データは一方向に流れます。つまり各ユニットは、前の層から数値を受け取り、それを更新して、次へ新しい数値を送ります。

学習中、ネットワークは自分自身を調整し、出力が例題データ上の正しい答えにより近づくようにします。1つずつルールとしてプログラムされるわけではありません。例から学びます。

入力層、隠れ層、出力層

下の図は、通常の3種類の層を示しています:

https://preview.redd.it/2jtyf345t3tg1.png?width=1366&format=png&auto=webp&s=f4dc42ac103e01a362f72dc53799bfc3cc4d8510

参照:https://nccr-automation.ch/news/2023/going-back-what-we-know-injecting-physical-insights-neural-networks

  • 入力層: ネットワークが最初に見る数(ピクセル、特徴量、または類似のもの)です。
  • 隠れ層: その真ん中にあるすべてです。浅い層は、多くの場合ローカルな、あるいは単純なパターンに反応します。より深い層は、それらを組み合わせてより広いパターンを作ります。
  • 出力層: 読み取る結果です。多くの場合、考えられる各クラスに対する確率やスコアになります。

「単純なパターンを先に、小さなパターンを後に」といったこの形は、内部が違って見えても、言語モデルの中で再び現れます。

重み、バイアス、活性化、損失

この4つの要素は、ほぼすべてのネットワークに登場します。

  • 重み:重みを「各特徴に与えられた重要度」と考えるとよいでしょう。たとえば、動物が発する音は、その大きさよりも重要かもしれません。そこでネットワークは、より役に立つ特徴には高い重みを、役に立たない特徴には低い重みを割り当てます。そして時間が経つにつれて、これらの重みは調整され続け、モデルはより良い予測ができるようになります。
  • バイアス:バイアスは、意思決定を行う前に最終スコアへ加える小さな調整のようなものです。これにより、モデルは予測をある方向へ少しずらすことができます。たとえすべての入力が0、あるいは小さい値であっても、バイアスによってモデルは意味のある出力を生成できるようになります。たとえば、すべてを確認する前でさえも、ついこうした傾向があります。「これは犬っぽい」。その内蔵された好みのことをバイアスと呼びます。入力が小さい状況でも、判断をずらすのに役立ちます。
  • 活性化関数: 入力を重みでまとめ、さらにバイアスを加えた結果は、活性化関数と呼ばれる何かを通ります。これは単に、モデルが最終出力をどういう形にするかを決めるのに役立つ「ルール」です。たとえば、すべての手がかりを確認した後で、全部をまとめると:

Score = all clues + importance + bias

そして次に決めます:

  • スコアが高い → 犬
  • スコアが低い → 猫

この判断ルールは活性化関数(Activation Function)と呼ばれます。意思決定のスイッチのようなものだと思ってください。

  • 損失(Loss):そしていよいよ最も重要な部分です。損失。モデルが予測を出したら、それを正解と比べます。予測が間違っていたら、どれくらいズレていたかを計算します。この差のことを損失と呼びます。ニューラルネットワークの目的は、この損失をできるだけ小さくすることです。では仮にこうだったとしましょう。モデルの予測 → 犬、しかし実際の答え → 猫。私たちは測ります。「予測はどれだけ間違っていたのか?」その誤差はこう呼ばれます:損失(Loss)

学習プロセスはシンプルです。モデルは予測を行い、損失を計算し、その後エラーを減らすために重みとバイアスを調整します。このプロセスを何度も繰り返し、モデルが予測を上手くできるようになります。

要するに、重みが重要度を決め、バイアスが出力を調整し、活性化関数が判断を行い、損失がモデルに「どれだけ間違っているか」を知らせて改善できるようにします。

ニューラルネットワークが誤差を減らす方法(逆伝播)

損失が分かったところで、次の疑問はこれです:

https://preview.redd.it/3jajcg18t3tg1.png?width=1024&format=png&auto=webp&s=af1c7e6a4a4a2f4b8f28af576190558403ba1c44

モデルは実際にどうやって、この誤差を減らすのでしょうか?

ここで逆伝播(Backpropagation)が登場します。

  • 逆伝播は、単に「間違いから学ぶ」ためのプロセスです。モデルが予測を行って損失を計算した後、何が間違いで、どう直せばよいのかを把握する必要があります。ランダムに当てずっぽうをするのではなく、各重みとバイアスがどれだけ誤差に寄与したかを慎重に確認します。

たとえばこう考えてください。モデルが犬だと予測したのに、正解は猫だったとします。するとモデルは「どの特徴が一番私を誤らせたんだ?」と問いかけます。たとえば、大きさに重要度を与えすぎて、音を無視してしまったかもしれません。そこで大きさの重みを少し下げて、音の重みを少し上げます。

この調整はランダムに行うのではありません。勾配(gradients) と呼ばれるものによって導かれます。勾配は、「重みやバイアスをほんの少し変えたときに、損失がどれくらい変わるか」を教えてくれます。簡単に言えば、誤差を減らすためにどちらへ動くべきか、その方向性を示します。

方向が分かったら、重みとバイアスを小さな一歩で更新します。このステップ幅は、学習率(learning rate) というパラメータで制御されます。学習率が高すぎると、モデルが正しい解を飛び越してしまうかもしれません。逆に小さすぎると、学習が非常に遅くなります。

この一連のプロセスは、出力から始めて入力へ向かって逆向きに、層ごとに行われます。だから逆伝播と呼ばれます。

つまり、学習の全サイクルは次のようになります:

  • モデルが入力を受け取り、予測を行う。
  • 予測を正解と比較し、損失を計算する。
  • 逆伝播によって、各重みとバイアスがその損失にどれだけ寄与したかを計算する。
  • 勾配と学習率を使って、モデルが重みとバイアスを更新する。

この処理は、損失が小さくなり、モデルがより良くなるまで、何度も繰り返されます。

要するに、逆伝播はニューラルネットワークが誤差を減らすために、重みとバイアスを正しい方向へ調整しながら学ぶことを助ける方法です。

言語モデルとのつながり

大規模言語モデルもやはりニューラルネットワークです。層、パラメータ、非線形性、損失、そして勾配による更新があります。タスクは画像のラベルの代わりに「次のトークン予測」になります。そして損失は、多くの場合クロスエントロピーです。順伝播、損失計算、逆伝播、そして更新のリズムは同じです。

この記事では直感を掴むために分類を使いました。今後の投稿では設定をテキストとトークンに切り替えますが、ここであなたが読んだ学習の物語は今もなお当てはまります。

Day 2は概念からコードへ移ります。PyTorchを見ていきます。テンソル、ネットワークがコード内でどのように表現されるか、そして学習ループが実際にはどのように組み合わさるのかを取り上げます。

投稿者 /u/Prashant-Lakhera
[リンク] [コメント]