đặt vấn đề rằng cấu trúc và hành vi của chương trình ảnh hưởng tới sự xuất hiện của lỗi trong tương lai. Cách tiếp cận không yêu cầu lịch sử chương trình mà chỉ đi xem xét, đánh giá trạng thái hiện tại của hệ thống một cách chi tiết dựa trên một loạt các thông số. 18 Một số nghiên cứu tập trung vào hướng tiếp cận này như nghiên cứu của Balisi sử dụng các thông số CK trên các hệ thống quản lý thông tin dựa trên cùng yêu cầu hoặc Nagappan và Ball đã ước lượng mật độ lỗi của window 2003 với một tool phân tích, Nagappan đã dùng danh sách các thông số về source code để dự đoán lỗi sau release của module level trên năm hệ thống Microsoft và nhận ra rằng tool dự đoán có thể hoạt động tốt trên 1 hệ thống riêng lẻ chứ không phải là nhiều hệ thống cùng lúc [8]. Các cách tiếp cận khác Ngoài hai cách tiếp cận trên các nhà nghiên cứu cũng đưa ra nhiều cách tiếp cận nữa như: Zimmermann và Nagappan đã sử dụng các sự phụ thuộc giữa các binary trong window 2003 để dự đoán lỗi [9], Marcus sử dụng một phương pháp đo dựa trên LSI để dự đoán lỗi trên một vài hệ thống C++ … [10] 1.
Tổng quan về dự đoán lỗi phần mềm sử dụng học máy Các mô hình dự đoán lỗi có thể được phân loại theo những số liệu được sử dụng và các bước quá trình trong vòng đời phần mềm. Hầu hết các mô hình dự đoán lỗi sử dụng các số liệu cơ bản như độ phức tạp và kích thước của các phần mềm. Số liệu thử nghiệm được tạo ra trong giai đoạn thử nghiệm cũng được sử dụng để ước tính chuỗi các lỗi. Một cách tiếp cận khác là điều tra về chất lượng của các quy trình thiết kế và thực hiện phần mềm, mà chất lượng của việc thiết kế là yếu tố dự đoán tốt nhất về chất lượng sản phẩm.
Ý tưởng chính đằng sau các mô hình dự đoán lỗi là để ước lượng độ tin cậy của hệ thống, và nghiên cứu ảnh hưởng của thiết kế và quy trình kiểm tra trên số các lỗi. Các nghiên cứu trước cho thấy các chỉ số tại các bước trong vòng đời của một dự án phần mềm như thiết kế, thực hiện, kiểm thử, vv nên được sử dụng và kết nối với thành 19 phần cụ thể. Chỉ tập trung vào một mức số liệu hay quá trình cụ thể là không đủ để xây dựng được một mô hình dự đoán tốt. Các thuật toán học máy đã được chứng minh là thiết thực trong việc giải quyết các vấn đề chưa rõ ràng.
Do các vấn đề phần mềm có thể được xây dựng trong quá trình học và phân loại theo các đặc điểm của lỗi, các thuật toán máy học thông thường có khả năng được áp dụng để chuẩn bị một phân bố xác suất và phân tích các lỗi. Cây quyết định, mạng nơron nhân tạo, mạng Bayes và các kỹ thuật phân cụm như k-nn là ví dụ về kỹ thuật thường được sử dụng nhiều nhất cho các vấn đề dự đoán lỗi phần mềm. Các thuật toán học máy có thể được sử dụng thông qua việc thực thi chương trình để phát hiện số lượng lỗi, từ đó có thể tìm ra các lỗi tiềm ẩn. Việc thực thi được phân loại theo tính chất của phương pháp là hướng thủ tục hay hướng chức năng.
Học máy cũng được sử dụng để tạo ra các mô hình dựa theo tính chất chương trình gây lỗi. Các công cụ vector hỗ trợ và cây quyết định được thực thi để phân loại và xem xét các tập con liên quan nhất của các thuộc tính chương trình. Hầu hết các tính chất dẫn đến tình trạng bị lỗi có thể được phân loại thành một vài nhóm. Phương pháp học máy bao gồm hai bước: huấn luyện và phân loại.
Các thuộc tính có liên quan tới lỗi được sử dụng để tạo ra một mô hình, và chọn các thuộc tính mà có nhiều khả năng gây ra lỗi trong phần mềm. Phân cụm trên hồ sơ chức năng được sử dụng để xác định các tính năng cho phép một mô hình để phân biệt được các trường hợp có nguy lỗi và không có nguy cơ lỗi. Việc phát hiện bất biến được sử dụng để phát hiện các bất biến có khả năng từ một bộ kiểm thử và xem xét các nguyên nhân thường gây ra trạng thái lỗi. Phương pháp này cũng được sử dụng để xác định các phản ví dụ và tìm các thuộc tính mà dẫn tới kết quả đúng trong mọi điều kiện, hình 5 minh họa các bước xây dựng mô hình dự đoán lỗi sử dụng học máy.
Các bước xây dựng mô hình dự đoán lỗi sử dụng học máy 1. Giới thiệu vấn đề dự đoán lỗi liên dự án Dự đoán lỗi phần mềm sẽ hiệu quả nếu các mô hình được huấn luyện với một lượng dữ liệu đủ lớn, tuy nhiên, trong thực tế, dữ liệu huấn luyện thường không có sẵn, hoặc do công ty có quy mô quá nhỏ hoặc các dữ liệu đó là phiên bản đầu tiên của một sản phẩm, mà không tồn tại dữ liệu cũ trong quá khứ. Trong hoàn cảnh phải ước lượng công sức bỏ ra để làm dự án mà không có hoặc có rất ít số liệu sẵn có, các kỹ sư thường sử dụng dữ liệu từ các dự án hoặc từ các công ty khác. Ý tưởng này hoàn toàn có thể áp dụng sang cho trường hợp dự đoán lỗi, một mô hình được xây dựng từ một dự án khác sẽ được sử dụng để dự đoán các lỗi sẽ xuất hiện trong dự án mới, cách tiếp cận này được gọi là dự đoán lỗi liên dự án.
Các câu hỏi cụ thể mà chúng ta cần giải quyết là: 1. Có thể sử dụng dữ liệu liên dự án ở mức độ nào để dự đoán lỗi sau khi release cho một hệ thống phần mềm? 21 2. Những hệ thống phần mềm như thế nào là tốt để áp dụng dự đoán lỗi liên dự án: các dự án nằm cùng một domain, có cùng process, có cấu trúc code tương tự, hay nằm trong cùng một công ty? Giả thiết rằng trong các công ty, các process thường tương tự hoặc thậm chí giống nhau, chúng ta tìm kiếm những kết luận về những đặc điểm thuận lợi cho những dự đoán liên dự án tốt hơn là nó cùng một tên miền hoặc quá trình tương tự? 1. Các phương pháp gần đây đã được nghiên cứu để giải quyết vấn đề Có nhiều phương pháp đã được nghiên cứu và hoạt động hiệu quả trong việc giải quyết bài toán dự đoán lỗi trong cùng dự án, tuy vậy, các phương pháp này lại không phù hợp hoặc có hiệu suất kém khi áp dụng vào bài toán dự đoán lỗi liên dự án.
Từ thực tế đó, một số cách tiếp cận đã được đề xuất, một trong số đó là tiếp cận dự đoán lỗi dựa trên việc học các sự chuyển đổi (transfer learning). Kỹ thuật học sự chuyển đổi cho phép có sự khác nhau giữa các miền, các tác vụ cũng như phân phối dữ liệu huấn luyện và kiểm thử, và đã được áp dụng thành công trong nhiều ứng dụng thực tế gần đây. Kĩ thuật này được quy định như sau: Cho miền nguồn !" và tác vụ học #" , miền đích !$ và tác vụ học #$ , kĩ thuật học tập sự chuyển đổi nhằm mục đích giúp cải thiện việc học của các chức năng dự đoán trong !$ sử dụng những kiến thức có trong !" và #" (!" ≠ !$ hoặc #" ≠ #$ ). Dự đoán lỗi liên dự án tương ứng với việc học các chuyển đổi một cách quy nạp, trong đó tập nguồn, đích là như nhau trong khi miền nguồn, đích là khác nhau.
Tiếp cận theo kiểu này có thể được tóm tắt thành hai loại là chuyển đổi phiên bản (instance-transfer) và chuyển đổi tính năng đại diện (feature-representation- transfer) [11]. Trong khi chuyển đổi các tính năng đại diện sẽ học các đại diện thấp chiều để giảm sự phân kỳ miền, thì chuyển đổi phiên bản sẽ gán trọng số cho các tập 22 nguồn dựa theo đóng góp của chúng trong việc xây dựng mô hình trong miền đích. Những cách tiếp cận trên thường gồm hai bước chính: (1) ước tính trọng số của dữ liệu nguồn; (2) huấn luyện các mô hình trên các dữ liệu đã được tái đánh trọng số. Gần đây nhất, xuất hiện một số thuật toán mở rộng cho các phân loại hiện có.
Ví dụ mở rộng của bao đóng (TrBagg) hoặc đưa ra framework mới (gọi là TrAdaBoost) để chuyển kiến thức từ một phân phối sang một phân phối khác bằng cách tăng cường việc học cơ bản [12]. Phương pháp học sự chuyển đổi được đề xuất trong nghiên cứu này cũng là phần mở rộng cho phân loại Naive Bayes. Kỹ thuật học tập sự chuyển đổi cũng hoạt động tốt trên nhiều lĩnh vực như phân loại hình ảnh, nhận dạng tên thực thể, dịch trang web, xử lý ngôn ngữ tự nhiên, và lọc spam email. Dự đoán lỗi liên dự án sử dụng các lỗi phần mềm ở các public repository và sử dụng các phương pháp học tập sự chuyển đổi để đưa ra dự đoán.
Trong phạm vi luận văn không đề cập đến việc dự đoán vị trí của lỗi, lỗi như thế nào trong một lớp mà chỉ dự đoán những lớp nào có khả năng có lỗi, lớp nào chứa nhiều lỗi, lớp nào chưa ít lỗi hơn. Luận văn tập trung vào việc đưa ra kỹ thuật dự đoán lỗi phần mềm áp dụng cho một hệ thống có khả năng có nhiều lỗi. Luận văn cũng sẽ tập trung vào một kỹ thuật dự đoán dựa trên học máy để xây dựng và thử nghiệm cho mô hình dự đoán lỗi của một hệ thống phần mềm. Kết luận chương Tổng kết lại, đối với dự đoán lỗi phần mềm nói chung hiện tại có nhiều cách tiếp cận đã được giới thiệu, nhưng phổ biến và hiệu quả nhất trong số đó là sử dụng phương pháp học máy với một số kĩ thuật như mạng nơtron, mạng Bayes, phân cụm k- nn giúp nâng cao độ chính xác khi thực hiện dự đoán.
23 Đối với các công ty nhỏ hoặc với các phần mềm, hệ thống đang trong giai đoạn phát triển phiên bản đầu tiên thì việc có được một tập dữ liệu huấn luyện đủ lớn là điều không hề dễ dàng. Để giải quyết vấn đề này, người ta sẽ sử dụng lại các dữ liệu của các dự án, phần mềm khác để xây dựng mô hình dự đoán cho dự án, phần mềm hiện tại. Vấn đề đặt ra là các dự án, phần mềm cũ và hiện tại lại nằm trên các domain khác nhau, khác cấu trúc dự án, cấu trúc code, làm cách nào để đồng nhất được sự khác biệt này.