【MQL5】ENUM_ACTIVATION_FUNCTION列挙体について

Uncategorized

ENUM_ACTIVATION_FUNCTION列挙体(活性化関数の種類を番号でまとめた型)は、vectorのActivationメソッド(ベクトルに活性化関数を適用するメソッド)やDerivativeメソッド(活性化関数の導関数を求めるメソッド)で使う識別子の集まりです。ニューラルネットワーク(いくつもの数値計算の層を重ねて入力から出力を求める仕組み)で、どの活性化関数を使うかを選ぶために利用します。

ここでは、各識別子ごとに、どのような変換をする関数なのかをイメージしやすい形で説明します。


スポンサーリンク
スポンサーリンク

AF_ELU

AF_ELUは、ELUという活性化関数(Exponential Linear Unitという名前の関数)を表します。

入力がゼロ以上のときは、ほぼ直線的に値を通します。入力がゼロ未満のときは、指数関数(数を指数で持ち上げる計算)を使って、緩やかにマイナス方向へ値が伸びる形になります。負の値を完全には切り捨てず、少しだけ残す性質があるため、負の領域でも出力が変化し、学習の変化量が極端に小さくなりにくい形になります。


AF_EXP

AF_EXPは、指数関数を使った活性化を表します。

入力が大きくなるほど、出力が非常に急激に大きくなる性質があります。入力の差を強く強調したい場合には役に立ちますが、値が大きくなり過ぎると、計算機が扱える範囲を超えやすくなります。そのため、実際に使うときには、あらかじめ入力データを小さめの範囲におさめておくなど、値の大きさに注意する必要があります。


AF_GELU

AF_GELUは、GELUという活性化関数(Gaussian Error Linear Unitという名前の関数)を表します。

入力が大きいときには出力をそのまま通しやすくし、小さい値やマイナスの値は、滑らかなカーブで抑えめにします。ガウス分布(山型の確率分布)に基づいた形をしていて、角のない滑らかな曲線になります。急に折れ曲がることがないので、連続的な変化を扱いたい場合に向いた性質を持ちます。


AF_HARD_SIGMOID

AF_HARD_SIGMOIDは、ハードシグモイドという活性化関数を表します。

シグモイド関数(S字型のカーブで、出力をおおよそ0から1の範囲におさえる関数)を、直線と区切りで近似した形だと考えられます。完全なシグモイドより計算の手順が単純な代わりに、出力の範囲や「中央付近では緩やかに変化して、端の方ではほぼ一定になる」という大まかな性質は維持されます。出力を0から1の範囲におさめつつ、処理を軽くしたいときに使えます。


AF_LINEAR

AF_LINEARは、線形関数を表します。

線形関数は、入力xに対して出力がa×x+bのような一次式になる関数です。活性化関数として使うときは、入力に対して曲がったカーブを作らず、直線的な変換だけを行うという意味になります。

出力層で将来の価格変化量などの連続値をそのまま扱いたい場合や、線形回帰(直線でデータを近似する手法)に近い挙動を意識して使いたい場合に選びます。


AF_LRELU

AF_LRELUは、Leaky ReLUという活性化関数(Leaky Rectified Linear Unitという名前の関数)を表します。

基本的なReLUでは、入力が0未満のときに出力を完全に0にしますが、Leaky ReLUでは、負の領域でもわずかな傾きを残し、入力がマイナスでも少しだけ出力が変化するようにします。この性質により、負の領域でもパラメータが更新される余地が残り、学習が止まりにくい形になります。


AF_RELU

AF_RELUは、ReLUという活性化関数(Rectified Linear Unitという名前の関数)を表します。

基本的なルールは、入力が0以上のときはそのまま出力し、0未満のときは0を出力するというものです。マイナスの値を0にそろえることで、出力に多くの0を含む表現になりやすく、計算の扱いがシンプルになります。その一方で、負の領域では出力が変化しないため、その部分の勾配(変化の度合い)が0になりやすいという特徴もあります。


AF_SELU

AF_SELUは、SELUという活性化関数(Scaled Exponential Linear Unitという名前の関数)を表します。

ELUをベースにスケーリング(一定の係数で伸び縮みさせること)した形で、ネットワーク内部の値の平均や分散が、学習の途中でも一定の範囲におさまりやすくなる性質を狙った関数です。適切な初期値を組み合わせると、層を重ねても内部の値が極端に大きくなったり小さくなったりしにくいとされています。深いネットワークで、内部の数値の大きさを安定させたいときに使う候補になります。


