+40

Machine Learning thật thú vị

Hướng dẫn này dành cho bất cứ ai tò mò về Machine Learning nhưng không biết bắt đầu từ đâu. Tôi tưởng tượng rằng có rất nhiều người đã cố gắng đọc Wikipedia, đã thất vọng và bỏ cuộc rồi mong muốn ai đó sẽ chỉ cho họ một lời giải thích dễ hiểu hơn. Và tôi đang làm điều này với bạn.

Machine Learning là gì?

Machine Learning là ý tưởng rằng có những thuật toán chung chung có thể cho bạn biết điều gì đó thú vị về một bộ dữ liệu mà không cần phải viết bất kỳ mã tùy chỉnh nào cụ thể cho vấn đề. Thay vì viết mã, bạn đưa dữ liệu vào thuật toán chung và nó xây dựng logic riêng dựa trên dữ liệu. Ví dụ như thuật toán phân loại dữ liệu, nó có thể đưa dữ liệu vào các nhóm khác nhau. Thuật toán phân loại giống nhau được sử dụng để nhận dạng số viết tay cũng có thể được sử dụng để phân loại email vào thư rác và không spam mà không thay đổi một dòng mã. Đó là cùng một thuật toán nhưng nó training dữ liệu khác với mục đích khác nhau.

Thuật toán Machine Learning này là một hộp đen có thể được sử dụng lại cho nhiều vấn đề phân loại khác nhau.

Machine Learning là một thuật ngữ bao gồm rất nhiều loại thuật toán chung.

Hai loại thuật toán Machine Learning

Thuật toán Machine Learning có hai loại chính: học có giám sáthọc không giám sát. Sự khác biệt tuy đơn giản nhưng thực sự quan trọng.

Học có giám sát

Giả sử bạn là đại lý bất động sản. Doanh nghiệp của bạn đang phát triển, bạn thuê một nhóm các nhân viên thực tập mới để giúp bạn trong công việc. Nhưng có một vấn đề, khi bạn lướt qua một căn hộ thì bạn sẽ có ngay một đánh giá về giá trị của căn hộ này, nhưng các nhân viên mới của bạn thì sao? Họ không có kinh nghiệm như bạn để có thể làm được điều đó. Để giúp các nhân viên mới của bạn có thể làm được điều này, bạn quyết định viết một ứng dụng nhỏ có thể ước tính giá trị của một căn hộ trong khu vực của bạn dựa trên diện tích, khu đô thị, số giường ngủ, ... và những dữ liệu về các căn hộ tương tự đã bán. Bạn bắt đầu viết ra các lịch sử giao dịch đã bán trong thành phố của bạn trong 3 tháng. Đối với mỗi căn hộ, bạn viết ra một số liệu chi tiết gồm: số phòng ngủ, diện tích, Khu đô thị ... và quan trọng nhất là giá bán cuối cùng:

Số phòng ngủ Diện tích Khu đô thị Giá bán
3 2000 Times City $250,000
2 800 Royal City $300,000
2 850 Times City $150,000
1 550 Times City $78,000
4 2000 KDT Linh Đàm $150,000

Sử dụng dữ liệu đó, tôi muốn tạo một chương trình có thể ước tính được giá trị của bất kỳ căn hộ nào khác trong khu vực, VD:

Số phòng ngủ Diện tích Khu đô thị Giá bán
3 2000 Royal City ???

Đây được gọi là học có giám sát. Bạn biết từng căn hộ bán giá bao nhiêu, hay nói cách khác, bạn biết câu trả lời cho vấn đề và có thể làm ngược lại từ đó để tìm ra logic. Để xây dựng ứng dụng này, bạn cho dữ liệu đào tạo của bạn về mỗi căn hộ vào thuật toán Machine Learning của bạn. Thuật toán sẽ cố gắng tìm ra những phép toán học cần thiết để thực hiện để tính ra kết quả cuối cùng như mong muốn. Trong quá trình học có giám sát, bạn sẽ để cho máy tính tìm ra mối quan hệ đó cho bạn. Và một khi bạn biết những phép toán học nào là cần thiết để giải quyết vấn đề cụ thể này, bạn có thể trả lời cho bất kỳ vấn đề nào khác cùng loại!

Học không giám sát

Hãy trở lại ví dụ ban đầu của tôi với đại lý bất động sản. Nếu bạn không biết giá bán cho mỗi căn hộ thì sao? Ngay cả khi tất cả những gì bạn biết là kích thước, vị trí, số phòng ngủ, ... của mỗi căn hộ, bạn sẽ vẫn có thể làm được một số thứ thực sự tuyệt vời. Đây được gọi là học không giám sát.

Số phòng ngủ Diện tích Khu đô thị
3 2000 Times City
2 800 Royal City
2 850 Times City
1 550 Times City
4 2000 KDT Linh Đàm

Đây giống như một người đưa ra danh sách các con số trên một tờ giấy và nhẹ nhàng nói với bạn rằng:

