JavaRush /จาวาบล็อก /Random-TH /การเรียนรู้ของเครื่องสำหรับนักพัฒนา Java ตอนที่ 1

การเรียนรู้ของเครื่องสำหรับนักพัฒนา Java ตอนที่ 1

เผยแพร่ในกลุ่ม
ตั้งค่าอัลกอริธึมแมชชีนเลิร์นนิงและพัฒนาฟังก์ชันการคาดเดาแรกของคุณโดยใช้ Java รถยนต์ไร้คนขับ ระบบจดจำใบหน้า และระบบสั่งงานด้วยเสียงล้วนได้รับการพัฒนาโดยใช้เทคโนโลยีและเฟรมเวิร์กการเรียนรู้ของเครื่อง และนี่เป็นเพียงคลื่นลูกแรกเท่านั้น ในอีก 10 ปีข้างหน้า ผลิตภัณฑ์รุ่นใหม่จะเปลี่ยนโลกของเรา ก่อให้เกิดแนวทางใหม่ในการพัฒนาโปรแกรม ผลิตภัณฑ์ และแอปพลิเคชัน การเรียนรู้ของเครื่องสำหรับนักพัฒนา Java ตอนที่ 1 - 1ในฐานะโปรแกรมเมอร์ Java คุณต้องการที่จะจับกระแสนี้เนื่องจากบริษัทเทคโนโลยีเริ่มลงทุนมหาศาลในการเรียนรู้ของเครื่อง สิ่งที่คุณเรียนรู้วันนี้คุณสามารถใช้ไปได้อีกห้าปีข้างหน้า แต่จะเริ่มต้นที่ไหน? บทความนี้มีวัตถุประสงค์เพื่อตอบคำถามนี้ คุณจะได้รับความประทับใจครั้งแรกเกี่ยวกับหลักการของแมชชีนเลิร์นนิงโดยทำตามคำแนะนำสั้นๆ ของเราในการนำไปใช้และเตรียมอัลกอริทึมแมชชีนเลิร์นนิง หลังจากเรียนรู้เกี่ยวกับโครงสร้างของอัลกอริธึมการเรียนรู้และฟีเจอร์ที่คุณสามารถใช้เพื่อฝึกฝน ประเมิน และเลือกฟังก์ชันที่ให้ความแม่นยำในการทำนายที่ดีที่สุด คุณจะได้รับความเข้าใจเกี่ยวกับวิธีการใช้เฟรมเวิร์ก JVM (Weka) สร้างโซลูชันแมชชีนเลิร์นนิง บทความนี้มุ่งเน้นไปที่การเรียนรู้ของเครื่องภายใต้การดูแล เนื่องจากเป็นหลักการที่ใช้บ่อยที่สุดในการพัฒนาแอปพลิเคชันอัจฉริยะ

การเรียนรู้ของเครื่องและปัญญาประดิษฐ์

การเรียนรู้ของเครื่องพัฒนามาจากสาขาปัญญาประดิษฐ์ ซึ่งมีจุดมุ่งหมายเพื่อสร้างเครื่องจักรที่สามารถเลียนแบบสติปัญญาของมนุษย์ได้ แม้ว่าคำว่า "การเรียนรู้ของเครื่อง" จะมีต้นกำเนิดมาจากวิทยาการคอมพิวเตอร์ แต่ปัญญาประดิษฐ์ก็ไม่ใช่สาขาวิทยาศาสตร์ใหม่ การทดสอบทัวริงพัฒนาโดยนักคณิตศาสตร์ อลัน ทัวริง ในช่วงต้นทศวรรษที่ 50 ของศตวรรษที่ 20 เป็นหนึ่งในการทดสอบแรกๆ ที่ออกแบบมาเพื่อตรวจสอบว่าเครื่องคอมพิวเตอร์มีความฉลาดที่แท้จริงหรือไม่ จากการทดสอบของทัวริง คอมพิวเตอร์พิสูจน์การมีอยู่ของสติปัญญาของมนุษย์โดยการแอบอ้างเป็นบุคคลโดยที่ฝ่ายหลังไม่รู้ว่าเขากำลังพูดกับเครื่องจักร
การเรียนรู้ของเครื่องสำหรับนักพัฒนา Java ตอนที่ 1 - 2
แนวทางการเรียนรู้ของเครื่องที่ได้รับความนิยมมากมายในปัจจุบันอิงตามแนวคิดที่มีมาหลายทศวรรษ แต่ทศวรรษที่ผ่านมาในด้านการประมวลผล (และแพลตฟอร์มการประมวลผลแบบกระจาย) ได้นำมาซึ่งพลังที่เพียงพอในการใช้อัลกอริธึมการเรียนรู้ของเครื่อง ส่วนใหญ่ต้องการการคูณเมทริกซ์และการคำนวณทางคณิตศาสตร์อื่นๆ จำนวนมาก เมื่อยี่สิบปีที่แล้วไม่มีเทคโนโลยีคอมพิวเตอร์ที่ยอมให้มีการคำนวณเช่นนี้ แต่ตอนนี้เทคโนโลยีเหล่านั้นได้กลายเป็นความจริงแล้ว อัลกอริธึมการเรียนรู้ของเครื่องช่วยให้โปรแกรมดำเนินการกระบวนการปรับปรุงคุณภาพและขยายขีดความสามารถโดยไม่ต้องมีการแทรกแซงจากมนุษย์ โปรแกรมที่พัฒนาโดยใช้การเรียนรู้ของเครื่องสามารถอัปเดตหรือขยายโค้ดของตัวเองได้อย่างอิสระ

