始める前に、このブログは、ニューラルネットワークに関わる用語をある程度聞いたことがある人向けです。いくつかの概念について、非常に高い俯瞰的な理解を提供します。直感を作るのに役立ちます。
ニューラルネットワーク — わかりやすく説明
ニューラルネットワークは本質的に、あるデータ点の集合に対してカーブを当てはめるために使われます。それだけです。少なくとも私が知っているのはそこまでです。理論的には、この定義に従えば、ニューラルネットワークを使ってあらゆる種類のデータをフィットできます。
標準的なニューラルネットワークは、入れ子になった一連の関数にすぎません。データは入力から出力へ、完全に一方向に流れます。各層はデータを受け取り、それに対して自分の重み(接続の強さを決めるもの)で掛け、バイアス(活性化関数をシフトさせるもの)を加え、次のニューロンへそのまま渡します。最初の層での活性化関数の出力が、2層目への入力になります。この逐次処理によって、ネットワークは階層的な表現を構築できます。
バイアス分散トレードオフ
あらゆるニューラルネットワークのアーキテクチャには、バイアスと分散の間にある基本的な緊張関係があります:
バイアスが高い(アンダーフィッティング)は、ネットワークに、データの背後にあるパターンを捉えるための能力が欠けている場合に起こります。基本的には、ネットワークがデータの基になるパターン、あるいは「意味」を捉えられません。浅すぎる、あるいは制約が強すぎるネットワークは、学習データとテストデータの両方で一貫して誤った予測を生みます。モデルの前提があまりに硬直的だからです。
分散が高い(過学習)は、ネットワークが複雑すぎるときに生じます。汎化可能なパターンを学習するのではなく、ノイズを含む学習データを丸暗記してしまいます。何百万ものパラメータを持つディープネットワークは、未観測のデータでは致命的に失敗しているにもかかわらず、学習誤差をほぼゼロにまで到達させることができます。モデルが柔軟すぎるため、ノイズを信号として取り込んでしまっているのです。トレードオフは避けられません。バイアスを下げるほど、通常は分散が増え、その逆もまた成り立ちます。
ニューラルネットワークを設計することは、データを学習するのに十分表現力のあるモデルを作ることと、現実世界へうまく一般化できるように制約をかけることの、常にバランスを取る作業です。
重みとバイアス:学習可能なパラメータ
ニューラルネットワークは、2種類のパラメータによって学習します:
重み(W)は、ニューロン同士の接続の強さと符号を定義します。完全結合層では、重み行列が入力ベクトルを新しい表現空間へ変換します。各重みは「あるニューロンが別のニューロンへどれくらい影響するか」を決めます。正の重みは信号を増幅し、負の重みは信号を抑制します。
バイアス(b)は、入力の大きさに独立して活性化の閾値をシフトさせることで、並進不変性を与えます。バイアスがないと、ニューロンは原点を通る変換しか学習できません。これは重大な制限です。バイアス項により、
出力 = W·x + b、が可能になり、ネットワークは任意の決定境界を学習できるようになります。これらのパラメータを合わせると、ネットワークの仮説空間(ヒポテーシス空間)を定めます。L層からなり、各層にn個のニューロンがあるネットワークは、数百万というパラメータを持つことができ、それぞれが損失を最小化するための学習中に調整されます。
活性化関数
活性化関数は、深層学習を可能にする重要な非線形要素です。これがないと、複数の層を積み重ねても単一の線形変換に潰れてしまい、深さの意味がなくなります。活性化関数がない場合、ニューラルネットワークは単なる一連の線形な行列の掛け算になります。いくつ層を重ねても、結局は単一の線形変換に崩壊します。
ReLU(Rectified Linear Unit:整流線形ユニット)は隠れ層の業界標準です。数式はシンプルです:
f(x) = max(0, x)
入力が正なら、そのまま通します。入力が負なら、出力はゼロになります。これにより複雑な形状を学習するために必要な非線形性が導入されます。一方で計算は安価であり、これまでのSigmoidのような関数で問題になっていた勾配消失問題の緩和にも役立ちます。
なぜReLU?指数関数に比べて計算が簡単だからです。そして、正の入力に対して勾配が常に1なので、勾配が消失しにくくなります。ただしいくつかの例外的なケースもあります。ReLUは「Dying ReLU(死んだReLU)」問題とも呼ばれ、ReLU関数の性質により、入力が0未満になるニューロンはゼロに張り付いてしまいます。これによって多くのニューロンが「死んで」しまい、実質的にニューラルネットワークの精度が下がります。これは、すべての負の入力に対して非常に小さい傾き(スロープ)を追加することで、勾配がゼロにならないようにすることで解決されます。これにより、勾配が途切れずに流れ続けます。
損失関数
損失関数は、学習後にモデルがどれくらい間違っているかを調べるために使います。活性化関数と同様に、損失関数にも多くの種類があります。
回帰タスクでは、しばしば残差平方和(Residual Sum of Squares:RSS)、または二乗誤差和を使います。式は次の通りです:
RSS = \sum_{i=1}^{n} (y_i - \hat{y}_i)^2
ここで、y_iは実際の値で、haty_iは予測値です。
残差を二乗する理由は主に2つあります:
- 正の値化:負の誤差をすべて正の数に変えることで、相反する誤差同士が打ち消し合うのを防ぎます。
- 罰則:二乗は数学的に、小さな誤差よりも大きな誤差をはるかに強く罰するため、モデルに対して最も大きな間違いを優先させます。
しかし、分類タスク(言語モデルで次の単語を予測するなど)ではRSSでは不十分です。その代わりに交差エントロピー損失(Cross-Entropy Loss)を使います。この関数は、予測された確率分布を受け取り、それを正解と比較します。そうすることで、滑らかで微分可能な誤差スコアを計算し、次のパスでモデルが自信をどう調整すべきかを学ばせます。交差エントロピー損失の詳細は別のブログで。
勾配降下法
私はこれらをYouTubeチャンネル「StatQuest」(素晴らしい教材)からすべて学びました。そしてナレーターが、今でも覚えている「勾配降下法(Gradient Descent)」についてのふざけた歌を歌っていました。「Gradient Descent is decent....at optimising parameters!」そしてそれだけです。
損失を計算した後(損失関数を使って)、パラメータ(重みとバイアス)を1つずつ更新し、損失がほぼゼロになるまで同じ計算を繰り返します。つまり、モデルが最適に学習できたということです。
勾配降下法をよりよく理解するための便利な可視化を紹介します。モデルが目隠しをされていて、高次元の山の上にいると想像してください。そして谷(最小の誤差)にある最も低い地点を探そうとしています。目隠しをされているため、モデルは足元の地面の傾き(勾配)を直接感じ取るために微積分を使います。勾配降下法(Gradient Descent)は、下へ向けて一歩踏み出すという数学的なプロセスです。その一歩の大きさは学習率(Learning Rate)によって決まります。簡単に言うと、勾配降下法は連鎖律を使って、ある特定の重みに対する損失関数の導関数(微分)を計算します。
θ_new = θ_old - η*∇L(θ)
η*∇ ここでηは学習率で、Lはパラメータに関する損失の勾配を表し、θは更新されるべきパラメータ(重みでもバイアスでもよい)です。
バックプロパゲーション
バックプロパゲーションは、ディープネットワークの学習を現実的にするアルゴリズムです。連鎖律を再帰的に適用することで、すべてのパラメータに対する損失の勾配を計算します。最終出力(損失)から始め、微積分の連鎖律を使ってネットワークを逆方向に伝播し、すべての重みの正確な勾配(傾き)を計算します。そして、その勾配降下法によってパラメータを更新します。
注意機構(Attention Mechanism)
注意(Attention)はニューラルネットワークに革命をもたらし、すべての入力を同じように処理するのではなく、関連する情報に焦点を当てることを可能にしました。この仕組みは、学習された関連度スコアに基づいて、入力表現の重み付きの組み合わせを計算します。
注意(Attention)という中核となる操作:
Attention(Q, K, V) = softmax(Q*K^T/√d_k)*V
ここで、クエリ(Q)、キー(K)、バリュー(V)は入力の学習された射影です。これにより、モデルは各予測にとって入力のどの部分が最も関連しているかを学習できます。注意機構はTransformerの基盤になっており、NLP(GPT、BERT、Claudeなど)において支配的なアーキテクチャとなっています。自己注意(self-attention)により、RNNの再帰的ボトルネックを避けつつ、長距離の依存関係をモデリングできます。注意機構、多頭注意(multi-head attention)、Transformerアーキテクチャの詳細な探求については、近日公開のブログ記事で扱います。
Layer Normalisation and Batch Normalisation
データが何十もの層を通過するにつれて、それらの活性(activations)の分布は大きく変動し得ます。これは内部共変量シフト(Internal Covariate Shift)と呼ばれ、勾配が爆発したり消失したりする原因になります。
バッチ正規化(Batch Normalization)は、バッチ次元にわたって活性を正規化します。CNNや標準的なFFN(フィードフォワード・ニューラルネット)に対して非常に効果的です。
レイヤ正規化(Layer Normalization)は、単一のデータポイントに対して、特徴次元にわたって活性を正規化します。これは現代のTransformerモデルにおける安定化手法として第一の選択であり、系列長やバッチサイズが数学的な流れを乱さないようにします。
以上でこのブログは終わりです。気に入ってもらえたら嬉しいです!必要であれば、変更案があればぜひ提案してください :)




