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)
우리는 신기원 내에서 훈련 샘플을 대체하지 않는다는 것을 알 수 있습니다. 흥미롭게도 Nielsen이 조정에 대해 걱정하지 않는다는 것을 알 수 있습니다.eta
은 이전 미니 배치보다 많은 훈련 샘플이 없을 수있는 마지막 미니 배치 크기에 대한 학습 속도 . 아마도 이것은 이후의 장을 위해 남겨둔 고급 수정일 것입니다. **
** 편집 : 실제로이 스케일링은 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']
양식 (뭔가 목록 인덱스를 통해 범위를 평가할 때 [x:y]
곳 x
과y
인덱스 ) 오른쪽 값이리스트 길이를 초과하면 파이썬은 값이 인덱스 범위를 벗어날 때까지 단순히리스트에서 항목을 반환합니다. .
따라서 마지막 미니 배치는 이전 미니 배치보다 작을 수 있지만, 동일한 가중치를 적용하면 eta
이러한 훈련 샘플이 다른 더 큰 미니 배치의 샘플보다 학습에 더 많은 기여를합니다. 이것은 마지막 미니 배치이므로 너무 걱정할 필요는 없지만 eta
미니 배치의 길이 로 확장 하면 쉽게 해결할 수 있습니다 .