機械学習におけるCPUとGPUの計算特性を数式で理解する

解説

機械学習の分野では、データの前処理、モデルの学習、推論といった多くの計算が発生します。
その中で、CPUとGPUはそれぞれ異なる強みを持っています。ここでは、各プロセッサの得意とする計算や並列性の違いを、数式や具体的な計算例を通して解説します。

基本概念:CPUとGPUの設計思想の違い

CPU:少数の高性能コアによるシリアル処理

  • 高クロック周波数と複雑な制御回路
    CPUは、複雑な分岐予測やキャッシュ制御などを備え、シングルスレッド(逐次処理)で高い性能を発揮します。
    例えば、次のようなループの計算を考えます。 $$S = \sum_{i=1}^{N} f(i)$$この累積和の計算は、各$f(i)$の計算結果を順次足し合わせる必要があり、CPUは命令を順番に高速で処理する点で有利です。

GPU:多数のシンプルなコアによる並列処理

  • 大量の演算ユニット(CUDAコア、シェーダーコア)
    GPUは、同じ処理を大量のデータに対して並列実行できるよう設計されています。たとえば、大規模な行列演算では以下のような計算が行われます。$$C_{ij} = \sum_{k=1}^{K} A_{ik} \times B_{kj}$$この行列積の計算は、各$C_{ij}$の要素を独立して計算できるため、各計算を個別のコアに割り当てることで、数百~数千のコアが同時に計算を行います。GPUはこのような並列処理に特化しており、行列演算のような「大規模なベクトル・行列計算」に非常に適しています。

数式で見る並列処理とその利点

行列乗算の並列化

CPUで行列 $A$(サイズ $m \times k$)と行列 $B$(サイズ $k \times n$)の乗算を行う場合、各要素$C_{ij}$の計算は以下のように定義されます。 $$C_{ij} = \sum_{l=1}^{k} A_{il} \cdot B_{lj} \quad \text{for } 1 \leq i \leq m,\; 1 \leq j \leq n$$

  • CPUの場合:
    少数の高性能コアでこの計算を逐次または限られた並列度で実行するため、各$C_{ij}$​ の計算が終わるまで次に進めるのは、コアの数に依存します。
  • GPUの場合:
    各$C_{ij}$​ の計算は独立しており、GPUではこれを数千のコアに分散して同時に計算可能です。たとえば、$m \times n$ の全要素を各コアに割り当てれば、並列に計算できるため、学習プロセスの高速化に大きく寄与します。

ベクトル演算とSIMDの利用

  • CPUのSIMD命令:
    CPUはSIMD(Single Instruction, Multiple Data)を利用して、1命令で複数のデータを一度に処理できます。たとえば、次のようなベクトルの和の計算をSIMDで実行する場合、 $$\mathbf{c} = \mathbf{a} + \mathbf{b}$$ 4つや8つの要素を一括して計算することで、逐次処理よりも高速に演算できます。しかし、SIMDは並列度に限界があり、GPUの数百〜数千のコアに比べると、並列実行できるスレッド数は少なくなります。
  • GPUのSIMTアーキテクチャ:
    GPUはSIMT(Single Instruction, Multiple Threads)というアーキテクチャを採用しており、各スレッドが独立して計算を行いつつ、同じ命令を実行する点で高い並列性を実現します。これは、大規模なデータ並列計算(例えば、ディープラーニングの行列演算)に最適です。

機械学習における実際の計算例

ニューラルネットワークのフォワードパス

ニューラルネットワークでは、各層で以下のような計算が行われます。 $$\mathbf{z} = W\mathbf{x} + \mathbf{b}, \quad \mathbf{a} = \sigma(\mathbf{z})$$

  • $W$:重み行列
  • $\mathbf{x}$:入力ベクトル
  • $\mathbf{b}$:バイアスベクトル
  • $\sigma$:活性化関数

この行列乗算$W\mathbf{x}$ は、大量の要素ごとの乗算と加算から成り、GPUの並列処理で非常に高速に実行できます。一方、CPUでも同様の計算は行えますが、並列実行のスケールが限定されるため、大規模なネットワークでは学習にかかる時間が長くなる傾向があります。

誤差逆伝播法(バックプロパゲーション)

学習時には、損失関数$L$の勾配を計算するため、以下のような数式が用いられます。 $$\frac{\partial L}{\partial W} = \frac{\partial L}{\partial \mathbf{z}} \cdot \mathbf{x}^T$$

ここでの行列やベクトルの計算も、大量の並列演算に適しており、GPUならば各要素の微分計算を同時に実行することで高速化が可能です。

まとめ

  • CPUの特徴:
    • 複雑な制御、分岐予測、キャッシュ管理により、シリアルな計算や少数の並列タスクに強い。
    • SIMD命令を用いたベクトル演算で一定の並列性は持つが、並列度は限定的。
  • GPUの特徴:
    • 数百〜数千のシンプルなコアによる大規模な並列処理が得意。
    • 行列演算やベクトル演算など、同じ計算を多くのデータに対して同時に実行する際に圧倒的な性能を発揮。

このように、計算の性質や処理の並列度に応じて、CPUとGPUはそれぞれ異なる強みを発揮します。機械学習やディープラーニングの学習プロセスにおいては、特にGPUの並列処理能力が高速化に大きく貢献するため、タスクの内容に応じたハードウェア選択が重要となります。

<<実際のスピード計測比較はこちら>>

コメント

タイトルとURLをコピーしました