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
Strassenのアルゴリズムによる行列積の計算 /strassen-algorithm
Search
Miyakawa Taku
December 27, 2017
Programming
8
3.1k
Strassenのアルゴリズムによる 行列積の計算 /strassen-algorithm
このスライドの著者は宮川拓です。
CC BY 3.0 Licenseの元に利用を許諾します。
Miyakawa Taku
December 27, 2017
Tweet
Share
More Decks by Miyakawa Taku
See All by Miyakawa Taku
入門: 末尾呼び出し最適化 /tail-call-elimination-intro
miyakawataku
2
2.3k
JVM言語の動き方・動かし方 /make-jvm-lang
miyakawataku
6
2k
Java SE 8から11で何が起きた?一気におさらいしてみよう! /java-se-8-to-11
miyakawataku
15
5.1k
ミニバッチサイズと学習率の関係 /small-batch-learning
miyakawataku
0
2k
機械学習プロジェクトの進め方 /howtoproceedwithmlproject
miyakawataku
0
340
グラフアルゴリズムその2: 単一始点最短路問題 /graphShortestPaths
miyakawataku
0
150
Viterbiのアルゴリズム /viterbi-algorithm
miyakawataku
0
260
Other Decks in Programming
See All in Programming
asdf-ecspresso作って 友達が増えた話 / Fujiwara Tech Conference 2025
koluku
0
1.4k
traP の部内 ISUCON とそれを支えるポータル / PISCON Portal
ikura_hamu
0
180
ある日突然あなたが管理しているサーバーにDDoSが来たらどうなるでしょう?知ってるようで何も知らなかったDDoS攻撃と対策 #phpcon.2024
akase244
2
7.7k
20年もののレガシープロダクトに 0からPHPStanを入れるまで / phpcon2024
hirobe1999
0
1k
Findy Team+ Awardを受賞したかった!ベストプラクティス応募内容をふりかえり、開発生産性向上もふりかえる / Findy Team Plus Award BestPractice and DPE Retrospective 2024
honyanya
0
140
情報漏洩させないための設計
kubotak
5
1.3k
AWSのLambdaで PHPを動かす選択肢
rinchoku
2
390
生成AIでGitHubソースコード取得して仕様書を作成
shukob
0
630
歴史と現在から考えるスケーラブルなソフトウェア開発のプラクティス
i10416
0
300
VisionProで部屋の明るさを反映させるシェーダーを作った話
segur
0
100
非ブラウザランタイムとWeb標準 / Non-Browser Runtimes and Web Standards
petamoriken
0
430
サーバーゆる勉強会 DBMS の仕組み編
kj455
1
300
Featured
See All Featured
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
33
2.7k
Build your cross-platform service in a week with App Engine
jlugia
229
18k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
192
16k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
26
1.9k
Agile that works and the tools we love
rasmusluckow
328
21k
It's Worth the Effort
3n
183
28k
The Cult of Friendly URLs
andyhume
78
6.1k
4 Signs Your Business is Dying
shpigford
182
22k
Building an army of robots
kneath
302
45k
Mobile First: as difficult as doing things right
swwweet
222
9k
How GitHub (no longer) Works
holman
312
140k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
356
29k
Transcript
Strassenのアルゴリズムによる 行列積の計算 2017-12-27 ビール&LT大会 ハッシュタグ: #jjug 宮川 拓
@miyakawa_taku JJUG幹事です SI屋で賃労働してます オレオレJVM言語Kinkを作っています https://bitbucket.org/kink/kink
尾上部屋の里山さんのファンです 自己紹介 #jjug 2/19
あらまし 本物のプログラマになりたい! ということで、 『アルゴリズムイントロダクション』 を読み進めています n次正方行列の積が、Θ(3)よりも小さい計 算量で計算できるらしい(§4.2)
びっくり! #jjug 3/19
背景 機械学習の計算は行列計算のかたまり 行列計算が速いと嬉しい #jjug 4/19
まずはふつうに計算 #jjug 5/19
三重ループ = ( ), = ( )をn次の正方行列とする =
∙ の要素は = σ=1 ∙ すなおに三重ループで実装: for i in 1~n: for j in 1~n: c[i, j] = 0 for k in 1~n: c[i, j] += a[i, k] * b[k, j] 3 回繰り返す → 計算量は() #jjug 6/19
準備: 分割統治 #jjug 7/19
分割統治 A, B, Cを縦横半分に分割すると、 = ∙ は次のように書き直せる 11 12 21
22 = 11 12 21 22 ∙ 11 12 21 22 = 11 ∙ 11 + 12 ∙ 21 11 ∙ 12 + 12 ∙ 22 21 ∙ 11 + 22 ∙ 21 21 ∙ 12 + 22 ∙ 22 #jjug 8/19
分割統治 def prod(a, b): if a.order == b.order == 1:
return matrix_1x1(a[0, 0] * b[0, 0]) a11, a12, a21, a22 = partition(a) b11, b12, b21, b22 = partition(b) c11 = prod(a11, b11) + prod(a12, b21) c12 = prod(a11, b12) + prod(a12, b22) c21 = prod(a21, b11) + prod(a22, b21) c22 = prod(a21, b12) + prod(a22, b22) return concat(c11, c12, c21, c22) 計算量はスカラ値の掛け算の回数に比例 n次行列の乗算は 2 次行列の乗算を8回再帰呼び出し #jjug 9/19
分割統治 n: 行列の次数 スカラ値の 掛け算の回数 1 1 2 8 4
64 8 512 16 4,096 2倍 8 = 23 倍 2倍 8 = 23 倍 2倍 8 = 23 倍 計算量はやっぱり() #jjug 10/19
Strassenのアルゴリズム #jjug 11/19
Strassenのアルゴリズム A, Bを分割した上で1 ~7 を次のように置く 1 = 11 (12
− 22 ) 2 = (11 + 12 )22 3 = (21 + 22 )11 4 = 22 21 − 11 5 = (11 + 22 )(11 + 22 ) 6 = 12 − 22 21 + 22 7 = 11 − 21 11 + 12 2 次行列を 計7回乗算 #jjug 12/19
Strassenのアルゴリズム ここで、次が成り立つ 11 = 11 11 + 12 21
= 5 + 4 − 2 + 6 12 = 11 12 + 12 22 = 1 + 2 21 = 21 11 + 22 21 = 3 + 4 22 = 21 12 + 22 22 = 5 + 1 − 3 − 7 Cは1 ~7 の和で表せる 2 次行列の乗算を7回再帰呼び出しすれば良い! #jjug 13/19
Strassenのアルゴリズム Strassen 計算量 n 三重ループ 計算量 1 1 1 7
2 8 49 4 64 343 8 512 2,401 16 4,096 8倍 8倍 8倍 7倍 7倍 7倍 Θ 27 = .… Θ 28 = Θ 3 < #jjug 14/19
実装&計測 #jjug 15/19
実装 https://bitbucket.org/miyakawataku/matrix- multiplication/src/default/matrix.go #jjug 16/19
計測 0.000010 0.000100 0.001000 0.010000 0.100000 1.000000 10.000000 100.000000 1,000.000000
10,000.000000 16 64 256 1,024 4,096 実行時間(秒) n (行列の次数) 三重ループ Strassen #jjug 17/19
総括 #jjug 18/19
総括 素敵なアルゴリズムは、nが小さい時には遅い。 そして大抵の場合、nは小さい。 素敵なアルゴリズムの計算量の式には、大きな 定数項が掛かっている。 nが大きくなることが分かっていない限り、素敵 にしてはならない。 ― Rob Pike
“Notes on Programming in C” #jjug 19/19