Más contenido relacionado
La actualidad más candente (20)
Similar a Quantum Support Vector Machine (20)
Quantum Support Vector Machine
- 14. QuantumTokyoカーネルトリック
カーネル関数の例1…多項式カーネル
• d=2とすると…
𝑘 𝒂, 𝒃 = 1 + 𝒂 ⋅ 𝒃 𝑑
𝑘 𝒂, 𝒃 = 1 + 2𝒂 ⋅ 𝒃 + (𝒂 ⋅ 𝒃) 𝟐
= 1, 2𝑥 𝑎, 2𝑦𝑎, 𝑥 𝑎
2
, 𝑦𝑎
2
, 𝑥 𝑎 𝑦𝑎 ⋅ 1, 2𝑥 𝑏, 2𝑦 𝑏, 𝑥 𝑏
2
, 𝑦 𝑏
2
, 𝑥 𝑏 𝑦 𝑏
x
y
𝑎 = (𝑥 𝑎, 𝑦𝑎)
𝑏 = (𝑥 𝑏, 𝑦 𝑏)
変換𝜙により6次元化
𝑘 𝒂, 𝒃 = 𝜙 𝒂 ⋅ 𝜙(𝒃)
2次元→6次元
変換を実際には行わず、内積の結果のみを使用する
14
𝜙 𝒂 𝜙 𝒃
- 18. ノイズフリー(1) NISQ(2)
逆行列計算
(*位相推定を利用)
◯ ×
(位相推定はNISQでは不可)
内積計算 △
(SWAPテストで高コストな3量子
ゲートを利用)
◯
(改良アルゴリズムで少数の
2量子ゲートを利用)
高速化 ◯
(指数的な高速化)
△
(特に優位性なし*)
特徴量マッ ピング △
(古典と同様、量子特有の工夫なし)
◯
(量子カーネルを作成)
*量子の計算方法を古典で再現すると優位性が「示唆」されるが古典本来の方法と比べると優位性はない
量子SVMの概要(理想版 vs NISQ版)
NISQ版のQSVMでは高速化ではなく特徴量マッピングの高度化に焦点が置かれています。
18
(1)P. Rebentrost, M. Mohseni and S. Lloyd, PRL 113, 13050 (2014)
(2)V. Havlíček et. al., Nature 567, 209 (2019)
- 28. QuantumTokyo
28
量子カーネル(内積)の計算方法
| 𝜓 = 𝐴|00 = 𝑎 00 + 𝑏 01 + 𝑐 10 + 𝑑 11
初期状態|00 にユニタリ行列𝐴をかけた状態| 𝜓 の観測考えます
これで| 𝛷 𝒙 の実装方法を学びました。
次は量子カーネル𝐾 𝒙𝑖, 𝒙 𝑘 = Φ(𝒙𝑖) Φ(𝒙 𝑘) 2の計算方法です。
𝐴
このとき観測される状態が 00 , …, 11 となる確率は
それぞれ 𝑎 2
, … , 𝑑 2
となります(量子力学のルール)。
𝑖 𝑗 = 𝛿𝑖𝑗なので、 00 𝐴 00 2 = 𝑎 2です。
00 𝐴 00 2
𝑎 2
Shot=1000 (千回観測)したときのヒストグラム
01 𝐴 00 2
𝑏 2
𝑐 2 𝑑 2
10 𝐴 00 2
11 𝐴 00 2
- 29. QuantumTokyo
29
量子カーネル(内積)の計算方法
量子カーネル𝐾 𝒙𝑖, 𝒙 𝑘 = Φ(𝒙𝑖) Φ(𝒙 𝑘) 2 = 0 𝑈Φ 𝒙 𝑖
†
𝑈Φ 𝒙 𝑘
0
2
より同様に計算できます。
をR回測定して|00 がr回出現したとき、
𝐾 𝒙𝑖, 𝒙 𝑘 =
𝑟
𝑅
となります。
特徴量が2次元の場合( 0 ≔ 00 )、次のように計算できます
𝑈Φ 𝒙 𝑘
𝑈Φ 𝒙 𝑖
†
00 𝑈𝑖
†
𝑈 𝑘 00
2
𝐾 𝒙𝑖, 𝒙 𝑘
Shot=1000 (千回観測)したときのヒストグラム
𝒙1= (2, 3), 𝒙2= (1, 1)で
を𝐾 𝒙1 𝒙2 を実際に計算
- 30. QuantumTokyo
30
計算コスト
|Φ(𝒙1) |Φ(𝒙2) |Φ(𝒙3) |Φ(𝒙4) |Φ(𝒙5)
Φ 𝒙1 | 1
Φ 𝒙2 | 1
Φ 𝒙3 | 1
Φ 𝒙4 | 1
Φ 𝒙5 | 1
例: データ数𝑁 =5の場合
𝑈Φ 𝒙1
𝑈Φ 𝒙2
†
十分な精度を得るために
𝑂(𝑁2
)回の観測が必要
訓練データ数𝑁に対し、十分な精度を得るために𝑂(𝑁2)回の観測が必要で、
カーネル𝐾 𝒙𝑖, 𝒙 𝑘 の全ペア𝑂(𝑁2)回の量子回路の構築・実行が必要なため計算コストは𝑂(𝑁4)
カーネル行列の対角成分は常に1で、
対象行列なので計算が必要なペアは𝑁(𝑁 − 1)/2
- 34. QuantumTokyoGithubのコードで実際に実行してみた (量子シミュレータ[仮想版])
古典SVM 量子SVM
データセット: Breast_cancer (sklearn)
Accuracy: 0.85
Precision: 0.77
Recall: 1.00
Specificity: 0.70
F1-score: 0.87
実行時間(Mac PC):
モデル作成 3分11秒
予測 90分
実行時間(Mac PC):
モデル作成 + 予測 0.2秒
Accuracy: 0.65
Precision: 0.60
Recall: 0.90
Specificity: 0.40
F1-score: 0.72
●/●: 訓練データ(n=20) ■/■: テストデータ(n=10) ■/■予測データ(n=2500) × 誤分類
34
- 35. QuantumTokyoGithubのコードで実際に実行してみた (量子シミュレータ[仮想版])
古典SVM 量子SVM
●/●: 訓練データ(n=40) ■/■: テストデータ(n=20) ■/■予測データ(n=2500) × 誤分類
Accuracy: 0.80
Precision: 0.80
Recall: 0.80
Specificity: 0.80
F1-score: 0.80
実行時間(Mac PC):
モデル作成 3分11秒
予測 90分
実行時間(Mac PC):
モデル作成 + 予測 0.2秒
データセット: ad_hoc_data(qiskit.ml.datasets; 量子SVM用のデータセット)
Accuracy: 0.50
Precision: 0.50
Recall: 0.60
Specificity: 0.40
F1-score: 0.5535
Notas del editor
- 量子SVMではカーネルの概念が重要なので古典の説明を使って詳しく見ていきます。
今回のアジェンダは古典のSVMを前半で説明し、後半では量子カーネルという概念を中心に量子SVMの仕組みの説明をしていきます。
最後に実際に量子SVMのコードを回すところをお見せします。
- では古典のSVMから説明をしていきます。青と赤のグループに属するデータセットがあります。
これらを以下のように境界で分ける時、左右どちらの分け方がよいでしょうか?
誰か答えてくれる人いらっしゃいますか??(理由聞く)
ヒントは境界に近いデータ点に着目することです。
左の図では青色の点が境界に最も近い点です。右の図では境界の両側の赤と青の点が最近傍の点です。
- 境界付近の点に着目すると、左の図の場合は境界線が青色のデータ点に偏りすぎています。
一方で右側では境界に近い青と赤のデータ点がどちらかに偏ることなく、境界線との距離が等しくなっています。
つまり、それぞれのグループで境界に最近傍の点と境界線の距離が最大限に引き離されています。
この境界線と最近傍のデータ点の距離をマージンとよびます。
これが長いほど安定した分け方という考え方がSVMです。
- 言い換えると、SVMとはグループ間の境界面を定めてデータを分類する分析手法と言えます。
このマージンMをできるだけ大きく取るように最適化をすることで、未知のデータに対して判別能力を保つことができます。
機械学習では未知のデータに対して判別能力を保つことを汎化性能を高くすると呼びます。
ではこのマージンM最大限に大きくするためには何をしたらいいのかを見ていきます。
- まず、SVMが決定するのはマージンが最大化されるような境界面の方程式です。
これはWドットXプラスb=0で表せます。
つまり、係数wと切片bを計算することになります。
データ点がN個の場合で2クラスへの分類を考えてみます。
この時ある点x_jと境界の距離は、wドットx_j +bの絶対値を、wの絶対値で割ったものです。
これは高校時代に習ったと思われる、点と直線の距離ですね。
各点と境界の距離のうち最小のものが、最近傍点と境界の距離になります。
なので、マージンは全ての点と境界の距離のうち最小のものとなります。
- ここで、係数wと接点bには定数倍の任意性があります。
一意に決めれるために、ミニマムの絶対値のWドットX_iプラスbが1となるような制約をつけます。
この時マージンは絶対値w分の1となります。
次に、赤のグループか青のグループかの分類を定量的に表現するため、次の分類条件をつけます。
t_iはx_iが青グループなら-1、赤グループなら+1とします。
この制約条件と分類条件を合わせて、
t_iかけるw x_i プラスbが1以上という条件でかけます。
この条件下でマージンM=絶対値のW分の1を最大化します。
- この制約条件では不等式が登場し、最適化が扱いにくいので、解きやすい形に変換していきます。
元々はマージンMの最大化でしたが、これは分母wの2乗の最小化と等価です。
この最大化もしくは最小化する関数を目的関数と呼びます。
ここでラグランジ未定係数法という最適化問題のテクニックを使うと、パラメータαを用いて目的関数に制約条件を含めることができます。
変換後の目的関数をLとした時、(双対問題となるので)minとmaxがまた入れ替わり、Lの最大値を求めることになります。
変換後には3つの最大化条件が等式で与えられるようになります。
3つ目の条件によりwの各成分w_iをパラメメータαを使って表すことができ、目的関数Lをパラメータαで表すことができます。
あとはLを最大化するようにパラメータαにを決めると、そこから境界面を決める係数wが求まります。
ここでL の関数にx_iとx_kの内積が出てきているのを数ページ先のために覚えておいてください。
- また、先ほど挙げた最大化条件のうち1つ目を見ると気づくことがあります。
境界面に一番近いデータ点でt_i かけるwドットx_I + bが1になるように制約をつけたのを思い出してください。
それ以外の教師データ点ではパラメータα_iが0となります。
t_i かけるwドットx_I + bが1の時の教師データに対してのみパラメータα_iが0以外の意味のある値をを取ります。
つまりそれ以外の教師データはモデルに対して意味のない教師データとなっています。
この意味のある教師データ点のことをサポートベクトルと言います。
- ここまで話した方法では境界は直線や平面などの線形である必要がありました。
しかし、このままだと次のような2つのグループを正しく分類することができません。
この場合、どうしたらよいでしょうか?
- ここで非線型SVMというものが登場します。
データを高次元へ特徴量マッピングすることで、線形な境界面を作ることができ、分類が可能になります。
例えば、先ほどの例だとz軸にx^2+y^2を追加することで、z軸に垂直な平面でデータを分類できるようになりました。
- ただ、この方法の欠点はマッピングする特徴量を高次元にするほど計算コストがかかってしまうことです。
先ほどの最大化問題で出てきた内積部分が重くなってしまいます。
- ここで計算量を減らすために使える手法がカーネルトリックです。
従来の方法だと高次元へマッピングした後に、内積計算を行うという2段構成でした。
一方でカーネル法では内積に対応するカーネル関数という量を定義して、計算に突っ込むだけの1ステップになります。
これで最大化問題が右側のように置き換わりました。
- カーネル関数の例を1つ紹介します。多項式カーネルでは1+aドットbのd乗をaとbの関数として与えます。
例えばd=2としてカーネルを計算すると、これは6次元の特徴量マッピングに対応することが分かります。
もちろん実際の計算ではマッピングを行うわけでなく内積の結果のみ利用しています。
- ここまでで古典SVMの概要を説明しました。
まとめると、次の3点が理解の上で重要になります。
SVMは境界を引いて分類問題を解く手法です。
また、汎化性能の向上を目指してマージンMを最大化していきます。
そして、カーネルトリックを使うことで、特徴量マッピングをすることなくカーネル関数への代入結果を使うだけで最大化問題を設定できます。
- ではここから量子SVMの説明に入っていきます。
まずはノイズのない理想版の量子SVMと、ノイズのあるNISQ版の量子SVMについての違いを簡単に説明します。
- ノイズフリーな量子コンピュータを想定した量子SVMの理論は2013年頃から提案され古典SVMに比べて計算時間の削減が見込まれていました。
これは位相推定アルゴリズムを利用した逆行列計算が精度良く実行可能なこと前提としていました。
しかし位相推定アルゴリズムはエラーに弱いアルゴリズムであり、実装は現実的ではありませんでした。
その後、ノイズのある量子コンピュータ、通称NISQデバイスでの量子アルゴリズム実装が注目され始めました。
さらに機械学習ブームも伴い、2018年にはNISQ版の量子SVMが提案され、実際に実機で実装されました。
NISQデバイスでは一定の精度を保てる範囲の数の量子ゲートで実装する必要があります。
そこで、方針が計算の高速化から古典で再現が難しいカーネルの実装へと変わっていきました。
- ノイズフリー版とNISQ版の量子SVMの違いについてまとめました。
ノイズフリー版のQSVMでは位相推定を利用した逆行列計算を行なっていましたが、NISQ版では行なっていません。
その代わり、内積計算の方法に工夫が加わりました。ノイズフリー版ではSWAPテストと呼ばれる方法を用いて内積計算をしていましたが、これは3量子ゲートを使って実装するので、量子ゲート演算としては高コストです。
一方でNISQ版のアルゴリズムでは改良アルゴリズムが採用され、少数の2量子ゲートを利用することで内積計算が可能になりました。
またノイズフリー版では計算の高速化に焦点を置いていますが、NISQ版では特徴量マッピングの高度化に焦点が置かれています。
ノイズフリー版では古典と同様のカーネルを使うことが想定されており、カーネル生成において量子特有の工夫がされているわけではありません。
NISQ版では量子カーネルを作成し、量子特有の特徴量マッピングについて議論を展開しております。
- ではNISQ版の量子SVMについて詳しく説明していきます。
まずSVMの実行フローについて確認していきます。
まず訓練データを準備し、次にカーネル行列を計算します。
その後マージンMを最大化するパラメータを決定し、分類の境界面を決定します。
そして作られた境界面をもとに新たなデータを分類していきます。
量子SVMはこのうちのカーネル行列を量子版のカーネル行列に置き換えたものです。
古典版のカーネルでは先ほど話した多項式カーネルやガウスカーネルなどがあります。
一方で量子版では次のような量子状態の内積の2乗でカーネルを定義します。
この量子カーネルが古典では再現が難しいとされており、かつNISQデバイスでも動作するようなゲートすうで構築されています。
- 量子カーネルに対応する特徴量マッピングを考えてみます。
それは特徴量空間のデータ点x_i を量子状態|φ>にマッピングします。
特徴量が1次元の場合で考えてみましょう。
この時特徴量マッピングによってx_iは位相Aの|0>状態プラス位相Bの|1>状態という量子状態に変換されます。
1次元では量子状態はブロッホ級の面上に表現可能です。
例えばこの図ではwを地軸として赤道を境界面とします。
この時、北半球に存在する量子状態が赤色で示され、+1と分類されています。
一方で、南半球に存在する量子状態が青色で示され、-1と分類されています。
- 量子SVMでの状態のマッピングはGroverとの状態マッピングとは大きく異なることに注意してください。
まず、Groverのアルゴリズムでは検索インデックス0,1,2,3が量子状態|00>、|01>,|10>,|11>にマッピングされていました。
これは不連続な値を量子状態にエンコードする方法です。
これに対して、量子SVMのマッピングは、連続な状態を量子状態の位相にエンコードする方法です。
2次元の特徴量だった場合、それぞれの基底状態の係数は特徴量α_i とβ_i で決まる位相A, B ,C, Dで定まります。
- では位相に特徴量をエンコードするにはどうしたらいいでしょうか?
その部分が量子SVMの実装論文の核心です。
そして次の形で定義される回路でのマッピングだと古典で再現が難しいものになると提案しています。
回路図のようにアダマールゲートで全ての状態の重ね合わせを作り、Uφという行列を作用させるものを1レイヤーとします。
それをd回繰り返します。このdを回路のdepthと定義しています。
このUφは次のように定義されています。
ここで1行目のφ_SのSはエンタングルさせるビットの組み合わせで、特徴量の中から1成分を取り出す組み合わせだったり、2成分を取り出す組み合わせだったりします。
2行目のφ_iはパウリ行列P_iの係数です。
このSとφ_iとP_iの決めかたがマッピングの自由度になります。
ここまでのの説明だとまだイメージが湧きにくいと思うのでいくつか特徴量マッピングの例をみていきます。
- 一番簡単な例だと、Z-FeatureMapというマッピングがあります。
ここではエンタングルする組み合わせはなく、1量子ビットのみで構築されます。
2行目のφ_ijやφ_ijkは全て0になるように設定しています。
そして係数φ_Sはx_iとしています。パウリ行列P_kは全てZゲートに設定しています。
一番下にQIskitでこの回路を表示したものを載せています。
この例では繰り返しの数を2としています。
赤で囲った部分がexpのiサムx_i Z_iです。ここがU_φの行列に対応します。
シンプルで理解はしやすいのですが、残念ながらこの特徴量マッピングでは量子の優位性はなく、古典でも簡単に再現できてしまうことがわかっています。
- では次にZZ-FeatureMapという特徴量マッピングをみていきます。
回路の繰り返し数が2で、このZZーFeatureMapを使ったものが実装論文での設定です。
この特徴量マッピングでは古典での再現が難しくなることを論文の著者が主張しています。
この設定ではφ_Sはもう少し複雑になり、Sがiの時、係数φ_iはx_iとなり、Sが特徴量のうち2つを取り出す組み合わせの場合、
φ_ijは(π-x_i) かける(πーx_j)となります。
パウリ行列はz行列だけを使う点は前のページと同様ですが、Z_ijの場合は下の赤色で囲った部分がexp(iϕ_12 Z_12 ) に対応します。
- この論文で使われているZZ-FeatureMapですが、先ほどのイラストからも分かるように、
必要なゲートはアダマールゲートH、CNOTゲート、e^iθZゲートです。
e^iθZゲートはU1ゲートかRzゲートで実装することができます。
特徴量が2次元の場合、次のような形でUφを実装できます。
これで特徴量マッピングxから量子状態|φ(x)>へのマッピングの実装方法がわかりました。
- また、特徴量マッピングの自由度をさらに上げることもできます。
それはPauli-FeatureMapで実現することができます。
先ほどまでは、パウリゲートのうち、Zゲートしか利用していませんでしたが、XゲートやYゲートも利用することができます。
下の図の例では、1量子ゲートではZ回転ゲートとX回転ゲートを使い、2量子ゲートでYZゲートの回転を使っています。
Xの回転ゲートとY_1Z_2の回転ゲートの具体的なゲート実装方法は下の図の赤枠で囲まれた部分です。
- ここまでで、特徴量を量子状態にマッピングする方法を学びました。
量子SVM実装論文ではZZーFeatureMapが採用されています。
次にカーネル関数を計算するために必要な内積の計算方法を説明していきます。
- 今、私たちは量子状態|φ(x)>を準備することができます。
量子カーネルは量子状態|φ(x_i)>と|φ(x_k)>のブラケット内積の2乗で定義されます。
この計算方法を理解するために、初期状態|00>にユニタリ行列Aをかけた状態|ψ>の観測を考えます。
|ψ>は基底状態|00>から|11>までの状態に位相a,b,c,dを加えて重ね合わせたものになります。
それぞれの基底状態が観測で得られる確率は、それぞれ、|a|^2, ..|d|^2となります。
これは量子力学の観測のルールです。
基底状態はそれぞれ直行するので、行列Aを状態|00>で挟んでやると|a|^2が得られます。
これを観測して得られるヒストグラムに対応させると右の図のようになります。
00のバーが行列Aを状態|00>で挟んだもので観測確率は|a|^2となります、
同様に01のバーが行列Aを状態|00>と|01>で挟んだもので観測確率は|b|^2となります。
- このルールを使って状態|φ(x_i)>と|φ(x_k)>の内積を考えてみます。
この内積は、行列Uφ(x_i)ダガーUφ(x_k)を初期状態|0>で挟んだものの2乗になります。
ここでのUは先ほどのHUφを繰り返したものを指します。
特徴量が2次元の場合、次のような回路が対応します。
この回路をラージR回測定して、スモールr回出現した時、カーネルKはラージR分のラージrとなります。右図で言うと、赤枠の00のバーがカーネルに対応しています。
- ではこのカーネル計算の計算オーダーについてみていきます。
まず、訓練データ数Nに対して、十分な精度を得るためにはN^2オーダーの回数の観測が必要になります。
そして、カーネル行列を得るためには訓練データ点の全ペアN^2オーダーの回数量子回路の構築・実行が必要になります。
すなわち、全体での計算コストはN^4となります。
例として、データ数N=5の場合を見てみます。
一つのマスが訓練データ点の1ペアを表します。
この一つのマスを計算するために下の図のような回路を構築し実行する必要があります。 その各実行に対してN^2オーダーの観測を行う必要があります。
また、このテーブルのうち、薄い赤色の部分を計算しなければなりません。
これは、対角成分は常に1で、右上の成分は左下の成分と同じになるからです。
赤色のマスの数は一般にはN*(N-1)/2で求まりN^2のオーダーになります。
- では最後のパートでPythonで量子SVMを回したみたものを紹介します。
- 今回はGoogle Colabを使って実行しているのですが、途中でメモリがリセットされるので、うまくいかない場合はご容赦ください。
Pythonで実行したことはこちらの記事に詳細があります。実際に回してみたい方は私が書いたQiitaの記事を参照してみてください。
- こちらがBreat_Cancerのデータで古典SVMと量子SVMを比較したものです。
まず、見方として、赤と青色のところが訓練データとテストデータです。
そのうち●が訓練データで、■がテストデータです。白色のバツがついているところは、間違った分類をしてしまっている部分です。
オレンジと水色の部分が予測データで、x方向に50、y方向に50と合計2500点でマス目状に用意しました。
赤と同じ分類をされたところをオレンジで、青と同じ分類をされたところが水色になっています。
このオレンジと水色の部分の集まりの境界を見ることでSVMの分類の境界を可視化することができます。
結果としては古典SVMの方が性能が良くなっていることが分かります。
また、Mac PCを使って計算したのですが、2500点の予測の計算に、古典では0.2秒ほどなのに対して、量子SVMでは90分ほどかかります。
また、分類の境界もかなり複雑なものになってしまいました。