D-Wave 2000Qの実用化:量子コンピューティングの急な学習曲線

タスクの概念を再考するのは難しいですが、結果には価値があります。







著者 :古典的な場合と量子的な場合の両方でブラッグ伝達を誤って計算したことは知っています。 ただし、古典的なコンピューターと量子コンピューターのプログラミングの違いを理解するには、真実に十分に近いものです。



時間:2018年のどこか。 場所:Slakaの腐ったチャンネル。



「Pythonを知っていますか?」



Ars Technicaの科学ディレクターであるJohn Timmerの質問は、ときどき驚きます。 Slakaに注意して文字を浸すことができた場合、「はい」と答えると単純に滲み出します。



D-Waveは、APIを介して世界の量子オプティマイザーへのアクセスを許可することにしました。 Arsは彼に試してみるように勧めましたが、あなたはPythonを知る必要がありました。 準備ができていました。



私は、D-Waveがプログラマーを泣かせる独自のコードを取得し、それを量子最適化された行に変えることができる、ある種の素晴らしいAPIをリリースすると想定しました。 残念ながら、量子オプティマイザに到達したとき、そうではないことが判明しました。 私はすぐにドキュメントに没頭し、何をする必要があるのか​​を理解しようとしました。



D-Wave広報の代表者は、既成の例を実行するのに十分な知識がある人を念頭に置いていたと思います。 しかし、私は頑固です。 テストしたい3つまたは4つの可能なタスクを考え出す必要がありました。 知りたかったのですが、D-Waveコンピューターでこれらの問題を解決するプロセスをマスターできますか? 古典的なプログラミングから量子アニーリングの操作への概念の飛躍はどれくらい簡単ですか? 少なくとも私のタスクのいくつかはこのマシンに適合しますか?



すぐに驚くべき結論を明らかにし、答えは次のようになったと言います。多分それはまったく「マスタリング」ではありません。 難しい; すべてのタスクではありません。



プログラミングのタスクの選択



あなたが私を想像する方法にもかかわらず、私は練習プログラマーと呼ばれることができます。 基本的に、プログラミングの知識を持っている人ならだれでも、私のPythonコードを見たときにしかめっ面をするでしょう(そしておそらく殺人を犯すでしょう)。



ただし、プログラムを作成してそれらを解決する必要があるタスクを思い付くことができます。 たとえば、電極セットの電界を計算するものが必要です。 ヘリウム原子エネルギーが最小の状態を見つけるもの。 または、レーザーの開始時の光強度の増加をカウントするもの。 これらのタスクは私に最も興味があります。 そして、このプロジェクトを始めたとき、D-Waveアーキテクチャがこれらの問題を解決できるかどうかは知りませんでした。



私の意見では、2つの問題を選択しました。マンデルブロ集合のメンバーを見つけることと、電極の集合の潜在的な輪郭を計算することです。 これらの問題の利点は、古典的なコードを使用して迅速に解決し、回答を比較できることでした。 しかし、D-Waveのマシンでこれらの問題を解決する方法を見つけようとして、すぐに問題に遭遇しました。 タスクの理解に大きな変化が必要であり、私の考えは非常に簡単です。



たとえば、私が遭遇した問題の1つは、低レベルの2進数を処理していることです(ビットではなくキュービットの形式で表現されるという事実にもかかわらず)。 つまり、実際には、プログラムには型がありません。 私のプログラミング経験のほとんどは、浮動小数点数値型を使用して物理的な問題を解決することです。



問題について異なる考え方をしなければなりません:答えは2進数(理想的にはtrueまたはfalse)として表現されるべきであり、すべての物理(例えば、すべての浮動小数点数)はキュービットの組み合わせによって表現されるべきです。 私の人生がそれに依存していても、私は自分のタスクのいずれかでこれを行う方法を理解できませんでした。 教育に没頭して、私はこの問題を自分のジュースで少し沸騰させることができました。



