基本的な最適化アルゴリズム
ナビゲーション
勾配降下法
- 私たちのモデルに対する解決策は示されていません。(人生において完全に一貫した線形モデルがあることはまれであり、ほとんどのモデルは解決策を示しません)
- 勾配: 関数の値が最も速く増加する方向。
- 負の勾配: 関数の値が最も早く減少する方向。
- 学習率 η: η が一度にどのくらいの距離を進むか。(η 発音: イータ)
- (-η * 逆数) は、関数が最も速く減少する場所です。すると、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
: 生成されるデータ サンプルの数を示す整数。
この関数の主な手順は次のとおりです。
- 平均 0、標準偏差 1 の、 shapeの標準正規分布を持つランダム テンソル
torch.normal(0, 1, (num_examples, len(w)))
を生成するために使用します。(num_examples, len(w))
X
- 行列乗算演算子を使用して重み
torch.matmul(X, w)
を乗算し、バイアス項を追加して予測値を取得します。X
w
b
y
- 標準正規分布と同じ形状
torch.normal(0, 0.01, y.shape)
で生成され、それに追加されるランダム ノイズを使用して、実際のデータのノイズをシミュレートします。y
y
- 最後に、 は、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_size
、features
、 の3 つのパラメータを受け入れますlabels
。このうち、 はbatch_size
各バッチのサンプル数を表し、features
は特徴行列、 はlabels
ラベル ベクトルです。
まず、関数はサンプルの総数をカウントしnum_examples
、すべてのサンプルのインデックスを含むリストを作成しますindices
。次に、random.shuffle()
インデックスをランダムにシャッフルするメソッドを使用します。
次に、関数はループを使用してバッチ データを生成します。各ループで、シャッフルされたインデックス リストからインデックスを取得しbatch_size
、これらのインデックスを tensor に変換しますbatch_indices
。次に、関数はyield
ステートメントを使用して、現在のバッチに対応する特徴行列とラベル ベクトルを返します。
ステートメントを使用しているためyield
、この関数は、すべてのデータを一度にメモリにロードせずに、ループ内でデータのバッチを 1 つずつ生成できるジェネレーター関数です。これにより、メモリ使用量が効果的に削減され、トレーニング効率が向上します。
2. 処理モデル
このコードは、ニューラル ネットワークの線形回帰モデルで使用される2 つの PyTorch テンソル と を定義しますw
。b
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
バックプロパゲーション中にパラメーターを更新するために、このテンソルの勾配を計算する必要があることを示します。
ニューラル ネットワークでは、w
はb
通常、それぞれ線形回帰モデルの重み項とバイアス項を表します。最適化アルゴリズム (確率的勾配降下法など) を継続的に繰り返すことにより、w
と の値が更新されb
、モデルの予測結果が真の値にどんどん近づきます。
3. モデルの評価
このコードは、sgd
ミニバッチ確率的勾配降下アルゴリズムを実行するために呼び出される関数を定義します。
この関数は、params
、lr
、 の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
はラベル ベクトルです。
次に、各データ ポイントに対してX
、net(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)
テスト セット上の現在のモデルの損失を計算し、現在のエポックと平均損失を出力します。
つまり、このコードは標準的なニューラル ネットワーク トレーニング プロセスを実装し、継続的な反復最適化アルゴリズムを通じてモデルのパフォーマンスを向上させます。