การเรียนรู้แบบมีผู้สอน VS การเรียนรู้แบบไม่มีผู้สอน

การเรียนรู้แบบมีผู้สอนและแบบไม่มีผู้ดูแลเป็นสองแนวทางที่ได้รับความนิยมมากที่สุดในการเรียนรู้ของเครื่อง ทั้งสองตัวเลือกจำเป็นต้องป้อนบันทึกข้อมูลจำนวนมหาศาลให้กับเครื่องเพื่อสร้างความสัมพันธ์และเรียนรู้จาก ข้อมูลที่รวบรวมดังกล่าวมักเรียกว่า" เวกเตอร์คุณลักษณะ" ตัวอย่างเช่น เรามีอาคารพักอาศัยแห่งหนึ่ง ในกรณีนี้ เวกเตอร์คุณลักษณะอาจมีคุณสมบัติต่างๆ เช่น พื้นที่รวมของบ้าน จำนวนห้อง ปีที่สร้างบ้าน และอื่นๆ ในการเรียนรู้แบบมีผู้สอน อัลก อริธึมการเรียนรู้ของเครื่องได้รับการฝึกฝนให้ตอบคำถามที่เกี่ยวข้องกับเวกเตอร์ฟีเจอร์ เพื่อฝึกอัลกอริธึม ระบบจะป้อนชุดเวกเตอร์คุณลักษณะและป้ายกำกับที่เกี่ยวข้อง บุคคล (ครู) เป็นผู้จัดเตรียมป้ายกำกับที่เกี่ยวข้อง และมี "คำตอบ" ที่ถูกต้องสำหรับคำถามที่ถาม อัลกอริธึมการเรียนรู้จะวิเคราะห์เวกเตอร์คุณลักษณะและป้ายกำกับที่ถูกต้องเพื่อค้นหาโครงสร้างภายในและความสัมพันธ์ระหว่างเวกเตอร์เหล่านั้น วิธีนี้ทำให้เครื่องเรียนรู้ที่จะตอบคำถามได้อย่างถูกต้อง ตัวอย่างเช่น เราสามารถพิจารณาแอปพลิเคชั่นอัจฉริยะสำหรับการซื้อขายอสังหาริมทรัพย์ได้ สามารถฝึกได้โดยใช้เวกเตอร์คุณลักษณะ รวมถึงขนาด จำนวนห้อง และปีที่สร้างสำหรับชุดบ้าน บุคคลจะต้องกำหนดป้ายราคาบ้านที่ถูกต้องให้กับบ้านแต่ละหลังโดยพิจารณาจากปัจจัยเหล่านี้ ด้วยการวิเคราะห์ข้อมูลนี้ แอปพลิเคชันอัจฉริยะควรฝึกตัวเองให้ตอบคำถามที่ว่า “บ้านหลังนี้ฉันจะได้เงินเท่าไหร่”
สนใจอ่านเกี่ยวกับ Java หรือไม่? เข้าร่วม กลุ่ม นักพัฒนา Java !
เมื่อกระบวนการเตรียมการเสร็จสิ้น ข้อมูลอินพุตใหม่จะไม่ถูกทำเครื่องหมายอีกต่อไป เครื่องจักรจะต้องสามารถตอบคำถามได้อย่างถูกต้อง แม้จะเป็นเวกเตอร์ฟีเจอร์ที่ไม่รู้จักและไม่มีป้ายกำกับก็ตาม ในการเรียนรู้แบบไม่มีผู้ดูแล อัลกอริธึมได้รับการออกแบบมาเพื่อคาดเดาคำตอบโดยไม่ต้องมีป้ายกำกับโดยมนุษย์ (หรือแม้แต่ไม่ต้องถามคำถาม) แทนที่จะกำหนดป้ายกำกับหรือผลลัพธ์ อัลกอริธึมการเรียนรู้แบบไม่มีผู้ดูแลจะใช้ชุดข้อมูลขนาดใหญ่และพลังการประมวลผลเพื่อค้นหาความสัมพันธ์ที่ไม่รู้จักก่อนหน้านี้ ตัวอย่างเช่น ในการตลาดสินค้าอุปโภคบริโภค การเรียนรู้แบบไม่มีผู้ดูแลสามารถใช้เพื่อระบุความสัมพันธ์ที่ซ่อนอยู่หรือกลุ่มลูกค้า ซึ่งท้ายที่สุดสามารถช่วยปรับปรุงโปรแกรมการตลาดหรือสร้างโปรแกรมใหม่ได้ ในบทความนี้ เราจะเน้นไปที่การเรียนรู้ของเครื่องภายใต้การดูแล นี่เป็นแนวทางที่ใช้กันมากที่สุดในปัจจุบัน

