畳み込みニューラルネットワークを理解するための初心者向けガイド

f:id:miyamotok0105:20170305124437p:plain

前書き

畳み込みニューラルネットワーク。 生物学と数学の奇妙な組み合わせのように聞こえるかもしれませんが、これらのネットワークはコンピュータビジョンの分野で最も影響力のあるイノベーションの一部です。 Alex Krizhevskyが2005年のImageNet(基本的にはコンピュータビジョンの年次オリンピック)に勝利し、分類エラーの記録を26%から15%に落とし、神経ネットが目立つようになったのは2012年です。 それ以来、数多くの企業が深い学習を彼らのサービスの中核に使ってきました。 Facebookは自動的なタグ付けアルゴリズムのためにニューラルネットGoogleは写真検索、Amazonは商品の推奨、Pinterestは自宅のフィードパーソナライゼーション、Instagramは検索インフラストラクチャを使用しています。

しかし、これらのネットワークの古典的な、そして間違いなく最も一般的なユースケースは、画像処理のためのものです。画像処理の中で、これらのCNNを画像分類に使用する方法を見てみましょう。

問題

画像分類は、入力画像を取得し、クラス(猫、犬など)または画像を最も良く記述するクラスの確率を出力するタスクである。人間にとって、この認識の仕事は、生まれた瞬間から学ぶ最初のスキルの一つであり、成人として自然に、楽に来るものです。二度も考えなくても、私たちは、私たちの周囲の環境だけでなく、私たちを取り囲む物体を素早くシームレスに識別することができます。私たちがイメージを見るときや、私たちの周りの世界を見るときには、ほとんどの場合、シーンをすぐに特徴付けることができ、各オブジェクトにラベルを付けることができます。パターンを素早く認識し、事前の知識から一般化し、さまざまな画像環境に適応することができるこれらのスキルは、私たちの仲間のマシンと共有していないものです。

f:id:miyamotok0105:20170305124503p:plain

入力と出力

コンピュータが画像を見ると(画像を入力として)、ピクセル値の配列が表示されます。画像の解像度とサイズに応じて、32 x 32 x 3の数の配列が表示されます(3はRGB値を参照します)。ここでは、JPG形式のカラーイメージがあり、そのサイズは480 x 480であるとしましょう。代表的な配列は480 x 480 x 3です。これらの各数値には、0〜255の値が与えられます。その点のピクセル強度これらの数値は、画像分類を実行するときには意味がありませんが、コンピュータで使用できる唯一の入力です。アイデアは、コンピュータにこの数字の配列を与え、画像が特定のクラス(猫の場合は.80、犬の場合は.15、鳥の場合は.05など)の確率を表す数値を出力するということです。

コンピュータにしたいこと

ここで問題と入力と出力を知ったので、これにアプローチする方法を考えてみましょう。私たちがしたいのは、与えられたすべての画像を区別し、犬を犬にしたり、猫を猫にするユニークな特徴を見つけ出すことです。これは私たちの心の中で無意識に進行するプロセスです。犬の絵を見ると、足や足などの識別可能な特徴を持つ絵があれば、それを分類することができます。同様に、コンピュータは、エッジやカーブなどの低レベルのフィーチャを探し、一連の畳み込みレイヤを介してより抽象的なコンセプトを構築することによって、画像の分類を実行することができます。これは、CNNが行うことの一般的な概要です。詳細についてみましょう。

生物学的なつながり

 しかし、まず、少し背景。あなたが最初に畳み込みニューラルネットワークという言葉を聞いた時、あなたは神経科学や生物学に関係するものを考えていたかもしれません。並べ替えCNNsは視覚野から生物学的なインスピレーションを受けます。視覚野は、視野の特定領域に敏感な細胞の小さな領域を有する。このアイデアは、1962年のHubelとWieselの魅力的な実験(ビデオ)で拡張され、脳内のいくつかの個々の神経細胞が特定の向きのエッジの存在下でのみ反応(または発火)することを示した。例えば、いくつかのニューロンは垂直エッジにさらされたときに発火し、いくつかのニューロンは水平または斜めのエッジを示すときに発火する。 HubelとWieselは、これらのニューロンのすべてが円柱状の構造で編成されており、一緒に視覚的知覚を生み出すことができることを発見しました。特定のタスク(特定の特性を探している視覚野の神経細胞)を持つシステム内の特殊なコンポーネントのこの考え方は、マシンが同様に使用するものであり、CNNの基礎となります。

構造

