本文轉(zhuǎn)自:DeepHub IMBA
在傳統(tǒng)機(jī)器學(xué)習(xí)中數(shù)據(jù)編碼確實(shí)相對(duì)直觀:獨(dú)熱編碼處理類別變量,標(biāo)準(zhǔn)化調(diào)整數(shù)值范圍,然后直接輸入模型訓(xùn)練。整個(gè)過(guò)程更像是數(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)中的存在形式。這不是簡(jiǎn)單的格式轉(zhuǎn)換,而是從根本上塑造了量子算法能夠"看到"和處理的數(shù)據(jù)結(jié)構(gòu)。
在量子機(jī)器學(xué)習(xí)中,編碼不是預(yù)處理,而是算法設(shè)計(jì)的核心。
本文我們會(huì)詳細(xì)講解量子數(shù)據(jù)編碼的三種主要方法,分析它們與傳統(tǒng)方法的區(qū)別,以及為什么選對(duì)編碼方式會(huì)決定你的量子模型成敗。
量子編碼的底層邏輯
量子電路處理數(shù)據(jù)的方式和傳統(tǒng)算法截然不同,即使是在普通電腦上模擬運(yùn)行也是如此。你沒(méi)法直接把數(shù)值列表或者歸一化向量塞給量子電路。數(shù)據(jù)必須先編碼成量子態(tài)——這些數(shù)學(xué)對(duì)象可以模擬疊加和糾纏行為。這個(gè)編碼過(guò)程就是連接經(jīng)典數(shù)據(jù)集和量子計(jì)算環(huán)境的橋梁,讓我們能在本地機(jī)器上做量子機(jī)器學(xué)習(xí)實(shí)驗(yàn)。
量子電路運(yùn)行在一個(gè)完全不同的計(jì)算空間里。它們操作的是量子態(tài),這些數(shù)學(xué)對(duì)象存在于疊加狀態(tài)中,可以在多個(gè)量子比特之間形成糾纏,測(cè)量時(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)簡(jiǎn)單但表達(dá)能力有限。振幅編碼把整個(gè)數(shù)據(jù)集壓縮進(jìn)量子態(tài)的振幅里,效率很高但需要復(fù)雜的歸一化處理。角度編碼用量子門根據(jù)數(shù)據(jù)值旋轉(zhuǎn)量子比特,在簡(jiǎn)單性和功能性之間找到了平衡點(diǎn)。
這個(gè)選擇不只影響準(zhǔn)確率,還決定了電路深度、量子比特需求,以及模型能利用哪些量子現(xiàn)象。選錯(cuò)了編碼方式,即使是理論上有優(yōu)勢(shì)的量子算法也可能跑不過(guò)經(jīng)典基線。
角度編碼:最直觀的映射方式
角度編碼是把經(jīng)典特征轉(zhuǎn)換為量子態(tài)最直接的方法。每個(gè)特征值變成一個(gè)旋轉(zhuǎn)角度,作用在對(duì)應(yīng)的量子比特上。通常用RY門(繞Y軸旋轉(zhuǎn)),因?yàn)樗茏屃孔颖忍卦贐loch球面的Y軸上旋轉(zhuǎn)。
對(duì)于特征向量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)對(duì)應(yīng)的量子比特,把信息編碼在量子態(tài)的幾何結(jié)構(gòu)里。
用Qiskit實(shí)現(xiàn)角度編碼很簡(jiǎn)單。每個(gè)特征通過(guò)一個(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)勢(shì)很明顯:特征到量子比特的映射很直接,適用于任何連續(xù)數(shù)據(jù)。但限制也不少,每個(gè)量子比特只能編碼一個(gè)特征作為單個(gè)角度,表達(dá)能力有限。每個(gè)特征只影響一個(gè)量子比特,所以多特征之間的交互沒(méi)法自然表示出來(lái),也抓不到特征間的相關(guān)性。擴(kuò)展到高維數(shù)據(jù)時(shí)需要很多量子比特這在實(shí)際應(yīng)用中是個(gè)大問(wèn)題。
振幅編碼:量子優(yōu)勢(shì)的體現(xiàn)
振幅編碼真正展現(xiàn)了量子計(jì)算的指數(shù)優(yōu)勢(shì)。它不是給每個(gè)特征分配一個(gè)量子比特,而是把整個(gè)特征向量壓縮到量子態(tài)的振幅里。
比如特征向量x = [x?, x?, x?, x?],振幅編碼會(huì)創(chuàng)建量子態(tài)|ψ? = α?|00? + α?|01? + α?|10? + α?|11?,每個(gè)α?對(duì)應(yīng)一個(gè)歸一化的特征值。這里的關(guān)鍵是指數(shù)信息密度:n個(gè)特征只需要log?(n)個(gè)量子比特。256個(gè)特征的向量只要8個(gè)量子比特就夠了,而角度編碼需要256個(gè)。
但這種壓縮有個(gè)硬性要求:Σ|α?|2 = 1,保證量子態(tài)的有效性。你的特征向量必須先歸一化為單位長(zhǎng)度。與角度編碼直接映射不同,振幅編碼需要復(fù)雜的數(shù)學(xué)預(yù)處理,把經(jīng)典向量轉(zhuǎn)換成概率幅。
這種指數(shù)壓縮帶來(lái)了獨(dú)特的量子現(xiàn)象。特征不再獨(dú)立它們存在于疊加態(tài)中,測(cè)量任何量子比特都會(huì)影響整個(gè)系統(tǒng)狀態(tài)。這讓量子算法能處理傳統(tǒng)算法難以應(yīng)對(duì)的特征相關(guān)性和高維模式,但也讓編碼的實(shí)現(xiàn)和理解變得復(fù)雜得多。
振幅編碼面臨兩個(gè)角度編碼沒(méi)有的難題:歸一化復(fù)雜性和電路深度問(wèn)題。
歸一化這步看起來(lái)簡(jiǎn)單,實(shí)際上很要命。你的特征向量必須滿足Σ|α?|2 = 1,這直接影響模型對(duì)數(shù)據(jù)關(guān)系的解釋。用L2歸一化、先做min-max縮放再歸一化,或者基于概率的歸一化,對(duì)同一份經(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ù)量對(duì)數(shù)增長(zhǎng),實(shí)現(xiàn)起來(lái)相當(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
處理任意長(zhǎng)度的數(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)
這樣就能處理任意長(zhǎng)度的向量,編碼器會(huì)自動(dòng)填充到最近的2的冪次。
基礎(chǔ)編碼:簡(jiǎn)單高效的離散表示
基礎(chǔ)編碼把分類數(shù)據(jù)直接映射到計(jì)算基礎(chǔ)狀態(tài)∣0?和∣1?。它不依賴疊加或干涉,而是用不同的正交狀態(tài)表示不同類別,測(cè)量時(shí)能完美區(qū)分。
這創(chuàng)建了經(jīng)典標(biāo)簽和二進(jìn)制量子態(tài)的一對(duì)一映射。2量子比特系統(tǒng)有四個(gè)基礎(chǔ)狀態(tài):∣00?,∣01?,∣10?,∣11?,可以表示四個(gè)類別。編碼就是把分類標(biāo)簽轉(zhuǎn)成二進(jìn)制,然后初始化量子比特匹配這個(gè)二進(jìn)制模式。類別"A"可能對(duì)應(yīng)∣00?,類別"B"對(duì)應(yīng)∣01?,測(cè)量時(shí)能100%確定地恢復(fù)原類別。
數(shù)學(xué)上很優(yōu)雅:n個(gè)類別只需要 [log?(n)] 個(gè)量子比特,對(duì)離散數(shù)據(jù)非常高效。
Qiskit實(shí)現(xiàn)基礎(chǔ)編碼很直接,把量子比特準(zhǔn)備到對(duì)應(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
多類問(wèn)題可以把整數(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ǔ)編碼對(duì)分類變量很合適,但處理連續(xù)或高維數(shù)據(jù)就效率太低了。編碼大數(shù)據(jù)集會(huì)消耗太多量子比特,不實(shí)用。對(duì)數(shù)值特征,角度或振幅編碼是更好的選擇。
如何選擇編碼方式
選擇哪種編碼方式主要看你的具體需求。
如果你在學(xué)習(xí)量子機(jī)器學(xué)習(xí)基礎(chǔ),特征之間相對(duì)獨(dú)立,需要簡(jiǎn)單易懂的電路,或者在NISQ設(shè)備上工作,角度編碼是最好的起點(diǎn)。
如果你有高維連續(xù)數(shù)據(jù),特征相關(guān)性很重要,能接受電路復(fù)雜度,想要最大化量子優(yōu)勢(shì),振幅編碼更合適。
如果數(shù)據(jù)主要是分類或離散的,需要完美的可解釋性,要求最小電路深度,處理的是分類問(wèn)題,基礎(chǔ)編碼是理想選擇。
量子數(shù)據(jù)編碼不只是預(yù)處理步驟,它從根本上定義了量子模型能學(xué)到什么、怎么學(xué)。選對(duì)編碼方式,你的量子算法就有了成功的基礎(chǔ);選錯(cuò)了,再先進(jìn)的量子算法也可能表現(xiàn)平平。
作者:Aadish Parate
-
量子
+關(guān)注
關(guān)注
0文章
495瀏覽量
26216 -
機(jī)器學(xué)習(xí)
+關(guān)注
關(guān)注
66文章
8528瀏覽量
135852 -
量子電路
+關(guān)注
關(guān)注
0文章
4瀏覽量
1915
發(fā)布評(píng)論請(qǐng)先 登錄
一種實(shí)用的混沌保密編碼方法
數(shù)據(jù)編碼技術(shù)
一種宏塊分裂的多描述視頻編碼方法
一種實(shí)用的混沌保密編碼方法
定點(diǎn)小數(shù)的編碼方法

整數(shù)的編碼方法
DNA計(jì)算中的單模板編碼方法改進(jìn)研究

評(píng)論