忍者ブログ
統計、機械学習、AIを学んでいきたいと思います。 お役に立てば幸いです。

【Qiskit】3量子ビットをすべて重ね合わせにしてみよう!一斉測定の実験

1量子ビットでの重ね合わせ(Hゲート)の仕組みが分かったところで、次はスケールを大きくして「3つの量子ビット」を同時に重ね合わせ状態にする実験に挑戦してみましょう!

量子ビットを増やすと、一度に扱える状態の数が爆発的に増えるのが量子コンピュータのすごいところです。実際にコードを書いて、どのような結果になるか確かめてみます。

1. サンプルコード

3つの量子ビットと3つの古典ビットを準備し、すべての量子ビットにHゲートをかけてから一斉に測定するコードです。

from qiskit import QuantumCircuit
from qiskit.providers.basic_provider import BasicSimulator

# 3量子ビット、3古典ビットを準備
qc = QuantumCircuit(3, 3)

# すべての量子ビット(0, 1, 2番目)にHゲートを適用して「確率の波」にする
qc.h(0)
qc.h(1)
qc.h(2)

# それぞれの量子ビットを測定し、対応する古典ビットに保存
qc.measure([0, 1, 2], [0, 1, 2])

# 回路図をテキスト形式で出力
print("--- 回路図 ---")
print(qc.draw(output='text'))

# シミュレータで1000回実行
simulator = BasicSimulator()
result = simulator.run(qc, shots=1000).result()
counts = result.get_counts()

print("\n--- 実行結果 ---")
print(f"実行結果: {counts}")

2. 実行結果と回路図

上記のコードを実行すると、次のような回路図と結果が得られます。

--- 回路図 ---
     ┌───┐┌─┐       
q_0: ┤ H   ├┤ M├──────
     ├───┤└╥--┌-┐    
q_1: ┤ H ├─╫--┤M├───
├───┤ ║ └╥┘┌-┐ q_2: ┤ H ├─╫──╫─┤M├ └───┘ ║ ║ └╥┘ c: 3/══════╩══╩══╩═ 0 1 2 --- 実行結果 --- 実行結果: {'100': 123, '111': 125, '001': 132, '010': 131, '110': 133, '011': 125, '000': 96, '101': 135}

3. 解説:3ビットで「8通り」の重ね合わせが誕生!

実行結果を見ると、000 から 111 まで、3ビットで表現できる全8パターン(000, 001, 010, 011, 100, 101, 110, 111)が、それぞれ約125回ずつ(均等に約12.5%の確率で)出現していることが分かります。

  • 独立した確率の波:それぞれの量子ビットにHゲートをかけることで、個別に「0か1か分からない波」になり、全体として 2^3 = 8 通りの組み合わせの波が同時に存在している状態になります。
  • 測定による一瞬の収縮:測定(Measure)を行った瞬間、広がっていた8通りの確率の波がガツンと収縮し、どれか1つのパターン(例:100111 など)にピシッと決まります。これを1000回繰り返したため、8つの結果が綺麗に分散して現れました。
量子ビットを増やすと、扱える状態の数が「 2^n 」に爆発的に増加!
これが、量子コンピュータが膨大なパターンを同時に扱えると言われる秘密の片鱗です。

まとめ

今回は3つの量子ビットをすべて重ね合わせにする実験を行いました。たった3ビット増やすだけで、一気に8通りものパラレルな世界を作り出すことができました。量子ビットを増やしていくと、さらに面白い現象(量子もつれなど)が顔を出してきます。Qiskitを使った実験、本当にワクワクしますね!

PR

【DS検定】パラメータを劇的に減らすCNNの秘密!「重み共有」とは

高解像度の画像をそのまま通常のニューラルネットワーク(全結合層)に入力すると、パラメータの数が数百万〜数億個に膨れ上がり、学習が不可能になってしまいます。この問題を鮮やかに解決した畳み込みニューラルネットワーク(CNN)の超重要メカニズムが「重み共有」です!

1. 【 問題 】

