SlideShare a Scribd company logo
ALGORITHM 659

Implementing Sobol’s
Quasirandom Sequence
Generator

PAUL BRATLEY and BENNETT L. FOX

ACM Transactions on Mathematical Software

Vol. 14 (1988) 88;

1
読んできた論文

● Ilya M. Sobolさんという方が考えた Quasi-random Sequence Generatorの実装
方法について書かれた論文
○ “Quasi” とついているように、通常の乱数とは少し違い、Low Discrepancyと
いう性質を持つ。
● Sobolさんの論文ではなく、アルゴリズムの実装にフォーカスして解説してくれてい
る論文 (引用数: 961件)
○ Theoretical underpinningsにはあんまりちゃんと触れない。
● 今回はGo言語で実装してGoptunaにも導入
2
Low discrepancy

3
Low discrepancy

4
ハイパーパラメーター最適化を例に考えると、
似たようなパラメーターは、 (経験的に) 似たような
評価値になることが多いので、散らばってくれると
嬉しい。
アルゴリズムの用途

● Optimization

○ BBO Challengeで自分たちも使用 

○ “We employ Quasi Monte Carlo sampling
based on Sobol sequences instead of Latin
hypercube sampling.” 

● Numerical Integration 

○ 疑似乱数(pseudorandom)を使用する
Monte-Carlo Integrationと区別して
”Quasi-Monte Carlo Integration” と呼ばれ
る

5
アルゴリズム

6
アルゴリズム

大きく2つのフェーズに分かれる

1. Direction numbersの生成

2. Sobol sequenceの生成

7
Direction numbersの生成

8
Direction numbers の形式と性質

9
i 1 2 3 4 5 6
mi 1 3 7 5 7 43
vi 0.1 0.11 0.111 0.0101 0.00111 0.101011
Direction numbers の形式と性質

10
i 1 2 3 4 5 6
mi 1 3 7 5 7 43
vi 0.1 0.11 0.111 0.0101 0.00111 0.101011
こういう形式のdirection numbersを生成。
※ 論文上はこのような浮動小数点数です
が、実装の都合上プログラムでは uint32など
で表現されています。
Direction numbers の形式と性質

11
i 1 2 3 4 5 6
mi 1 3 7 5 7 43
vi 0.1 0.11 0.111 0.0101 0.00111 0.101011
direction numbersは、miという値から計
算されるので、miの作り方を知る必要が
あります。
Direction numbers の形式と性質

12
i 1 2 3 4 5 6
mi 1 3 7 5 7 43
vi 0.1 0.11 0.111 0.0101 0.00111 0.101011
miはこのような値を持ちます。
Direction numbers の形式と性質

13
i 1 2 3 4 5 6
mi 1 3 7 5 7 43
vi 0.1 0.11 0.111 0.0101 0.00111 0.101011
miの生成

14
mi のつくりかた ①

15
次のようなPrimitive Polynomial (原子多項式)をφ(2^d-1)/d個用意。

各係数は0 or 1のどちらかをとり、定数項は必ず1。

これを満たしていれば、係数は自由に選べる。

miのつくりかた ②

16
Primitive Polynomialの係数をXORで足し合わせる。

miのつくりかた ②

17
Primitive Polynomialの係数をXORで足し合わせる。

miの計算には m_(i-1) などが必要。
なのでm0やm1といった初期値は
なにか適当に決める必要があります。
→ Initial direction numbersと呼ばれる
これも 0<mi<2^i を満たす奇数。すべて 1も
可。
mi の計算例

18
Sobol sequenceの生成

19
Sobol sequenceの生成

次の演算をするだけ。

20
Gray code による改善

● Antonov and Saleevさんらによる改良

● Direction numbersからSobol sequenceを生成する際に、Gray codeを利用する

21
The (binary-reflected) Gray code

22
i (decimal) i (binary) i / 2 (binary) Gray (binary) Gray (decimal)
0 0000 0000 0000 0
1 0001 0000 0001 1
2 0010 0001 0011 3
3 0011 0001 0010 2
4 0100 0010 0110 6
5 0101 0010 0111 7
6 0110 0011 0101 5
7 0111 0011 0100 4
Gray codeは

同じ色で囲われた範囲の 

中で順序を入れ替える特性
をもつ。



また1 bitしか変化がない。 

The (binary-reflected) Gray code

23
i (decimal) i (binary) i / 2 (binary) Gray (binary) Gray (decimal)
0 0000 0000 0000 0
1 0001 0000 0001 1
2 0010 0001 0011 3
3 0011 0001 0010 2
4 0100 0010 0110 6
5 0101 0010 0111 7
6 0110 0011 0101 5
7 0111 0011 0100 4
1 bit 右にシフト
Gray codeは

同じ色で囲われた範囲の 

中で順序を入れ替える特性
をもつ。



また1 bitしか変化がない。 

The (binary-reflected) Gray code

