すべてのチャレンジ
簡単 0件解決済み 正答率0%

活性化関数の導関数

sigmoid、ReLU、Leaky ReLU、tanh の各値での導関数を計算します。誤差逆伝播法が必要とする傾きです。

このチャレンジで学べること

  • よく使う活性化関数の傾きを計算する
  • シグモイドの出力を導関数に再利用する
  • 誤差逆伝播法に必要な部品をそろえる

問題

原文(英語)を表示

誤差逆伝播法では、勾配に各活性化関数の導関数を掛けます。activation_derivative(name, values) を実装し、すべての値での導関数を返してください。

name導関数
"sigmoid"s × (1 - s)、ただし s = 1 / (1 + e^(-x))
"relu"x > 0 なら 1、それ以外は 0
"leaky_relu"x > 0 なら 1、それ以外は 0.01
"tanh"1 - tanh(x)²

入力

name: "sigmoid"、"relu"、"leaky_relu"、"tanh" のいずれか。

values: 活性化関数への入力 x。

出力

各値での導関数を同じ順序で返してください。

制約

1 ≤ 長さ ≤ 1,000

-50 ≤ 各値 ≤ 50

例

例 1
入力:
name = "sigmoid"
values = [0.0, 2.0]

期待される出力:
expected = [0.25, 0.104994]
入力:
std::string name = "sigmoid";
std::vector<double> values = {0.0, 2.0};

期待される出力:
std::vector<double> expected = {0.25, 0.104994};
入力:
string name = "sigmoid";
double[] values = new double[] {0.0, 2.0};

期待される出力:
double[] expected = new double[] {0.25, 0.104994};

解説

0 では s = 0.5 で、傾きは 0.5 × 0.5 = 0.25。sigmoid が最も急な点です。2 では s ≈ 0.880797 で、傾きは約 0.104994 です。

例 2
入力:
name = "relu"
values = [-3.0, 0.0, 4.5]

期待される出力:
expected = [0.0, 0.0, 1.0]
入力:
std::string name = "relu";
std::vector<double> values = {-3.0, 0.0, 4.5};

期待される出力:
std::vector<double> expected = {0.0, 0.0, 1.0};
入力:
string name = "relu";
double[] values = new double[] {-3.0, 0.0, 4.5};

期待される出力:
double[] expected = new double[] {0.0, 0.0, 1.0};

解説

ReLU は x ≤ 0 で平ら(傾き 0)、x > 0 で傾き 1 なので、結果は [0, 0, 1] です。

参考資料

この課題はCodeUtility用に調整されています。上記の説明と制約に従ってください。

他の人の解答から学ぶ

コミュニティの解答

まだ公開された解答がありません。この課題を解いて最初の解答を共有しましょう。