誤差逆伝播法は、出力から入力へ向かって層ごとに連鎖律を適用します。ネットワークは n 個の入力、h 個の隠れニューロン、1つの出力を持ち、すべて sigmoid(σ(z) = 1 / (1 + e^(-z)))を使います。
- 隠れ層:a_j = σ(inputs · hidden_weights[j] + hidden_biases[j])
- 出力:y = σ(a · output_weights + output_bias)
- 損失:L = (y - target)²
勾配:
- delta_out = 2 × (y - target) × y × (1 - y)
- 出力層:dL/doutput_weights[j] = delta_out × a_j、dL/doutput_bias = delta_out
- delta_j = delta_out × output_weights[j] × a_j × (1 - a_j)
- 隠れ層:dL/dhidden_weights[j][i] = delta_j × inputs[i]、dL/dhidden_biases[j] = delta_j
backprop_gradients(inputs, hidden_weights, hidden_biases, output_weights, output_bias, target) を実装してください。
出力
h + 1 行の行列を返してください。
- 行 j(各隠れニューロン j について順番に):
hidden_weights[j]の n 個の勾配、続いてhidden_biases[j]の勾配。 - 最後の行:
output_weightsの h 個の勾配、続いてoutput_biasの勾配。
制約
1 ≤ n, h ≤ 20
-5 ≤ 各入力、重み、バイアス ≤ 5
0 ≤ target ≤ 1
例
入力:
inputs = [1.0]
hidden_weights = [
[0.0]
]
hidden_biases = [0.0]
output_weights = [0.0]
output_bias = 0.0
target = 1.0
期待される出力:
[
[0.0, 0.0],
[-0.125, -0.25]
]
解説
a = σ(0) = 0.5、y = σ(0) = 0.5。delta_out = 2 × (0.5 - 1) × 0.25 = -0.25。出力の行:[-0.25 × 0.5, -0.25] = [-0.125, -0.25]。delta_1 = -0.25 × 0 × 0.25 = 0 なので、隠れ層の行は [0, 0] です。出力の重みが 0 だと勾配が伝わりません。
入力:
inputs = [1.0, 0.0]
hidden_weights = [
[0.0, 1.0],
[0.0, -1.0]
]
hidden_biases = [0.0, 0.0]
output_weights = [1.0, 1.0]
output_bias = -1.0
target = 0.0
期待される出力:
[
[0.0625, 0.0, 0.0625],
[0.0625, 0.0, 0.0625],
[0.125, 0.125, 0.25]
]
解説
2つの隠れ値はどちらも σ(0) = 0.5 なので、y = σ(0.5 + 0.5 - 1) = 0.5、delta_out = 2 × 0.5 × 0.25 = 0.25。出力の行:[0.125, 0.125, 0.25]。各 delta_j = 0.25 × 1 × 0.25 = 0.0625 となり、隠れ層の行は [0.0625, 0, 0.0625] です(2番目の入力は 0)。
参考資料
-
例 1 未実行入力:
inputs = [1.0] hidden_weights = [ [0.0] ] hidden_biases = [0.0] output_weights = [0.0] output_bias = 0.0 target = 1.0期待される出力:[ [0.0, 0.0], [-0.125, -0.25] ]あなたの出力 -
例 2 未実行入力:
inputs = [1.0, 0.0] hidden_weights = [ [0.0, 1.0], [0.0, -1.0] ] hidden_biases = [0.0, 0.0] output_weights = [1.0, 1.0] output_bias = -1.0 target = 0.0期待される出力:[ [0.0625, 0.0, 0.0625], [0.0625, 0.0, 0.0625], [0.125, 0.125, 0.25] ]あなたの出力
提出時に非公開テスト4件も実行されます。 失敗したテストがあれば、そのテストが表示されます。チャレンジを解くとすべて見られます。
Online Java Compiler
Write, compile, run, and debug Java code online in a full-featured browser IDE. Work with multiple files, save your workspace, and share or collaborate in real time - no setup required.
☕ このJavaオンライン実行ツールについて
CodeUtility Java Executorは、ブラウザ上で直接Javaプログラムを記述・実行できるツールです - インストールやJDKの設定、IDEは不要です。安全なサンドボックス上で動作し、実際のJavaランタイム バージョン8、11、17、21、そして最新に対応しています。
このツールは、本物のjavacコンパイラとJavaランタイム環境をクラウドで使用してコードをコンパイル・実行します。
そのため、クラスやメソッド、ロジックをローカルとまったく同じ挙動でテストできます。
オブジェクト指向の練習、面接対策、統合前のスニペット検証など、あらゆる用途で CodeUtility Java Executorは高速かつ信頼できる実行環境を提供し、どんなデバイスからでもすぐに本物のJavaコードを実行できます。
同じ実行環境で、複数ファイル対応エディター、分離された実行ターミナル、ランタイム別ライブラリ、永続ワークスペース、共有、リアルタイム共同作業を利用できます。
この実行環境の使い方
ランタイムを選択し、ファイルを開くか作成してコードを記述し、[実行]を選択します。出力はターミナルに表示されます。サインインしたユーザーは、ワークスペースにファイルを保存し、ライブラリをインストールして、共有を通じて共同作業できます。
- バージョンを選択して現在のファイルを編集するか、ワークスペース内の別のファイルを開きます。
- コードを実行し、求められた場合はターミナルに入力して、保存された実行履歴を確認します。
- 複数のコードスニペットが必要な作業では、ライブラリ、ワークスペースツール、共有、チャットを利用します。
💡 上のエディタで試せるJavaの基本とサンプル
1. 変数と定数の宣言
Javaでは各変数の型を宣言する必要があります。定数にはfinalを使います。
int age = 30;
double pi = 3.14159;
char grade = 'A';
String name = "Alice";
boolean isActive = true;
// 定数
final int MAX_USERS = 100;
final String COMPANY = "CodeUtility";
2. 条件分岐(if / switch)
制御フローにはif、else if、switchを使います。
int x = 2;
if (x == 1) {
System.out.println("1");
} else if (x == 2) {
System.out.println("2");
} else {
System.out.println("その他");
}
switch (x) {
case 1:
System.out.println("1");
break;
case 2:
System.out.println("2");
break;
default:
System.out.println("その他");
}
3. ループ
繰り返しにはfor、while、do-whileを使います。
for (int i = 0; i < 3; i++) {
System.out.println(i);
}
int n = 3;
while (n > 0) {
System.out.println(n);
n--;
}
4. 配列
配列は同じ型の要素を固定長で保持します。
int[] numbers = {10, 20, 30};
System.out.println(numbers[1]);
5. ArrayListの操作
ArrayListは可変長のリストに使います。
import java.util.ArrayList;
ArrayList<Integer> nums = new ArrayList<>();
nums.add(1);
nums.add(2);
nums.add(3);
nums.remove(Integer.valueOf(2));
for (int num : nums) {
System.out.print(num + " ");
}
6. コンソール入出力
入力にはScanner、出力にはSystem.outを使います。
import java.util.Scanner;
Scanner scanner = new Scanner(System.in);
System.out.print("お名前を入力してください: ");
String name = scanner.nextLine();
System.out.println("こんにちは、" + name);
7. メソッド
戻り値の型と引数を指定してメソッドを定義します。
public static int add(int a, int b) {
return a + b;
}
System.out.println(add(3, 4));
8. HashMap
HashMapはキーと値のペアを格納するために使います。
import java.util.HashMap;
HashMap<String, Integer> ages = new HashMap<>();
ages.put("Alice", 30);
System.out.println(ages.get("Alice"));
9. 例外処理
実行時例外はtryとcatchで処理します。
try {
throw new Exception("問題が発生しました");
} catch (Exception e) {
System.out.println(e.getMessage());
}
10. ファイル入出力
ファイル操作にはjava.nio.fileのFilesとPathsを使います。
import java.nio.file.*;
import java.io.IOException;
Files.writeString(Paths.get("file.txt"), "こんにちは、ファイル");
String content = Files.readString(Paths.get("file.txt"));
System.out.println(content);
11. 文字列操作
Javaの文字列はlength()、substring()、contains()など多くのメソッドをサポートします。
String text = "Hello World";
System.out.println(text.length());
System.out.println(text.substring(0, 5));
System.out.println(text.contains("World"));
12. クラスとオブジェクト
Javaはクラスとインスタンスを用いたオブジェクト指向プログラミングをサポートします。
class Person {
String name;
Person(String name) {
this.name = name;
}
void greet() {
System.out.println("こんにちは、私は " + name);
}
}
Person p = new Person("Alice");
p.greet();