XOR(排他的論理和)は、1つのニューロンでは解けないが、隠れ層を1つ持つネットワークなら解ける古典的な問題です。入力2つ、隠れニューロン2つ、出力1つで、すべて sigmoid(σ(z) = 1 / (1 + e^(-z)))のネットワークを、損失 L = (y - target)² で学習させてください。
学習データは、どのエポックでも常にこの順番で使います。
| 入力 | target |
|---|---|
| [0, 0] | 0 |
| [0, 1] | 1 |
| [1, 0] | 1 |
| [1, 1] | 0 |
各例について:
- 順伝播:a_j = σ(x₁ × hidden_weights[j][0] + x₂ × hidden_weights[j][1] + hidden_biases[j])、y = σ(a₁ × output_weights[0] + a₂ × output_weights[1] + output_bias)
- delta_out = 2 × (y - target) × y × (1 - y)、delta_j = delta_out × output_weights[j] × a_j × (1 - a_j)。この例での更新前の重みを使います
- 学習率 lr ですべてのパラメータを更新:output_weights[j] -= lr × delta_out × a_j、output_bias -= lr × delta_out、hidden_weights[j][i] -= lr × delta_j × x_i、hidden_biases[j] -= lr × delta_j
train_xor(hidden_weights, hidden_biases, output_weights, output_bias, learning_rate, epochs) を実装してください。
出力
学習後、入力 [0, 0]、[0, 1]、[1, 0]、[1, 1] に対するネットワークの予測 y を、この順番で返してください。
制約
0 ≤ epochs ≤ 5,000
0 < learning_rate ≤ 5
-2 ≤ 初期の各重みとバイアス ≤ 2
例
入力:
hidden_weights = [
[0.2, 0.8],
[0.9, -0.7]
]
hidden_biases = [0.0, 0.3]
output_weights = [-0.6, 0.4]
output_bias = 0.0
learning_rate = 1.5
epochs = 0
期待される出力:
[0.482451, 0.436972, 0.494378, 0.452729]
解説
0 エポックでは何も学習しないので、結果は初期の重みでの順伝播そのもので、約 [0.482, 0.437, 0.494, 0.453] です。学習前のネットワークはどの入力にもほぼ同じ答えを返します。
入力:
hidden_weights = [
[0.2, 0.8],
[0.9, -0.7]
]
hidden_biases = [0.0, 0.3]
output_weights = [-0.6, 0.4]
output_bias = 0.0
learning_rate = 1.5
epochs = 2000
期待される出力:
[0.015727, 0.982119, 0.985515, 0.013682]
解説
2,000 エポック後の予測は約 [0.016, 0.982, 0.986, 0.014] です。[0, 0] と [1, 1] では低く、[0, 1] と [1, 0] では高くなっています。ネットワークは XOR を学習しました。
参考資料
-
例 1 未実行入力:
hidden_weights = [ [0.2, 0.8], [0.9, -0.7] ] hidden_biases = [0.0, 0.3] output_weights = [-0.6, 0.4] output_bias = 0.0 learning_rate = 1.5 epochs = 0期待される出力:[0.482451, 0.436972, 0.494378, 0.452729]あなたの出力 -
例 2 未実行入力:
hidden_weights = [ [0.2, 0.8], [0.9, -0.7] ] hidden_biases = [0.0, 0.3] output_weights = [-0.6, 0.4] output_bias = 0.0 learning_rate = 1.5 epochs = 2000期待される出力:[0.015727, 0.982119, 0.985515, 0.013682]あなたの出力
提出時に非公開テスト4件も実行されます。 失敗したテストがあれば、そのテストが表示されます。チャレンジを解くとすべて見られます。
Run Swift Online
Write, run, and debug Swift code online using a command-line Swift environment. Manage multiple files, save your workspace, and share code without installing Xcode.
🍎 この Swift オンライン実行ツールについて
CodeUtility Swift Executor は、ブラウザ上で直接 Swift コードを書いて実行できるツールです - Xcode や SDK、macOS のセットアップは不要です。実際の Swift コンパイラを隔離されたサンドボックスで動かし、 正確でネイティブな Swift の挙動を提供します。
このツールは複数の Swift バージョン - 5.7、5.9、そして最新リリース - をサポートしており、新しい言語機能を試しつつ、既存の Swift コードベースとの互換性も維持できます。
Swift の文法学習、アルゴリズムのテスト、iOS・macOS・サーバーサイド Swift のコードを試す用途に最適で、 ローカルのツールやシミュレータをインストールする必要はありません。
すべてのスニペットはコンテナ化された Swift 環境で安全に実行され、実際のコンパイラからのフィードバックと安全な実行を保証します。
同じ実行環境で、複数ファイル対応エディター、分離された実行ターミナル、ランタイム別ライブラリ、永続ワークスペース、共有、リアルタイム共同作業を利用できます。
この実行環境の使い方
ランタイムを選択し、ファイルを開くか作成してコードを記述し、[実行]を選択します。出力はターミナルに表示されます。サインインしたユーザーは、ワークスペースにファイルを保存し、ライブラリをインストールして、共有を通じて共同作業できます。
- バージョンを選択して現在のファイルを編集するか、ワークスペース内の別のファイルを開きます。
- コードを実行し、求められた場合はターミナルに入力して、保存された実行履歴を確認します。
- 複数のコードスニペットが必要な作業では、ライブラリ、ワークスペースツール、共有、チャットを利用します。
💡 初心者向け Swift 基本ガイド
1. 変数と定数の宣言
Swift では変数に var、定数に let を使います。
var age = 30
let pi = 3.14159
var name = "Alice"
let isActive = true
// 定数は再代入できません
// pi = 3.14 // ❌ エラー
2. 条件分岐 (if / switch)
ロジックには if、else if、else、分岐が多い場合は switch を使います。
let number = 2
if number == 1 {
print("1")
} else if number == 2 {
print("2")
} else {
print("その他")
}
switch number {
case 1:
print("1")
case 2:
print("2")
default:
print("その他")
}
3. ループ
Swift は for-in、while、repeat-while のループをサポートしています。
for i in 0..<3 {
print(i)
}
var n = 3
while n > 0 {
print(n)
n -= 1
}
4. 配列
配列は値の順序付きコレクションを保持します。
var numbers = [10, 20, 30]
print(numbers[1])
5. 配列の操作
append や removeLast などのメソッドを使います。
var nums = [1, 2, 3]
nums.append(4)
nums.removeLast()
for n in nums {
print(n)
}
6. コンソール入出力
出力は print() を使います。入力は Swift Playgrounds や Xcode で別途対応が必要です。
let name = "Alice"
print("こんにちは、\(name)")
7. 関数
パラメータや戻り値を持つ再利用可能な関数を定義します。
func add(a: Int, b: Int) -> Int {
return a + b
}
print(add(a: 3, b: 4))
8. 辞書
辞書はキーと値のペアを保持します。
var ages = ["Alice": 30]
print(ages["Alice"] ?? 0)
9. エラーハンドリング
Swift では do-catch でエラー処理を行います。
enum MyError: Error {
case runtimeError(String)
}
do {
throw MyError.runtimeError("問題が発生しました")
} catch let error {
print(error)
}
10. ファイル入出力
ファイル操作には FileManager や String のメソッドを使います。
let text = "こんにちは、ファイル"
try text.write(toFile: "file.txt", atomically: true, encoding: .utf8)
let content = try String(contentsOfFile: "file.txt")
print(content)
11. 文字列操作
count、contains、uppercased() などのメソッドを使います。
let text = "Hello World"
print(text.count)
print(text.contains("World"))
print(text.uppercased())
12. クラスとオブジェクト
Swift は class と init を使った OOP をサポートしています。
class Person {
var name: String
init(name: String) {
self.name = name
}
func greet() {
print("こんにちは、\(name)です")
}
}
let p = Person(name: "Alice")
p.greet()
13. オプショナル
Swift では ? と ! でオプショナル値を扱います。
var name: String? = "Alice"
print(name ?? "不明")
if let unwrappedName = name {
print(unwrappedName)
}