詳細に戻る。 CNNが行うことの詳細な概要は、画像を取得し、一連の畳み込み、非線形、プーリング(ダウンサンプリング)、完全に接続されたレイヤーを渡し、出力を得ることです。先に述べたように、出力は単一のクラス、または画像を最もよく表すクラスの確率になります。今、難しい部分は、これらのレイヤのそれぞれが何をしているかを理解することです。だから、最も重要なものに入ってみましょう。

第1層 - 数学の部分

CNNの最初のレイヤーは、常に畳み込みレイヤーです。あなたが覚えていることを確認するための最初のことは、このconvへの入力(私はその略語をたくさん使っています)の層が何であるかです。前述のように、入力は32 x 32 x 3のピクセル値の配列です。今、コンバージョンレイヤーを説明する最善の方法は、画像の左上に輝く懐中電灯を想像することです。この懐中電灯が照らす光が5×5の領域をカバーしているとしましょう。そして今、この懐中電灯が入力画像のすべての領域を滑っていると想像してみましょう。機械学習の用語では、この懐中電灯はフィルター(またはニューロンまたはカーネルと呼ばれることもあります)と呼ばれ、輝く領域を受容場と呼びます。現在、このフィルタは数値の配列でもあります(数値は重みまたはパラメータと呼ばれます)。非常に重要な点は、このフィルタの深さは入力の深さと同じでなければならないということです(このことは数学が機能することを保証します)。したがって、このフィルタの寸法は5 x 5 x 3です。例えばフィルタが入っている最初の位置です。それは左上隅になります。フィルタが入力画像の周りを摺動または畳み込むと、フィルタの値に画像の元のピクセル値(別名計算要素の乗算)が乗算されます。これらの乗算はすべて合計されます(数学的に言えば、これは合計75回の乗算になります)。だからあなたは一つの番号を持っています。この番号は、フィルタが画像の左上にあるときを表しています。ここでは、入力ボリューム上のすべての場所についてこのプロセスを繰り返します。 (次のステップは、フィルタを1単位だけ右に移動し、次に1ずつ右に移動するなど)。入力ボリューム上のすべてのユニークな場所によって番号が生成されます。フィルタをすべての場所にスライドさせた後で、残っているものが28×28×1の数の配列であることがわかります。これをアクティベーションマップまたはフィーチャマップと呼びます。あなたが28×28アレイを得る理由は、5×5フィルターが32×32入力画像に収まる784の異なる場所があることです。これらの784個の数字は28×28アレイにマッピングされています。

f:id:miyamotok0105:20170305124531p:plain

