Có phải khi nghe mọi người nói về học máy, bạn chỉ có một vài ý tưởng mơ hồ về ý nghĩa của nó? Hay bạn đã mệt mỏi với việc chỉ cần gật đầu khi nói chuyện với đồng nghiệp? Hãy thay đổi!
Hướng dẫn này dành cho tất cả những ai muốn tìm hiểu về học máy nhưng không biết làm thế nào để bắt đầu. Tôi đoán rằng nhiều người đã đọc các từ Wikipedia về học máy và cảm thấy thất vọng vì không ai có thể đưa ra một 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 là dễ tiếp cận, có nghĩa là bài viết có rất nhiều khái quát. Nhưng ai quan tâm đến những điều này?
Khái niệm học máy cho rằng, bạn không cần viết bất kỳ mã chương trình chuyên dụng nào để giải quyết vấn đề, thuật toán di truyền ((generic algorithms) có thể đưa ra câu trả lời thú vị cho bạn trên bộ dữ liệu. Đối với thuật toán di truyền, không cần mã hóa, nhưng nhập dữ liệu, nó sẽ xây dựng logic của riêng nó trên dữ liệu.
Ví dụ, có một loại thuật toán gọi là thuật toán phân loại, nó có thể phân chia 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 có thể được sử dụng để phân chia email thành thư rác và thư thông thường mà không cần sửa đổi một dòng mã.

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.
Lớp học máy là một thuật ngữ bao quát bao gồm một số lượng lớn các thuật toán di truyền tương tự.
Bạn có thể coi các thuật toán học máy là hai loại: học có giám sát (supervised learning) và học không giám sát (unsupervised learning). 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, và doanh nghiệp của bạn lớn hơ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ể nhìn thấy một ngôi nhà và biết nó có giá bao nhiêu, và thực tập sinh không có kinh nghiệm, không biết cách đánh giá.
Để giúp đỡ thực tập sinh của bạn (và có lẽ để tự giải phóng cho mình đi nghỉ mát), bạn quyết định viết một phần mềm nhỏ để đánh giá giá trị của ngôi nhà trong khu vực của bạn dựa trên các yếu tố như kích thước, địa điểm và giá trị giao dịch của những ngôi nhà tương tự.
Bạn đã viết ra mọi giao dịch nhà ở trong thành phố trong 3 tháng, và mỗi lần bạn ghi lại một loạt các chi tiết như số lượng phòng ngủ, kích thước nhà, khu đất, v.v. Nhưng quan trọng nhất, bạn đã viết ra giá mua cuối cùng:
Đây là dữ liệu tập luyện 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 theo giám sát. Bạn đã biết giá bán của mỗi căn 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 giải pháp ngược lại.
Để 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.
Nó giống như một bài tập toán học, trong đó các ký hiệu đã bị xóa:

Ôi trời ơi! Một học sinh mưu đồ đã 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.
Bạn có biết bạn nên làm gì với các ô số ở bên trái của phép tính để có được câu trả lời ở bên phải của phép tính?
Trong học tập giám sát, bạn cho máy tính tính toán các mối quan hệ giữa các con số cho bạn. Và một khi bạn biết các phương pháp toán học cần thiết để giải quyết các vấn đề cụ thể như vậy, bạn có thể giải quyết các vấn đề tương tự khác.
Hãy quay lại với ví dụ của nhà môi giới bất động sản mà chúng ta đã nói ở đầu bài. Nếu bạn không biết giá bán của mỗi căn nhà, bạn có thể tạo ra những hình ảnh tuyệt vời ngay cả khi bạn chỉ biết kích thước, vị trí của căn nhà. Đây là cái gọi là học không giám sát.

Ngay cả khi bạn không muốn dự đoán những dữ liệu chưa biết (như giá cả), bạn cũng có thể sử dụng học máy để làm những điều thú vị.
Nó giống như một người đưa cho bạn một tờ giấy với rất nhiều con số trên đó, và nói với bạn: “Tôi không biết những con số này có ý nghĩa gì, nhưng có lẽ bạn có thể tìm ra một 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ể sử dụng một thuật toán để phân chia các phân khúc thị trường khác nhau một cách tự động từ dữ liệu. Bạn có thể thấy rằng người mua nhà ở gần trường đại học thích những ngôi nhà nhỏ nhưng có nhiều phòng ngủ, trong khi người mua nhà ở vùng ngoại ô thích những ngôi nhà lớn với ba phòng ngủ.
Bạn cũng có thể làm một điều rất thú vị, tự động tìm ra giá nhà ở những khu vực khác biệt với các khu vực khác. Những khu vực này có thể là những tòa nhà cao tầng, và bạn có thể tập trung những người bán hàng giỏi nhất ở những khu vực này vì họ có hoa hồng cao hơn.
Trong phần tiếp theo của bài viết, chúng tôi sẽ chủ yếu nói về học tập giám sát, nhưng điều đó không có nghĩa là học tập không giám sát không hữu ích hoặc vô ích. Thực tế, học tập không giám sát đang ngày càng trở nên quan trọng hơn khi các thuật toán được cải tiến và không cần liên kết dữ liệu với câu trả lời đúng.
Có rất nhiều loại thuật toán học máy khác. Nhưng nó là một cách hiểu tốt cho người mới bắt đầu.
Nhưng liệu việc đánh giá giá nhà có thực sự là một bài học không?
Là một phần của con người, bộ não của bạn có thể đối phó với hầu hết các tình huống và có thể học cách xử lý chúng mà không có bất kỳ hướng dẫn rõ ràng nào. Nếu bạn làm 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 thấu hiểu bản năng về giá nhà phù hợp, cách tiếp thị tốt nhất và khách hàng nào sẽ quan tâm. Mục tiêu của nghiên cứu trí tuệ nhân tạo mạnh là có thể sao chép khả năng này bằng máy tính.
Nhưng các thuật toán học máy hiện tại vẫn chưa tốt đến mức chỉ tập trung vào một số vấn đề rất cụ thể và hạn chế. Trong trường hợp này, có lẽ một định nghĩa thích hợp hơn của một con mồi 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ột máy học nén đã 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 lượng nhỏ dữ liệu mẫu.
Tất nhiên, nếu bạn đọc bài viết này sau 50 năm, chúng ta đã có một thuật toán trí tuệ nhân tạo mạnh mẽ, và bài viết này có vẻ như là một cổ vật cũ.
Hãy viết mã!
Trong ví dụ trước đây, bạn sẽ viết về một chương trình đánh giá giá nhà như thế nào?
Nếu bạn không biết gì về học máy, rất có thể bạn sẽ cố gắng viết ra 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
Có thể bạn sẽ đạt được một chút hiệu quả nếu bạn làm việc vội vã như thế này trong vài giờ, 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á 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ì điều đó sẽ tốt hơn nhiều.
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 chiếc chảo ngon, trong đó các thành phần là số lượng phòng ngủ, diện tích và khu vực. Nếu bạn có thể tính toán xem mỗi thành phần ảnh hưởng đến giá cuối cùng như thế nào, có lẽ bạn sẽ có thể kết hợp các thành phần để tạo ra một tỷ lệ cụ thể của giá cuối cùng.
Điều này có thể làm cho chương trình ban đầu của bạn (hết thảy là những câu if else điên rồ) trở nên đơn giản hơn 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 in đậm là 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à, thì hàm của chúng ta có thể dự đoán tất cả giá nhà!
Một trong những cách để tìm ra trọng lượng tốt nhất là:
Bước 1:
Đầu tiên, hãy đặt trọng số cho mỗi phần 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:
Hãy đưa mỗi căn nhà vào hàm của bạn để kiểm tra xem giá trị ước tính có sai lệch với giá đúng hay không:

Sử dụng chương trình của bạn để dự đoán giá nhà.
Ví dụ: giá trị giao dịch thực tế của căn nhà đầu tiên trong bảng trên là 250.000 đô la, và hàm của bạn ước tính là 178.000 đô la, bạn mất 72.000 đô la cho căn nhà này.
Sau đó, tính giá trị của mỗi tài sản trong tập dữ liệu của bạn theo giá trị lệch bình phương. Giả sử tập dữ liệu có 500 giao dịch bất động sản, tổng giá trị lệch bình phương là $86,123,373. Điều này phản ánh mức độ chính xác của hàm của bạn hiện tại.
Bây giờ, hãy chia tổng số bằng 500, và bạn sẽ có giá trị ước tính của mỗi căn nhà khác với giá trị trung bình. Hãy gọi giá trị sai lệch trung bình này là giá trị của hàm của bạn.
Nếu bạn có thể điều chỉnh trọng số để giá thành trở thành 0, thì hàm của bạn đã hoàn hảo. Điều đó có nghĩa là chương trình của bạn đã ước tính mỗi giao dịch bất động sản một cách chính xác dựa trên dữ liệu nhập. Và đó là mục tiêu của chúng tôi khi thử các trọng số khác nhau để giá thành càng thấp càng tốt.
Bước 3:
Lặp lại bước 2 liên tục, thử tất cả các kết hợp trọng số có thể. Bạn chỉ cần chọn kết hợp nào làm cho chi phí gần với 0 nhất, và khi bạn đã tìm ra kết hợp đó, vấn đề đã được giải quyết!
Suy nghĩ làm gián đoạn thời gian
Hãy nghĩ về những gì bạn vừa làm. Bạn lấy được một số dữ liệu, nhập chúng vào ba bước đơn giản, và cuối cùng bạn có một hàm để định giá nhà ở khu vực của bạn. Nhưng những sự thật sau đây có thể làm bạn bối rối:
Giả sử rằng chương trình của bạn không có các tham số như số lượng phòng ngủ và số lượng phòng ngủ, nhưng chấp nhận một tập hợp các con số. Giả sử rằng mỗi con số đại diện cho một pixel trong hình ảnh được chụp bởi máy ảnh trên mái xe của bạn, và đầu ra dự đoán không được gọi là giá bán kim loại mà là số lượng vòng quay bánh lái kim loại, vì vậy bạn đã có một chương trình có thể tự động điều khiển xe của bạn!
Thật điên rồ, phải không?
Bước 3: Hãy thử từng con số.
Vâng, tất nhiên bạn không thể thử tất cả các trọng số có thể để tìm ra sự kết hợp tốt nhất. Để tránh tình trạng 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 một trọng lượng tốt mà không cần phải cố gắng quá nhiều. Dưới đây là một trong số đó: Đầu tiên, hãy viết ra một phương trình đơn giản cho các bước 2:
Đây là hàm chi phí của bạn.

Tiếp theo, chúng ta hãy viết lại các thuật ngữ toán học tương tự bằng cách học máy (bây giờ bạn có thể bỏ qua chúng):
θ là trọng lượng hiện tại. J ((θ) là giá trị trọng lượng hiện tại tương ứng của thạch anh.

Đây là phương trình cho thấy mức độ lệch của quy trình định giá của chúng ta theo trọng số hiện tại.
Nếu chúng ta biểu 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ư dưới đây:

Hình ảnh của hàm chi phí là một cái bát. Trục dọc là chi phí.
Điểm thấp nhất màu xanh trong biểu đồ là nơi có chi phí thấp nhất, nghĩa là chương trình của chúng ta có độ lệch nhỏ nhất. Điểm cao nhất có nghĩa là độ lệch lớn nhất. Vì vậy, nếu chúng ta có thể tìm thấy một tập hợp các trọng số dẫn chúng ta đến điểm thấp nhất trong biểu đồ, chúng ta đã tìm ra câu trả lời!

Vì vậy, chúng ta chỉ cần điều chỉnh trọng lượng để chúng ta có thể đi xuống dốc về phía điểm thấp nhất trên biểu đồ. Nếu điều chỉnh nhỏ về trọng lượng cho phép chúng ta tiếp tục di chuyển về phía điểm thấp nhất, thì cuối cùng chúng ta sẽ không phải cố gắng nhiều trọng lượng để đến đó.
Nếu bạn còn nhớ một chút về phép tích phân, bạn có thể nhớ rằng nếu bạn tìm kiếm một hàm, nó sẽ cho bạn biết độ dốc của hàm ở bất kỳ điểm nào. Nói cách khác, đối với một điểm trên biểu đồ, nó cho chúng ta biết rằng con đường đó là đường dốc.
Vì vậy, nếu chúng ta định hướng hàm chi phí đối với mỗi trọng lượng, chúng ta có thể lấy giá trị đó từ mỗi trọng lượng. Điều này sẽ đưa chúng ta đến gần đáy núi. Làm như vậy, cuối cùng chúng ta sẽ đến đáy và có được giá trị tối ưu của trọng lượng.
Phương pháp tìm ra trọng lượng tối ưu này được gọi là giảm độ dốc hàng loạt, và đây là một khái quát cao về nó. Nếu bạn muốn hiểu chi tiết, đừng sợ, hãy tiếp tục đi sâu hơn.
Khi bạn sử dụng một thư viện các thuật toán học máy để 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ó điều gì khác mà bạn đã bỏ qua?
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 bằng chứng 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à.
Tuy nhiên, phương pháp mà tôi đã trình bày cho bạn có thể có hiệu quả trong một số trường hợp đơn giản, nhưng nó không có hiệu quả trong tất cả các trường hợp. Một trong những lý do là giá nhà không luôn luôn đi 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, có rất 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). Có rất nhiều cách để sử dụng hồi quy tuyến tính linh hoạt hơn, nghĩ đến việc sử dụng các dòng phức tạp hơn để phù hợp. Trong tất cả các trường hợp, suy nghĩ cơ bản về việc tìm kiếm trọng lượng tối ưu vẫn còn áp dụng.
Ngoài ra, tôi đã bỏ qua khái niệm phù hợp. Thật dễ dàng để gặp phải một tập hợp các trọng số như vậy, chúng 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 chính xác về bất kỳ ngôi nhà mới nào bên 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ó được kết quả hữu ích khi sử dụng học máy. Tuy nhiên, đây là những kỹ năng mà mọi nhà phát triển đều có thể học được.
Một khi bạn bắt đầu hiểu rằng kỹ thuật học máy có thể 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 vào, bạn sẽ thấy các phương trình phù hợp với dữ liệu giống như trò chơi máy tính.
Nhưng điều quan trọng cần lưu ý là machine learning chỉ áp dụng cho các vấn đề mà bạn có thể thực sự giải quyết bằng dữ liệu mà bạn sở hữu.
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 căn nhà, nó sẽ không bao giờ thành công. Không có bất kỳ mối quan hệ nào giữa số lượng cây trồng trong nhà và giá nhà. Vì vậy, bất kể nó cố gắng như thế nào, máy tính cũng không thể suy ra mối quan hệ giữa hai thứ.

Bạn chỉ có thể mô phỏng những mối quan hệ thực tế.
Tôi nghĩ rằng vấn đề lớn nhất của học máy hiện nay là nó hoạt động chủ yếu trong các tổ chức nghiên cứu học thuật và thương mại. Có rất ít tài liệu học tập đơn giản và dễ hiểu cho những người muốn hiểu một cách tổng thể chứ không phải là chuyên gia.
Các khóa học miễn phí về học máy trên Coursera rất hay. Tôi khuyên bạn nên bắt đầu từ đây. Bất cứ ai có bằng cấp khoa học máy tính và nhớ một chút toán học đều có thể hiểu được.
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 khung Python, có phiên bản hộp đen cho tất cả các thuật toán tiêu chuẩn.
Tác giả: Python