1 つの記事ですばやく学習 - ニューラル ネットワークをもう謎にしないで、1 日でニューラル ネットワークの基礎を学習 - 出力層 (4)


序文

より深い学習コンテンツを公開するかどうかずっと考えていましたが、結局、数理モデリングコラムの機械学習コンテンツの半分以上が更新されていませんでした。それ以外の場合、ニューラル ネットワークが数理モデリング コンテストや将来的に他のより最適化されたモデル (時系列モデルの予測に LSTM を使用するなど) で使用される場合は、全員に説明した方がよいでしょう。そしてその原理を解説しました。しかし、ディープラーニングの内容は、数学的な理論知識や推論を必要とする計算式原理が多く、習得するのはそれほど簡単ではありません。また、実際に操作してみないと、ニューラル ネットワーク コンピューティング フレームワークで記述したコードが何を表しているのかを理解するのは困難です。ただし、知識を簡素化し、より身近なものに変換し、ニューラル ネットワークのフレームワークを皆さんに理解し、慣れてもらい、スムーズな理解とスムーズな推論を確保できるように最善を尽くします。数式や専門的な理論的知識を多用しすぎないように注意してください。1 つの記事でアルゴリズムを素早く理解して実装し、最も効率的な方法でこの知識に習熟します。

多くのコンテストではアルゴリズム フレームワークの使用を制限していませんが、受賞歴のあるチームがディープ ラーニング アルゴリズムを使用することが増えており、従来の機械学習アルゴリズムは徐々に衰退しています。例えば、2022年のアメリカ大学生の数学モデリング問題Cでは、パラメータチームが深層学習ネットワークチームを使用し、勝率が非常に高かった現在、人工知能コンテストやデータマイニングコンテストが次々と開催され、需要が高まっています。ニューラルネットワークの知識も増えてきているので非常に便利ですが、さまざまなニューラルネットワークのアルゴリズムを習得する必要があります。

ブロガーは 4 年間モデリングに注力し、大小問わず数十の数学モデリングに参加し、さまざまなモデルの原理、各モデルのモデリング プロセス、およびさまざまなトピック分析手法を理解しています。このコラムの目的は、さまざまな数学モデル、機械学習と深層学習、基礎ゼロのコードをすぐに使用できるようにすることであり、各記事には実践的なプロジェクトと実行可能なコードが含まれています。ブロガーはデジタルおよびアナログのあらゆる種類のコンテストを常に監視しており、デジタルおよびアナログのコンテストごとに、ブロガーは最新のアイデアやコード、さらに詳細なアイデアや完全なコードをこのコラムに書き込みます。著者が丁寧に作成したコラムを、困っている友人が見逃さないことを願っています。


出力層

ニューラル ネットワークがさまざまなタイプの問題を解決するとき、タスクのニーズに合わせてさまざまな活性化関数を使用します。分類と回帰の問題については、さまざまな戦略を選択してネットワークを構築します。

まず、分類問題を考えてみましょう。分類問題では、データをさまざまなクラスに分離するという課題に直面することがよくあります。バイナリ分類問題の場合、これはデータを 2 つの可能なクラスに分割する必要があることを意味します。この場合、出力層の活性化関数としてシグモイド関数を使用することを選択します。シグモイド関数は出力値を 0 と 1 の間でマッピングするため、出力を特定のクラスの確率として考えることができます。

一方、複数分類の問題を扱うときの目標は、データを複数の可能なクラスに分割することです。このとき、出力層の活性化関数としてSoftmax関数を使用します。Softmax 関数は、各カテゴリの生のスコアを各カテゴリの確率を表す形式に変換します。これにより、特定の入力に対してどのクラスが正しいクラスである可能性が最も高いかを判断できます。

ただし、回帰問題では、離散的なカテゴリではなく、連続的な数値出力の予測に関心があります。この場合、問題のニーズに合わせてネットワークの出力に実数値を取りたいため、通常は活性化関数を使用しません。

要約すると、さまざまな問題タイプにおけるニューラル ネットワークの活性化関数の選択は、問題の性質と目標によって異なります。適切なアクティベーション関数を選択することで、ネットワークをさまざまな種類のタスクにさらに適応させることができます。

1. 作業工程

理解を容易にするために、ここでも実際のケースを使用してソフトマックスを使用して多重分類を実行します。

多分類問題、C=4。線形分類器モデルの最終出力層には、次の 4 つの出力値が含まれます。

V=\begin{pmatrix} -3\\ 2\\ -1\\ 0 \end{pmatrix}

Softmax 処理の後、値は次の確率に変換されます。

S=\begin{pmatrix} 0.0057\\ 0.8390\\ 0.0418\\ 0.1135 \end{pmatrix}

 明らかに、計算された確率によれば、S2=0.8390 が最も高い確率に相当することが簡単にわかります。Softmax は連続値を相対確率に変換するため、理解が容易になります。もちろん、[1000,1001,1002] が得られた場合は inf が得られ、[-1000,-999,-1000] であるかどうかも -inf が得られます。

実際のアプリケーションでは、V に対して何らかの数値処理が必要です。つまり、V の各要素が V の最大値を減算します。

def _softmax(x):
    c=np.max(x)
    exp_x = np.exp(x-c)
    return exp_x/np.sum(exp_x)

scores = np.array([123,456,789]) 
p = _softmax(scores)
print(p)

 数値形式での計算はやや抽象的になる可能性があるため、画像分類を例に挙げてみましょう。

猫をカテゴリ1、犬をカテゴリ2、ニワトリをカテゴリ3に分類すると、上記のどのカテゴリにも属さない場合は「その他」に分類されます。したがって、それをクラス 3 に置きます。以下同様です。

猫の画像を入力し、それに対応する実際のラベルが 0100 であるとします (カテゴリはワンホット エンコード形式に変換されています)。

真の値 yは 1 で\begin{pmatrix} 0\\ 1\\ 0\\ 0 \end{pmatrix}y^{i=1}残りは 0 です。ソフトマックス計算後、予測値 y_predict が得られます。予測値を とすると、\begin{pmatrix} 0.3\\ 0.2\\ 0.1\\ 0.4 \end{pmatrix}その和が 1 になる確率を含んだベクトルです。この場合、ニューラルネットワークが計算され、その結果、猫には 20% の確率値が割り当てられることがわかります。一般にニューラルネットワークでは出力値が最も大きいニューロンに対応するカテゴリーを認識結果として使用し、ソフトマックス関数を使用しても値の大きさが変わるだけでニューロンの位置は変わりません。また、指数関数の演算にもある程度の時間がかかるため、多分類問題ではソフトマックス関数を省略することも考えられる。

2. 出力層のニューロンの数

出力層のニューロンの数は、解決する問題の要件に従って選択する必要があります。さまざまな問題に対処する場合、出力層のニューロンの数をそれに応じて設定する必要があります。特に分類問題では、カテゴリの数に応じて出力層のニューロンの数を決定する必要があります。MNIST (手書き数字認識) を例に挙げると、これは手書き数字を 0 から 9 までの 10 個のカテゴリーに分割する問題です。そのため、出力層には 10 個のニューロンを設定します。各ニューロンは数字カテゴリーに対応します。

MNIST データセットに基づく順伝播

MNIST (Modified National Institute of Standards and Technology) データセットは、コンピュータ ビジョンの分野で手書きの数字認識タスクに広く使用されている古典的なデータセットです。このデータセットは米国国立標準技術研究所 (NIST) によって作成され、機械学習研究で使用できるように変更されました。

MNIST データセットには、0 から 9 までの数字をカバーする一連の手書き数字の画像が含まれています。各画像のサイズは 28x28 ピクセルで、グレースケール画像として表示されます。データセットは、トレーニング セットとテスト セットの 2 つの部分に分かれています。

トレーニング セット:トレーニング セットには 60,000 個の手書き数字の画像が含まれており、各画像には、画像によって表される数字を示す対応するラベルが付いています。これらの画像とラベルは、機械学習モデルのトレーニング、特に手書きの数字認識モデルの構築に広く使用されています。

テスト セット:テスト セットには、対応するラベルが付いた 10,000 個の手書き数字の画像が含まれています。これらの画像は、目に見えないデータに対するトレーニング済みモデルのパフォーマンスを評価するために使用されます。テスト セットの結果を通じて、モデルの汎化能力と精度を理解できます。

torch を通じて直接ダウンロードできます。

#MNIST dataset
train_dataset = dsets.MNIST(root = '/ml/pymnist',  #选择数据的根目录
                            train = True,  #选择训练集
                            transform = None,  #不考#MNIST dataset
train_dataset = dsets.MNIST(root = '/ml/pymnist',  #选择数据的根目录
                            train = True,  #选择训练集
                            transform = None,  #不考虑使用任何数据预处理
                            download = True  #从网络上下载图片
                           )
test_dataset = dsets.MNIST(root = '/ml/pymnist',#选择数据的根目录
                           train = False,#选择测试集
                           transform = None, #不考虑使用任何数据预处理
                           download = True #从网络上下载图片
                          )虑使用任何数据预处理
                            download = True  #从网络上下载图片
                           )
test_dataset = dsets.MNIST(root = '/ml/pymnist',#选择数据的根目录
                           train = False,#选择测试集
                           transform = None, #不考虑使用任何数据预处理
                           download = True #从网络上下载图片
                          )

まず最初に、ネットワークの init_network 関数を初期化し、ランダムな重みを制御するためにweight_scale変数を設定し、バイアスを一律に 1 に設定する必要があります。

def init_network():
    network={}
    weight_scale=1e-3
    network['W1']=np.random.randn(784,50)*weight_scale
    network['b1']=np.ones(50)
    network['W2']=np.random.randn(50,100)*weight_scale
    network['b2']=np.ones(100)
    network['W3']=np.random.randn(100,10)*weight_scale
    network['b3']=np.ones(10)
    return network

その後、順伝播プロセスが実行され、ここでは ReLU 関数が使用されます。

def _relu(x):
    return np.maximum(0,x)
def forward(network,x):
    w1,w2,w3 = network['W1'],network['W2'],network['W3']
    b1,b2,b3 = network['b1'],network['b2'],network['b3']
    a1 = x.dot(w1) + b1
    z1 = _relu(a1)
    a2 = z1.dot(w2) + b2
    z2 = _relu(a2)
    a3 = z2.dot(w3) + b3
    y = a3
    return y

最後に、最終結果を計算します。

network = init_network()
accuracy_cnt = 0
x = test_dataset.test_data.numpy().reshape(-1,28*28)
labels = test_dataset.test_labels.numpy() #tensor转numpy
for i in range((len(x))):
    y = forward(network,x[i])
    p = np.argmax(y) #获取概率最高的元素的索引
    if p == labels[i]:
        accuracy_cnt += 1
print("Accuracy:"+ str(float(accuracy_cnt)/len(x)*100)+'%')

 

 これは初期の重みであるため、10 カテゴリの正しい推測の確率は 10% ですが、前方へのみ伝播し、後方への伝播は行わないため、すべてのバイアス重みが最適化されるわけではありません。次の章では、バックプロパゲーションの準備をし、損失関数の役割を詳しく説明します。前回の記事で基本的にすべての損失関数を説明しました。非常に詳細で完璧です。能力を持っていることをお勧めします。読むには:

損失関数の詳細解説(損失関数) - 分類問題によく使われる損失関数のPythonコード実装+計算原理の解析

次回の記事では、実際のケースにおける損失関数の使用法と機能に焦点を当てます。


おすすめ

転載: blog.csdn.net/master_hunter/article/details/132575138