Làm cách nào để chuyển đổi đầu vào và trích xuất các đầu ra hữu ích trong Mạng thần kinh?


9

Vì vậy, tôi đã cố gắng tìm hiểu các mạng lưới thần kinh kể từ khi tôi bắt gặp blog của Adam Geitgey về học máy. Tôi đã đọc nhiều nhất có thể về chủ đề này (mà tôi có thể nắm bắt được) và tin rằng tôi hiểu tất cả các khái niệm rộng và một số hoạt động (mặc dù rất yếu về toán học), tế bào thần kinh, khớp thần kinh, trọng số, chức năng chi phí, truyền bá vv Tuy nhiên, tôi đã không thể tìm ra cách dịch các vấn đề trong thế giới thực thành một giải pháp mạng thần kinh.

Trường hợp cụ thể, Adam Geitgey đưa ra như một ví dụ sử dụng, một hệ thống dự đoán giá nhà trong đó được cung cấp một bộ dữ liệu có chứa Số phòng ngủ , Sq. feet , Vùng lân cậngiá bán bạn có thể đào tạo một mạng lưới thần kinh để có thể dự đoán giá của một ngôi nhà. Tuy nhiên, ông dừng việc thực hiện một giải pháp khả thi trong mã. Ví dụ gần nhất anh ta có được là một chức năng cơ bản thể hiện cách bạn thực hiện các trọng số:

def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
  price = 0

  # a little pinch of this
  price += num_of_bedrooms * 1.0

  # and a big pinch of that
  price += sqft * 1.0

  # maybe a handful of this
  price += neighborhood * 1.0

  # and finally, just a little extra salt for good measure
  price += 1.0

  return price 

Các tài nguyên khác dường như tập trung nhiều hơn vào toán học và ví dụ mã cơ bản duy nhất tôi có thể thấy rằng tôi hiểu (nghĩa là không phải tất cả ca hát, tất cả các cơ sở phân loại hình ảnh nhảy múa) là một triển khai đào tạo một mạng lưới thần kinh để trở thành một XOR cổng chỉ giao dịch trong 1 và 0.

Vì vậy, có một lỗ hổng trong kiến ​​thức của tôi mà tôi dường như không thể thu hẹp. Nếu chúng ta quay trở lại vấn đề dự đoán giá nhà , có phải ai cũng làm cho dữ liệu phù hợp để đưa vào mạng lưới thần kinh không? Ví dụ:

  • Số phòng ngủ: 3
  • Sq. chân: 2000
  • Khu phố: Khu phố bình thường
  • Giá bán: 250.000 USD

Bạn có thể chỉ cần cung cấp 32000 trực tiếp vào mạng thần kinh vì chúng là số? Hay bạn cần phải biến đổi chúng thành một cái gì đó khác? Tương tự như vậy về giá trị của Normaltown , đó là một chuỗi, làm thế nào để bạn dịch nó thành một giá trị mà mạng lưới thần kinh có thể hiểu được? Bạn có thể chọn một số, như một chỉ mục, miễn là nó nhất quán trong toàn bộ dữ liệu?

Hầu hết các ví dụ về mạng thần kinh mà tôi đã thấy các số chuyển qua giữa các lớp là 0 đến 1 hoặc -1 đến 1. Vì vậy, khi kết thúc quá trình xử lý, làm thế nào để bạn chuyển đổi giá trị đầu ra thành thứ gì đó có thể sử dụng được như $ 185.000 ?

Tôi biết ví dụ dự đoán giá nhà có lẽ không phải là một vấn đề đặc biệt hữu ích vì nó đã được áp dụng ồ ạt chỉ với ba điểm dữ liệu. Nhưng tôi chỉ cảm thấy rằng nếu tôi có thể vượt qua rào cản này và viết một ứng dụng cực kỳ cơ bản, đào tạo bằng cách sử dụng dữ liệu thực tế giả và đưa ra một câu trả lời giả thực hơn là tôi đã phá vỡ mặt sau của nó và có thể đá trên và đi sâu vào học máy.

Câu trả lời:


10

Đây là một câu hỏi hay mà tôi tự vật lộn khi lần đầu tiên thử viết mã ANN.

Dưới đây là một giải pháp cho mục đích chung tốt và đó là giải pháp tôi đã triển khai trong mã của mình để cố gắng dự đoán dữ liệu số được xử lý tốt. Nếu dữ liệu của bạn không được xử lý tốt (nghĩa là có nhiều ngoại lệ) thì bạn có thể cần phải thực hiện nhiều công việc hơn để bình thường hóa đầu vào và đầu ra. Một số phương pháp nâng cao hơn được mô tả ở đây .

Lưu ý: Tôi sẽ giả sử rằng bạn đang sử dụng f (x) = tanh (x) làm chức năng kích hoạt. Nếu bạn không, bạn vẫn có thể suy luận về cách bình thường hóa dữ liệu của mình sau khi đọc nó.

