ARCS6 AR6-REV.24062600
読み取り中…
検索中…
一致する文字列を見つけられません
ActivationFunctions.hh
[詳解]
1
8//
9// Copyright (C) 2011-2021 Yokokura, Yuki
10// This program is free software;
11// you can redistribute it and/or modify it under the terms of the FreeBSD License.
12// For details, see the License.txt file.
13
14#ifndef ACTIVATIONFUNCTIONS
15#define ACTIVATIONFUNCTIONS
16
17#include <cassert>
18#include "Matrix.hh"
19
20// ARCS組込み用マクロ
21#ifdef ARCS_IN
22 // ARCSに組み込まれる場合
23 #include "ARCSassert.hh"
24 #include "ARCSeventlog.hh"
25#else
26 // ARCSに組み込まれない場合
27 #define arcs_assert(a) (assert(a))
28 #define PassedLog()
29 #define EventLog(a)
30 #define EventLogVar(a)
31#endif
32
33namespace ARCS { // ARCS名前空間
35enum class ActvFunc {
36 STEP,
37 IDENTITY,
38 SIGMOID,
39 ReLU,
40 TANH,
41 SOFTMAX
42};
43
46 public:
50 static double Step(double u){
51 double ret;
52 if(0 <= u){
53 ret = 1;
54 }else{
55 ret = 0;
56 }
57 return ret;
58 }
59
63 static double Identity(double u){
64 return u;
65 }
66
70 static double Sigmoid(double u){
71 return 1.0/(1.0 + exp(-u));
72 }
73
77 static double DerivativeSigmoid(double u){
78 return (1.0 - Sigmoid(u))*Sigmoid(u);
79 }
80
84 static double ReLU(double u){
85 double ret;
86 if(0 <= u){
87 ret = u;
88 }else{
89 ret = 0;
90 }
91 return ret;
92 }
93
97 static double DerivativeReLU(double u){
98 return Step(u);
99 }
100
105 template <size_t M>
107 const Matrix<1,1> SigExp = sumcolumn(expe(u)); // 要素ごとにexpを通して縦方向に加算
108 return expe(u)/(SigExp.GetElement(1,1)); // 要素ごとに加算結果で除算して全体に対しての割合を返す
109 }
110
117 template <ActvFunc T, size_t N, size_t M>
118 static void f(const Matrix<N,M>& U, Matrix<N,M>& Y){
119 // 活性化関数の種類の設定に従って呼ぶ関数をコンパイル時に変える
120 if constexpr(T == ActvFunc::STEP){
121 // ステップ活性化関数の場合
122 // 行列の要素ごとに活性化関数を掛ける
123 for(size_t n = 1; n <= N; ++n){
124 for(size_t m = 1; m <= M; ++m){
125 Y.SetElement(n, m, Step(U.GetElement(n, m)));
126 }
127 }
128 }
129 if constexpr(T == ActvFunc::IDENTITY){
130 // 恒等活性化関数の場合
131 // 行列の要素ごとに活性化関数を掛ける
132 for(size_t n = 1; n <= N; ++n){
133 for(size_t m = 1; m <= M; ++m){
134 Y.SetElement(n, m, Identity(U.GetElement(n, m)));
135 }
136 }
137 }
138 if constexpr(T == ActvFunc::SIGMOID){
139 // シグモイド活性化関数の場合
140 // 行列の要素ごとに活性化関数を掛ける
141 for(size_t n = 1; n <= N; ++n){
142 for(size_t m = 1; m <= M; ++m){
143 Y.SetElement(n, m, Sigmoid(U.GetElement(n, m)));
144 }
145 }
146 }
147 if constexpr(T == ActvFunc::TANH){
148 // tanh活性化関数の場合
149 // 行列の要素ごとにtanh関数を掛ける
150 Y = tanhe(U);
151 }
152 if constexpr(T == ActvFunc::ReLU){
153 // ReLU活性化関数の場合
154 // 行列の要素ごとに活性化関数を掛ける
155 for(size_t n = 1; n <= N; ++n){
156 for(size_t m = 1; m <= M; ++m){
157 Y.SetElement(n, m, ReLU(U.GetElement(n, m)));
158 }
159 }
160 }
161 if constexpr(T == ActvFunc::SOFTMAX){
162 // ソフトマックス関数の場合
163 // 行列の縦ベクトルごとに活性化関数を掛ける
164 for(size_t n = 1; n <= N; ++n){
165 setcolumn(Y, Softmax(getcolumn(U, n)), n);
166 }
167 }
168 }
169
176 template <ActvFunc T, size_t N, size_t M>
177 static void fp(const Matrix<N,M>& U, Matrix<N,M>& Y){
178 // 活性化関数の種類の設定に従って呼ぶ関数をコンパイル時に変える
179 if constexpr(T == ActvFunc::STEP){
180 // ステップ活性化関数の場合
181 for(size_t n = 1; n <= N; ++n){
182 for(size_t m = 1; m <= M; ++m){
183 Y.SetElement(n, m, 0);
184 }
185 }
186 }
187 if constexpr(T == ActvFunc::IDENTITY){
188 // 恒等活性化関数の場合
189 for(size_t n = 1; n <= N; ++n){
190 for(size_t m = 1; m <= M; ++m){
191 Y.SetElement(n, m, 1);
192 }
193 }
194 }
195 if constexpr(T == ActvFunc::SIGMOID){
196 // シグモイド活性化関数の場合
197 for(size_t n = 1; n <= N; ++n){
198 for(size_t m = 1; m <= M; ++m){
199 Y.SetElement(n, m, DerivativeSigmoid(U.GetElement(n, m)));
200 }
201 }
202 }
203 if constexpr(T == ActvFunc::TANH){
204 // tanh活性化関数の場合
205 Y = Matrix<N,M>::ones() - (U & U);
206 }
207 if constexpr(T == ActvFunc::ReLU){
208 // ReLU活性化関数の場合
209 for(size_t n = 1; n <= N; ++n){
210 for(size_t m = 1; m <= M; ++m){
211 Y.SetElement(n, m, DerivativeReLU(U.GetElement(n, m)));
212 }
213 }
214 }
215 if constexpr(T == ActvFunc::SOFTMAX){
216 // ソフトマックス関数は内部層では非対応
217 arcs_assert(false && "Softmax is not supported in internal layers.");
218 }
219 }
220
221 private:
222 ActivationFunctions() = delete;
224 ~ActivationFunctions() = delete;
226 const ActivationFunctions& operator=(const ActivationFunctions&) = delete;
227};
228}
229
230#endif
231
ARCS イベントログクラス
ARCS用ASSERTクラス
#define arcs_assert(a)
ARCS用assertマクロ a : assert条件
Definition ARCSassert.hh:17
行列/ベクトル計算クラス(テンプレート版)
ActvFunc
活性化関数のタイプの定義
Definition ActivationFunctions.hh:35
@ TANH
tanh関数
@ SOFTMAX
ソフトマックス関数
@ STEP
ステップ関数
@ SIGMOID
シグモイド関数
@ IDENTITY
恒等関数
@ ReLU
ReLU関数
活性化関数
Definition ActivationFunctions.hh:45
static Matrix< 1, M > Softmax(const Matrix< 1, M > &u)
Softmax関数
Definition ActivationFunctions.hh:106
static double ReLU(double u)
ReLU活性化関数
Definition ActivationFunctions.hh:84
static double Step(double u)
ステップ活性化関数
Definition ActivationFunctions.hh:50
static double DerivativeSigmoid(double u)
シグモイド関数活性化関数の微分
Definition ActivationFunctions.hh:77
static double Identity(double u)
恒等活性化関数
Definition ActivationFunctions.hh:63
static double Sigmoid(double u)
シグモイド関数活性化関数
Definition ActivationFunctions.hh:70
static void f(const Matrix< N, M > &U, Matrix< N, M > &Y)
活性化関数
Definition ActivationFunctions.hh:118
static double DerivativeReLU(double u)
ReLU活性化関数の微分
Definition ActivationFunctions.hh:97
static void fp(const Matrix< N, M > &U, Matrix< N, M > &Y)
活性化関数の微分
Definition ActivationFunctions.hh:177
行列/ベクトル計算クラス(テンプレート版)
Definition Matrix.hh:44
constexpr TT GetElement(size_t n, size_t m) const
指定した要素番号の値を返す関数
Definition Matrix.hh:489
static constexpr Matrix ones(void)
m行n列の要素がすべて1の行列を返す関数
Definition Matrix.hh:655
constexpr void SetElement(size_t n, size_t m, TT val)
指定した要素番号に値を設定する関数
Definition Matrix.hh:480