Mạng lưới thần kinh: sử dụng chức năng chi phí nào?


48

Tôi đang sử dụng TensorFlow cho các thí nghiệm chủ yếu với các mạng thần kinh. Mặc dù tôi đã thực hiện khá nhiều thử nghiệm (XOR-Problem, MNIST, một số công cụ Hồi quy, ...), tôi vẫn phải vật lộn với việc chọn hàm chi phí "chính xác" cho các vấn đề cụ thể vì nhìn chung tôi có thể được coi là người mới bắt đầu.

Trước khi đến với TensorFlow, tôi đã mã hóa một số MLP được kết nối đầy đủ và một số mạng lặp lại bằng PythonNumPy nhưng chủ yếu tôi gặp vấn đề trong đó một lỗi bình phương đơn giản và một độ dốc đơn giản là đủ.

Tuy nhiên, vì TensorFlow cung cấp khá nhiều hàm chi phí cũng như xây dựng các hàm chi phí tùy chỉnh, tôi muốn biết liệu có một loại hướng dẫn nào có thể dành riêng cho các hàm chi phí trên mạng thần kinh không? (Tôi đã thực hiện được một nửa số hướng dẫn chính thức của TensorFlow nhưng họ không thực sự giải thích lý do tại sao các hàm chi phí cụ thể hoặc người học được sử dụng cho các vấn đề cụ thể - ít nhất là không dành cho người mới bắt đầu)

Để đưa ra một số ví dụ:

cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(y_output, y_train))

Tôi đoán nó áp dụng hàm softmax trên cả hai đầu vào sao cho tổng của một vectơ bằng 1. Nhưng chính xác thì entropy chéo với các bản ghi là gì? Tôi nghĩ rằng nó tổng hợp các giá trị và tính toán entropy chéo ... vì vậy một số phép đo?! Điều này sẽ không giống nhau nhiều nếu tôi bình thường hóa đầu ra, tổng hợp nó và nhận lỗi bình phương? Ngoài ra, tại sao điều này được sử dụng, ví dụ như đối với MNIST (hoặc thậm chí các vấn đề khó khăn hơn nhiều)? Khi tôi muốn phân loại như 10 hoặc thậm chí có 1.000 lớp, không tổng giá trị hoàn toàn phá hủy bất kỳ thông tin về lớp thực sự là đầu ra?

cost = tf.nn.l2_loss(vector)

Cái này để làm gì? Tôi nghĩ rằng mất l2 gần như là lỗi bình phương, nhưng API của TensorFlow nói rằng đầu vào của nó chỉ là một tenxơ. Không có ý tưởng nào cả?!

Bên cạnh đó tôi thấy điều này cho entropy chéo khá thường xuyên:

cross_entropy = -tf.reduce_sum(y_train * tf.log(y_output))

... nhưng tại sao nó lại được sử dụng? Không phải là mất mát trong entropy chéo về mặt toán học này:

-1/n * sum(y_train * log(y_output) + (1 - y_train) * log(1 - y_output))

Đâu là (1 - y_train) * log(1 - y_output)phần trong hầu hết các ví dụ của TensorFlow? Nó không bị thiếu sao?


Trả lời: Tôi biết câu hỏi này khá mở, nhưng tôi không mong đợi có được 10 trang với mỗi hàm vấn đề / chi phí duy nhất được liệt kê chi tiết. Tôi chỉ cần một bản tóm tắt ngắn về thời điểm sử dụng hàm chi phí nào (nói chung hoặc trong TensorFlow, không quan trọng với tôi) và một số giải thích về chủ đề này. Và / hoặc một số nguồn cho người mới bắt đầu;)


1
Câu hỏi hay. Chào mừng đến với trang web :)
Dawny33

2
Thông thường, MSE được lấy để hồi quy và Cross-Entropy để phân loại. Hình phân loại bằng khen (CFM) đã được giới thiệu trong "Một chức năng mục tiêu mới để cải thiện nhận dạng âm vị bằng cách sử dụng mạng thần kinh trì hoãn thời gian" của Hampshire và Waibel. Nếu tôi nhớ chính xác, họ cũng giải thích lý do tại sao họ thiết kế CFM như họ đã làm.
Martin Thoma

