まるっとワーク

データ分析・電子工作など気になることを残していきます

フィルタの設計_メモ

フィルタ設計について、関連用語等を簡単にまとめます。

目次

フィルタ設計について

フィルタ設計は、以下項目を検討します。

  1. 周波数特性(フィルタ種類)
  2. 設計仕様(フィルタ仕様)
  3. (アナログ回路の場合)フィルタ回路を構成する素子や接続方法
  4. ノイズ除去等、入力データの処理

周波数特性(フィルタ種類)

振幅特性に対する設計要求が与えられることが多く、通過域や阻止域の周波数によって、以下のように呼ばれ方が変わる。

  • 低域通過(ローパス)フィルタ
  • 高域通過(ハイパス)フィルタ
  • 帯域通過(バンドパス)フィルタ
  • 帯域阻止(バンドエリミネーション)フィルタ

 阻止域の幅が狭いものはノッチ・フィルタと呼ばれる

  • 全域通過(オールパス)フィルタ

 移送特性を変化させる目的で使われる

フィルタ種類

設計仕様(フィルタ仕様)

その他設計項目として、以下が存在

  • パスバンド(角)周波数
  • ストップバンド(角)周波数
  • パスバンド リップル
  • ストップバンド減衰量

フィルタ仕様


上記任意の値の仕様を満たす伝達関数を求め、フィルタとして使う。
伝達関数の求める方法として、多くの近似手法があり、代表的な近似結果が以下の通り。


それぞれのフィルタの特徴は、以下記事に示す。
dango-study.hatenablog.jp

ノイズ除去等、入力データの処理

観測したい信号にノイズが含まれる場合は、ノイズを除去することが求められる場合がある。

ノイズ除去方法としては、以下の通り。

  • 特定の周波数成分を抽出

ローパスやハイパス等のフィルタを組み合わせて、通過周波数帯を選択する。この手法は、信号とノイズとがそれぞれ異なる周波数である場合に有効。

  • 特定の周波数成分を除去

特定の決まった周波数を持つノイズが信号に入る場合は、ノッチフィルタが有効なケースがある。このフィルタは、特定の周波数成分だけを除去し、他の周波数帯には大きな影響を与えない。ただし、上記同様に信号とノイズとがそれぞれ異なる周波数である場合に有効。

畳み込み型 ニューラルネットワーク


続いて、畳み込み型のディープラーニングアルゴリズムをまとめていきます。
このアルゴリズムは画像処理において広く使われており、計算負荷を軽減する仕組みが多く導入されています。

目次


Convolutional Neural Network(CNN)の概要

このアルゴリズムでは、畳み込みというフィルタ処理を含んでおり、畳み込みによる出力が次の層の入力として使用されます。このフィルタによって、明るさやエッジなどの特徴、物体を定義する特徴の抽出が可能となります。

畳み込み処理

入力に対して、フィルタを用いて内積計算を行うことに相当し、入力に対してより小さいサイズに畳み込んで出力されます。

図:畳み込みの計算処理
f:id:toku_dango:20220101140754p:plain

通常のニューラルネットワークでは、入力ごとに重みが異なりますが、畳み込みではフィルタごとに重みが変わるため、重みを使いまわして計算することになります。
特徴抽出・計算を軽くするための処理として利用されるため、出力サイズは入力サイズと比較して小さくなることがポイントです。ただ、小さくなりすぎると計算ができなくなる/層を深くすることができない(その分小さくなるため)などの問題があり、それに対応して、paddingという方法がアルゴリズムに含まれるケースもあります。

padding(zero-padding)

畳み込むときに、入力画像の周りに0埋めの余白をつけるて計算する処理

pooling

入力情報を圧縮処理であり、最大1/2の大きさに入力サイズを圧縮することが可能です。
畳み込みでは、3×3の小さいフィルタを使うケースが多いため局所的な処理しかできないが、Poolingでは広い範囲の情報を含んだまま大きく圧縮することができます。デメリットとしては、入力が小さく圧縮されてしまうため、実施回数に限界があるということです。

Dilated Convolution

特殊な畳み込み処理であり、通常の畳み込みと比較して広い範囲の情報を含んだまま圧縮することができ、Poolingと比較して出力が小さくなりすぎないという利点があります。

図:Dilated Convolutionの計算処理
f:id:toku_dango:20220101150721p:plain

UpConvolutin(Deconvolution)

通常の畳み込み処理では、出力の方が入力よりも小さくなるが、この方法は入力よりも出力を大きくする処理になります。

多チャンネル時の処理

多チャンネルとは、フィルタ数が複数になったケースを想定しており、上記の通りの計算方法では、チャンネル数分計算量が倍になり、負荷が非常に重たいです。この計算を効率的に実施する方法として、im2colというテクニックがあります。
※im2colとは:入力やフィルタの2次元領域を、行列の列/行に変換して計算をする手法。GPUは行列計算に長けており、計算方法を変えることで負荷を軽減する。

学習手法

