Liệu batch_size trong Keras có ảnh hưởng gì đến chất lượng của kết quả không?


38

Tôi sắp huấn luyện một mạng LSTM lớn với 2-3 triệu bài viết và đang phải vật lộn với Lỗi bộ nhớ (Tôi sử dụng AWS EC2 g2x2large).

Tôi phát hiện ra rằng một giải pháp là giảm batch_size. Tuy nhiên, tôi không chắc chắn nếu tham số này chỉ liên quan đến các vấn đề hiệu quả bộ nhớ hoặc nếu nó sẽ ảnh hưởng đến kết quả của tôi. Trên thực tế, tôi cũng nhận thấy rằng việc batch_sizesử dụng trong các ví dụ thường là sức mạnh của hai, điều mà tôi cũng không hiểu.

Tôi không phiền nếu mạng của tôi mất nhiều thời gian hơn để đào tạo, nhưng tôi muốn biết nếu giảm batch_sizesẽ làm giảm chất lượng dự đoán của tôi.

Cảm ơn.


Câu hỏi này không cụ thể cho máy ảnh. Tôi nghĩ rằng tổng quan chung là kích thước mẫu nhỏ hơn hội tụ chậm hơn nhưng ít bị mắc kẹt trong cực tiểu địa phương
Alex

Tôi đã thấy các trường hợp kích thước lô quá lớn có thể ngăn chặn sự hội tụ ngay cả với cùng một số kỷ nguyên đào tạo.
Curtis White

Câu trả lời:


43

Sau một năm rưỡi, tôi trở lại câu trả lời của mình vì câu trả lời trước đó của tôi là sai.

Kích thước hàng loạt tác động học tập đáng kể. Điều gì xảy ra khi bạn đặt một lô qua mạng của bạn là bạn tính trung bình độ dốc. Khái niệm là nếu kích thước lô của bạn đủ lớn, điều này sẽ cung cấp ước tính đủ ổn định về độ dốc của bộ dữ liệu đầy đủ. Bằng cách lấy mẫu từ tập dữ liệu của bạn, bạn ước tính độ dốc trong khi giảm đáng kể chi phí tính toán. Bạn càng đi thấp, ước tính của bạn sẽ càng kém chính xác, tuy nhiên trong một số trường hợp, các gradient ồn ào này thực sự có thể giúp thoát khỏi cực tiểu địa phương. Khi quá thấp, trọng lượng mạng của bạn chỉ có thể nhảy xung quanh nếu dữ liệu của bạn bị nhiễu và nó có thể không thể học hoặc nó hội tụ rất chậm, do đó ảnh hưởng tiêu cực đến tổng thời gian tính toán.

Một ưu điểm khác của việc tạo khối là tính toán GPU, GPU rất giỏi trong việc song song hóa các tính toán xảy ra trong các mạng thần kinh nếu một phần của tính toán giống nhau (ví dụ, nhân ma trận lặp lại trên cùng một ma trận trọng số của mạng của bạn). Điều này có nghĩa là một kích thước lô 16 sẽ mất ít hơn hai lần số lượng của một lô là 8.

Trong trường hợp bạn cần kích thước lô lớn hơn nhưng nó không phù hợp với GPU của bạn, bạn có thể cung cấp một lô nhỏ, lưu ước tính độ dốc và cung cấp một hoặc nhiều lô, sau đó thực hiện cập nhật trọng lượng. Bằng cách này, bạn có được độ dốc ổn định hơn vì bạn đã tăng kích thước lô ảo của mình.

SAI, TRẢ LỜI TRẢ LỜI: [[[Không, trung bình batch_size chỉ ảnh hưởng đến tốc độ học tập của bạn chứ không ảnh hưởng đến chất lượng học tập. Lot_sizes cũng không cần phải là lũy thừa 2, mặc dù tôi hiểu rằng một số gói nhất định chỉ cho phép sức mạnh là 2. Bạn nên cố gắng lấy batch_size của mình ở mức cao nhất có thể mà vẫn phù hợp với bộ nhớ của GPU để đạt tốc độ tối đa có thể .]]]]


Tôi không đủ khả năng 32 nhưng tôi có thể đủ khả năng 16. Tuy nhiên, tôi nhận thấy rằng nó quá chậm. Bạn có nghĩ rằng tôi nên thử một số giá trị trong khoảng từ 16-32 hoặc gắn bó với 16 không?
hipoglucido

Tôi sẽ cố gắng và thời gian một số giá trị. Mỗi kỷ nguyên nên diễn ra cùng một lúc để không mất quá nhiều thời gian. Trước tiên hãy thử 17 để xem nó nhanh hơn hay chậm hơn bởi vì tôi quan tâm đến điều này, với điều kiện là sức mạnh 2 này phụ thuộc vào GPU và / hoặc phụ trợ của Keras. Nhưng tôi nghĩ chỉ cần điền nó vào vành có khả năng là tốt nhất
Jan van der Vegt

