まず、従来のMLPレキシコンのいくつかの小さな点(インターネット検索などに役立つ可能性があります):「sigmoid」と「tanh」は「出力層」ではなく、通常「活性化関数」と呼ばれる関数です。活性化関数の戻り値は、実際には各レイヤーからの出力ですが、出力レイヤー自体ではありません(確率も計算されません)。
さらに、あなたの質問は2つの「代替」(「シグモイドとタン」)の間の選択を述べていますが、それらは実際には代替ではなく、「シグモイド関数」という用語は、双曲線を含む関数のクラスの一般的/非公式な用語です参照するタンジェント('tanh')。
「シグモイド」という用語は、おそらく関数の特徴的な形状に起因します。戻り値(y)は、x値に関係なく、2つの漸近値の間に制約されます。関数の出力は通常、これら2つの値が-1と1(または0と1)になるように正規化されます。(ちなみに、この出力動作は明らかに、発火する(+1)または発火しない(-1)生物学的ニューロンに触発されています)。シグモイド関数の主要なプロパティを見ると、フィードフォワード、バックプロパゲーションニューラルネットワークの活性化関数として理想的に適している理由がわかります。(i)実数値で微分可能、(ii)変曲点が1つだけ、( iii)一対の水平方向の漸近線を持っている。
同様に、シグモイド関数は、バックプロパゲーションを使用して解決されるFFニューラルネットワークで活性化関数(別名「押しつぶし関数」)として使用される関数の1つのカテゴリです。トレーニングまたは予測中に、入力の加重和(特定のレイヤーについて、一度に1つのレイヤー)が、そのレイヤーの出力を返すアクティブ化関数への引数として渡されます。活性化関数として明らかに使用されている関数の別のグループは、区分的線形関数です。ステップ関数は、PLFのバイナリバリアントです。
def step_fn(x) :
if x <= 0 :
y = 0
if x > 0 :
y = 1
(実際的な理由から、ステップ関数が活性化関数のもっともらしい選択であるとは思えませんが、おそらくそれはNN操作での活性化関数の目的を理解するのに役立ちます。)
可能な活性化関数の数は無制限だと思いますが、実際にはほんの一握りしか見えません。実際、圧倒的多数のケースを占めるのは2つだけです(どちらもシグモイドです)。ここに(Pythonで)あるので、主要な選択基準が実用的なものであるとすると、自分で実験することができます。
# logistic function
def sigmoid2(x) :
return 1 / (1 + e**(-x))
# hyperbolic tangent
def sigmoid1(x) :
return math.tanh(x)
活性化関数を選択する際に考慮すべき要素は何ですか?
最初に、関数は目的の動作を提供する必要があります(シグモイド形状から、またはシグモイド形状によって証明されるように)。第二に、関数は微分可能でなければなりません。これはバックプロパゲーションの要件です。これは、トレーニング中に隠れ層の値を「埋める」ために使用される最適化手法です。
たとえば、双曲線正接の導関数は次のようになります(出力に関しては、通常の記述方法です):
def dsigmoid(y) :
return 1.0 - y**2
これらの2つの要件を超えて、ある機能を別の機能よりも効率的にトレーニングするのは、ネットワークをどれだけ効率的にトレーニングするかです。つまり、最も少ないエポックで収束(極小誤差に達する)を引き起こすのはどれですか。
#--------編集(下記のOPのコメントを参照)---------#
私が理解したかどうかはよくわかりません-コードなしでNNの詳細を伝えるのは難しい場合があるので、この条件に従って問題ないことを言っておく必要があります:NNに予測させたいことは、トレーニング中に使用される従属変数。したがって、たとえば、2つの状態(たとえば、0、1)を単一の従属変数(テスト/本番データから明らかに欠落している)として使用してNNをトレーニングする場合、「予測モード」で実行するとNNが返されます。 (トレーニング後、または有能なウェイトマトリックスを使用)。