層 (layers) : ディープラーニングの層の種類まとめ

1. 層(layers)とは [概要]

層 (layers)とは,ディープラーニングにおいて,DNN(ディープニューラルネットワーク)を構成・設計する際の最小構成単位の部品のことである.この記事で示すような各種の「層」をノードとした計算グラフを構成することで,DNN構造の設計をおこなう.つまりは,層をつなげて任意のグラフ構造にすると,ディープニューラルネットワークができあがる.

この記事では,ディープラーニングで用いる「層」の種類を,各役割の「カテゴリー (畳み込み層プーリング層バッチ正規化層など)」ごとに分類して,一覧として整理してしめす「層の種類のまとめ親記事」である.1節で,「層」の定義や「微分可能性」についてまずまとめたあと,2節で,代表的なDNN向けの層を,子記事リンクとともに順に列挙している.

DNNでは,SGDにより最適化を行う都合上,全ての層は微分可能な層として設計する必要がある(1.3節).また,層によっては,学習するパラメータを保持していない層もある.DNNを設計する際には,この記事で紹介するような層(カテゴリー)を,人間が自由に,もしくはヒューリスティックに繋ぎ合わせることで,良い設計を探っていくのが基本的方針である.一方で,NAS(Neural Architecture Search)などの設計最適化アルゴリズムに,最良設計を自動で選んでもらう潮流もある.

1.1 層の種類の一覧

この記事では,以下の主要な層の種類を2節で概要のみ紹介して,1つの記事内で列挙する:

この記事では,「多くのDNN向けの層を分類して,全体の関係を眺めやすくすること」に徹することで,読者が各層カテゴリーに辿りやすくし,各々の関係性もとらえやすくすることを目指している.よて,各層カテゴリーの概要はあまり丁寧には述べないようにし,子記事に詳細は任せるようにした.

CNNの記事では,このうち多くの層をもう少し詳しくCNN全体の関係の中で紹介している.また,このサイトでは,バッチ正規化 (2.5節)も,層の1種とみなしている(※1).

この記事全体や,上記の「層カテゴリーのリスト」を,PyTorchのtorch.nnのクラス一覧のページと一緒に眺めていただくと,更に頭の中で整理しやすくなると思う.

(※1) Kevin Patrick Murphy氏の新著「 Probabilistic Machine Learning: An Introduction」では,「14.2 Common layers (of CNN)」の節において,「バッチ正規化」も,(CNNの)層の1種として分類・紹介しいてる (14.2.4 Normalization Layers).ただし,最近のテキストや論文でも,バッチ正規化を層として明示的に分類していない場合もあることに注意.

1.2 当サイトでの「層(layer)」の定義

層 (layers) が4つで構成されるディープニューラルネットワークの例
図1. 層 (layers) が4つで構成されるディープニューラルネットワークの例

冒頭の定義の通り,DNNの最小構成部品は,全て「」と呼ぶことにする(図1).図1は,各層の単位を示す「層の単位」を把握するサンプル図(4層から構成のDNN)である.このうち,中間層(隠れ層)の2つが全結合層であり,出力はsoftmax関数という例である.

教科書や論文も多くでは,「ニューロンユニット間でインタラクションがある部品」のみを「層」と呼ぶ形式である.その場合,「活性化関数」は,層の1種とはみなさず別枠で紹介される.しかし,その分類は「層とブロックを組み合わせるDNN」という視点から言うと,イチイチ「層」と「活性化関数」を分けて呼ぶことになって面倒である.よって,このサイトでは「活性化関数も層カテゴリーの1種である」とみなし,まとめて「層」と呼ぶことにする.

1.3 全ての層は「微分可能」

2節で紹介する,各「層の種類」は,基本的に全て微分可能(differentiable)な層である.これは,ディープラーニングにおいて基本的な事項で,なおかつ重要な点である.

ディープラーニングで用いるDNNは,非常に大量の重みパラメータや,アテンション係数・バッチ正規化パラメータを,End-to-End学習する.DNNは,SGD(確率的勾配降下法)でバッチ最適化するので,DNN内の全ての層は微分可能である必要がある.

1.3.1 微分できない関数は,微分可能な層に変形

従って「元は微分不可能な関数」を層に取り入れたい場合は,なんらかの近似関数化で微分可能化な関数として設計することで,(ディープ)ニューラルネットワークの層として使用できるように設計する.

また,ランダム変数を関数内に含んでいるような,ベイズ確率モデリング目的の層だと,ランダム変数生成部分が微分できないので,そのままだとSGD最適化ができない.そこで,VAE再パラメータ化トリックや,Gumbel Softmax トリックなどのように,「(潜在変数の)ランダム生成を,決定的関数に代替させる」トリックを用いて,微分可能な層に替えてから使用する.

2. 主要な層の種類

2.1 全結合層

