2012-03-07 37 views
6

Trong trường hợp của một perceptron đơn - văn học nói rằng nó không thể được sử dụng cho các trường hợp phân biệt phi tuyến tính phân biệt như hàm XOR. Điều này là dễ hiểu vì VC-kích thước của một dòng (trong 2-D) là 3 và do đó, một dòng 2-D không thể phân biệt đối xử đầu ra như XOR.Perceptron đơn - Chức năng đánh giá phi tuyến tính

Tuy nhiên, câu hỏi của tôi là tại sao hàm đánh giá trong perceptron đơn lẻ là hàm tuyến tính? Rõ ràng nếu chúng ta có một hàm đánh giá phi tuyến tính như một sigmoid, perceptron này có thể phân biệt giữa các số 1 và 0 của XOR. Vì vậy, tôi đang thiếu một cái gì đó ở đây?

Trả lời

11

nếu chúng ta có một tổ chức phi tuyến tính đánh giá chức năng giống như một sigmoid, Perceptron này có thể phân biệt đối xử giữa các 1s và 0s của XOR

Đó là không đúng sự thật chút nào. Tiêu chuẩn phân biệt đối xử không phải là hình dạng của đường kẻ (hoặc siêu máy bay trong các chiều cao hơn), mà là chức năng cho phép linear separability.

Không có duy nhất chức năng tạo ra siêu kết nối có khả năng tách các điểm của hàm XOR. Đường cong trong hình ảnh phân tách các điểm, nhưng nó không phải là một hàm.

You can't separate the blue and red points into separate hyperplanes using a single function

Để tách các điểm XOR, bạn sẽ phải sử dụng ít nhất hai dòng (hoặc bất kỳ chức năng có hình dạng khác). Điều này sẽ yêu cầu hai perceptron riêng biệt. Sau đó, bạn có thể sử dụng một perceptron thứ ba để tách các kết quả trung gian trên cơ sở ký hiệu.

If you use two lines, you can create two discriminants, and then merge the result

+0

* "nếu chúng ta có một tổ chức phi tuyến tính đánh giá chức năng giống như một sigmoid ..." "Đó không phải là sự thật cả." * Khá như vậy kể từ hàm sigmoid không có ý nghĩa nhiều, nhưng tôi tin rằng Tôi đã đưa ra một ví dụ về hàm đánh giá phi tuyến tính trong đó một trình phân loại nhị phân phức tạp hơn sẽ hoạt động; xem câu trả lời của tôi nếu quan tâm. – ninjagecko

+1

Chức năng bạn đã đề xuất sẽ hoạt động, nhưng nó không thể được xử lý bởi một perceptron duy nhất. xem bình luận về câu trả lời khác. –

2

tôi giả bởi sigmoid bạn không thực sự có nghĩa là một sigmoid, nhưng một cái gì đó với tối đa địa phương. Trong khi phân loại nhị phân Perceptron bình thường có dạng:

f(x) = (1 if w.x+b>0 else 0) 

bạn có thể có một chức năng:

f(x) = (1 if |w.x+b|<0.5 else 0) 

Điều này chắc chắn sẽ làm việc, nhưng sẽ khá giả, trong đó bạn có hiệu quả được thiết kế riêng mô hình của bạn vào tập dữ liệu của bạn, điều này rất tệ.

Liệu thuật toán perceptron bình thường có hội tụ gần như chắc chắn là không có câu hỏi, mặc dù tôi có thể bị nhầm lẫn. http://en.wikipedia.org/wiki/Perceptron#Separability_and_convergence Bạn có thể cần phải tìm ra một cách hoàn toàn mới để phù hợp với chức năng, loại đánh bại mục đích.

Hoặc bạn chỉ có thể sử dụng support vector machine, giống như perceptron, nhưng có thể xử lý các trường hợp phức tạp hơn bằng cách sử dụng kernel trick.

+1

Nhưng bằng cách giới thiệu toán tử mô-đun, bạn đang có hiệu lực tạo hàm _two_, một hàm so sánh (w.x + b) với 0,5, giá trị kia so sánh cùng (w.x + b) với -0,5, rồi sử dụng dấu hiệu của kết quả trung gian trong phân loại thứ ba. Điều này tương đương với việc sử dụng một perceptron nhiều lớp. –

+0

Không hoàn toàn tương đương với việc sử dụng máy đánh chữ nhiều lớp, vì bạn không thể tập luyện trọng lượng riêng biệt. Bạn sẽ thêm một ràng buộc giữa các trọng số trong một perceptron nhiều lớp và tôi không biết điều này có tốt hay không. –

0

Câu hỏi cũ, nhưng tôi muốn rời khỏi suy nghĩ của mình (bất kỳ ai sửa tôi nếu tôi sai).

Tôi nghĩ bạn đã trộn lẫn các khái niệm về các chức năng linear modelloss hoặc error. Perceptron là định nghĩa một mô hình tuyến tính, do đó, nó định nghĩa một dòng/máy bay/siêu máy bay mà bạn có thể sử dụng để phân tách các lớp của bạn.

Thuật toán Perceptron chuẩn nén tín hiệu đầu ra của bạn, đem lại cho -1 hoặc 1:

yhat = signal(w * X + w0) 

Điều này là tốt và cuối cùng sẽ hội tụ nếu dữ liệu của bạn là linearly separable.

Để cải thiện điều này, bạn có thể sử dụng một sigmoid mịn hàm tổn thất trong khoảng [-1, 1]:

yhat = -1 + 2*sigmoid(w * X + w0) 
mean_squared_error = (Y - yhat)^2 

Sau đó sử dụng tối ưu hóa số như Gradient Descent để giảm thiểu các lỗi trên toàn bộ dữ liệu của bạn . Ở đây w0, w1, w2, ..., wn là các biến của bạn.

Bây giờ, nếu dữ liệu gốc của bạn không phải là linearly separable, bạn có thể biến đổi theo cách làm cho nó có thể phân tách tuyến tính và sau đó áp dụng bất kỳ mô hình tuyến tính nào. Điều này đúng bởi vì mô hình là linear on the weights.

Điều này về cơ bản là những gì các mô hình như SVM làm theo mũ trùm làm để phân loại dữ liệu phi tuyến tính của bạn.

PS: I'm learning this stuff too, so experts don't be mad at me if i said some crap.

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