半年後、私はついに私がよく知っていて、D-Waveコンピューターで解決できる問題に出くわしました。 ファイバーブラッググレーティングを通る光の通過は、バイナリー問題として表現できます:光子がフィルターから出たのか、出なかったのか? すべての物理はキュービット化合物に含まれており、答えは解のエネルギーから抽出されます。



ブラッグ格子



1次元ブラッグ格子は多層材料です。 2つのレイヤー間の各ギャップは、少量の光を反射します。 構造全体の合計貫通は、ギャップ間の距離によって決まります。 光が通過するには、異なる間隔からの波が同相で加算される必要があります。 50層で反射率が0.1%の理想的なブラッグ格子の通過スペクトルを以下に示します。







次のコードは、このグラフのデータを生成します。



ld = np.linspace(ld_center-3e-9, ld_center+3e-9, num_ld) k = 2*np.pi/ld T = np.ones(ld.shape) for j in range(num_layers): T = T*(1-A)*np.cos(j*k*layer_sep)**2
      
      





ここでは、次のギャップに到達する光パワーで表される各ギャップの相対的な寄与を明示的に計算します。 建設的な干渉と破壊的な干渉は、レイヤー間の距離が波長の半分と一致する度合いに応じて、ギャップの寄与を減少または増加させることで考慮されます。



量子ビットの接続は実数でのみ表現され、複素数では表現されないため、このハックが必要です(物理学は、光の振幅と位相を含む複素数で表現するのが最適です)。 それにもかかわらず、古典的なコードの出力はほぼ正しいように見えます-側方周波数帯域の欠如は少し心配します。これはモデルの不完全性を示しますが、今のところ問題ではありません。



従来のモデルコードには一貫性チェックがありません。 結果を計算し、波がどのように伝播するかを正確に提案しました。 この仮定が間違っていたとしても、計算結果は同じになります-すべての方程式は物理学に基づいていますが、正しく記述されていることをコードで保証することは不可能です。



量子に渡す



D-Waveシステムでは、それぞれがギャップ内の光強度を表すキュービットのチェーンを作成する必要があります。 各キュービットはその近隣に関連付けられており、接続の重みは、インターフェイス間の距離を考慮して、あるギャップから別のギャップへの通過を表します。 インターフェース間の距離が波長の半分に等しい場合、光は2つのインターフェース間で共振して通過する可能性があります。 距離が波長の4分の1である場合、破壊的な干渉がトリガーされ、接続は最小限に抑えられます。



1つのギャップを通過すると99.9%で示されるため、ゼロと最初のキュービット間の接続は







P0,1=0,999cos22 pid/ lambda









最初と2番目の間に:







P1,2=P0,10,999cos24 pid/ lambda









2番目と3番目の間:







P2,3=P1,2P0,10,999cos26 pid/ lambda









この式で、dは層間の物理的距離、λは波長です。 d /λ= 0.5の場合、余弦は1に等しくなり、光の理想的な透過が期待できます。



D-Waveシステムでは、これは、2つの隣接するキュービットを次のように接続する必要があることを意味します。







Pij=[0,999cos22i pid/ lambda]i









この式では、次数uは以前のキュービットの影響を考慮し、接続スキームを単純化します。



タスク実装



ここで、キュービットを接続する方法がわかったので、このタスクを完了する方法を決定するために、キュービットの物理的な接続を調べる必要があります。 これは、マイナー埋め込みと呼ばれます。



コンピューターに、重み付きキュービット間の接続のリストを提供する必要があります。 各キュービットの重要性を示す偏差も指定する必要があります。 私たちの場合、すべてのキュービットは等しく重要であるため、すべてのキュービットに対して-1に設定されます(この数値は標準的な例から取りました)。 偏差と関係は、物理キュービットとそれらの間の関係に関連付ける必要があります。 大規模なタスクの場合、そのようなマッピングの検索には時間がかかる場合があります。