(クイックノート:上記の画像も含めて、マイケル・ニールセンの “Neural Networks and Deep Learning"という素晴らしい本の中から使用された画像もあります。

ここでは、1つではなく2つの5 x 5 x 3フィルタを使用するとします。それで、私たちの出力量は28 x 28 x 2になります。より多くのフィルタを使うことで、空間次元をより良く保存することができます。数学的には、これは畳み込みレイヤーで起こっていることです。

第1層 - 高レベルの視点

しかし、このコンボルーションが実際に高レベルからやっていることについて話しましょう。これらのフィルタのそれぞれは、フィーチャ識別子と考えることができる。私がフィーチャーを言うとき、私は直線エッジ、単純な色、および曲線のようなものについて話しています。すべての画像が互いに共通する最も簡単な特性について考えてみましょう。私たちの最初のフィルターが7 x 7 x 3で、カーブ検出器になるとしよう。 (このセクションでは、フィルタが3単位の深さであり、簡単にするために、フィルタと画像の最上部の奥行きスライスのみを考慮していないことを無視してみましょう。)カーブ検出器として、フィルタはピクセル構造を持ちます。カーブの形をしている領域に沿って数値が高くなるようにしてください。 f:id:miyamotok0105:20170305124726p:plain

さて、これを数学的に可視化することに戻りましょう。 このフィルタを入力ボリュームの左上隅に配置すると、その領域のフィルタとピクセル値の乗算が計算されます。 次に、分類したい画像の例を見て、フィルタを左上隅に置いてみましょう。

f:id:miyamotok0105:20170305124809p:plain

我々がしなければならないのは、フィルタの値に画像の元のピクセル値を掛けることです。

f:id:miyamotok0105:20170305124818p:plain

基本的に、入力画像で、このフィルタが表す曲線にほぼ似た形があれば、合計されたすべての乗算は大きな値になります!フィルターを動かすとどうなるか見てみましょう。

f:id:miyamotok0105:20170305124843p:plain

値ははるかに低いです!これは、画像セクションにカーブ検出器のフィルタに応答したものがなかったためです。このconvレイヤの出力はアクティブ化マップです。したがって、1つのフィルタコンボリューションの単純なケース(フィルタがカーブ検出器である場合)では、アクティベーションマップには、画像内にカーブが存在する可能性の高い領域が表示されます。この例では、28 x 28 x 1アクティベーションマップの左上の値は6600になります。この高い値は、入力ボリュームにフィルタを有効にする何らかのカーブが存在する可能性が高いことを意味します。入力ボリューム内にフィルタがアクティブになった(またはより単純に、元の画像のその領域にカーブがない)何もないので、アクティブ化マップの右上の値は0になります。これは1つのフィルタにすぎないことに注意してください。これは、外向きと右向きにカーブするラインを検出するフィルタに過ぎません。左または真っ直ぐなエッジにカーブするラインのための他のフィルタを持つことができます。フィルタが多いほど、アクティベーションマップの深度が大きくなり、入力ボリュームについての情報が多くなります。

免責事項:このセクションで説明したフィルタは、畳み込み中に起こる数学を記述することを主な目的として単純化されています。下の図には、訓練されたネットワークの最初のコンバージョンレイヤのフィルタの実際の視覚化の例がいくつか表示されています。それにもかかわらず、主要な議論は変わらない。第1層のフィルタは、入力画像の周りを畳み込み、探している特定のフィーチャが入力ボリュームにあるときに、「アクティブにする」(または高い値を計算する)。

f:id:miyamotok0105:20170305124913p:plain

(クイックノート:上記の画像は、Andrej KarpathyとJustin Johnsonが教えてくれたスタンフォードのCS 231Nコースからのもので、CNNの理解を深める方にお勧めします)

ネットワークを通じてより深く進む

現在の伝統的な畳み込みニューラルネットワークアーキテクチャでは、これらのconvレイヤ間に散在する他のレイヤが存在します。 私はそれらを読んで、その機能と効果を理解することに関心を持つ人を強く奨励しますが、一般的な意味では、ネットワークの頑健性を向上させ、過大適合をコントロールするのに役立つ非線形性と次元の保護を提供します。 古典的なCNNアーキテクチャは、このようになります。 f:id:miyamotok0105:20170305124947p:plain

しかし、最後のレイヤーは重要なものですが、後で説明します。一歩踏み込んで、これまでに学んだことを見直しましょう。最初のコンバレイヤーのフィルターが検出するように設計されているものについて話しました。エッジやカーブなどの低レベルのフィーチャを検出します。想像されるように、画像が物体の一種であるかどうかを予測するためには、手や足や耳のようなより高いレベルの特徴を認識できるネットワークが必要です。最初のコンバージョンレイヤの後にネットワークの出力が何であるかを考えてみましょう。これは、28×28×3のボリューム(3つの5×5×3のフィルタを使用すると仮定)です。別のコンバレイヤを通過すると、最初のコンバレイヤの出力が2番目のコンバレイヤの入力になります。さて、これは視覚化するのが少し難しいです。最初のレイヤーについて話していたとき、入力は元の画像に過ぎませんでした。ただし、第2のconvレイヤーについては、入力は最初のレイヤーの結果であるアクティブ化マップです。したがって、入力の各レイヤーは、基本的に、ある低レベルのフィーチャが現れる元のイメージ内の位置を記述しています。今度は、その上に複数のフィルタを適用すると(第2のconvレイヤを通過させる)、出力はより高いレベルの機能を表すアクティベーションになります。これらのフィーチャのタイプは、半円(曲線と直線エッジの組み合わせ)または四角形(いくつかの直線エッジの組み合わせ)です。ネットワークを通ってより多くのコンバージョン層を通過すると、ますます複雑な機能を表すアクティベーションマップが得られます。ネットワークの終わりには、イメージに手書きがあるときにアクティブになるフィルタ、ピンクのオブジェクトなどが表示されたときにアクティブになるフィルタがあります。ConvNets、Matt Zeiler、Rob Fergusのフィルタを視覚化する方法について詳しくは、トピックを議論する優れた研究論文です。 Jason Yosinskiには、YouTube上で素晴らしいビジュアル表現を提供する動画もあります。注目すべきもう一つの興味深い点は、ネットワークに深く入り込むにつれて、フィルタは受容可能な領域が大きくなり始めたことになります。つまり、元の入力ボリュームの広い領域からの情報を考慮することができますより広い領域のピクセル空間に対してより応答性が高いということです)。

