人工ニューラルネットワークは現在、人気のピークにあります。 有名人がマーケティングとこのモデルの適用に役割を果たしたかどうか疑問に思うかもしれません。 私は彼らの製品で「人工ニューラルネットワーク」と「ディープラーニング」の使用を喜んで言及しているビジネスマネージャーを知っています。 彼らの製品が「接続された円のモデル」または「機械」を使用した場合、彼らは喜んでいるでしょうか?あなたは罰せられるでしょう」。 しかし、疑いもなく、人工ニューラルネットワークは価値のあるものであり、画像認識、自然言語処理、自動取引、自動運転車などの多くのアプリケーション分野で成功していることから明らかです。 私はデータ処理と分析のスペシャリストですが、以前はそれらを理解していなかったため、ツールをマスターしていないマスターのように感じました。 しかし最後に、「宿題」を完成させ、この記事を執筆して、他の人が(まだ進行中の)トレーニング中に遭遇したのと同じ障害を克服できるようにしました。
この記事で紹介した例のRコードは、機械学習問題バイブルにあります。 さらに、この記事を読んだ後、パート2、 ニューラルネットワーク-実用例を検討する価値があります。この例では、ニューラルネットワークの作成とプログラミングをゼロから詳しく説明しています。
やる気のあるタスクから始めましょう。 グレースケールの画像セットがあります。各画像は2×2ピクセルグリッドで、各ピクセルの輝度値は0(白)から255(黒)です。 私たちの目標は、「階段」パターンの画像を見つけるモデルを作成することです。
この段階では、論理的にデータを選択できるモデルを見つけることにのみ関心があります。 この選択方法は、後で興味深いものになります。
前処理
各画像でピクセルをマークします $インライン$ x_ {1} $インライン$ 、 $インライン$ x_ {2} $インライン$ 、 $インライン$ x_ {3} $インライン$ 、 $インライン$ x_ {4} $インライン$ 入力ベクトルを生成します $ inline $ x = \ begin {bmatrix} x_ {1}&x_ {2}&x_ {3}&x_ {4} \ end {bmatrix} $ inline $ 、モデルへの入力になります。 モデルでは、True(画像に階段パターンが含まれる)またはFalse(画像に階段パターンが含まれない)が予測されると予想されます。
Imageid | x1 | x2 | x3 | x4 | Isstairs |
---|---|---|---|---|---|
1 | 252 | 4 | 155 | 175 | TRUE |
2 | 175 | 10 | 186 | 200 | TRUE |
3 | 82 | 131 | 230 | 100 | 偽 |
... | ... | ... | ... | ... | ... |
498 | 36 | 187 | 43 | 249 | 偽 |
499 | 1 | 160 | 169 | 242 | TRUE |
500 | 198 | 134 | 22 | 188 | 偽 |
単層パーセプトロン(モデル0の反復)
単層パーセプトロンで構成される単純なモデルを構築できます。 パーセプトロンは、入力データの重み付き線形結合を使用して、予測推定値を返します。 予測推定値が選択したしきい値を超える場合、パーセプトロンはTrueと予測します。 それ以外の場合、Falseと予測されます。 より正式な場合、
$$ display $$ f(x)= {\ begin {cases} 1&{\ text {if}} \ w_1x_1 + w_2x_2 + w_3x_3 + w_4x_4> threshold \\ 0&{\ text {otherwise}} \ end {cases }} $$表示$$
別の言い方をしましょう
$$表示$$ \ widehat y = \ mathbf w \ cdot \ mathbf x + b $$表示$$
$$ display $$ f(x)= {\ begin {cases} 1&{\ text {if}} \ \ widehat {y}> 0 \\ 0&{\ text {otherwise}} \ end {cases}} $$ディスプレイ$$
ここに $インライン$ \ hat {y} $インライン$ - 予測の予測 。
グラフィカルに、パーセプトロンを出力ノードにデータを送信する入力ノードとして表すことができます。
この例では、次のパーセプトロンを作成します。
$$表示$$ \ hat {y} =-0.0019x_ {1} + 0.0016x_ {2} + 0.0020x_ {3} + 0.0023x_ {4} + 0.0003 $$表示$$
パーセプトロンがいくつかのトレーニング画像でどのように機能するかを以下に示します。
これは、ランダムな推測よりも間違いなく優れており、適切です。 すべての階段パターンの一番下の行に暗いピクセルがあり、大きな正の係数が作成されます。 $インライン$ x_ {3} $インライン$ そして $インライン$ x_ {4} $インライン$ 。 ただし、このモデルには明らかな問題があります。
- モデルは、値が類似性の概念と相関する実数値を出力します(値が大きいほど、画像にラダーが存在する可能性が高くなります)。ただし、これらの値は区間[0 、1]。
- モデルは、変数とターゲット値の間の非線形関係をキャプチャできません。 これを確認するには、次の仮想シナリオを検討してください。
ケースA
画像x = [100、0、0、125]から始めましょう。 増やす $インライン$ x_ {3} $インライン$ 0から60まで。
ケースB
前の画像、x = [100、0、60、125]から始めましょう。 増やす $インライン$ x_ {3} $インライン$ 60から120まで。
直感的には、 ケースAはさらに増加するはずです $インライン$ \ hat {y} $インライン$ ケースBより ただし、パーセプトロンモデルは線形方程式なので、ゲインは+60 $インライン$ x_ {3} $インライン$ どちらの場合も+0.12の増加につながります $インライン$ \ hat {y} $インライン$ 。
私たちの線形パーセプトロンには他の問題もありますが、まずこれら2つを解決しましょう。
シグモイド活性化機能を備えた単層パーセプトロン(モデル1の反復)
問題1と2は、パーセプトロンをS字型に包むことで解決できます(他の重みを選択します)。 「シグモイド」関数は、0から1の間の垂直軸に沿って区切られたS字曲線であるため、バイナリイベントの確率をモデル化するためによく使用されることを思い出してください。
$$表示$$シグモイド(z)= \ frac {1} {1 + e ^ {-z}} $$表示$$
この考えに従って、モデルを次の画像と方程式で補完できます。
$$表示$$ z = w \ cdot x = w_1x_1 + w_2x_2 + w_3x_3 + w_4x_4 $$表示$$
$$ディスプレイ$$ \ widehat y =シグモイド(z)= \ frac {1} {1 + e ^ {-z}} $$ディスプレイ$$
おなじみ? はい、これは旧来のロジスティック回帰です。 ただし、シグモイド活性化関数を備えた線形パーセプトロンとしてモデルを解釈することは、より一般的なアプローチの機会を増やすため、役立ちます。 また、解釈できるようになったため $インライン$ \ hat {y} $インライン$ 確率として、それに応じて決定ルールを変更する必要があります。
$$ display $$ f(x)= {\ begin {cases} 1&{\ text {if}} \ \ widehat {y}> 0.5 \\ 0&{\ text {otherwise}} \ end {cases}} $$ディスプレイ$$
問題の例を続けて、次の選択されたモデルがあると仮定します。
$$ display $$ \ begin {bmatrix} w_1&w_2&w_3&w_4 \ end {bmatrix} = \ begin {bmatrix} -0.140&-0.145&0.121&0.092 \ end {bmatrix} $$ display $$
$$表示$$ b = -0.008 $$表示$$
$$ディスプレイ$$ \ widehat y = \ frac {1} {1 + e ^ {-(-0.140x_1 -0.145x_2 + 0.121x_3 + 0.092x_4 -0.008)}} $$ディスプレイ$$
前のセクションの画像の同じ例でこのモデルがどのように動作するかを観察します。
私たちは間違いなく問題1を解決することができました。
ケースA
画像[100、0、0、100]から始めましょう。 増やす $インライン$ x_3 $インライン$ 「0〜50。
ケースB
画像[100、0、50、100]から始めましょう。 増やす $インライン$ x_3 $インライン$ 「50から100。
シグモイドの曲率により、 ケースAが増加するにつれてケースAがどのように「動作」(急速に増加)するかに注目してください。 $インライン$ z = w \ cdot x $インライン$ しかし、増加が続くとペースは遅くなります $インライン$ z $インライン$ 。 これは、 ケースAは、 ケースBよりも階段パターンの可能性の大幅な増加を反映すべきであるという直感的な理解と一致しています。
残念ながら、このモデルにはまだ問題があります。
- $インライン$ \ widehat y $インライン$ 各変数と単調な関係があります。 しかし、明るい日陰の階段を認識する必要がある場合はどうでしょうか?
- モデルは変数の相互作用を考慮しません。 画像の一番下の行が黒であるとします。 左上のピクセルが白の場合、右上のピクセルを暗くすると、階段パターンの可能性が高くなります。 左上のピクセルが黒の場合、右上のピクセルをシェーディングすると、階段の可能性が低くなります。 言い換えれば、増加 $インライン$ x_3 $インライン$ 潜在的に増加または減少するはずです $インライン$ \ widehat y $インライン$ 、他の変数の値に応じて。 現在のモデルでは、これは達成できません。
シグモイド活性化機能を備えた多層パーセプトロン(モデル2の反復)
上記の問題の両方を解決するには、パーセプトロンモデルに別のレイヤーを追加します。 上記のモデルに似たいくつかの基本モデルを作成しますが、各基本モデルの出力を別のパーセプトロンの入力に転送します。 このモデルは、実際には「バニラ」ニューラルネットワークです。 さまざまな例でどのように機能するかを見てみましょう。
例1:階段パターン認識
- 「左階段」が認識されたときに機能するモデルを構築し、 $インライン$ \ widehat y_ {左} $インライン$
- 「右階段」が認識されたときに機能するモデルを構築し、 $ inline $ \ widehat y_ {right} $ inline $
- 基本モデルに推定値を追加して、 両方の値( $インライン$ \ widehat y_ {左} $インライン$ 、 $ inline $ \ widehat y_ {right} $ inline $ )素晴らしい
別のオプション
- 下の行が暗いときに機能するモデルを作成し、 $インライン$ \ widehat y_1 $インライン$
- 左上のピクセルが暗く、右上のピクセルが明るい場合に機能するモデルを作成します。 $インライン$ \ widehat y_2 $インライン$
- 左上のピクセルが明るく、右上のピクセルが暗いときに機能するモデルを構築しましょう。 $インライン$ \ widehat y_3 $インライン$
- 最終シグモイド関数が次の場合にのみ機能するように、基本モデルを追加します。 $インライン$ \ widehat y_1 $インライン$ そして $インライン$ \ widehat y_2 $インライン$ 素晴らしいとき $インライン$ \ widehat y_1 $インライン$ そして $インライン$ \ widehat y_3 $インライン$ 素晴らしいです。 (ことに注意してください $インライン$ \ widehat y_2 $インライン$ そして $インライン$ \ widehat y_3 $インライン$ 同時に大きくすることはできません。)
例2:明るい色の階段を認識する
- 「影付きの下段」、「影付きx1と白x2」、「影付きx2と白x1」、 $インライン$ \ widehat y_1 $インライン$ 、 $インライン$ \ widehat y_2 $インライン$ そして $インライン$ \ widehat y_3 $インライン$
- 「暗い下の列」、「暗いx1と白いx2」、「暗いx2と白いx」、 $インライン$ \ widehat y_4 $インライン$ 、 $インライン$ \ widehat y_5 $インライン$ そして $インライン$ \ widehat y_6 $インライン$
- モデルを接続して、シグモイドで結果を圧縮する前に、「濃い」識別子が「シェーディングされた」識別子から減算されるようにします
用語メモ
1つの層のパーセプトロンには1つの出力層があります。 つまり、作成したモデルは2層パーセプトロンと呼ばれます。これは、別の出力層の入力である出力層があるためです。 ただし、同じモデルをニューラルネットワークと呼ぶことができます。この場合、ネットワークには3つの層(入力層、非表示層、出力層)があります。
代替アクティベーション機能
この例では、シグモイド活性化関数を使用しました。 ただし、他のアクティベーション機能も使用できます。 しばしばtanhとreluを使用しました 。 活性化関数は非線形でなければなりません。そうでなければ、ニューラルネットワークは同様の単層パーセプトロンに単純化されます。
マルチクラス分類
最終出力レイヤーで複数のノードを使用することで、モデルを簡単に拡張して、マルチクラス分類で機能するようにすることができます。 ここでの考え方は、各出力ノードがクラスの1つに対応するということです $インライン$ c $インライン$ 予測しようとしています。 からの要素を反映するシグモイドで出力を狭める代わりに $インライン$ \ mathbb {R} $インライン$ 区間[0、1]から要素に入れると、 softmax関数を使用できます。 この関数は 、 $インライン$ \ mathbb {R} ^ n $インライン$ ベクトルで $インライン$ \ mathbb {R} ^ n $インライン$ 結果のベクトルの要素の合計が1になるようにします。言い換えると、ベクトル[ $インライン$ prob(class_1)$インライン$ 、 $インライン$ prob(class_2)$インライン$ 、...、 $インライン$ prob(class_C)$インライン$ ]。
3つ以上のレイヤーを使用する(深層学習)
疑問に思うかもしれません-「バニラ」ニューラルネットワークを拡張して、その出力層を4番目の層(さらに5番目、6番目など)に転送することは可能ですか? はい これは通常「ディープラーニング」と呼ばれます。 実際には、非常に効果的です。 ただし、1つ以上の隠れ層で構成されるネットワークは、1つの隠れ層を持つネットワークでシミュレートできることに注意してください。 実際、 普遍近似定理によれば、1つの隠れ層を持つニューラルネットワークを使用して、任意の連続関数を近似できます。 1つの隠れ層を持つネットワークではなく、ディープニューラルネットワークアーキテクチャを頻繁に選択する理由は、選択手順中に、通常、ソリューションにすばやく収束するためです。
ラベル付きトレーニングサンプルのモデルの選択(学習エラーの逆分布)
悲しいかな、私たちは選択手順に到達しました。 これに先立ち、ニューラルネットワークが効率的に機能するという事実について話しましたが、ニューラルネットワークがラベル付きトレーニングサンプルにどのように適応するかについては説明しませんでした。 この質問の類似点は、「ラベル付きのトレーニングサンプルに基づいてネットワークに最適な重みを選択するにはどうすればよいですか?」です。 通常の答えは勾配降下です(ただし、 MMPが適している場合もあります)。 問題の例を引き続き処理すると、勾配降下手順は次のようになります。
- ラベル付きのトレーニングデータから始めます
- 微分可能な損失関数を最小化するには、 $インライン$ L(\ mathbf {\ widehat Y}、\ mathbf {Y})$ inline $
- ネットワーク構造を選択します。 特に、レイヤーの数と各レイヤーのノードを決定する必要があります。
- ランダムな重みでネットワークを初期化します。
- ネットワークを介してトレーニングデータを渡し、各サンプルの予測を生成します。 損失関数に従って合計誤差を測定し、 $インライン$ L(\ mathbf {\ widehat Y}、\ mathbf {Y})$ inline $ 。 (これは直接配布と呼ばれます。)
- 各重みの小さな変化に対して、現在の損失がどのように変化するかを判断します。 つまり、勾配を計算します $インライン$ L $インライン$ ネットワーク内の各重みを考慮に入れます。 (これは逆伝播と呼ばれます。)
- 負の勾配の方向に小さな「ステップ」を作成します。 たとえば、 $インライン$ w_ {23} = 1.5 $インライン$ 、そして $ inline $ \ frac {\ partial L} {\ partial w_ {23}} = 2.2 $ inline $ その後減少 $インライン$ w_ {23} $インライン$ 少しでも電流損失がわずかに減少するはずです。 したがって、我々は変化しています $ inline $ w_3:= w_3-2.2 \ times 0.001 $ inline $ (ここで、0.001は指定された「ステップサイズ」です)。
- このプロセスを(ステップ5から)一定回数繰り返すか、損失が収束するまで繰り返します
少なくともそれが主なアイデアです。 実際に実装すると、多くの困難が生じます。
難易度1-計算の複雑さ
選択プロセスでは、とりわけ、勾配を計算する必要があります $インライン$ L $インライン$ 各重量を考慮に入れます。 これは難しいので $インライン$ L $インライン$ 出力層の各ノードに依存し、これらの各ノードはその前の層の各ノードに依存します。 これは、計算が $ inline $ \ frac {\ partial L} {\ partial w_ {ab}} $ inline $ 複雑な導関数式を使用して、実際の悪夢に変わります。 (実世界の多くのニューラルネットワークには、数十の層に数千のノードが含まれていることを忘れないでください。)この問題は、複雑な微分方程式を適用する際に、 $ inline $ \ frac {\ partial L} {\ partial w_ {ab}} $ inline $ 同じ中間デリバティブを再利用します。 これを注意深く監視すれば、同じ計算が何千回も繰り返されるのを避けることができます。
別のトリックは、特別なアクティベーション関数を使用することです。その派生関数は、値の関数として記述できます。 たとえば、デリバティブ $インライン$シグモイド(x)$インライン$ = $インライン$シグモイド(x)(1-シグモイド(x))$インライン$ 。 直接パス中に計算するため、これは便利です $インライン$ \ widehat y $インライン$ 各トレーニングサンプルについて、計算する必要があります $インライン$シグモイド(\ mathbf {x})$インライン$ いくつかのベクトルのビット単位 $インライン$ \ mathbf {x} $インライン$ 。 バックプロパゲーション中に、これらの値を再利用して勾配を計算できます $インライン$ L $インライン$ 重みを考慮して、時間とメモリを節約します。
3番目のトリックは、トレーニングサンプルを「ミニグループ」に分割し、各グループを次々に考慮して重みを変更することです。 たとえば、トレーニングデータを{batch1、batch2、batch3}に分割すると、トレーニングデータの最初のパスは次のようになります。
- batch1に基づいて重みを変更する
- batch2に基づいて重みを変更する
- batch3に基づいて重みを変更する
勾配はどこですか $インライン$ L $インライン$ 各変更後に再計算されました。
最後に、言及する価値のある別の手法は、中央処理装置の代わりにビデオ処理装置を使用することです。これは、多数の並列計算を実行するのにより適しているためです。
難易度2-勾配降下法では絶対最小値を見つけるのに問題がある
これは、勾配降下ほどニューラルネットワークの問題ではありません。 勾配降下中に、重みが極小値でスタックする可能性があります。 少なくとも重みが「ジャンプ」する可能性もあります。 これを処理する1つの方法は、異なるステップサイズを使用することです。 別の方法は、ネットワーク内のノードやレイヤーの数を増やすことです。 (しかし、過度に近い適合を恐れる)。 さらに、 モーメントを使用するなどのいくつかのヒューリスティック手法が効果的です。
難易度3-共通のアプローチを開発する方法
任意の数のノードとレイヤーを持つ任意のニューラルネットワークの値を選択できる遺伝的プログラムを作成する方法は? 正解は、 Tensorflowを使用する必要があるということです。 しかし、試してみたい場合、最も難しい部分は損失関数の勾配を計算することです。 ここでのコツは、グラデーションを再帰関数として表現できるかどうかを判断することです。 5層のニューラルネットワークは、一部のパーセプトロンにデータを送信する4層のニューラルネットワークです。 しかし、4層ニューラルネットワークは、パーセプトロンなどにデータを転送する3層ニューラルネットワークにすぎません。 より正式には、これは自動微分と呼ばれます 。