Upgrade to Pro — share decks privately, control downloads, hide ads and more …

グラフィックスエンジニアのためのニューラルシェーディング入門

 グラフィックスエンジニアのためのニューラルシェーディング入門

2026/07/24 CEDEC2026

Avatar for Cygames, Inc.

Cygames, Inc. PRO

August 02, 2026

More Decks by Cygames, Inc.

Other Decks in Technology

Transcript

  1. 自己紹介 Cyllista Game Engine サブマネージャー リードグラフィックスエンジニア 林 秀一 いくつかのゲーム会社を経て、2015年に株式会社Cygamesへ合流。 内製ゲームエンジンの開発においてリードグラフィックスエンジニアを

    務める。 加えて、既成エンジンを用いたプロジェクトでのグラフィックス分野に おけるテクニカルディレクション、各種カンファレンスでのグラフィックス 技術情報の収集・共有、グラフィックスエンジニアの育成など 一貫してゲームグラフィックス領域に携わる。 2 /95
  2. 本講演の内容 元の講演を踏襲した部分: ◆ ニューラルネットワークの基礎説明 ◆ ニューラルシェーダによる画像生成例、等 重要ポイントを抜粋した部分: ◆ ニューラルシェーダの先行事例 ◆

    数式による理論説明 ◆ サンプルプログラムの解説 追加した説明: ◆ ニューラルネットワーク処理の直感的な図解 ◆ 図解と計算式の対応 特に基本的な部分 にフォーカス ポイントを大胆に 絞ってご紹介 本講演の特徴的な 部分 5 /95
  3. アジェンダ 1. 2. 3. 4. 5. 6. 7. 8. ニューラルシェーディングとは

    先行事例 ニューラルネットワークと推論計算 画像近似の例 近似のプロセス ニューラルネットワークの学習 ニューラルシェーダの実装 まとめ 7 /95
  4. ニューラルテクスチャ圧縮 ◆データ量 ◼ 30~80%削減 ◼ 品質と削減率を容易にトレードオフ可能 ◆パフォーマンス ◼ 1.5倍程度のテクスチャサンプル処理時間 ◼

    CoopVec API (後述)により、負荷削減の可能性 ◼ ロード時に1度だけ展開でもOK ※数値は各社の資料から読み取った概算です。 15 /95
  5. ニューラルベイクGI ◆Neural Light Grid: Modernizing Irradiance Volumes with Machine Learning

    [IWAN24] ◆Global Illumination In “Once Human”: A Hybrid Approach for 16km Open World [PAN25] ◆Decoding Light: Neural Compression of Global Illumination [CAO25] 17 /95
  6. ニューラルベイクGI (プローブベース) Image: Inigo Quilez (Wikimedia Commons), CC BY-SA 3.0

    時刻 ワールド位置 Neural Shader GI SH係数 5^3 Probe Brick内 の Irradiance算出 Neural Shader インドアウェイト インドア判定 18 /95
  7. ニューラルベイクGI (プローブベース) ◆データ量 ◼ <800MB, 16km2, Time of Day ◼

    98.5% 以上の削減 ◆パフォーマンス ◼ 50μsで12500プローブ解凍 @GTX1060 19 /95
  8. ニューロンの値 右上の括弧の中が、列(レイヤー)インデックス (0) 𝑎0 (0) 𝑎1 (1) 𝑎0 (2) 𝑎0

    (1) 𝑎1 (2) 𝑎1 (1) 𝑎2 (2) 𝑎2 (1) 𝑎3 (2) 𝑎3 (3) 𝑎0 (3) 𝑎1 (3) 𝑎2 25 /95
  9. ニューロンひとつ分の計算 (0) 𝑎0 (0) 𝑎1 𝑤0 𝑤1 𝑤2 (0) 𝑎2

    1 𝑏 𝑧 = 𝑤0 𝑎0 + 𝑤1 𝑎1 + 𝑤2 𝑎2 + 𝑏 a = Activation(𝑧) (1) 𝑎0 𝒘: ウェイト、𝒃: バイアス この2つを合わせて ネットワークパラメータと呼ぶ。 26 /95
  10. 活性化関数 (0) 𝑎0 (0) 𝑎1 𝑤0 𝑤1 𝑤2 (0) 𝑎2

    𝑏 𝑧 = 𝑤0 𝑎0 + 𝑤1 𝑎1 + 𝑤2 𝑎2 + 𝑏 a = Activation(𝑧) (1) 𝑎0 Activation: 活性化関数 非線形性を取り入れる。 1 27 /95
  11. ReLU活性化関数 (0) 𝑎0 (0) 𝑎1 𝑤0 𝑤1 𝑤2 (0) 𝑎2

    𝑧 = 𝑤0 𝑎0 + 𝑤1 𝑎1 + 𝑤2 𝑎2 + 𝑏 a = ReLU(𝑧) (1) 𝑎0 𝑏 1 28 /95
  12. ReLU活性化関数 (0) 𝑎0 (0) 𝑎1 𝑤0 𝑤1 𝑤2 (0) 𝑎2

    𝑧 = 𝑤0 𝑎0 + 𝑤1 𝑎1 + 𝑤2 𝑎2 + 𝑏 a = max(0, 𝑧) (1) 𝑎0 𝑏 1 29 /95
  13. 順伝搬の行列計算 (0) 𝑎0 (0) 𝑎1 (0) 𝑎2 𝑤0,1 (1) 0

    𝑎0 = 𝜙(𝑤0,0 𝑎0 0 + 𝑤0,1 𝑎1 0 + ⋯ + 𝑤0,𝑛 𝑎𝑛 ( 𝑤0,0 ( 𝑤1,0 ( 𝑤0,1 ( 𝑤1,1 ( 𝑤0,𝑛 ( 𝑤1,𝑛 (0) 𝑎0 0 𝑎1 ⋮ ( 𝑤𝑘,0 ⋮ ( 𝑤𝑘,1 ⋮ ⋮ ( 𝑤𝑘,𝑛 (0) 𝑎𝑛 + 𝑏0 ) 𝑤0,2 𝑤0,3 … (0) 𝑎3 𝑤0,0 Activation 𝑤0,𝑛 … =𝜙 (0) 𝑎𝑛 ⋯ ⋯ ⋱ ⋯ + ( 𝑏0 ( 𝑏1 ⋮ ( 𝑏𝑘 𝑏0 30 /95
  14. 順伝搬の行列計算 (0) 𝑎0 (0) 𝑎1 (0) 𝑎2 𝑤1,0 𝑤1,1 (1)

    0 𝑎1 = 𝜙(𝑤1,0 𝑎0 0 + 𝑤1,1 𝑎1 0 + ⋯ + 𝑤1,𝑛 𝑎𝑛 ( 𝑤0,0 ( 𝑤1,0 ( 𝑤0,1 ( 𝑤1,1 ( 𝑤0,𝑛 ( 𝑤1,𝑛 (0) 𝑎0 0 𝑎1 ⋮ ( 𝑤𝑘,0 ⋮ ( 𝑤𝑘,1 ⋮ ⋮ ( 𝑤𝑘,𝑛 (0) 𝑎𝑛 + 𝑏1 ) 𝑤1,2 𝑤1,3 … (0) 𝑎3 Activation 𝑤1,𝑛 … (0) 𝑎𝑛 =𝜙 ⋯ ⋯ ⋱ ⋯ + ( 𝑏0 ( 𝑏1 ⋮ ( 𝑏𝑘 𝑏1 31 /95
  15. 順伝搬の行列計算 (0) 𝑎0 Activation (0) 𝑎1 (1) 0 𝑎𝑘 =

    𝜙(𝑤2,0 𝑎0 (0) 𝑎2 0 + 𝑤2,1 𝑎1 0 + ⋯ + 𝑤2,𝑛 𝑎𝑛 ( 𝑤0,0 ( 𝑤1,0 ( 𝑤0,1 ( 𝑤1,1 ( 𝑤0,𝑛 ( 𝑤1,𝑛 (0) 𝑎0 0 𝑎1 ⋮ ( 𝑤𝑘,0 ⋮ ( 𝑤𝑘,1 ⋮ ⋮ ( 𝑤𝑘,𝑛 (0) 𝑎𝑛 + 𝑏𝑘 ) 𝑤2,0 𝑤2,1 𝑤2,2 … 𝑤2,3 (0) 𝑎𝑛 𝑤2,𝑛 … (0) 𝑎3 =𝜙 ⋯ ⋯ ⋱ ⋯ + ( 𝑏0 ( 𝑏1 ⋮ ( 𝑏𝑘 𝑏𝑘 32 /95
  16. 順伝搬の行列計算 (0) 𝑎0 (0) 𝑎1 (0) 𝑎2 … (0) 𝑎𝑛

    𝒂(1) = 𝜙(𝑴𝒂(0) + 𝒃) (0) 𝑎1 (0) 𝑎2 … (0) 𝑎3 (0) 𝑎0 (0) 𝑎𝑘 (1) 𝑎0 1 𝑎1 =𝜙 ⋮ (1) 𝑎𝑘 ( 𝑤0,0 ( 𝑤1,0 ( 𝑤0,1 ( 𝑤1,1 ⋮ ( 𝑤𝑘,0 ⋮ ( 𝑤𝑘,1 ⋯ ⋯ ⋱ ⋯ ( 𝑤0,𝑛 ( 𝑤1,𝑛 (0) 𝑎0 0 𝑎1 ⋮ ⋮ ( 𝑤𝑘,𝑛 (0) 𝑎𝑛 + ( 𝑏0 ( 𝑏1 ⋮ ( 𝑏𝑘 33 /95
  17. Frequency Encoding sin(u), cos(u), sin(v), cos(v) U sin(2u), cos(2u), sin(2v),

    cos(2v) sin(4u), cos(4u), sin(4v), cos(4v) V 入力ニューロン を増やす sin(8u), cos(8u), sin(8v), cos(8v) 38 /95
  18. 非線形性 非線形 線形 折れ線、曲線 直線 (1) 0 𝑎𝑘 = 𝜙(𝑤𝑘,0

    𝑎0 0 + 𝑤𝑘,1 𝑎1 0 + ⋯ + 𝑤𝑘,𝑛 𝑎𝑛 + 𝑏𝑘 ) 43 /95
  19. 線形関数にReLU適用 (𝟎) 𝐳 = 𝒘𝒂 + 𝒃 𝒂 (𝟏) =

    𝒎𝒂𝒙(𝟎, 𝒛) 平地 上り坂 下り坂 平地 ゼロ未満がなくなる 44 /95
  20. ReLUの後、線形変換 𝒂 (𝟏) 𝐳 = 𝒘𝒂 + 𝒃 = 𝒎𝒂𝒙(𝟎,

    𝒛) 平地 下り坂 −𝑎 平地 −3𝑎 + 2 +傾きを急に −𝑎 上り坂 −0.3𝑎 − 1 +傾きを緩やかに 下り坂 上り坂 平地 平地 45 /95
  21. 3次関数の近似例 (0) 𝑎0 (0) (0) (0) 𝑤0 𝑎0 + 𝑏0

    (1) 𝑎0 (1) (1) (1) 𝑤0 𝑎0 + 𝑏0 (0) (0) (0) 𝑤1 𝑎1 + 𝑏1 𝑎1 (1) (1) (1) (1) 𝑤1 𝑎1 + 𝑏1 (0) (0) (0) 𝑤2 𝑎2 + 𝑏2 (1) 𝑎2 𝑤2 𝑎2 + 𝑏2 (0) (0) (0) 𝑤3 𝑎3 + 𝑏3 (1) 𝑎3 (1) (1) (1) (1) (1) (1) + 𝑓 𝑤3 𝑎3 + 𝑏3 47 /95
  22. 3次関数の近似例 (0) 𝑎0 (0) (0) (0) 𝑤0 𝑎0 + 𝑏0

    (1) 𝑎0 (1) (1) (1) 𝑤0 𝑎0 + 𝑏0 (0) (0) (0) 𝑤1 𝑎1 + 𝑏1 (1) 𝑎1 𝑤1 𝑎1 + 𝑏1 (0) (0) (0) 𝑤2 𝑎2 + 𝑏2 (1) 𝑎2 𝑤2 𝑎2 + 𝑏2 (0) (0) (0) 𝑤3 𝑎3 + 𝑏3 (1) 𝑎3 𝑤3 𝑎3 + 𝑏3 (1) (1) (1) (1) (1) (1) (1) (1) (1) + 𝑓 48 /95
  23. 線形変換 ReLU 線形変換 ReLU … ニューラルネットワークは ◆ 行列とベクトルを用いて計算できる ◆ 近似精度と計算負荷のトレードオフがしやすい

    ニューロンの数、レイヤーの数 ◆ 非線形の複雑な関数を近似できる いくつか条件はあるが、近似可能なケースは多い。 49 /95
  24. 学習ループ 推論結果 U 正解画像 差分画像 R G V B ①推論

    (描画) ②差分 バイアスと ウェイトの勾配 バイアスと ウェイトの調整量 −0. 73 +0.06 −∇𝐶 𝑾 = ⋮ ⑤バイアス、 −0.24 ウェイトを更新 ④調整量算出 ③勾配算出 51 /95
  25. ニューラルネットワークは合成関数 L k 𝑤0,0 𝑎0 L k + 𝑤0,1 𝑎1

    L + 𝑏0 (𝑘) 𝑎0 = 𝜙 j k 𝑤0,0 𝑎0 j k + 𝑤0,1 𝑎1 j k + 𝑤0,2 𝑎1 (j) 𝑎0 = 𝜙 𝑗 i 𝑤0,0 𝑎0 j i + 𝑤0,1 𝑎1 j + 𝑏0 (𝐿) 𝑎0 (𝑗) 𝑎0 … (L) 𝑎0 = 𝜙 (𝑘) 𝑎0 k + 𝑏0 … 連鎖律: 𝑓 𝑔 ℎ(𝑥) 𝑑𝑓 𝑑𝑓 𝑑𝑔 𝑑ℎ という合成関数の場合、 = ∙ ∙ 𝑑𝑥 𝑑𝑔 𝑑ℎ 𝑑𝑥 56 /95
  26. 正解に近づけるには? Rを上げたい! R U U U V V G V

    B シアン 赤 推論結果 正解 G,Bを下げたい! 57 /95
  27. ウェイトの増減 ニューロンの値が 高いほど… 0.3 1.0 -1.0 ニューロンの値が 低いほど… -0.7 𝑤0

    ウェイトを上げるべき 𝑤1 R 𝑤2 𝑤3 Rを上げたい! ウェイトを下げるべき 𝑤4 0.8 𝑏𝑗 59 /95
  28. 入力ニューロン値の増減 + + + + R + + G +

    + B Bを下げたい! + + 63 /95
  29. 入力ニューロン値の増減 + + + + R + + G +

    + B + + トータルの増減 64 /95
  30. 線形部分の勾配 (0) 𝑎0 (0) 𝑎1 (0) 𝑎2 … (0) 𝑎𝑛

    (1) 𝑎0 (1) 𝑎1 (1) 𝑎2 𝑑𝒛(1) 活性化後の勾配を 活性化前の勾配に変換 𝑑𝒛(1) = 𝑑𝒂(1) ⨀ 𝜙 ′ 𝒛 1 … (0) 𝑎3 𝑑𝒂(1) (1) 𝑎𝑘 67 /95
  31. バイアスの勾配 (0) 𝑎0 (0) 𝑎1 (0) 𝑎2 𝑑𝒃(1) 𝑏0 (1)

    𝑎0 𝑏1 (1) 𝑎1 𝑏2 (1) 𝑎2 … (0) 𝑎3 … (0) 𝑎𝑛 𝑑𝒛(1) 𝑏𝑘 (1) 𝑎𝑘 (1) 𝑑𝒃 (1) 𝑑𝑏0 1 𝑑𝑏1 ⋮ (1) 𝑑𝑏𝑘 = 𝑑𝒛 = (1) (1) 𝑑𝑧0 1 𝑑𝑧1 ⋮ (1) 𝑑𝑧𝑘 68 /95
  32. ウェイトの勾配 𝒂(0) (0) 𝑎0 (0) 𝑎1 (0) 𝑎2 (1) 𝑎0

    … (1) 𝑎1 … (1) 𝑎2 … … … … (0) 𝑎𝑛 𝑑𝒛(1) … … … (0) 𝑎3 𝑑𝑴(1) (1) 𝑎𝑘 𝑑𝑴(1) = 𝑑𝒛(1) ⊗𝑜𝑢𝑡𝑒𝑟 𝒂(0) = 𝑑𝒛 1 (𝒂 0 )𝑇 (1) 𝑑𝑤0,0 (1) 𝑑𝑤1,0 (1) 𝑑𝑤0,1 (1) 𝑑𝑤1,1 ⋮ (1) 𝑑𝑤𝑘,0 ⋮ (1) 𝑑𝑤𝑘,1 ⋯ ⋯ ⋱ ⋯ (1) 𝑑𝑤0,𝑛 (1) 𝑑𝑤1,𝑛 ⋮ (1) 𝑑𝑤𝑘,𝑛 = (1) 𝑑z0 1 𝑑z1 (0) 𝑇 𝑎0 0 𝑎1 ⋮ ⋮ (1) (0) 𝑑z𝑘 𝑎𝑛 69 /95
  33. ニューロンの勾配 𝑑𝒂(0) (0) 𝑎0 (0) 𝑎1 (0) 𝑎2 … (0)

    𝑎𝑛 𝑤0,0 𝑤1,0 𝑤2,0 𝑤𝑘,0 𝑑𝒂(0) = 𝑴𝑇 𝑑𝒛(1) (1) 𝑎0 (1) 𝑎1 (1) 𝑎2 … (0) 𝑎3 𝑑𝒛(1) (1) 𝑎𝑘 (0) 𝑑𝑎0 0 𝑑𝑎1 ⋮ (0) 𝑑𝑎𝑛 = (1) 𝑤0,0 (1) 𝑤1,0 (1) 𝑤0,1 (1) 𝑤1,1 ⋮ ⋮ (1) 𝑤𝑘,0 (1) 𝑤𝑘,1 ⋯ ⋯ ⋱ ⋯ (1) 𝑇 𝑤0,𝑛 (1) 𝑤1,𝑛 ⋮ (1) 𝑤𝑘,𝑛 (1) 𝑑𝑧0 1 𝑑𝑧1 ⋮ (1) 𝑑𝑧𝑘 70 /95
  34. Slang/SlangPy SlangPy ◼ 高機能なシェーダ言語 ◼ マルチプラットフォーム ◼ オープンソース ◼ HLSLとほぼ同様の基本構文

    ◼ モダンな言語機能 ◼ インターフェース ◼ ジェネリクス ◼ モジュールシステム ◼ Slang向け Pythonインターフェース ◆ Slangシェーダ関数をPythonから 直接的に呼出し可能 ◆ 非常にシンプルなコードで データバインディング可能 ◼ フル機能のグラフィックスAPI ◼ クロスプラットフォーム ◼ 自動微分 74 /95
  35. パラメータバインディング Slang Python class NetworkLayer(spy.InstanceList): def __init__(…): … self.biases =

    … self.weights = … self.biases_grad = … self.weights_grad = … … class Network(spy.InstanceList): def __init__(self): … self.layer0 = NetworkParameters(2, 32) self.layer1 = NetworkParameters(32, 32) self.layer2 = NetworkParameters(32, 3) ・バイアス ・ウェイト ・勾配 同名の変数に バインド 3レイヤー 保持 struct NetworkLayer<int Inputs, int Outputs> { … Tensor<float, 1> biases; Tensor<float, 2> weights; AtomicTensor<float, 1> biases_grad; AtomicTensor<float, 2> weights_grad; … } struct Network { … NetworkParameters<2, 32> layer0; NetworkParameters<32, 32> layer1; NetworkParameters<32, 3> layer2; } 75 /95
  36. 順伝搬計算 mul(weights, inputVec) + biases float[Outputs] forward(float[Inputs] x) { float[Outputs]

    y; for (int row = 0; row < Outputs; ++row) { var sum = get_bias(row); for (int col = 0; col < Inputs; ++col) sum += get_weight(row, col) * x[col]; y[row] = sum; } return y; } ( 𝑤0,0 ( 𝑤1,0 ( 𝑤0,1 ( 𝑤1,1 ⋮ ( 𝑤𝑘,0 ⋮ ( 𝑤𝑘,1 ⋯ ( 𝑤0,𝑛 ( 𝑤1,𝑛 ⋯ ⋱ ⋮ ( ⋯ 𝑤𝑘,𝑛 (0) 𝑎0 0 𝑎1 ⋮ (0) 𝑎𝑛 + ( 𝑏0 ( 𝑏1 ⋮ ( 𝑏𝑘 76 /95
  37. ネットワークを通して順伝搬(推論) float3 eval(no_diff float2 uv) { float inputs[2] = {

    uv.x, uv.y }; float output0[32] = layer0.forward(inputs); for (int i = 0; i < 32; ++i) output0[i] = activation(output0[i]); Layer 0 float output1[32] = layer1.forward(output0); for (int i = 0; i < 32; ++i) output1[i] = activation(output1[i]); Layer 1 float output2[3] = layer2.forward(output1); for (int i = 0; i < 3; ++i) output2[i] = activation(output2[i]); Layer 2 return float3(output2[0], output2[1], output2[2]); 77 /95
  38. 学習ループ(再掲) 推論結果 U 正解画像 差分画像 R G V B ①推論

    (描画) ②差分 バイアスと ウェイトの勾配 バイアスと ウェイトの調整量 −0. 73 +0.06 −∇𝐶 𝑾 = ⋮ ⑤バイアス、 −0.24 ウェイトを更新 ④調整量算出 ③勾配算出 78 /95
  39. 学習ループ(再掲) 推論結果 U 正解画像 差分画像 R G V ①推論 B

    render(…) (描画) バイアスと ウェイトの調整量 −0. 73 +0.06 −∇𝐶 𝑾 = ⋮ ⑤バイアス、 optimizer_step() ④調整量算出 −0.24 ウェイトを更新 loss(…) ②差分 バイアスと ウェイトの勾配 bwd_diff(loss) ③勾配算出 79 /95
  40. 自動微分 [SIGG25-NSC] P.35 正解画像と推論結果の 差分を取る loss 推論画像を描画 render ニューラルネットワーク で推論

    Network::eval 1レイヤー分の 順伝搬計算 Layer::forward パラメータを 使用 [Differentiable] biases weights 80 /95
  41. 自動微分 Slang 自動微分オペレータ bwd_diff(loss) 勾配算出処理 コンパイル時生成 正解画像と推論結果の 差分を取る loss 推論画像を描画

    render ニューラルネットワーク で推論 Network::eval 1レイヤー分の 順伝搬計算 Layer::forward 勾配を ストア [BackwardDerivativeOf(…)] biases_grad weights_grad パラメータを 使用 [Differentiable] biases weights 81 /95
  42. バイアス、ウェイト調整(最適化) void optimizer_step(inout float weight, inout float grad) { const

    float LEARNING_RATE = 0.1; float step = (grad) * LEARNING_RATE; weight -= step; grad = 0.0f; } 増減量 = 勾配 * 学習率 ウェイト -= 増減量 82 /95
  43. 順伝搬計算(CoopVec ver.) mul(weights, inputVec) + biases CoopVec<half, Outputs> forward(CoopVec<half, Inputs>

    x) { return coopVecMatMulAdd<half, Outputs>( x, CoopVecComponentType.Float16, weights, 0, CoopVecComponentType.Float16, biases, 0, CoopVecComponentType.Float16, CoopVecMatrixLayout.InferencingOptimal, false, 0 ); } ( 𝑤0,0 ( 𝑤1,0 ( 𝑤0,1 ( 𝑤1,1 ⋮ ( 𝑤𝑘,0 ⋮ ( 𝑤𝑘,1 ⋯ ( 𝑤0,𝑛 ( 𝑤1,𝑛 ⋯ ⋱ ⋮ ( ⋯ 𝑤𝑘,𝑛 (0) 𝑎0 0 𝑎1 ⋮ (0) 𝑎𝑛 + ( 𝑏0 ( 𝑏1 ⋮ ( 𝑏𝑘 coopVecMatMulAdd 86 /95
  44. 自動微分に頼らない勾配算出 bwd_diff(…) CoopVecを用いたコードには 適用できない! [BackwardDerivativeOf(eval)] public void evalBwd( inout DifferentialPair<MLVec<InputSize>>

    input, MLVec<OutputSize> resultGrad) { … … 勾配の算出を行う関数を … … 自前実装する必要がある! … } 87 /95
  45. 活性化関数の勾配算出 [BackwardDerivativeOf(eval)] public void evalBwd( inout DifferentialPair<MLVec<InputSize>> input, MLVec<OutputSize> resultGrad)

    { let fwd = eval(input.p); 順伝搬計算 [ForceUnroll] for (int i = 0; i < OutputSize; i++) { if (fwd.data[i] < 0.0) resultGrad.data[i] = 0; } 引数: あるレイヤーの ・入力(前段)ニューロンの値列 ・出力(後段)ニューロンの勾配 活性化後の勾配を 活性化前の勾配に変換 順伝搬の結果が ・ゼロ未満なら勾配 0 ・ゼロ以上なら勾配 1 … } 88 /95
  46. ウェイト、バイアス、ニューロンの勾配算出 [BackwardDerivativeOf(eval)] public void evalBwd( inout DifferentialPair<MLVec<InputSize>> input, MLVec<OutputSize> resultGrad)

    { … coopVecOuterProductAccumulate( resultGrad.data, input.p.data, weightsGrad, …); coopVecReduceSumAccumulate( resultGrad.data, (void*)biasesGrad); } ウェイトの勾配算出 coopVecOuterProductAccumulate バイアスの勾配算出 coopVecReduceSumAccumulate let dInput = coopVecMatMul<NFloat, InputSize>( resultGrad.data, …, weights, …); 入力ニューロンの勾配算出 coopVecMatMul input = {input.p, {dInput}}; 前の層に ニューロンの勾配を逆伝搬 89 /95
  47. ウェイトの勾配 𝒂(0) (0) 𝑎0 (0) 𝑎1 (0) 𝑎2 (1) 𝑎0

    … (1) 𝑎1 … (1) 𝑎2 … … … … (0) 𝑎𝑛 𝑑𝒛(1) … … … (0) 𝑎3 𝑑𝑴(1) (1) 𝑎𝑘 ウェイトの勾配算出 coopVecOuterProductAccumulate (1) 𝑑𝑤0,0 (1) 𝑑𝑤1,0 (1) 𝑑𝑤0,1 (1) 𝑑𝑤1,1 ⋮ (1) 𝑑𝑤𝑘,0 ⋮ (1) 𝑑𝑤𝑘,1 ⋯ ⋯ ⋱ ⋯ (1) 𝑑𝑤0,𝑛 (1) 𝑑𝑤1,𝑛 ⋮ (1) 𝑑𝑤𝑘,𝑛 = (1) 𝑑𝑧0 1 𝑑𝑧1 (0) 𝑇 𝑎0 0 𝑎1 ⋮ ⋮ (1) (0) 𝑑𝑧𝑘 𝑎𝑛 90 /95
  48. バイアスの勾配 (0) 𝑎0 (0) 𝑎1 (0) 𝑎2 𝑑𝒃(1) 𝑏0 (1)

    𝑎0 𝑏1 (1) 𝑎1 𝑏2 (1) 𝑎2 … (0) 𝑎3 … (0) 𝑎𝑛 𝑑𝒛(1) 𝑏𝑘 (1) 𝑎𝑘 バイアスの勾配算出 coopVecReduceSumAccumulate (1) 𝑑𝑏0 1 𝑑𝑏1 ⋮ (1) 𝑑𝑏𝑘 = (1) 𝑑𝑧0 1 𝑑𝑧1 ⋮ (1) 𝑑𝑧𝑘 91 /95
  49. ニューロンの勾配 𝑑𝒂(0) (0) 𝑎0 (0) 𝑎1 (0) 𝑎2 … (0)

    𝑎𝑛 𝑤0,0 𝑤1,0 𝑤2,0 𝑤𝑘,0 (1) 𝑎0 (1) 𝑎1 (1) 𝑎2 … (0) 𝑎3 入力ニューロンの勾配算出 coopVecMatMul 𝑑𝒛(1) (1) 𝑎𝑘 (0) 𝑑𝑎0 0 𝑑𝑎1 ⋮ (0) 𝑑𝑎𝑛 = (1) 𝑤0,0 (1) 𝑤1,0 (1) 𝑤0,1 (1) 𝑤1,1 ⋮ ⋮ (1) 𝑤𝑘,0 (1) 𝑤𝑘,1 ⋯ ⋯ ⋱ ⋯ (1) 𝑇 𝑤0,𝑛 (1) 𝑤1,𝑛 ⋮ (1) 𝑤𝑘,𝑛 (1) 𝑑𝑧0 1 𝑑𝑧1 ⋮ (1) 𝑑𝑧𝑘 92 /95
  50. References [SIGG25-NSC] Nat Duca, Yong He, Benedikt Bitterli, Chris Cummings,

    Alexey Bekin, Alexey Panteleev, and Aaron Lefohn. 2025. “An Introduction to Neural Shading.” ACM SIGGRAPH 2025 Courses. ACM DL: https://dl.acm.org/doi/full/10.1145/3721241.3733999 Code/Materials: https://github.com/shader-slang/neural-shading-s25 [BEKIN25] Alexey Bekin, Alexey Panteleev, and Shawn Hargreaves. 2025. “RTX Neural Shading: Practical Techniques and Applications.” Game Developers Conference 2025. Video: https://www.nvidia.com/en-us/on-demand/session/gdc25-gdc1003/ [HARG25] Shawn Hargreaves, Joe Rozek, Anis Benyoub, and Alexey Panteleev. 2025. “Advanced Graphics Summit: Cooperative Vectors and Neural Rendering.” Game Developers Conference 2025. GDC Vault: https://gdcvault.com/play/1035477/Advanced-Graphics-Summit-Cooperative-Vectors [NVIDIA-NS] NVIDIA Corporation. “RTX Neural Shading.” GitHub: https://github.com/NVIDIA-RTX/RTXNS/tree/main 96 /95
  51. References [HOUD24] Antoine Houdard, Georges Nader, and Olivier Pomarez. 2024.

    “Machine Learning Summit: Real-time Neural Textures for Materials Compression (With Introduction from Summit Advisor Olivier Pomarez).” Game Developers Conference 2024. GDC Vault: https://gdcvault.com/play/1034439/Machine-Learning-Summit-Real-time [NVIDIA-NTC] NVIDIA Corporation. “RTX Neural Texture Compression (NTC) SDK v0.9.2 BETA.“ GitHub. https://github.com/NVIDIA-RTX/RTXNTC [VAID23] Karthik Vaidyanathan, Marco Salvi, Bartlomiej Wronski, Tomas Akenine-Möller, Pontus Ebelin, Aaron Lefohn. 2023. “Random-Access Neural Compression of Material Textures.” ACM SIGGRAPH 2023. https://research.nvidia.com/labs/rtr/neural_texture_compression/ [FUJI24] Shin Fujieda and Takahiro Harada. 2024. “Neural Texture Block Compression.” arXiv:2407.09543. https://gpuopen.com/download/2024_NeuralTextureBCCompression.pdf [INTEL-TSNC] Intel Corporation. “Intel® Texture Set Neural Compression.” GitHub. https://github.com/GameTechDev/TextureSetNeuralCompressionSample 97 /95
  52. References [ZELT24] Tizian Zeltner, Fabrice Rousselle, Andrea Weidlich, Petrik Clarberg,

    Jan Novák, Benedikt Bitterli, Alex Evans, Tomáš Davidovič, Simon Kallweit, Aaron Lefohn. 2024. “Real-Time Neural Appearance Models.” ACM Transactions on Graphics. Presented at ACM SIGGRAPH 2024. Project Page: https://research.nvidia.com/labs/rtr/neural_appearance_models/ [IWAN24] Michal Iwanicki, Peter-Pike Sloan, Ari Silvennoinen, and Peter Shirley. 2024. “Neural Light Grid: Modernizing Irradiance Volumes with Machine Learning.” ACM SIGGRAPH 2024 Course: Advances in Real-Time Rendering in Games. Materials: https://research.activision.com/publications/2024/08/Neural_Light_Grid [PAN25] Lele Pan, Maode Shi. 2025. “Global Illumination in ’Once Human’: A Hybrid Approach for 16km Open World.” Game Developers Conference 2025. GDC Vault: https://gdcvault.com/play/1035269/Global-Illumination-in-Once-Human [CAO25] Luyan Cao. 2025. “Decoding Light: Neural Compression for Global Illumination.” Game Developers Conference 2025. GDC Vault: https://gdcvault.com/play/1035273/Decoding-Light-Neural-Compression-for 98 /95
  53. References [SAND17] Grant Sanderson, Josh Pullen. 2017. (1) “But what

    is a Neural Network?” Video: https://www.3blue1brown.com/lessons/neural-networks/ (2) “Gradient descent, how neural networks learn.” Video: https://www.3blue1brown.com/lessons/gradient-descent/ (3) “Analyzing our neural network Image.” Video: https://www.3blue1brown.com/lessons/neural-network-analysis/#analyzing-our-neural-network (4) “What is backpropagation really doing?” Video: https://www.3blue1brown.com/lessons/backpropagation/ (5) “Backpropagation calculus” Video: https://www.3blue1brown.com/lessons/backpropagation-calculus/ [MOUG21] Hugo Mougard. “Visualization of the universal approximation theorem.” Video: https://www.youtube.com/watch?v=Ln8pV1AXAgQ 99 /95
  54. 従来の行列演算 mul(weights, inputVec) + biases Thread 0 … Thread 1

    … * … + … * … + … … … … 入力ベクトル ウェイト行列 バイアスベクトル 101 /95
  55. “Cooperative” mul(weights, inputVec) + biases 演算は専用命令 (専用H/W)で実行 ウェーブ内のスレッドが協調し 1つの大きなマトリクスを形成 Wave

    Thread 0 Thread 1 Thread 2 … * … … 入力ベクトル + 〃 〃 … … … Thread 31 … … … 全ての行で 同じバイアス 〃 ウェイト行列 バイアスベクトル 102 /95
  56. “Cooperative” CoopVec なし … Wave … * … Thread 0

    Thread 1 Thread 2 Thread 31 Thread 1 … * … … … … Thread 0 CoopVec あり * … … … … … 103 /95