AF_SIGMOID

AF_SIGMOIDは、シグモイド関数を表します。

シグモイド関数は、S字型の滑らかなカーブで、出力を0から1の範囲におさえる性質があります。入力が大きくプラスになるほど出力は1に近づき、大きくマイナスになるほど0に近づきます。出力を確率のようなイメージで扱えるため、二値分類(上昇か下降かなど、二つの状態に分ける問題)の出力層でよく用いられます。

ただし、入力の絶対値が大きいときには、出力が0か1に近づいて勾配がほとんど0になり、深いネットワークでは学習が進みにくくなることがあります。


AF_SOFTMAX

AF_SOFTMAXは、ソフトマックス関数を表します。

ソフトマックス関数は、入力ベクトルの各成分を指数関数で変換し、その合計で割ることで、出力の総和が1になるように調整します。この結果、出力ベクトルの各成分を「それぞれのクラスに属する比率」や「確率」に近いイメージで扱えるようになります。

売り・買い・様子見といった複数のカテゴリから一つを選びたいときに、中で最も値が大きい要素の位置を取ることで、モデルが選んだカテゴリを自然に取り出せます。


AF_SOFTPLUS

AF_SOFTPLUSは、ソフトプラスという活性化関数を表します。

ReLUと似た性質を持ちますが、入力が0のあたりで急に折れ曲がることはなく、滑らかなカーブでゼロから離れていきます。入力がとても大きいときにはほぼ直線的に増え、入力が小さいときには0に近い値を取りますが、完全に0にはなりません。

ReLUに近い動きを保ちながら、導関数も含めて全体を滑らかにしたい場合に選びやすい関数です。


AF_SOFTSIGN

AF_SOFTSIGNは、ソフトサインという活性化関数を表します。

シグモイドと同じようにS字型のカーブを持ちますが、出力の範囲はマイナス1から1の間になり、数式が比較的扱いやすい形になっています。入力が大きくプラスまたはマイナスになると、それぞれ1とマイナス1に近づきますが、その近づき方がなだらかで、勾配の変化も穏やかです。

シグモイドに似た性質を持ちながら、計算のしやすさや安定性を重視したい場面で検討できます。


AF_SWISH

AF_SWISHは、Swishという活性化関数を表します。

Swishは、入力xに対して、xにシグモイドに似た重みを掛け合わせる形の関数です。入力が大きいときにはほぼ直線的に増え、小さいときやマイナスのときには、値を抑えつつも完全には切り捨てず、滑らかな曲線で変化します。ReLUとシグモイドの性質を組み合わせたような動きをします。

価格データのようにノイズを含む連続値を扱いながら、出力をなめらかに変化させたいときに向いた性質を持ちます。


AF_TANH

AF_TANHは、双曲線正接関数(tanhと呼ばれる数学関数)を表します。

tanh関数は、出力がマイナス1から1の範囲におさまるS字型の関数です。入力が0のときに出力も0になり、プラス方向とマイナス方向で対称な形をしています。シグモイドに似ていますが、中心が0になる点が違いです。

プラスとマイナスの両方の値を対称に扱いたい場合や、出力の平均値を0付近に保ちたい場合に向いています。価格の変化量のように、上方向と下方向の両方が重要なときに使いやすい性質です。


AF_TRELU

AF_TRELUは、Thresholded ReLUという活性化関数を表します。

基本的なReLUでは、しきい値(値を切り替える境目)が0ですが、Thresholded ReLUでは、このしきい値を任意の値に設定できる形になります。入力がそのしきい値より小さいときには0になり、それ以上のときには直線的に値を通します。

一定以上の強さを持つシグナルだけを通したい場合、たとえば値動きが小さいときはノイズとして扱い、大きな値動きがあったときだけ強く反応させたいといった考え方とよくかみ合う性質を持っています。


ENUM_ACTIVATION_FUNCTION列挙体の各識別子を使い分けることで、vectorのActivationメソッドやDerivativeメソッドを通じて、ニューラルネットワーク部分の挙動を細かく調整できます。EAを設計するときには、入力データの特徴と、欲しい出力のイメージに合わせて、どの識別子を選ぶかを検討していくことになります。

コメント

タイトルとURLをコピーしました