SlideShare a Scribd company logo
数式を綺麗に
プログラミングするコツ
夏のプログラミングシンポジウム 2013
2013/8/25
中谷 秀洋@サイボウズ・ラボ / @shuyo
今回のおはなし
「ビッグデータの手法を実装」って
どうするの?
手法いろいろ
数式! 数式!! 数式!!!
実装
「数式→実装」は共通
機械学習
数式! 数式!! 数式!!!
実装
こ
こ
は
共
通
←
数値解析 統計処理
数式から実装まで
数式! 数式!! 数式!!!
実装
数式見てすぐ実装?
ムリムリ!
小さいステップに分解
数式! 数式!! 数式!!!
実装
数式から
行間の情報を読み解く
「逐語訳」できる形に
数式を書き換える
今日のポイント
この後の流れ
1. 数式がそこにあった
– 「式はどうやって出てきたか」は考慮しない
2. 数式を読み解く
3. 数式を書き換える
4. 数式を「逐語訳」で実装
対象とする「数式」
• 行列やその要素の掛け算が出てくる数式
– 機械学習などの手法には、行列を使って表さ
れているものが多い
– 強力な線形代数ライブラリをうまく使えば楽
に実装できる
• 数式の例はC.M.ビショップ「パターン認
識と機械学習」(以降 PRML)から採用
– ただし機械学習の知識は一切要求しない
方針
• 「楽に」「確実に」実装しよう
– 間違いにくく、可読性が高い
– 最速は必ずしも目指していない
• 動くものを確かに作れるようになってから
• Python/numpy と R での実装例を紹介
– 基本的な行列計算しか使わないので、その他
の環境(Eigen など)にも参考になる(はず)
書き換え不要なパターン
まずは一番簡単なパターンから
𝒘 = 𝚽 𝑇 𝚽 −1 𝚽 𝑇 𝒕 (PRML 3.15 改)
• 線形回帰のパラメータ推定の式
– 「線形回帰とは何か」などは一切気にせず、
この式を実装することのみ考える
数式の「読み解き」
𝒘 = 𝚽 𝑇 𝚽 −1 𝚽 𝑇 𝒕 (PRML 3.15 改)
• 𝚽:N×M次元の特徴行列
– 「特徴行列とは?」は気にしない
– 「N×M次元の行列」ということだけ
• t:N次のベクトル(正解データ)
– 中身は気にしない(以下同様)
• w はベクトル? 行列? 何次の?
掛け算した行列(ベクトル)のサイズ
𝒘 = 𝚽 𝑇
𝚽 −1
𝚽 𝑇
𝒕
M×1 ← (M×N N×M) M×N N×1
隣接する行列の列数と行数は一致。
そうでなければどこかが間違ってる
各行列のサイズ。
ベクトルは
1列の行列として
この段階で勘違いしていると実装できないので
丁寧に確認しておく
両端の行数・列数が
行列(ベクトル)のサイズ。
列数が1ならベクトル
numpy に「逐語訳」
𝒘 = 𝚽 𝑇 𝚽 −1 𝚽 𝑇 𝒕 (PRML 3.15 改)
# PHI = N×M次元の特徴行列
# t = N次のベクトル(正解データ)
w = numpy.linalg.solve(numpy.dot(PHI.T, PHI),
numpy.dot(PHI.T, t))
※ 逆行列のところで inv() を使ってもいいが
solve() の方がコードが短く、速度も速い
numpy.dot(PHI.T, PHI) numpy.dot(PHI.T, t)
𝑨−1 𝒃 = numpy.linalg.solve(𝑨, 𝒃)
R に「逐語訳」
𝒘 = 𝚽 𝑇 𝚽 −1 𝚽 𝑇 𝒕 (PRML 3.15 改)
# PHI = N×M次元の特徴行列
# T = N次のベクトル(正解データ)
w <- solve(t(PHI) %*% PHI, t(PHI) %*% T)
# crossprod(X) = t(X) %*% X 関数を使っても良い
w <- solve(crossprod(PHI), crossprod(PHI, T))
t(PHI) %*% PHI t(PHI) %*% T
𝑨−1 𝒃 = solve(𝑨, 𝒃)
書き換えが必要になるパターン
多クラスロジスティック回帰の
誤差関数の勾配
𝛻𝒘 𝑘
𝐸 𝑾 = 𝑦 𝑛𝑘 − 𝑡 𝑛𝑘 𝝓 𝑛
𝑁
𝑛=1
(k = 1, ⋯ , 𝐾)
(PRML 4.109 改)
• 𝒀 = 𝑦 𝑛𝑘 : N×K 次行列(予測値)
• 𝑻 = 𝑡 𝑛𝑘 : N×K 次行列(1-of-K 表現)
• 𝑾 = 𝒘1, … , 𝒘 𝐾 = (𝑤 𝑚𝑘) : M×K 次行列
• 𝚽 = 𝜙 𝑛𝑚 = 𝝓1, ⋯ , 𝝓 𝑁
𝑇
: N×M 次行列
– 𝝓 𝑛 = 𝝓 𝒙 𝑛 = 𝜙 𝑚 𝒙 𝑛
𝑇: M 次ベクトル
与
え
ら
れ
て
い
る
情
報
実装に関係する
のはサイズだけ
「勾配」の扱い
𝛻𝒘 𝑘
𝐸 𝑾 = 𝑦 𝑛𝑘 − 𝑡 𝑛𝑘 𝝓 𝑛
𝑁
𝑛=1
• 右辺は M 次ベクトル
– 𝑦 𝑛𝑘 − 𝑡 𝑛𝑘 はただのスカラー
– 一般には先ほどの方法で次元を読み解けばいい
• だから左辺 𝛻𝒘 𝑘
𝐸 𝑾 も M 次ベクトル
– それが k=1,……,K 個あるだけ
• 「M×K次元の行列 𝛻𝐸 𝑾 」を求めると読み解く
– 「勾配」そのものは実装には関係ない
これ
「逐語訳」できる形に書き換える
• 掛けて行列になるパターンは大きく3通り
– 上から要素積、行列積、直積
𝑐𝑖𝑗 = 𝑎𝑖𝑗 𝑏𝑖𝑗 ⇔ C = A * B
𝑐𝑖𝑗 = 𝑎𝑖𝑘 𝑏 𝑘𝑗𝑘 ⇔ C=numpy.dot(A, B)
𝑐𝑖𝑗 = 𝑎𝑖 𝑏𝑗 ⇔ C=numpy.outer(a, b)
数式を左の形に書き換えれば、
右の numpy コードに「逐語訳」できる
※他に「外積」もあるが、使う人やシーンが限られるので略
R 版「逐語訳」
• 掛けて行列になるパターンは大きく3通り
– 上から要素積、行列積、直積
𝑐𝑖𝑗 = 𝑎𝑖𝑗 𝑏𝑖𝑗 ⇔ C <- A * B
𝑐𝑖𝑗 = 𝑎𝑖𝑘 𝑏 𝑘𝑗𝑘 ⇔ C <- A %*% B
𝑐𝑖𝑗 = 𝑎𝑖 𝑏𝑗 ⇔ C <- outer(a, b)
※直積は outer(a, b) の他に a %o% b という書き方もある
式を書き換える (1)
𝛻𝒘 𝑘
𝐸 𝑾 = 𝑦 𝑛𝑘 − 𝑡 𝑛𝑘 𝝓 𝑛
𝑁
𝑛=1
• 行列の要素の式になおす
𝛻𝐸 𝑾 𝑚𝑘
= 𝑦 𝑛𝑘 − 𝑡 𝑛𝑘 𝜙 𝑛𝑚
𝑁
𝑛=1
(𝑚 = 1, ⋯ , 𝑀; 𝑘 = 1, ⋯ , 𝐾)
– 「求める行列𝛻𝐸 𝑾 」の (m, k) 成分の式にする
M次ベクトルの式
スカラー
式を書き換える (2)
𝛻𝐸 𝑾 𝑚𝑘
= 𝑦 𝑛𝑘 − 𝑡 𝑛𝑘 𝜙 𝑛𝑚
𝑁
𝑛=1
• 注:右辺の添え字に未解決のものは残らない
– 左辺に現れる : m, k
– 右辺で解決 : n (総和で消える)
• 3種類の積のどれかに帰着するよう変形
– この場合、総和があるので 𝑐𝑖𝑗 = 𝑎𝑖𝑘 𝑏 𝑘𝑗𝑘 に
式を書き換える (3)
𝑨 = 𝑎 𝑛𝑘 = 𝑦 𝑛𝑘 − 𝑡 𝑛𝑘 とおくと(𝑁 × 𝐾 行列)
𝛻𝐸 𝑾 𝑚𝑘
= 𝑎 𝑛𝑘 𝜙 𝑛𝑚
𝑁
𝑛=1
= Φ 𝑇
𝑚𝑛 𝐴 𝑛𝑘
𝑁
𝑛=1
• ○mk=Σn○mn○nk の形に調整
– 右辺の内側の添え字とΣは同じ n
– 添え字の順序を逆にしたければ転置
• 𝛻𝐸 𝑾 = 𝚽 𝑇
𝑨 であることがわかる
numpyに「逐語訳」
𝛻𝒘 𝑘
𝐸 𝑾 = 𝑦 𝑛𝑘 − 𝑡 𝑛𝑘 𝝓 𝑛 (k = 1, ⋯ , 𝐾)
𝑁
𝑛=1
𝑨 = 𝒀 − 𝑻, 𝛻𝐸 𝑾 = 𝚽 𝑇
𝑨
• ここまで簡単になれば、実装は一瞬
# PHI = N×M 次元の特徴行列
# Y, T = N×K 次元の行列
gradient_E = numpy.dot(PHI.T, Y - T)
式の書き換え
R に「逐語訳」
𝛻𝒘 𝑘
𝐸 𝑾 = 𝑦 𝑛𝑘 − 𝑡 𝑛𝑘 𝝓 𝑛 (k = 1, ⋯ , 𝐾)
𝑁
𝑛=1
𝑨 = 𝒀 − 𝑻, 𝛻𝐸 𝑾 = 𝚽 𝑇
𝑨
• 同様に R での実装例:
# PHI = N×M 次元の特徴行列
# Y, T = N×K 次元の行列
gradient_E <- t(PHI) %*% (Y - T)
まとめ
• 数式から条件を読み解こう
– この段階で間違っていると、うまく行かない
– さぼらず紙と鉛筆で確認するのが一番賢い
• 「逐語訳」できる数式なら実装かんたん
– 難しい数式は「逐語訳」できる形に書き換え
– さぼらず紙と鉛筆

