Làm thế nào để giảm thiểu độ dốc giảm dần cập nhật trọng số cho từng ví dụ trong một lô?


12

Nếu chúng tôi xử lý 10 ví dụ trong một đợt, tôi hiểu rằng chúng tôi có thể tính tổng tổn thất cho mỗi ví dụ, nhưng làm thế nào để truyền bá hoạt động liên quan đến việc cập nhật các trọng số cho mỗi ví dụ?

Ví dụ:

  • Ví dụ 1 -> mất = 2
  • Ví dụ 2 -> mất = -2

Điều này dẫn đến mất trung bình 0 (E = 0), vậy làm thế nào để cập nhật từng trọng lượng và hội tụ? Có phải chỉ đơn giản là do sự ngẫu nhiên của các lô mà chúng ta "hy vọng" hội tụ sớm hay muộn? Ngoài ra, điều này không chỉ tính toán độ dốc cho tập trọng lượng đầu tiên cho ví dụ cuối được xử lý?

Câu trả lời:


15

Gradient giảm dần không hoạt động theo cách bạn đề xuất nhưng một vấn đề tương tự có thể xảy ra.

Chúng tôi không tính toán tổn thất trung bình từ lô, chúng tôi tính toán độ dốc trung bình của hàm mất mát. Độ dốc là đạo hàm của tổn thất đối với trọng số và trong mạng nơ ron, độ dốc cho một trọng lượng phụ thuộc vào đầu vào của ví dụ cụ thể đó và nó cũng phụ thuộc vào nhiều trọng số khác trong mô hình.

Nếu mô hình của bạn có 5 trọng lượng và bạn có kích thước lô nhỏ là 2 thì bạn có thể nhận được điều này:

Ví dụ 1. Mất = 2,gradients=(1.5,2.0,1.1,0.4,0.9)

Ví dụ 2. Mất = 3,gradients=(1.2,2.3,1.1,0.8,0.7)

Trung bình của độ dốc trong lô nhỏ này được tính toán, chúng là(1.35,0.15,0,0.2,0.8)

Lợi ích của việc tính trung bình trên một số ví dụ là độ biến thiên của gradient thấp hơn nên việc học tập nhất quán hơn và ít phụ thuộc vào chi tiết cụ thể của một ví dụ. Lưu ý cách độ dốc trung bình cho trọng số thứ ba là , trọng số này sẽ không thay đổi bản cập nhật trọng lượng này nhưng nó có thể sẽ khác không đối với các ví dụ tiếp theo được chọn được tính toán với các trọng số khác nhau.0

chỉnh sửa để phản hồi ý kiến:

Trong ví dụ của tôi trên mức trung bình của độ dốc được tính toán. Đối với kích thước lô nhỏ của trong đó chúng tôi tính toán tổn thất cho mỗi ví dụ, chúng tôi nhắm đến việc lấy độ dốc trung bình của tổn thất đối với trọng số .L i w jkLiwj

Cách tôi viết nó trong ví dụ của mình, tôi đã tính trung bình mỗi gradient như:Lwj=1ki=1kLiwj

Mã hướng dẫn mà bạn liên kết đến trong các bình luận sử dụng Tensorflow để giảm thiểu tổn thất trung bình.

Tensorflow nhằm mục đích giảm thiểu1ki=1kLi

Để giảm thiểu điều này, nó tính toán độ dốc của tổn thất trung bình theo từng trọng lượng và sử dụng độ dốc giảm dần để cập nhật các trọng số:

Lwj=wj1ki=1kLi

Sự khác biệt có thể được đưa vào bên trong tổng để nó giống như biểu thức từ cách tiếp cận trong ví dụ của tôi.

wj1ki=1kLi=1ki=1kLiwj


Gotcha. Bạn vẫn muốn tính trung bình tổn thất trên batch_size đúng không? Tôi không chắc là bạn có quen thuộc với tenorflow không nhưng tôi đã cố gắng điều hòa sự hiểu biết của mình với hướng dẫn này: tenorflow.org/get_started/mnist/beginners Bạn có thể thấy tổn thất được tính trung bình theo đợt (mã giảm_mean). Tôi cho rằng tenorflow giữ một số lượng trung bình / trung bình của các trọng số?
toán vào