9
Bạn có chắc chắn rằng kích thước lô không ảnh hưởng đến chất lượng học tập? Tôi nhớ đã đọc một số blog / bài báo (?) Trong đó họ nói rằng các lô nhỏ hơn tạo ra độ dốc lớn hơn các lô lớn hơn, nhưng tiếng ồn có thể hữu ích để thoát khỏi các minimas cục bộ. Không chắc chắn nếu / làm thế nào điều này áp dụng cho LSTM mặc dù.
stmax

Không hoàn toàn bị thuyết phục, bản thân tôi chưa có đủ kinh nghiệm nhưng đó là những gì tôi đọc được. Tôi có thể thấy độ dốc kém ổn định hơn nên tôi có thể tắt.
Jan van der Vegt 04/07/2016

2
Một năm rưỡi sau và nhiều kiến ​​thức hơn bây giờ và tôi đồng ý. Tôi sẽ thay đổi câu trả lời của mình
Jan van der Vegt

11

Tôi cảm thấy câu trả lời được chấp nhận có thể sai. Có các biến thể trong Thuật toán Giảm dần Gradient .

  1. Vanilla Gradient Descent : Ở đây Gradient đang được tính trên tất cả các điểm dữ liệu trong một lần chụp và lấy trung bình. Do đó, chúng ta có một phiên bản mượt mà hơn của gradient mất nhiều thời gian hơn để tìm hiểu.

  2. Giảm dần độ dốc ngẫu nhiên : Ở đây một điểm dữ liệu tại một thời điểm do đó độ dốc rất mạnh (độ dốc nhiễu) do đó sẽ có rất nhiều dao động (chúng tôi sử dụng các tham số Động lượng - ví dụ Nesterov để kiểm soát điều này). Vì vậy, có khả năng các dao động của bạn có thể làm cho thuật toán không đạt đến mức tối thiểu cục bộ. (Phân kỳ).

  3. Mini-Batch Gradient Descent : Lấy các đặc quyền của cả hai phần trước trung bình độ dốc của một lô nhỏ. Do đó, không quá tích cực như SGD và cho phép Học trực tuyến mà Vanilla GD không bao giờ cho phép.

Mini-Batch càng nhỏ thì hiệu suất của mô hình của bạn (không phải lúc nào cũng tốt hơn) và tất nhiên nó phải làm với thời đại của bạn học quá nhanh. Nếu bạn đang đào tạo về tập dữ liệu lớn, bạn muốn hội tụ nhanh hơn với hiệu suất tốt do đó chúng tôi chọn Batch-GD.

SGD đã cố định tham số học tập do đó chúng tôi bắt đầu các Trình tối ưu hóa thích ứng khác như Adam, AdaDelta, RMS Prop, vv thay đổi tham số học tập dựa trên lịch sử của Gradents.


3) thường được gọi là xe buýt nhỏ
Alex

@Alex: thêm sự thay đổi.
Jil Jung Juk

1
Tôi đồng ý không có quy tắc nào liên quan đến thông số kích thước lô. Nhưng tuyên bố này - "Mini-Batch càng nhỏ thì hiệu suất của mô hình của bạn càng tốt" - trái với quy tắc chung. Bạn thường muốn tối đa hóa kích thước lô
MonsieurBeilto

4

Thật kỳ lạ, tôi thấy rằng kích thước lô lớn hơn với máy ảnh đòi hỏi nhiều kỷ nguyên hơn để hội tụ.

Ví dụ: đầu ra của tập lệnh này dựa trên thử nghiệm tích hợp của máy ảnh

epochs 15   , batch size 16   , layer type Dense: final loss 0.56, seconds 1.46
epochs 15   , batch size 160  , layer type Dense: final loss 1.27, seconds 0.30
epochs 150  , batch size 160  , layer type Dense: final loss 0.55, seconds 1.74

Liên quan

Sử dụng kích thước lô quá lớn có thể có tác động tiêu cực đến độ chính xác của mạng của bạn trong quá trình đào tạo vì nó làm giảm tính ngẫu nhiên của độ dốc giảm dần.

Chỉnh sửa: hầu hết các lần, tăng batch_sizelà mong muốn để tăng tốc độ tính toán, nhưng có những cách đơn giản khác để làm điều này, như sử dụng các kiểu dữ liệu của một dấu chân nhỏ hơn thông qua dtypetranh luận, cho dù trong keras hoặc tensorflow , ví dụ như float32thay vìfloat64


Với các lô lớn hơn (và do đó ít hơn trên mỗi epoch), bạn sẽ có ít cập nhật gradient hơn cho mỗi epoch. "epoch" chỉ là biệt ngữ ML cho "một lần truyền dữ liệu của bạn trong quá trình đào tạo". Nếu bạn đang cố gắng tăng tốc độ luyện tập, hãy đo thời gian trên tường và bỏ qua các kỷ nguyên.
Andrew Wagner
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.