Tôi thực sự 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 thứ gì đó như một mối liên hệ, một phép tính hoặc một cái gì đó - Oh Yeah!

Vậy bạn có thể làm gì với dữ liệu này? Đối với người mới bắt đầu, bạn có thể có một thuật toán tự động xác định các phân đoạn thị trường khác nhau trong dữ liệu của bạn. Có thể bạn sẽ biết rằng những người mua căn hộ ở Times City có vẻ như thích những căn hộ có nhiều phòng ngủ, còn những người mua nhà ở Royal City thì thích những căn hộ có diện tích lớn. Biết được những nhu cầu này của khách hàng, bạn sẽ có thể đưa ra các chiến lược bán hàng của bạn cho hợp lý.

Một điều thú vị khác mà bạn có thể làm là tự động xác định bất kỳ căn hộ nào đó khác biệt so với các ngôi nhà còn lại. Ví dụ như những căn hộ ở những khu đô thị đắt tiền như Royal City là biệt thự khổng lồ và bạn có thể tập trung đội ngũ bán hàng giỏi nhất tiếp cận vào những khu vực này để tăng doanh số của bạn.

Học tập theo chế độ giám sát là những gì chúng ta sẽ tập trung cho phần còn lại của bài đăng này, nhưng đó không phải là vì học không giám sát không ít hữu ích hay thú vị nhé. Trên thực tế, học không giám sát ngày càng trở nên quan trọng vì các thuật toán này tốt hơn bởi vì nó có thể sử dụng mà không cần gắn nhãn dữ liệu với câu trả lời chính xác.

*Lưu ý: Có rất nhiều loại thuật toán Machine Learning khác, nhưng đây là một nơi khá tốt để bắt đầu.

Chương trình Machine Learning demo

Vậy làm thế nào bạn sẽ viết chương trình để ước tính giá trị của một căn hộ như trong ví dụ của tôi ở trên? Trước tiên bạn hãy xem lại yêu cầu tôi đã nêu ở trên (requirement). Nếu bạn chưa biết gì về Machine Learning, bạn có thể cố gắng viết ra một số quy tắc cơ bản để ước tính giá của một căn hộ trông như thế này:

function estimate_house_sales_price ($numOfBedrooms, $sqft, $neighborhood)
{
    $price = 0;
    $pricePerSqft = 200; // VD giá trung bình là $200 / diện tích
    if ($neighborhood == 'Royal City') {
        $pricePerSqft = 400; // Royal City đắt gấp đôi
    } elseif ($neighborhood == 'KDT Linh Đàm') {
        $pricePerSqft = 100; // KDT Linh Đàm rẻ hơn 1/2
    }

    $price = pricePerSqft * $sqft; // Tính giá dựa trên giá theo diện tích

    # Điều chỉnh giá dựa theo số phòng ngủ
    if ($numOfBedrooms == 0) {
        $price = $price-20000; // VP làm việc thì rẻ hơn
    } else {
        $price = $price + ($numOfBedrooms * 1000); // Có phòng ngủ thì đắt hơn, tăng theo cấp số cộng
    }

    return $price;
}

Chương trình của bạn sẽ khó có thể hoàn hảo và sẽ rất khó để duy trì khi giá thị trường thay đổi. Và dĩ nhiên rồi, đây vẫn chưa thể gọi là Machine Learning mà chỉ là những gì bạn đang biết.

Vẫn là function tính giá đó, với các args đó, tôi rút gọn function trên thành một function rất đơn giản như thế này:

function estimate_house_sales_price ($numOfBedrooms, $sqft, $neighborhood)
{
    $price = 0; // khởi tạo
    
    // Cho thêm chút mắm vào
    $price += $numOfBedrooms * 0.841231951398213;
    
    // Ok. Thêm chút muối nữa
    $price += $sqft * 1231.1231231;
    
    // Greate. Thêm chút đường nữa
    $price += $neighborhood * 2.3242341421;
    
    // So crazy. Thêm chút mắm tôm nữa
    $price += 201.23432095;
    
    return $price;
}

Đấy, thế này là Machine Learning bạn nhé =)) Bạn có tin rằng 2 function trên có chức năng ý hệt nhau không? Bạn có thể tự test để kiểm tra nhé.

Điều bí ẩn có lẽ bạn cũng thấy chính là các số 0.841231951398213, 1231.1231231, 2.3242341421201.23432095 nhỉ? Đây chính là weight. Nếu chúng ta có thể tìm được weight hoàn hảo thì chúng ta sẽ có thể đoán được giá của một căn hộ. Đến đây bạn đã thấy Machine Learning ở đâu rồi chứ?

Một cách đơn giản để tìm ra các weight như sau:

Bước 1:

Bắt đầu với mỗi trọng lượng được đặt thành 1.0:

function estimate_house_sales_price ($numOfBedrooms, $sqft, $neighborhood)
{
    $price = 0; // khởi tạo
    
    // Cho thêm chút mắm vào
    $price += $numOfBedrooms * 1.0;
    
    // Ok. Thêm chút muối nữa
    $price += $sqft * 1.0;
    
    // Greate. Thêm chút đường nữa
    $price += $neighborhood * 1.0;
    
    // So crazy. Thêm chút mắm tôm nữa
    $price += 1.0;
    
    return $price;
}

Bước 2:

Chạy function với tất cả ngôi nhà mà bạn biết và xem kết quả so với thực tế:

Số phòng ngủ Diện tích Khu đô thị Giá bán Machine Learning đoán
3 2000 Times City $250,000 $178,000
2 800 Royal City $300,000 $371,000
2 850 Times City $150,000 $148,000
1 550 Times City $78,000 $101,000
4 2000 KDT Linh Đàm $150,000 $121,000

Kết quả sai bét nhè nhỉ? Dĩ nhiên rồi, vì lúc này weight = 1.0 chưa phải là weight hoàn hảo. Chúng ta sẽ dựa vào kết quả sai này để điều chỉnh weight cho đến khi nó trở nên hoàn hảo. Ví dụ: nếu căn hộ đầu tiên được bán với giá $250,000 nhưng function của bạn đoán rằng nó đã bán với giá $178.000, bạn sẽ bị mất $72,000 cho căn hộ đó. Bây giờ, cộng thêm bình phương của số tiền mà bạn phải trả cho mỗi căn hộ mà bạn có trong bộ dữ liệu. Giả sử rằng bạn đã có 500 doanh số bán nhà trong bộ dữ liệu của bạn và khoảng vuông cho biết function của bạn đã giảm cho mỗi căn hộ là tổng cộng $86.123,373. Đó là cách "sai" function của bạn. Bây giờ, lấy tổng số đó và chia cho 500 để có được một số trung bình, gọi số lỗi trung bình này là cost cho chức năng của bạn. Nếu bạn có được cost này bằng 0 bằng cách chạy với weight đã tìm ra, function của bạn sẽ là hoàn hảo. Nó có nghĩa là trong mọi trường hợp, function của bạn hoàn toàn đoán được giá căn hộ dựa trên dữ liệu đầu vào. Và đó là mục tiêu của tôi - làm cho cost này càng thấp càng tốt bằng cách thử các weight khác nhau.

Bước 3:

Lặp lại Bước 2 ở trên với weight khác nhau đến khi nào bạn tìm ra được weight tốt nhất, tức cost gần bằng 0 nhất thì bạn đã gần tới đích rồi. Bước 3 chính là quá trình training.

Lời nhắn

Bạn thấy Machine Learning đơn giản rồi chứ? Nó chính là những gì bạn vừa làm. Bạn đã lấy một số dữ liệu, bạn cho xử lý thông qua ba bước chung, thực sự đơn giản, và bạn đã kết thúc với một function có thể đoán được kết quả bạn muốn tìm mà không sử dụng những logic thông thường.

Và đây là một số lưu ý bạn cần nhớ:

  • Nghiên cứu trong nhiều lĩnh vực (như ngôn ngữ học / dịch thuật) trong 40 năm qua đã chỉ ra rằng những thuật toán chung chung này "tạo ra một hầm rượu" (một cụm từ tôi vừa tạo ra, tức để càng lâu sẽ càng ngon, chạy càng nhiều sẽ càng đúng) thực hiện những cách tiếp cận thực tế để làm những việc mà những con người thực sự cũng cố gắng làm: tự quyết định. Cách tiếp cận "thầm lặng" của Machine Learning đến một ngày nào đó sẽ có thể sánh được với các chuyên gia, hoặc chính bạn.
  • Function bạn đã kết thúc là hoàn toàn tĩnh. Nó thậm chí không biết những gì sẽ là input đầu vào (như diện tích hay số phòng ngủ). Tất cả những gì nó biết là nó cần phải khuấy một số lượng những con số để có được câu trả lời chính xác.
  • Rất có thể bạn sẽ không biết tại sao một bộ weight cụ thể sẽ hoạt động thế nào, nhưng bạn đã viết được một function mà bạn không thực sự hiểu và bạn có thể chứng minh nó sẽ làm việc.
  • Mở rộng từ bài toán trên, hãy tưởng tượng rằng thay vì bạn đưa vào các con số như $sqft, $numOfBedrooms ... để tính ra giá của một căn hộ, bạn chuyển thành đưa input đầu vào là số dòng code hôm nay của bạn và output đầu ra sẽ là kết quả giải đặc biệt sắp tới của sổ số tự chọn Vietlot. Rất có thể ấy nhỉ? Hiiiiii.

So crazy, so amazing, right? Ahihi.

Phần tới, mình sẽ giới thiệu cho các bạn về Neural Network. Hẹn gặp lại các bạn nhé!

Nguồn

Nguồn bài viết được dịch: https://medium.com/@ageitgey/machine-learning-is-fun-80ea3ec3c471


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí