用Qiskit計算聯合機率
這篇文章是這本書的一部分:動手使用Python進行量子機器學習。
> Image by author, Frank Zickert
大多數有關量子計算的教程,帖子和書籍都裝有數學。很多數學。當然,數學是基礎概念的重要方面。但是,當我說您不需要成為數學家來掌握量子計算時,就是我的意思。
在本文中,我們將從程式設計師的角度看待量子計算,並以實用的方式使用量子位。我們撇開所有理論和數學。好的,我們仍然需要一些數學來計算機率。就是這樣。
唯一要了解的是不同型別的機率。
· 邊際機率是事件的絕對機率
· 聯合機率是兩個事件同時發生的機率
· 條件機率是在已知另一事件發生的情況下一個事件的機率
在這篇文章中,我們使用量子電路計算聯合機率。
啟動Jupyter Notebook,然後匯入Qiskit。如果您尚未設定計算機,請參閱以下教程,瞭解如何設定JupyterLab用於量子計算。
在本文中,我們將建立並執行很多電路。因此,這是一個幫助程式函式,該函式將獲取已配置的QuantumCircuit例項,然後執行它並返回直方圖。
我們指定直方圖(第13行)的相當寬的圖形大小(figsize =(18,4)),以便在其中留出一些空間來顯示所有不同的狀態。此外,雖然我們使用預設的statevector_simulator(第5行),但我們還允許指定另一個模擬器作為我們的後端(第7行)。我們還將鏡頭數量(模擬器應該執行電路多少次才能獲得精確的結果)作為引數(第5行)。
在開始計算機率之前,讓我們看一下Qiskit為我們建立的直方圖的結構。在下面的示例中,我們建立具有四個量子位的QuantumCircuit(第1行)。在執行電路(第3行)之前,我們將Hadamard門應用到每個量子位(透過提供量子位位置的列表)(第2行)。
下圖描述了生成的直方圖
> Image by author, Frank Zickert
直方圖中的每一列代表一個狀態。狀態是量子位值的組合。在我們的例子中,一個狀態由四個量子位組成。我們可以用0或1來測量每個量子位元。條形圖和條形圖上方的數字表示此狀態的測量機率。
在我們的例子中,有16個狀態,它們的機率分別為0.062和1/16。
條形下方的數字表示給定狀態下四個qubit的值。從頂部(位置0的位)到底部(位置3的位)讀取它們。如果順時針旋轉數字以更好地讀取它們,則需要從右側(qubit 0)到左側(qubit 3)讀取它們。
此外,狀態是有序的。好像四個量子位組成一個二進位制數字一樣,量子位0是右側的低位,而量子位3是左側的高位。結果,所有將量子位元3度量為1的狀態都位於直方圖的右半部分。因此,如果您希望狀態彼此相鄰,請確保它們對於最高qubit的值相同。
為了提高可讀性,我們考慮一個帶有單個Hadamard門的電路。
> Image by author, Frank Zickert
Qiskit初始化狀態為|0⟩的量子位(將其測量為0的機會為1.0)。當我們在這種狀態下將Hadamard門應用於一個量子位時,它將1.0的總機率削減為兩個相等的一半。我們得到兩個狀態的量子位元0值不同。每個狀態的機率為0.5。如果二進位制值0001大於0000,則狀態0001位於右側。
代表邊際機率我們首先讓一個量子位代表一個事件的邊際機率。邊際機率是事件的絕對機率,與任何其他資訊無關。如果事件發生的多個狀態,則邊際機率是所有相應機率的總和。
在具有一個Hadamard門的圖中,只有一種狀態,其中qubit 0為1。邊際機率為0.5。在具有四個Hadamard門的圖中,存在8個量子位0為1的狀態。量子位0的邊際機率為1是所有這些狀態的機率之和。也是0.5。
哈達瑪門將整體機率分成相等的一半。但是事件的機率可以是0.0到1.0之間的任何值。
在本文中,我們介紹了RY門。它需要一個可以用來指定確切機率的引數。由於RY門將角度θ作為其引數而不是機率,因此我們需要先將機率轉換為角度,然後再將其傳遞給門。這就是prob_to_angle函式為我們所做的。
現在,我們可以建立和執行一個具有介於0和1之間的任意邊際機率的電路。讓我們以0.4的測量值1開始。
我們在量子位上應用RY門,並以機率值為0.4(第2行)傳遞呼叫prob_to_angle的結果作為第一個引數。
> Image by author, Frank Zickert
與Hadamard門相似,RY門將機率分為兩部分。但這為我們提供了控制兩個部分大小的工具。
計算聯合機率在下一步中,我們要應用修飾符。在第一種情況下,修飾符的值介於0.0到1.0之間。就像另一種可能性。然後,所得後驗機率等於這兩個機率的聯合機率。
下圖描述了兩個變數的聯合機率。
> Image by author, Frank Zickert
在數學上,我們可以透過將兩個邊際機率相乘來計算聯合機率。假設修改器為0.8。我們預計機率為0.4 * 0.8 = 0.32。
讓我們用Qiskit嘗試一下。
> Image by author, Frank Zickert
顯然,這行不通。我們甚至還沒有達到目標機率。相反,我們得到了0.952的機率。
問題在於prob_to_angle-function內部的角度θ的計算。我們將角度計算為目標機率平方根的反正弦值。讓我們仔細看看這個功能。下圖描繪了f(x)= arcsin(sqrt(x))的形狀
> Image by author, Frank Zickert
首先要注意的是,函式是在0到1之間的間隔中定義的。對於負值,未定義平方根。對於大於1的值,未定義反正弦。
要注意的第二件事是函式的曲線。prob_to_angle-function假定量子位處於基本狀態|0⟩。θ-我們計算的角度-是向量|ψ⟩-是目標狀態-和基本狀態向量|0⟩-我們是從其開始的狀態之間的夾角。如果從另一個狀態開始,則需要將該狀態合併到θ的計算中。我們需要從曲線上的相應點開始。如果您在曲線的最開始處計算步長(存在高梯度),並且在曲線的中間計算步長,則會有所不同。如果您想進一步瞭解qubit狀態的圖形表示,請看一下這篇文章。
但是,如果我們將曲線上的當前點(代表一個事件)納入計算,我們將在量子電路之外對聯合機率進行整個計算。這不是我們的目標。
讓我們再試一次。如果prob_to_angle-function假定量子位處於基本狀態|0⟩,為什麼不對新的量子位應用修飾符?區別在於第11行,在第11行中,我們在qubit 1而不是qubit 0上應用了圍繞修飾符的旋轉。
> Image by author, Frank Zickert
我們看到狀態0011(量子位0為1,量子位1為1)表示正確的機率為0.32。基本原理很簡單。
量子位0為1的所有狀態(0001和0011)加起來0.4-事件A的邊際機率。量子位1為1(0010和0011)的狀態加起來0.8-事件B的邊際機率。由於兩個旋轉彼此獨立,因此狀態0011表示兩個機率的重疊,其中0.4 * 0.8 = 0.32。
為了完成,其他狀態的機率為:
· 狀態0000:(1.0-0.4)(1.0-0.8)= 0.6 0.2 = 0.12
· 狀態0001:0.4 (1.0–0.8)= 0.4 0.2 = 0.08
· 狀態0010:(1.0–0.4)* 0.8 = 0.6 * 0.8 = 0.48
為了獲得聯合機率,我們需要測量兩個量子位元並計算兩個量子位元均為1的部分。
我們只關注一種可能性。如果只用一個量子位元代表它,那會很好嗎?
這是糾纏派上用場的地方。您還記得CNOT門嗎?這是一個兩位元的門。第一個量子位是控制量子位。如果為1,則門將在第二個量子位上應用X門(NOT門)。如果控制量子位為0,則第二個量子位保持不變。
首先看一下程式碼。
> Image by author, Frank Zickert
結果顯示,將量子位1測量為1的機率為0.32。我們只需測量單個量子位即可獲得我們正在尋找的聯合機率。
但是它是如何工作的呢?
和以前一樣,我們應用事件A的邊際機率(第8行)。接下來,我們應用事件B的邊際機率的一半。下圖描述瞭如果我們在此處停止的狀態。
> Image by author, Frank Zickert
由此產生的機率相當混亂。但是我們可以看到,我們將量子位0為0的狀態分為兩部分:狀態0000和0010。對於量子位0為1的狀態,我們做了相同的處理。
接下來,我們應用CNOT門(第14行)。讓我們看看它的作用。
> Image by author, Frank Zickert
CNOT門不會更改機率值。但是它會切換具有這些機率的狀態。
狀態0000和0010保持其機率,因為如果控制量子位(此處為量子位0)為0,則CNOT門不執行任何操作。相比之下,狀態0001和0011切換其機率。就像我們說的那樣。如果控制量子位為1,則CNOT門的作用類似於受控量子位(此處為量子位1)上的X門。
本質上,我們所做的就是說P(A)和P(B)/ 2重疊的狀態應與P(A)與1-P(B)/ 2重疊的狀態切換其機率。
現在,我們應用修飾符的後半部分,但帶有減號(第17行)。這就是效果。
> Image by author, Frank Zickert
出現聯合機率的正確值。由於我們應用了P(B)的負半數,因此當qubit 0為0時,我們消除了對RY門第一次應用所做的機率分裂。0010的狀態消失。現在它又是狀態0000的一部分。
對於量子位0為1的狀態,我們將P(B)的一半從狀態0011移回狀態0001。但是請記住,這兩個狀態之前已切換了其機率。這意味著,我們不會新增第一個RYRY門的效果,而是添加了修飾符的後半部分。
在最後一步,我們再次應用CNOT門。對於控制qubit 0為0,這使狀態0000保持不變。但是當qubit 0為1時,它將切換qubit 1的值。因此,狀態0001和0011再次切換其機率。
結果,狀態0011具有0.32的結果聯合機率。由於此狀態是量子位1為1的唯一狀態,因此我們透過測量單個量子位來獲得聯合機率。
電路的這一部分也稱為受控RY門。實際上,Qiskit提供了一個開箱即用的功能。我們來看一下。它具有相同的效果。
> Image by author, Frank Zickert
結論總之,受控的RY門與CNOT門相似。但是,如果控制量子位為1,則在受控量子位上應用RY門,而不是X門。如果控制量子位為0,則什麼也不會發生。
從結果狀態的角度來看,受控RY門將控制量子位為1的狀態分為兩部分。但是,它保留了控制量子位為0的狀態。與將RY門應用於拆分所有狀態的新量子位相比,受控RY門對要使用的狀態提供了良好的控制。因此,僅在重要情況下才轉換受控量子位。
這篇文章是這本書的一部分:動手使用Python進行量子機器學習。