活性化関数のソースを表示
←
活性化関数
ナビゲーションに移動
検索に移動
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループに属する利用者のみが実行できます:
登録利用者
。
このページのソースの閲覧やコピーができます。
{{pathnav|ニューラルネットワーク|frame=1}} '''活性化関数'''(かっせいかかんすう、{{lang-en-short|activation function}})もしくは'''伝達関数'''(でんたつかんすう、{{lang-en-short|transfer function}})とは、[[ニューラルネットワーク]]のニューロンにおける、入力のなんらかの合計(しばしば、[[線型性|線形]]な重み付け総和)から、出力を決定するための関数で、非線形な関数とすることが多い。 == 概要 == よく使われているモデルでは、[[人工神経|人工ニューロン]]は1つ以上の入力を受け取り(1つ以上の[[樹状突起]]に相当)、それらの重み付け総和から、活性化関数を通して、出力を生成する。 :[[ファイル:Artificial neuron-2.gif|450x450px]] 数式では、以下の<math>\varphi</math>が活性化関数。 :<math>y = \varphi \left( \sum_{i=1}^m w_{i} x_i + b \right)</math> 古典的には[[ヘヴィサイドの階段関数|ステップ関数]]が提案された。他にもいろいろと考えることはできる。1986年のバックプロパゲーションの発表以降は[[シグモイド関数]]が最も一般的だった。現在は[[正規化線形関数|ReLU]]([[ランプ関数]])の方が良いと言われる<ref name="nature201505">{{cite journal |author=Yann LeCun |author2=Yoshua Bengio |author3=Geoffrey Hinton |title=Deep learning |journal=Nature |date=2015-05-28 |volume=521 |issue=7553 |pages=436-444 |doi=10.1038/nature14539 }}</ref>。活性化関数は[[単調写像|単調増加関数]]が使われる事が多い。必ずしもそうしなければいけないという物でもなく[[動径基底関数]]なども使われる。 ==種類== 人工神経の活性化関数は、ネットワークを強化または単純化するような特性を持つものが選ばれる。実際、線型伝達関数を使った[[多層パーセプトロン]]には、全く等価な単層ネットワークが必ず存在する。したがって、多層ネットワークの利点を生かすには非線形関数が必須である。 以下ステップ関数と線形結合の説明では、人工神経への全入力の重み付けされた総和を ''u'' で表し、入力数を ''n'' で表す。 :<math>u = \sum_{i = 1}^n w_{i} x_{i}</math> ここで ''w'' はシナプスの重み付けベクトルであり、''x'' は入力ベクトルである。これはバイアス項を加える前の値。 ===ステップ関数=== {{see also|形式ニューロン}} 1943年の、いわゆる「マカロックとピッツ」の発表で提案されたもの。 [[ヘヴィサイドの階段関数|ステップ関数]]の出力 ''y'' は 0 か 1 の二値であり、''u'' がしきい値 ''b'' より大きいか小さいかで出力が決定される。入力の総和がしきい値以上であるとき、出力信号が 1 として出力される。 :<math>y = H(u - b) = \left\{ \begin{matrix} 1 & \mbox{if }u \ge b \\ 0 & \mbox{if }u < b \end{matrix} \right.</math> :<math>\varphi(x) = H(x)</math> ===パーセプトロン=== {{see also|パーセプトロン}} パーセプトロンでは、前述のモデルから、線型和にバイアス値 ''b'' を加えることが提案された。 :<math>y = u + b</math> :<math>\varphi(x) = x</math> 一般にこのような純粋な形式の伝達関数は回帰設定の場合のみしか使えない。二値分類設定では出力の符号で 1 または 0 に対応させる。これはすなわち、上述のステップ関数で b の符号を反転した場合と等価であり、学習アルゴリズムで有効である。 ===シグモイド関数=== :<math>\varphi(x) = \varsigma_1 (x) = \frac{1}{1+e^{-x}} = \frac{ \tanh(x / 2) + 1 }{ 2 }</math> 比較的単純な非線形関数である[[シグモイド関数]]は、微分の計算も容易であることから1986年に発表された[[バックプロパゲーション]]を伴うニューラルネットワークで使われる。ネットワークを数学的に扱うことが容易になるため、シミュレーションの計算負荷を減らしたいと思っていた初期の研究者がシグモイド関数をこぞって採用した。 [[File:Gjl-t(x).svg|thumb|320px|right|{{lang|el|ς}}型の関数の比較]] 1990年代になり、活性化関数は原点を通すべきと言う考えから、標準シグモイド関数よりもそれを線形変換した tanh の方が良いと提案された<ref>{{cite journal |author=Yann LeCun |author2=Leon Bottou |author3=Genevieve B. Orr |author4=Klaus-Robert Muller |title=Efficient BackProp |year=1998 |url=http://yann.lecun.com/exdb/publis/pdf/lecun-98b.pdf }}</ref><ref name="Glorot2010">{{cite journal |title=Understanding the difficulty of training deep feedforward neural networks |author=Xavier Glorot |author2=Yoshua Bengio |year=2010 |url=http://jmlr.org/proceedings/papers/v9/glorot10a/glorot10a.pdf }}</ref>。 :<math>\varphi(x) = \tanh(x)</math> === ソフトサイン === 下記関数をソフトサイン({{lang-en-short|softsign}})と呼び、2010年の Xavier Glorot らの研究では tanh と同程度に良かった<ref name="Glorot2010"/>。 :<math>\varphi(x) = \frac{x}{1 + |x|}</math> === ソフトプラス === [[Image:Rectifier and softplus functions.png|thumb|320px|青がReLU(ランプ関数)、緑がソフトプラス]] 下記関数をソフトプラス({{lang-en-short|softplus}})と呼び、これが活性化関数として使われることもある。 :<math>\varphi(x) = \log(1 + e^x)</math> === ReLU(ランプ関数) === {{Main|正規化線形関数}} 2011年、Xavier Glorot らは隠れ層の活性化関数としてmax(0, x) を使った方がtanhやソフトプラスよりも改善するということを発表した<ref>{{cite journal |title=Deep Sparse Rectifier Neural Networks |author=Xavier Glorot |author2=Antoine Bordes |author3=Yoshua Bengio |journal=Proceedings of the Fourteenth International Conference on Artificial Intelligence and Statistics (AISTATS-11) |volume=15 |pages=315-323 |url=http://jmlr.csail.mit.edu/proceedings/papers/v15/glorot11a/glorot11a.pdf }}</ref>。一般的にはこれは[[ランプ関数]]と呼ばれるが、ニューラルネットワークの世界では'''ReLU''' ({{lang-en-short|Rectified Linear Unit, Rectifier}}、[[正規化線形関数]])と呼ばれる。[[ヤン・ルカン]]や[[ジェフリー・ヒントン]]らが雑誌[[ネイチャー]]に書いた論文では、2015年5月現在これが最善であるとしている<ref name="nature201505">{{cite journal |author=Yann LeCun |author2=Yoshua Bengio |author3=Geoffrey Hinton |title=Deep learning |journal=Nature |date=2015-05-28 |volume=521 |issue=7553 |pages=436-444 |doi=10.1038/nature14539 }}</ref>。発想としては[[区分線形関数]]を使った1次[[スプライン補間]]である。[[線形補間]]を参照。 :<math>\varphi(x) = x_+ = \max(0, x)</math> 2013年にmax(0.01x, x) がLReL (leaky rectified linear) と命名された。ただし、命名者はこの活性化関数を使う意味はなかったと報告している<ref>{{cite journal |title=Rectifier Nonlinearities Improve Neural Network Acoustic Models |author=Andrew L. Maas |author2=Awni Y. Hannun |author3=Andrew Y. Ng |url=http://web.stanford.edu/~awni/papers/relu_hybrid_icml2013_final.pdf |year=2013 }}</ref>。 2018年にx*sigmoid(x) がSwish (あるいはSiLU, sigmoid weighted linear) と命名された。この関数はReLUよりも高い分類精度を得ることができると示されている<ref>{{Cite journal|last=Ramachandran|first=Prajit|last2=Zoph|first2=Barret|last3=Le|first3=Quoc V.|date=2017-10-27|title=Searching for Activation Functions|url=https://arxiv.org/abs/1710.05941|journal=arXiv:1710.05941 [cs]}}</ref>。 === 切断冪関数 === [[ランプ関数]](ReLU)を一般化すると[[切断冪関数]]になり、n次[[スプライン補間]]。2乗はクォーターパイプ関数({{lang-en-short|quarter-pipe}})とも呼ばれる<ref>{{cite journal |title=Kernel Methods for Deep Learning |author=Youngmin Cho |author2=Lawrence K. Saul |url=http://papers.nips.cc/paper/3628-kernel-methods-for-deep-learning.pdf |year=2009 |journal=Advances in Neural Information Processing Systems 22 |pages=342-350 }}</ref>。 :<math>\varphi(x) = x_+^n = (x_+)^n</math> === 多項式 === 2次以上の[[多項式]]も非線形関数であり、活性化関数に使える。 :<math>\varphi(x) = x^n,\ n \ge 2</math> === 絶対値 === [[絶対値]]はReLU([[ランプ関数]])と同様、線形に近い非線形関数。傾きが0の場所が無いという特徴がある。 :<math>\varphi(x) = |x|</math> === Snake === 2020年に Liu Ziyin らが提案したSnake関数は[[三角関数|正弦関数]]を使用した単調増加の関数であり、ReLU等に比べ周期的な入力に対しより頑健になることが期待される<ref>{{Cite journal|last=Ziyin|first=Liu|last2=Hartwig|first2=Tilman|last3=Ueda|first3=Masahito|date=2020-10-24|title=Neural Networks Fail to Learn Periodic Functions and How to Fix It|url=https://arxiv.org/abs/2006.08195|journal=arXiv:2006.08195 [cs, stat]}}</ref>。 :<math>\varphi(x) = x + \sin^2 x</math> === 三角関数 === 2020年に Vincent Sitzmann らが活性化関数に正弦関数を使う物をSIREN(Sinusoidal representation networks)と命名した。画像や音声等の情報をニューラルネットワークへ[[符号化方式|符号化]]するタスクにおいて、他の活性化関数よりも高い精度を得られたことが確認されている。<ref name="#1">{{Cite journal|last=Sitzmann|first=Vincent|last2=Martel|first2=Julien N. P.|last3=Bergman|first3=Alexander W.|last4=Lindell|first4=David B.|last5=Wetzstein|first5=Gordon|date=2020-06-17|title=Implicit Neural Representations with Periodic Activation Functions|url=https://arxiv.org/abs/2006.09661|journal=arXiv:2006.09661 [cs, eess]}}</ref> :<math>\varphi(x) = \sin x</math> === 動径基底関数 === 1988年に David S. Broomhead らが活性化関数に[[動径基底関数]]を使う物を動径基底関数ネットワーク(RBFネットワーク, radial basis function network)と命名した。<ref>{{cite journal |last1 = Broomhead |first1 = David S. |last2 = Lowe |first2 = David |year = 1988 |title = Radial basis functions, multi-variable functional interpolation and adaptive networks |institution = Royal Signals and Radar Establishment |number = 4148 |url = http://www.dtic.mil/cgi-bin/GetTRDoc?AD=ADA196234 }}</ref> : <math>\varphi(x) = \exp(- \beta x^2)</math> === ウェーブレット === 1992年に Qinghua Zhang らが活性化関数に[[ウェーブレット]]を使う物をウェーブレットネットワークと命名した<ref>{{cite journal |author=Qinghua Zhang |author2=Albert Benveniste |title=Wavelet networks |journal=IEEE Trans. Neural Networks |volume=3 |pages=889-898 |year=1992 |url=http://people.rennes.inria.fr/Albert.Benveniste/pub/Wavenets.pdf }}</ref>。 === maxout === 2013年に Ian J. Goodfellow らが発表した活性化関数<ref>{{cite journal |title=Maxout Networks |author=Ian J. Goodfellow |author2=David Warde-Farley |author3=Mehdi Mirza |author4=Aaron Courville |author5=Yoshua Bengio |journal=30th International Conference on Machine Learning |year=2013 |url=https://arxiv.org/abs/1302.4389 }}</ref>。通常の活性化関数は実数から実数への写像であるが、活性化関数 maxout は(線形変換した後の)複数の実数の値に対する最大値を出力とする。発表者は dropout(層内を全結合にしない手法)との併用で論文を書いている。 == 出力層の活性化関数と誤差関数 == 出力層は隠れ層とは区別して設計する。活性化関数と誤差関数をセットで設計する必要がある。そして、問題の種類ごとにそれらは異なる。絶対的なルールはないが、下記の方法が一般的な方法である。ここであげた手法は誤差関数の偏微分が全て出力と目標値の差になっていて扱いやすい。 変数の使い方は以下の通り。 * <math>N</math>:訓練データの個数 * <math>d_n</math>:n番目の訓練データの目標値 * <math>y_n</math>:n番目の訓練データの出力 === 回帰 === * 活性化関数:<math>\varphi(u) = u</math> * 誤差関数:<math>E(w) = \frac{1}{2} \sum_{n=1}^N \| y_n - d_n \|^2</math><!-- ここを N で割って \frac{1}{2N} にすると誤差関数の偏微分も N で割らないといけなくなってしまうので N で割るのは問題があります --> * 誤差関数の偏微分:<math>\frac{ \partial E_n(w) }{ \partial u } = y_n - d_n</math> === 二値分類 === 出力は1つで確率と解釈する。<math>d_n</math> は 0 または 1 もしくは確率。誤差関数は[[最尤推定]]で導出できる。 * 活性化関数:<math>\varphi(u) = \varsigma_1 (u) = \frac{1}{1+e^{-u}}</math> * 誤差関数:<math>E(w) = - \sum_{n=1}^N (d_n \log y_n + (1 - d_n) \log (1 - y_n))</math> * 誤差関数の偏微分:<math>\frac{ \partial E_n(w) }{ \partial u } = y_n - d_n</math> === 多クラス分類 === K 個のクラスに分類する。出力は K 個で、総和は 1 であり、そのクラスに所属する確率と解釈する。<math>d_{n,k}</math> は 0 または 1 もしくは確率で、n 番目の訓練データがクラス k に所属する時 1。<math>\sum_k d_{n,k} = 1</math> 。[[交差エントロピー]]を使用している。この活性化関数はソフトマックス関数と呼ばれる。このまま計算すると浮動小数点数に入りきらなく、オーバーフローすることが多いが、<math>u_k</math> は全て同じ数を引いた場合は結果が同じになる事を利用して、<math>\max_k u_k</math> を全てから減算して活性化関数を計算すると良い。 * 活性化関数:<math>\varphi(u_k) = \frac{e^{u_k}}{\sum_{i=1}^K e^{u_i}}</math> * 誤差関数:<math>E(w) = - \sum_{n=1}^N \sum_{k=1}^K d_{n,k} \log y_{n,k}</math> * 誤差関数の偏微分:<math>\frac{ \partial E_n(w) }{ \partial u_k } = y_{n,k} - d_{n,k}</math> == 論理演算 == [[論理演算]]の実装を、活性化関数が、[[形式ニューロン|マカロックとピッツのモデル]](ステップ関数)の場合と[[ランプ関数]](ReLU)の場合とで示す。よく知られているように、中間層のニューロセルの無い単純[[パーセプトロン]]では、線形分離不可能なものは扱えない。例えばこの例では、2入力のXORを実装できないため、実際に以下に示すようにXORでは中間層が必要になっている。真 = 1で偽 = 0、ReLU は真 = 1で偽 = -1である。ReLUは出力の正負で真偽を判断する。 {| class="wikitable" |+ 論理演算 ! 論理演算 !! ステップ関数 !! ランプ関数(ReLU) |- ! NOT |<math>H(-x_1 + 0.5)</math> |<math>\varphi(-x_1) - 0.5</math> |- ! AND |<math>H(x_1 + x_2 - 1.5)</math> |<math>\varphi(x_1 + x_2) - 1</math> |- ! OR |<math>H(x_1 + x_2 - 0.5)</math> |<math>\varphi(x_1 + x_2 + 2) - 1</math> |- ! XOR |<math>H(x_1 + x_2 - 2 H(x_1 + x_2 - 1.5) - 0.5)</math> |<math>-\varphi(x_1 + x_2) - \varphi(-x_1 - x_2) + 1</math> |} == 関数近似 == ランプ関数(ReLU)にて <math>y = x^2</math> を近似してみる。 ; 訓練データ : (x, y) = {(-3, 9), (-2, 4), (-1, 1), (0, 0), (1, 1), (2, 4), (3, 9)} ; 学習結果 : <math>2\varphi(-x - 2) + 2\varphi(-x - 1) + \varphi(-x) + \varphi(x) + 2\varphi(x - 1) + 2\varphi(x - 2)</math> これは[[折れ線グラフ|折れ線]]によって近似している([[線形補間]])。これを一般化すると十分な数のニューロンがあれば任意の関数がランプ関数(ReLU)を活性化関数として使って表現できることが分かる。 == 出典 == {{reflist}} {{DEFAULTSORT:かつせいかかんすう}} [[Category:人工ニューラルネットワーク]] [[Category:関数]]
このページで使用されているテンプレート:
テンプレート:Cite journal
(
ソースを閲覧
)
テンプレート:Lang
(
ソースを閲覧
)
テンプレート:Lang-en-short
(
ソースを閲覧
)
テンプレート:Main
(
ソースを閲覧
)
テンプレート:Pathnav
(
ソースを閲覧
)
テンプレート:Reflist
(
ソースを閲覧
)
テンプレート:See also
(
ソースを閲覧
)
活性化関数
に戻る。
ナビゲーション メニュー
個人用ツール
ログイン
名前空間
ページ
議論
日本語
表示
閲覧
ソースを閲覧
履歴表示
その他
検索
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
特別ページ
ツール
リンク元
関連ページの更新状況
ページ情報