ตั้งค่าอัลกอริธึมแมชชีนเลิร์นนิงและพัฒนาฟังก์ชันการคาดเดาแรกของคุณโดยใช้ Java รถยนต์ไร้คนขับ ระบบจดจำใบหน้า และระบบสั่งงานด้วยเสียงล้วนได้รับการพัฒนาโดยใช้เทคโนโลยีและเฟรมเวิร์กการเรียนรู้ของเครื่อง และนี่เป็นเพียงคลื่นลูกแรกเท่านั้น ในอีก 10 ปีข้างหน้า ผลิตภัณฑ์รุ่นใหม่จะเปลี่ยนโลกของเรา ก่อให้เกิดแนวทางใหม่ในการพัฒนาโปรแกรม ผลิตภัณฑ์ และแอปพลิเคชัน
![การเรียนรู้ของเครื่องสำหรับนักพัฒนา Java ตอนที่ 1 - 1]()
ในฐานะโปรแกรมเมอร์ Java คุณต้องการที่จะจับกระแสนี้เนื่องจากบริษัทเทคโนโลยีเริ่มลงทุนมหาศาลในการเรียนรู้ของเครื่อง สิ่งที่คุณเรียนรู้วันนี้คุณสามารถใช้ไปได้อีกห้าปีข้างหน้า แต่จะเริ่มต้นที่ไหน? บทความนี้มีวัตถุประสงค์เพื่อตอบคำถามนี้ คุณจะได้รับความประทับใจครั้งแรกเกี่ยวกับหลักการของแมชชีนเลิร์นนิงโดยทำตามคำแนะนำสั้นๆ ของเราในการนำไปใช้และเตรียมอัลกอริทึมแมชชีนเลิร์นนิง หลังจากเรียนรู้เกี่ยวกับโครงสร้างของอัลกอริธึมการเรียนรู้และฟีเจอร์ที่คุณสามารถใช้เพื่อฝึกฝน ประเมิน และเลือกฟังก์ชันที่ให้ความแม่นยำในการทำนายที่ดีที่สุด คุณจะได้รับความเข้าใจเกี่ยวกับวิธีการใช้เฟรมเวิร์ก JVM (Weka) สร้างโซลูชันแมชชีนเลิร์นนิง บทความนี้มุ่งเน้นไปที่การเรียนรู้ของเครื่องภายใต้การดูแล เนื่องจากเป็นหลักการที่ใช้บ่อยที่สุดในการพัฒนาแอปพลิเคชันอัจฉริยะ
การเรียนรู้ของเครื่องและปัญญาประดิษฐ์
การเรียนรู้ของเครื่องพัฒนามาจากสาขาปัญญาประดิษฐ์ ซึ่งมีจุดมุ่งหมายเพื่อสร้างเครื่องจักรที่สามารถเลียนแบบสติปัญญาของมนุษย์ได้ แม้ว่าคำว่า "การเรียนรู้ของเครื่อง" จะมีต้นกำเนิดมาจากวิทยาการคอมพิวเตอร์ แต่ปัญญาประดิษฐ์ก็ไม่ใช่สาขาวิทยาศาสตร์ใหม่
การทดสอบทัวริงพัฒนาโดยนักคณิตศาสตร์ อลัน ทัวริง ในช่วงต้นทศวรรษที่ 50 ของศตวรรษที่ 20 เป็นหนึ่งในการทดสอบแรกๆ ที่ออกแบบมาเพื่อตรวจสอบว่าเครื่องคอมพิวเตอร์มีความฉลาดที่แท้จริงหรือไม่ จากการทดสอบของทัวริง คอมพิวเตอร์พิสูจน์การมีอยู่ของสติปัญญาของมนุษย์โดยการแอบอ้างเป็นบุคคลโดยที่ฝ่ายหลังไม่รู้ว่าเขากำลังพูดกับเครื่องจักร
แนวทางการเรียนรู้ของเครื่องที่ได้รับความนิยมมากมายในปัจจุบันอิงตามแนวคิดที่มีมาหลายทศวรรษ แต่ทศวรรษที่ผ่านมาในด้านการประมวลผล (และแพลตฟอร์มการประมวลผลแบบกระจาย) ได้นำมาซึ่งพลังที่เพียงพอในการใช้อัลกอริธึมการเรียนรู้ของเครื่อง ส่วนใหญ่ต้องการการคูณเมทริกซ์และการคำนวณทางคณิตศาสตร์อื่นๆ จำนวนมาก เมื่อยี่สิบปีที่แล้วไม่มีเทคโนโลยีคอมพิวเตอร์ที่ยอมให้มีการคำนวณเช่นนี้ แต่ตอนนี้เทคโนโลยีเหล่านั้นได้กลายเป็นความจริงแล้ว อัลกอริธึมการเรียนรู้ของเครื่องช่วยให้โปรแกรมดำเนินการกระบวนการปรับปรุงคุณภาพและขยายขีดความสามารถโดยไม่ต้องมีการแทรกแซงจากมนุษย์ โปรแกรมที่พัฒนาโดยใช้การเรียนรู้ของเครื่องสามารถอัปเดตหรือขยายโค้ดของตัวเองได้อย่างอิสระ
การเรียนรู้แบบมีผู้สอน VS การเรียนรู้แบบไม่มีผู้สอน
การเรียนรู้แบบมีผู้สอนและแบบไม่มีผู้ดูแลเป็นสองแนวทางที่ได้รับความนิยมมากที่สุดในการเรียนรู้ของเครื่อง ทั้งสองตัวเลือกจำเป็นต้องป้อนบันทึกข้อมูลจำนวนมหาศาลให้กับเครื่องเพื่อสร้างความสัมพันธ์และเรียนรู้จาก ข้อมูลที่รวบรวมดังกล่าวมักเรียกว่า"
เวกเตอร์คุณลักษณะ" ตัวอย่างเช่น เรามีอาคารพักอาศัยแห่งหนึ่ง ในกรณีนี้ เวกเตอร์คุณลักษณะอาจมีคุณสมบัติต่างๆ เช่น พื้นที่รวมของบ้าน จำนวนห้อง ปีที่สร้างบ้าน และอื่นๆ
ในการเรียนรู้แบบมีผู้สอน อัลก อริธึมการเรียนรู้ของเครื่องได้รับการฝึกฝนให้ตอบคำถามที่เกี่ยวข้องกับเวกเตอร์ฟีเจอร์ เพื่อฝึกอัลกอริธึม ระบบจะป้อนชุดเวกเตอร์คุณลักษณะและป้ายกำกับที่เกี่ยวข้อง บุคคล (ครู) เป็นผู้จัดเตรียมป้ายกำกับที่เกี่ยวข้อง และมี "คำตอบ" ที่ถูกต้องสำหรับคำถามที่ถาม อัลกอริธึมการเรียนรู้จะวิเคราะห์เวกเตอร์คุณลักษณะและป้ายกำกับที่ถูกต้องเพื่อค้นหาโครงสร้างภายในและความสัมพันธ์ระหว่างเวกเตอร์เหล่านั้น วิธีนี้ทำให้เครื่องเรียนรู้ที่จะตอบคำถามได้อย่างถูกต้อง ตัวอย่างเช่น เราสามารถพิจารณาแอปพลิเคชั่นอัจฉริยะสำหรับการซื้อขายอสังหาริมทรัพย์ได้ สามารถฝึกได้โดยใช้เวกเตอร์คุณลักษณะ รวมถึงขนาด จำนวนห้อง และปีที่สร้างสำหรับชุดบ้าน บุคคลจะต้องกำหนดป้ายราคาบ้านที่ถูกต้องให้กับบ้านแต่ละหลังโดยพิจารณาจากปัจจัยเหล่านี้ ด้วยการวิเคราะห์ข้อมูลนี้ แอปพลิเคชันอัจฉริยะควรฝึกตัวเองให้ตอบคำถามที่ว่า “บ้านหลังนี้ฉันจะได้เงินเท่าไหร่”
เมื่อกระบวนการเตรียมการเสร็จสิ้น ข้อมูลอินพุตใหม่จะไม่ถูกทำเครื่องหมายอีกต่อไป เครื่องจักรจะต้องสามารถตอบคำถามได้อย่างถูกต้อง แม้จะเป็นเวกเตอร์ฟีเจอร์ที่ไม่รู้จักและไม่มีป้ายกำกับก็ตาม ในการเรียนรู้แบบไม่มีผู้ดูแล อัลกอริธึมได้รับการออกแบบมาเพื่อคาดเดาคำตอบโดยไม่ต้องมีป้ายกำกับโดยมนุษย์ (หรือแม้แต่ไม่ต้องถามคำถาม) แทนที่จะกำหนดป้ายกำกับหรือผลลัพธ์ อัลกอริธึมการเรียนรู้แบบไม่มีผู้ดูแลจะใช้ชุดข้อมูลขนาดใหญ่และพลังการประมวลผลเพื่อค้นหาความสัมพันธ์ที่ไม่รู้จักก่อนหน้านี้ ตัวอย่างเช่น ในการตลาดสินค้าอุปโภคบริโภค การเรียนรู้แบบไม่มีผู้ดูแลสามารถใช้เพื่อระบุความสัมพันธ์ที่ซ่อนอยู่หรือกลุ่มลูกค้า ซึ่งท้ายที่สุดสามารถช่วยปรับปรุงโปรแกรมการตลาดหรือสร้างโปรแกรมใหม่ได้ ในบทความนี้ เราจะเน้นไปที่การเรียนรู้ของเครื่องภายใต้การดูแล นี่เป็นแนวทางที่ใช้กันมากที่สุดในปัจจุบัน
การเรียนรู้ของเครื่องภายใต้การดูแล
การเรียนรู้ของเครื่องทั้งหมดขึ้นอยู่กับข้อมูล สำหรับโปรเจ็กต์แมชชีนเลิร์นนิงภายใต้การดูแล คุณจะต้องทำเครื่องหมายข้อมูลด้วยเครื่องหมายในลักษณะที่ให้คำตอบที่มีความหมายสำหรับคำถามที่ถูกถาม ด้านล่างในตารางที่ 1 บันทึกข้อมูลบ้านแต่ละหลังจะมีป้ายกำกับว่า "ราคาบ้าน" ด้วยการระบุความสัมพันธ์ระหว่างข้อมูลบันทึกและราคาของบ้าน อัลกอริธึมควรจะสามารถคาดการณ์ราคาตลาดสำหรับบ้านที่ไม่รวมอยู่ในรายการที่กำหนดได้ในที่สุด (โปรดทราบว่าพื้นที่ของบ้านระบุเป็นตารางเมตร และราคาบ้านเป็นสกุลเงินยูโร)
ตารางที่ 1. รายชื่อบ้าน
|
เข้าสู่ระบบ |
เข้าสู่ระบบ |
เข้าสู่ระบบ |
ฉลาก |
บริเวณบ้าน |
จำนวนห้องพัก |
อายุของบ้าน |
ราคาบ้านที่คาดหวัง |
90 ตร.ม. / 295 ฟุต |
2 ห้อง |
อายุ 23 ปี |
249,000 ยูโร |
101 ตร.ม. / 331 ฟุต |
3 ห้อง |
ไม่มี |
338,000 ยูโร |
1330 ตร.ม. / 4363 ฟุต |
11 ห้อง |
12 ปี |
6,500,000 ยูโร |
ในช่วงแรกๆ คุณอาจจะต้องติดป้ายกำกับข้อมูลด้วยตนเอง แต่ในที่สุด คุณจะสอนโปรแกรมให้ทำข้อมูลด้วยตัวเอง คุณอาจเคยเห็นวิธีการนี้ใช้ได้กับโปรแกรมรับส่งเมล โดยในการย้ายอีเมลไปยังโฟลเดอร์สแปม คุณจะต้องตอบคำถาม "อีเมลนี้เป็นสแปมหรือไม่" เมื่อคุณตอบกลับ คุณจะฝึกโปรแกรมให้จดจำอีเมลที่คุณไม่ต้องการเห็น ตัวกรองสแปมของแอปพลิเคชันได้รับการฝึกอบรมให้ทำเครื่องหมายข้อความจากแหล่งเดียวกันหรือมีเนื้อหาเดียวกัน และจัดการตามกฎที่เหมาะสม ชุดข้อมูลที่ติดป้ายกำกับจำเป็นสำหรับการเตรียมการและการทดสอบเท่านั้น เมื่อขั้นตอนนี้เสร็จสิ้น อัลกอริธึมการเรียนรู้ของเครื่องจะทำงานกับข้อมูลที่ไม่มีป้ายกำกับ ตัวอย่างเช่น คุณสามารถป้อนบันทึกข้อมูลใหม่ที่ไม่มีป้ายกำกับเกี่ยวกับบ้านให้กับอัลกอริธึมการทำนายได้ และควรคาดการณ์ราคาที่คาดหวังของบ้านโดยอัตโนมัติตาม "ความรู้" ที่ได้รับจากข้อมูลการเตรียมการ
เครื่องจักรเรียนรู้ที่จะทำนายได้อย่างไร
ความท้าทายของแมชชีนเลิร์นนิงภายใต้การดูแลคือการค้นหาฟังก์ชันการทำนายที่เหมาะสมสำหรับคำถามที่กำหนด ในทางคณิตศาสตร์ ความยากคือการหาฟังก์ชันที่รับตัวแปรเป็นอินพุต
х
และส่งคืนค่าที่คาดการณ์
у
ไว้ การทำงานของสมมติฐานนี้
(hθ)
เป็นผลมาจากกระบวนการเตรียมการ บ่อยครั้งที่ฟังก์ชันสมมติฐานเรียกอีกอย่างว่าฟังก์ชันวัตถุประสงค์หรือฟังก์ชันการทำนาย
y = ชั่วโมงθ (x)
ในกรณีส่วนใหญ่
х
จะเป็นอาร์เรย์ข้อมูล ในตัวอย่างของเรา นี่คืออาร์เรย์สองมิติขององค์ประกอบที่กำหนดบ้าน ซึ่งประกอบด้วยจำนวนห้องและพื้นที่ของบ้าน อาร์เรย์ของค่าดังกล่าวเป็นเวกเตอร์คุณลักษณะ ด้วยการระบุฟังก์ชันวัตถุประสงค์เฉพาะ เราสามารถใช้มันเพื่อทำนายเวกเตอร์คุณลักษณะแต่ละตัว
х
ได้ ในการทำนายราคาบ้าน คุณต้องเรียกใช้ฟังก์ชันวัตถุประสงค์โดยใช้เวกเตอร์คุณลักษณะ
{101.0, 3.0}
ซึ่งประกอบด้วยพื้นที่ของบ้านและจำนวนห้อง:
Function<Double[], Double> h = ...;
Double[] x = new Double[] { 101.0, 3.0 };
double y = h.apply(x);
ในซอร์สโค้ดจากตัวอย่างที่ 1 ค่าในอาร์เรย์
х
แสดงถึงเวกเตอร์ของคุณลักษณะเฮาส์ ค่า
у
ที่ส่งคืนโดยฟังก์ชันวัตถุประสงค์คือราคาที่คาดการณ์ไว้ของบ้าน เป้าหมายของการเรียนรู้ของเครื่องคือการกำหนดฟังก์ชันวัตถุประสงค์ที่จะทำงานได้อย่างถูกต้องที่สุดเท่าที่จะเป็นไปได้โดยพิจารณาจากพารามิเตอร์อินพุตที่ไม่รู้จัก
(hθ)
ในแมชชีนเลิร์น นิง บางครั้งเรียกว่าฟังก์ชันวัตถุประสงค์ในการเรียนรู้ของเครื่อง โมเดลนี้เป็นผลมาจากกระบวนการเรียนรู้
ตามตัวอย่างการฝึกอบรมที่มีป้ายกำกับ อัลกอริธึมการเรียนรู้จะค้นหาโครงสร้างหรือรูปแบบในข้อมูลการฝึกอบรม ดังนั้นจึงสร้างแบบจำลองที่ดีสำหรับข้อมูลโดยทั่วไป ตามกฎแล้ว กระบวนการเรียนรู้มีลักษณะเป็นการสำรวจ ในกรณีส่วนใหญ่ กระบวนการนี้จะทำซ้ำหลายครั้งโดยใช้อัลกอริธึมและการกำหนดค่าการเรียนรู้ที่แตกต่างกัน เป็นผลให้โมเดลทั้งหมดได้รับการประเมินตามเมตริกประสิทธิภาพ โดยเลือกโมเดลที่ดีที่สุดไว้ และแบบจำลองนี้ใช้ในการคำนวณค่าประมาณสำหรับข้อมูลที่ไม่ได้แท็กในอนาคต
การถดถอยเชิงเส้น
หากต้องการสอนเครื่องจักรให้ "คิด" คุณต้องเลือกอัลกอริทึมการเรียนรู้ที่คุณจะใช้ก่อน ตัวอย่างเช่น การถดถอยเชิงเส้น นี่เป็นหนึ่งในอัลกอริธึมการเรียนรู้ของเครื่องที่อยู่ภายใต้การดูแลที่ง่ายและได้รับความนิยมมากที่สุด อัลกอริทึมจะถือว่าความสัมพันธ์ระหว่างคุณลักษณะอินพุตและเครื่องหมายผลลัพธ์เป็นแบบเส้นตรง ฟังก์ชันการถดถอยเชิงเส้นทั่วไปด้านล่าง นี้จะส่งกลับค่าที่คาดการณ์ไว้โดยการรวมองค์ประกอบทั้งหมดของเวกเตอร์คุณลักษณะคูณด้วยพารามิเตอร์
θ
(ทีต้า) พารามิเตอร์นี้ใช้ในระหว่างกระบวนการฝึกเพื่อปรับหรือ "ปรับแต่ง" ฟังก์ชันการถดถอยตามข้อมูลการฝึก
ชั่วโมงθ (x) = θ 0 * 1 + θ 1 * x 1 + ... θ n * xn
ในฟังก์ชันการถดถอยเชิงเส้น พารามิเตอร์ทีต้าและพารามิเตอร์คุณลักษณะจะมีหมายเลขเป็นตัวห้อย ตัวห้อยจะกำหนดตำแหน่งของพารามิเตอร์
(θ)
และพารามิเตอร์คุณลักษณะ
(х)
ในเวกเตอร์ โปรดทราบว่าคุณลักษณะ x
0เป็นคำที่มีการเปลี่ยนแปลงคงที่และมีความสำคัญ
1
ต่อจุดประสงค์ในการคำนวณ เป็นผลให้ดัชนีของพารามิเตอร์ที่สำคัญเช่นพื้นที่ของบ้านเริ่มต้นด้วย x
1 . ดังนั้น หากกำหนดค่า x
1ให้กับเวกเตอร์คุณลักษณะ (พื้นที่บ้าน) แล้ว x
2จะใช้ค่าถัดไป (จำนวนห้อง) ไปเรื่อยๆ ตัวอย่างที่ 2 สาธิตการใช้งาน Java ของฟังก์ชันการถดถอยเชิงเส้น ซึ่งแสดงทางคณิตศาสตร์เป็น h
θ (x) เพื่อความง่าย การคำนวณจะดำเนินการโดยใช้
double
. ในเมธอด
apply()
มีเงื่อนไขว่าองค์ประกอบแรกของอาร์เรย์จะเท่ากับ 1.0 และจะถูกตั้งค่าไว้นอกฟังก์ชันนี้
ตัวอย่างที่ 2: การถดถอยเชิงเส้นใน 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) {
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);
}
}
หากต้องการสร้างอินสแตนซ์ใหม่คุณ
LinearRegressionFunction
ต้องระบุพารามิเตอร์
θ
พารามิเตอร์หรือเวกเตอร์นี้ใช้เพื่อปรับฟังก์ชันการถดถอยเชิงเส้นทั่วไปให้เข้ากับข้อมูลการฝึกพื้นฐาน พารามิเตอร์
θ
ที่ใช้ในโปรแกรมจะถูกปรับในระหว่างกระบวนการฝึกอบรมตามตัวอย่างการฝึกอบรม คุณภาพของฟังก์ชันเป้าหมายที่ได้รับการฝึกอบรมจะขึ้นอยู่กับคุณภาพของข้อมูลที่เตรียมไว้สำหรับการฝึกอบรม ในตัวอย่างด้านล่าง เราใช้
LinearRegressionFunction
การคาดการณ์ราคาตามขนาดของบ้านเพื่อแสดงให้เห็น เมื่อพิจารณาว่า x
0ต้องเป็นค่าคงที่ที่มีค่า 1.0 ฟังก์ชันวัตถุประสงค์จะเริ่มต้นได้โดยใช้พารามิเตอร์สองตัว
θ
โดยที่พารามิเตอร์เหล่านี้เป็นผลมาจากกระบวนการเรียนรู้ หลังจากสร้างตัวอย่างใหม่แล้ว จะทำนายราคาบ้าน พื้นที่ 1,330 ตารางเมตร ได้ดังนี้
double[] thetaVector = new double[] { 1.004579, 5.286822 };
LinearRegressionFunction targetFunction = new LinearRegressionFunction(thetaVector);
Double[] featureVector = new Double[] { 1.0, 1330.0 };
double predictedPrice = targetFunction.apply(featureVector);
ในรูปด้านล่าง คุณจะเห็นกราฟของฟังก์ชันวัตถุประสงค์การทำนาย (เส้นสีน้ำเงิน) ได้มาจากการคำนวณฟังก์ชันวัตถุประสงค์สำหรับค่าทั้งหมดของพื้นที่บ้าน แผนภูมินี้ยังมีคู่ราคา-พื้นที่ที่ใช้สำหรับการฝึกอีกด้วย
ตอนนี้กราฟทำนายดูค่อนข้างดี
θ { 1.004579, 5.286822 }
พิกัดของกราฟ (ตำแหน่งและความชัน) ถูกกำหนดโดยเวกเตอร์ แต่คุณจะทราบได้อย่างไรว่า
θ
-vector ใดที่เหมาะสมที่สุดสำหรับแอปพลิเคชันของคุณ ฟังก์ชั่นจะพอดีกว่าไหมหากคุณเปลี่ยนพารามิเตอร์ตัวแรกหรือตัวที่สอง ในการหาเวกเตอร์ทีต้าที่เหมาะสมที่สุด คุณต้องมีฟังก์ชันอรรถประโยชน์ที่จะประเมินว่าฟังก์ชันวัตถุประสงค์ทำงานได้ดีเพียงใด
ยังมี การแปล ต่อ จากภาษาอังกฤษ ผู้แต่ง: Gregor Roth สถาปนิกซอฟต์แวร์ JavaWorld
GO TO FULL VERSION