関係と偏差を生成するためのコードは非常に簡単です。



  #qubit labels (q[j], q[j])       linear.update({(q[j], q[j]): -1}) #   #     if jk == -1: quad.update({(q[j], q[k]): (J_vals[j])**k}) #    else: quad.update({(q[j], q[k]): 0})
      
      





幸いなことに、D-Wave APIは独自の小さな実装を見つけようとします。 50層のフィルターで機能することがわかりましたが、100層には対応できませんでした。 2,000キュービットとチェーン長1を持っているため(1つの論理キュービットを作成するために複数の物理キュービットを結合する必要はありません)、システムはさらに大きな問題を実装できるはずです。 振り返ってみると、失敗の原因は、私があまりにも多くのゼロリンクを要求したためだと思います。



別の方法は、単にヌル結合を明示的に定義しないことです。 これにより、アルゴリズムはキュービットに接続のない実装オプションを自由に見つけることができます。 私はこれを試していませんが、このオプションは私にとって次の論理的なステップのようです。



いずれにしても、D-Waveマシンの起動は非常に簡単です。



 response = EmbeddingComposite(DWaveSampler()).sample_qubo(Q_auto, num_reads=num_runs)
      
      





口癖を話すことを学ぶ



私の古典的なアルゴリズムとD-Waveソリューションの違いは、D-Waveコンピューターが明確な結果を直接返さないことです。 多くの部分に分かれています。 エネルギーのリストを取得しますが、最小のものが解決策です。 各エネルギーの数回の実行(1000回など)について、回答に出現した回数を取得します。 そして、実行ごとに「応答」、つまり量子ビットの値を取得します。 これらの値のどれがフィルターを通過すると解釈できる(そして解釈できる)かはすぐにはわかりませんでした。



結局、この値は何らかの意味でフィルターに保存されているエネルギーの量を表すため、最小の解エネルギーが最良の答えであると判断しました。 したがって、以下に示すように、エネルギーが高いソリューションは、フィルターの透過性が大きくなります。 この答えを本当の光の道に変えることは、これを理解している人々の宿題として残されています。







また、最低エネルギーのソリューションでキュービットの値を調べることにより、プロセスの物理的表現を取得することもできます。 以下に、透過曲線(500 nm)、50%透過(500.6 nm)、5%透過(501.4 nm)のピークに対応するソリューションのビット値を示します。







伝送ピークのエッジで、キュービットはユニットのグループに蓄積する傾向があります。 ピークでは、キュービットは0と1の間で交互になります。この最後の解は、ブラッグ格子の光強度がどのように変化するかのバイナリ画像です。 言い換えれば、D-Waveソリューションは物理学も直接提示しますが、これは私の古典的なコードについては言えません。



これが量子アニーリングの真の強さです。 はい、フィルターを通過する曲線と古典的な計算から完璧に曲線を導き出すことができます。 しかし、実際に内部で何が起こっているのかを把握するには、より複雑なコードが必要です。 また、量子アニーリングでは、これは完全に無料です。 私の意見では、これは非常にクールです。



量子アニーリングのもう1つの利点は、量子ビット結合の重みを選択するフレームワーク内で一貫したソリューションを保証することです。 つまり、量子コンピューターの解は、古典的なコードから得られる解よりも信頼性が高い可能性が高いということです。



量子プログラミングに関する議論



D-Waveマシンのプログラミングで最も難しい部分は、タスクについて異なる考え方をする必要があることです。 たとえば、曲線がデータと一致する場合、問題を最小化することに慣れました。 しかし、問題を解決するためのコードの記述を開始できるように、物理的な問題についての考え方を変えることは非常に難しいことがわかりました。 会社から与えられた例のほとんどが抽象的で、私にとって物理的な問題に適応できないように見えることは助けにはなりません。 しかし、より多くのユーザーがコードの公開を開始すると、この状況は変わります。



また、答えの解釈に困難が生じる場合があります。 基本的に、APIのシンプルさが気に入ったため、追加のアイデアを無料で入手できるのは素晴らしいことです。 近い将来、D-Waveを使用して実際の問題を解決できるようになりました。



All Articles