Python の ReLU 関数の導関数
ReLU は Rectified Linear Activation Function の略で、ディープ ラーニングの範囲で最も一般的な活性化関数の代替手段です。 ReLU は、入力値が正の場合に入力を同じものとして出力する線形関数の一部です。 そうでない場合、出力はゼロになります。
この記事では、Python プログラミング言語を使用して ReLU 関数の派生を行う方法を示します。
Python で ReLU 関数を実装する
数学関数として、ReLU 関数を次のように定義できます。
f(x) = max(0,x)
この関数は x
について線形であり、すべての負の値に対してゼロを出力します。
次の疑似コードは、ReLU 関数を表しています。
if input > 0:
return input
else:
return 0
上記の疑似コードのように、次のように ReLU 関数の実装を構築できます。
import numpy as nm
def relu_func(x):
return nm.maximum(0, x)
print(relu_func(2))
print(relu_func(0))
print(relu_func(0.1))
print(relu_func(-3))
この例を考えると、パラメータ x
で関数 relu_func
を定義しています。 この関数は、ReLU 関数を考慮した出力を返します。
relu_func
関数に引数として 1つの整数を一度に渡しました。
maximum()
関数は最高値を返します。 整数が 0 より大きい場合、入力と同じ整数が出力されます。 そうでない場合は、ゼロを出力します。
したがって、上記のコードで実装した ReLU 関数は、任意の単一の整数で機能します。 numpy
配列でも。
次のように出力を取得できます。
Python の ReLU 関数の導関数
それ以外の場合、ReLU 関数の導関数は ReLu の勾配を呼び出します。 関数の導関数が傾きです。
たとえば、y= ReLu(x)
のグラフを作成し、x
が 0 より大きい場合、勾配は 1
です。
x
が 0 未満の場合、勾配は 0
です。 x = 0
の場合、導関数は存在しません。
ReLu 関数の数学的導関数は、次のように定義できます。
f'(x) = 1, x >= 0
= 0, x < 0
ReLu 関数の導関数をグラフに適用できます。 それでは、次の例を見てみましょう。
# %matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
# define relu function
def relu_func(z):
return np.maximum(0, z)
z = np.arange(-3, 5, 1)
print(z)
Y = relu_func(z)
print(Y)
plt.plot(z, Y, "o-")
plt.xlabel("X")
plt.ylabel("F(x)")
plt.grid()
上記のコードを考慮して、z
パラメーターを渡すrelu_func
として定義されています。 この関数の下で、relu
関数と、x 軸の範囲を取得するために定義された z
変数を返します。
また、パラメーター付きの relu_func
を渡すように定義された Y
変数も定義されています。 relu_func(Z)
関数は、すべての z
値の reLU を計算します。
したがって、すべての負の値はゼロを表します。 x 軸のプロットは X
で、y 軸のプロットは F(x)
です。
次のプロットは、上記のコードから取得した出力です。
前述のように、導関数は、特定の点でのグラフの傾きを意味します。 したがって、x=1
の傾きは 1 です。
0 より大きい他のすべてのポイントは 1 の勾配を取得します。しかし、x=-3
の勾配は何ですか?
その点には勾配がないことがわかります。
0 未満の他のすべてのポイントは、勾配 0 を意味する勾配なしを取得します。したがって、これは ReLu 関数の派生物であり、組み込みの Python プログラミング言語と呼ばれます。
まとめ
この記事では、Python で ReLu 関数を実装する方法を示し、主に ReLu 派生関数の実装方法について説明します。 深層学習では ReLU 関数がよく使われます。
しかし、それにはいくつかの問題があります。 たとえば、入力値が 0 未満の場合、出力は 0 になります。
したがって、ニューラル ネットワークは一部の作業を続行できません。 これに対する解決策として、主に Leaky ReLU 関数を使用します。
Nimesha is a Full-stack Software Engineer for more than five years, he loves technology, as technology has the power to solve our many problems within just a minute. He have been contributing to various projects over the last 5+ years and working with almost all the so-called 03 tiers(DB, M-Tier, and Client). Recently, he has started working with DevOps technologies such as Azure administration, Kubernetes, Terraform automation, and Bash scripting as well.