More Related Content

PDF
[DL輪読会]Deep Learning 第15章 表現学習
PDF
指数時間アルゴリズム入門
PDF
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
PDF
ウェーブレット木の世界
PDF
Statistical Semantic入門 ~分布仮説からword2vecまで~
PDF
プログラミングコンテストでのデータ構造
PDF
最適輸送の解き方
PDF
非ガウス性を利用した 因果構造探索
[DL輪読会]Deep Learning 第15章 表現学習
指数時間アルゴリズム入門
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
ウェーブレット木の世界
Statistical Semantic入門 ~分布仮説からword2vecまで~
プログラミングコンテストでのデータ構造
最適輸送の解き方
非ガウス性を利用した 因果構造探索

What's hot (20)

PDF
深層生成モデルと世界モデル
PDF
プログラミングコンテストでの乱択アルゴリズム
PDF
Automatic Mixed Precision の紹介
PDF
明日使えないすごいビット演算
PDF
機械学習モデルのハイパパラメータ最適化
PDF
プログラミングコンテストでの動的計画法
PPTX
劣モジュラ最適化と機械学習1章
PDF
Transformer メタサーベイ
PDF
Union find(素集合データ構造)
PDF
PRMLの線形回帰モデル(線形基底関数モデル)
PDF
変分推論法(変分ベイズ法)(PRML第10章)
PDF
Transformerを多層にする際の勾配消失問題と解決法について
PDF
Stan超初心者入門
PDF
Deep Learningと画像認識   ~歴史・理論・実践~
PDF
PPTX
猫でも分かるVariational AutoEncoder
PDF
画像認識の初歩、SIFT,SURF特徴量
PDF
画像生成・生成モデル メタサーベイ
PDF
GAN(と強化学習との関係)
PDF
Variational AutoEncoder
深層生成モデルと世界モデル
プログラミングコンテストでの乱択アルゴリズム
Automatic Mixed Precision の紹介
明日使えないすごいビット演算
機械学習モデルのハイパパラメータ最適化
プログラミングコンテストでの動的計画法
劣モジュラ最適化と機械学習1章
Transformer メタサーベイ
Union find(素集合データ構造)
PRMLの線形回帰モデル(線形基底関数モデル)
変分推論法(変分ベイズ法)(PRML第10章)
Transformerを多層にする際の勾配消失問題と解決法について
Stan超初心者入門
Deep Learningと画像認識   ~歴史・理論・実践~
猫でも分かるVariational AutoEncoder
画像認識の初歩、SIFT,SURF特徴量
画像生成・生成モデル メタサーベイ
GAN(と強化学習との関係)
Variational AutoEncoder
Ad

