TensorFlow Quantum으로 양자 회로 학습

TensorFlowQuantum이 공개되었으므로 조속히 놀아 보았다.
tutorials 에 mnist의 식별의 샘플 코드가 있었으므로 (필기 숫자의 식별이라고 말해도 괜찮습니까? ), 그것을 참고로, TensorFlowQuantum을 사용해 회귀 문제에 임해 보았다. 코드는 기주 b. 코 m / 코케 사카 / 쿠안츠 m 마치 네 - r r g

기계 학습에 대해서는 아마추어를 위해 기계 학습적으로 위험한 곳이 있으면 부드럽게 지적해 주었으면 한다.

QuantumCircuitLearning



양자 회로의 구조를 제한함으로써 기울기 계산을 가능하게 한 QuantumCircuitLearning

학습 데이터 준비



자세한 내용은 QuantumNativeDojo
우선 200개의 샘플을 준비하고, 무작위로 150개를 훈련 세트, 50개를 테스트 세트로 나누었다.

입력 상태 만들기



mnist의 학습에서는 threshold를 끌어서 이미지를 2치 화상으로 해 그것을 qubit의 0,1에 대응시키고 있었다. (정확하게는 1의 경우에 X 게이트를 휘두르고 있었다)
여기서는 기주 b. 코 m / 코케 사카 / 쿠안츠 m 마치 네 - rrn g 이 되어 $\arcsin(x)$ 와 $\arccos(x^2)$ 를 각각 RY, RX 게이트의 회전각에 대응시켜, 입력 상태의 인코딩을 실시했다. TensorFlowQuantum에서는 아무래도 미리 그 상태를 준비해 두는 것 같다. (Qulacs에서는 축일회로를 재작성하고 있었다고 생각한다.)
def convert_to_circuit(x):
    """Encode truncated classical image into quantum datapoint."""
    y = np.arcsin(x)
    z = np.arccos(x**2)
    qubits = cirq.GridQubit.rect(5, 1)
    circuit = cirq.Circuit()
    for i in range(5):
        circuit.append(cirq.ry(y).on(qubits[i]))
        circuit.append(cirq.rz(z).on(qubits[i]))
    return circuit


x_train_circ = [convert_to_circuit(x) for x in x_train]
x_test_circ = [convert_to_circuit(x) for x in x_test]
x_train_tfcirc = tfq.convert_to_tensor(x_train_circ)
x_test_tfcirc = tfq.convert_to_tensor(x_test_circ)
convert_to_circuit() 는 자체적으로 준비해야 한다. QuantumNativeDojo 의 해당 부분을 보면 이해가 깊어진다고 생각한다.convert_to_tensor() 한 사람을 향후 학습에 사용한다.

파라메트릭 양자 회로(신경망) 생성



미해결



readout과 dataqubits는 별도로 준비할 필요가 있는지 알 수 없다.
QuantumNativeDojo처럼 출력 양자 비트에도 입력을 인코딩하고 싶지만 지금은 할 수 없다.

우선 구현


def create_quantum_model(c_depth=3):
    data_qubits = cirq.GridQubit.rect(5,1)
    readout = cirq.GridQubit(-1,-1)
    circuit = cirq.Circuit()


    builder = CircuitLayerBuilder(
        data_qubits = data_qubits,
        readout = readout
    )

    for i in range(c_depth):
        builder.add_entangler(circuit,5)
        builder.add_layer(circuit, gate = cirq.XX, prefix='xx'+str(i))
        builder.add_layer(circuit, gate = cirq.ZZ, prefix='zz'+str(i))
        builder.add_layer(circuit, gate = cirq.XX, prefix='xx1'+str(i))

    return circuit, cirq.Z(readout)

model_circuit, model_readout = create_quantum_model()

클래스 CircuitLayerBuilder 에 대해서는 tutorial/mnist 를 참조. 인접한 양자 비트에 CZ 게이트를 끼웁니다 add_entangler
이런 느낌으로 양자 회로를 만들 수 있다.
github

모델 작성, 학습



모델을 만들 준비가 되었습니다. 모델을 만들어 학습시켜 보자.
회귀 문제로 인해 손실 함수는 mse로 만들었습니다.
model = tf.keras.Sequential([
    # The input is the data-circuit, encoded as a tf.string
    tf.keras.layers.Input(shape=(), dtype=tf.string),
    # The PQC layer returns the expected value of the readout gate, range [-1,1].
    tfq.layers.PQC(model_circuit, model_readout),
])

model.compile(
    loss=tf.keras.losses.mse,
    optimizer=tf.keras.optimizers.Adam(),
    metrics=['mae'])

qnn_history = model.fit(
      x_train_tfcirc, y_train,
      batch_size=25,
      epochs=EPOCHS,
      verbose=1,
      validation_data=(x_test_tfcirc,y_test)
)

테스트 세트와 예측 값의 비교는 아래 그림입니다.


어쩐지 학습할 수 있는 것 같지만, 최대 최소가 작게 나와 있는 것이 신경이 쓰인다. readout은 파울리의 Z 행렬의 기대치이므로 1에서 -1 사이를 취할 수 있는 것이지만,

끝에



우선 TensorFlowQuantum에서 놀 수 있었다. 결함의 원인은 앞으로 생각하기로 한다. TensorFlowQuantum 만져보고 싶어지는 사람이 늘면 기쁘다.

좋은 웹페이지 즐겨찾기