Thực hành tốt nhất Deep Learning (1) - Khởi tạo trọng lượng

Khái niệm cơ bản, cạm bẫy khởi tạo trọng lượng & thực hành tốt nhất

https://pixabay.com/photo-1600668/

Động lực

Là người mới bắt đầu học sâu, một trong những điều tôi nhận ra là có rất nhiều tài liệu trực tuyến bao gồm tất cả các thủ thuật học sâu ở một nơi. Có rất nhiều thực hành tốt nhất nhỏ, từ các thủ thuật đơn giản như khởi tạo trọng lượng, chính quy đến các kỹ thuật hơi phức tạp như tốc độ học theo chu kỳ có thể giúp việc đào tạo và gỡ lỗi mạng lưới thần kinh dễ dàng và hiệu quả hơn. Điều này truyền cảm hứng cho tôi để viết loạt blog này, nơi tôi sẽ đề cập đến nhiều sắc thái nhất có thể để thực hiện việc học sâu đơn giản hơn cho bạn.

Trong khi viết blog này, giả định là bạn có một ý tưởng cơ bản về cách các mạng lưới thần kinh được đào tạo. Sự hiểu biết về trọng lượng, thành kiến, các lớp ẩn, kích hoạt và chức năng kích hoạt sẽ làm cho nội dung rõ ràng hơn. Tôi muốn giới thiệu khóa học này nếu bạn muốn xây dựng một nền tảng cơ bản của học tập sâu.

Lưu ý - Bất cứ khi nào tôi đề cập đến các lớp của mạng thần kinh, nó sẽ ngụ ý các lớp của mạng thần kinh đơn giản, tức là các lớp được kết nối đầy đủ. Tất nhiên một số phương pháp tôi nói về việc áp dụng cho các mạng thần kinh tích chập và tái phát là tốt. Trong blog này tôi sẽ nói về các vấn đề liên quan đến khởi tạo ma trận trọng số và các cách để giảm thiểu chúng. Trước đó, hãy để Lôi chỉ đề cập đến một số điều cơ bản và ký hiệu mà chúng ta sẽ sử dụng trong tương lai.

Khái niệm cơ bản và ký hiệu

Hãy xem xét một mạng nơ ron lớp L, có các lớp ẩn L-1 và 1 lớp đầu ra. Các tham số (trọng lượng và độ lệch) của lớp l được biểu diễn dưới dạng

Ngoài các trọng số và thành kiến, trong quá trình đào tạo, các biến trung gian sau được tính toán

Đào tạo một mạng lưới thần kinh bao gồm 4 bước:

  1. Khởi tạo trọng số và thành kiến.
  2. Truyền lan: Sử dụng đầu vào X, trọng số W và độ lệch b, với mỗi lớp chúng ta tính Z và A. Ở lớp cuối cùng, chúng ta tính f (A ^ (L-1)) có thể là hàm sigmoid, softmax hoặc tuyến tính của A ^ (L-1) và điều này đưa ra dự đoán y_hat.
  3. Tính toán hàm mất: Đây là hàm của nhãn thực tế y và nhãn dự đoán y_hat. Nó nắm bắt được dự đoán của chúng ta cách xa mục tiêu thực tế bao xa. Mục tiêu của chúng tôi là để giảm thiểu chức năng mất này.
  4. Tuyên truyền ngược: Trong bước này, chúng tôi tính toán độ dốc của hàm mất f (y, y_hat) đối với A, W và b được gọi là dA, dW và db. Sử dụng các gradient này, chúng tôi cập nhật các giá trị của các tham số từ lớp cuối cùng sang lớp đầu tiên.
  5. Lặp lại các bước 2 Ném4 cho n lần lặp / epoch cho đến khi chúng tôi cảm thấy mình đã giảm thiểu chức năng mất, mà không làm quá mức dữ liệu tàu (sẽ nói thêm về điều này sau!)

Ở đây, hãy xem nhanh các bước 2, 3 và 4 cho một mạng có 2 lớp, tức là một lớp ẩn. (Lưu ý rằng tôi đã bổ sung các thuật ngữ thiên vị ở đây để đơn giản):

Tuyên truyền về phía trướcTuyên truyền lạc hậu

Đang khởi tạo trọng số W

Một trong những điểm khởi đầu cần quan tâm trong khi xây dựng mạng của bạn là khởi tạo chính xác ma trận trọng số của bạn. Chúng ta hãy xem xét 2 kịch bản có thể gây ra vấn đề trong khi đào tạo mô hình:

1. Khởi tạo tất cả các trọng số về 0

Hãy để Lôi chỉ đưa nó ra khỏi đó - điều này làm cho mô hình của bạn tương đương với mô hình tuyến tính. Khi bạn đặt tất cả trọng số thành 0, đạo hàm liên quan đến hàm mất là như nhau đối với mọi w trong W ^ l, do đó, tất cả các trọng số đều có cùng giá trị trong lần lặp tiếp theo. Điều này làm cho các đơn vị ẩn đối xứng và tiếp tục cho tất cả các lần lặp n bạn chạy. Do đó, việc đặt trọng số về 0 làm cho mạng của bạn không tốt hơn mô hình tuyến tính. Điều quan trọng cần lưu ý là việc đặt độ lệch thành 0 sẽ không tạo ra bất kỳ rắc rối nào vì các trọng số khác không đảm bảo phá vỡ tính đối xứng và ngay cả khi độ lệch là 0, các giá trị trong mỗi nơ ron vẫn khác nhau.

2. Khởi tạo trọng lượng ngẫu nhiên

Khởi tạo trọng số ngẫu nhiên, theo phân phối chuẩn thông thường (np.random.randn (size_l, size_l-1) trong Python) trong khi làm việc với mạng (sâu) có thể có khả năng dẫn đến 2 vấn đề - biến mất độ dốc hoặc làm nổ độ dốc.

a) Độ dốc biến mất - Trong trường hợp mạng sâu, đối với bất kỳ chức năng kích hoạt nào, abs (dW) sẽ ngày càng nhỏ hơn khi chúng ta quay ngược với mọi lớp trong quá trình truyền ngược. Các lớp trước là chậm nhất để đào tạo trong trường hợp như vậy.

Cập nhật trọng lượng là nhỏ và kết quả là hội tụ chậm hơn. Điều này làm cho việc tối ưu hóa chức năng mất chậm. Trong trường hợp xấu nhất, điều này có thể ngăn chặn hoàn toàn mạng lưới thần kinh đào tạo thêm.

Cụ thể hơn, trong trường hợp sigmoid (z) và tanh (z), nếu trọng lượng của bạn lớn, thì độ dốc sẽ biến mất nhỏ, ngăn chặn hiệu quả trọng lượng thay đổi giá trị của chúng. Điều này là do abs (dW) sẽ tăng rất nhẹ hoặc có thể ngày càng nhỏ hơn mỗi lần lặp. Với độ dốc biến mất của RELU (z) thường không phải là vấn đề vì độ dốc là 0 đối với đầu vào âm (và 0) và 1 đối với đầu vào dương.

b) Độ dốc nổ - Điều này trái ngược hoàn toàn với độ dốc biến mất. Xem xét bạn có trọng lượng không âm và lớn và kích hoạt nhỏ A (như có thể là trường hợp đối với sigmoid (z)). Khi các trọng số này được nhân lên dọc theo các lớp, chúng gây ra một sự thay đổi lớn trong chi phí. Do đó, độ dốc cũng sẽ lớn. Điều này có nghĩa là những thay đổi trong W, bởi W - * dW, sẽ ở những bước rất lớn, thời điểm giảm sẽ tăng lên.

Điều này có thể dẫn đến dao động xung quanh cực tiểu hoặc thậm chí vượt quá mức tối ưu hết lần này đến lần khác và mô hình sẽ không bao giờ học được!

Một tác động khác của việc nổ độ dốc là các giá trị lớn của độ dốc có thể gây ra tràn số dẫn đến tính toán hoặc giới thiệu không chính xác của NaN lề. Điều này cũng có thể dẫn đến việc mất giá trị NaN.

Thực hành tốt nhất

1. Sử dụng RELU / rò rỉ RELU làm chức năng kích hoạt, vì nó tương đối mạnh mẽ đối với vấn đề độ dốc biến mất / nổ (đặc biệt đối với các mạng không quá sâu). Trong trường hợp rò rỉ RELU, họ không bao giờ có 0 độ dốc. Do đó, họ không bao giờ chết và đào tạo tiếp tục.

