2012-02-21 35 views
8

Tôi đang cố gắng thực hiện thuật toán hồi quy Softmax để giải quyết bài toán K-classifier sau khi xem các bài giảng của Giáo sư Andrew Ng về GLM. Tôi nghĩ Tôi hiểu tất cả những gì ông đã nói cho đến khi nó cuối cùng đã đến viết code để thực hiện các chức năng chi phí cho hồi quy softmax, đó là như sau:Làm thế nào để vector hóa phương trình?

Cost function for Softmax Regression with Weight Decay

Vấn đề tôi đang gặp đang cố gắng để con số ra một cách để vectorize này. Một lần nữa tôi suy nghĩ Tôi hiểu làm thế nào để đi về vectorizing phương trình như thế này kể từ khi tôi đã có thể làm điều đó cho hồi quy tuyến tính và hậu cần, nhưng sau khi nhìn vào công thức mà tôi đang mắc kẹt.

Trong khi tôi muốn tìm ra giải pháp vectorized cho điều này (tôi nhận ra có một câu hỏi tương tự đã đăng: Vectorized Implementation of Softmax Regression), điều tôi quan tâm hơn là liệu bạn có thể cho tôi biết cách nào không (theo cách của bạn) để có phương pháp chuyển đổi các phương trình như thế này thành các biểu mẫu được vector hóa. Ví dụ, đối với những người bạn là chuyên gia hoặc cựu chiến binh dày dạn trong ML, khi bạn đọc các thuật toán mới trong tài liệu lần đầu tiên và xem chúng được viết theo ký hiệu tương tự với phương trình ở trên, bạn chuyển đổi chúng thành dạng vector hóa?

Tôi nhận ra rằng tôi có thể sẽ trở nên giống như học sinh đang yêu cầu Mozart, "Bạn chơi piano tốt như thế nào?" Nhưng câu hỏi của tôi chỉ đơn giản là được thúc đẩy từ mong muốn trở nên tốt hơn trong tài liệu này, và giả định rằng không phải ai cũng được sinh ra biết cách vector hóa phương trình, và vì vậy ai đó ngoài kia phải nghĩ ra hệ thống của riêng họ, và nếu có, hãy chia sẻ! Rất cám ơn trước!

Chúc mừng

+0

bạn có thể cung cấp một liên kết đến bài thuyết trình về GLM? – justis

+1

Được phép của lớp ML của Giáo sư Andrew Ng tại Stanford: http://cs229.stanford.edu/materials.html - tài liệu GLM và Softmax Regression được tìm thấy ở cuối Bài giảng 1 – oort

Trả lời

1

Điều này có vẻ khá khó để vector hóa vì bạn đang thực hiện hàm mũ trong tổng kết của bạn. Tôi cho rằng bạn đang nâng cao quyền lực tùy ý. Những gì bạn có thể vector hóa là thuật ngữ thứ hai của biểu thức \ sum \ sum theta^2 chỉ cần đảm bảo sử dụng. * Toán tử trong MATLAB enter link description here tới máy tính \ theta^2

Tương tự với các điều kiện bên trong của tỷ lệ của mà đi vào logarit. \ theta 'x^(i) là biểu thức vector.

Bạn cũng có thể hưởng lợi từ kỹ thuật ghi nhớ hoặc lập trình động và cố gắng sử dụng lại kết quả tính toán e^\ theta 'x^(i).

Nói chung theo kinh nghiệm của tôi, cách để vectơ hóa đầu tiên là không thực hiện được việc thực hiện phi véc tơ. Sau đó, cố gắng vector hóa các phần rõ ràng nhất của tính toán của bạn. Ở mỗi bước, tinh chỉnh chức năng của bạn rất ít và luôn kiểm tra xem bạn có nhận được kết quả tương tự như tính toán không vector. Ngoài ra, có nhiều trường hợp thử nghiệm là rất hữu ích.

2

Các tập tin giúp đỡ đi kèm với Octave có cụm từ này:

19,1 Basic bản vẽ Gia

Để một xấp xỉ đầu tiên rất tốt, mục tiêu trong vector là viết mã mà tránh các vòng lặp và sử dụng toàn bộ mảng hoạt động.Như một ví dụ tầm thường , hãy xem xét

for i = 1:n 
    for j = 1:m 
    c(i,j) = a(i,j) + b(i,j); 
    endfor 
endfor 

so với đơn giản hơn nhiều

c = a + b; 