完全に接続されたレイヤー

これらの高レベルの機能を検出できるようになったので、ケーキのアイシングは、ネットワークの最後に完全に接続されたレイヤーを取り付けることです。このレイヤーは基本的に入力ボリューム(出力がconvまたはReLUまたはそれに先行するプールレイヤーのものであれ)を取り、N次元ベクトルを出力します。ここで、Nはプログラムが選択しなければならないクラスの数です。たとえば、桁の分類プログラムが必要な場合、10桁があるため、Nは10になります。このN次元ベクトル内の各数字は、あるクラスの確率を表す。例えば、数字分類プログラムの結果のベクトルが[0 .1 .1 .75 0 0 0 0 .05]である場合、これは画像が1である確率は10%であり、画像が1である確率は10%であり、画像は2、画像が3である確率は75%、画像が9である確率は5%です(サイドノート:出力を表現できる他の方法もありますが、私はsoftmaxアプローチを示しています) )。この完全に接続されたレイヤの仕組みは、前のレイヤの出力(高レベルのフィーチャのアクティベーションマップを表す必要があります)を確認し、特定のクラスと最も関連性の高いフィーチャを特定することです。例えば、プログラムがいくつかの画像が犬であると予測している場合、それは足または4脚などの高レベル特徴を表す活性化マップにおいて高い値を有する。同様に、プログラムがいくつかの画像が鳥や羽などの高度な機能を表すアクティベーションマップには高い値が設定されます。基本的に、FCレイヤーは特定のクラスと最も強く相関する高レベルのフィーチャを調べ、特定のウェイトを持っているため、ウェイトと前のレイヤーの間の積を計算すると、異なるクラスの正しい確率が得られます。

f:id:miyamotok0105:20170305125019p:plain

トレーニング(AKA:この内容を実現するもの)

さて、これは私が意図的に言及していないニューラルネットワークの1つの側面であり、おそらく最も重要な部分です。あなたが読んでいる間に多くの質問があったかもしれません。最初のコンバレイヤのフィルタは、エッジとカーブを探すためにどのように知っていますか?完全に接続されたレイヤーは、どのようなアクティベーションマップを見るべきかを知っていますか?各レイヤーのフィルターはどのような値を持つのかを知っていますか?コンピュータがフィルタ値(または重み)を調整できる方法は、バックプロパゲーションと呼ばれるトレーニングプロセスです。

バックプロパゲーションに入る前に、最初に一歩前進して、ニューラルネットワークが働くために必要なものについて話をする必要があります。私たちすべてが生まれた瞬間、私たちの心は新鮮でした。私たちは、猫や犬や鳥が何であるかを知らなかった。同様の方法で、CNNが始まる前に、重みまたはフィルタ値がランダム化される。フィルタは、エッジとカーブを探すことを知らない。上位層のフィルタは、足やくちばしを探すことを知らない。しかし、年を重ねるにつれて、私たちの両親や先生たちは私たちにさまざまな絵やイメージを見せて、それに対応するラベルをくれました。イメージとラベルを与えられたこの考えは、CNNが習得するトレーニングプロセスです。あまりにもそれに入る前に、私たちは犬、猫、そして鳥の何千もの画像を持っている訓練セットを持っていると言いましょう。そして、それぞれの画像にはその絵が何であるかのラベルがあります。 Backpropに戻る。

したがって、バックプロパゲーションは、順方向パス、損失関数、逆方向パス、および重み更新の4つの異なるセクションに分けることができる。往路ではトレーニング画像を撮りますが、これは32 x 32 x 3の数値の配列であり、ネットワーク全体に渡って渡します。最初のトレーニング例では、すべての重みまたはフィルタ値がランダムに初期化されているため、出力は[.1 .1 .1 .1 .1 .1 .1 .1 .1]のようになります。特に任意の数に優先権を与えない出力。現在の重みを持つネットワークは、それらの低レベルの特徴を探すことができないか、または分類が何であるかについて合理的な結論を出すことができない。これはバックプロパゲーションの損失機能部分に行きます。私たちが今使っているのは、トレーニングデータです。このデータには、画像とラベルの両方があります。たとえば、入力された最初のトレーニング画像が3であったとしましょう。画像のラベルは[0 0 0 1 0 0 0 0 0 0]です。損失関数は多くの異なる方法で定義できますが、共通のものはMSE(平均2乗誤差)です。これは1/2倍(実際の予測値)の2乗です。

