2017-03-31 28 views
7

Tôi đang sử dụng quy tắc chuẩn hóa L1 trên các thông số mạng nơron của mình trong Keras với keras.regularizers.l1(0.01) để có được mô hình thưa thớt. Tôi thấy rằng, trong khi nhiều hệ số của tôi là đóng bằng không, một vài trong số đó thực sự là số không.Việc chuẩn hóa L1 trong Keras/Tensorflow * có thực sự * L1-regularization không?

Khi nhìn vào the source code for the regularization, nó cho thấy rằng Keras chỉ thêm định mức L1 của các tham số vào hàm mất.

Điều này sẽ không chính xác vì các tham số gần như chắc chắn sẽ không bao giờ chuyển thành 0 (trong lỗi dấu chấm động) như dự định với quy tắc L1. Định mức L1 không thể phân biệt được khi tham số bằng 0, vì vậy các phương thức cấp dưới cần phải được sử dụng trong đó các thông số được đặt thành 0 nếu đủ gần bằng không trong thói quen tối ưu hóa. Xem toán tử ngưỡng mềm max(0, ..)here.

Tensorflow/Keras có thực hiện việc này hay điều này không thực tế đối với gốc dốc ngẫu nhiên?

CHỈNH SỬA: Ngoài ra here là một bài đăng trên blog tuyệt vời giải thích toán tử thresholding mềm cho việc chuẩn hóa L1.

+0

Quá trình chuẩn hóa 'L1' là tốt. L1 khuyến khích sparsity hơn L2, nhưng chắc chắn không đảm bảo nó. Cả theano và tensorflow đều được kiểm tra tốt, và tất nhiên xử lý các gradient chỉ tốt xung quanh điểm không thể phân biệt được. – y300

+0

Tôi nghĩ rằng bạn đúng rằng cách nó được thực hiện nó không thực sự làm cho trọng lượng đi đến số không. Điều này là không may. – Aaron

+0

Bạn đang sử dụng trình chỉnh sửa trong mã "của bạn" như thế nào? –

Trả lời

0

Keras thực hiện đúng quy trình L1. Trong bối cảnh của các mạng nơ-ron, quá trình chuẩn hóa L1 chỉ cần thêm định mức L1 của các tham số vào hàm mất (xem CS231).

Trong khi quá trình chuẩn hóa L1 khuyến khích sự thưa thớt, nó không đảm bảo rằng đầu ra sẽ thưa thớt. Các thông số cập nhật từ stochastic gradient descent vốn đã ồn ào. Do đó, xác suất mà bất kỳ thông số nào đã cho là chính xác 0 là biến mất nhỏ.

Tuy nhiên, nhiều tham số của mạng L1 được chuẩn hóa thường gần bằng 0. Một cách tiếp cận thô sơ là để ngưỡng giá trị nhỏ đến 0. Đã có nghiên cứu để khám phá thêm các phương pháp tiên tiến tạo mạng nơron thưa thớt. Trong this paper, các tác giả đồng thời tỉa và đào tạo một mạng nơron để đạt được 90-95% thưa thớt trên một số kiến ​​trúc mạng nổi tiếng.

2

Vì vậy, mặc dù @Joshua câu trả lời, có ba thứ khác mà có giá trị đề cập đến:

  1. Không có vấn đề kết nối với một gradient trong 0. keras được tự động đặt thành 1 tương tự như trường hợp relu.
  2. Hãy nhớ rằng các giá trị nhỏ hơn 1e-6 thực tế bằng 0 vì đây là độ chính xác float32.
  3. Vấn đề không có hầu hết các giá trị được đặt thành 0 có thể phát sinh do lý do tính toán do bản chất của thuật toán dựa trên độ dốc (và đặt giá trị cao l1) do dao động có thể xảy ra do gradient gián đoạn. Để hiểu tưởng tượng rằng đối với một trọng số đã cho w = 0.005 tốc độ học của bạn bằng 0.01 và độ dốc của tổn thất chính bằng 0 w.r.t. đến w.Vì vậy, cân nặng của bạn sẽ được cập nhật trong các cách sau đây:

    w = 0.005 - 1 * 0.01 = -0.05 (because gradient is equal to 1 as w > 0), 
    

    và sau khi cập nhật thứ hai:

    w = -0.005 + 1 * 0.01 = 0.05 (because gradient is equal to -1 as w < 0). 
    

    Như bạn có thể nhìn thấy giá trị tuyệt đối của w chưa giảm ngay cả khi bạn áp dụng quy tắc l1 và điều này xảy ra do bản chất của thuật toán dựa trên gradient. Tất nhiên, đây là tình huống đơn giản nhưng bạn có thể trải nghiệm hành vi dao động như vậy thực sự thường xuyên khi sử dụng thường lệ l1 normizer.

Các vấn đề liên quan