textbook のコードを眺めて大変興味深く感じた。・・・が、正直、古典ニューラルネット部で畳み込み層を用いて画像の特徴量を抽出している状態で、量子回路層が担っている意味合いは少し分かりにくい。本質的には classifier 部の実装になっている。
が、それすらも実質古典ニューラルネットに実装されているので、実は以下のように量子回路層をスキップして、Sigmoid
で確率にしてしまえば終わりである。
class Net(nn.Module): def __init__(self): ... self.sigmoid = nn.Sigmoid() def forward(self, x): x = F.relu(self.conv1(x)) x = F.max_pool2d(x, 2) x = F.relu(self.conv2(x)) x = F.max_pool2d(x, 2) x = self.dropout(x) x = x.view(1, -1) x = F.relu(self.fc1(x)) x = self.fc2(x) x = self.sigmoid(x) return torch.cat((x, 1 - x), -1)
そして、そうしたほうが一気に損失値も下がるし、遥かに高速に動作する。
このことから分かるのは、textbook ではあくまで量子回路を組み込む時はこういう風にやればできますよ、ということを言っているだけで、量子回路を組み込んだ時のメリットについては何も見えてこない内容になっている。
こうして textbook で肩慣らしをした状態で書籍の付属コードを見直すと、振幅エンコーディングを使ったり、
class Net(nn.Module): ... def forward(self, x): x = self.hybrid(x, self.weight) return x
の実装から分かるように、ネットワークを完全に量子回路のみで実装していたりととても頑張っていることが見て取れる。但しその分大変遅いし、損失値の落ち方も緩やかになっている。(精度もあまり良くない)
加えて、何故この量子回路が CV の課題、つまり画像分類問題に適していることになるのかも読み取れない状態である。
と、ケチばかりをつけてしまったが、古典ニューラルネットと量子回路のハイブリッドについて大変知見が得られたように思う。課題として思いつくものとしても以下のようなものがある:
- ハイブリッド路線の場合、古典ネット部を GPU に乗せる場合、VRAM 上のテンソルを量子コンピュータにどうやって流すのか?一旦 CPU に戻すのは backprop を壊すし、パフォーマンスが稼げそうにない
- ハイブリッドでも完全な量子回路でも共通だが、順伝播の過程や逆伝播におけるパラメータシフト則での計算の際に量子回路にタスクを投げて結果を受け取らないとならない。シミュレータではなく、クラウドの実機だととても応答を待っていられないと思う。研究室に量子コンピュータを直接設置できない場合、あまりに苦しいのではないか?
- 量子回路のデバッグが難しすぎる。
といったことを感じられたことこそが大きな学びであり、これをもって IBM Quantumで学ぶ量子コンピュータ - 秀和システム あなたの学びをサポート! を読み切ったことにしたい。