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

PDF
Program on Quasi-Monte Carlo and High-Dimensional Sampling Methods for Applie...
PDF
Chapter9 一歩進んだ文法(前半)
PDF
レプリカ交換モンテカルロ法で乱数の生成
PDF
QMC: Transition Workshop - Reduced Component-by-Component Constructions of (P...
PDF
プログラミングコンテストでの乱択アルゴリズム
PPTX
ブートストラップ法とその周辺とR
PDF
定理証明支援系Coqについて
PDF
Probabilistic Graphical Models 輪読会 #1
Program on Quasi-Monte Carlo and High-Dimensional Sampling Methods for Applie...
Chapter9 一歩進んだ文法(前半)
レプリカ交換モンテカルロ法で乱数の生成
QMC: Transition Workshop - Reduced Component-by-Component Constructions of (P...
プログラミングコンテストでの乱択アルゴリズム
ブートストラップ法とその周辺とR
定理証明支援系Coqについて
Probabilistic Graphical Models 輪読会 #1

What's hot (20)

PDF
双対性
PDF
21世紀の手法対決 (MIC vs HSIC)
PDF
大規模な組合せ最適化問題に対する発見的解法
PDF
混合モデルとEMアルゴリズム(PRML第9章)
PDF
ウェーブレット木の世界
PDF
変分推論法(変分ベイズ法)(PRML第10章)
PDF
ノンパラベイズ入門の入門
PDF
PRML 4.1 Discriminant Function
PDF
ニューラルネットワークを用いた自然言語処理
PDF
[DL輪読会]Parallel WaveNet: Fast High-Fidelity Speech Synthesis
PDF
PDF
PDF
Stan超初心者入門
PDF
NumPy闇入門
PDF
クラシックな機械学習入門:付録:よく使う線形代数の公式
PPTX
圏論とHaskellは仲良し
PDF
Variational AutoEncoder
PDF
関数プログラミング入門
PDF
競技プログラミングでの線型方程式系
PDF
PRMLの線形回帰モデル(線形基底関数モデル)
双対性
21世紀の手法対決 (MIC vs HSIC)
大規模な組合せ最適化問題に対する発見的解法
混合モデルとEMアルゴリズム(PRML第9章)
ウェーブレット木の世界
変分推論法(変分ベイズ法)(PRML第10章)
ノンパラベイズ入門の入門
PRML 4.1 Discriminant Function
ニューラルネットワークを用いた自然言語処理
[DL輪読会]Parallel WaveNet: Fast High-Fidelity Speech Synthesis
Stan超初心者入門
NumPy闇入門
クラシックな機械学習入門:付録:よく使う線形代数の公式
圏論とHaskellは仲良し
Variational AutoEncoder
関数プログラミング入門
競技プログラミングでの線型方程式系
PRMLの線形回帰モデル(線形基底関数モデル)
Ad

Similar to Implementing sobol's quasirandom sequence generator (20)

PDF
CRC-32
PPTX
Schönhage Strassen Algorithm
PDF
Ibisml2011 06-20
PDF
Deflate
PDF
フラグを愛でる
PDF
姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい
PDF
Bitmap
PPT
6 Info Theory
PDF
暗号技術の実装と数学
PDF
ZDD入門-お姉さんを救う方法
PPTX
データとは何か
PDF
DDPC 2016 予選 解説
PDF
Introduction to Categorical Programming (Revised)
PDF
すごいHaskell読書会 第六章 発表資料
PDF
TokyoNLP#7 きれいなジャイアンのカカカカ☆カーネル法入門-C++
PDF
Rでマンデルブロ集合
PDF
JOI春季ステップアップセミナー 2021 講義スライド
PDF
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編
PDF
2013computer s1
ODP
情報オリンピック夏合宿発表
CRC-32
Schönhage Strassen Algorithm
Ibisml2011 06-20
Deflate
フラグを愛でる
姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい
Bitmap
6 Info Theory
暗号技術の実装と数学
ZDD入門-お姉さんを救う方法
データとは何か
DDPC 2016 予選 解説
Introduction to Categorical Programming (Revised)
すごいHaskell読書会 第六章 発表資料
TokyoNLP#7 きれいなジャイアンのカカカカ☆カーネル法入門-C++
Rでマンデルブロ集合
JOI春季ステップアップセミナー 2021 講義スライド
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編
2013computer s1
情報オリンピック夏合宿発表
Ad

More from Masashi Shibata (20)

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

Recently uploaded (10)

PDF
商用ウェブカメラ市場:世界の産業現状、競合分析、シェア、規模、動向2025-2031年の予測
PDF
細胞培養用バイオリアクターおよび発酵槽市場規模の成長見通し:2031年には2823百万米ドルに到達へ
PDF
世界半導体用酸化ハフニウム市場のサプライチェーン解析:上流、下流、収益モデル分析2025-2031
PDF
【QYResearch】グローバル農業機械市場の動向分析と成長戦略に関する総合調査報告
PDF
XCMSを用いた質量分析データ処理_BioCAsia2021_yamamoto.pdf
PDF
【QYResearch】グローバルコネクタ市場の動向と将来展望に関する詳細な分析報告
PDF
限外ろ過膜調査レポート:市場規模、シェア、産業分析データ、最新動向2025-2031 YH Research
PDF
【QYResearch】人形ロボット産業の市場構造と今後の発展方向に関する分析レポート
PDF
Qlik TECH TALK セミナー:What's New In Qlik ~ 2025年7月リリース最新機能のご紹介
PDF
グローバルロープウェイ用スチールワイヤーロープ市場2025:主要企業のシェア、売上動向、競争戦略
商用ウェブカメラ市場:世界の産業現状、競合分析、シェア、規模、動向2025-2031年の予測
細胞培養用バイオリアクターおよび発酵槽市場規模の成長見通し:2031年には2823百万米ドルに到達へ
世界半導体用酸化ハフニウム市場のサプライチェーン解析:上流、下流、収益モデル分析2025-2031
【QYResearch】グローバル農業機械市場の動向分析と成長戦略に関する総合調査報告
XCMSを用いた質量分析データ処理_BioCAsia2021_yamamoto.pdf
【QYResearch】グローバルコネクタ市場の動向と将来展望に関する詳細な分析報告
限外ろ過膜調査レポート:市場規模、シェア、産業分析データ、最新動向2025-2031 YH Research
【QYResearch】人形ロボット産業の市場構造と今後の発展方向に関する分析レポート
Qlik TECH TALK セミナー:What's New In Qlik ~ 2025年7月リリース最新機能のご紹介
グローバルロープウェイ用スチールワイヤーロープ市場2025:主要企業のシェア、売上動向、競争戦略

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