畳み込みニューラルネットワーク(CNN)において、小さなフィルタ(カーネル)を画像全体の上でスライドさせながら走査する際、同じフィルタの係数を画像内の異なる位置(複数のノードや領域)で共通して使い回すことで、学習すべきパラメータの総数を大幅に削減する仕組みを何と呼ぶでしょうか?

① 重み共有(Weight Sharing)
② 活性化関数(Activation Function)
③ ドロップアウト(Dropout)
④ 勾配降下法(Gradient Descent)


2. 【 解答 】

正解: ① 重み共有(Weight Sharing)

3. 整理:なぜ重み共有でパラメータが激減するのか?

画像認識において、「写真のどこに猫の耳(特徴)が映っていても、それは同じ耳として検出したい」という性質があります。この発想が「重み共有」の原点です。

【 全結合層 vs 畳み込み層(重み共有)のイメージ 】

通常の全結合層:
入力のすべてのピクセルから、次の層のすべてのノードへ別々の「重み(係数)」が伸びるため、パラメータ数が爆発的に増える。

畳み込み層(重み共有):
例えば「3×3ピクセル」の小さなフィルタ(重みはたったの9個)を1枚用意し、その同じ9個の重みを維持したまま、画像の上を端から端までペタペタとスライドさせて特徴を抽出し続ける。

最大のメリット:
画像がどれほど大きくなっても、フィルタのサイズさえ小さければパラメータの数(重みの数)はほとんど増えない! また、画像内のどこにあっても同じ特徴(エッジや模様など)を検出できる(平行移動不変性)という強力なメリットが生まれます。

4. 試験でセットで問われるCNNの重要キーワード

DS検定やG検定では、重み共有とセットで以下の仕組みがよく出題されます。

用語仕組みと役割
局所受容野
(Local Receptive Field)
画像全体を一度に見るのではなく、周囲の限られた狭い範囲(例:3×3など)のピクセルだけをまとめて入力として受け取る仕組み。脳の視覚野の構造をヒントにしている。
プーリング層
(Pooling / 縮小)
畳み込み層で作られた特徴マップの解像度(サイズ)を粗く縮小し、画像全体のわずかなズースや位置のズレに対してモデルを頑健(ロバスト)にする仕組み。

5. DS検定形式:実戦4択クイズ

問:畳み込みニューラルネットワーク(CNN)の「畳み込み層」および「重み共有」に関する記述として、最も適切なものはどれか。

① 畳み込み層では、入力画像のサイズが大きくなるほど、全結合層と同様にパラメータ数が比例して激増するため、画像サイズ制限が非常に厳しい。
② 重み共有を行うことで、画像内のどの位置に特定のパターン(エッジや形状など)が現れても、同じフィルタで効率よく検出することが可能になる。
③ 畳み込み層における「重み」とは、画像全体の明るさの平均値を補正するためのものであり、学習によって変化することはない。
④ 複数のノード間で重みを共有すると、ネットワークの表現力が制限されるため、画像認識の精度がランダム推測レベルまで低下してしまう。

【 正解: ② 】

解説: 重み共有のメリットと目的を問う王道問題です。
②が正解です。同じフィルタを使い回す(共有する)ことで、位置が変わっても同じ特徴を検出できます。
①画像サイズが大きくなっても、スライドさせる回数が増えるだけで「フィルタ自体のパラメータ数」は増えません。
③重みはネットワークが学習を通じて自動的に最適化するパラメータです。
④適切な重み共有により、過学習を防ぎつつ効率的な特徴抽出が可能になります。


6. まとめ

AI・データサイエンスの試験や実務において、「複数のノードや層で重みを共有」「パラメータ数を減らす」「画像認識(CNN)」といったキーワードを見かけたら、迷わず「重み共有」を選びましょう! パラメータ数を節約しつつ、効率的に画像の特徴を捉えるこの仕組みは、ディープラーニングの歴史を変えた偉大な発明の一つです。

【Qiskit】Hゲートで重ね合わせ状態を作ろう!1量子ビットの確率実験

前回は、何も操作しない初期状態の量子ビットを測定すると、必ず 0(100%)になることを確認しました。今回はついに、量子コンピュータの真骨頂である「Hゲート(アダマールゲート)」を使って、量子を「確率の波(重ね合わせ状態)」に変換する実験をしてみます!