1
@carboncomputing À đúng rồi, họ tính trung bình tổn thất để khi Tensorflow tính toán độ dốc của tổn thất trung bình, nó tính toán hiệu quả trung bình của độ dốc cho mỗi lần mất. Tôi sẽ chỉnh sửa câu trả lời của tôi để hiển thị toán học cho điều này.
Hugh

Hấp dẫn. Cảm ơn bạn đã làm rõ. Vì vậy, chỉ cần đào sâu hơn một chút, các gradient trọng lượng được tính cho mỗi ví dụ trong quá trình chuyển tiếp và được lưu trữ hay chúng được tính toán trong quá trình tối ưu hóa trong dòng chảy căng thẳng? Tôi cho rằng tôi chỉ thiếu "ở đâu" những gradient này trong dòng chảy căng thẳng? Tôi thấy đường chuyền về phía trước và sự mất mát, vì vậy tenorflow đang thực hiện các tính toán độ dốc / trung bình dưới mui xe này cho tôi?
toán

1
@carboncomputing Đó là sự hấp dẫn của Tensorflow, nó sử dụng toán học tượng trưng và có thể thực hiện sự khác biệt dưới mui xe
Hugh

Cảm ơn bạn đã trả lời gọn gàng. Tuy nhiên, tôi không hiểu làm thế nào TF biết cách sao lưu lan truyền với tổn thất trung bình như trong ví dụ này , code line 170?
tội nhân

-1

Lý do để sử dụng các lô nhỏ là để có một số lượng ví dụ đào tạo tốt để độ nhiễu có thể giảm được bằng cách lấy trung bình các hiệu ứng của chúng, nhưng cũng không phải là một lô đầy đủ mà nhiều bộ dữ liệu có thể cần một lượng bộ nhớ lớn. Một thực tế quan trọng là lỗi mà bạn đánh giá luôn là một khoảng cáchgiữa đầu ra dự đoán của bạn và đầu ra thực: điều đó có nghĩa là nó không thể âm, do đó, bạn không thể có lỗi 2 và -2 mà hủy bỏ, nhưng thay vào đó, nó sẽ trở thành lỗi 4 Sau đó, bạn đánh giá độ dốc của lỗi đối với tất cả các trọng số, vì vậy bạn có thể tính toán thay đổi nào về trọng số sẽ giảm nó nhiều nhất. Khi bạn làm như vậy, bạn thực hiện một "bước" theo hướng đó, dựa trên mức độ alpha của tỷ lệ học tập của bạn. . làm cho nó phân kỳ. Bạn vẫn có thể kết thúc ở mức tối thiểu cục bộ, điều này có thể tránh được bằng cách khởi tạo các trọng số khác nhau của bạn, sử dụng các trình tối ưu hóa differenr và cố gắng thường xuyên hóa.


Chỉ cần thêm: chúng tôi sử dụng các lô nhỏ chủ yếu cho hiệu quả tính toán. Chúng tôi có sự đánh đổi giữa độ chính xác của dòng dõi và tần suất cập nhật trọng số. Dữ liệu phải cực kỳ lớn để không vừa với bộ nhớ.
Łukasz Tốt nghiệp

Tôi hiểu từng loại, nhưng làm thế nào để chúng tôi cập nhật trọng lượng cho một lô cụ thể? Là độ dốc trọng lượng cũng được tổng hợp cho mỗi ví dụ?
toán vào

Không, chỉ có một độ dốc, là một vectơ của đạo hàm, trên tổng sai số lô. Điều này có nghĩa là chúng tôi cập nhật một lần trọng lượng của chúng tôi dựa trên độ dốc, tức là hướng cập nhật làm cho lỗi trên lô nhỏ này giảm nhiều nhất. Độ dốc được tạo từ các đạo hàm riêng, đó là pf phái sinh, lỗi hàng loạt nhỏ đối với từng trọng lượng: điều này cho chúng ta biết nếu mỗi trọng lượng nên trở nên nhỏ hơn hoặc lớn hơn và bao nhiêu. Tất cả các trọng số có được một bản cập nhật cho lô, để giảm lỗi trên lô nhỏ đó, độc lập với các lô nhỏ khác.
Dante
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.