Viewers also liked (16)

PDF
NumPy闇入門
PDF
数式をnumpyに落としこむコツ
PDF
CuPy解説
PDF
PRML 2.3
PDF
Prml 2.3
PDF
Prml4.4 ラプラス近似~ベイズロジスティック回帰
PDF
多次元配列の効率的利用法の検討
PDF
111015 tokyo scipy2_ディスカッション
PDF
猫に教えてもらうルベーグ可測
PDF
無限関係モデル (続・わかりやすいパターン認識 13章)
PDF
Chainer Contribution Guide
PDF
Lighting talk chainer hands on
PPTX
ディープラーニングにおける学習の高速化の重要性とその手法
PDF
ボケるRNNを学習したい (Chainer meetup 01)
PDF
Chainer meetup lt
PPTX
Simple perceptron by TJO
NumPy闇入門
数式をnumpyに落としこむコツ
CuPy解説
PRML 2.3
Prml 2.3
Prml4.4 ラプラス近似~ベイズロジスティック回帰
多次元配列の効率的利用法の検討
111015 tokyo scipy2_ディスカッション
猫に教えてもらうルベーグ可測
無限関係モデル (続・わかりやすいパターン認識 13章)
Chainer Contribution Guide
Lighting talk chainer hands on
ディープラーニングにおける学習の高速化の重要性とその手法
ボケるRNNを学習したい (Chainer meetup 01)
Chainer meetup lt
Simple perceptron by TJO
Ad

