02|Li Mu 実践学習ディープラーニング v2 (メモ)

基本的な最適化アルゴリズム


勾配降下法

  • 私たちのモデルに対する解決策は示されていません。(人生において完全に一貫した線形モデルがあることはまれであり、ほとんどのモデルは解決策を示しません)
  • 勾配: 関数の値が最も速く増加する方向。
  • 負の勾配: 関数の値が最も早く減少する方向。
  • 学習率 η: η が一度にどのくらいの距離を進むか。(η 発音: イータ)
  • (-η * 逆数) は、関数が最も速く減少する場所です。すると、w0+(-η * 逆数) が w1 の位置になります。
    ここに画像の説明を挿入

1.1 ミニバッチ確率的勾配降下法

  • 勾配を見つけるたびに、損失関数全体を導出する必要があります。この損失関数は、すべてのサンプルの平均損失です。意味: 求一次梯度,需要对整个样本算一遍この开销很大,很贵こと。
    ここに画像の説明を挿入
    ここに画像の説明を挿入

1.2 概要

ここに画像の説明を挿入

線形回帰の実装

1. プロセスデータ

  • d2l パッケージがない場合は、cmd を入力して管理者として実行する必要があります。入力:pip install -U d2l -i https://mirrors.aliyun.com/pypi/simple/ダウンロードします。
  • 次のように報告された場合はModuleNotFoundError: No module named ‘torchvision’、jupyter ノートブックに直接入力します。pip install torchvision -i https://mirrors.aliyun.com/pypi/simple/
    ここに画像の説明を挿入
    ここに画像の説明を挿入

このコードは、synthetic_data合成データの生成に使用される関数を定義します。

この関数は 3 つのパラメータを受け入れます。

  • w: モデルの重みを表す 1 次元のテンソル (ベクトル)。
  • b: モデルのバイアス項を表すスカラー。
  • num_examples: 生成されるデータ サンプルの数を示す整数。

この関数の主な手順は次のとおりです。

  1. 平均 0、標準偏差 1 の、 shapeの標準正規分布を持つランダム テンソルtorch.normal(0, 1, (num_examples, len(w)))を生成するために使用します。(num_examples, len(w))X
  2. 行列乗算演算子を使用して重みtorch.matmul(X, w)を乗算し、バイアス項を追加して予測値を取得しますXwby
  3. 標準正規分布と同じ形状torch.normal(0, 0.01, y.shape)で生成され、それに追加されるランダム ノイズを使用して、実際のデータのノイズをシミュレートします。yy
  4. 最後に、 は、shape の 2D テンソルに変換されますy.reshape((-1, 1))この次元のサイズは、他の次元のサイズに基づいて自動的に計算されます。y(-1, 1)-1简单来说,reshape((-1,1))就是将数组转换成只有一列,行数不确定的二维数组。

この関数は、生成された合成データXと変換されたラベルを返しますy

ここに画像の説明を挿入
このコードは、d2l ライブラリを使用して散布図を描画する例です。

d2l.set_figsize()グラフィックのサイズを設定するために使用され、幅と高さを指定できます。

d2l.plt.scatter(features[:,1].detach().numpy(), labels.detach().numpy(), 1)このコード行は散布図を描画します。ここで、

  • features[:,1]特徴行列からデータの 2 番目の列を x 座標として取得することを示します。
  • labelsラベルデータを表します。
  • 1散乱点の半径は 1 です。

detach()このメソッドは計算グラフからテンソルを切り離し、メモリ内に独立したテンソルを返します。これにより、描画時に元のデータが変更されることが回避されます。numpy()このメソッドは、プロット関数で使用するためにテンソルを NumPy 配列に変換します。

1.3 サイズbatch_sizeのミニバッチを生成する

ここに画像の説明を挿入
このコードは、data_iterトレーニング データのバッチを生成するイテレーターと呼ばれる関数を定義します。

この関数は、batch_sizefeatures、 の3 つのパラメータを受け入れますlabelsこのうち、 はbatch_size各バッチのサンプル数を表し、featuresは特徴行列、 はlabelsラベル ベクトルです。

まず、関数はサンプルの総数をカウントしnum_examples、すべてのサンプルのインデックスを含むリストを作成しますindices次に、random.shuffle()インデックスをランダムにシャッフルするメソッドを使用します。