1. サンプルコード

量子ビットにHゲートを適用し、確率の波を作ってから測定するコードです。

from qiskit import QuantumCircuit
from qiskit.providers.basic_provider import BasicSimulator

# 1量子ビット、1古典ビットを準備
qc = QuantumCircuit(1, 1)

# Hゲート(アダマールゲート)を適用して「確率の波」にする
qc.h(0)

# 測定
qc.measure(0, 0)

# 回路図をテキスト形式で出力
print("--- 回路図 ---")
print(qc.draw(output='text'))

# シミュレータで1000回実行
simulator = BasicSimulator()
result = simulator.run(qc, shots=1000).result()
counts = result.get_counts()

print("\n--- 実行結果 ---")
print(f"実行結果: {counts}")

2. 実行結果と回路図

上記のコードを実行すると、次のような回路図と結果が得られます。

--- 回路図 ---
     ┌───┐┌─┐
  q: ┤ H ├┤M├
     └───┘└╥┘
c: 1/══════╩═
           0 

--- 実行結果 ---
実行結果: {'1': 463, '0': 537}

3. 解説:ついに重ね合わせ状態ができた!

実行結果を見ると、先ほどまで 100% だった 0 だけでなく、1 もほぼ半々の確率(この時は463回と537回)で出現しています!

  • Hゲートの物理的効果:極低温で静止していた純粋な |0> の状態に対し、外部から絶妙なエネルギー(パルス)を加えることで、状態をぐるっと回転させました。
  • 確率の波の誕生:これにより、量子は「0 でもあるし 1 でもある」という確率の波(重ね合わせ状態)に変換されます。
  • 測定による収縮:その波の状態のまま測定器にかけることで、毎回ランダムに 01 が決定されるようになります。
Hゲートによって量子が「波」になり、ついにランダムな確率の世界が姿を現しました!
この確率の波こそが、量子コンピュータが並列計算を行える最大の原動力です。

【Qiskit】1量子ビットの測定実験:「何もしないと0」の物理的意味

量子コンピュータのコードを書くとき、初期状態の量子ビットをそのまま測定するとどうなるでしょうか?今回は、あえて操作を加えずに 1量子ビット を定義して測定するシンプルな実験と、その裏にある物理的な意味を解説します。

1. サンプルコード

1量子ビットと1つの古典ビットを準備し、Hゲートなどの操作を行わずにそのまま測定するコードです。

from qiskit import QuantumCircuit
from qiskit.providers.basic_provider import BasicSimulator

# 1量子ビット、1古典ビットを準備
qc = QuantumCircuit(1, 1)

# (操作を加えずにそのまま測定)
qc.measure(0, 0)

# シミュレータで1000回実行
simulator = BasicSimulator()
result = simulator.run(qc, shots=1000).result()
counts = result.get_counts()

print(f"実行結果: {counts}")

2. 実行結果

上記のコードを実行すると、何度(何回shotsを回しても)結果は必ず以下のようになります。

実行結果: {'0': 1000}

3. 解説:なぜ「1」は出ないのか?

「量子力学=ランダムに確率で変わるもの」というイメージがあると 1 も混ざりそうになりますが、ここには明確な理由があります。

  • 初期状態は純粋な |0>:実際のハードウェア(超伝導回路など)は極低温に冷却され、余計なエネルギーが奪われた状態(基底状態)からスタートするため、何も操作しなければ 100% 確実な 0 です。
  • 「波」にするにはエネルギーが必要:Hゲート(アダマールゲート)などで外部からエネルギーを加え、量子を揺らがせて「確率の波(重ね合わせ)」に変換して初めて、01 が確率的に出現するようになります。
  • 測定と初期状態の違い:初期状態の 0 は静まり返った純粋な状態ですが、測定後の 0 は「波」の状態で漂っていたものが測定の衝撃で強制的に収縮させられた結果です。
量子は「何もしなければピシッと0」!
Hゲートなどのエネルギー操作で「波」に変換して初めて、量子らしい確率の世界が始まります。

【DS検定】AIが突然覚醒する!?「グロッキング(Grokking)」現象とは