Similar to 数式を綺麗にプログラミングするコツ #spro2013 (20)

PDF
【Zansa】第12回勉強会 -PRMLからベイズの世界へ
PDF
「現実世界に活かす数学」 (麻布高等学校、教養総合、数学講義 5 回目)
PDF
Math in Machine Learning / PCA and SVD with Applications
PDF
行列計算アルゴリズム
PPTX
Gmm勉強会
PDF
クリエイティブコーディングのための数学 JavaScript 入門 [三角関数と行列]
PDF
線形写像を行列で表現しよう
PDF
線形代数の視覚的理解のためのノート
PPTX
PRML第9章「混合モデルとEM」
PDF
Stanの紹介と応用事例(age heapingの統計モデル)
 
PDF
Trianguler
PDF
秘密分散法の数理
PDF
Lispでやる記号微分
PDF
論文紹介 Semi-supervised Learning with Deep Generative Models
PPTX
CODE FESTIVAL 2014 エキシビジョン 解説
PDF
2015年度春学期 画像情報処理 第8回 行列の直交変換と画像情報圧縮 (2015. 6. 10)
PPTX
【読書会資料】『StanとRでベイズ統計モデリング』Chapter12:時間や空間を扱うモデル
PDF
第9回スキル養成講座講義資料
PPTX
Practical topology
PDF
数学教材(中間発表)
【Zansa】第12回勉強会 -PRMLからベイズの世界へ
「現実世界に活かす数学」 (麻布高等学校、教養総合、数学講義 5 回目)
Math in Machine Learning / PCA and SVD with Applications
行列計算アルゴリズム
Gmm勉強会
クリエイティブコーディングのための数学 JavaScript 入門 [三角関数と行列]
線形写像を行列で表現しよう
線形代数の視覚的理解のためのノート
PRML第9章「混合モデルとEM」
Stanの紹介と応用事例(age heapingの統計モデル)
 
Trianguler
秘密分散法の数理
Lispでやる記号微分
論文紹介 Semi-supervised Learning with Deep Generative Models
CODE FESTIVAL 2014 エキシビジョン 解説
2015年度春学期 画像情報処理 第8回 行列の直交変換と画像情報圧縮 (2015. 6. 10)
【読書会資料】『StanとRでベイズ統計モデリング』Chapter12:時間や空間を扱うモデル
第9回スキル養成講座講義資料
Practical topology
数学教材(中間発表)

More from Shuyo Nakatani (20)

PDF
画像をテキストで検索したい!(OpenAI CLIP) - VRC-LT #15
PDF
Generative adversarial networks
PDF
Memory Networks (End-to-End Memory Networks の Chainer 実装)
PDF
人工知能と機械学習の違いって?
PDF
RとStanでクラウドセットアップ時間を分析してみたら #TokyoR
PDF
ドラえもんでわかる統計的因果推論 #TokyoR
PDF
[Yang, Downey and Boyd-Graber 2015] Efficient Methods for Incorporating Knowl...
PDF
星野「調査観察データの統計科学」第3章
PDF
星野「調査観察データの統計科学」第1&2章
PDF
言語処理するのに Python でいいの? #PyDataTokyo
PDF
Zipf? (ジップ則のひみつ?) #DSIRNLP
PDF
ACL2014 Reading: [Zhang+] "Kneser-Ney Smoothing on Expected Count" and [Pickh...
PDF
ソーシャルメディアの多言語判定 #SoC2014
PDF
アラビア語とペルシャ語の見分け方 #DSIRNLP 5
PDF
どの言語でつぶやかれたのか、機械が知る方法 #WebDBf2013
PDF
Active Learning 入門
PDF
ノンパラベイズ入門の入門
PDF
[Kim+ ICML2012] Dirichlet Process with Mixed Random Measures : A Nonparametri...
PDF
Short Text Language Detection with Infinity-Gram
PDF
[Karger+ NIPS11] Iterative Learning for Reliable Crowdsourcing Systems
画像をテキストで検索したい!(OpenAI CLIP) - VRC-LT #15
Generative adversarial networks
Memory Networks (End-to-End Memory Networks の Chainer 実装)
人工知能と機械学習の違いって?
RとStanでクラウドセットアップ時間を分析してみたら #TokyoR
ドラえもんでわかる統計的因果推論 #TokyoR
[Yang, Downey and Boyd-Graber 2015] Efficient Methods for Incorporating Knowl...
星野「調査観察データの統計科学」第3章
星野「調査観察データの統計科学」第1&2章
言語処理するのに Python でいいの? #PyDataTokyo
Zipf? (ジップ則のひみつ?) #DSIRNLP
ACL2014 Reading: [Zhang+] "Kneser-Ney Smoothing on Expected Count" and [Pickh...
ソーシャルメディアの多言語判定 #SoC2014
アラビア語とペルシャ語の見分け方 #DSIRNLP 5
どの言語でつぶやかれたのか、機械が知る方法 #WebDBf2013
Active Learning 入門
ノンパラベイズ入門の入門
[Kim+ ICML2012] Dirichlet Process with Mixed Random Measures : A Nonparametri...
Short Text Language Detection with Infinity-Gram
[Karger+ NIPS11] Iterative Learning for Reliable Crowdsourcing Systems

数式を綺麗にプログラミングするコツ #spro2013