24
i (decimal) i (binary) i / 2 (binary) Gray (binary) Gray (decimal)
0 0000 0000 0000 0
1 0001 0000 0001 1
2 0010 0001 0011 3
3 0011 0001 0010 2
4 0100 0010 0110 6
5 0101 0010 0111 7
6 0110 0011 0101 5
7 0111 0011 0100 4
i と i/2 のXOR
Gray codeは

同じ色で囲われた範囲の 

中で順序を入れ替える特性
をもつ。



また1 bitしか変化がない。 

Gray codeは

同じ色で囲われた範囲の 

中で順序を入れ替える特性
をもつ。



また1 bitしか変化がない。 

The (binary-reflected) Gray code

25
i (decimal) i (binary) i / 2 (binary) Gray (binary) Gray (decimal)
0 0000 0000 0000 0
1 0001 0000 0001 1
2 0010 0001 0011 3
3 0011 0001 0010 2
4 0100 0010 0110 6
5 0101 0010 0111 7
6 0110 0011 0101 5
7 0111 0011 0100 4
同じ色で囲われた範囲の中で
順序が入れ替わっている
Gray codeは

同じ色で囲われた範囲の 

中で順序を入れ替える特性
をもつ。



また1 bitしか変化がない。 

The (binary-reflected) Gray code

26
i (decimal) i (binary) i / 2 (binary) Gray (binary) Gray (decimal)
0 0000 0000 0000 0
1 0001 0000 0001 1
2 0010 0001 0011 3
3 0011 0001 0010 2
4 0100 0010 0110 6
5 0101 0010 0111 7
6 0110 0011 0101 5
7 0111 0011 0100 4
1 bitずつしか変化しない。
変化するbitの位置は、
rightmost zero-bit in the
binary representation of i
(太字にした箇所)
The (binary-reflected) Gray code

27
先程の性質を使うとXOR演算回数がN回→1回 

The (binary-reflected) Gray code

28
先程の性質を使うとXOR演算回数がN回→1回 

Computational Complexity
実際には O(1) になるわけでは
なく、rightmost zero-bitの特定
に O(log n) かかる。
余談: rightmost zero-bitの特定方法

● scipyの実装は改善の余地があったので修正してPR作成済み

○ https://github.com/scipy/scipy/pull/13514

● popcntというCPU命令を使うことで O(1) に近い高速化も可

○ ※ gccやclangのコンパイラ拡張として提供されているので、書き分けが必要。
また (v & -v) - 1の演算が直感的ではなく、可読性が悪いのでscipyへの導入
は諦めました (Goptunaには適用して高速化を確認)。

29
余談: rightmost zero-bitの特定方法

● scipyの実装は改善の余地があったので修正してPR作成済み

○ https://github.com/scipy/scipy/pull/13514

● popcntというCPU命令を使うことで O(1) に近い高速化も可

○ ※ gccやclangのコンパイラ拡張として提供されているので、書き分けが必要。
また (v & -v) - 1の演算が直感的ではなく、可読性が悪いのでscipyへの導入
は諦めました (Goptunaには適用して高速化を確認)。

30
x & (-x) 0101100 → 0000100
(x & (-x))-1 0101100 → 0000011
popcnt(...) 0101100 → 2
アルゴリズムの流れ (ふりかえり)

1. Direction numbersの生成

a. Primitive Polynomial (原始多項式) を用意

b. Initial direction numbers を用意

c. 多項式の各係数をXORで足し合わせる

2. Sobol sequenceの生成

a. 生成回数 i のbinary表現からGray codeを計算

b. Gray codeを導入すること、計算量を減らすことができる。

31
その他のテクニック

32
多次元のSobol sequenceの生成

● 2次元以上のSobol sequenceを生成する際には、各次元ごとにprimitive polynomial
とinitial direction numbersを用意して、先程と同じ手順を繰り返す。

● 注意点として、initial direction numbersは何でもいいといいつつ、多次元において
はよい値(low discrepancyになるもの)とそうでないものがある。

○ そのため良いinitial direction numbersを調べている人たちもいる。

33
Joe & Kuo

34
PyTorch, Scipyもここで配布されているprimitive polynomialsとinitial direction numbersを
埋め込んで使用する。21201次元まで対応

https://web.maths.unsw.edu.au/~fkuo/sobol/
Skipping initial points

Joe & Kuoさんらが公開しているノートにかかれていたテクニック



> Sobol’ sequence tends to perform better

> if an initial portion of the sequence is dropped:

> the number of points skipped is the largest

> power of 2 smaller than number of points to be

> used. However, we are less persuaded by such 

> recommendation ourselves.

35
まとめ

36
まとめ

● Sobol sequenceは、Low discrepancyという性質をもつ乱数のようなものがある。

○ 主な用途はOptimizationやNumerical Integration。

● 今回はアルゴリズムの解説論文を読んで紹介。

○ Theoretical underpinningsは触れられていないので、どうしてLow discrepancy
になるのかは、Sobolさんの論文を参照

37

More Related Content

What's hot