f:id:miyamotok0105:20170305125044p:plain

変数Lがその値と等しいとしましょう。 あなたが想像しているように、トレーニング画像の最初のカップルの損失は非常に高くなります。 今、直感的に考えてみましょう。 私たちは、予測ラベル(ConvNetの出力)がトレーニングラベルと同じになるようにしたいと考えています(これはネットワークが予測されたことを意味します)。そこに到達するためには、損失の量を最小限に抑えたい 我々は持っています。 これを微積分の最適化問題として視覚化すると、ネットワークの損失(またはエラー)に最も直接的に寄与した入力(この場合は重み)を見つける必要があります。 f:id:miyamotok0105:20170305125106p:plain

これは、dL / dWの数学的に等価であり、Wは特定の層での重みである。 さて、私たちがやりたいことは、どのウェイトが損失に最も寄与しているかを判断し、損失を減らすようにウェイトを調整する方法を見つけることです。 この微係数を計算したら、最後に重み更新であるステップに進みます。 これは、フィルタのすべてのウェイトを取得し、グラディエントの方向に変化するように更新します。

f:id:miyamotok0105:20170305125136p:plain 学習率は、プログラマによって選択されるパラメータである。 学習率が高いということは、体重の更新においてより大きな措置が取られ、したがって、モデルが最適な体重の集合に収束するのにかかる時間が短くてもよいことを意味する。 しかし、あまりにも高い学習率は、大きすぎて最適点に到達するのに十分な正確さではないジャンプをもたらす可能性があります。

フォワードパス、ロス関数、バックワードパス、およびパラメータ更新のプロセスは、一般に1エポックと呼ばれます。プログラムは、トレーニング画像の各セット(一般的にバッチと呼ばれます)ごとに一定数のエポックでこのプロセスを繰り返します。最後のトレーニングの例でパラメータの更新が完了したら、ネットワークのトレーニングを十分に行い、レイヤの重みが正しく調整されるようにしてください。

テスト

最後に、私たちのCNNが動作しているかどうかを確認するために、画像とラベルのセットが異なります(トレーニングとテストの間に2倍にすることはできません)。出力を地上真理と比較し、ネットワークが機能しているかどうかを確認します。

企業がCNNを使用する仕組み

データ、データ、データこの魔法の4文字の単語をたくさん持っている企業は、競争の残りの部分に固有の利点を持っているものです。ネットワークに与えることができる訓練データが多くなればなるほど、練習反復の回数が増え、ウェイト更新が多くなり、ネットワークに合わせて調整するほうが生産に向かうことになります。 Facebook(およびInstagram)は現在所有している10億人のユーザーのすべての写真を使用でき、Pinterestはそのサイトにある500億ピンの情報を使用でき、Googleは検索データを使用でき、Amazonは数百万の製品毎日買っています。そして今、彼らはそれをどのように使用するのかを知っています。

免責事項

この投稿はCNNを理解するのに適しているはずですが、決して包括的な概要ではありません。このポストで議論されていないことには、フィルタのサイズ、ストライド、パディングなどのネットワークのハイパーパラメータと同様に、非線形およびプーリング層が含まれます。ネットワークアーキテクチャ、バッチ正規化、消失勾配、ドロップアウト、初期化手法、非凸最適化、偏り、損失関数の選択、データ増大、正則化法、計算上の考慮、逆伝播の修正などのトピックも議論されていませんでした。

参考

私は現在UCLAで学んでいる2年生の学部生です。 私はコンピュータサイエンスを専攻しながら、バイオインフォマティクスでマイナーを追求しています。 私はボストン大学で2件、ワシントンD.C.にある米国海軍研究所で2件の研究インターンシップを受けています。 私はコンピュータサイエンス機械学習に関する知識をヘルスケア分野に適用することに情熱を持っています。そこで私たちは本当に医者を助け、患者を世話するためのより良いソリューションを設計することができます。 私が行ったサイド・プロジェクト(ニューラル・ネット、強化学習、Kaggle stuff、スポーツなど)については、私のgithubをチェックしてください。 2017年の夏に積極的にインターンシップを探していますが、コラボレーションの余地があると思ったら私に連絡してください。

米国海軍研究所でのインターンってどんなんなんだろう。。。

https://adeshpande3.github.io/adeshpande3.github.io/A-Beginner’s-Guide-To-Understanding-Convolutional-Neural-Networks/