Khi nghe mọi người nói về việc học máy, bạn có biết một số ý nghĩa mơ hồ về nó không? Bạn có mệt mỏi với việc chỉ nhấp nháy khi nói chuyện với đồng nghiệp không? Hãy thay đổi nó!
Hướng dẫn này dành cho tất cả những người có hứng thú với máy học nhưng không biết làm thế nào để bắt đầu. Tôi đoán nhiều người đã đọc các từ Wikipedia về máy học và cảm thấy thất vọng vì không ai có thể đưa ra một lời giải thích cấp cao. Bài viết này là những gì bạn muốn.
Mục tiêu của bài viết này là dễ tiếp cận, điều này có nghĩa là có rất nhiều khái quát. Nhưng ai quan tâm đến điều đó?
Khái niệm học máy cho rằng bạn không cần phải viết bất kỳ mã chương trình đặc biệt nào cho các vấn đề đang chờ giải quyết, các thuật toán chung có thể đưa ra những câu trả lời thú vị cho bạn trên tập dữ liệu. Đối với thuật toán di truyền, không cần mã hóa, mà nhập dữ liệu, nó sẽ xây dựng logic của riêng nó trên dữ liệu.
Ví dụ, một loại thuật toán được gọi là thuật toán phân loại, nó có thể phân loại dữ liệu thành các nhóm khác nhau. Một thuật toán phân loại được sử dụng để nhận ra số chữ viết tay, mà không cần sửa đổi một dòng mã, có thể được sử dụng để phân loại email thành thư rác và thư thông thường.
Các thuật toán học máy là một hộp đen có thể được sử dụng để giải quyết nhiều vấn đề phân loại khác nhau.
Kích thước của máy học là một thuật ngữ bao trùm, bao gồm rất nhiều thuật toán di truyền tương tự.
Bạn có thể nghĩ rằng các thuật toán học máy được chia thành hai loại: học tập được giám sát và học tập không được giám sát. Sự khác biệt giữa hai loại này rất đơn giản nhưng rất quan trọng.
Giả sử bạn là một nhà môi giới bất động sản, doanh nghiệp của bạn càng lớn, vì vậy bạn thuê một nhóm thực tập sinh để giúp bạn. Nhưng vấn đề là bạn có thể biết giá trị của ngôi nhà ngay từ đầu, thực tập sinh không có kinh nghiệm và không biết cách định giá.
Để giúp đỡ học viên của bạn (có thể là để tự do cho mình một kỳ nghỉ), bạn quyết định viết một phần mềm nhỏ để đánh giá giá trị nhà ở khu vực của bạn dựa trên các yếu tố như kích thước nhà, địa điểm và giá bán nhà tương tự.
Bạn viết ra tất cả các giao dịch nhà ở trong thành phố trong 3 tháng qua, và trong mỗi giao dịch bạn ghi lại một loạt các chi tiết về số lượng phòng ngủ, kích thước nhà, địa điểm, v.v. Nhưng quan trọng nhất, bạn viết ra giá cuối cùng:
Đây là dữ liệu về huấn luyện nấu nướng của chúng tôi.
Chúng tôi sẽ sử dụng dữ liệu đào tạo này để viết một chương trình để ước tính giá trị của các ngôi nhà khác trong khu vực:
Điều này được gọi là học tập theo dõi. Bạn đã biết giá bán của mỗi ngôi nhà, nói cách khác, bạn biết câu trả lời cho câu hỏi và có thể tìm ra logic để giải quyết vấn đề.
Để viết phần mềm, bạn sẽ nhập dữ liệu đào tạo của mỗi bộ tài sản vào thuật toán học máy của bạn.
Điều này giống như một bài tập toán học, và tất cả các ký hiệu toán trong phép tính đã bị xóa:
Chúa ơi! Một học sinh đáng sợ đã xóa hết các ký hiệu toán học trên câu trả lời của giáo viên.
Sau khi xem các câu hỏi này, bạn có thể hiểu được những vấn đề toán học trong các bài kiểm tra này là gì không? Bạn biết rằng bạn nên làm gì với các đường số ở bên trái của phép thuật để có được các câu trả lời ở bên phải của phép thuật.
Trong học tập theo dõi, bạn cho máy tính tính toán các mối quan hệ giữa các số cho bạn. Và một khi bạn biết phương pháp toán học cần thiết để giải quyết những vấn đề cụ thể như vậy, bạn có thể giải quyết các vấn đề khác giống như vậy.
Hãy quay lại ví dụ của nhà môi giới bất động sản ở đầu. Nếu bạn không biết giá bán của mỗi ngôi nhà là bao nhiêu? Ngay cả khi bạn chỉ biết kích thước của ngôi nhà, vị trí của nó, bạn cũng có thể tạo ra những hình ảnh tuyệt vời. Đây là cái gọi là học tập không giám sát.
Ngay cả khi bạn không muốn dự đoán dữ liệu chưa biết (ví dụ như giá), bạn cũng có thể sử dụng máy học để làm một cái gì đó thú vị.
Nó giống như một người đưa cho bạn một tờ giấy với một loạt các con số và nói với bạn: "Ôi, tôi không biết những con số này có nghĩa là gì, và có lẽ bạn có thể tìm ra các quy luật hoặc phân loại chúng, hoặc bất cứ điều gì khác - chúc bạn may mắn!"
Đầu tiên, bạn có thể tự động phân loại các phân khúc thị trường khác nhau từ dữ liệu. Có lẽ bạn sẽ thấy người mua nhà gần trường đại học thích những ngôi nhà nhỏ nhưng nhiều phòng ngủ, trong khi người mua nhà ở vùng ngoại ô thích những ngôi nhà lớn ba phòng ngủ. Thông tin này có thể trực tiếp giúp tiếp thị của bạn.
Bạn cũng có thể làm một điều tuyệt vời, tự động tìm ra các dữ liệu khác biệt về giá nhà, nghĩa là giá trị khác biệt với các dữ liệu khác.
Trong phần còn lại của bài viết, chúng ta sẽ chủ yếu thảo luận về học tập theo cách giám sát, nhưng không phải vì học tập không theo cách giám sát là vô dụng hoặc vô dụng. Trên thực tế, việc học tập không theo cách giám sát đang trở nên quan trọng hơn khi các thuật toán được cải thiện, không cần phải liên kết dữ liệu với câu trả lời đúng.
Bạn có thể tìm hiểu thêm về các loại thuật toán học máy khác.
Thật tuyệt, nhưng liệu đánh giá giá nhà có thực sự được coi là một cách học hỏi hay không?
Là một con người, bộ não của bạn có thể xử lý hầu hết các tình huống và không có bất kỳ hướng dẫn rõ ràng nào để học cách xử lý các tình huống này. Nếu bạn là một nhà môi giới bất động sản trong một thời gian dài, bạn sẽ có một cảm giác ngây thơ về giá trị phù hợp của bất động sản, cách tiếp thị tốt nhất của nó và khách hàng nào sẽ quan tâm, v.v.
Tuy nhiên, các thuật toán học máy hiện tại chưa đủ tốt để chỉ tập trung vào những vấn đề rất cụ thể, hạn chế. Có lẽ trong trường hợp này, một định nghĩa thích hợp hơn của thuật toán học máy là tìm ra một phương trình để giải quyết một vấn đề cụ thể dựa trên một số lượng nhỏ dữ liệu mẫu.
Thật không may, máy đánh giá tìm ra một phương trình để giải quyết một vấn đề cụ thể dựa trên một số lượng nhỏ dữ liệu ví dụ.
Tất nhiên, nếu bạn đọc bài viết này sau 50 năm, thì chúng ta đã đưa ra một thuật toán AI mạnh mẽ, và bài viết này trông giống như một cổ điển cũ.
Chúng ta hãy viết mã!
Trong ví dụ trước đây, bạn sẽ viết cách đánh giá giá nhà ở như thế nào?
Nếu bạn không biết gì về máy học, rất có thể bạn sẽ cố gắng viết một số quy tắc cơ bản để đánh giá giá nhà, như sau:
def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
price = 0
# In my area, the average house costs $200 per sqft
price_per_sqft = 200
if neighborhood == "hipsterton":
# but some areas cost a bit more
price_per_sqft = 400
elif neighborhood == "skid row":
# and some areas cost less
price_per_sqft = 100
# start with a base price estimate based on how big the place is
price = price_per_sqft * sqft
# now adjust our estimate based on the number of bedrooms
if num_of_bedrooms == 0:
# Studio apartments are cheap
price = price — 20000
else:
# places with more bedrooms are usually
# more valuable
price = price + (num_of_bedrooms * 1000)
return price
Nếu bạn bận rộn như vậy trong vài giờ, có lẽ bạn sẽ đạt được một chút hiệu quả, nhưng chương trình của bạn sẽ không bao giờ hoàn hảo và rất khó để duy trì khi giá cả thay đổi.
Nếu máy tính có thể tìm ra cách thực hiện các chức năng trên, thì không tốt hơn sao?
def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
price = <computer, plz do some math for me>
return price
Một cách xem xét vấn đề này là xem giá nhà như một bát nướng ngon, trong đó các thành phần trong nướng là số lượng phòng ngủ, diện tích và địa điểm. Nếu bạn có thể tính toán được mức độ ảnh hưởng của mỗi thành phần đối với giá cuối cùng, có lẽ bạn có thể kết hợp các thành phần để tạo thành một tỷ lệ cụ thể của giá cuối cùng.
Điều này có thể đơn giản hóa chương trình ban đầu của bạn (tất cả là câu nói if else điên rồ) thành một cái gì đó như sau:
def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
price = 0
# a little pinch of this
price += num_of_bedrooms * .841231951398213
# and a big pinch of that
price += sqft * 1231.1231231
# maybe a handful of this
price += neighborhood * 2.3242341421
# and finally, just a little extra salt for good measure
price += 201.23432095
return price
Hãy chú ý đến những con số kỳ diệu được đánh dấu bằng chữ mỏng.841231951398213, 1231.1231231, 2.3242341421, và 201.23432095;; chúng được gọi là trọng lượng. Nếu chúng ta có thể tìm ra trọng lượng hoàn hảo áp dụng cho mỗi ngôi nhà, hàm của chúng ta có thể dự đoán tất cả giá nhà!
Một cách để tìm ra trọng lượng tốt nhất là:
Bước 1:
Đầu tiên, đặt mỗi trọng số là 1.0:
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
Bước 2:
Đưa mỗi căn nhà vào các phép tính của bạn và kiểm tra mức độ sai lệch giữa giá trị ước tính và giá trị chính xác:
Sử dụng chương trình của bạn để dự đoán giá nhà.
Ví dụ: giá trị thực tế của bất động sản đầu tiên trong bảng trên là 250.000 đô la, giá trị giá trị hàm của bạn là 178.000 đô la, bạn thua 72.000 đô la.
Sau đó, hãy tính tổng số sau tính phương lệch giá trị giá trị giá trị giá trị của mỗi tập hợp tài sản trong tập hợp dữ liệu của bạn. Giả sử tập hợp dữ liệu có 500 giao dịch tài sản, tổng giá trị giá trị lệch giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị giá trị
Bây giờ, hãy chia tổng giá trị ra 500 để có được giá trị ước tính của mỗi căn nhà theo đường lệch trung bình. Hãy gọi giá trị sai lệch trung bình này là chi phí của hàm bạn.
Nếu bạn có thể điều chỉnh trọng lượng để giá này trở thành 0, hàm của bạn là hoàn hảo. Điều đó có nghĩa là, theo dữ liệu nhập, chương trình của bạn sẽ đánh giá một cách tương tự cho mỗi giao dịch bất động sản. Và đó là mục tiêu của chúng tôi.
Bước 3:
Hãy thử tất cả các sự kết hợp trọng lượng có thể. Cái kết hợp nào làm cho chi phí gần 0 nhất, đó là những gì bạn sẽ sử dụng, và khi bạn tìm thấy sự kết hợp đó, vấn đề sẽ được giải quyết!
Suy nghĩ làm gián đoạn thời gian
Điều này rất đơn giản, đúng không? Hãy nghĩ về những gì bạn vừa làm. Bạn lấy một số dữ liệu, nhập chúng vào ba bước đơn giản phổ biến, và cuối cùng bạn có một hàm có thể định giá cho ngôi nhà trong khu vực của bạn. Tuy nhiên, những điều sau đây có thể làm bạn bối rối:
1. Trong 40 năm qua, nhiều nghiên cứu trong nhiều lĩnh vực (như ngôn ngữ học / dịch thuật) đã chỉ ra rằng các thuật toán học theo kiểu dữ liệu dữ liệu rung động phổ biến (từ tôi tạo ra) đã vượt qua các phương pháp cần sử dụng các quy tắc rõ ràng của con người thực.
2.你最后写出的函数真是笨,它甚至不知道什么是“面积”和“卧室数”。它知道的只是搅动,改变数字来得到正确的答案。
3.很可能你都不知道为何一组特殊的权重值能起效。所以你只是写出了一个你实际上并不理解却能证明的函数。
4.试想一下,你的程序里没有类似“面积”和“卧室数”这样的参数,而是接受了一组数字。假设每个数字代表了你车顶安装的摄像头捕捉的画面中的一个像素,再将预测的输出不称为“价格”而是叫做“方向盘转动度数”,这样你就得到了一个程序可以自动操纵你的汽车了!
Thật điên rồ, phải không?
Và sau đó, bạn có thể thử các con số khác nhau, và bạn sẽ thấy những con số khác nhau.
Vâng, tất nhiên là bạn không thể thử tất cả các trọng lượng có thể để tìm ra kết hợp tốt nhất. Để tránh điều này, các nhà toán học đã tìm ra nhiều cách thông minh để nhanh chóng tìm ra các giá trị trọng lượng tốt mà không cần phải cố gắng nhiều. Sau đây là một trong số đó: Đầu tiên, hãy viết một phương trình đơn giản để biểu thị các bước 2:
Đây là hàm giá của bạn.
Sau đó, hãy viết lại thuật ngữ toán học máy học cùng phương trình này (bây giờ bạn có thể bỏ qua chúng):
θ cho giá trị trọng lượng hiện tại. J ((θ) cho giá trị trọng lượng hiện tại của phiền.
Phương trình này cho thấy mức độ sai lệch của phương pháp đánh giá của chúng tôi với giá trị trọng lượng hiện tại.
Nếu hiển thị tất cả các giá trị trọng lượng có thể cho số lượng và diện tích phòng ngủ dưới dạng đồ họa, chúng ta sẽ có một biểu đồ tương tự như hình dưới:
Biểu đồ của hàm giá giống như một cái bát.
Điểm thấp nhất trong biểu đồ màu xanh là nơi có chi phí thấp nhất. Điểm cao nhất có nghĩa là sự lệch nhỏ nhất của chương trình. Vì vậy, nếu chúng ta có thể tìm ra một tập các giá trị trọng lượng dẫn đến điểm thấp nhất trong biểu đồ, chúng ta đã tìm được câu trả lời!
Do đó, chúng ta chỉ cần điều chỉnh trọng lượng để có thể đi xuống xuống hướng điểm thấp nhất trên biểu đồ. Nếu điều chỉnh nhỏ về trọng lượng khiến chúng ta luôn di chuyển đến điểm thấp nhất, thì cuối cùng chúng ta có thể đến đó mà không cần cố gắng quá nhiều trọng lượng.
Nếu bạn còn nhớ một chút về toán học, bạn có thể nhớ rằng nếu bạn tìm kiếm một hàm, kết quả sẽ cho bạn biết độ nghiêng của hàm ở bất kỳ điểm nào. Nói cách khác, với một điểm trên biểu đồ, nó cho chúng ta biết con đường là đi xuống. Chúng ta có thể sử dụng nó để tiến về phía dưới.
Vì vậy, nếu chúng ta định hướng hàm giá đối với mỗi trọng lượng, thì chúng ta có thể trừ giá trị đó ra khỏi mỗi trọng lượng. Điều này sẽ đưa chúng ta đến gần đáy núi hơn.
Cách này để tìm ra trọng lượng tối ưu được gọi là giảm gradient khối lượng, và trên đó là tổng quát về độ cao của nó. Nếu bạn muốn hiểu chi tiết, đừng sợ, tiếp tục đi sâu hơn.http://hbfs.wordpress.com/2012/04/24/introduction-to-gradient-descent/(Vỗ tay)
Khi bạn sử dụng một bộ máy học thuật để giải quyết các vấn đề thực tế, tất cả những điều này đã sẵn sàng cho bạn.
Có gì khác mà bạn bỏ qua không?
Các thuật toán ba bước mà tôi đã mô tả ở trên được gọi là hồi quy đa tuyến. Bạn ước tính phương trình bằng cách tìm một đường thẳng có thể phù hợp với tất cả các điểm dữ liệu giá nhà. Sau đó, bạn sử dụng phương trình này để ước tính giá nhà chưa từng thấy dựa trên vị trí mà giá nhà có thể xuất hiện trên đường thẳng của bạn.
Tuy nhiên, phương pháp mà tôi đã cho bạn thấy có thể hiệu quả trong những trường hợp đơn giản, nhưng nó sẽ không hiệu quả trong tất cả các trường hợp. Một lý do là giá nhà sẽ không luôn đơn giản theo một đường thẳng liên tục.
Tuy nhiên, may mắn thay, có rất nhiều cách để xử lý tình huống này. Đối với dữ liệu phi tuyến tính, nhiều loại thuật toán học máy khác có thể xử lý (như mạng thần kinh hoặc máy vector hạt nhân).
Ngoài ra, tôi đã bỏ qua khái niệm quá phù hợp. Rất dễ gặp một tập các trọng số có thể dự đoán hoàn hảo về giá nhà trong bộ dữ liệu gốc của bạn, nhưng không thể dự đoán về bất kỳ ngôi nhà mới nào ngoài bộ dữ liệu gốc.
Nói cách khác, các khái niệm cơ bản rất đơn giản, cần một số kỹ năng và kinh nghiệm để có thể sử dụng máy học để có kết quả hữu ích. Tuy nhiên, đây là một kỹ năng mà mọi nhà phát triển đều có thể học.
Một khi bạn bắt đầu hiểu rằng kỹ thuật học máy dễ dàng được áp dụng để giải quyết những vấn đề có vẻ khó khăn (như nhận dạng chữ viết tay), bạn sẽ có cảm giác rằng nếu có đủ dữ liệu, bạn có thể sử dụng học máy để giải quyết bất kỳ vấn đề nào. Chỉ cần nhập dữ liệu, bạn sẽ thấy các phương trình phù hợp với dữ liệu sẽ được tìm ra giống như cách máy tính biến đổi.
Tuy nhiên, điều quan trọng cần nhớ là máy học chỉ áp dụng cho các vấn đề có thể thực sự được giải quyết bằng dữ liệu mà bạn có.
Ví dụ, nếu bạn xây dựng một mô hình để dự đoán giá nhà dựa trên số lượng cây trồng trong mỗi ngôi nhà, nó sẽ không bao giờ thành công. Không có mối quan hệ giữa số lượng cây trồng trong nhà và giá nhà. Vì vậy, dù nó cố gắng như thế nào, máy tính cũng không thể suy luận mối quan hệ giữa hai thứ.
Bạn chỉ có thể mô hình hóa những mối quan hệ thực sự tồn tại.
Tôi nghĩ rằng vấn đề lớn nhất với việc học máy hiện nay là nó chủ yếu hoạt động trong giới học thuật và các tổ chức nghiên cứu thương mại. Không có nhiều tài liệu học tập đơn giản và dễ hiểu cho những người ngoài vòng tròn muốn có một hiểu biết tổng quát hơn là muốn trở thành chuyên gia. Nhưng điều này đang được cải thiện mỗi ngày.
Giáo sư Andrew Ng cho rằng, chương trình học máy miễn phí trên Coursera là rất tốt. Tôi khuyên bạn nên bắt đầu từ đây. Bất cứ ai có bằng khoa học máy tính và có thể ghi nhớ một chút toán học cũng nên hiểu.
Ngoài ra, bạn cũng có thể tải xuống và cài đặt SciKit-Learn để thử nghiệm hàng ngàn thuật toán học máy. Nó là một khuôn khổ Python, có phiên bản hộp đen cho tất cả các thuật toán tiêu chuẩn.
Được chuyển từ Python developer
okluoquanĐây là một ví dụ mà giáo sư Phong Nhanh lặp lại mỗi khi bắt đầu một lớp học mới.
xe lửaVậy tại sao nó lại là 2m?