top of page

信用スコアリングのためのハイブリッド量子-古典ニューラルネットワークの探究

  • 執筆者の写真: gaurav0487
    gaurav0487
  • 2024年12月25日
  • 読了時間: 4分

ハイブリッド量子古典ニューラル ネットワークは、現代の AI と量子コンピューティング研究の最前線にあります。このブログ投稿では、量子機械学習 (QML) の効率性と可能性に着想を得て、これらのモデルを中小企業 (SME) の信用スコアリングに適用する方法を探ります。PyTorch と PennyLane を使用して構築されたハイブリッド QML モデルの実装、トレーニング、評価を紹介します。詳細を順を追って見ていきましょう。


1. データセットの準備

最初のステップは、中小企業の信用スコアリング データのデータセットを準備することです。データセットは、21 個の特徴とバイナリ ターゲット変数 (Healthy または Default) で構成されています。


train_data = pd.read_csv("train_data.csv")  # Replace with actual file path
test_data = pd.read_csv("test_data.csv")
# Separate features and target
X_train = train_data.iloc[:, :-1].values
y_train = train_data['Target'].values
X_test = test_data.iloc[:, :-1].values
y_test = test_data['Target'].values

2. データの正規化とテンソル変換

トレーニング効率を高めるために、特徴データを正規化し、PyTorch テンソルに変換します。


# Normalize features
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# Convert data to PyTorch tensors
X_train_tensor = torch.tensor(X_train, dtype=torch.float32)
y_train_tensor = torch.tensor(y_train, dtype=torch.float32).unsqueeze(1)
X_test_tensor = torch.tensor(X_test, dtype=torch.float32)
y_test_tensor = torch.tensor(y_test, dtype=torch.float32).unsqueeze(1)

  • 正規化: 入力特徴の平均が 0 で標準偏差が 1 であることを確認します。

  • テンソル変換: データを PyTorch 操作と互換性のあるものにします。


3. DataLoader の作成

PyTorch DataLoader オブジェクトは、トレーニングおよびテスト中にデータを効率的にバッチ処理およびシャッフルします。


batch_size = 32
train_dataset = TensorDataset(X_train_tensor, y_train_tensor)
test_dataset = TensorDataset(X_test_tensor, y_test_tensor)
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)

4. 量子回路の定義

ハイブリッド モデルには、PennyLane で設計された量子コンポーネントが組み込まれています。量子回路は、角度埋め込みを使用して古典データを量子状態にエンコードし、その後にエンタングルメント レイヤーを使用します。


n_qubits = 4
dev = qml.device('default.qubit', wires=n_qubits)

@qml.qnode(dev, interface='torch')
def quantum_circuit(inputs, weights):
	qml.AngleEmbedding(inputs, wires=range(n_qubits))
	qml.BasicEntanglerLayers(weights, wires=range(n_qubits))
	return [qml.expval(qml.PauliZ(i)) for i in range(n_qubits)]

5. ハイブリッド量子古典モデル

このモデルは、古典的なレイヤーと量子レイヤーを組み合わせて、予測力を強化します。


class HybridModel(nn.Module):
    def __init__(self):
		super(HybridModel, self).__init__()
		self.classical_layer1 = nn.Linear(21, 10)
		self.classical_layer2 = nn.Linear(10, n_qubits)
		self.quantum_weights = nn.Parameter(0.01 * torch.randn((3, n_qubits)))
		self.classical_output = nn.Linear(n_qubits, 1)
		self.sigmoid = nn.Sigmoid()



    def forward(self, x):

		x = torch.relu(self.classical_layer1(x))
		x = torch.relu(self.classical_layer2(x))
		q_out = quantum_circuit(x, self.quantum_weights)
		q_out = torch.stack(q_out, dim=-1).float()
		x = self.classical_output(q_out)
		return self.sigmoid(x)

6. モデルのトレーニング

このモデルは、バイナリクロスエントロピー損失確率的勾配降下法を使用してトレーニングされます。


model = HybridModel()
criterion = nn.BCELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)
n_epochs = 20
for epoch in range(n_epochs):
	model.train()
	epoch_loss = 0.0
	for data, target in train_loader:
		optimizer.zero_grad()
		output = model(data)
		loss = criterion(output, target)
		loss.backward()
		optimizer.step()
		epoch_loss += loss.item()
	print(f"Epoch {epoch + 1}/{n_epochs}, Loss: {epoch_loss / 		len(train_loader)}")
Epoch 1/20, Loss: 0.8587412118911744
Epoch 2/20, Loss: 0.5195474481582641
Epoch 3/20, Loss: 0.40876561164855957
Epoch 4/20, Loss: 0.3654198062419891
Epoch 5/20, Loss: 0.3457665106654167
Epoch 6/20, Loss: 0.3360282516479492
Epoch 7/20, Loss: 0.3307387161254883
Epoch 8/20, Loss: 0.32773104071617126
Epoch 9/20, Loss: 0.3259801682829857
Epoch 10/20, Loss: 0.32495405852794645
Epoch 11/20, Loss: 0.3243127857148647
Epoch 12/20, Loss: 0.32388067364692685
Epoch 13/20, Loss: 0.323671769797802
Epoch 14/20, Loss: 0.3235171364247799
Epoch 15/20, Loss: 0.3233896933495998
Epoch 16/20, Loss: 0.32332037925720214
Epoch 17/20, Loss: 0.3232835227251053
Epoch 18/20, Loss: 0.3232590101659298
Epoch 19/20, Loss: 0.3232296106219292
Epoch 20/20, Loss: 0.32323075518012045

7. モデルの評価

トレーニング後、モデルはテスト データセットで評価され、その精度が計算されます。


model.eval()
correct = 0
total = 0
with torch.no_grad():
	for data, target in test_loader:
		output = model(data)
		predicted = (output > 0.5).float()
		correct += (predicted == target).sum().item()
		total += target.size(0)



accuracy = correct / total
print(f"Test Accuracy: {accuracy * 100:.2f}%")

Test Accuracy: 88.75%

結果

  • トレーニング効率: 量子-古典ハイブリッド モデルは、3,500 エポックでトレーニングされた古典モデルと同等のパフォーマンスを実現しますが、必要なエポックは350 エポックのみです。

  • テスト精度: ハイブリッド モデルは、テスト データセットで88.75%の精度を達成しました。

  • スケーラビリティの課題: 量子ビットの数が 12 を超えた場合、または追加の分類ブロックが追加された場合、パフォーマンスの低下が見られました。


結論

この調査は、ハイブリッド QML モデルがクレジット スコアリング タスクに効率的に取り組む可能性を示しています。量子モデルは有望ですが、実際の量子ハードウェアでのスケーラビリティやノイズ感度などの課題が残っています。この最初のステップにより、QML を現実世界の金融問題に適用するさらなる進歩への扉が開かれます。


参考文献:

  1. https://arxiv.org/pdf/2308.03575 - クレジットスコアリングのための QML

  2. https://pennylane.ai/ - ペニーレーン


 
 
 

Comments


bottom of page