「いくら学習させてもデータを丸暗記(過学習)するだけで、一向に未知の問題が解けない…」と思っていたAIモデルが、学習ステップを極端に長く継続した結果、ある瞬間に突然「データの法則性」を理解して精度100%に跳ね上がる。そんな嘘のような現象が実在します。それが「グロッキング(Grokking)」です!

1. 【 問題 】

ディープラーニングの学習過程において、訓練データに対する精度が100%に達して過学習(丸暗記)が起きた後もさらに大量の学習(勾配降下法)を続けさせると、ある地点で突然、未知の検証データに対する精度が激増して汎化性能を獲得する現象を何と呼ぶでしょうか?

① グロッキング(Grokking)
② カタストロフィック・フォーゲッティング(破滅的忘却)
③ 勾配消失(Vanishing Gradient)
④ スパーシティ(疎性)


2. 【 解答 】

正解: ① グロッキング(Grokking)

3. 整理:従来常識を覆す「過学習のその先」

これまでの機械学習の教科書では「検証用データの精度が下がり始めたら(過学習が起きたら)、即座に学習をストップする(早期終了:Early Stopping)」のが鉄則とされていました。しかし、グロッキングはその常識を覆します。

【 グロッキング発生時の精度の変化 】

[学習初期〜中期]
・訓練データの精度:100%(完璧に答えを暗記した!)
・検証データの精度:0% 〜 低い(丸暗記なので応用が効かない=過学習状態)

普通ならここで学習を止めるが、さらに過剰に学習を続ける…

[学習終盤(何万ステップ後)]
・訓練データの精度:100%
・検証データの精度:0% から 突然 100% に急上昇!(覚醒)

内部のネットワーク構造を解析した研究によると、過学習状態のときは「力任せの複雑な計算(丸暗記)」で解いていたモデルが、過剰な学習(正則化等の影響)を経る中で、よりシンプルで本質的な数学的ルール(表現)へと再構築された結果、突然応用力が開花することが分かっています。


4. なぜ起きる?と「創発(Emergence)」との違い

AIの能力向上に関する重要用語として、「創発」との違いもセットで整理しておきましょう。

用語意味・現象の特徴
グロッキング
(Grokking)
同一のモデル・同一のデータで「学習時間(ステップ数)」を極端に長く伸ばしたときに、突然過学習を脱出してルールを「会得(理解)」する現象。
創発能力
(Emergent Abilities)
LLM(大規模言語モデル)などで、「パラメータ数(モデル規模)」や「データ量」をある閾値以上に大きくしたときに、突然推論能力や計算能力などの新機能が開花する現象。

5. DS検定・AI資格形式:実戦4択クイズ

問:ディープラーニングにおける「グロッキング(Grokking)」現象に関する記述として、最も適切なものはどれか。

① モデルのパラメータ数を小さくすればするほど発生しやすくなり、過学習を未然に防ぐための推奨テクニックである。
② 訓練データへの適合(丸暗記)が完了した後、さらに学習を長時間継続することで、遅れて汎化性能(応用力)が急激に獲得される現象である。
③ 新しいタスクを学習させた際に、過去に学習したタスクの記憶が完全に上書きされて消滅してしまう現象のことである。
④ 勾配降下法において、学習率が大きすぎるために損失関数の値が無限大に発散してしまう現象のことである。

【 正解: ② 】

解説: グロッキングの本質を問う問題です。
②が正解です。訓練精度が上がった後、遅れて(Lagged)検証精度が激増するのが最大の特徴です。
①グロッキングを起こすには膨大な計算ステップが必要となるため、実用上の過学習対策として能動的に狙うのは計算コスト的に容易ではありません。
③は「破滅的忘却(Catastrophic Forgetting)」の説明です。
④は「勾配爆発(Exploding Gradient)」などの説明です。


6. まとめ

「過学習の限界を超えて学習し続けたら、AIが突然本質を理解して賢くなった」というグロッキングは、ディープラーニングの奥深さを象徴する非常にエキサイティングなテーマです。 「丸暗記(過学習)の後に遅れて起こる汎化性能の急上昇」というキーワードが出てきたら、迷わず「グロッキング」と回答できるようにしておきましょう!