全結合層(fully-connected layer)
図2. 全結合層(fully-connected layer)

全結合層は,伝統的なニューラルネットワークの中間層を構成する基幹部品である.3層MLP時代は最も基本的な構成部品であった,

しかし,CNNとディープニューラルネットワークの登場で,同じ線形層でも効率的で空間的な操作の畳み込み層 (2.2節)に,立場をゆずり,出力層の付近でしか,全結合層は使われなくなっていた.

ところが2018年ごろのTransformerやBERT・GPTの登場でこれらのモデルも主役になっていって以降は,Transformerの部品で用いる埋め込み層マルチヘッドアテンション内に含まれる全結合層を,DNN内で多用することになった.これにより,畳み込み層に一度主役を奪われた全結合層の立場が,「アテンション + 全結合層」が主部品のTransformerを通じて復権してきたとも言える.

コンピュータビジョンにおいても,TransformerベースのViT,MLP-Mixer,CLIPなどの登場と流行に伴い,全結合層の使用頻度が再び増している.

2.2 畳み込み層

畳み込み層(2D)
図3. 畳み込み層(2D)

(2D)畳み込み層は,CNNなどの入力/中間特徴マップを入力として,K個のカーネルで画像フィルタリングを行った結果を出力する層である.すなわち,カーネルに学習されている各局所パターンが,画像空間中のどこに強く存在しているかのマップを,各チャンネル画像に出力する層である.

畳み込み層による空間フィルタリング結果は,ノイズ交じりなマップであるので,そのまま次の層につなげていっても,よい情報になっていきづいらい.そこで,畳み込み層の直後,もしくは畳み込み層を数層繰り返したのちに,ReLU型の活性化関数を配置して,NMSを行う.これにより,ノイズが消えて特徴の強い場所だけのこった特徴マップ群を得ることができる.

2.3 活性化関数

活性化関数(activation function)の,隠れ層における役割.
図4 活性化関数activation functionの隠れ層における役割

活性化関数層は,他の層で抽出した特徴のうち,強い値だけを残す閾値関数の役割を担当する.

ディープニューラルネットワークにおいては,活性化関数は,以下2つの用途に使われる.

  1. 中間層の値の活性化(ReLU系・tanh)
  2. 出力層(softmax/シグモイド)

本当は「ステップ関数」を使えば,閾値処理としての目的はすぐ達成できる.しかし,ステップ関数は微分不可能なので,勾配降下法ベースで最適化することが主流の,(ディープ)ニューラルネットワークでは使用できない.

よって,[中間層] では,微分可能な滑らかな関数として,シグモイド関数tanh関数などが,かつての3層MLP時代やRNNなどでは用いられていたが,Deep Learningが登場すると,CNN界隈を皮切りに,ReLU系関数が,中間層の活性化関数の主流となる(2.3.1)

また,[出力層]では,クラス確率値ベクトルを出力できる,Softmax/シグモイド関数が使われる.

2.3.1 ReLU型の活性化関数

ReLU系の活性化関数
図5 ReLU系の活性化関数

ディープラーニング・CNN登場後に,中間層として一番用いるようになったのが,ReLU系の活性化関数である.古典的な3層MLP時代とくらべると,2010年以降「10~20層のCNN」を学習して最適化するためには,旧来のシグモイド関数などでは,微分計算が遅く不便であった.そこで,効率的な微分値計算で逆伝搬ができる,シンプルなランプ関数型のReLUが中間層の活性化関数として提案された.ReLUは著名研究者のKaiming He氏による提案であったこともあり,その後,標準的に使用されるようになった.

ただ,元のReLUは良いアイデアで学習の高速化は達成できるものの,負の範囲が単純な0値なので,微分関数形がよくなく,逆伝搬に問題が出がちであった.そこで,非線形関数に改善されたPReLUなどがすぐに提案された.またその後もより精度向上に貢献できる,GELU(Gaussian Error Linear Unit)やSwishなどが登場し,オリジナルのReLUの代わりに使用されるようになっていった.


2.3.2 softmax関数 ・シグモイド関数 による出力層

softmax 関数を出力層の活性化関数に用いた識別ネットワーク
図6 softmax 関数を出力層に用いた識別ネットワーク

基本的なCNNである物体認識向けのクラス識別CNNでは,最終出力層部分をSoftmax層 + 交差エントロピー層の組み合わせで構成することが多い.

Softmaxは名前の通り「Soft化したargmax関数」であり,合計1に正規化された,Nクラスの各確率値を出力できる.ロジスティック回帰や3層MLPなど,ディープラーニング登場以前から,クラス識別モデルで使用されてきた.

多クラス識別向けは,Softmax識別器であるが,2クラス識別器であれば,代わりにシグモイド関数を用いる.

2.4 プーリング層

最大値プーリング(Max Pooling)
図 最大値プーリングMax Pooling
平均プーリング(average pooling)
図 平均プーリング

