JavaRush /Blog Java /Random-VI /Học máy dành cho nhà phát triển Java, Phần 1

Học máy dành cho nhà phát triển Java, Phần 1

Xuất bản trong nhóm
Thiết lập thuật toán học máy và phát triển chức năng dự đoán đầu tiên của bạn bằng Java. Xe tự lái, hệ thống nhận dạng khuôn mặt và trợ lý giọng nói đều được phát triển bằng cách sử dụng khung và công nghệ máy học. Và đây chỉ là làn sóng đầu tiên. Trong 10 năm tới, một thế hệ sản phẩm mới sẽ biến đổi thế giới của chúng ta, tạo ra những cách tiếp cận mới để phát triển chương trình, sản phẩm và ứng dụng. Học máy dành cho nhà phát triển Java, Phần 1 - 1Là một lập trình viên Java, bạn muốn nắm bắt làn sóng này khi các công ty công nghệ đang bắt đầu đầu tư mạnh vào học máy. Những gì bạn học hôm nay bạn có thể sử dụng trong năm năm tới. Nhưng bắt đầu từ đâu? Bài viết này nhằm mục đích trả lời câu hỏi này. Bạn sẽ có ấn tượng đầu tiên về các nguyên tắc học máy bằng cách làm theo hướng dẫn ngắn gọn của chúng tôi để triển khai và chuẩn bị thuật toán học máy. Sau khi tìm hiểu về cấu trúc của thuật toán học tập và các tính năng bạn có thể sử dụng để huấn luyện, đánh giá nó và chọn hàm cung cấp độ chính xác dự đoán tốt nhất, bạn sẽ hiểu được cách sử dụng khung JVM (Weka) để xây dựng các giải pháp học máy. Bài viết này tập trung vào học máy có giám sát vì đây là nguyên tắc được sử dụng phổ biến nhất trong việc phát triển các ứng dụng thông minh.

Học máy và trí tuệ nhân tạo

Học máy phát triển từ lĩnh vực trí tuệ nhân tạo, nhằm mục đích tạo ra những cỗ máy có thể bắt chước trí thông minh của con người. Mặc dù thuật ngữ “học máy” có nguồn gốc từ khoa học máy tính nhưng trí tuệ nhân tạo không phải là một lĩnh vực khoa học mới. Bài kiểm tra Turing , được phát triển bởi nhà toán học Alan Turing vào đầu những năm 50 của thế kỷ 20, là một trong những bài kiểm tra đầu tiên được thiết kế để xác định xem một cỗ máy tính toán có trí thông minh thực sự hay không. Theo thử nghiệm Turing, một máy tính chứng minh sự hiện diện của trí thông minh con người bằng cách mạo danh một người mà người đó không nhận ra rằng mình đang nói chuyện với máy.
Học máy dành cho nhà phát triển Java, Phần 1 - 2
Nhiều phương pháp học máy phổ biến ngày nay đều dựa trên những ý tưởng đã có từ hàng thập kỷ trước. Nhưng thập kỷ qua điện toán (và nền tảng điện toán phân tán) đã mang lại đủ sức mạnh để áp dụng các thuật toán học máy. Hầu hết trong số chúng yêu cầu một lượng lớn phép nhân ma trận và các phép tính toán học khác. Hai mươi năm trước, các công nghệ điện toán cho phép tính toán như vậy đơn giản là không tồn tại, nhưng giờ đây chúng đã trở thành hiện thực. Các thuật toán học máy cho phép các chương trình thực hiện quy trình cải tiến chất lượng và mở rộng khả năng của chúng mà không cần sự can thiệp của con người. Một chương trình được phát triển bằng máy học có thể cập nhật hoặc mở rộng mã riêng của nó một cách độc lập.

Học có giám sát và học không giám sát