1
Tôi nghĩ giảm_sum (y_train * tf.log (yDefput)) được sử dụng rất nhiều vì đây là một ví dụ "trường hợp đơn giản" khá phổ biến. Nó sẽ chạy tổng lỗi của từng đợt, có nghĩa là lỗi của bạn sẽ nhân đôi chi phí (và độ lớn của độ dốc) nếu đợt của bạn tăng gấp đôi. Thực hiện thay đổi đơn giản thành less_mean ít nhất sẽ giúp gỡ lỗi và chơi với các cài đặt dễ hiểu hơn theo quan điểm của tôi.
nơ-ron

Câu trả lời:


33

Câu trả lời này nằm ở khía cạnh chung của các hàm chi phí, không liên quan đến TensorFlow và chủ yếu sẽ giải quyết phần "giải thích về chủ đề này" trong câu hỏi của bạn.

Trong hầu hết các ví dụ / hướng dẫn tôi đã làm theo, hàm chi phí được sử dụng có phần tùy ý. Điểm quan trọng hơn là giới thiệu cho người đọc một phương pháp cụ thể, chứ không phải chức năng chi phí cụ thể. Không nên ngăn bạn làm theo hướng dẫn để làm quen với các công cụ, nhưng câu trả lời của tôi sẽ giúp bạn về cách chọn hàm chi phí cho các vấn đề của riêng bạn.

Nếu bạn muốn có câu trả lời liên quan đến Cross-Entropy, Logit, định mức L2 hoặc bất cứ điều gì cụ thể, tôi khuyên bạn nên đăng nhiều câu hỏi cụ thể hơn. Điều này sẽ tăng khả năng ai đó có kiến ​​thức cụ thể sẽ nhìn thấy câu hỏi của bạn.


Chọn hàm chi phí phù hợp để đạt được kết quả mong muốn là một điểm quan trọng của các vấn đề máy học. Cách tiếp cận cơ bản, nếu bạn không biết chính xác những gì bạn muốn từ phương pháp của mình, là sử dụng Lỗi bình phương trung bình (Wikipedia) cho các vấn đề hồi quy và Tỷ lệ lỗi cho các vấn đề phân loại. Tuy nhiên, nếu bạn muốn kết quả tốt từ phương pháp của mình, bạn cần xác định tốt và do đó xác định hàm chi phí phù hợp. Điều này xuất phát từ cả kiến ​​thức tên miền (dữ liệu của bạn là gì, bạn đang cố gắng đạt được điều gì) và kiến ​​thức về các công cụ theo ý của bạn.

Tôi không tin rằng tôi có thể hướng dẫn bạn thông qua các hàm chi phí đã được triển khai trong TensorFlow, vì tôi có rất ít kiến ​​thức về công cụ, nhưng tôi có thể cho bạn một ví dụ về cách viết và đánh giá các hàm chi phí khác nhau.


xnf(xn){0,1}

