本文轉(zhuǎn)自:DeepHub IMBA
在傳統(tǒng)機(jī)器學(xué)習(xí)中數(shù)據(jù)編碼確實(shí)相對直觀:獨(dú)熱編碼處理類別變量,標(biāo)準(zhǔn)化調(diào)整數(shù)值范圍,然后直接輸入模型訓(xùn)練。整個(gè)過程更像是數(shù)據(jù)清洗,而非核心算法組件。
量子機(jī)器學(xué)習(xí)的編碼完全是另一回事。
傳統(tǒng)算法可以直接消化特征向量[0.7, 1.2, -0.3],但量子電路運(yùn)行在概率幅和量子態(tài)的數(shù)學(xué)空間里。你的每個(gè)編碼決策——是用角度旋轉(zhuǎn)、振幅映射還是基態(tài)表示——都在重新定義信息在量子系統(tǒng)中的存在形式。這不是簡單的格式轉(zhuǎn)換,而是從根本上塑造了量子算法能夠"看到"和處理的數(shù)據(jù)結(jié)構(gòu)。
在量子機(jī)器學(xué)習(xí)中,編碼不是預(yù)處理,而是算法設(shè)計(jì)的核心。

本文我們會(huì)詳細(xì)講解量子數(shù)據(jù)編碼的三種主要方法,分析它們與傳統(tǒng)方法的區(qū)別,以及為什么選對編碼方式會(huì)決定你的量子模型成敗。
量子編碼的底層邏輯
量子電路處理數(shù)據(jù)的方式和傳統(tǒng)算法截然不同,即使是在普通電腦上模擬運(yùn)行也是如此。你沒法直接把數(shù)值列表或者歸一化向量塞給量子電路。數(shù)據(jù)必須先編碼成量子態(tài)——這些數(shù)學(xué)對象可以模擬疊加和糾纏行為。這個(gè)編碼過程就是連接經(jīng)典數(shù)據(jù)集和量子計(jì)算環(huán)境的橋梁,讓我們能在本地機(jī)器上做量子機(jī)器學(xué)習(xí)實(shí)驗(yàn)。
量子電路運(yùn)行在一個(gè)完全不同的計(jì)算空間里。它們操作的是量子態(tài),這些數(shù)學(xué)對象存在于疊加狀態(tài)中,可以在多個(gè)量子比特之間形成糾纏,測量時(shí)會(huì)發(fā)生坍縮。量子電路處理不了2.3這樣的普通數(shù)字,因?yàn)榱孔娱T操作的是概率幅和相位關(guān)系,不是經(jīng)典的標(biāo)量。

編碼方法的選擇從根本上決定了量子模型能學(xué)到什么。基礎(chǔ)編碼把數(shù)據(jù)直接映射成二進(jìn)制量子態(tài),實(shí)現(xiàn)簡單但表達(dá)能力有限。振幅編碼把整個(gè)數(shù)據(jù)集壓縮進(jìn)量子態(tài)的振幅里,效率很高但需要復(fù)雜的歸一化處理。角度編碼用量子門根據(jù)數(shù)據(jù)值旋轉(zhuǎn)量子比特,在簡單性和功能性之間找到了平衡點(diǎn)。
這個(gè)選擇不只影響準(zhǔn)確率,還決定了電路深度、量子比特需求,以及模型能利用哪些量子現(xiàn)象。選錯(cuò)了編碼方式,即使是理論上有優(yōu)勢的量子算法也可能跑不過經(jīng)典基線。
角度編碼:最直觀的映射方式
角度編碼是把經(jīng)典特征轉(zhuǎn)換為量子態(tài)最直接的方法。每個(gè)特征值變成一個(gè)旋轉(zhuǎn)角度,作用在對應(yīng)的量子比特上。通常用RY門(繞Y軸旋轉(zhuǎn)),因?yàn)樗茏屃孔颖忍卦贐loch球面的Y軸上旋轉(zhuǎn)。
對于特征向量x = [x?, x?, …, x?],角度編碼的操作是:第一個(gè)量子比特RY(x?)|0? → cos(x?/2)|0? + sin(x?/2)|1?,第二個(gè)量子比特RY(x?)|0? → cos(x?/2)|0? + sin(x?/2)|1?,以此類推。
旋轉(zhuǎn)角度直接控制量子比特在Bloch球面上的位置。角度0保持量子比特在|0?狀態(tài),π/2創(chuàng)建等權(quán)疊加(|0? + |1?)/√2,π翻轉(zhuǎn)到|1?狀態(tài)。這種幾何解釋讓角度編碼很好理解——每個(gè)特征實(shí)際上在旋轉(zhuǎn)對應(yīng)的量子比特,把信息編碼在量子態(tài)的幾何結(jié)構(gòu)里。
用Qiskit實(shí)現(xiàn)角度編碼很簡單。每個(gè)特征通過一個(gè)RY門處理,作用在獨(dú)立的量子比特上:
from qiskit import QuantumCircuit
import numpy as np
class AngleEncoder:
def __init__(self, num_features):
self.num_features = num_features
def encode(self, features):
"""Encode a single feature vector into a quantum circuit."""
qc = QuantumCircuit(self.num_features)
for i, x in enumerate(features):
qc.ry(x, i)
return qc
處理批量樣本只需要遍歷數(shù)據(jù)集:
def batch_encode(encoder, data):
circuits = []
for features in data:
circuits.append(encoder.encode(features))
return circuits
想看編碼后的量子態(tài),Qiskit提供了可視化工具:
from qiskit.visualization import plot_bloch_multivector
from qiskit.quantum_info import Statevector
features = [np.pi/4, np.pi/2]
qc = AngleEncoder(len(features)).encode(features)
state = Statevector.from_instruction(qc)
plot_bloch_multivector(state)
這會(huì)在Bloch球面上畫出每個(gè)量子比特的狀態(tài),讓你直觀看到數(shù)據(jù)是怎么嵌入的。

角度編碼的優(yōu)勢很明顯:特征到量子比特的映射很直接,適用于任何連續(xù)數(shù)據(jù)。但限制也不少,每個(gè)量子比特只能編碼一個(gè)特征作為單個(gè)角度,表達(dá)能力有限。每個(gè)特征只影響一個(gè)量子比特,所以多特征之間的交互沒法自然表示出來,也抓不到特征間的相關(guān)性。擴(kuò)展到高維數(shù)據(jù)時(shí)需要很多量子比特這在實(shí)際應(yīng)用中是個(gè)大問題。
振幅編碼:量子優(yōu)勢的體現(xiàn)
振幅編碼真正展現(xiàn)了量子計(jì)算的指數(shù)優(yōu)勢。它不是給每個(gè)特征分配一個(gè)量子比特,而是把整個(gè)特征向量壓縮到量子態(tài)的振幅里。
比如特征向量x = [x?, x?, x?, x?],振幅編碼會(huì)創(chuàng)建量子態(tài)|ψ? = α?|00? + α?|01? + α?|10? + α?|11?,每個(gè)α?對應(yīng)一個(gè)歸一化的特征值。這里的關(guān)鍵是指數(shù)信息密度:n個(gè)特征只需要log?(n)個(gè)量子比特。256個(gè)特征的向量只要8個(gè)量子比特就夠了,而角度編碼需要256個(gè)。
但這種壓縮有個(gè)硬性要求:Σ|α?|2 = 1,保證量子態(tài)的有效性。你的特征向量必須先歸一化為單位長度。與角度編碼直接映射不同,振幅編碼需要復(fù)雜的數(shù)學(xué)預(yù)處理,把經(jīng)典向量轉(zhuǎn)換成概率幅。
這種指數(shù)壓縮帶來了獨(dú)特的量子現(xiàn)象。特征不再獨(dú)立它們存在于疊加態(tài)中,測量任何量子比特都會(huì)影響整個(gè)系統(tǒng)狀態(tài)。這讓量子算法能處理傳統(tǒng)算法難以應(yīng)對的特征相關(guān)性和高維模式,但也讓編碼的實(shí)現(xiàn)和理解變得復(fù)雜得多。
振幅編碼面臨兩個(gè)角度編碼沒有的難題:歸一化復(fù)雜性和電路深度問題。
歸一化這步看起來簡單,實(shí)際上很要命。你的特征向量必須滿足Σ|α?|2 = 1,這直接影響模型對數(shù)據(jù)關(guān)系的解釋。用L2歸一化、先做min-max縮放再歸一化,或者基于概率的歸一化,對同一份經(jīng)典數(shù)據(jù)會(huì)產(chǎn)生完全不同的量子表示。
負(fù)特征值更麻煩。量子概率幅可以是復(fù)數(shù),但實(shí)現(xiàn)復(fù)振幅編碼需要額外的量子比特或者復(fù)雜的相位編碼。很多實(shí)際應(yīng)用把振幅限制為實(shí)數(shù),如果你的特征有重要的負(fù)值信息,就可能丟失關(guān)鍵信息。
電路深度是另一個(gè)坑。創(chuàng)建任意振幅狀態(tài)需要復(fù)雜的量子電路,不像角度編碼每個(gè)特征用一個(gè)RY門就完事。振幅編碼需要一串受控旋轉(zhuǎn)、受控NOT門,還要輔助量子比特。電路深度隨特征數(shù)量對數(shù)增長,實(shí)現(xiàn)起來相當(dāng)復(fù)雜。