Cách chuẩn bị dữ liệu đầu vào:

Ý tưởng cơ bản là bạn muốn một biến thể đáng kể trong từng tham số đầu vào được phản ánh bằng một biến thể đáng kể trong việc kích hoạt nơ-ron mà các đầu vào đang được đưa vào. Bằng cách xem xét một biểu đồ đạo hàm của hàm hành động tanh (x), bạn sẽ thấy rằng khu vực có độ dốc đáng kể nằm trong khoảng cách một hoặc hai so với điểm gốc. Điều này có nghĩa là cho dù đầu vào của chức năng kích hoạt là 2000 hay 3000 (giá trị của x mà đạo hàm nhỏ không đáng kể), thì đầu ra của kích hoạt sẽ gần như giống nhau ... vì vậy trạng thái nơ ron của bạn sẽ không phụ thuộc vào sự khác biệt giữa 2000 và 3000, và mạng của bạn sẽ không bao giờ tạo ra bất kỳ sức mạnh dự đoán nào từ các giá trị trong phạm vi đó.

Vì vậy, nếu bạn muốn nhập cảnh vuông của ngôi nhà vào nơ ron, bạn cần bình thường hóa cảnh vuông để mạng có thể phân biệt sự khác biệt giữa năm 2000 và 3000. Một cách để làm điều này sao cho tất cả các biến thể quan trọng trong bạn dữ liệu được 'chú ý' bởi nơ-ron là để z-points-bình thường hóa các đầu vào .

  • Tập hợp tất cả các giá trị cảnh vuông của bạn (từ tập huấn luyện của bạn) và tính độ lệch trung bình và độ lệch chuẩn. Lưu trữ độ lệch trung bình và độ lệch chuẩn --- bạn sẽ cần thông tin này để bình thường hóa các giá trị cảnh vuông mới khi thử nghiệm.

  • Bình thường hóa vectơ của các giá trị cảnh vuông bằng cách trừ giá trị trung bình và sau đó chia kết quả cho độ lệch chuẩn (tất nhiên tất cả các yếu tố hoạt động là khôn ngoan). Trừ trung bình trung bình dữ liệu của bạn ở điểm gốc và chia cho độ lệch chuẩn đảm bảo phần lớn nằm trong khoảng -1 đến 1, trong đó đầu ra của nơ ron nhạy nhất với đầu vào của nó. Điều này được gọi là chuẩn hóa điểm z vì mỗi giá trị đầu vào được thay thế bằng điểm z của nó .

  • Làm như trên cho mỗi biến đầu vào.

Bây giờ, khi bạn đặt từng giá trị đầu vào thông qua một nơ-ron, đầu ra của nơ-ron là một kích hoạt giữa -1 và 1 (nhìn vào hình ảnh của tanh (x)). Vì chức năng này đã nằm trong phạm vi 'nhạy cảm' của chức năng kích hoạt, bạn không cần lo lắng về việc thay đổi đầu ra của các nơ-ron lớp đầu vào trước khi gửi chúng đến lớp ẩn đầu tiên. Chỉ cần cung cấp cho bất kỳ tế bào thần kinh lớp ẩn nào đầu ra của lớp trước trực tiếp --- họ sẽ có thể xử lý chúng tốt.

Khi bạn đạt đến lớp cuối cùng (nơ ron đầu ra), những gì bạn nhận được lại là một lần kích hoạt khác giữa -1 và 1. Bạn phải chuyển đổi lại thành giá trị cho ngôi nhà đang được đề cập , liệu giá trị đó sẽ được sử dụng như một dự đoán trong một bộ kiểm tra hoặc để tính toán lỗi trong quá trình đào tạo. Tuy nhiên, bạn làm điều này, bạn chỉ cần nhất quán và sử dụng cùng một quy trình khử chuẩn hóa trong đào tạo và thử nghiệm. Một cách để nghĩ về nó là: khi (các) nơ ron đầu ra trả về 1, điều đó có nghĩa là mạng đang trả về giá trị nhà tối đa có thể như dự đoán của nó. Giá trị cao nhất mà mạng có thể ước tính là gì? Cách tiếp cận đúng ở đây chỉ đơn giản phụ thuộc vào ứng dụng của bạn. Đây là những gì tôi đã làm:

  • Tính giá trị trung bình của biến đầu ra [the / every] và lưu trữ nó.
  • Tính độ lệch tối đa của biến đầu ra so với giá trị trung bình. Con trănMaxDev = max([abs(DataPoint-numpy.mean(TrainingData)) for DataPoint in TrainingData])
  • Khi mạng trả về (các) đầu ra giữa -1 và 1, nhân số đầu ra với MaxDevvà thêm nó vào giá trị trung bình.