ウェーブレットと多重解像度処理
ウェーブレットと多重解像度処理ウェーブレットと多重解像度処理
ウェーブレットと多重解像度処理
h_okkah
 
複素ラプラス分布に基づく非負値行列因子分解
複素ラプラス分布に基づく非負値行列因子分解複素ラプラス分布に基づく非負値行列因子分解
複素ラプラス分布に基づく非負値行列因子分解
Hiroki_Tanji
 
リプシッツ連続性に基づく勾配法・ニュートン型手法の計算量解析
リプシッツ連続性に基づく勾配法・ニュートン型手法の計算量解析リプシッツ連続性に基づく勾配法・ニュートン型手法の計算量解析
リプシッツ連続性に基づく勾配法・ニュートン型手法の計算量解析
京都大学大学院情報学研究科数理工学専攻
 
アンサンブル木モデル解釈のためのモデル簡略化法
アンサンブル木モデル解釈のためのモデル簡略化法アンサンブル木モデル解釈のためのモデル簡略化法
アンサンブル木モデル解釈のためのモデル簡略化法
Satoshi Hara
 
レプリカ交換モンテカルロ法で乱数の生成
レプリカ交換モンテカルロ法で乱数の生成レプリカ交換モンテカルロ法で乱数の生成
レプリカ交換モンテカルロ法で乱数の生成
Nagi Teramo
 
PRML勉強会 #4 @筑波大学 発表スライド
PRML勉強会 #4 @筑波大学 発表スライドPRML勉強会 #4 @筑波大学 発表スライド
PRML勉強会 #4 @筑波大学 発表スライド
Satoshi Yoshikawa
 
単語・句の分散表現の学習
単語・句の分散表現の学習単語・句の分散表現の学習
単語・句の分散表現の学習
Naoaki Okazaki
 
機械学習におけるオンライン確率的最適化の理論
機械学習におけるオンライン確率的最適化の理論機械学習におけるオンライン確率的最適化の理論
機械学習におけるオンライン確率的最適化の理論
Taiji Suzuki
 
Tensor コアを使った PyTorch の高速化
Tensor コアを使った PyTorch の高速化Tensor コアを使った PyTorch の高速化
Tensor コアを使った PyTorch の高速化
Yusuke Fujimoto
 
【DL輪読会】ConvNeXt V2: Co-designing and Scaling ConvNets with Masked Autoencoders
【DL輪読会】ConvNeXt V2: Co-designing and Scaling ConvNets with Masked Autoencoders【DL輪読会】ConvNeXt V2: Co-designing and Scaling ConvNets with Masked Autoencoders
【DL輪読会】ConvNeXt V2: Co-designing and Scaling ConvNets with Masked Autoencoders
Deep Learning JP
 
[DL輪読会]Flow-based Deep Generative Models
[DL輪読会]Flow-based Deep Generative Models[DL輪読会]Flow-based Deep Generative Models
[DL輪読会]Flow-based Deep Generative Models
Deep Learning JP
 
生成モデルの Deep Learning
生成モデルの Deep Learning生成モデルの Deep Learning
生成モデルの Deep Learning
Seiya Tokui
 
21世紀の手法対決 (MIC vs HSIC)
21世紀の手法対決 (MIC vs HSIC)21世紀の手法対決 (MIC vs HSIC)
21世紀の手法対決 (MIC vs HSIC)
Toru Imai
 
PCAの最終形態GPLVMの解説
PCAの最終形態GPLVMの解説PCAの最終形態GPLVMの解説
PCAの最終形態GPLVMの解説
弘毅 露崎
 
細胞現象の数理
細胞現象の数理細胞現象の数理
細胞現象の数理
Hideaki Nishikawa
 
文献紹介:TSM: Temporal Shift Module for Efficient Video Understanding
文献紹介:TSM: Temporal Shift Module for Efficient Video Understanding文献紹介:TSM: Temporal Shift Module for Efficient Video Understanding
文献紹介:TSM: Temporal Shift Module for Efficient Video Understanding
Toru Tamaki
 
【論文読み会】Self-Attention Generative Adversarial Networks
【論文読み会】Self-Attention Generative  Adversarial Networks【論文読み会】Self-Attention Generative  Adversarial Networks
【論文読み会】Self-Attention Generative Adversarial Networks
ARISE analytics
 
PRML輪読#1
PRML輪読#1PRML輪読#1
PRML輪読#1
matsuolab
 
[DL輪読会]The Neural Process Family−Neural Processes関連の実装を読んで動かしてみる−
[DL輪読会]The Neural Process Family−Neural Processes関連の実装を読んで動かしてみる−[DL輪読会]The Neural Process Family−Neural Processes関連の実装を読んで動かしてみる−
[DL輪読会]The Neural Process Family−Neural Processes関連の実装を読んで動かしてみる−
Deep Learning JP
 

What's hot (20)

Prml 10 1
Prml 10 1Prml 10 1
Prml 10 1
 
