TensorFlow ANN の例を使用した人工ニューラル ネットワークのチュートリアル

人工ニューラルネットワークとは何ですか?

An 人工ニューラルネットワーク (ANN) は、人工ニューロンと呼ばれる接続されたユニットの集合に基づいて人工脳を作成するための生物学的ニューラル ネットワークからインスピレーションを得たコンピューター システムです。 人間として情報を分析および処理するように設計されています。 人工ニューラル ネットワークには、より多くのデータが利用できるほどより良い結果を生み出す自己学習機能があります。

人工ニューラルネットワーク
人工ニューラルネットワーク

人工ニューラル ネットワーク (ANN) は、次の XNUMX つの主要なオブジェクトで構成されます。

  • : すべての学習は層で行われます。 3) 入力、1) 非表示、2) 出力の 3 つのレイヤーがあります。
  • 機能とラベル: ネットワークへのデータの入力 (特徴) とネットワークからの出力 (ラベル)
  • 損失関数: 学習フェーズのパフォーマンスを推定するために使用される指標
  • オプティマイザ: ネットワーク内の知識を更新することで学習を向上させます

ニューラル ネットワークは入力データを受け取り、それらをレイヤーのアンサンブルにプッシュします。 ネットワークは、損失関数を使用してパフォーマンスを評価する必要があります。 損失関数は、ネットワークが知識を習得する前にたどる必要があるパスのアイデアをネットワークに与えます。 ネットワークは、オプティマイザーの助けを借りて知識を向上させる必要があります。

上の図を見ると、根底にあるメカニズムが理解できるでしょう。

プログラムはいくつかの入力値を受け取り、それらを XNUMX つの完全に接続された層にプッシュします。 数学の問題があると想像してください。最初に行うことは、問題を解決するために対応する章を読むことです。 新しい知識を適用して問題を解決します。 あまり良いスコアが出ない可能性が高いです。 ネットワークでも同様です。 初めてデータを見て予測を行うときは、実際のデータと完全には一致しません。

知識を向上させるために、ネットワークはオプティマイザーを使用します。 私たちの類推では、オプティマイザーはその章を再読するものと考えることができます。 もう一度読むことで、新たな洞察や教訓が得られます。 同様に、ネットワークはオプティマイザーを使用して知識を更新し、新しい知識をテストして、まだ学習する必要がある量を確認します。 プログラムは、エラーが最小限になるまでこのステップを繰り返します。

数学の問題の例えで言えば、教科書の章を何度も読み、授業内容を完全に理解するということです。何度も読んでも間違いが続く場合は、現在の教材では知識の限界に達したことを意味します。スコアを向上させるには、別の教科書を使用するか、別の方法を試す必要があります。ニューラル ネットワークの場合も、同じプロセスです。エラーが 100% から遠く離れているが、曲線が平坦である場合は、現在のアーキテクチャではそれ以上学習できないことを意味します。知識を向上させるには、ネットワークをさらに最適化する必要があります。

ニューラルネットワーク Archi構造

人工ニューラルネットワーク Architecture は次のコンポーネントで構成されます。

  • アクティベーション機能
  • 損失関数
  • オプティマイザ

レイヤーはすべての学習が行われる場所です。 レイヤー内には、無限の量のウェイト (ニューロン) があります。 典型的なニューラル ネットワークは、多くの場合、密に接続された層 (全結合層とも呼ばれます) によって処理されます。 これは、すべての入力が出力に接続されていることを意味します。

一般的なニューラル ネットワークは、入力のベクトルとラベルを含むスカラーを受け取ります。 最も快適な設定は、0 と 1 の XNUMX つのクラスのみを含むバイナリ分類です。

ネットワークは入力を受け取り、接続されているすべてのノードに送信し、信号を計算します。 アクティベーション 機能。

ニューラルネットワーク Archi構造
ニューラルネットワーク Archi構造

上の図はこの考え方をプロットしたものです。 最初の層は隠れ層と呼ばれる XNUMX 番目の層の入力値であり、前の層から重み付けされた入力を受け取ります。

  1. 最初のノードは入力値です
  2. ニューロンは入力部分と活性化関数に分解されます。 左側の部分は、前の層からすべての入力を受け取ります。 右側の部分は、アクティベーション関数への入力パスの合計です。
  3. 隠れ層から計算され、予測を行うために使用される出力値。 分類の場合、クラスの数と同じになります。 回帰の場合、予測される値は XNUMX つだけです。

アクティベーション機能

ノードの活性化関数は、一連の入力が与えられた場合の出力を定義します。 ネットワークが非線形パターンを学習できるようにするには、活性化関数が必要です。 一般的な活性化関数は次のとおりです。 Relu、整流リニアユニット。 この関数は、すべての負の値に対してゼロを返します。