2. Đối với các mạng sâu, chúng ta có thể sử dụng một heuristic để khởi tạo các trọng số tùy thuộc vào chức năng kích hoạt phi tuyến tính. Ở đây, thay vì vẽ từ phân phối chuẩn thông thường, chúng ta đang vẽ W từ phân phối bình thường với phương sai k / n, trong đó k phụ thuộc vào hàm kích hoạt. Mặc dù các heuristic này không giải quyết được hoàn toàn vấn đề độ dốc nổ / biến mất, nhưng chúng giúp giảm thiểu nó đến một mức độ lớn. Phổ biến nhất là:

a) Với RELU (z) - Chúng tôi nhân các giá trị được tạo ngẫu nhiên của W với:

b) Đối với tanh (z) - Các heuristic được gọi là khởi tạo Xavier. Nó tương tự như cái trước, ngoại trừ k là 1 thay vì 2.

Trong TensorFlow W = tf.get_variable ('W', [dims], bộ khởi tạo) trong đó bộ khởi tạo = tf.contrib.layers.xavier_initializer ()

c) Một heuristic thường được sử dụng là:

Chúng đóng vai trò là điểm khởi đầu tốt để khởi tạo và giảm thiểu cơ hội phát nổ hoặc biến mất độ dốc. Họ đặt các trọng số không quá lớn hơn 1, cũng không quá ít hơn 1. Vì vậy, các gradient không biến mất hoặc phát nổ quá nhanh. Chúng giúp tránh sự hội tụ chậm, cũng đảm bảo rằng chúng ta không tiếp tục dao động khỏi cực tiểu. Có tồn tại các biến thể khác ở trên, trong đó mục tiêu chính một lần nữa là để giảm thiểu phương sai của các tham số.

3. Gradient Clipping - Đây là một cách khác để xử lý vấn đề gradient nổ. Chúng tôi đặt giá trị ngưỡng và nếu chức năng được chọn của độ dốc lớn hơn ngưỡng này, chúng tôi sẽ đặt giá trị này thành giá trị khác. Ví dụ: bình thường hóa độ dốc khi chỉ tiêu L2 vượt quá ngưỡng nhất định, phạm vi nhất định

Một điểm quan trọng cần lưu ý là chúng ta đã nói về các khởi tạo khác nhau của W, nhưng không phải là các thành kiến ​​b. Điều này là do độ dốc liên quan đến độ lệch chỉ phụ thuộc vào kích hoạt tuyến tính của lớp đó chứ không phụ thuộc vào độ dốc của các lớp sâu hơn. Do đó, không có giảm bớt hoặc bùng nổ độ dốc cho các điều khoản thiên vị. Như đã đề cập trước đó, chúng có thể được khởi tạo an toàn thành 0.

Phần kết luận

Trong blog này, chúng tôi đã đề cập đến những cạm bẫy khởi tạo trọng lượng và một số kỹ thuật giảm thiểu. Nếu tôi đã bỏ lỡ bất kỳ hiểu biết hữu ích khác liên quan đến chủ đề này, tôi sẽ rất vui khi học nó từ bạn! Trong blog tiếp theo, tôi sẽ nói về các phương pháp chính quy để giảm quá mức và kiểm tra độ dốc - một mẹo để làm cho việc gỡ lỗi đơn giản hơn!

Người giới thiệu

  1. https://www.coursera.org/learn/deep-neural-network/lecture/RwqYe/gra-initialization-for-deep-networks
  2. Mạng lưới thần kinh: đào tạo với backpropagation - Jeremy Jordan
  3. Giới thiệu nhẹ nhàng về các học sinh bùng nổ trong mạng lưới thần kinh của Jason Brownlee
  4. Vấn đề độ dốc biến mất
  5. https://www.quora.com/Why-is-it-a-probols-to-have-exploding-gradrons-in-a-neural-net-especial-in-an-RNN

Giới thiệu về tôi: Tốt nghiệp ngành Khoa học dữ liệu MS tại USF và chưa tốt nghiệp ngành Khoa học máy tính, tôi có 2 năm kinh nghiệm trong việc xây dựng các thuật toán dự đoán và đề xuất, và có được những hiểu biết kinh doanh cho khách hàng tài chính và bán lẻ. Tôi rất hào hứng về các cơ hội để áp dụng kiến ​​thức máy học và kiến ​​thức học sâu vào các vấn đề trong thế giới thực.
Hãy kiểm tra các blog khác của tôi ở đây!
LinkedIn: https://www.linkedin.com/in/neerja-doshi/