Học có giám sát và không giám sát là hai cách tiếp cận phổ biến nhất đối với học máy. Cả hai tùy chọn đều yêu cầu cung cấp cho máy một lượng lớn bản ghi dữ liệu để xây dựng mối quan hệ và học hỏi. Dữ liệu được thu thập như vậy thường được gọi là "vectơ đặc trưng" . Ví dụ, chúng tôi có một tòa nhà dân cư nhất định. Trong trường hợp này, vectơ đặc trưng có thể chứa các đặc điểm như: tổng diện tích của ngôi nhà, số phòng, năm ngôi nhà được xây, v.v. Trong học có giám sát , thuật toán học máy được đào tạo để trả lời các câu hỏi liên quan đến vectơ đặc trưng. Để huấn luyện thuật toán, nó được cung cấp một tập hợp các vectơ đặc trưng và các nhãn liên quan. Nhãn liên quan được cung cấp bởi một người (giáo viên) và nó chứa "câu trả lời" chính xác cho câu hỏi được hỏi. Thuật toán học phân tích các vectơ đặc trưng và nhãn chính xác để tìm cấu trúc bên trong và mối quan hệ giữa chúng. Bằng cách này, máy sẽ học cách trả lời các câu hỏi một cách chính xác. Ví dụ, chúng ta có thể xem xét một ứng dụng thông minh nhất định cho giao dịch bất động sản. Nó có thể được huấn luyện bằng cách sử dụng một vectơ đặc trưng bao gồm kích thước, số phòng và năm xây dựng cho một nhóm nhà. Một người phải gán cho mỗi ngôi nhà một nhãn với giá chính xác của ngôi nhà dựa trên những yếu tố này. Bằng cách phân tích dữ liệu này, một ứng dụng thông minh sẽ tự đào tạo để trả lời câu hỏi “Tôi có thể nhận được bao nhiêu tiền cho ngôi nhà này?”
Bạn muốn đọc về Java? Hãy tham gia nhóm Nhà phát triển Java !
Khi quá trình chuẩn bị hoàn tất, dữ liệu đầu vào mới không còn được đánh dấu nữa. Máy phải có khả năng trả lời chính xác các câu hỏi, ngay cả đối với các vectơ đặc trưng không xác định, chưa được gắn nhãn. Trong học tập không giám sát, thuật toán được thiết kế để dự đoán câu trả lời mà không cần con người dán nhãn (hoặc thậm chí không cần đặt câu hỏi). Thay vì xác định nhãn hoặc kết quả, thuật toán học không giám sát sử dụng tập dữ liệu lớn và sức mạnh tính toán để khám phá các mối quan hệ chưa biết trước đó. Ví dụ: trong tiếp thị sản phẩm tiêu dùng, việc học không giám sát có thể được sử dụng để xác định các mối quan hệ hoặc nhóm khách hàng tiềm ẩn, điều này cuối cùng có thể giúp cải thiện chương trình tiếp thị hoặc tạo một chương trình mới. Trong bài viết này, chúng tôi sẽ tập trung vào học máy có giám sát; đây hiện là phương pháp được sử dụng phổ biến nhất.

Học máy được giám sát

Tất cả việc học máy đều dựa trên dữ liệu. Đối với dự án học máy được giám sát, bạn cần đánh dấu dữ liệu bằng các điểm đánh dấu theo cách cung cấp câu trả lời có ý nghĩa cho câu hỏi đang được hỏi. Dưới đây, trong Bảng-1, mỗi bản ghi thông tin căn nhà được dán nhãn “giá nhà”. Bằng cách xác định mối quan hệ giữa dữ liệu hồ sơ và giá nhà, thuật toán cuối cùng có thể dự đoán giá thị trường cho những ngôi nhà không có trong danh sách nhất định. (Xin lưu ý rằng diện tích của ngôi nhà được tính bằng mét vuông và giá của ngôi nhà được tính bằng euro).
Bảng 1. Danh sách nhà
Dấu hiệu Dấu hiệu Dấu hiệu Nhãn
Diện tích nhà Số phòng Tuổi của ngôi nhà Giá nhà dự kiến
90 m2 / 295 ft 2 phòng 23 tuổi €249.000
101 m2 / 331 ft 3 phòng không có €338.000
1330 m2 / 4363 ft 11 phòng 12 năm 6.500.000 €
Trong giai đoạn đầu, bạn có thể sẽ gắn nhãn dữ liệu theo cách thủ công, nhưng cuối cùng, bạn sẽ dạy chương trình của mình tự thực hiện việc đó. Có thể bạn đã thấy cách tiếp cận này hiệu quả với các ứng dụng email, trong đó để chuyển email vào thư mục Thư rác, bạn phải trả lời câu hỏi "Đây có phải là email spam không?" Khi trả lời, bạn huấn luyện chương trình nhận dạng các email mà bạn không muốn xem. Bộ lọc thư rác của ứng dụng được đào tạo để đánh dấu các thư từ cùng một nguồn hoặc chứa cùng một nội dung và quản lý chúng theo các quy tắc phù hợp. Các bộ dữ liệu được gắn nhãn chỉ được yêu cầu cho mục đích chuẩn bị và thử nghiệm. Sau khi hoàn thành bước này, thuật toán học máy sẽ hoạt động trên dữ liệu chưa được gắn nhãn. Ví dụ: bạn có thể cung cấp cho thuật toán dự đoán một bản ghi dữ liệu mới, chưa được gắn nhãn về một ngôi nhà và nó sẽ tự động dự đoán giá dự kiến ​​của ngôi nhà dựa trên “kiến thức” thu được từ dữ liệu chuẩn bị.