ウェーブレットと多重解像度処理
ウェーブレットと多重解像度処理ウェーブレットと多重解像度処理
ウェーブレットと多重解像度処理
 
複素ラプラス分布に基づく非負値行列因子分解
複素ラプラス分布に基づく非負値行列因子分解複素ラプラス分布に基づく非負値行列因子分解
複素ラプラス分布に基づく非負値行列因子分解
 
リプシッツ連続性に基づく勾配法・ニュートン型手法の計算量解析
リプシッツ連続性に基づく勾配法・ニュートン型手法の計算量解析リプシッツ連続性に基づく勾配法・ニュートン型手法の計算量解析
リプシッツ連続性に基づく勾配法・ニュートン型手法の計算量解析
 
アンサンブル木モデル解釈のためのモデル簡略化法
アンサンブル木モデル解釈のためのモデル簡略化法アンサンブル木モデル解釈のためのモデル簡略化法
アンサンブル木モデル解釈のためのモデル簡略化法
 
レプリカ交換モンテカルロ法で乱数の生成
レプリカ交換モンテカルロ法で乱数の生成レプリカ交換モンテカルロ法で乱数の生成
レプリカ交換モンテカルロ法で乱数の生成
 
PRML勉強会 #4 @筑波大学 発表スライド
PRML勉強会 #4 @筑波大学 発表スライドPRML勉強会 #4 @筑波大学 発表スライド
PRML勉強会 #4 @筑波大学 発表スライド
 
単語・句の分散表現の学習
単語・句の分散表現の学習単語・句の分散表現の学習
単語・句の分散表現の学習
 
機械学習におけるオンライン確率的最適化の理論
機械学習におけるオンライン確率的最適化の理論機械学習におけるオンライン確率的最適化の理論
機械学習におけるオンライン確率的最適化の理論
 
Tensor コアを使った PyTorch の高速化
Tensor コアを使った PyTorch の高速化Tensor コアを使った PyTorch の高速化
Tensor コアを使った PyTorch の高速化
 
【DL輪読会】ConvNeXt V2: Co-designing and Scaling ConvNets with Masked Autoencoders
【DL輪読会】ConvNeXt V2: Co-designing and Scaling ConvNets with Masked Autoencoders【DL輪読会】ConvNeXt V2: Co-designing and Scaling ConvNets with Masked Autoencoders
【DL輪読会】ConvNeXt V2: Co-designing and Scaling ConvNets with Masked Autoencoders
 
[DL輪読会]Flow-based Deep Generative Models
[DL輪読会]Flow-based Deep Generative Models[DL輪読会]Flow-based Deep Generative Models
[DL輪読会]Flow-based Deep Generative Models
 
生成モデルの Deep Learning
生成モデルの Deep Learning生成モデルの Deep Learning
生成モデルの Deep Learning
 
21世紀の手法対決 (MIC vs HSIC)
21世紀の手法対決 (MIC vs HSIC)21世紀の手法対決 (MIC vs HSIC)
21世紀の手法対決 (MIC vs HSIC)
 
PCAの最終形態GPLVMの解説
PCAの最終形態GPLVMの解説PCAの最終形態GPLVMの解説
PCAの最終形態GPLVMの解説
 
細胞現象の数理
細胞現象の数理細胞現象の数理
細胞現象の数理
 
文献紹介:TSM: Temporal Shift Module for Efficient Video Understanding
文献紹介:TSM: Temporal Shift Module for Efficient Video Understanding文献紹介:TSM: Temporal Shift Module for Efficient Video Understanding
文献紹介:TSM: Temporal Shift Module for Efficient Video Understanding
 
【論文読み会】Self-Attention Generative Adversarial Networks
【論文読み会】Self-Attention Generative  Adversarial Networks【論文読み会】Self-Attention Generative  Adversarial Networks
【論文読み会】Self-Attention Generative Adversarial Networks
 
PRML輪読#1
PRML輪読#1PRML輪読#1
PRML輪読#1
 
[DL輪読会]The Neural Process Family−Neural Processes関連の実装を読んで動かしてみる−
[DL輪読会]The Neural Process Family−Neural Processes関連の実装を読んで動かしてみる−[DL輪読会]The Neural Process Family−Neural Processes関連の実装を読んで動かしてみる−
[DL輪読会]The Neural Process Family−Neural Processes関連の実装を読んで動かしてみる−
 

More from Masashi Shibata

MLOps Case Studies: Building fast, scalable, and high-accuracy ML systems at ...
MLOps Case Studies: Building fast, scalable, and high-accuracy ML systems at ...MLOps Case Studies: Building fast, scalable, and high-accuracy ML systems at ...
MLOps Case Studies: Building fast, scalable, and high-accuracy ML systems at ...
Masashi Shibata
 
実践Djangoの読み方 - みんなのPython勉強会 #72
実践Djangoの読み方 - みんなのPython勉強会 #72実践Djangoの読み方 - みんなのPython勉強会 #72
実践Djangoの読み方 - みんなのPython勉強会 #72
Masashi Shibata
 
CMA-ESサンプラーによるハイパーパラメータ最適化 at Optuna Meetup #1
CMA-ESサンプラーによるハイパーパラメータ最適化 at Optuna Meetup #1CMA-ESサンプラーによるハイパーパラメータ最適化 at Optuna Meetup #1
CMA-ESサンプラーによるハイパーパラメータ最適化 at Optuna Meetup #1
Masashi Shibata
 
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
Masashi Shibata
 
DARTS: Differentiable Architecture Search at 社内論文読み会
DARTS: Differentiable Architecture Search at 社内論文読み会DARTS: Differentiable Architecture Search at 社内論文読み会
DARTS: Differentiable Architecture Search at 社内論文読み会
Masashi Shibata
 
Goptuna Distributed Bayesian Optimization Framework at Go Conference 2019 Autumn
Goptuna Distributed Bayesian Optimization Framework at Go Conference 2019 AutumnGoptuna Distributed Bayesian Optimization Framework at Go Conference 2019 Autumn
Goptuna Distributed Bayesian Optimization Framework at Go Conference 2019 Autumn
Masashi Shibata
 
PythonとAutoML at PyConJP 2019
PythonとAutoML at PyConJP 2019PythonとAutoML at PyConJP 2019
PythonとAutoML at PyConJP 2019
Masashi Shibata
 
Djangoアプリのデプロイに関するプラクティス / Deploy django application
Djangoアプリのデプロイに関するプラクティス / Deploy django applicationDjangoアプリのデプロイに関するプラクティス / Deploy django application
Djangoアプリのデプロイに関するプラクティス / Deploy django application
Masashi Shibata
 
Django REST Framework における API 実装プラクティス | PyCon JP 2018
Django REST Framework における API 実装プラクティス | PyCon JP 2018Django REST Framework における API 実装プラクティス | PyCon JP 2018
Django REST Framework における API 実装プラクティス | PyCon JP 2018
Masashi Shibata
 
Django の認証処理実装パターン / Django Authentication Patterns
Django の認証処理実装パターン / Django Authentication PatternsDjango の認証処理実装パターン / Django Authentication Patterns
Django の認証処理実装パターン / Django Authentication Patterns
Masashi Shibata
 
RTMPのはなし - RTMP1.0の仕様とコンセプト / Concepts and Specification of RTMP
RTMPのはなし - RTMP1.0の仕様とコンセプト / Concepts and Specification of RTMPRTMPのはなし - RTMP1.0の仕様とコンセプト / Concepts and Specification of RTMP
RTMPのはなし - RTMP1.0の仕様とコンセプト / Concepts and Specification of RTMP
Masashi Shibata
 
システムコールトレーサーの動作原理と実装 (Writing system call tracer for Linux/x86)
システムコールトレーサーの動作原理と実装 (Writing system call tracer for Linux/x86)システムコールトレーサーの動作原理と実装 (Writing system call tracer for Linux/x86)
システムコールトレーサーの動作原理と実装 (Writing system call tracer for Linux/x86)
Masashi Shibata
 
Golangにおける端末制御 リッチなターミナルUIの実現方法
Golangにおける端末制御 リッチなターミナルUIの実現方法Golangにおける端末制御 リッチなターミナルUIの実現方法
Golangにおける端末制御 リッチなターミナルUIの実現方法
Masashi Shibata
 
How to develop a rich terminal UI application
How to develop a rich terminal UI applicationHow to develop a rich terminal UI application
How to develop a rich terminal UI application
Masashi Shibata
 
Introduction of Feedy
Introduction of FeedyIntroduction of Feedy
Introduction of Feedy
Masashi Shibata
 
Webフレームワークを作ってる話 #osakapy
Webフレームワークを作ってる話 #osakapyWebフレームワークを作ってる話 #osakapy
Webフレームワークを作ってる話 #osakapy
Masashi Shibata
 
Pythonのすすめ
PythonのすすめPythonのすすめ
Pythonのすすめ
Masashi Shibata
 
pandasによるデータ加工時の注意点やライブラリの話
pandasによるデータ加工時の注意点やライブラリの話pandasによるデータ加工時の注意点やライブラリの話
pandasによるデータ加工時の注意点やライブラリの話
Masashi Shibata
 
Pythonistaのためのデータ分析入門 - C4K Meetup #3
Pythonistaのためのデータ分析入門 - C4K Meetup #3Pythonistaのためのデータ分析入門 - C4K Meetup #3
Pythonistaのためのデータ分析入門 - C4K Meetup #3
Masashi Shibata
 
テスト駆動開発入門 - C4K Meetup#2
テスト駆動開発入門 - C4K Meetup#2テスト駆動開発入門 - C4K Meetup#2
テスト駆動開発入門 - C4K Meetup#2
Masashi Shibata
 

More from Masashi Shibata (20)