Hai kiểm tra nhanh cơ bản bạn có thể làm để xem chương trình chuẩn hóa-tái chuẩn hóa của bạn có phù hợp không (những điều này là cần thiết, nhưng có lẽ không đủ điều kiện):

  1. Nếu tất cả các giá trị đầu vào là trung bình (ví dụ: trung bình số phòng ngủ, sq.feet trung bình, v.v.), thì đầu ra của mạng có bằng trung bình của biến đầu ra (ví dụ: giá trị nhà) không? (Nó nên như vậy.)
  2. Nếu tất cả các giá trị đầu vào đều cao / thấp bất thường, thì đầu ra của mạng có cao / thấp bất thường không? (Điều này chỉ hoạt động nếu tất cả các đầu vào có liên quan tích cực đến đầu ra ... nếu một số trong số chúng có liên quan nghịch đảo, bạn sẽ phải suy nghĩ thêm một chút).

Quan sát rằng sơ đồ trình bày ở đây thỏa mãn hai điều kiện này.

Lưu ý rằng sơ đồ này sẽ cho phép mạng của bạn chỉ dự đoán các giá trị nhà bên trong phạm vi giá trị nhà trong bộ dữ liệu đào tạo của bạn. Tùy thuộc vào ứng dụng, hành vi này có thể được mong muốn hoặc không mong muốn.

Ví dụ: bạn có thể muốn mạng của mình không thể dự đoán giá trị nhà âm. Hãy suy nghĩ về cách bạn sẽ làm điều này. Không chuẩn hóa đầu ra sao cho -1 được ánh xạ thành 0.

Nếu bạn muốn đặt không giới hạn cho các giá trị mà mạng của bạn có thể dự đoán, thì bạn có thể chạy đầu ra của mạng thông qua chức năng ánh xạ phạm vi [-1,1] cho tất cả các số thực ... như arctanh (x)! Miễn là bạn làm điều này trong quá trình đào tạo, mạng của bạn sẽ điều chỉnh trọng lượng của nó để phù hợp với điều này.

Tôi hy vọng nó sẽ có ích. Hãy cho tôi biết nếu bạn có thêm câu hỏi. Nhân tiện, mô-đun ANN của tôi là bằng Python, vì vậy tôi có thể có lời khuyên cụ thể về ngôn ngữ.


Điều này rất hữu ích! Mỗi blog / hướng dẫn tôi đi qua dường như tránh (gần như có chủ ý) mô tả quá trình này, nhưng vâng tất cả đều có ý nghĩa. Sẽ mất một lúc để tôi tiêu hóa đúng cách nhưng tôi sẽ quay lại nếu tôi có bất kỳ câu hỏi tiếp theo nào. Nhiều nghĩa vụ!
David

Vì vậy, vài câu hỏi. Nếu Sq của tôi. Dữ liệu huấn luyện chân là {2000, 800, 850, 550, 2000} thì đầu vào điểm z của tôi cho {1900, 1500, 600} sẽ là (nếu tôi đã tính toán chính xác) {1.0496, 0.4134, -1.0177}. Vì vậy, một trong những giá trị đó là> 1 và một là <-1, tôi sẽ làm gì với những giá trị đó? Nhập chúng vào các nút lớp đầu vào bất kể hoặc làm tròn chúng thành 1 & -1? Tại sao 1900 & 600 tạo ra các giá trị đó khi chúng nằm trong phạm vi 550 - 2000? Đây có phải chỉ là một mẹo của dữ liệu vì có một tập dữ liệu nhỏ như vậy?
David

0andthemaximum

Hãy nhớ rằng các đầu vào không cần phải nằm trong khoảng từ 1 đến -1. Tất cả những gì bạn cần cho đầu vào là hầu hết dữ liệu nằm trong phạm vi đó. Giá trị lớn hơn hoặc nhỏ hơn một nghĩa là điểm đó lớn hơn một độ lệch chuẩn so với giá trị trung bình, do đó điểm đó gần với điểm cao hơn của dữ liệu. Sẽ là một chút hiếm khi dữ liệu của bạn đi ra ngoài [-1, 1], thậm chí hiếm hơn khi nó nằm ngoài [-2, 2] và cực kỳ hiếm khi đi ra ngoài [-3, 3]. Nhìn vào tanh (x) và bạn sẽ thấy phạm vi nhạy cảm không chỉ nằm trong khoảng từ -1 đến 1, mà còn đi xa hơn một chút.
Marko Bakić

Về việc không chuẩn hóa đầu ra, sự không chuẩn hóa tối thiểu đó là những gì tôi đã làm trong quá trình thực hiện và cách giải thích của bạn là chính xác, nhưng bạn không nhất thiết phải làm điều đó. Bạn có thể làm cho nó sao cho 1 tương ứng với hai lần giá trị nhà tối đa - theo cách đó, mạng của bạn sẽ có thể dự đoán giá trị nhà ở trên mức bạn đã đào tạo.
Marko Bakić
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.