Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
グラフィックスエンジニアのためのニューラルシェーディング入門
Search
Cygames, Inc.
PRO
August 02, 2026
Technology
8
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
グラフィックスエンジニアのためのニューラルシェーディング入門
2026/07/24 CEDEC2026
Cygames, Inc.
PRO
August 02, 2026
More Decks by Cygames, Inc.
See All by Cygames, Inc.
コードレビュー支援ツール開発から学ぶ:LLMを用いた業務システムの実践的な運用設計と誤出力対策
cygames
PRO
0
7
『ウマ娘 プリティーダービー』 英語版のキャラクターの方言や口調をローカライズするための創造的アプローチ
cygames
PRO
0
1
ゲームシナリオライターを支援するAIツール開発の実践 ― 設計とプロンプトの工夫 ―
cygames
PRO
1
24
専門性の高いデフォルメチームが挑んだ人材育成戦略 〜Cygames Academiaの企画から実施まで〜
cygames
PRO
0
10
【U/Day Tokyo 2025】Cygames流 最新スマートフォンゲームの技術設計 〜『Shadowverse: Worlds Beyond』におけるアーキテクチャ再設計の挑戦~
cygames
PRO
4
18k
【CEDEC+KYUSHU2025】学生・若手必見!テクニカルアーティスト 大全 ~仕事・スキル・キャリアパス、TAの「わからない」を徹底解剖~
cygames
PRO
1
1.4k
【TiDB User Day2025】リリース時のアクセス急増をいかにしてノーメンテで乗り越えたか 〜『Shadowverse: Worlds Beyond』におけるTiDB採用のゲームサーバー設計〜
cygames
PRO
1
2.9k
【CEDEC2025】『Shadowverse: Worlds Beyond』二度目のDCG開発でゲームをリデザインする~遊びやすさと競技性の両立~
cygames
PRO
2
1k
【CEDEC2025】大規模言語モデルを活用したゲーム内会話パートのスクリプト作成支援への取り組み
cygames
PRO
2
2.7k
Other Decks in Technology
See All in Technology
AIがコードを書く時代、人間は何を保証するのか———馬場さんと考える、開発者に求められる新しい責任と価値 - TECH PLAY
netmarkjp
0
950
Webの技術とガジェットで子どもも大人も楽しめるワクワク体験を提供する / Qiita Tech Festa Day 2026
you
PRO
1
330
VPCセキュリティ対応の最新事情
nagisa53
2
350
PLaMo 3.0 Primeの構造化出力サポート
pfn
PRO
0
150
クラウドセキュリティ入門 ~安全なクラウド利用のための基礎知識~
lhazy
7
4.5k
AI エージェント時代のデジタルアイデンティティ
fujie
2
1.3k
なぜ、あなたのエージェントは言うことを聞かないのか
segavvy
1
610
AWS環境のセキュリティ不安を解消した企業事例 ~よくある課題と対策を一挙公開~
asanoharuki
0
260
データベース研修【MIXI 26新卒技術研修】
mixi_engineers
PRO
1
760
QAと開発の両側から進める AI活用 -QAプロセスAI支援ツールキットと Inner Loop / Outer Loopの取り組み-
legalontechnologies
PRO
2
390
初めてのGitHub Actions / GitHub Actions at First
tooppoo
0
110
Oracle Base Database Service 技術詳細
oracle4engineer
PRO
15
110k
Featured
See All Featured
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
67
56k
Visualization
eitanlees
152
17k
KATA
mclloyd
PRO
35
15k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.7k
Embracing the Ebb and Flow
colly
88
5.1k
The SEO Collaboration Effect
kristinabergwall1
1
510
Testing 201, or: Great Expectations
jmmastey
46
8.2k
Product Roadmaps are Hard
iamctodd
55
12k
The Language of Interfaces
destraynor
162
27k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.6k
Build your cross-platform service in a week with App Engine
jlugia
234
18k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.1k
Transcript
エンジニアリング グラフィックスエンジニアのための ニューラルシェーディング入門 株式会社Cygames Cyllista Game Engine サブマネージャー / 林
秀一 1 /95
自己紹介 Cyllista Game Engine サブマネージャー リードグラフィックスエンジニア 林 秀一 いくつかのゲーム会社を経て、2015年に株式会社Cygamesへ合流。 内製ゲームエンジンの開発においてリードグラフィックスエンジニアを
務める。 加えて、既成エンジンを用いたプロジェクトでのグラフィックス分野に おけるテクニカルディレクション、各種カンファレンスでのグラフィックス 技術情報の収集・共有、グラフィックスエンジニアの育成など 一貫してゲームグラフィックス領域に携わる。 2 /95
はじめに 3 /95
本講演のきっかけとなったSIGGRAPH講演 “An Introduction to Neural Shading” SIGGRAPH2025のコース 本講演 = An
Introduction to NeuralShading のエッセンス +𝜶 [SIGG25-NSC] 4 /95
本講演の内容 元の講演を踏襲した部分: ◆ ニューラルネットワークの基礎説明 ◆ ニューラルシェーダによる画像生成例、等 重要ポイントを抜粋した部分: ◆ ニューラルシェーダの先行事例 ◆
数式による理論説明 ◆ サンプルプログラムの解説 追加した説明: ◆ ニューラルネットワーク処理の直感的な図解 ◆ 図解と計算式の対応 特に基本的な部分 にフォーカス ポイントを大胆に 絞ってご紹介 本講演の特徴的な 部分 5 /95
本講演聴講のコツ ◆ 初めてこのトピックに触れる場合 短時間で深く理解するのは難しいかもしれません ◆ 可能な限り要点を把握いただけるように努めましたが 情報量が多く、説明のペースが速めです ◆ この時間では、概要の理解・直感的な理解・ポイントの理解を 目指していただければ幸いです
◆ 数式やプログラムコードの詳細な説明は スライド末のリファレンス資料を本資料と合わせてご参照ください 6 /95
アジェンダ 1. 2. 3. 4. 5. 6. 7. 8. ニューラルシェーディングとは
先行事例 ニューラルネットワークと推論計算 画像近似の例 近似のプロセス ニューラルネットワークの学習 ニューラルシェーダの実装 まとめ 7 /95
ニューラルシェーディングとは 8 /95
ニューラルシェーディングとは ◆ ニューラルネットワークをシェーダ として実行 ◆ グラフィックス、コンピュート パイプラインで動作 ◆ トレーニング可能な処理なら適用可能 ◆
相対的に軽量な近似を実現 Neural Shader ◆ GPUのAI向けアクセラレータを利用可能 9 /95
なぜニューラルシェーディングなのか? 1フレームに使える時間 データ量 アルゴリズムの複雑さ ハードウェア性能 固定 急激に増大 増大 常に不足気味 10
/95
なぜニューラルシェーディングなのか? 1フレームに使える時間 データ量 アルゴリズムの複雑さ ハードウェア性能 固定 より効率の良い圧縮 より高品質で軽量な近似 AI向けHW活用 シェーダ技術進化の変遷
High Level Shading Language Geometry Shader Compute Shader Ray Tracing Neural Shader 11 /95
先行事例 12 /95
先行事例 ◆ニューラルテクスチャ圧縮 ◆ニューラルマテリアル ◆ニューラルベイクGI 13 /95
ニューラルテクスチャ圧縮 Latent Texture Neural Shader 「意味」や「構造」を表す圧縮表現 学習によって作られる PBR Texture Set
複数のPBR値を一度に出力 [HOUD24] [NVIDIA-NTC] [VAID23] [FUJI24] [INTEL-TSNC] 参照 14 /95
ニューラルテクスチャ圧縮 ◆データ量 ◼ 30~80%削減 ◼ 品質と削減率を容易にトレードオフ可能 ◆パフォーマンス ◼ 1.5倍程度のテクスチャサンプル処理時間 ◼
CoopVec API (後述)により、負荷削減の可能性 ◼ ロード時に1度だけ展開でもOK ※数値は各社の資料から読み取った概算です。 15 /95
ニューラルマテリアル ※本画像はレンダリング結果ではなく、 イメージを持っていただくための写真です。 Latent Texture 𝜔i 𝜔o 入射/反射方向 Neural Shader
BRDF [ZELT24] 参照 16 /95
ニューラルベイク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
ニューラルベイクGI (プローブベース) Image: Inigo Quilez (Wikimedia Commons), CC BY-SA 3.0
時刻 ワールド位置 Neural Shader GI SH係数 5^3 Probe Brick内 の Irradiance算出 Neural Shader インドアウェイト インドア判定 18 /95
ニューラルベイクGI (プローブベース) ◆データ量 ◼ <800MB, 16km2, Time of Day ◼
98.5% 以上の削減 ◆パフォーマンス ◼ 50μsで12500プローブ解凍 @GTX1060 19 /95
ニューラルネットワークと推論計算 20 /95
ニューラルネットワークとは MLP: 多層パーセプトロン 出力[0] 入力[0] 出力[1] 入力 [1] 出力[2] 21
/95
ニューラルネットワークとは 入力層 隠れ層 出力層 22 /95
ニューラルネットワークとは レイヤー0 レイヤー1 レイヤー2 ニューロン列の間 の計算を 「レイヤー」 「層」 と呼ぶこともある ので注意!
23 /95
順伝搬(フォワードプロパゲーション) 計算結果を用いて、最終的な「推論」の答えを出す 値を用いた 追加処理 推論の答え 24 /95
ニューロンの値 右上の括弧の中が、列(レイヤー)インデックス (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
ニューロンひとつ分の計算 (0) 𝑎0 (0) 𝑎1 𝑤0 𝑤1 𝑤2 (0) 𝑎2
1 𝑏 𝑧 = 𝑤0 𝑎0 + 𝑤1 𝑎1 + 𝑤2 𝑎2 + 𝑏 a = Activation(𝑧) (1) 𝑎0 𝒘: ウェイト、𝒃: バイアス この2つを合わせて ネットワークパラメータと呼ぶ。 26 /95
活性化関数 (0) 𝑎0 (0) 𝑎1 𝑤0 𝑤1 𝑤2 (0) 𝑎2
𝑏 𝑧 = 𝑤0 𝑎0 + 𝑤1 𝑎1 + 𝑤2 𝑎2 + 𝑏 a = Activation(𝑧) (1) 𝑎0 Activation: 活性化関数 非線形性を取り入れる。 1 27 /95
ReLU活性化関数 (0) 𝑎0 (0) 𝑎1 𝑤0 𝑤1 𝑤2 (0) 𝑎2
𝑧 = 𝑤0 𝑎0 + 𝑤1 𝑎1 + 𝑤2 𝑎2 + 𝑏 a = ReLU(𝑧) (1) 𝑎0 𝑏 1 28 /95
ReLU活性化関数 (0) 𝑎0 (0) 𝑎1 𝑤0 𝑤1 𝑤2 (0) 𝑎2
𝑧 = 𝑤0 𝑎0 + 𝑤1 𝑎1 + 𝑤2 𝑎2 + 𝑏 a = max(0, 𝑧) (1) 𝑎0 𝑏 1 29 /95
順伝搬の行列計算 (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
順伝搬の行列計算 (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
順伝搬の行列計算 (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
順伝搬の行列計算 (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
画像近似の例 34 /95
画像をニューラルネットワーク化 R U G V B 35 /95
UVから画像を出力するNN 正解画像 ReLU Sigmoid 36 /95
UVから画像を出力するNN 16 ニューロン 32 ニューロン 64 ニューロン 32 ニューロン 3
レイヤー 3 レイヤー 3 レイヤー 4 レイヤー 37 /95
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
Frequency Encoding 正解画像 入力32ニューロン Frequency Encoding 使用 入力2ニューロン (比較用) 39
/95
Latent Texture 正解画像 Latent Texture 利用 Latent Texture 40 /95
Latent Texture 値の意味が学習によって自律的に決まるため 実行のたびに内容が変化 41 /95
近似のプロセス 42 /95
非線形性 非線形 線形 折れ線、曲線 直線 (1) 0 𝑎𝑘 = 𝜙(𝑤𝑘,0
𝑎0 0 + 𝑤𝑘,1 𝑎1 0 + ⋯ + 𝑤𝑘,𝑛 𝑎𝑛 + 𝑏𝑘 ) 43 /95
線形関数にReLU適用 (𝟎) 𝐳 = 𝒘𝒂 + 𝒃 𝒂 (𝟏) =
𝒎𝒂𝒙(𝟎, 𝒛) 平地 上り坂 下り坂 平地 ゼロ未満がなくなる 44 /95
ReLUの後、線形変換 𝒂 (𝟏) 𝐳 = 𝒘𝒂 + 𝒃 = 𝒎𝒂𝒙(𝟎,
𝒛) 平地 下り坂 −𝑎 平地 −3𝑎 + 2 +傾きを急に −𝑎 上り坂 −0.3𝑎 − 1 +傾きを緩やかに 下り坂 上り坂 平地 平地 45 /95
線形変換 ReLU 𝑤𝑎 + 𝑏 線形変換 ReLU … 𝑤𝑎 +
𝑏 … 46 /95
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
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
線形変換 ReLU 線形変換 ReLU … ニューラルネットワークは ◆ 行列とベクトルを用いて計算できる ◆ 近似精度と計算負荷のトレードオフがしやすい
ニューロンの数、レイヤーの数 ◆ 非線形の複雑な関数を近似できる いくつか条件はあるが、近似可能なケースは多い。 49 /95
ニューラルネットワークの学習 50 /95
学習ループ 推論結果 U 正解画像 差分画像 R G V B ①推論
(描画) ②差分 バイアスと ウェイトの勾配 バイアスと ウェイトの調整量 −0. 73 +0.06 −∇𝐶 𝑾 = ⋮ ⑤バイアス、 −0.24 ウェイトを更新 ④調整量算出 ③勾配算出 51 /95
ネットワークパラメータの増減と勾配 52 /95
パラメータの影響 R 𝑤 𝑤 𝑏𝑗 53 /95
パラメータの影響 R 𝑤 𝑤 𝑏𝑗 54 /95
勾配降下法(Gradient Descent) 正解との差 𝐶 𝑤 𝑤 個別のパラメータ 55 /95
ニューラルネットワークは合成関数 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
正解に近づけるには? Rを上げたい! R U U U V V G V
B シアン 赤 推論結果 正解 G,Bを下げたい! 57 /95
バイアスの増減 R Rを上げたい! バイアスはRに直接加算 されるので、上げればOK 𝑏𝑗 58 /95
ウェイトの増減 ニューロンの値が 高いほど… 0.3 1.0 -1.0 ニューロンの値が 低いほど… -0.7 𝑤0
ウェイトを上げるべき 𝑤1 R 𝑤2 𝑤3 Rを上げたい! ウェイトを下げるべき 𝑤4 0.8 𝑏𝑗 59 /95
入力ニューロン値の増減 ウェイトが高いほど… 値を上げるべき R 1.43 Rを上げたい! -0.92 値を下げるべき ウェイトが低いほど… 𝑏𝑗
60 /95
入力ニューロン値の増減 R Rを上げたい! 61 /95
入力ニューロン値の増減 + + R + G Gを下げたい! + + 62
/95
入力ニューロン値の増減 + + + + R + + G +
+ B Bを下げたい! + + 63 /95
入力ニューロン値の増減 + + + + R + + G +
+ B + + トータルの増減 64 /95
誤差逆伝搬法(Back Propagation) 𝑤 𝑤 … 𝑤 𝑤 𝑏 𝑤 𝑏
𝑤 𝑏 𝑏 𝑏 𝑤 65 /95
勾配の計算式 66 /95
線形部分の勾配 (0) 𝑎0 (0) 𝑎1 (0) 𝑎2 … (0) 𝑎𝑛
(1) 𝑎0 (1) 𝑎1 (1) 𝑎2 𝑑𝒛(1) 活性化後の勾配を 活性化前の勾配に変換 𝑑𝒛(1) = 𝑑𝒂(1) ⨀ 𝜙 ′ 𝒛 1 … (0) 𝑎3 𝑑𝒂(1) (1) 𝑎𝑘 67 /95
バイアスの勾配 (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
ウェイトの勾配 𝒂(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
ニューロンの勾配 𝑑𝒂(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
学習アルゴリズムのまとめ ◆ 学習では、推論を行い、結果と正解を比較し、勾配を算出し 勾配に基づいてパラメータを増減する処理を繰り返す ◆ 勾配を元にパラメータを増減する方法を、勾配降下法という ◆ ニューラルネットワークは合成関数であり、連鎖律によって どのレイヤーの、どのパラメータに対しても勾配を求めることができる ◆
勾配には、バイアスの勾配・ウェイトの勾配・ニューロンの勾配、の 3種類がある ◆ 勾配は、行列・ベクトル演算で算出できる 71 /95
ニューラルシェーダの実装 72 /95
Slang & SlangPy 73 /95
Slang/SlangPy SlangPy ◼ 高機能なシェーダ言語 ◼ マルチプラットフォーム ◼ オープンソース ◼ HLSLとほぼ同様の基本構文
◼ モダンな言語機能 ◼ インターフェース ◼ ジェネリクス ◼ モジュールシステム ◼ Slang向け Pythonインターフェース ◆ Slangシェーダ関数をPythonから 直接的に呼出し可能 ◆ 非常にシンプルなコードで データバインディング可能 ◼ フル機能のグラフィックスAPI ◼ クロスプラットフォーム ◼ 自動微分 74 /95
パラメータバインディング 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
順伝搬計算 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
ネットワークを通して順伝搬(推論) 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
学習ループ(再掲) 推論結果 U 正解画像 差分画像 R G V B ①推論
(描画) ②差分 バイアスと ウェイトの勾配 バイアスと ウェイトの調整量 −0. 73 +0.06 −∇𝐶 𝑾 = ⋮ ⑤バイアス、 −0.24 ウェイトを更新 ④調整量算出 ③勾配算出 78 /95
学習ループ(再掲) 推論結果 U 正解画像 差分画像 R G V ①推論 B
render(…) (描画) バイアスと ウェイトの調整量 −0. 73 +0.06 −∇𝐶 𝑾 = ⋮ ⑤バイアス、 optimizer_step() ④調整量算出 −0.24 ウェイトを更新 loss(…) ②差分 バイアスと ウェイトの勾配 bwd_diff(loss) ③勾配算出 79 /95
自動微分 [SIGG25-NSC] P.35 正解画像と推論結果の 差分を取る loss 推論画像を描画 render ニューラルネットワーク で推論
Network::eval 1レイヤー分の 順伝搬計算 Layer::forward パラメータを 使用 [Differentiable] biases weights 80 /95
自動微分 Slang 自動微分オペレータ bwd_diff(loss) 勾配算出処理 コンパイル時生成 正解画像と推論結果の 差分を取る loss 推論画像を描画
render ニューラルネットワーク で推論 Network::eval 1レイヤー分の 順伝搬計算 Layer::forward 勾配を ストア [BackwardDerivativeOf(…)] biases_grad weights_grad パラメータを 使用 [Differentiable] biases weights 81 /95
バイアス、ウェイト調整(最適化) 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
Slang/SlangPyまとめ ◆ ニューラルネットワークの行列計算を直感的に記述できる ◼ ボイラープレートが非常に少ない ◆ シェーダパラメータのバインディングが非常に楽 ◆ 勾配算出処理が自動生成される 83
/95
Cooperative Vector 84 /95
Cooperative Vector ◆大きなベクトルと行列の乗算を実行 ◆H/Wアクセラレーションが期待できる ◆どのシェーダステージでも利用可能 Shader Model 6.10 (予定) VK_NV_cooperative_vector
Metal 4 Machine Learning 85 /95
順伝搬計算(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
自動微分に頼らない勾配算出 bwd_diff(…) CoopVecを用いたコードには 適用できない! [BackwardDerivativeOf(eval)] public void evalBwd( inout DifferentialPair<MLVec<InputSize>>
input, MLVec<OutputSize> resultGrad) { … … 勾配の算出を行う関数を … … 自前実装する必要がある! … } 87 /95
活性化関数の勾配算出 [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
ウェイト、バイアス、ニューロンの勾配算出 [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
ウェイトの勾配 𝒂(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
バイアスの勾配 (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
ニューロンの勾配 𝑑𝒂(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
Slang/CoopVecまとめ ◆基本的なニューラルネットワークの実装はシンプルで ストレートフォワードなコードに落とし込める ◆Slang は多数の長所があるが 特にシェーダコードの自動微分は強力 ◆Slang と SlangPy の組み合わせにより、素早い開発が可能
◆Cooperative Vector により、ニューラルシェーディング関連 処理の大幅な高速化が期待できる 93 /95
全体のまとめ ◆グラフィックスエンジニアが解くべき問題の複雑化と ハードウェアの進化が重なり、ニューラルシェーディングが ゲームタイトルに貢献する時代が到来しています ◆ニューラルネットワークの基礎を理解し、Slang/SlangPy Cooperative Vector に代表される優れたツールセットを 把握してさらなるニューラルシェーディング時代の本格化に 備えましょう
94 /95
95 /95
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
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
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
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
Appendix 100 /95
従来の行列演算 mul(weights, inputVec) + biases Thread 0 … Thread 1
… * … + … * … + … … … … 入力ベクトル ウェイト行列 バイアスベクトル 101 /95
“Cooperative” mul(weights, inputVec) + biases 演算は専用命令 (専用H/W)で実行 ウェーブ内のスレッドが協調し 1つの大きなマトリクスを形成 Wave
Thread 0 Thread 1 Thread 2 … * … … 入力ベクトル + 〃 〃 … … … Thread 31 … … … 全ての行で 同じバイアス 〃 ウェイト行列 バイアスベクトル 102 /95
“Cooperative” CoopVec なし … Wave … * … Thread 0
Thread 1 Thread 2 Thread 31 Thread 1 … * … … … … Thread 0 CoopVec あり * … … … … … 103 /95