CNNでは、計算量が膨大になるケースが多いため、効率よく学習を実施する必要があり、その手法として以下方法が提案されています。

  • Batch Normalization: チャンネル毎にバッチ内の全データを使って平均/分散を求めて正規化する手法
  • Instance Normalization: 入力毎に平均/分散を求めて正規化する手法(バッチサイズが1のBatch Normalization)
  • Layer Normalization: 全チャンネルにまたがり、平均/分散を求めて正規化する手法で、画像毎に平均/分散を求めることと同じ
  • Group Normalization: Layer NormとInstance Normを組み合わせたもので、チャンネルを任意数に分割して、それぞれ平均/分散を求めて正規化する手法


転移学習(Transfer Learning)

別タスクで学習したネットワークを使用して、新しくタスクを学習する手法で、似たものの分類や認識に使ったネットワークを転移学習すると、その学習回数を減らすことができる利点があります。

CNNの代表的なモデル

画像認識で使われるCNNの代表的なモデルとして、以下が提案されています。

  • AlexNet: 物体認識に初めて深層学習の概念/畳み込みニューラルネットワークの概念を取り入れたモデル [2012年のILSVRCで優勝したモデル] ※ILSVRCは大規模画像認識の競技会のこと
  • VGG16: 畳み込み13層, 全結合3層からなるシンプルなモデル [2014年のILSVRCで提案されたモデル]
  • GoogLeNet: モジュールという特定の組み合わせの層を積層させたモデル[2014年のILSVRCで優勝したモデル]
  • Residual Networl(ResNet): 現在のCNNのベースとなるモデル。超多層のネットワークであり、超多層での計算を可能にした手法
  • DenseNet: ResNetを踏まえて開発されたモデルで、前方の各層からの出力全てが後方の層の入力として使用される手法
  • ResNeXt: ResNetのブロック内で入力を分岐させて並列に処理する手法
  • MobileNet: スマートフォンにのせれる程度の小さなモデル
  • UNet: 画像の出力で使用されるモデル


Object Detection(画像のどこに何があるか)を推定する目的で使用されるモデルとして以下が提案されています。
色々なウィンドウサイズで画面を走査(スライディングウィンドウ)が主流の方法であるが、非常に時間がかかる。

  • Regions with CNN features(R-CNN): Selective Searchと呼ばれる領域を絞り込むという機能を含めたモデル
  • Fast R-CNN: ROI Poolingと呼ばれる入力を固定サイズに切り分け/プーリングを行うことによって計算量を大幅削減したモデル
  • Faster R-CNN: Fast R-CNNを改善したモデルで、途中の演算を共有することによって演算コストを最小化するモデル
  • You Only Look Once(YOLO): Faster R-CNNよりも制度は落ちるがリアルタイム計算を可能にしたモデル
  • Single Shot MultiBox Detector(SSD): YOLOと似た精度/速度を誇るが、YOLOの弱点であった小さい物体の検出にも強いモデル

まとめ

今回は畳み込み型ニューラルネットワーク CNNに関する概要をまとめました。
計算には大きな負荷がかかり、円滑に計算する手法が多く編み出されているのですね。

回帰結合型 ニューラルネットワーク


続いて、回帰結合型のディープラーニングアルゴリズムをまとめていきます。


目次


Recurrent, Recursive Neural Network(RNN)の概要

通常のニューラルネットワークでは、ある層の出力は、次の層の入力にのみ利用されます。
RNNでは、ある層の出力が、次の層の入力として利用されるだけでなく、別のニューラルネットワークの入力としても利用されます。上記説明の構造を持つニューラルネットワークをRecurrent Neural Networkと呼び、RNNと言えばこちらの意味を指すことが多いようです。

図:Recurrent Neural Networkの構造(1層の構造)
f:id:toku_dango:20211226162313p:plain

もう一つのRNNであるRecursive Neural Networkは、Recurrentのものとは異なり、木構造のネットワークを持っており、自然言語処理などで使用されます。本記事では、Recurrent Neural Networkについて以下の通りまとめていきます。

RNNのアルゴリズム

上記の通り、出力が入力で使用される構造を持つニューラルネットワークで、主に時系列処理で用いられます。
対象となる時系列データには色々と種類がありますが、数値データだけでなく音声やテキストなども含まれ、数値解析や翻訳などでも利用されるようです。

RNNの学習について

出力を再度入力として使用する構造のため、どのように重みを計算するのか、RNNではBack Propagation Through Time(BPTT)という方法で解決しています。BPTTは、出力を再度入力として使用するループの数だけ次元を拡張して、入力/出力を多次元の形式に構造変換して計算可能な状態にする方法です。

図:BPTTのための考え方
f:id:toku_dango:20211226162525p:plain

RNNの課題

