マルチヘッドアテンションにより、Transformer は複数のことに同時に注目できます。入力 X(n トークン × d 列)と d × d の重み行列について:
- Q = X × w_q、K = X × w_k、V = X × w_v
- d 列を
num_heads個のヘッドに分けます。各ヘッドは連続する d_k = d / num_heads 列を持ちます(ヘッド h は列 h×d_k から (h+1)×d_k - 1 を使う)。 - 各ヘッドで、その列だけを使ってスケールド・ドット積アテンションを実行します。トークン i について、そのヘッドの列で score_j = (Q_i · K_j) / √d_k を計算し、n 個すべてのトークン j でソフトマックスをとり、出力 = Σ weight_j × V_j(そのヘッドの列)。
- 各ヘッドの出力を元の列に戻し(連結し)、w_o を掛けます。
multi_head_attention(x, w_q, w_k, w_v, w_o, num_heads) を実装してください。
入力
x: n × d の入力行列。
w_q, w_k, w_v, w_o: d × d の重み行列。
num_heads: ヘッドの数(d はこの数で割り切れる)。
出力
n × d の出力行列を返してください。
制約
1 ≤ n ≤ 30、1 ≤ d ≤ 32、1 ≤ num_heads ≤ d で、d は num_heads で割り切れる
-5 ≤ 各値 ≤ 5
例
入力:
x = [
[1.0, 0.0],
[0.0, 1.0]
]
w_k = [
[1.0, 0.0],
[0.0, 1.0]
]
w_o = [
[1.0, 0.0],
[0.0, 1.0]
]
w_q = [
[0.0, 0.0],
[0.0, 0.0]
]
w_v = [
[1.0, 0.0],
[0.0, 1.0]
]
num_heads = 1
期待される出力:
[
[0.5, 0.5],
[0.5, 0.5]
]
解説
w_q がすべて 0 なので、スコアはすべて 0 となり、各トークンは値の行の平均になります。V = X なので、両方の行が [0.5, 0.5] になります。
入力:
x = [
[2.0, 4.0]
]
w_k = [
[1.0, 0.0],
[0.0, 1.0]
]
w_o = [
[0.0, 1.0],
[1.0, 0.0]
]
w_q = [
[1.0, 0.0],
[0.0, 1.0]
]
w_v = [
[1.0, 0.0],
[0.0, 1.0]
]
num_heads = 2
期待される出力:
[
[4.0, 2.0]
]
解説
トークンが1つだけなので各ヘッドは自分自身だけに注目し、連結した出力は V = [2, 4] です。w_o が2つの列を入れ替えるので [4, 2] になります。
参考資料
-
例 1 未実行入力:
x = [ [1.0, 0.0], [0.0, 1.0] ] w_k = [ [1.0, 0.0], [0.0, 1.0] ] w_o = [ [1.0, 0.0], [0.0, 1.0] ] w_q = [ [0.0, 0.0], [0.0, 0.0] ] w_v = [ [1.0, 0.0], [0.0, 1.0] ] num_heads = 1期待される出力:[ [0.5, 0.5], [0.5, 0.5] ]あなたの出力 -
例 2 未実行入力:
x = [ [2.0, 4.0] ] w_k = [ [1.0, 0.0], [0.0, 1.0] ] w_o = [ [0.0, 1.0], [1.0, 0.0] ] w_q = [ [1.0, 0.0], [0.0, 1.0] ] w_v = [ [1.0, 0.0], [0.0, 1.0] ] num_heads = 2期待される出力:[ [4.0, 2.0] ]あなたの出力
提出時に非公開テスト4件も実行されます。
Pythonオンラインコンパイラ&デバッガー
Pythonコードをオンラインで実行・デバッグできます。サーバーモードでブレークポイントとステップ実行を使え、インストールは不要です。
🐍 このPythonオンライン実行環境について
CodeUtility Python Executor は、ブラウザ上でPythonコードを記述・実行・テストできるツールです — セットアップやインストールは不要です。安全なサンドボックス上で動作し、 3.10 から 3.13 までの実際のPythonバージョンをサポートします。
初めてPythonを学ぶ場合でも、ちょっとしたスニペットを試すときでも、ロジックをデバッグするときでも、 このツールは高速で集中できるコーディング環境を提供します。 内蔵コンソールで自由に試し、結果をすぐに確認できます。
Pythonの練習や素早いプロトタイピングのために軽量なオンラインIDEが必要な、初心者、学生、開発者に最適です。
同じ実行環境で、複数ファイル対応エディター、分離された実行ターミナル、ランタイム別ライブラリ、永続ワークスペース、共有、リアルタイム共同作業を利用できます。
この実行環境の使い方
ランタイムを選択し、ファイルを開くか作成してコードを記述し、[実行]を選択します。出力はターミナルに表示されます。サインインしたユーザーは、ワークスペースにファイルを保存し、ライブラリをインストールして、共有を通じて共同作業できます。
- バージョンを選択して現在のファイルを編集するか、ワークスペース内の別のファイルを開きます。
- コードを実行し、求められた場合はターミナルに入力して、保存された実行履歴を確認します。
- 複数のコードスニペットが必要な作業では、ライブラリ、ワークスペースツール、共有、チャットを利用します。
💡 上のエディタで試せるPythonの基礎とサンプル
1. 変数と定数の宣言
Pythonは動的型付けなので、型を明示的に宣言する必要はありません。組み込みの定数キーワードはありませんが、慣例として定数はすべて大文字で書きます。
# 変数
x = 10
pi = 3.14
name = "Alice"
is_active = True
# 定数(慣例)
MAX_USERS = 100
APP_NAME = "CodeUtility"
# 定数も再代入は可能(強制されない)
MAX_USERS = 200 # ⚠️ 技術的には可能だが非推奨
2. 条件分岐
if、elif、else ブロックでロジックを制御します。Python 3.10以降では、match-case をswitch-caseの代替として使えます。
# 従来の if-elif-else
x = 2
if x == 1:
print("一")
elif x == 2:
print("二")
else:
print("その他")
別案: match-case(Python 3.10+)
# Python 3.10+ が必要
x = 2
match x:
case 1:
print("一")
case 2:
print("二")
case _:
print("その他")
3. ループ
for はシーケンスの反復に使い、while は条件が真の間実行されます。
for i in range(3):
print(i)
count = 3
while count > 0:
print(count)
count -= 1
4. リスト
リストは順序を持つ可変のコレクションです。インデックスで要素にアクセスできます。
fruits = ["りんご", "バナナ"]
print(fruits[0])
print(len(fruits))
5. リストの操作
リストの追加・削除・スライス・反転ができます。内包表記を使うと簡潔に反復処理を書けます。
fruits.append("さくらんぼ")
fruits.insert(1, "キウイ")
fruits.remove("バナナ")
fruits.pop()
print(fruits[1:3])
print(fruits[::-1])
squares = [x*x for x in range(5)]
6. コンソール入出力
input() でユーザーから読み取り、print() で出力を表示します。
\n(改行文字)を使うか、print() を複数回呼び出すことで複数行を表示できます。
# 入力を読む
name = input("あなたの名前を入力してください: ")
print("こんにちは", name)
# 複数行を出力
print("1行目\n2行目\n3行目")
# あるいは print を複数回使う
print("A行")
print("B行")
print("C行")
7. 関数
関数はコードを整理し、再利用を可能にします。引数や戻り値を使いましょう。
def greet(name):
return "こんにちは " + name
print(greet("Alice"))
8. 辞書
キーと値のペアを保持します。キーは一意で、キーを使って値にアクセスします。
person = {"name": "Bob", "age": 25}
print(person["name"])
print(person.get("email", "未設定"))
9. 例外処理
try と except でエラーを捕捉し、適切に処理します。
try:
x = 1 / 0
except ZeroDivisionError:
print("0で割ることはできません")
10. ファイル入出力
open() を使ってファイルの読み書きを行います。
with open("data.txt", "w") as f:
f.write("こんにちは、世界")
with open("data.txt", "r") as f:
print(f.read())
11. 文字列操作
Pythonの文字列には、strip()、replace()、split() など強力なメソッドがあります。
text = " Hello World "
print(text.strip())
print(text.upper())
print(text.replace("Hello", "Hi"))
print(text.split())
12. クラスとオブジェクト
クラスで再利用可能な設計図を定義します。オブジェクトの初期化には __init__ を使います。
class Person:
def __init__(self, name):
self.name = name
def greet(self):
return "こんにちは、私は " + self.name
p = Person("Alice")
print(p.greet())
🐞 Pythonコードをオンラインでデバッグする方法
オンラインPythonデバッガーなら、PythonやIDEをインストールせずにロジックエラーを調査できます。サーバーモードでPython 3.10〜3.13を使用します。
- ランタイムメニューからサーバー版Pythonを選択します。
- 行番号の横をクリックしてブレークポイントを設定します。
- Debugを選択し、最初に一致するブレークポイントまで実行します。
- 現在行と変数を確認し、Continue、Step Over、Step Into、Step Outを使います。
- 終了するときはStopを選択します。
再現可能な小さなコードから始め、値が想定外になる直前にブレークポイントを置きましょう。サーバーモードではworkspaceのファイルやインストール済みライブラリも使えます。