Cách một cỗ máy học cách dự đoán

Thách thức với học máy có giám sát là tìm ra chức năng dự đoán thích hợp cho một câu hỏi nhất định. Về mặt toán học, khó khăn là tìm ra một hàm lấy một biến làm đầu vào хvà trả về giá trị dự đoán у. Chức năng này của các giả thuyết (hθ)là kết quả của một quá trình chuẩn bị. Thông thường hàm giả thuyết còn được gọi là hàm mục tiêu hoặc hàm dự đoán.
y = h θ (x)
Trong hầu hết các trường hợp, хnó là một mảng dữ liệu. Trong ví dụ của chúng tôi, đây là một mảng hai chiều của các phần tử xác định một ngôi nhà, bao gồm số phòng và diện tích của ngôi nhà. Một mảng các giá trị như vậy là một vectơ đặc trưng. Bằng cách chỉ định một hàm mục tiêu cụ thể, chúng ta có thể sử dụng nó để dự đoán từng vectơ đặc trưng х. Để dự đoán giá một ngôi nhà, bạn phải gọi hàm mục tiêu bằng cách sử dụng vectơ đặc trưng {101.0, 3.0}bao gồm diện tích của ngôi nhà và số phòng:
// целевая функция h (результат процесса обучения)
Function<Double[], Double> h = ...;

// определяем целевой вектор с площадью дома=101 и количеством комнат=3
Double[] x = new Double[] { 101.0, 3.0 };

// и предсказываем цену дома (метка)
double y = h.apply(x);
Trong mã nguồn của Ví dụ-1, các giá trị trong mảng хbiểu thị một vectơ đặc điểm của ngôi nhà. Giá trị уđược hàm mục tiêu trả về là giá dự đoán của ngôi nhà. Mục tiêu của học máy là xác định hàm mục tiêu sẽ hoạt động chính xác nhất có thể với các tham số đầu vào chưa xác định. Trong học máy, hàm mục tiêu (hθ)đôi khi được gọi là mô hình. Mô hình này là kết quả của một quá trình học tập.
Học máy dành cho nhà phát triển Java, Phần 1 - 3
Dựa trên các mẫu huấn luyện được gắn nhãn, thuật toán học sẽ tìm kiếm các cấu trúc hoặc mẫu trong dữ liệu huấn luyện. Vì vậy, anh ấy xây dựng một mô hình nhìn chung tốt cho dữ liệu. Thông thường, quá trình học tập có tính chất khám phá. Trong hầu hết các trường hợp, quá trình này được lặp lại nhiều lần bằng cách sử dụng các biến thể khác nhau của thuật toán và cấu hình học tập. Do đó, tất cả các mô hình đều được đánh giá dựa trên các số liệu hiệu suất, trong đó mô hình tốt nhất sẽ được chọn. Và mô hình này được sử dụng để tính toán các giá trị ước tính cho dữ liệu không được gắn thẻ trong tương lai.

Hồi quy tuyến tính

