Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
Quantum Neuron: an elementary building block for machine learning on quantum computers https://arxiv.org/abs/1711.11240 量子コンピュータアプリ勉強会 2018/3/13 論文紹介 鳥越貴智 (piyo7)
Slide 2
Slide 2 text
自己紹介 Qiitaに生息してます ٩( 'ω' )و https://qiita.com/piyo7 量子ゲートシミュレータを ScalaMatsuri で発表予定 (・ㅂ・)و✧ https://github.com/piyo7/qlione ● 量子力学 ←ぜんぜん知らない ● 量子ゲートの計算モデル ←ちょっと本読んでみた ● ニューラルネットワーク ←ちょっと遊んだことある
Slide 3
Slide 3 text
自己紹介 分野ふらふら ٩( ᐛ )و 元 C++ 屋、現 Scala 使い、時々 Python。 ベイズ統計やりたくなったので Stan 触りはじめました。 ● プログラミング言語の型理論 @ 東京大学数学科 ● 無線ネットワークシミュレーション @ 構造計画研究所 ● データ分析/集計/予測 @サイバーエージェント ←今ここ // 今日の論文は、社内の機械学習論文共有会のネタとして読みました。
Slide 4
Slide 4 text
あらすじ ● 量子コンピュータ(量子ゲート計算機)で、 ニューラルネットワークを構築する筋道を示すよ。 ● 量子計算は線形なものだけど、非線形な活性化関数を ブロッホ球の Y 軸回転角上で設計したよ。 ● 量子の「重ね合わせ」で、ニューラルネットワークに 大量の訓練データを一発で食わせられるよ。 // ちなみに、ImPACTの量子ニューラルネットワーク計算機とは無関係だよ。
Slide 5
Slide 5 text
チュートリアル:量子ビット 2 古典ビット 2 量子ビット n 量子ビットの状態は、2^n 個の基底の「重ね合わせ」 50 量子ビットの場合、基底が 1,125,899,906,842,624 個。
Slide 6
Slide 6 text
チュートリアル:量子ゲート 量子回路 に、 量子ビット を通すと、
Slide 7
Slide 7 text
チュートリアル:量子測定 を測定すると、 基底が得られる確率は たとえば上位ビットのみ測定することもできて、 結果が 1 の確率は ¼ + ½ = ¾ 、測定後の状態は、
Slide 8
Slide 8 text
チュートリアル:量子計算 ● n 量子ビットは、 2^n 行でノルム 1 の複素ベクトル。 ● n 量子ビット用の量子ゲートは、 2^n 行 2^n 列の(複素)ユニタリ行列。 ● 量子ビットを測定して得られる確率は、 射影した複素ベクトルのノルム。 // 量子力学知らなくても受け入れてしまえば、わりと計算モデルはシンプル。
Slide 9
Slide 9 text
あらすじ ● 量子コンピュータ(量子ゲート計算機)で、 ニューラルネットワークを構築する筋道を示すよ。 ● 量子計算は線形なものだけど、非線形な活性化関数を ブロッホ球の Y 軸回転角上で設計したよ。 ● 量子の「重ね合わせ」で、ニューラルネットワークに 大量の訓練データを一発で食わせられるよ。
Slide 10
Slide 10 text
量子ニューロンのイメージ
Slide 11
Slide 11 text
人工ニューロンの数式 // q(Φ)を足がかりに、 // 力技でステップ関数を模していく。
Slide 12
Slide 12 text
線形結合の量子回路
Slide 13
Slide 13 text
活性化関数の量子回路 // 回転角の符号が論文と逆転してるので、数式展開を微妙に間違えてるかも…
Slide 14
Slide 14 text
活性化関数の量子計算
Slide 15
Slide 15 text
// 2Φ 回して 2Φ 戻す間に差し込んだ -iY が、うまく Y 軸回転に効いてる。 活性化関数の量子計算
Slide 16
Slide 16 text
線形結合の量子回路
Slide 17
Slide 17 text
あらすじ ● 量子コンピュータ(量子ゲート計算機)で、 ニューラルネットワークを構築する筋道を示すよ。 ● 量子計算は線形なものだけど、非線形な活性化関数を ブロッホ球の Y 軸回転角上で設計したよ。 ● 量子の「重ね合わせ」で、ニューラルネットワークに 大量の訓練データを一発で食わせられるよ。 // このパートは Qiita 記事の抜粋でした。 https://qiita.com/piyo7/items/2104fe7084c95ed4b97b
Slide 18
Slide 18 text
しばらく著者スライドに移ります http://qtml2017.di.univr.it/resources/Slides/Quantum-Neuron.pdf // 実験結果は古典計算機によるシミュレーションのはず。
Slide 19
Slide 19 text
あらすじ ● 量子コンピュータ(量子ゲート計算機)で、 ニューラルネットワークを構築する筋道を示すよ。 ● 量子計算は線形なものだけど、非線形な活性化関数を ブロッホ球の Y 軸回転角上で設計したよ。 ● 量子の「重ね合わせ」で、ニューラルネットワークに 大量の訓練データを一発で食わせられるよ。
Slide 20
Slide 20 text
重ね合わせ学習 ● 訓練データを重ね合わせ、一度に学習できる。 ● 訓練データの重ね合わせ状態を得るためには、 別途、何かしらの量子的な機構が必要。 ● 微分が困難なため、最適化アルゴリズムは 導関数不要なNelder–Mead法などを使う。 // このあたり論文に詳しく書いてなかったため、 // いくつか疑問があったり、社内でツッコミもらいました。 // 分かる方いらっしゃったら教えてください m(_ _)m
Slide 21
Slide 21 text
重ね合わせ学習 ● 訓練データを重ね合わせ、一度に学習できる。 // 入力が n 量子ビットだとすると、 // 最大 2^n の訓練データを重ね合わせられるはず。 // => それが手に入るなら辞書から引くだけでいいので、実際は問題に応じて。 // 量子ビット数とデータ数の比によって、ありがたみ変わってきそう。 // それらの誤差の平均を測定結果の期待値として得られる、という意味だと理解。 // => 訓練データをランダムに選んで、 // 古典ニューラルネットワークで一つずつ誤差を計算するのと同じ??? // => なにか勘違いしているか、量子測定のテクニックがあるのかも。
Slide 22
Slide 22 text
重ね合わせ学習 ● 訓練データの重ね合わせ状態を得るためには、 別途、何かしらの量子的な機構が必要。 // 論文にはキーワードだけ紹介されているけど調べてないです……。 // QRAM、量子データベース、もしくは訓練データを生成する別の量子回路 // => 同じ重ね合わせ状態を繰り返し出力しないといけないはずなので、 // こちらの計算量も気にしたほうが良さそう。
Slide 23
Slide 23 text
重ね合わせ学習 ● 微分が困難なため、最適化アルゴリズムは 導関数不要なNelder–Mead法などを使う。 // 最適化は古典計算機で行って、量子回路の回転ゲートを制御するのだと思う。 // => ここも量子コンピュータでやれたら凄そう。 // Nelder–Mead法は初歩的なブラックボックス最適化手法で、 // ディープラーニングのように、 // パラメータ数が膨大なものには向いてないらしい。 // => 現在の各種ディープラーニングフレームワークには、 // 自動微分が底にあるはずなので、これはこれで挑戦的な研究分野かも。
Slide 24
Slide 24 text
あらすじ ● 量子コンピュータ(量子ゲート計算機)で、 ニューラルネットワークを構築する筋道を示すよ。 ● 量子計算は線形なものだけど、非線形な活性化関数を ブロッホ球の Y 軸回転角上で設計したよ。 ● 量子の「重ね合わせ」で、ニューラルネットワークに 大量の訓練データを一発で食わせられるよ。
Slide 25
Slide 25 text
量子ニューロンの計算量
Slide 26
Slide 26 text
// 古典NNの計算量はざくっと T * O(n^2 * l) ※ T は訓練データ数 順伝播型ニューラルネットワークの計算量
Slide 27
Slide 27 text
ホップフィールドネットワークの計算量
Slide 28
Slide 28 text
おまけ @tailrec def activateRus(psi: QuBits[_1], phi: Double) (implicit r: Random): QuBits[_1] = { val m = (psi x bit0 ) |> (I x Ry(2 * phi) ) |> (QuGate(-1.i * Y.matrix) x I ) |> (I x Ry(2 * phi).t) |> (_.measure[_0]) if (m.result) { activateRus(m.unmeasured |> Ry(Pi / 2), phi) } else { m.unmeasured } } ScalaMatsuri 2018 発表用の 量子シミュレーターで 活性化関数の実装してみた。 気が向いたら追試したい…… \型安全な量子回路DSL/ https://github.com/piyo7/qlione