活性化関数

他の活性化関数は次のとおりです。

  • 区分線形
  • シグモイド
  • タン
  • 漏れそうなレル

ニューラル ネットワークを構築する際に行う重要な決定は次のとおりです。

  • ニューラルネットワークの層の数
  • 各レイヤーの隠れユニットの数

多数の層と隠れユニットを持つニューラル ネットワークは、データの複雑な表現を学習できますが、ネットワークの計算コストが非常に高くなります。

損失関数

隠れ層と活性化関数を定義した後、損失関数とオプティマイザーを指定する必要があります。

バイナリ分類の場合、バイナリ相互エントロピー損失関数を使用するのが一般的です。 線形回帰では、平均二乗誤差を使用します。

損失関数は、オプティマイザーのパフォーマンスを推定するための重要なメトリックです。 トレーニング中、このメトリクスは最小化されます。 対処している問題の種類に応じて、この量を慎重に選択する必要があります。

オプティマイザ

損失関数はモデルのパフォーマンスの尺度です。 オプティマイザは、損失を減らすためにネットワークの重みを改善するのに役立ちます。 さまざまなオプティマイザーが使用できますが、最も一般的なのは確率的勾配降下法です。

従来のオプティマイザは次のとおりです。

  • Momentum 最適化、
  • ネステロフ加速勾配、
  • アダグラッド、
  • アダムの最適化

ニューラルネットワークの限界

ニューラル ネットワークの制限は次のとおりです。

オーバーフィット

複雑なニューラル ネットに共通する問題は、未知のデータを一般化することが難しいことです。重みがたくさんあるニューラル ネットワークは、トレーニング セット内の特定の詳細を非常にうまく識別できますが、多くの場合、過剰適合につながります。グループ内でデータが不均衡な場合 (つまり、一部のグループで十分なデータが利用できない場合)、ネットワークはトレーニング中に非常によく学習しますが、そのようなパターンをこれまでに見たことのないデータに一般化することはできません。

機械学習では、最適化と一般化の間にトレードオフがあります。

モデルを最適化するには、トレーニング セットの損失を最小限に抑える最適なパラメーターを見つける必要があります。

ただし、一般化すると、目に見えないデータに対してモデルがどのように動作するかがわかります。

モデルがトレーニングデータの特定の詳細や望ましくないパターンを捉えないようにするために、さまざまなテクニックを使うことができます。最良の方法は、十分な量のデータを持つバランスの取れたデータセットを用意することです。オーバーフィッティングを減らす技術は、 正則化。 従来の技術をいくつか振り返ってみましょう。

ネットワークサイズ

層と隠れユニットが多すぎるニューラル ネットワークは、非常に複雑であることが知られています。モデルの複雑さを軽減する簡単な方法は、モデルのサイズを小さくすることです。層の数を定義するベスト プラクティスはありません。少量の層から始めて、モデルが過剰適合するまでサイズを大きくする必要があります。

重みの正規化

過学習を防ぐ標準的な手法は、ネットワークの重みに制約を追加することです。 この制約により、ネットワークのサイズは小さな値のみを取ることが強制されます。 制約は誤差の損失関数に追加されます。 正則化には次の XNUMX 種類があります。

L1: Lasso: コストは重み係数の絶対値に比例します

L2: リッジ: コストは重み係数の値の XNUMX 乗に比例します。

ドロップアウト

ドロップアウトは奇妙ですが便利なテクニックです。 ドロップアウトのあるネットワークは、一部の重みがランダムにゼロに設定されることを意味します。 重み [0.1、1.7、0.7、-0.9] の配列があると想像してください。 ニューラル ネットワークにドロップアウトがある場合、0.1 がランダムに分布した [0, 0, 0.9, -0] になります。ドロップアウトを制御するパラメーターはドロップアウト率です。 レートは、ゼロに設定される重みの数を定義します。 0.2 ~ 0.5 のレートが一般的です。

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

典型的な分類問題でニューラル ネットワークがどのように機能するかについて、人工ニューラル ネットワークの例を見てみましょう。ランダムな値を持つ 1 つの入力 x2 と xXNUMX があります。出力はバイナリ クラスです。目的は、XNUMX つの特徴に基づいてラベルを分類することです。このタスクを実行するために、ニューラル ネットワーク アーキテクチャは次のように定義されます。

  • XNUMX つの隠れ層
    • 最初の層には完全に接続された XNUMX つのニューロンがあります
    • XNUMX 番目の層には完全に接続された XNUMX つのニューロンがあります
  • 活性化関数は Relu です。
  • 学習率 2 の L0.003 正則化を追加します。

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

ネットワークは、バッチ サイズ 180 で 10 エポック中に重みを最適化します。以下の ANN サンプル ビデオでは、重みがどのように変化し、ネットワークが分類マッピングをどのように改善するかを確認できます。

まず、ネットワークはすべての重みにランダムな値を割り当てます。

  • ランダムな重みを使用した場合、つまり最適化を行わなかった場合、出力損失は 0.453 になります。 下の図は、ネットワークをさまざまな色で表しています。
  • 一般に、オレンジ色は負の値を表し、青色は正の値を示します。
  • データ ポイントは同じ表現を持ちます。 青色は陽性ラベル、オレンジ色は陰性ラベルです。

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

2番目の隠れ層では、線は重みの符号に従って色分けされています。オレンジ色の線は負の重みを割り当て、青色の線は正の重みを割り当てます。

ご覧のとおり、出力マッピングでは、ネットワークはかなり多くの間違いを犯しています。 最適化後にネットワークがどのように動作するかを見てみましょう。

以下の ANN の例の図は、最適化されたネットワークの結果を示しています。 まず、ネットワークがデータ ポイントの分類方法を正常に学習していることがわかります。 前の写真からわかります。 初期の重みは -0.43 でしたが、最適化後の重みは -0.95 になります。

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

このアイデアは、より多くの隠れ層とニューロンを備えたネットワークに一般化できます。 で遊ぶことができます .

TensorFlow を使用してニューラル ネットワークをトレーニングする方法

ここでは、API の推定器 DNNClassifier を使用して TensorFlow ANN でニューラル ネットワークをトレーニングする方法を段階的に説明します。

MNIST データセットを使用して、最初のニューラル ネットワークをトレーニングします。 ニューラルネットワークをトレーニングする TensorFlow それほど複雑ではありません。 前処理ステップは、前のチュートリアルとまったく同じです。 次のように進めます。

  • ステップ 1: データをインポートする
  • ステップ 2: データを変換する
  • ステップ 3: テンソルを構築する
  • ステップ 4: モデルを構築する
  • ステップ 5: モデルをトレーニングして評価する
  • ステップ 6: モデルを改善する

ステップ 1) データをインポートする

まず、必要なライブラリをインポートする必要があります。 以下の TensorFlow ニューラル ネットワークの例に示すように、scikit learn を使用して MNIST データセットをインポートできます。

MNIST データセットは、新しい技術やアルゴリズムをテストするためによく使用されるデータセットです。このデータセットは、28 から 28 までの手書きの数字を含む 0×9 ピクセルの画像のコレクションです。現在、テストの最小エラーは、0.27 つの畳み込みニューラル ネットワークの委員会で 7 パーセントです。

import numpy as np
import tensorflow as tf
np.random.seed(1337)

scikit learn は、このアドレスから一時的にダウンロードできます。 データセットをコピーして、便利なフォルダーに貼り付けます。 データを Python にインポートするには、scikit learn の fetch_mldata を使用できます。 ファイル パスを fetch_mldata 内に貼り付けて、データをフェッチします。

from sklearn.datasets import fetch_mldata
mnist = fetch_mldata(' /Users/Thomas/Dropbox/Learning/Upwork/tuto_TF/data/mldata/MNIST original')
print(mnist.data.shape)
print(mnist.target.shape)

その後、データをインポートし、両方のデータセットの形状を取得します。

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(mnist.data, mnist.target, test_size=0.2, random_state=42)
y_train  = y_train.astype(int)
y_test  = y_test.astype(int)
batch_size =len(X_train)

print(X_train.shape, y_train.shape,y_test.shape )

ステップ 2) データを変換する

前のチュートリアルでは、外れ値の影響を制限するためにデータを変換する必要があることを学びました。 このニューラル ネットワーク チュートリアルでは、min-max スケーラーを使用してデータを変換します。 式は次のとおりです。

(X-min_x)/(max_x - min_x)

Scikit learns にはすでにそのための関数があります: MinMaxScaler()

## resclae
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
# Train
X_train_scaled = scaler.fit_transform(X_train.astype(np.float64))
# test
X_test_scaled = scaler.fit_transform(X_test.astype(np.float64))

ステップ 3) テンソルを構築する

これで、Tensorflow でテンソルを作成する方法に慣れました。 トレインセットを数値列に変換できます。

feature_columns = [tf.feature_column.numeric_column('x', shape=X_train_scaled.shape[1:])]

ステップ 4) モデルを構築する

ニューラル ネットワークのアーキテクチャには、最初の層に 2 ユニット、300 番目の層に 100 ユニットの XNUMX つの隠し層が含まれています。これらの値は、私たち自身の経験に基づいて使用しています。これらの値を調整して、ネットワークの精度にどのような影響があるかを確認できます。

モデルを構築するには、推定器 DNNClassifier を使用します。 レイヤーの数を feature_columns 引数に追加できます。 トレーニング セットには 10 のクラスがあるため、クラスの数を 300 に設定する必要があります。 estimator オブジェクトの構文についてはすでに理解しています。 引数の機能列、クラス数、model_dir は前のチュートリアルとまったく同じです。 新しい引数 hidden_​​unit は、レイヤーの数とニューラル ネットワークに接続するノードの数を制御します。 以下のコードには 100 つの隠れ層があり、最初の層は XNUMX ノードを接続し、XNUMX 番目の層は XNUMX ノードを接続します。

推定子を構築するには、次のパラメータを指定して tf.estimator.DNNClassifier を使用します。

  • feature_columns: ネットワークで使用する列を定義します。
  • hidden_​​units: 隠れたニューロンの数を定義します。
  • n_classes: 予測するクラスの数を定義します。
  • model_dir: TensorBoard のパスを定義します。
estimator = tf.estimator.DNNClassifier(
    feature_columns=feature_columns,
    hidden_units=[300, 100], 
    n_classes=10, 
    model_dir = '/train/DNN')

ステップ 5) モデルのトレーニングと評価

numpy メソッドを使用してモデルをトレーニングし、評価できます。

# Train the estimator
train_input = tf.estimator.inputs.numpy_input_fn(
    x={"x": X_train_scaled},
    y=y_train,
    batch_size=50,
    shuffle=False,
    num_epochs=None)
estimator.train(input_fn = train_input,steps=1000) 
eval_input = tf.estimator.inputs.numpy_input_fn(
    x={"x": X_test_scaled},
    y=y_test, 
    shuffle=False,
    batch_size=X_test_scaled.shape[0],
    num_epochs=1)
estimator.evaluate(eval_input,steps=None) 

出力:

{'accuracy': 0.9637143,
 'average_loss': 0.12014342,
 'loss': 1682.0079,
 'global_step': 1000}

現在のアーキテクチャでは、評価セットの精度は 96 パーセントになります。

ステップ 6) モデルを改善する

正則化パラメーターを追加して、モデルの改善を試みることができます。

ドロップアウト率が 0.3、L1 が X、L2 が y の Adam オプティマイザーを使用します。TensorFlow Neural Network では、オプティマイザーの名前に続くオブジェクト train を使用してオプティマイザーを制御できます。 TensorFlow Proximal AdaGrad オプティマイザーの組み込み API です。

ディープニューラルネットワークに正規化を追加するには、次のパラメータを指定してtf.train.ProximalAdagradOptimizerを使用します。

  • 学習率: learning_rate
  • L1 正則化: l1_regulatory_strength
  • L2 正則化: l2_regulatory_strength
estimator_imp = tf.estimator.DNNClassifier(
    feature_columns=feature_columns,
    hidden_units=[300, 100],
    dropout=0.3, 
    n_classes = 10,
    optimizer=tf.train.ProximalAdagradOptimizer(
      learning_rate=0.01,
      l1_regularization_strength=0.01, 
      l2_regularization_strength=0.01
    ),
    model_dir = '/train/DNN1')
estimator_imp.train(input_fn = train_input,steps=1000) 
estimator_imp.evaluate(eval_input,steps=None) 

出力:

{'accuracy': 0.95057142,
 'average_loss': 0.17318928,
 'loss': 2424.6499,
 'global_step': 2000}

オーバーフィッティングを減らすために選択された値では、モデルの精度は向上しませんでした。 最初のモデルの精度は 96% でしたが、L2 レガライザーを使用したモデルの精度は 95% でした。 さまざまな値を試して、それが精度にどのような影響を与えるかを確認できます。

まとめ

このチュートリアルでは、ニューラル ネットワークを構築する方法を学びます。 ニューラル ネットワークには次のものが必要です。

  • 隠れ層の数
  • 完全に接続されたノードの数
  • アクティベーション機能
  • オプティマイザ
  • クラスの数

TensorFlow ANN では、次の方法で分類問題のニューラル ネットワークをトレーニングできます。

  • tf.estimator.DNNClassifier

推定では以下を指定する必要があります。

  • feature_columns=feature_columns、
  • hidden_​​units=[300, 100]
  • n_classes=10
  • モデルディレクトリ

さまざまなオプティマイザーを使用してモデルを改善できます。 このチュートリアルでは、学習率を指定した Adam Grad オプティマイザーを使用し、過学習を防ぐ制御を追加する方法を学びました。