出力を再度入力として使用するが故に、構造が大きくなりすぎてしまうという問題があります。
上記より、古い情報を上書きするような構造に調整することを前提としており、それによって今度は勾配が消える、発散するという問題が生じます。
勾配の発散については、勾配クリッピングで抑制できるが、消失に対しては対策が取りにくく、本アルゴリズムの課題となります。重みの大きさは、勾配の発散に対応するために1以下に設定するが、古いデータはその重みを何回も掛けることとなり、アルゴリズム複雑になってしまうと、このような重ね合わせによって勾配が消失してしまいます。
上記を踏まえ、重みを1付近に設定すると、今度はネットワークの表現能力が制限され、本来の表現能力が発揮できなくなるため、課題解決用のアルゴリズムが追加で必要となります。

スキップ接続

一つ前の出力が現在の入力として使われる構造、これを一つ前の出力ではなく、二つ前、それ以前の出力を入力として使うように変更する方法になります。これにより、より以前の情報が現在の入力として入るまでに計算される回数が減るため、データの消失による問題を軽減されます。

また、これに付随した方法として、接続を削除するという方法があり、短い時間間隔でのループ処理だけを削除して、より時間が離れたリンクのみを残すことで、この問題に対応できます。

RNNの応用

RNNをベースとしたアルゴリズムを紹介します。

  • Bi-directional RNN: 過去⇔未来の各方向のRNNモデルでアンサンブルする方法
  • Long-Short Term Memory(LSTM): 勾配消失への対応として情報を記憶しておくCEC(メモリセル)を有したRNN
  • Gated Recurrent Unit(GRU): LSTMをシンプルな形に変えたモデル
  • Sequence-to-Sequence(seq2seq): Encoder部分とDecoder部分に分かれているNNを系列データに利用したモデル



アルゴリズムの構造は以下にまとめられてるので、詳細は以下を確認ください。
deepage.net

Bi-directional RNN

過去の出力を未来の入力として使うという、過去から未来という方向がある程度RNNにはありましたが、これを双方向につないだ構造を持つRNNとなります。双方向だからといって、モデルが双方向に伝達するような作りになっているわけではなく、順方向/逆方向のモデルをそれぞれ作り、結果をアンサンブルする方法をとります。
例えば、自然言語処理では、言葉の最後に言葉の最初が従属するようなケースがあり、そういったケースでは双方向につないだネットワークの方が問題を解くことに適しているケースがあるようです。

Long-Short Term Memory(LSTM)

基本的な構造はRNNと同じですが、情報を記憶するための機能(CECやメモリセルと呼ばれる)を持っていることが特徴となります。重みを大きく調整するような必要な情報は保持して、無関係な情報は記憶しないという"入力重み衝突(input weight conflict)"の機能を持っており、先程紹介した勾配消失の課題に対して対応可能となります。

Gated Recurrent Unit(GRU)

LSTMをシンプルな形に変えたモデルで、メモリセルを無くし、メモリ機能と入力部を合体した構造を持っています。

Sequence-to-Sequence(seq2seq)

翻訳用のモデルとして使われており、Encoder部分とDecoder部分とで構成されます。
このような構造のNNモデルがEncoder-Decoderと呼ばれており、Encoder部分は入力を中間表現(ベクトル)に変換する役割、Decoder部分はそれを出力に変換する役割を示します。

まとめ

今回は回帰結合型ニューラルネットワーク RNNに関する概要をまとめました。
目的に応じてどういったモデル構成が必要か、把握して活かしていきたいですね。

ディープラーニング設計について


前回の記事までで、ディープラーニングアルゴリズムや構造について記載しました。
続いては、設計時に必要な考え方についてまとめます。

目次


学習の円滑化1(パラメータ(重み)の初期値について)

ディープラーニングでは、SGDなどのパラメータ更新アルゴリズムを駆使して最適解を目指します。
よって、重み更新の初期値はかなり重要です。もし最適解に近い重みからスタートできれば、更新回数は少なく・最適解へたどり着ける可能性もずっと高くなります。

図:ディープラーニングの重みと損失関数値の関係
f:id:toku_dango:20211215204904p:plain

初期値設計の考え方にHeの初期化、Xavierの初期化(Glorotの初期化)と呼ばれる方法があり、
ここで紹介をしていきますが、まずはやってはいけない初期値設計について簡単に説明します。

  • すべての重みを均一にする

もしこのように初期値を設定してしまうと、すべての重みが連動して同じ値に動く可能性が生じます。
これの何がいけないかというと、すべてが連動して動いてしまうとそれがあたかも一つの変数のように動いてしまうという点です。
ディープラーニングの特徴である柔軟性を失いかけるので、重み初期値をランダムに設定するということは大変重要です。

  • 勾配消失問題

活性化関数としてシグモイド関数、ハイパボリックタンジェントを使用する場合、勾配>0となる場所は限られてきます。
初期値に勾配=0となる個所を選択してしまうと、勾配消失問題を引き起こし、パラメータ更新が行われないという問題が生じます。
上記より、勾配が>0となる個所を選択すれば良いということになりますが、紹介した活性化関数では、勾配>0となる個所は限られており、先程説明したような重みが一体化して動いてしまうという現象を引き起こしかねないので、注意が必要です。