MLOps Case Studies: Building fast, scalable, and high-accuracy ML systems at ...
MLOps Case Studies: Building fast, scalable, and high-accuracy ML systems at ...MLOps Case Studies: Building fast, scalable, and high-accuracy ML systems at ...
MLOps Case Studies: Building fast, scalable, and high-accuracy ML systems at ...
 
実践Djangoの読み方 - みんなのPython勉強会 #72
実践Djangoの読み方 - みんなのPython勉強会 #72実践Djangoの読み方 - みんなのPython勉強会 #72
実践Djangoの読み方 - みんなのPython勉強会 #72
 
CMA-ESサンプラーによるハイパーパラメータ最適化 at Optuna Meetup #1
CMA-ESサンプラーによるハイパーパラメータ最適化 at Optuna Meetup #1CMA-ESサンプラーによるハイパーパラメータ最適化 at Optuna Meetup #1
CMA-ESサンプラーによるハイパーパラメータ最適化 at Optuna Meetup #1
 
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
 
DARTS: Differentiable Architecture Search at 社内論文読み会
DARTS: Differentiable Architecture Search at 社内論文読み会DARTS: Differentiable Architecture Search at 社内論文読み会
DARTS: Differentiable Architecture Search at 社内論文読み会
 
Goptuna Distributed Bayesian Optimization Framework at Go Conference 2019 Autumn
Goptuna Distributed Bayesian Optimization Framework at Go Conference 2019 AutumnGoptuna Distributed Bayesian Optimization Framework at Go Conference 2019 Autumn
Goptuna Distributed Bayesian Optimization Framework at Go Conference 2019 Autumn
 
PythonとAutoML at PyConJP 2019
PythonとAutoML at PyConJP 2019PythonとAutoML at PyConJP 2019
PythonとAutoML at PyConJP 2019
 
Djangoアプリのデプロイに関するプラクティス / Deploy django application
Djangoアプリのデプロイに関するプラクティス / Deploy django applicationDjangoアプリのデプロイに関するプラクティス / Deploy django application
Djangoアプリのデプロイに関するプラクティス / Deploy django application
 
Django REST Framework における API 実装プラクティス | PyCon JP 2018
Django REST Framework における API 実装プラクティス | PyCon JP 2018Django REST Framework における API 実装プラクティス | PyCon JP 2018
Django REST Framework における API 実装プラクティス | PyCon JP 2018
 
Django の認証処理実装パターン / Django Authentication Patterns
Django の認証処理実装パターン / Django Authentication PatternsDjango の認証処理実装パターン / Django Authentication Patterns
Django の認証処理実装パターン / Django Authentication Patterns
 
RTMPのはなし - RTMP1.0の仕様とコンセプト / Concepts and Specification of RTMP
RTMPのはなし - RTMP1.0の仕様とコンセプト / Concepts and Specification of RTMPRTMPのはなし - RTMP1.0の仕様とコンセプト / Concepts and Specification of RTMP
RTMPのはなし - RTMP1.0の仕様とコンセプト / Concepts and Specification of RTMP
 
システムコールトレーサーの動作原理と実装 (Writing system call tracer for Linux/x86)
システムコールトレーサーの動作原理と実装 (Writing system call tracer for Linux/x86)システムコールトレーサーの動作原理と実装 (Writing system call tracer for Linux/x86)
システムコールトレーサーの動作原理と実装 (Writing system call tracer for Linux/x86)
 
Golangにおける端末制御 リッチなターミナルUIの実現方法
Golangにおける端末制御 リッチなターミナルUIの実現方法Golangにおける端末制御 リッチなターミナルUIの実現方法
Golangにおける端末制御 リッチなターミナルUIの実現方法
 
How to develop a rich terminal UI application
How to develop a rich terminal UI applicationHow to develop a rich terminal UI application
How to develop a rich terminal UI application
 
Introduction of Feedy
Introduction of FeedyIntroduction of Feedy
Introduction of Feedy
 
Webフレームワークを作ってる話 #osakapy
Webフレームワークを作ってる話 #osakapyWebフレームワークを作ってる話 #osakapy
Webフレームワークを作ってる話 #osakapy
 
Pythonのすすめ
PythonのすすめPythonのすすめ
Pythonのすすめ
 
pandasによるデータ加工時の注意点やライブラリの話
pandasによるデータ加工時の注意点やライブラリの話pandasによるデータ加工時の注意点やライブラリの話
pandasによるデータ加工時の注意点やライブラリの話
 
Pythonistaのためのデータ分析入門 - C4K Meetup #3
Pythonistaのためのデータ分析入門 - C4K Meetup #3Pythonistaのためのデータ分析入門 - C4K Meetup #3
Pythonistaのためのデータ分析入門 - C4K Meetup #3
 
テスト駆動開発入門 - C4K Meetup#2
テスト駆動開発入門 - C4K Meetup#2テスト駆動開発入門 - C4K Meetup#2
テスト駆動開発入門 - C4K Meetup#2
 