Nf(yn)yn

  • 1Nn{1 if f(xn)yn0 otherwise=nyn[1f(xn)]+[1yn]f(xn)

p(yn=1|xn)

  • 1Nnynp(yn=0|xn)+(1yn)p(yn=1|xn)

p(yn=1|xn)=0.5

p(yn=1|xn)=1yn=0logp(yn|xn)log(0)=log(1)=0, hàm sau không có vấn đề được mô tả trong đoạn trước:

  • 1Nnynlogp(yn=0|xn)+(1yn)logp(yn=1|xn)

Điều này sẽ minh họa rằng để tối ưu hóa cùng một thứ , tỷ lệ lỗi, các định nghĩa khác nhau có thể mang lại kết quả khác nhau nếu chúng dễ hiểu hơn về mặt tính toán.

ABAB


Bây giờ hãy xem làm thế nào chức năng chi phí khác nhau có thể đo lường các khái niệm khác nhau. Trong bối cảnh truy xuất thông tin, như trong tìm kiếm google (nếu chúng tôi bỏ qua xếp hạng), chúng tôi muốn kết quả trả về

  • có độ chính xác cao , không trả lại thông tin không liên quan
  • thu hồi cao , trả lại càng nhiều kết quả liên quan càng tốt
  • Chính xác và thu hồi (Wikipedia)

Lưu ý rằng nếu thuật toán của bạn trả về mọi thứ , nó sẽ trả về mọi kết quả có liên quan có thể, và do đó có độ thu hồi cao, nhưng có độ chính xác rất kém. Mặt khác, nếu nó chỉ trả về một phần tử, phần tử mà nó chắc chắn nhất có liên quan, nó sẽ có độ chính xác cao nhưng độ thu hồi thấp.

FF1Fββ

  • β>1
  • β<1

Trong kịch bản như vậy, việc chọn hàm chi phí là chọn đánh đổi thuật toán của bạn nên làm gì .

Một ví dụ khác thường được đưa ra là trường hợp chẩn đoán y tế, bạn có thể chọn một hàm chi phí trừng phạt nhiều âm tính giả hoặc dương tính giả tùy thuộc vào những gì thích hợp hơn:

  • Nhiều người khỏe mạnh hơn được phân loại là bệnh (Nhưng sau đó, chúng tôi có thể điều trị cho những người khỏe mạnh, điều này rất tốn kém và có thể làm tổn thương họ nếu họ thực sự không bị bệnh)
  • Nhiều người bệnh hơn được phân loại là khỏe mạnh (Nhưng sau đó, họ có thể chết mà không được điều trị)

Tóm lại, việc xác định hàm chi phí là xác định mục tiêu của thuật toán của bạn. Thuật toán xác định làm thế nào để đạt được điều đó.


Lưu ý bên lề: Một số hàm chi phí có các cách thuật toán đẹp để đạt được mục tiêu của chúng. Ví dụ, một cách hay đến mức tối thiểu của Mất bản lề (Wikipedia) tồn tại, bằng cách giải quyết vấn đề kép trong SVM (Wikipedia)


10

Để trả lời câu hỏi của bạn về Cross entropy, bạn sẽ nhận thấy rằng cả hai điều bạn đã đề cập đều giống nhau.

1n(y_trainlog(y_output)+(1y_train)log(1y_output))

y_trainy_output

Phương trình khác mà bạn đề cập là một biến thể chung hơn của nó mở rộng ra nhiều lớp

-tf.reduce_sum(y_train * tf.log(y_output)) giống như viết

ntrain_problog(out_prob)

n


4

BLUF: thử và lặp lại lỗi với tập hợp con của dữ liệu và matplotlib.

Câu trả lời dài:

Đội của tôi đã vật lộn với câu hỏi tương tự cách đây không lâu. Tất cả các câu trả lời ở đây đều rất hay, nhưng tôi muốn chia sẻ với bạn "câu trả lời cho người mới bắt đầu" của tôi về ngữ cảnh và là điểm khởi đầu cho những người mới làm quen với máy học.

Bạn muốn nhắm đến một hàm chi phí trơn tru và lồi cho sự lựa chọn cụ thể của bạn về thuật toán và tập dữ liệu. Đó là bởi vì bạn muốn thuật toán của bạn có thể tự tin và hiệu quả điều chỉnh các trọng số để cuối cùng đạt đến mức tối thiểu toàn cầu của hàm chi phí đó. Nếu hàm chi phí của bạn "gập ghềnh" với max và min cục bộ và / hoặc không có mức tối thiểu toàn cầu, thì thuật toán của bạn có thể gặp khó khăn khi hội tụ; trọng lượng của nó có thể tăng vọt khắp nơi, cuối cùng không cung cấp cho bạn dự đoán chính xác và / hoặc nhất quán.

Ví dụ: nếu bạn đang sử dụng hồi quy tuyến tính để dự đoán cân nặng của ai đó (số thực, tính bằng pound) dựa trên chiều cao của họ (số thực, tính bằng inch) và tuổi (số thực, tính bằng năm), thì hàm chi phí lỗi bình phương trung bình phải là một đường cong đẹp, mịn, lồi. Thuật toán của bạn sẽ không có vấn đề hội tụ.

Nhưng giả sử thay vì bạn đang sử dụng thuật toán hồi quy logistic cho vấn đề phân loại nhị phân, như dự đoán giới tính của một người dựa trên việc người đó đã mua tã trong 30 ngày qua và liệu người đó có mua bia trong 30 ngày qua hay không. Trong trường hợp này, lỗi bình phương có thể không cung cấp cho bạn một bề mặt lồi mịn, có thể không tốt cho việc đào tạo. Và bạn sẽ nói rằng bằng thử nghiệm.

Bạn có thể bắt đầu bằng cách chạy thử nghiệm bằng cách sử dụng MSE và một mẫu dữ liệu nhỏ và đơn giản hoặc với dữ liệu giả mà bạn đã tạo cho thử nghiệm này. Hình dung những gì đang xảy ra với matplotlib (hoặc bất kỳ giải pháp âm mưu nào bạn thích). Là đường cong lỗi kết quả là mịn và lồi? Thử lại với một biến đầu vào bổ sung ... bề mặt kết quả có còn mịn và lồi không? Thông qua thí nghiệm này, bạn có thể thấy rằng trong khi MSE không phù hợp với vấn đề / giải pháp của bạn, thì entropy chéo mang lại cho bạn hình dạng lồi mịn phù hợp hơn với nhu cầu của bạn. Vì vậy, bạn có thể thử điều đó với một tập dữ liệu mẫu lớn hơn và xem liệu giả thuyết có còn tồn tại không. Và nếu có, thì bạn có thể thử nó với tập huấn luyện đầy đủ của bạn một vài lần và xem cách nó thực hiện và nếu nó luôn cung cấp các mô hình tương tự. Nếu không, sau đó chọn một hàm chi phí khác và lặp lại quy trình.

Loại quy trình thử và sai lặp đi lặp lại này đã hoạt động khá tốt đối với tôi và nhóm các nhà khoa học dữ liệu mới bắt đầu, và cho phép chúng tôi tập trung vào việc tìm giải pháp cho các câu hỏi của mình mà không cần phải đi sâu vào lý thuyết toán học đằng sau lựa chọn hàm chi phí và tối ưu hóa mô hình.

Tất nhiên, rất nhiều thử nghiệm và lỗi này đã được thực hiện bởi những người khác, vì vậy chúng tôi cũng tận dụng kiến ​​thức công cộng để giúp chúng tôi lọc các lựa chọn về chức năng chi phí tốt trong quá trình này. Ví dụ, entropy chéo nói chung là một lựa chọn tốt cho các vấn đề phân loại, cho dù đó là phân loại nhị phân với hồi quy logistic như ví dụ ở trên hoặc phân loại đa nhãn phức tạp hơn với lớp softmax làm đầu ra. Trong khi đó MSE là lựa chọn đầu tiên tốt cho các vấn đề hồi quy tuyến tính trong đó bạn đang tìm kiếm một dự đoán vô hướng thay vì khả năng là thành viên trong một danh mục đã biết trong số các danh mục có thể có, trong trường hợp đó thay vì lớp softmax như đầu ra của bạn d chỉ có thể có tổng trọng số của đầu vào cộng với độ lệch mà không có chức năng kích hoạt.

Hy vọng câu trả lời này sẽ giúp những người mới bắt đầu khác mà không quá đơn giản và rõ ràng.


3

Trả lời câu hỏi của bạn

Phần (1 - y_train) * log (1 - yDefput) nằm ở đâu trong hầu hết các ví dụ của TensorFlow? Nó không bị thiếu sao?

Câu trả lời là hầu hết các chức năng đầu ra là softmax. Điều đó có nghĩa là bạn không nhất thiết phải giảm tất cả các xác suất trong các trường hợp sai vì chúng sẽ tự động bị giảm khi bạn tăng xác suất đúng

Ví dụ:

trước khi tối ưu hóa

y_output = [0.2, 0.2, 0.6]y_train = [0, 0, 1]

sau khi tối ưu hóa

y_output = [0.15, 0.15, 0.7]y_train = [0, 0, 1]

Ở đây quan sát rằng mặc dù chúng tôi chỉ tăng nhiệm kỳ thứ ba, tất cả các điều khoản khác tự động giảm

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.