図:代表的な活性化関数のグラフ(左から順に線形関数、ReLu関数、シグモイド関数、ハイパボリックタンジェント)
オレンジ:活性化関数を微分したもの(導関数)
f:id:toku_dango:20211204230142p:plain

Xavierの初期値

一般的なディープラーニングフレームワークで標準的に使われている手法です。
この初期化の考え方は、各ノードで計算された出力値(アクティベーション)の偏りをなくすという考え方であり、「前層のノードの個数をnとした時に\frac{1}{\sqrt{n}}標準偏差を持つ正規分布を使う」というものです。
各層のアクティベーションの分布をある程度広がるように調整することで、学習がスムーズに行えるように調整します。

この手法は、シグモイド関数やハイパボリックタンジェントのような、左右対称で中央付近が線形関数とみなせるものに適しています。

Heの初期化

ReLu関数を活性化関数として使用する場合に有効な方法です。
この手法も基本的な考え方はXavierの初期化と同じであり、「前層のノード個数をnとした時、\sqrt{\frac{2}{n}}標準偏差とする正規分布を使う」というものです。
ReLu関数の場合は、負の領域の勾配が0となるため、より広く値を分散させる必要があります。

学習の円滑化2(BatchNormalization)

各層のアクティベーション分布がある程度の広がりを持つように重みの初期値を設定しました。
次に、各層で適度の広がりを持つように、分布の調整を行う手法(Batch Nrmalization)を紹介します。
というのも、ミニバッチ学習などを行った場合、毎回パラメータ更新に使用するデータが異なります。
このデータの分布が異なる場合、損失関数の低下に時間がかかり、学習がうまくいきません。
このように分布が変化することを内部共変量シフト(共変量シフト, Internal Covariance Shift)と呼びます。

Batch Normalizationの仕組み

「各バッチ、各層で平均と分散の正規化実施」これがBatch Normalizationの仕組みとなります。
主な利点は、内部共変量シフトが解消され、学習率を上げても学習できること、過学習を抑制(正則化の必要性が下がる)することです。



\mu_{B}=\frac{1}{m}\sum_{i=1}^{m}{x_{i}} 平均値計算\\
\sigma^{2}_{B}=\frac{1}{m}\sum_{i=1}^{m}{(x_{i}-\mu_{B})}^{2} 平均値計算\\
\hat{x_{i}}=\frac{x_{i}-\mu_{B}}{\sqrt{\sigma^{2}_{B}+e}} :パラメータ更新
eはゼロ除算を避けるための小さい値

入力データは平均0の分散1の分布に収まるように標準化されます。

内部共変量シフト

各層のアクティベーション及び入力分布が変わってしまうことが問題であり、このような状態を指す。
内部共変量シフトが起きている場合、学習を阻害する場合があり、従来はこういったケースに学習率を小さくする/重みの初期値設定を調整する等の対応を実施していた。

過学習への対応

機械学習等の柔軟なモデルを使用する場合は、過学習について気を付ける必要がある。
過学習とは、学習データに合わせこみすぎてしまい、汎化性能を失ってしまうことであり、主な原因として以下があげられる。

  • パラメータが多量で柔軟な表現ができる
  • 訓練データが少ない


これに対応するやり方として、正則化やDropOut、画像データであればデータの拡張などがあり、その方法を紹介します。

正則化(Weight decay)

モデルの学習は、損失関数の値を小さくすることを目的に実施します。
この手法は、その損失関数の値に「重みを追加する」という手法となります。
このように、重み自体の値が大きくならないように、損失関数にペナルティーを科すという考え方です。

L1正則化 Lasso

この手法は、損失関数の値にL1ノルムを加える手法です。
L1ノルムは、重み絶対値をすべて足し合わせたものになります。