画像認識向けCNNによく使用される,局所プーリング層(例:最大値プーリング平均プーリング)は,特徴集約を担当する層である.

プーリング層では,順伝搬で抽出した特徴マップを,空間ダウンサンプリングと共に局所領域ごとに集約を行う.これにより,各局所領域の代表値が生き残った,特徴マップへと変換され,以降の層ではそれを元により広範囲の情報を,「畳み込み層 + ReLU」で(効率的に)特徴抽出できるようになる.(局所)プーリング層を用いないと,広い受容野の特徴を抽出するには畳み込み層の数が沢山必要になりすぎててしまう.それが,プーリング層を使用することで,効率的な空間特徴集約が可能となる.


2.5 バッチ正規化

バッチ正規化
図 バッチ正規化

バッチ正規化層は,各中間層で特徴マップを毎回正規化することにより,ディープニューラルネットワークの学習を安定させ,なおかつ高速化する役割の層である.特徴正規化や特徴スケーリングは,機械学習では昔から使用されているテクニックであるが,その深いニューラルネットワークとSGD向けの特徴正規化テクニックが,バッチ正規化である.

最初画像CNN向けに,つまりは画像データ向けに登場したバッチ正規化であったが,時系列データ,自然言語処理向けにレイヤー正規化が登場し,Transformerでも使用された.

また,CNNなどのモデルの規模が大きくなってくるにつれて,更にバッチ学習向けに効率的なテクニックが必要となり,グループ正規化が登場した.その後,そのグループ正規化の発展型や派生形が,コンピュータビジョンではよく研究されている.


2.6 ドロップアウト層

ドロップアウト(Dropout))
図 ドロップアウトDropout

ドロップアウト層は,学習時の毎エポックに,ニューロンユニットの出力を一定割り合いだけランダムにドロップすることで,正則化効果を得る目的の層である.

各エポックtでは,割合p(=0.5が標準値)だけ,ランダムにニューロンを枝刈りして,部分ネットワーク群をフィットさせ重みを更新する.これを繰り返すと,毎回の部分ネットワークの順伝搬の平均近似を,データセットにフィットさせる事になるので,元の間引き無しのネットワークでフィットさせて過学習してしまうのを防いで,正則化効果を得ることが出来る.

非常に簡単な,ランダム間引き処理を加えるだけで,深いニューラルネットワークを正則化できることから,非常に多くのネットワークで標準的に使われるようになった.

ドロップアウトは,初期のCNNバックボーンではよく使われていたものの,同じく正規化の効能もあるバッチ正規化が登場して以降,一時期コンピュータビジョンでは,ドロップアウトはあまり使用されなくなって下火であった.ResNetを主に使うようになると,何層もドロップアウトする必要性がなくなったのも理由である. また,CNNだと,バッチ正規化が各畳み込み層と連携するので,終盤層の全結合層による識別器部分にしか,ドロップアウトはあまり使わないので,出番が減ってしまった.

しかし,Transformer時代に突入したのち,昨今の基盤モデルは超巨大なので,強い正則化が必須であり,ドロップアウトの出番が復活したと言える.

2.7 埋め込み層 (NLPやTransformerむけ)

埋め込み層(Embedding Layer)
図 埋め込み層Embedding Layer

単語・トークンの埋め込み層 (Embedding Layer)は「One-hotベクトル入力 → 全結合層」のペアで構成される層である.実態は,単語・トークンの高次元one-hot表現を,低次元表現へ埋め込んだものが保管されている,ルックアップテーブルであり,単語・トークンIDを入力すると,対応するIDの埋め込みベクトルを出力することができる.

単語・トークンの埋め込みベクトルをつくって,RNNLMseq2seqTransformer・BERTなどへと入力する際によく用いる,NLP向けの層である.

3. まとめ

この記事では,ディープニューラルネットワークで用いる層のカテゴリーを,コンピュータビジョンに限らず列挙することで整理した.層の種類を確認したいときに,何度も見直しやすい記事をつくったつもりである(今後,更に層カテゴリーの種類を追加していきたい).

『DNNの最小部品は全て「層」である』とした方が,全体の見晴らしがよくなる.よってこの記事では,活性化関数やバッチ正規化も「層」とみなした.とはいえ「層ではない」という分類をしても特に問題や違いはないとも考える.

1.1 でも述べたように,PyTorch torch.nnのクラス一覧 と,この記事を対応させて読むと,頭が整理しやすくなるはずである.また,この記事を繰り返し閲覧・活用することで,読者の方々は「各層(部品)の理解が深まっていき,今後の設計能力の向上する」と,管理人としては期待している (※ ただし,研究者の方は,自分で新しい層やブロックを提案することが,自分の仕事であることを忘れないように注意).

関連書籍

関連記事

参照外部リンク