用Qiskit的initialize方法可以直接在量子比特上設(shè)置振幅:
from qiskit import QuantumCircuit
class AmplitudeEncoder:
def __init__(self, num_qubits):
self.num_qubits = num_qubits
def encode(self, features):
"""Encode normalized feature vector into quantum circuit."""
qc = QuantumCircuit(self.num_qubits)
qc.initialize(features, qc.qubits)
return qc
處理任意長度的數(shù)據(jù)集,需要結(jié)合歸一化:
def encode_vector(vector):
vec = normalize(vector)
num_qubits = int(np.ceil(np.log2(len(vec))))
# Pad vector to length 2^num_qubits
pad_len = 2**num_qubits - len(vec)
padded = np.append(vec, [0]*pad_len)
return AmplitudeEncoder(num_qubits).encode(padded)
這樣就能處理任意長度的向量,編碼器會(huì)自動(dòng)填充到最近的2的冪次。
基礎(chǔ)編碼:簡單高效的離散表示
基礎(chǔ)編碼把分類數(shù)據(jù)直接映射到計(jì)算基礎(chǔ)狀態(tài)∣0?和∣1?。它不依賴疊加或干涉,而是用不同的正交狀態(tài)表示不同類別,測量時(shí)能完美區(qū)分。
這創(chuàng)建了經(jīng)典標(biāo)簽和二進(jìn)制量子態(tài)的一對一映射。2量子比特系統(tǒng)有四個(gè)基礎(chǔ)狀態(tài):∣00?,∣01?,∣10?,∣11?,可以表示四個(gè)類別。編碼就是把分類標(biāo)簽轉(zhuǎn)成二進(jìn)制,然后初始化量子比特匹配這個(gè)二進(jìn)制模式。類別"A"可能對應(yīng)∣00?,類別"B"對應(yīng)∣01?,測量時(shí)能100%確定地恢復(fù)原類別。
數(shù)學(xué)上很優(yōu)雅:n個(gè)類別只需要 [log?(n)] 個(gè)量子比特,對離散數(shù)據(jù)非常高效。
Qiskit實(shí)現(xiàn)基礎(chǔ)編碼很直接,把量子比特準(zhǔn)備到對應(yīng)的基礎(chǔ)狀態(tài):
class BasisEncoder:
def __init__(self, num_qubits):
self.num_qubits = num_qubits
def encode(self, binary_string):
"""Prepare qubits in basis state from a binary string."""
qc = QuantumCircuit(self.num_qubits)
for i, bit in enumerate(binary_string):
if bit == "1":
qc.x(i) # Apply X gate to flip |0? → |1?
return qc
多類問題可以把整數(shù)標(biāo)簽映射成二進(jìn)制字符串:
def int_to_basis(n, num_qubits):
return format(n, f"0{num_qubits}b")
encoder = BasisEncoder(3)
qc = encoder.encode(int_to_basis(5, 3)) # Encodes integer 5 as |101?
基礎(chǔ)編碼對分類變量很合適,但處理連續(xù)或高維數(shù)據(jù)就效率太低了。編碼大數(shù)據(jù)集會(huì)消耗太多量子比特,不實(shí)用。對數(shù)值特征,角度或振幅編碼是更好的選擇。
如何選擇編碼方式
選擇哪種編碼方式主要看你的具體需求。
如果你在學(xué)習(xí)量子機(jī)器學(xué)習(xí)基礎(chǔ),特征之間相對獨(dú)立,需要簡單易懂的電路,或者在NISQ設(shè)備上工作,角度編碼是最好的起點(diǎn)。
如果你有高維連續(xù)數(shù)據(jù),特征相關(guān)性很重要,能接受電路復(fù)雜度,想要最大化量子優(yōu)勢,振幅編碼更合適。
如果數(shù)據(jù)主要是分類或離散的,需要完美的可解釋性,要求最小電路深度,處理的是分類問題,基礎(chǔ)編碼是理想選擇。
量子數(shù)據(jù)編碼不只是預(yù)處理步驟,它從根本上定義了量子模型能學(xué)到什么、怎么學(xué)。選對編碼方式,你的量子算法就有了成功的基礎(chǔ);選錯(cuò)了,再先進(jìn)的量子算法也可能表現(xiàn)平平。
作者:Aadish Parate
-
量子
+關(guān)注
關(guān)注
0文章
495瀏覽量
26310 -
機(jī)器學(xué)習(xí)
+關(guān)注
關(guān)注
66文章
8536瀏覽量
136113 -
量子電路
+關(guān)注
關(guān)注
0文章
4瀏覽量
1924
發(fā)布評(píng)論請先 登錄
一種實(shí)用的混沌保密編碼方法
數(shù)據(jù)編碼技術(shù)
一種宏塊分裂的多描述視頻編碼方法
一種實(shí)用的混沌保密編碼方法
定點(diǎn)小數(shù)的編碼方法
整數(shù)的編碼方法
DNA計(jì)算中的單模板編碼方法改進(jìn)研究

量子機(jī)器學(xué)習(xí)入門:三種數(shù)據(jù)編碼方法對比與應(yīng)用
評(píng)論