E^{'}(W)=E(W) + \lambda×|w| :L1正則化を加えた損失\\
E(W) :損失関数\\
\lambda×|w| :L1ノルム
この手法は、パラメータをスパースにする効果があり、過学習の抑制以外にも効果があります。
スパースとは、重み=0になることを示し、メモリ使用量の削減/計算量の削減など効果があります。

L2正則化 Ridge

この手法は、損失関数の値にL2ノルムを加える手法です。
L2ノルムは、重み絶対値の二乗をすべて足し合わせたもの(ユークリッド距離に該当するもの)になります。



E^{'}(W)=E(W) + \lambda×|w|^{2} :L2正則化を加えた損失\\
E(W) :損失関数\\
\lambda×|w|^{2} :L2ノルム

DropOut

過学習を抑制する方法として、Weight decayという方法を説明しました。
Weight decayでもある程度対応は可能ですが、ニューラルネットワークが複雑になると、正則化項を加えたとしても過学習が起きてしまいます。
このようなことに対応する方法として、次にDropOutという手法について説明します。

この方法は、ニューロンをランダムに削減しながら学習する手法です。
データで学習をするたびに、中間層のニューロンをランダムに選んで削除して、実際に学習後にテストを実施する際は削除せずに全てのノードを使用します。
このような手法を使うことで、Baggingのような効果が得られ、過学習が抑制できます。
Baggingを用いたモデルの学習方法をアンサンブル学習と呼び、機械学習ではよく用いられます。

データの拡張

データ数が限られると過学習してしまう危険があるので、データ数を増やすことで過学習を防ぐ手法です。
主に画像データで用いられ、画像を回転/反転/拡大縮小/色の変換などをすることで一つの画像を増やすことが可能になります。

また、似た考え方の別の手法として、半教師あり学習の手法についても説明します。

教師あり学習

目的次第ですが、モデルの学習には、ラベルとセットであるデータが必要です。
ただ、ラベルがあるデータの入手には限界があり、ラベルがないデータならば多く取得できるケースがあります。
教師あり学習は、ラベルがないデータを生かした学習手法であり、分類やクラスタリングで使われています。
基本的な考え方は、ラベル毎にデータが分布するという前提から、データが疎になっている所を分類界面として捉える手法です。

Early Stopping

その名前の通り、学習を途中で止めるという手法。
正則化が不十分な場合、ミニバッチ学習で学習を数回行っていくうちに、損失関数の値が大きくなるケースがある。
これは、その数値が現れた該当データの前で過学習が起きていることを示しており、このような現象が見られた時に学習を止める手法をEarly Stoppingと呼んでいる。

** パラメータの共有
畳み込みニューラルネットワークで使われる手法であり、フィルタをすることでパラメータ数を削減する手法。
これにより、モデルの表現を制限することで過学習を減らし、副産物として処理負荷も下げることができる。

まとめ

今回はディープラーニングの設計で必要な考え方についてまとめました。
学習を円滑に行う、過学習を防ぐといったことが大きな課題であり、それに対応する手法が非常に多く研究されていたことが分かりました。
次も関連知識についてまとめていきたいと思います。

誤差逆伝播法


前回はニューラルネットワークの構造について説明をしました。
続いては、モデル構築に必要な学習に関する技術を説明します。

目次


ニューラルネットワークの学習

以下画像のようなニューラルネットワークがあったとして、入力x及び出力yの関係は以下の通りです。
この入出力の関係の組み合わせで複雑なモデルが構築できるということでしたね。このモデルをデータにフィットさせる(学習させる)ためには重みwをデータに合わせて変える必要があります。

図:ニューラルネットワーク
f:id:toku_dango:20211212100709p:plain

勾配降下法

このような関数のパラメータ(係数や重み)を決めるアルゴリズムとして、勾配降下法が使われるので、もう一度紹介します。
勾配降下法は、「モデル関数に対してパラメータ(係数)を更新していって、最適解を目指すこと」が勾配降下法のアルゴリズムです。

ただ、このアルゴリズムをそのままディープラーニングで使用するのは、以下理由からかなり難しい。

  1. 重みw計算する場合、重みw一つ一つを個別で最適化する必要があり、計算効率が悪い
  2. 凸が複数存在する場合があり、最終的な凸が最適解であるかは分からない(以下図の通り)


図:ディープラーニングの重みと損失関数値の関係
f:id:toku_dango:20211215204904p:plain

これらの問題をそれぞれ解決するための方法として以下方法があげられる。
1. に対する対策:誤差逆伝播法(Back propagation)
2. に対する対策:確率的勾配降下法(SGD)等

誤差逆伝播

この方法を使用する前は、「重みwを一つ一つを少し更新して、損失関数の変わり方をチェック(勾配計算)、重みの更新を繰り返す」という方法が用いられていた。つまり偏微分をひたすら計算することになるということであるが、本方法はこの計算を効率的にできるようにした方法だ。

以下図のようなニューロンの計算を考えてみる。
計算したいのは、出力層の損失関数の重み変化に対する勾配。
基本的に足し合わせや掛け算の計算が左から右に流れる構造であり、左の結果が右の結果に影響する。
誤差逆伝播法は、この流れを逆に使用した方法だ。
詳細は以下URLを参照して簡単にまとめると、出力層に入力される値の重みは、以下図のような計算だけしか間に挟まないため、簡単に計算にて求めることができる。
より入力層に近い所の重みについては、上記計算過程で求めた誤差値を一つ前の層の出力値の誤差として扱って計算し、これを連鎖的に入力層側に向かって全ての重みを求める。このような重みを連鎖的に求めることができ、計算負荷を軽減できる方法が誤差逆伝播法だ。

図:ニューロンの計算
f:id:toku_dango:20211212100859p:plain

qiita.com

勾配消失

前回の記事でも紹介したが、誤差逆伝播法は出力層から入力層に向けて誤差値を伝播させて計算させる方法であるが故、誤差=0となってしまった時点で勾配=0となってしまい、該当層からさらに入力層に近い層の誤差も0となってしまう。
勾配=0となると、重みwの更新が不可能となるため、勾配消失に対する対策が不可欠となる。

勾配消失への対策方法としては、以下方法があげられる。

  • ReLu関数等の勾配が消えない活性化関数を使う
  • 重みの初期値を設計する
  • 入力値の正規化を行う


確率的勾配降下法(Stochastic Gradient Descent :SGD)

SGD の基本的な仕組みは勾配法と同じであるが、パラメータ更新毎にデータをランダムサンプリングするという所が改良ポイント。
ランダムサンプリングするということで、全データを使用しないため、再学習の計算量が低くなるという利点もある。
具体的には以下方法をで計算を行う。

  1. 損失関数f(x)に対して、学習率ηとxの初期値を定義する。
  2. データをランダムサンプリングする(ミニバッチ)
  3. データをもとに勾配(s)計算
  4. 計算した勾配(s)×η分だけxを変化させる
  5. 2~4を繰り返す



g_{t}=\frac{dL(w)}{dw} :勾配計算\\
w_{t+1}=w-ηg_{t} :パラメータ更新
SGDはデータをランダムにピックアップして重みを更新するアルゴリズムであり、使用データは1つづつしか使わないことと説明しているページあり。
ミニバッチで学習する方法を"ミニバッチSGD"と、SGDと区別している。

ミニバッチとは

データをすべて使って学習を行うことをバッチ学習と呼び、
データの中からランダムにn個を選び、選んだデータで学習を行うことをミニバッチ学習と呼ぶ。
特に上記にn=1でデータを選ぶ方法はオンライン学習と呼ばれる。

ミニバッチ学習の利点は、バッチ学習と比較して計算リソースが少なく、オンライン学習と比較して重みの更新が安定すること

確率的勾配降下法の改善アルゴリズム

それぞれのアルゴリズムの特徴は、簡単に書くと以下の通り。

  • Momentum: SGDのパラメータ更新量を移動平均的な動きに調整
  • Nesterovの加速勾配降下法: 確実に損失関数値が減少する方向にパラメータ更新量を調整
  • AdaGrad:パラメータ更新量に応じて学習率を調整
  • PMSProp:AdaGradアルゴリズムを修正して学習率が低くなりすぎないように調整
  • Adam: MomentumとPMSPropを組み合わせたアルゴリズム

Momentum

過去の更新方向から、更新量を調整するテクニック
Momentum(慣性)と言われるように、重みが更新されている方向に更新量が上澄みされる。
重み更新の動きが、移動平均をかけたような感じになる。

Momentumを含めたSGDアルゴリズム



g_{t}=\frac{dL(w)}{dw} :勾配計算\\
m = ηg_{t} + γm:パラメータ更新量調整\\
w_{t+1}=w-m :パラメータ更新

γは、前回の勾配値の重みであり、パラメータ更新量mは通常のSGDから移動平均をかけたような動きを示す。

Nesterovの加速勾配降下法

Nesterov Accelerated Gradient :NAGと呼ばれ、Momentumを改善したアルゴリズム
パラメータ更新量の方向が正しい方向を向いているかを確かめた上でパラメータを更新するという考え方。
Momentumだけでパラメータ更新した後の勾配を確認して、パラメータを更新する。



g_{t}=\frac{dL(w-m)}{dw} :勾配計算\\
m = ηg_{t} + γm:パラメータ更新量調整\\
w_{t+1}=w-m :パラメータ更新

先にMomentumの項で重みを変更させて勾配を計算している。

上記の通り、アルゴリズムを分けて説明したが、すべて含まれたものをSGDとして扱うことも多い。
それぞれの処理の動きをアニメーションで示したページがあったので、紹介する。
qiita.com

AdaGrad

SGDでは学習率ηは常に固定であるが、この調整を加えたアルゴリズム
更新回数に応じて学習率を変更する。基本的には、学習回数が多い場合は学習率を下げる。



g_{t}=\frac{dL(w)}{dw} :勾配計算\\
h = h + g_{t}×g_{t}:パラメータ更新量調整\\
w_{t+1}=w-η\frac{g_{t}}{\sqrt{h}+e} :パラメータ更新

パラメータeは、0除算を防ぐためのきわめて小さい値です。

RMSProp

AdaGradと似た学習率を変更するモデル。
AdaGradでは、パラメータの勾配の二乗和を使用する為に必ず正の値となるため、学習率は必ず下がる。
このアルゴリズムでは、学習率が小さくなりすぎないように対応している。



p < 1\\
g_{t}=\frac{dL(w)}{dw} :勾配計算\\
h = p×h + (1 - p)×g_{t}×g_{t}:パラメータ更新量調整\\
w_{t+1}=w-η\frac{g_{t}}{\sqrt{h}+e} :パラメータ更新

パラメータhは、学習率を調整するためのパラメータであり、計算式より移動平均をかけた値になっている。
また、計算内には勾配値の二乗が含まれており、学習値が小さくなりすぎないように調整がされている。

Adam(Adaptive Moment Estimation)

RMSPropを改良し、momentumの要素を加えたアルゴリズム



p < 1\\
g_{t}=\frac{dL(w)}{dw} :勾配計算\\
m = ηg_{t} + γm:パラメータ更新量調整 Momentum\\
h = p×h + (1 - p)×g_{t}×g_{t}:パラメータ更新量調整 PMSProp\\
w_{t+1}=w-η\frac{m}{\sqrt{h}+e} :パラメータ更新

まとめ

今回は逆誤差伝播法についてまとめました。
アルゴリズムの動きをコードで確認している最中なので、それが完成したら公開しようと思います。

ニューラルネットワークについて②


前回の続きで、書ききれなかった部分について説明していきます。

目次


損失関数とは

前回の記事でも少し書きましたが、損失関数は最適解の基準となる良し悪しの評価し、ニューラルネットワークの学習で用いられる関数を指します。
ただし、今回はニューラルネットワークで使われる損失関数の話となるため、コスト関数が非凸な関数となる可能性が高く、単純ではありません。
また、機械学習ディープラーニングを用いた実装では、学習用データの損失が小さすぎるというのも問題が生じる可能性があるため、設計時に踏まえておくべき側面について、まとめていきたいと思います。

ディープラーニングでの損失関数の特徴

上記の通り、非凸な関数である可能性が高く、勾配降下法に伴うパラメータ更新によって達した地点が最適解かどうかはわかりません。
そのため、最適化には今後説明する確率的勾配降下法など、処理を複数回実行して確かめる作業が必要となります。

目指すべき損失について

機械学習ディープラーニングでは、学習用データの損失が小さいということが必ずしも良いことではありません。
というのも、実際に運用された際に入力されたデータと学習用のデータは若干性質が異なる場合があるため、学習用のデータで合わせこみすぎてしまうと、少し違うデータが来ただけで、大きく予想を外してしまう場合があるからです。
これを過学習と呼び、過学習に対する対応は機械学習ディープラーニングで大きな課題となります。
今後説明する、正則化項の導入、次元削除等の対応が、この課題に対応した方法として一般的に使われます。

損失関数関数の種類(Loss Function)

広く一般的に使われる平均二乗誤差以外に、目的に応じてコスト関数の設計は必要。
例えば、ステップ関数のように0 or 1しか返さないような関数を使ってしまうと、結果パターンが2つしかないため、どの程度の状態なのかを評価できない。
このようなケースもあるため、それぞれの特徴についてまとめる。

  • 平均二乗誤差: 一般的に使われる。二乗和でも問題ない
  • クロスエントロピー:分類などで使用する。値の範囲を0~1をとり、推定した確率分布と正解の確率分布がどの程度異なるかを測る。分類項目それぞれに属する確率を示しており、すべてを合計すると1(100%)となる。


ニューラルネットワークの普遍性定理について

1989年にG.Cybenkoの論文にて提唱された定理であり、
ニューラルネットワークは中間層1層で任意の関数を近似できる」といったもの。
つまり、入力層と中間層、出力層の3層でどんな関数も表現可能ということ。

ただし、中間層のノードを大量にしないと解決できないケースも想定され、層を増やすことでより少ないノードで解決ケースもある。
別名、万能近似定理と呼ばれる。

まとめ

今回はニューラルネットワークの設計の残りの部分について、まとめました。
詳しい内容は次にまとめていこうと思いますが、ここまででニューラルネットワークの構造や設計時の考え方について少しわかってきたのではないかと思います。

ニューラルネットワークについて①


前回はニューロン及び人工ニューロンの説明をしました。
今回は、ニューラルネットワークについて説明していきたいと思います。

目次


ニューラルネットワークとは

人工ニューロンを多く組み合わせたものを「ニューラルネットワーク(NN)」と呼びます。
ニューラルネットワークのうち、一方通行であるものを「Feed-forward NN」、多層(4層)以上のものを「Deep Learning NN」と呼びます。

前回の記事でも書きましたが、ニューロン単体だけでは線形的な単純な表現しかできません。
ただ、複数を重ね合わせることで複雑な表現ができるようになり、様々なデータ上の現象に対応したモデルが作れるようになるということですね。
これはまだ言いすぎですが・・

ニューラルネットワークの例

ニューラルネットワークの例を以下画像に示します。
一番左の列を「入力層」、一番右列を「出力層」、2つに挟まれた層を「中間層(隠れ層)」と呼びます。

図:ニューラルネットワーク
f:id:toku_dango:20211204221240p:plain

活性化関数の導入

ニューラルネットワークは、人工ニューロンの重ね合わせであり、それによって複雑な表現ができるという話をしました。
ただ、線形的な表現の組み合わせでは非線形なモデルは構築できません。
非線形的なより複雑な現象に対応するための方法として、活性化関数の導入があります。

図:人工ニューロンの例
f:id:toku_dango:20211204223107p:plain

活性化関数を含めた人工ニューロンの動作

人工ニューロンでは以下の通り計算がなされています。
活性化関数はこの入力信号の総和(y)に対して変換されます。


・人工ニューロン(活性化関数を含めた計算)

y = x1×w1+x2×w2 + b×1\\
=\sum_{}X^TW\\
y' = h(y)\\
h:活性化関数

活性化関数の種類(Activation Function)

活性化関数によって非線形的な表現が可能になるということでしたが、どういった関数なのかをまとめます。
ニューラルネットワークは人工ニューロンの重ね合わせであり、人工ニューロンそれぞれに活性化関数が導入されます。
ニューラルネットワーク上の人工ニューロンの位置によっても活性化関数の役割が変わってくるので、それぞれに対して設計必要です。

ただ、一般的には以下性質を持つような関数が望ましいものとして使われます。

  • 微分可能: 後述の重みの計算を実施する為に必須な性質
  • 非線形非線形性を持っていないと意味がないので、必須な性質
  • 学習が速い
  • 出力値がある範囲に絞られる:出力層などで、出力値を0~1にしたいなど出力値に指定がある時に必要な性質


代表的な活性化関数
【出力層で多く使われる】

  • 線形関数(恒等関数):入力信号の総和がそのままほしい場合に使用。非線形な表現が求められている場合には使いません。
  • シグモイド関数:出力がベルヌーイ分布(0~1)の時に使用。出力層で使用する場合が多い。
  • ソフトマックス関数:マルチヌーイ分布について使用される。全種類のカテゴリに属する確率算出で使用され、全確率を合計すると1になるような出力を持つ。


【中間層で多く使われる】

図:代表的な活性化関数のグラフ(左から順に線形関数、ReLu関数、シグモイド関数、ハイパボリックタンジェント)
オレンジ:活性化関数を微分したもの(導関数)
f:id:toku_dango:20211204230142p:plain

活性化関数選びの注意点

ニューラルネットワークでは、出力値(予測値)と実際の値の差分である誤差を最小化するために、重みの更新を行う学習を行います。
具体的には、勾配降下法、誤差逆伝播法を使って計算される勾配値を基に重みを更新します。
ただ、この勾配値は活性化関数に依存し、活性化関数の選び方によっては勾配=0となるケースが多くなる場合があります。
勾配=0となると、パラメータは更新されなくなり学習が進まなくなるため、このような勾配消失の課題に対して考慮する必要があります。

具体的な計算については、誤差逆伝播法の説明の際にまとめようと思いますが、
人工ニューロンの出力値は活性化関数を通して計算されるため、活性化関数の導関数を用いて簡単に考えることが可能です。

先程のグラフ オレンジ(導関数)のプロットの縦軸が勾配になります。
例えば線形関数では、どの値でも1をしてしており、勾配は常に存在します。
ただ、シグモイド関数では、最大値が0.25、ただしほとんど領域が0に近い値をとります。
逆伝播計算では、この勾配を出力層から入力層方向に乗算していって、重みを更新するという計算をする為、
シグモイド関数のような活性化関数を中間層で多用すると、あっという間に勾配が0に近づいてしまいます。
これが勾配消失です。なので、シグモイド関数、ハイパボリックタンジェントなどの関数を中間層で使用することは好ましくないといえます。

勾配降下法

参考までに勾配降下法を説明します。
先程、「ニューラルネットワークでは、出力値(予測値)と実際の値の差分の誤差を最小にするために、重みの更新を行う」と説明しました。
ニューラルネットワークだけではなく、「モデル関数に対してパラメータ(係数)を更新していって、最適解を目指すこと」が勾配降下法のアルゴリズムです。

「最適解が何か」を説明する為に、説明変数が1つの関数を例とします。



y = a × x \\
a:パラメータ\\
x:説明変数\\
y:目的変数\\
これがデータに当てはまるようにaを求める問題を解くことになりますが、これを解く方法として最小二乗法(残差平方和)が使われます。
つまり、


\sum_{}(y - (a × x))^2\\
が最小になるような最適解 aを求めることがゴールであり、その効率的な方法が、勾配降下法です。
※上記のような結果の良し悪しの評価に使う式をコスト関数、損失関数と呼びます。

勾配降下法は、損失関数における現在の位置から勾配の方向に任意の距離だけ進むアルゴリズムになります。
つまり、以下図で見ると損失関数=0になるところにパラメータを更新したい為、現在値(赤点)で微分微分値の逆方向にパラメータを動かすという方法です。

図:損失関数と勾配計算
f:id:toku_dango:20211205133333p:plain

変数が複数の場合は偏微分を行い、それぞれの変数に対する微分値(勾配)を求めることで同様に計算が可能です。
微分によって勾配を求め、パラメータ更新のベクトル方向を決める。パラメータを更新する」このイメージがつかめればよいと思います。

まとめ

今回はニューラルネットワークについて、まとめました。
すべて書ききれなかったので、続きは次にするとして、今回の記事で活性化関数の設計、勾配降下法について理解の助けとなれたら幸いです。