本文へ移動

基本情報技術者試験

かっせいかかんすう

活性化関数

Activation Function

活性化関数は、ニューラルネットワークの各層で、入力の線形結合にバイアスを加えた値に対して要素ごとに適用する関数です。非線形な活性化関数を層と層の間に挟むことで、層を重ねたネットワークが1つの線形関数では表せない関係を表せるようになります。代表例にシグモイド関数・tanh関数・ReLU関数があります。

詳しい説明

活性化関数とは何か

ニューラルネットワークの層は、入力の値それぞれに重みを掛けて足し合わせ、そこにバイアスと呼ぶ定数を加える計算をします。この計算の結果は入力の線形関数です。活性化関数は、この線形関数の出力に続けて適用する関数で、その結果が層の出力になります。

イアン・グッドフェロー(Ian Goodfellow)、ヨシュア・ベンジオ(Yoshua Bengio)、アーロン・クールヴィル(Aaron Courville)による教科書『Deep Learning』(2016年)の第6章は、隠れ層の 番目の出力を次の形で書いています。

は入力を並べたベクトル、 は重みを並べた行列 の 列目、 はバイアス、 が活性化関数です。括弧の中の が線形関数の部分で、以下ではこの値を と書きます。活性化関数は の1つの値を受け取って1つの値を返す関数で、層の出力それぞれに同じ を別々に適用します。これを要素ごとの適用と言います。(全結合層のページでは同じ重み付き和を、出力数×入力数の行列 を使って書いていますが、行列の向きが違うだけで同じ計算を表しています。)

1つの出力で計算の流れを追う

入力が2つある場合で、ある隠れ層の出力を1つ計算します。入力を 、この出力に対応する重みを 、バイアスを とします。どれも説明のために決めた架空の値です。

活性化関数に何を選ぶかで、同じ から出てくる値が変わります。ReLU関数なら 、シグモイド関数なら 、tanh関数なら です。重みとバイアスが決める部分は共通で、活性化関数はその後ろで値の形を変える役を受け持っています。

活性化関数が無いと層を重ねても1つの線形関数になる

入力も出力も1つの簡単な例で、活性化関数を挟まずに線形関数の層を2つ重ねた場合を確かめます。1層目を 、2層目を とします。2層目の式の に1層目の式を代入すると、次のようになります。

2層を通した結果は、傾き6・切片 の1つの線形関数と同じです。入力が なら 、 となり、 と一致します。

これは例の数値に限った話ではありません。線形関数に線形関数を代入すると、展開した結果はまた線形関数になります。入力や出力がベクトルになり、重みが行列になっても同じで、重み行列の積が1つの行列にまとまり、バイアスも1つのベクトルにまとまります。したがって線形関数だけを何層重ねても、表せる関係は1層の線形関数で表せるものから増えません。層を重ねる意味が無くなってしまいます。

活性化関数を挟むと何が変わるか

同じ2層の間にReLU関数を挟み、1層目を に変えます。2層目は のままです。いくつかの入力で出力を計算すると次のとおりです。

入力 出力 活性化関数が無い場合

が負になる の範囲では、 が0に固定されるので出力は で変わりません。 の範囲では出力は と同じように傾き6で増えます。入力の範囲によって傾きが0から6に切り替わる折れ線は、1つの線形関数では表せません。このように、非線形な活性化関数を層の間に挟むことで、層を重ねたネットワークは線形関数の外側にある関係を表せるようになります。

代表的な3つの関数

『Deep Learning』第6章は、隠れ層で使う活性化関数としてReLU関数、シグモイド関数、tanh関数を取り上げています。3つの式と、式から計算できる性質を並べます。

関数式出力の範囲 のときの値
ReLU関数0以上
シグモイド関数0より大きく1より小さい
tanh関数 より大きく1より小さい

ReLU関数の名前は rectified linear unit の略で、日本語では整流線形関数とも呼びます。入力が負なら0を返し、入力が0以上ならそのまま返します。 の範囲では傾きが常に1です。

シグモイド関数とtanh関数は、どちらもS字形の曲線を描きます。『Deep Learning』第6章は、2つの間に次の関係があることを示しています。

前の計算例の値で確かめると、 なので となり、 と一致します。tanh関数はシグモイド関数を横に縮め、縦に2倍に伸ばして下へずらした形です。そのため での値がシグモイド関数では 、tanh関数では0になります。

シグモイド関数とtanh関数の飽和

シグモイド関数は、入力の絶対値が大きくなると出力がほとんど動かなくなります。、 で、入力を5増やしても出力は約0.0066しか増えません。負の側でも同じで、 は0にごく近い値です。このように、入力が変わっても出力がほぼ一定になる状態を飽和と呼びます。tanh関数も、入力の絶対値が大きいと か1に張り付いて同じように飽和します。

『Deep Learning』第6章は、シグモイド系の関数が定義域の大部分で飽和し、それが勾配にもとづく学習を難しくすると述べています。勾配は、重みを少し動かしたときに誤差がどれだけ変わるかを表す量です。出力がほとんど動かない範囲では、重みを動かしても誤差がほとんど変わらないので、どちらへ重みを直せばよいかの手がかりが小さくなります。同じ章はこの理由から、フィードフォワードネットワークの隠れ層でシグモイド系の関数を使うことを勧めていません。そのうえで、シグモイド系の関数を使わざるを得ない場合には、tanh関数の方がシグモイド関数よりよい性能を示すことが多いとしています。

ReLU関数が既定の推奨とされていること

『Deep Learning』第6章は、現代のニューラルネットワークでは既定の推奨としてReLU関数を使うと書いています。この記述の出典として、同じ章はジャレットら(Jarrett et al., 2009)、ナイアとヒントン(Nair and Hinton, 2010)、グロロットら(Glorot et al., 2011a)の3件を並べて挙げており、ReLU関数を単独の提案者に結び付けてはいません。

既定の推奨は、どの課題でもReLU関数が最もよいという意味ではありません。まず試す選択肢として勧められている、という意味です。

誤解しやすい点

活性化関数の役割は、値を0から1に収めることだと思われがちです。しかしReLU関数の出力には上限がなく、tanh関数の出力は負にもなります。3つの関数に共通するのは出力の範囲ではなく、非線形であることです。非線形であることが、層を重ねたネットワークに線形関数の外側の関係を表させるという役割に結び付いています。

ReLU関数は の範囲だけを見ると という線形関数に見えます。それでも を境に傾きが0から1に切り替わるので、全体としては非線形関数です。前の節の折れ線の例が、この切り替わりによって生まれたものです。

試験で問われること

基本情報技術者試験

  • 非線形変換の重要性を理解する。
  • 代表的な活性化関数(ReLU、シグモイドなど)の特性を把握する。
  • ニューラルネットワークの学習プロセスにおける役割を理解する。

最終更新日: 2026/09/23