การเรียนรู้ของเครื่องภายใต้การดูแล

การเรียนรู้ของเครื่องทั้งหมดขึ้นอยู่กับข้อมูล สำหรับโปรเจ็กต์แมชชีนเลิร์นนิงภายใต้การดูแล คุณจะต้องทำเครื่องหมายข้อมูลด้วยเครื่องหมายในลักษณะที่ให้คำตอบที่มีความหมายสำหรับคำถามที่ถูกถาม ด้านล่างในตารางที่ 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}ซึ่งประกอบด้วยพื้นที่ของบ้านและจำนวนห้อง:
// целевая функция h (результат процесса обучения)
Function<Double[], Double> h = ...;

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

// и предсказываем цену дома (метка)
double y = h.apply(x);
ในซอร์สโค้ดจากตัวอย่างที่ 1 ค่าในอาร์เรย์хแสดงถึงเวกเตอร์ของคุณลักษณะเฮาส์ ค่าуที่ส่งคืนโดยฟังก์ชันวัตถุประสงค์คือราคาที่คาดการณ์ไว้ของบ้าน เป้าหมายของการเรียนรู้ของเครื่องคือการกำหนดฟังก์ชันวัตถุประสงค์ที่จะทำงานได้อย่างถูกต้องที่สุดเท่าที่จะเป็นไปได้โดยพิจารณาจากพารามิเตอร์อินพุตที่ไม่รู้จัก (hθ)ในแมชชีนเลิร์น นิง บางครั้งเรียกว่าฟังก์ชันวัตถุประสงค์ในการเรียนรู้ของเครื่อง โมเดลนี้เป็นผลมาจากกระบวนการเรียนรู้
การเรียนรู้ของเครื่องสำหรับนักพัฒนา Java ตอนที่ 1 - 3
ตามตัวอย่างการฝึกอบรมที่มีป้ายกำกับ อัลกอริธึมการเรียนรู้จะค้นหาโครงสร้างหรือรูปแบบในข้อมูลการฝึกอบรม ดังนั้นจึงสร้างแบบจำลองที่ดีสำหรับข้อมูลโดยทั่วไป ตามกฎแล้ว กระบวนการเรียนรู้มีลักษณะเป็นการสำรวจ ในกรณีส่วนใหญ่ กระบวนการนี้จะทำซ้ำหลายครั้งโดยใช้อัลกอริธึมและการกำหนดค่าการเรียนรู้ที่แตกต่างกัน เป็นผลให้โมเดลทั้งหมดได้รับการประเมินตามเมตริกประสิทธิภาพ โดยเลือกโมเดลที่ดีที่สุดไว้ และแบบจำลองนี้ใช้ในการคำนวณค่าประมาณสำหรับข้อมูลที่ไม่ได้แท็กในอนาคต

การถดถอยเชิงเส้น

