Nielsenのリポジトリのコードによると、ミニバッチは置換なしで描画されます。
def SGD(self, training_data, epochs, mini_batch_size, eta, test_data=None):
n = len(training_data)
for j in range(epochs):
random.shuffle(training_data)
mini_batches = [
training_data[k:k+mini_batch_size]
for k in range(0, n, mini_batch_size)
]
for mini_batch in mini_batches:
self.update_mini_batch(mini_batch, eta)
エポック内にトレーニングサンプルの置換がないことがわかります。興味深いことに、ニールセンはeta
、前回のミニバッチほど多くのトレーニングサンプルを持たない可能性がある最後のmini_batchサイズの調整(学習率)を心配しないことも選択できます。おそらくこれは後の章のために彼が残した高度な修正です。**
**編集:実際、このスケーリングはdef update_mini_batch
関数で発生します。たとえば、重み付き:
self.weights = [w-(eta/len(mini_batch))*nw for w, nw in zip(self.weights, nabla_w)]
これが必要なのは、mini_batchごとのトレーニングサンプルの数が利用可能なトレーニングサンプルの総数に均等に分割されない場合、最後のmini_batchが以前のmini_batchesよりも小さくなる可能性があるためです。
mylist = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10']
n = len(mylist)
mini_batch_size = 2
mini_batches = [
mylist[k:k+mini_batch_size]
for k in range(0, n, mini_batch_size)
]
for mini_batch in mini_batches:
print(mini_batch)
出力:
['1', '2']
['3', '4']
['5', '6']
['7', '8']
['9', '10']
に変更mini_batch_size
すると3
、10個のトレーニングサンプルに均等に分割されません。出力については:
['1', '2', '3']
['4', '5', '6']
['7', '8', '9']
['10']
リストインデックス(フォームの何かを超える範囲を評価する場合や、リストにいくつかの指標である)を、当社の右側の値は、リストの長さを超えた場合、値はインデックス範囲から外れるまで、Pythonは単に、リストから項目を返します。 。[x:y]
x
y
したがって、最後のミニバッチは以前のミニバッチよりも小さい可能性がありますが、同じ重みで重み付けされた場合eta
、それらのトレーニングサンプルは、他の大きなミニバッチのサンプルよりも学習に大きく貢献します。これは最後のミニバッチであるため、あまり心配する必要はないでしょうeta
が、ミニバッチの長さに合わせて簡単に解決できます。