Implementing sobol's quasirandom sequence generator

  • 1. ALGORITHM 659
 Implementing Sobol’s Quasirandom Sequence Generator
 PAUL BRATLEY and BENNETT L. FOX
 ACM Transactions on Mathematical Software
 Vol. 14 (1988) 88;
 1
  • 2. 読んできた論文
 ● Ilya M. Sobolさんという方が考えた Quasi-random Sequence Generatorの実装 方法について書かれた論文 ○ “Quasi” とついているように、通常の乱数とは少し違い、Low Discrepancyと いう性質を持つ。 ● Sobolさんの論文ではなく、アルゴリズムの実装にフォーカスして解説してくれてい る論文 (引用数: 961件) ○ Theoretical underpinningsにはあんまりちゃんと触れない。 ● 今回はGo言語で実装してGoptunaにも導入 2
  • 4. Low discrepancy
 4 ハイパーパラメーター最適化を例に考えると、 似たようなパラメーターは、 (経験的に) 似たような 評価値になることが多いので、散らばってくれると 嬉しい。
  • 5. アルゴリズムの用途
 ● Optimization
 ○ BBO Challengeで自分たちも使用 
 ○ “We employ Quasi Monte Carlo sampling based on Sobol sequences instead of Latin hypercube sampling.” 
 ● Numerical Integration 
 ○ 疑似乱数(pseudorandom)を使用する Monte-Carlo Integrationと区別して ”Quasi-Monte Carlo Integration” と呼ばれ る
 5
  • 9. Direction numbers の形式と性質
 9 i 1 2 3 4 5 6 mi 1 3 7 5 7 43 vi 0.1 0.11 0.111 0.0101 0.00111 0.101011
  • 10. Direction numbers の形式と性質
 10 i 1 2 3 4 5 6 mi 1 3 7 5 7 43 vi 0.1 0.11 0.111 0.0101 0.00111 0.101011 こういう形式のdirection numbersを生成。 ※ 論文上はこのような浮動小数点数です が、実装の都合上プログラムでは uint32など で表現されています。
  • 11. Direction numbers の形式と性質
 11 i 1 2 3 4 5 6 mi 1 3 7 5 7 43 vi 0.1 0.11 0.111 0.0101 0.00111 0.101011 direction numbersは、miという値から計 算されるので、miの作り方を知る必要が あります。
  • 12. Direction numbers の形式と性質
 12 i 1 2 3 4 5 6 mi 1 3 7 5 7 43 vi 0.1 0.11 0.111 0.0101 0.00111 0.101011 miはこのような値を持ちます。
  • 13. Direction numbers の形式と性質
 13 i 1 2 3 4 5 6 mi 1 3 7 5 7 43 vi 0.1 0.11 0.111 0.0101 0.00111 0.101011
  • 15. mi のつくりかた ①
 15 次のようなPrimitive Polynomial (原子多項式)をφ(2^d-1)/d個用意。
 各係数は0 or 1のどちらかをとり、定数項は必ず1。
 これを満たしていれば、係数は自由に選べる。

  • 17. miのつくりかた ②
 17 Primitive Polynomialの係数をXORで足し合わせる。
 miの計算には m_(i-1) などが必要。 なのでm0やm1といった初期値は なにか適当に決める必要があります。 → Initial direction numbersと呼ばれる これも 0<mi<2^i を満たす奇数。すべて 1も 可。
  • 21. Gray code による改善
 ● Antonov and Saleevさんらによる改良
 ● Direction numbersからSobol sequenceを生成する際に、Gray codeを利用する
 21
  • 22. The (binary-reflected) Gray code
 22 i (decimal) i (binary) i / 2 (binary) Gray (binary) Gray (decimal) 0 0000 0000 0000 0 1 0001 0000 0001 1 2 0010 0001 0011 3 3 0011 0001 0010 2 4 0100 0010 0110 6 5 0101 0010 0111 7 6 0110 0011 0101 5 7 0111 0011 0100 4 Gray codeは
 同じ色で囲われた範囲の 
 中で順序を入れ替える特性 をもつ。
 
 また1 bitしか変化がない。 

  • 23. The (binary-reflected) Gray code
 23 i (decimal) i (binary) i / 2 (binary) Gray (binary) Gray (decimal) 0 0000 0000 0000 0 1 0001 0000 0001 1 2 0010 0001 0011 3 3 0011 0001 0010 2 4 0100 0010 0110 6 5 0101 0010 0111 7 6 0110 0011 0101 5 7 0111 0011 0100 4 1 bit 右にシフト Gray codeは
 同じ色で囲われた範囲の 
 中で順序を入れ替える特性 をもつ。
 
 また1 bitしか変化がない。 

  • 24. The (binary-reflected) Gray code
 24 i (decimal) i (binary) i / 2 (binary) Gray (binary) Gray (decimal) 0 0000 0000 0000 0 1 0001 0000 0001 1 2 0010 0001 0011 3 3 0011 0001 0010 2 4 0100 0010 0110 6 5 0101 0010 0111 7 6 0110 0011 0101 5 7 0111 0011 0100 4 i と i/2 のXOR Gray codeは
 同じ色で囲われた範囲の 
 中で順序を入れ替える特性 をもつ。
 
 また1 bitしか変化がない。 

  • 25. Gray codeは
 同じ色で囲われた範囲の 
 中で順序を入れ替える特性 をもつ。
 
 また1 bitしか変化がない。 
 The (binary-reflected) Gray code
 25 i (decimal) i (binary) i / 2 (binary) Gray (binary) Gray (decimal) 0 0000 0000 0000 0 1 0001 0000 0001 1 2 0010 0001 0011 3 3 0011 0001 0010 2 4 0100 0010 0110 6 5 0101 0010 0111 7 6 0110 0011 0101 5 7 0111 0011 0100 4 同じ色で囲われた範囲の中で 順序が入れ替わっている
  • 26. Gray codeは
 同じ色で囲われた範囲の 
 中で順序を入れ替える特性 をもつ。
 
 また1 bitしか変化がない。 
 The (binary-reflected) Gray code
 26 i (decimal) i (binary) i / 2 (binary) Gray (binary) Gray (decimal) 0 0000 0000 0000 0 1 0001 0000 0001 1 2 0010 0001 0011 3 3 0011 0001 0010 2 4 0100 0010 0110 6 5 0101 0010 0111 7 6 0110 0011 0101 5 7 0111 0011 0100 4 1 bitずつしか変化しない。 変化するbitの位置は、 rightmost zero-bit in the binary representation of i (太字にした箇所)
  • 27. The (binary-reflected) Gray code
 27 先程の性質を使うとXOR演算回数がN回→1回 

  • 28. The (binary-reflected) Gray code
 28 先程の性質を使うとXOR演算回数がN回→1回 
 Computational Complexity 実際には O(1) になるわけでは なく、rightmost zero-bitの特定 に O(log n) かかる。
  • 29. 余談: rightmost zero-bitの特定方法
 ● scipyの実装は改善の余地があったので修正してPR作成済み
 ○ https://github.com/scipy/scipy/pull/13514
 ● popcntというCPU命令を使うことで O(1) に近い高速化も可
 ○ ※ gccやclangのコンパイラ拡張として提供されているので、書き分けが必要。 また (v & -v) - 1の演算が直感的ではなく、可読性が悪いのでscipyへの導入 は諦めました (Goptunaには適用して高速化を確認)。
 29
  • 30. 余談: rightmost zero-bitの特定方法
 ● scipyの実装は改善の余地があったので修正してPR作成済み
 ○ https://github.com/scipy/scipy/pull/13514
 ● popcntというCPU命令を使うことで O(1) に近い高速化も可
 ○ ※ gccやclangのコンパイラ拡張として提供されているので、書き分けが必要。 また (v & -v) - 1の演算が直感的ではなく、可読性が悪いのでscipyへの導入 は諦めました (Goptunaには適用して高速化を確認)。
 30 x & (-x) 0101100 → 0000100 (x & (-x))-1 0101100 → 0000011 popcnt(...) 0101100 → 2
  • 31. アルゴリズムの流れ (ふりかえり)
 1. Direction numbersの生成
 a. Primitive Polynomial (原始多項式) を用意
 b. Initial direction numbers を用意
 c. 多項式の各係数をXORで足し合わせる
 2. Sobol sequenceの生成
 a. 生成回数 i のbinary表現からGray codeを計算
 b. Gray codeを導入すること、計算量を減らすことができる。
 31
  • 33. 多次元のSobol sequenceの生成
 ● 2次元以上のSobol sequenceを生成する際には、各次元ごとにprimitive polynomial とinitial direction numbersを用意して、先程と同じ手順を繰り返す。
 ● 注意点として、initial direction numbersは何でもいいといいつつ、多次元において はよい値(low discrepancyになるもの)とそうでないものがある。
 ○ そのため良いinitial direction numbersを調べている人たちもいる。
 33
  • 34. Joe & Kuo
 34 PyTorch, Scipyもここで配布されているprimitive polynomialsとinitial direction numbersを 埋め込んで使用する。21201次元まで対応
 https://web.maths.unsw.edu.au/~fkuo/sobol/
  • 35. Skipping initial points
 Joe & Kuoさんらが公開しているノートにかかれていたテクニック
 
 > Sobol’ sequence tends to perform better
 > if an initial portion of the sequence is dropped:
 > the number of points skipped is the largest
 > power of 2 smaller than number of points to be
 > used. However, we are less persuaded by such 
 > recommendation ourselves.
 35
  • 37. まとめ
 ● Sobol sequenceは、Low discrepancyという性質をもつ乱数のようなものがある。
 ○ 主な用途はOptimizationやNumerical Integration。
 ● 今回はアルゴリズムの解説論文を読んで紹介。
 ○ Theoretical underpinningsは触れられていないので、どうしてLow discrepancy になるのかは、Sobolさんの論文を参照
 37