หากต้องการสอนเครื่องจักรให้ "คิด" คุณต้องเลือกอัลกอริทึมการเรียนรู้ที่คุณจะใช้ก่อน ตัวอย่างเช่น การถดถอยเชิงเส้น นี่เป็นหนึ่งในอัลกอริธึมการเรียนรู้ของเครื่องที่อยู่ภายใต้การดูแลที่ง่ายและได้รับความนิยมมากที่สุด อัลกอริทึมจะถือว่าความสัมพันธ์ระหว่างคุณลักษณะอินพุตและเครื่องหมายผลลัพธ์เป็นแบบเส้นตรง ฟังก์ชันการถดถอยเชิงเส้นทั่วไปด้านล่าง นี้จะส่งกลับค่าที่คาดการณ์ไว้โดยการรวมองค์ประกอบทั้งหมดของเวกเตอร์คุณลักษณะคูณด้วยพารามิเตอร์θ (ทีต้า) พารามิเตอร์นี้ใช้ในระหว่างกระบวนการฝึกเพื่อปรับหรือ "ปรับแต่ง" ฟังก์ชันการถดถอยตามข้อมูลการฝึก
ชั่วโมงθ (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) {
 // с целью упрощения вычислений первый элемент должен быть 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);
 }
}
หากต้องการสร้างอินสแตนซ์ใหม่คุณLinearRegressionFunctionต้องระบุพารามิเตอร์ θพารามิเตอร์หรือเวกเตอร์นี้ใช้เพื่อปรับฟังก์ชันการถดถอยเชิงเส้นทั่วไปให้เข้ากับข้อมูลการฝึกพื้นฐาน พารามิเตอร์θที่ใช้ในโปรแกรมจะถูกปรับในระหว่างกระบวนการฝึกอบรมตามตัวอย่างการฝึกอบรม คุณภาพของฟังก์ชันเป้าหมายที่ได้รับการฝึกอบรมจะขึ้นอยู่กับคุณภาพของข้อมูลที่เตรียมไว้สำหรับการฝึกอบรม ในตัวอย่างด้านล่าง เราใช้LinearRegressionFunctionการคาดการณ์ราคาตามขนาดของบ้านเพื่อแสดงให้เห็น เมื่อพิจารณาว่า x 0ต้องเป็นค่าคงที่ที่มีค่า 1.0 ฟังก์ชันวัตถุประสงค์จะเริ่มต้นได้โดยใช้พารามิเตอร์สองตัวθโดยที่พารามิเตอร์เหล่านี้เป็นผลมาจากกระบวนการเรียนรู้ หลังจากสร้างตัวอย่างใหม่แล้ว จะทำนายราคาบ้าน พื้นที่ 1,330 ตารางเมตร ได้ดังนี้
// тета вектор, используемый в этом примере, является результатом процесса обучения
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);
ในรูปด้านล่าง คุณจะเห็นกราฟของฟังก์ชันวัตถุประสงค์การทำนาย (เส้นสีน้ำเงิน) ได้มาจากการคำนวณฟังก์ชันวัตถุประสงค์สำหรับค่าทั้งหมดของพื้นที่บ้าน แผนภูมินี้ยังมีคู่ราคา-พื้นที่ที่ใช้สำหรับการฝึกอีกด้วย
การเรียนรู้ของเครื่องสำหรับนักพัฒนา Java ตอนที่ 1 - 4
ตอนนี้กราฟทำนายดูค่อนข้างดี θ { 1.004579, 5.286822 }พิกัดของกราฟ (ตำแหน่งและความชัน) ถูกกำหนดโดยเวกเตอร์ แต่คุณจะทราบได้อย่างไรว่าθ-vector ใดที่เหมาะสมที่สุดสำหรับแอปพลิเคชันของคุณ ฟังก์ชั่นจะพอดีกว่าไหมหากคุณเปลี่ยนพารามิเตอร์ตัวแรกหรือตัวที่สอง ในการหาเวกเตอร์ทีต้าที่เหมาะสมที่สุด คุณต้องมีฟังก์ชันอรรถประโยชน์ที่จะประเมินว่าฟังก์ชันวัตถุประสงค์ทำงานได้ดีเพียงใด ยังมี การแปล ต่อ จากภาษาอังกฤษ ผู้แต่ง: Gregor Roth สถาปนิกซอฟต์แวร์ JavaWorld
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION