1 つの記事ですばやく学習 - ニューラル ネットワークをもう謎にしないで、1 日でニューラル ネットワークの基礎を学びましょう (5) - 最適化


序文

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

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

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

すべての損失関数の形式と実装コードと関数を詳細に説明した記事がすでに存在するため、ここでは損失関数に関する新しい記事はありません 共通の損失関数 Python コード実装 + 計算原理の分析 - fantuck のブログ - CSDN ブログ

損失関数は、現在位置での実際の値と予測値の差や誤差を測定するために使用され、一部のモデルの有効性を向上させます。モデルにフィードバックを提供することで、調整することができます。エラーを最小限に抑えるためのパラメータ。


ニューラル ネットワークをトレーニングするときは、損失関数を使用してモデルの予測と真の値の間の距離を測定します。このギャップは、多くの場合、エラーまたは損失と呼ばれます。私たちの目標は、モデルの重みとパラメーターを調整して損失関数の値を最小限に抑えることです。言い換えれば、モデルの予測が可能な限り真の値に近づくような重みとパラメーターのセットを見つけようとしています。

損失関数の値が小さいほど、モデルの予測と実際のデータの差が小さくなり、モデルのパフォーマンスが向上します。最適化プロセスでは、逆伝播や勾配降下法などの方法を通じてモデルの重みとパラメーターを徐々に調整し、損失関数の値を低減します。

1. ランダム初期化

ランダムな初期化の方法は理解しやすいはずです。最初にさまざまな重みをランダムに試して、どの重みセットが最適かを確認できます。ばかげているように聞こえますが、実際にはばかげています。これは単なる紹介です。実践 このアプローチは使用しないでください。

accuracy_cnt=0
batch_size=100
x = test_dataset.test_data.numpy().reshape(-1,28*28)
labels = test_dataset.test_labels
finallabels = labels.reshape(labels.shape[0],1)
bestloss = float('inf')
for i in range(0,int(len(x)),batch_size):
    network = init_network()
    x_batch = x[i:i+batch_size]
    y_batch = forward(network,x_batch)
    one_hot_labels = torch.zeros(batch_size,10).scatter_(1,finallabels[i:i+batch_size],1)
    loss = cross_entropy_error(one_hot_labels.numpy(),y_batch)
    if loss < bestloss:
        bestloss = loss
        bestw1,bestw2,bestw3 = network['W1'],network['W2'],network['W3']
    print("best loss: is %f" %(bestloss))

次に、精度の影響を見てみましょう。

a1=x.dot(bestw1)
z1=_relu(a1)
a2=z1.dot(bestw2)
z2=_relu(a2)
a3=z2.dot(bestw3)
y=_softmax(a3)
print(y)
#找到在每列中评分最大的索引
Yte_predict=np.argmax(y,axis=1)
one_hot_labels=torch.zeros(x.shape[0],10).scatter_(1,finallabels,1)
true_labels=np.argmax(one_hot_labels.numpy(),axis=1)
#计算准确率
print(np.mean(Yte_predict==true_labels))

最終的な出力は次のとおりです。

0.0948

それはほぼ正常であり、推測される確率は同じです。

2. 勾配降下法

勾配降下法が登場する前に、この最適化アルゴリズムに特化した記事を作成しました。以前、ロジスティック回帰のアルゴリズムを作成するときにも使用しました。さらに詳しく知りたい場合は、よく読むことをお勧めします。この記事では、説明のみを記載しています。バックプロパゲーションにおける勾配の詳細降下アルゴリズムの関数関数:

デジタルシミュレーション最適化アルゴリズムの簡単な学習 (2) 勾配降下法アルゴリズム 記事の詳細な説明 + Python コード

ニューラル ネットワークの学習には勾配も必要ですが、ここでの勾配は損失関数の重みとオフセット (バイアス) の勾配を表します。たとえば、形状が 2*2 で重みが W のニューラル ネットワークの場合、損失関数は L で表されます。

その勾配は次のように表されます。

 \frac{\vartheta L}{\vartheta W}の要素は、W に関する各要素の偏導関数で構成されます。各偏導関数の意味は、各 W がわずかに変化したときに損失関数 L がどの程度変化するかということです。

#基于数值微分的梯度下降法
def numerical_gradient(f,x):
    h = 1e-4 #0.0001
    grad = np.zeros_like(x)
    it = np.nditer(x,flags=['multi_index'],op_flags=['readwrite'])
    while not it.finished:
        idx = it.multi_index
        tmp_val = x[idx]
        x[idx] = float(tmp_val)+h
        fxh1 = f(x) #f(x+h)
        
        x[idx] = tmp_val-h
        fxh2 = f(x) #f(x-h)
        grad[idx] = (fxh1 - fxh2) / (2*h)
        
        x[idx] = tmp_val #还原值
        it.iternext()
        
    return grad

重みデータ セットの初期リセット後、勾配降下法アルゴリズムを使用した重みセットは次のようになります。

損失関数値:

勾配降下法アルゴリズムと動作原理を理解すれば、バックプロパゲーションの研究を始めることができます。


おすすめ

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