次に、関数はループを使用してバッチ データを生成します。各ループで、シャッフルされたインデックス リストからインデックスを取得しbatch_size、これらのインデックスを tensor に変換しますbatch_indices次に、関数はyieldステートメントを使用して、現在のバッチに対応する特徴行列とラベル ベクトルを返します。

ステートメントを使用しているためyield、この関数は、すべてのデータを一度にメモリにロードせずに、ループ内でデータのバッチを 1 つずつ生成できるジェネレーター関数です。これにより、メモリ使用量が効果的に削減され、トレーニング効率が向上します。

2. 処理モデル

ここに画像の説明を挿入
このコードは、ニューラル ネットワークの線形回帰モデルで使用される2 つの PyTorch テンソル と を定義しますwb

w = torch.normal(0, 0.01, size=(2,1), requires_grad=True)このコード行は、形状 (2,1) のテンソルを作成します。wその要素は、平均 0、標準偏差 0.01 の正規分布からランダムにサンプリングされます。requires_grad=Trueバックプロパゲーション中にパラメーターを更新するために、このテンソルの勾配を計算する必要があることを示します。

b = torch.zeros(1, requires_grad=True)bこのコード行は、要素がすべて 0 に初期化される形状 (1,) のテンソルを作成します。requires_grad=Trueバックプロパゲーション中にパラメーターを更新するために、このテンソルの勾配を計算する必要があることを示します。

ニューラル ネットワークでは、wb通常、それぞれ線形回帰モデルの重み項とバイアス項を表します。最適化アルゴリズム (確率的勾配降下法など) を継続的に繰り返すことにより、wと の値が更新されb、モデルの予測結果が真の値にどんどん近づきます。

3. モデルの評価

ここに画像の説明を挿入
このコードは、sgdミニバッチ確率的勾配降下アルゴリズムを実行するために呼び出される関数を定義します。

この関数は、paramslr、 の3 つのパラメータを受け入れますbatch_sizeここでparams、 はモデル パラメーターを含むリストまたはテンソル、lrは学習率、 はbatch_size各バッチのサンプル数です。

この関数はtorch.no_grad()コンテキスト マネージャーを使用して勾配計算を無効にし、バックプロパゲーション中にメモリが過剰に消費されるのを防ぎます。

次に、関数はループを使用して、paramsの各パラメーターを反復処理します。param.grad各パラメーターについて、最初に現在のバッチの勾配をバッチ サイズで除算しbatch_size、次に学習率を乗算しlr、この値を元のパラメーター値から減算することでパラメーターを更新します。最後に、 を使用してparam.grad.zero_()そのパラメータの勾配をゼロに設定し、新しい勾配値が次の反復で使用されるようにします。

要約すると、このコードは、ニューラル ネットワーク モデルをトレーニングするための単純な確率的勾配降下法アルゴリズムを実装します。

4. トレーニングプロセス

ここに画像の説明を挿入
ブロックされたコードは次のとおりです。print(f'epoch{epoch+1}, loss{float(train_l.mean()):f}')
このコードは、順伝播、計算損失、逆伝播、パラメーター更新を含む、ニューラル ネットワーク モデルをトレーニングするための完全なプロセスです。

forまず、複数のエポックにわたって反復するループが定義されます。各エポックで、data_iter()関数を使用してデータのバッチを生成しますX,y。 ここで、batch_sizeは各バッチのサンプル数、featuresは特徴行列、labelsはラベル ベクトルです。

次に、各データ ポイントに対してXnet(X,w,b)順伝播を使用して予測値を取得します。次に、予測値と真のラベルy間の損失が計算されますloss(net(X,w,b),y)

次に、l.sum().backward()損失に対してバックプロパゲーションを呼び出して、各パラメーターの勾配を計算します。次に、確率的勾配降下法アルゴリズムを使用してsgd([w,b], lr, batch_size)パラメーターwと を更新しますb

各エポックの後に、with torch.no_grad():コンテキスト マネージャーを使用して勾配計算をオフにし、出力トレーニング プロセス中にメモリが過剰に消費されるのを防ぎます。次に、 を使用してtrain_l = loss(net(features, w, b), labels)テスト セット上の現在のモデルの損失を計算し、現在のエポックと平均損失を出力します。

つまり、このコードは標準的なニューラル ネットワーク トレーニング プロセスを実装し、継続的な反復最適化アルゴリズムを通じてモデルのパフォーマンスを向上させます。

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_41714549/article/details/132651132