này không chỉ đơn thuần là dễ dàng hơn để viết; nó cũng dễ dàng hơn trong việc tối ưu hóa nội bộ. Octave ủy nhiệm hoạt động này cho việc triển khai thực hiện cơ bản, trong số các tối ưu hóa khác, có thể sử dụng các hướng dẫn phần cứng đặc biệt hoặc thậm chí có thể thực hiện được các bổ sung trong số song song. Nói chung, nếu mã được vectorized, việc thực hiện cơ bản có nhiều tự do hơn về các giả định mà nó có thể thực hiện theo thứ tự để đạt được thực thi nhanh hơn.

Điều này đặc biệt quan trọng đối với các vòng có thân hình "rẻ". Thường thì nó đủ để vectorize chỉ là vòng lặp trong cùng để có được hiệu suất được chấp nhận. Nguyên tắc chung là "thứ tự" của cơ thể được vectorized phải lớn hơn hoặc bằng "thứ tự" của vòng lặp kèm theo .

Như một ví dụ ít tầm thường, thay vì

for i = 1:n-1 
    a(i) = b(i+1) - b(i); 
endfor 

ghi

a = b(2:n) - b(1:n-1); 

Điều này cho thấy một khái niệm chung quan trọng về việc sử dụng mảng cho lập chỉ mục thay vì lặp qua một biến chỉ số.  Biểu thức chỉ mục. Cũng sử dụng lập chỉ mục boolean một cách hào phóng. Nếu điều kiện cần được kiểm tra, điều kiện này cũng có thể được viết dưới dạng chỉ số boolean . Ví dụ, thay vì

for i = 1:n 
    if (a(i) > 5) 
    a(i) -= 20 
    endif 
endfor 

ghi

a(a>5) -= 20; 

mà khai thác thực tế là 'a> 5' tạo ra một chỉ số boolean.

Sử dụng toán tử vector nguyên tử bất cứ khi nào có thể để tránh vòng lặp (các toán tử như '. *' Và '. ^').  Số học Ops. Đối với các hàm nội tuyến đơn giản , chức năng 'vectơ hóa' có thể thực hiện điều này tự động.

- Chức năng tích hợp: vectorize (FUN) Tạo phiên bản vectơ của hàm inline FUN bằng cách thay thế tất cả các lần xuất hiện '', '/', v.v. với '. '' ./', vv

This may be useful, for example, when using inline functions with 
numerical integration or optimization where a vector-valued 
function is expected. 

     fcn = vectorize (inline ("x^2 - 1")) 
     => fcn = f(x) = x.^2 - 1 
     quadv (fcn, 0, 3) 
     => 6 

See also:  inline,  formula, 
 argnames. 

Cũng khai thác phát sóng trong các nhà khai thác elementwise cả tránh lặp và cấp phát bộ nhớ trung gian không cần thiết.
 Phát sóng.

Sử dụng chức năng tích hợp sẵn và thư viện nếu có thể. Tích hợp sẵn và chức năng biên dịch rất nhanh. Ngay cả với chức năng thư viện m-file, cơ hội tốt là nó đã được tối ưu hóa hoặc sẽ được tối ưu hóa thêm trong bản phát hành trong tương lai.

Ví dụ, thậm chí tốt hơn so với

a = b(2:n) - b(1:n-1); 

a = diff (b); 

Hầu hết Octave chức năng được viết với lập luận vector và mảng trong tâm. Nếu bạn thấy mình viết một vòng lặp với một thao tác rất đơn giản, cơ hội là một hàm như vậy đã tồn tại. Các chức năng sau xảy ra thường xuyên trong mã vectorized:

  • Index thao tác

    * find 
    
    * sub2ind 
    
    * ind2sub 
    
    * sort 
    
    * unique 
    
    * lookup 
    
    * ifelse/merge 
    
  • Lặp

    * repmat 
    
    * repelems 
    
  • vectorized số học

    * sum 
    
    * prod 
    
    * cumsum 
    
    * cumprod 
    
    * sumsq 
    
    * diff 
    
    * dot 
    
    * cummax 
    
    * cummin 
    
  • Shape của mảng nhiều chiều hơn

    * reshape 
    
    * resize 
    
    * permute 
    
    * squeeze 
    
    * deal 
    

Ngoài ra nhìn vào những trang này khỏi một wiki Stanford ML cho một số hướng dẫn hơn với các ví dụ.

http://ufldl.stanford.edu/wiki/index.php/Vectorization

http://ufldl.stanford.edu/wiki/index.php/Logistic_Regression_Vectorization_Example

http://ufldl.stanford.edu/wiki/index.php/Neural_Network_Vectorization

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