Để dạy máy “suy nghĩ”, trước tiên bạn cần chọn thuật toán học mà bạn sẽ sử dụng. Ví dụ, hồi quy tuyến tính. Đây là một trong những thuật toán học máy được giám sát đơn giản và phổ biến nhất. Thuật toán giả định rằng mối quan hệ giữa các tính năng đầu vào và điểm đánh dấu kết quả là tuyến tính. Hàm hồi quy tuyến tính tổng quát bên dưới trả về giá trị dự đoán bằng cách tính tổng tất cả các phần tử của vectơ đặc trưng nhân với tham số θ (theta) . Tham số này được sử dụng trong quá trình huấn luyện để điều chỉnh hoặc “điều chỉnh” hàm hồi quy dựa trên dữ liệu huấn luyện.
h θ (x) = θ 0 * 1 + θ 1 * x 1 + ... θ n * x n
Trong hàm hồi quy tuyến tính, tham số theta và tham số tính năng được đánh số bằng chỉ số dưới. Chỉ số dưới xác định vị trí của tham số (θ)và tham số tính năng (х)trong vectơ. Lưu ý rằng đặc trưng x 0 là số hạng dịch chuyển không đổi và có ý nghĩa quan trọng 1đối với mục đích tính toán. Kết quả là chỉ số của các thông số quan trọng như diện tích ngôi nhà bắt đầu bằng x 1 . Vì vậy, nếu x 1 được gán giá trị đầu tiên của vectơ đặc trưng (diện tích nhà), thì x 2 sẽ lấy giá trị tiếp theo (số phòng), v.v. Ví dụ-2 minh họa cách triển khai Java của hàm hồi quy tuyến tính, được ký hiệu bằng toán học là h θ (x). Để đơn giản, các phép tính được thực hiện bằng cách sử dụng double. Trong phương thức này apply(), điều kiện là phần tử đầu tiên của mảng sẽ bằng 1,0 và sẽ được đặt bên ngoài hàm này. Ví dụ 2: Hồi quy tuyến tính trong Java
public class LinearRegressionFunction implements Function<Double[], Double> {
 private final double[] thetaVector;

 LinearRegressionFunction(double[] thetaVector) {
 this.thetaVector = Arrays.copyOf(thetaVector, thetaVector.length);
 }

 public Double apply(Double[] featureVector) {
 // с целью упрощения вычислений первый элемент должен быть equals 1.0
 assert featureVector[0] == 1.0;

 // простое последовательное сложение
 double prediction = 0;
 for (int j = 0; j < thetaVector.length; j++) {
 prediction += thetaVector[j] * featureVector[j];
 }
 return prediction;
 }

 public double[] getThetas() {
 return Arrays.copyOf(thetaVector, thetaVector.length);
 }
}
Để tạo một thể hiện mới LinearRegressionFunction, bạn cần chỉ định tham số θ. Tham số hoặc vectơ này được sử dụng để điều chỉnh hàm hồi quy tuyến tính tổng quát cho phù hợp với dữ liệu huấn luyện cơ bản. Tham số θsử dụng trong chương trình sẽ được điều chỉnh trong quá trình huấn luyện, dựa trên các mẫu huấn luyện. Chất lượng của hàm mục tiêu được huấn luyện sẽ phụ thuộc vào chất lượng của dữ liệu được chuẩn bị cho việc huấn luyện. Trong ví dụ dưới đây, chúng tôi sử dụng LinearRegressionFunctiondự đoán giá dựa trên kích thước của ngôi nhà để minh họa. Xét rằng x 0 phải là một hằng số có giá trị 1,0, hàm mục tiêu được khởi tạo bằng hai tham số θ, trong đó chúng là kết quả của quá trình học. Sau khi tạo ví dụ mới, giá căn nhà có diện tích 1330m2 sẽ được dự đoán như hình dưới:
// тета вектор, используемый в этом примере, является результатом процесса обучения
double[] thetaVector = new double[] { 1.004579, 5.286822 };
LinearRegressionFunction targetFunction = new LinearRegressionFunction(thetaVector);

// создание вектора признаков со значениями x0=1 (для удобства вычислений) и //x1=площадь дома
Double[] featureVector = new Double[] { 1.0, 1330.0 };

// выполняем расчеты
double predictedPrice = targetFunction.apply(featureVector);
Trong hình bên dưới, bạn có thể thấy biểu đồ của hàm mục tiêu dự đoán (đường màu xanh lam). Nó có được bằng cách tính hàm mục tiêu cho tất cả các giá trị diện tích của ngôi nhà. Biểu đồ cũng chứa các cặp giá-khu vực được sử dụng để đào tạo.
Học máy dành cho nhà phát triển Java, Phần 1 - 4
Hiện tại biểu đồ dự đoán trông khá tốt. Tọa độ của đồ thị (vị trí và độ dốc) được xác định bởi vectơ θ { 1.004579, 5.286822 }. Nhưng làm cách nào bạn có thể xác định θ-vector nào phù hợp nhất cho ứng dụng của mình? Hàm sẽ phù hợp hơn nếu bạn thay đổi tham số đầu tiên hoặc có thể là tham số thứ hai? Để xác định vectơ theta phù hợp nhất, bạn cần một hàm tiện ích để đánh giá hàm mục tiêu thực hiện công việc tốt như thế nào. ĐỂ ĐƯỢC TIẾP TỤC Dịch từ tiếng Anh. Tác giả: Gregor Roth, Kiến trúc sư phần mềm, JavaWorld.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION