จะแปลงอินพุตและแยกเอาต์พุตที่มีประโยชน์ใน Neural Network ได้อย่างไร?


9

ดังนั้นฉันจึงพยายามที่จะเข้าใจเครือข่ายประสาทเทียมนับตั้งแต่ฉันเจอบล็อกของ Adam Geitgeyเกี่ยวกับการเรียนรู้ของเครื่อง ฉันอ่านมากที่สุดเท่าที่จะทำได้ในเรื่องนี้ (ที่ฉันสามารถเข้าใจได้) และเชื่อว่าฉันเข้าใจแนวคิดที่กว้างขวางทั้งหมดและผลงานบางส่วน (แม้จะอ่อนแอมากในวิชาคณิตศาสตร์) เซลล์ประสาทซินน้ำหนักน้ำหนักฟังก์ชั่นต้นทุน เป็นต้นอย่างไรก็ตามฉันไม่สามารถหาวิธีการแปลปัญหาในโลกแห่งความจริงเป็นโซลูชั่นเครือข่ายประสาท

ในกรณีนี้ Adam Geitgey ให้ตัวอย่างการใช้งานซึ่งเป็นระบบการทำนายราคาบ้านที่ได้รับชุดข้อมูลที่มีจำนวนห้องนอน , Sq ฟุต , พื้นที่ใกล้เคียงและราคาขายที่คุณสามารถฝึกอบรมเครือข่ายประสาทเพื่อให้สามารถคาดการณ์ราคาของบ้าน อย่างไรก็ตามเขาหยุดสั้น ๆ ของการนำโซลูชันที่เป็นไปได้ในรหัส ตัวอย่างที่ใกล้ที่สุดที่เขาได้รับคือพื้นฐานของฟังก์ชันที่แสดงให้เห็นว่าคุณใช้น้ำหนักอย่างไร:

def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
  price = 0

  # a little pinch of this
  price += num_of_bedrooms * 1.0

  # and a big pinch of that
  price += sqft * 1.0

  # maybe a handful of this
  price += neighborhood * 1.0

  # and finally, just a little extra salt for good measure
  price += 1.0

  return price 

แหล่งข้อมูลอื่น ๆ ดูเหมือนจะให้ความสำคัญกับคณิตศาสตร์มากขึ้นและเป็นเพียงตัวอย่างรหัสพื้นฐานเท่านั้นที่ฉันสามารถเข้าใจได้ (เช่นนั่นไม่ใช่การร้องเพลงบางส่วนรหัสฐานภาพการเต้นทั้งหมด) เป็นการใช้งานที่ฝึกอบรมเครือข่ายประสาทให้เป็น XOR เกทที่มีเฉพาะใน 1 และ 0

ดังนั้นจึงมีช่องว่างในความรู้ของฉันที่ฉันดูเหมือนจะไม่สามารถเชื่อม ถ้าเรากลับไปที่ปัญหาการทำนายราคาบ้านเราจะทำให้ข้อมูลที่เหมาะสมสำหรับการป้อนเข้าสู่เครือข่ายประสาทได้หรือไม่? ตัวอย่างเช่น:

  • จำนวนห้องนอน: 3
  • ตรว ฟุต: 2000
  • ย่าน: Normaltown
  • ราคาขาย: $ 250,000

คุณสามารถป้อน3และ2000โดยตรงไปยังเครือข่ายประสาทเนื่องจากตัวเลข หรือคุณต้องการแปลงให้เป็นอย่างอื่น ในทำนองเดียวกันสิ่งที่เกี่ยวกับค่าNormaltownนั่นคือสตริงคุณจะแปลค่าเป็นเครือข่ายประสาทที่เข้าใจได้อย่างไร คุณสามารถเลือกตัวเลขเช่นดัชนีตราบใดที่มันสอดคล้องกันตลอดทั้งข้อมูล?

ตัวอย่างเครือข่ายประสาทส่วนใหญ่ที่ฉันเห็นตัวเลขที่ผ่านระหว่างเลเยอร์เป็น 0 ถึง 1 หรือ -1 ถึง 1 ดังนั้นในตอนท้ายของการประมวลผลคุณจะแปลงค่าผลลัพธ์เป็นสิ่งที่ใช้งานได้เช่น$ 185,000 ได้อย่างไร

ฉันรู้ว่าตัวอย่างการทำนายราคาบ้านอาจไม่ใช่ปัญหาที่มีประโยชน์อย่างยิ่งเนื่องจากมันถูกปรับให้ใหญ่เกินจริงไปยังจุดข้อมูลเพียงสามจุด แต่ฉันแค่รู้สึกว่าถ้าฉันสามารถเอาชนะอุปสรรค์นี้และเขียนแอพพื้นฐานที่ฝึกการใช้ข้อมูลจริงหลอกและคายคำตอบหลอกในชีวิตจริงกว่าฉันจะหักด้านหลังของมันและสามารถเตะได้ เปิดและศึกษาเพิ่มเติมเกี่ยวกับการเรียนรู้ของเครื่อง

คำตอบ:


10

นี่เป็นคำถามที่ดีที่ฉันปล้ำกับตัวเองเมื่อพยายามรหัส ANN

ด้านล่างนี้เป็นโซลูชันที่มีวัตถุประสงค์ทั่วไปที่ดีและเป็นสิ่งที่ฉันใช้ในรหัสของฉันเพื่อพยายามทำนายข้อมูลตัวเลขที่มีพฤติกรรมดี หากข้อมูลของคุณมีพฤติกรรมไม่ดี (เช่นเต็มไปด้วยค่าผิดพลาด) คุณอาจต้องทำงานให้มากขึ้นเพื่อทำให้อินพุตและเอาต์พุตเป็นปกติ บางส่วนของวิธีการที่สูงขึ้นจะมีคำอธิบายที่นี่

หมายเหตุ: ฉันจะสมมติว่าคุณใช้ f (x) = tanh (x) เป็นฟังก์ชันการเปิดใช้งานของคุณ หากคุณไม่เป็นเช่นนั้นคุณควรจะสามารถให้เหตุผลเกี่ยวกับวิธีการทำให้ข้อมูลของคุณเป็นปกติหลังจากอ่านข้อความนี้

วิธีเตรียมข้อมูลอินพุต:

แนวคิดพื้นฐานคือคุณต้องการให้การเปลี่ยนแปลงที่สำคัญในแต่ละพารามิเตอร์อินพุตถูกสะท้อนโดยการเปลี่ยนแปลงที่สำคัญในการเปิดใช้งานของเซลล์ประสาทอินพุตเหล่านั้นจะถูกป้อนเข้า โดยการดูพล็อตของอนุพันธ์ของฟังก์ชันแอคทิวิชัน tanh (x) คุณจะเห็นว่าพื้นที่ของความชันที่สำคัญอยู่ในระยะทางหนึ่งหรือสองจุดจากจุดกำเนิด ซึ่งหมายความว่าข้อมูลเข้าสู่ฟังก์ชั่นการเปิดใช้งานเป็น 2000 หรือ 3000 (ค่าของ x ซึ่งอนุพันธ์นั้นมีขนาดเล็กอย่างไม่ได้ตั้งใจ) ผลลัพธ์ของการเปิดใช้งานจะเหมือนกันเกือบ ... ดังนั้นสถานะของเซลล์ประสาทของคุณจะเป็นอิสระจากความแตกต่างระหว่าง 2000 และ 3000 และเครือข่ายของคุณจะไม่สร้างพลังการทำนายใด ๆ จากค่าในช่วงนั้น

ดังนั้นหากคุณต้องการใส่ภาพสแควร์ของบ้านเข้าไปในเซลล์ประสาทคุณจะต้องทำให้สแควร์สเตจเป็นมาตรฐานเพื่อให้เครือข่ายสามารถบอกความแตกต่างระหว่าง 2000 และ 3000 วิธีหนึ่งในการทำเช่นนี้เพื่อให้รูปแบบที่สำคัญทั้งหมดของคุณ ข้อมูลที่ 'สังเกต' โดยเซลล์ประสาทคือz- คะแนน - ทำให้อินพุตปกติ

  • รวบรวมค่าวิดีโอฟุตสแควร์ทั้งหมดของคุณ (จากชุดการฝึกอบรมของคุณ) และคำนวณค่าเฉลี่ยและส่วนเบี่ยงเบนมาตรฐาน เก็บค่าเฉลี่ยและส่วนเบี่ยงเบนมาตรฐานคุณจะต้องใช้ข้อมูลนี้เพื่อทำให้ค่าวิดีโอฟุตสแควร์เป็นปกติเมื่อทำการทดสอบ

  • ปกติเวกเตอร์ของค่าตารางฟุตโดยหักค่าเฉลี่ยแล้วหารผลโดยค่าเบี่ยงเบนมาตรฐาน (การดำเนินงานทั้งหมดองค์ประกอบที่ชาญฉลาดของหลักสูตร) การลบค่าเฉลี่ยศูนย์ข้อมูลของคุณที่แหล่งกำเนิดและหารด้วยค่าเบี่ยงเบนมาตรฐานทำให้แน่ใจว่าส่วนใหญ่อยู่ระหว่าง -1 และ 1 โดยที่การส่งออกของเซลล์ประสาทมีความไวต่ออินพุตมากที่สุด นี้เรียกว่า Z-คะแนนฟื้นฟูเนื่องจากค่าการป้อนข้อมูลแต่ละจะถูกแทนที่ด้วยของZ-คะแนน

  • ทำข้างต้นสำหรับตัวแปรอินพุตแต่ละตัว

ตอนนี้เมื่อคุณใส่ค่าอินพุตแต่ละค่าผ่านทางเซลล์ประสาทเอาต์พุตของเซลล์ประสาทคือการเปิดใช้งานระหว่าง -1 และ 1 (ดูที่ภาพของ tanh (x)) เนื่องจากสิ่งนี้อยู่ในช่วง 'ไว' ของฟังก์ชั่นการเปิดใช้งานคุณไม่จำเป็นต้องกังวลเกี่ยวกับการเปลี่ยนแปลงเอาต์พุตของเซลล์ประสาทอินพุตเลเยอร์ก่อนส่งไปยังเลเยอร์ที่ซ่อนอยู่แรก เพียงแค่ให้เลเยอร์เลเยอร์ใด ๆ ที่ซ่อนอยู่ส่งออกของเลเยอร์ก่อนหน้าโดยตรงพวกเขาจะสามารถจัดการพวกมันได้ดี

เมื่อคุณไปถึงเลเยอร์สุดท้าย (เซลล์ประสาทเอาท์พุท) สิ่งที่คุณได้รับคือการเปิดใช้งานอีกครั้งระหว่าง -1 และ 1 คุณต้องแปลงกลับเป็นค่าสำหรับบ้านที่มีปัญหาไม่ว่าจะใช้ค่านั้นเป็น การทำนายในชุดทดสอบหรือเพื่อคำนวณข้อผิดพลาดระหว่างการฝึก อย่างไรก็ตามคุณทำเช่นนี้คุณจะต้องมีความสอดคล้องและใช้ขั้นตอนการทำให้ปกติในการฝึกอบรมและการทดสอบ วิธีหนึ่งที่จะคิดเกี่ยวกับมันคือ: เมื่อเซลล์ประสาทขาออกส่งคืน 1 หมายความว่าเครือข่ายกำลังคืนค่าเฮ้าส์ที่เป็นไปได้สูงสุดตามการคาดการณ์ มูลค่าสูงสุดที่เครือข่ายคาดการณ์ไว้ควรเป็นเท่าใด วิธีการที่เหมาะสมที่นี่ก็ขึ้นอยู่กับใบสมัครของคุณ นี่คือสิ่งที่ฉันทำ:

  • คำนวณค่าเฉลี่ยของตัวแปรผลลัพธ์ [the / each] แล้วเก็บไว้
  • คำนวณค่าเบี่ยงเบนสูงสุดของตัวแปรเอาต์พุตจากค่าเฉลี่ย งูหลาม:MaxDev = max([abs(DataPoint-numpy.mean(TrainingData)) for DataPoint in TrainingData])
  • เมื่อเครือข่ายส่งคืนเอาต์พุตระหว่าง -1 ถึง 1 ให้คูณผลลัพธ์ด้วยMaxDevและเพิ่มลงในค่าเฉลี่ย

การตรวจสอบด่วนแบบพื้นฐานสองประการที่คุณสามารถทำได้เพื่อดูว่ารูปแบบการปรับสภาพการทำให้เป็นปกติของคุณนั้นเหมาะสมหรือไม่ (จำเป็น แต่อาจมีเงื่อนไขไม่เพียงพอ):

  1. หากค่าอินพุตทั้งหมดเป็นค่าเฉลี่ย (เช่นค่าเฉลี่ยของห้องนอน, ค่าเฉลี่ยของตารางฟุต, ฯลฯ ) เอาต์พุตของเครือข่ายจะเท่ากับค่าเฉลี่ยของตัวแปรเอาต์พุต (เช่นค่าบ้าน) หรือไม่ (มันควรจะเป็น.)
  2. หากค่าอินพุตทั้งหมดสูงผิดปกติ / ต่ำเอาต์พุตของเครือข่ายสูงผิดปกติ / ต่ำเช่นกันหรือไม่? (ใช้งานได้เฉพาะในกรณีที่อินพุตทั้งหมดมีความสัมพันธ์เชิงบวกกับเอาต์พุต ... หากบางรายการมีความสัมพันธ์แบบผกผันคุณจะต้องคิดอีกเล็กน้อย)

สังเกตว่ารูปแบบที่ปรากฏที่นี่ตรงตามเงื่อนไขทั้งสองนี้

ขอให้สังเกตว่ารูปแบบนี้จะช่วยให้เครือข่ายของคุณคาดการณ์ค่าบ้านได้เฉพาะในช่วงค่าบ้านในชุดข้อมูลการฝึกอบรมของคุณ พฤติกรรมนี้อาจเป็นที่ต้องการหรือไม่พึงปรารถนาทั้งนี้ขึ้นอยู่กับแอปพลิเคชัน

ตัวอย่างเช่นคุณอาจต้องการให้เครือข่ายของคุณคาดการณ์ค่าเฮ้าส์ติดลบเป็นไปไม่ได้ ลองคิดดูว่าคุณจะทำสิ่งนี้อย่างไร ยกเลิกการทำให้เอาต์พุตปกติเพื่อให้ -1 ถูกแม็พกับ 0

หากคุณต้องการตั้งค่าไม่ จำกัด ค่าที่เครือข่ายของคุณสามารถทำนายได้คุณสามารถเรียกใช้เอาต์พุตของเครือข่ายผ่านฟังก์ชันที่แมปช่วง [-1,1] กับจำนวนจริงทั้งหมด ... เช่น arctanh (x)! ตราบใดที่คุณทำเช่นนี้ในระหว่างการฝึกอบรมเครือข่ายของคุณจะปรับน้ำหนักเพื่อรองรับสิ่งนี้

ฉันหวังว่านี่จะเป็นประโยชน์ แจ้งให้เราทราบหากคุณมีคำถามเพิ่มเติม โมดูล ANN ของฉันอยู่ใน Python ดังนั้นฉันอาจมีคำแนะนำเฉพาะภาษา


มันมีประโยชน์มาก! ทุกบล็อก / กวดวิชาที่ฉันเจอดูเหมือนจะหลีกเลี่ยง (เกือบเจตนา) อธิบายกระบวนการนี้ แต่ใช่ว่าเหมาะสมทั้งหมด ต้องใช้เวลาสักครู่ก่อนที่จะแยกย่อยอย่างถูกต้อง แต่ฉันจะกลับมาอีกครั้งหากฉันมีคำถามติดตาม จำเป็นมาก!
เดวิด

ดังนั้นคำถามสองสามข้อ หากตร. ข้อมูลการฝึกอบรมฟุตคือ {2000, 800, 850, 550, 2000} จากนั้นค่าคะแนน z ของฉันสำหรับ {1900, 1500, 600} จะเป็น (หากฉันคำนวณอย่างถูกต้อง) {1.0496, 0.4134, -1.0177} ดังนั้นหนึ่งในค่าเหล่านั้นคือ> 1 และหนึ่งคือ <-1 ฉันจะทำอะไรกับค่าเหล่านั้น ป้อนข้อมูลเหล่านั้นลงในโหนดเลเยอร์อินพุตโดยไม่คำนึงถึงหรือปัดเศษเป็น 1 & -1 เหตุใด 1900 และ 600 จึงสร้างค่าเหล่านั้นเมื่ออยู่ในช่วง 550 - 2000 นี่เป็นเพียงเคล็ดลับของข้อมูลเพราะมีชุดข้อมูลขนาดเล็กเช่นนี้หรือไม่
เดวิด

เกี่ยวกับการปรับสภาพเลเยอร์เอาท์พุทฉันมีอย่างถูกต้องหรือไม่ว่าคุณจะพล็อตเอาท์พุตเป็นค่า min และ max? ดังนั้นหากค่าต่ำสุดคือ0andเสื้อชั่วโมงอีม.axผมม.ยูม.100 และผลลัพธ์เป็นศูนย์ (สมมติว่า -1 ถึง 1) แล้วนั่นแปลว่า $ 50?
เดวิด

โปรดจำไว้ว่าอินพุตไม่จำเป็นต้องเข้มงวดระหว่าง 1 ถึง -1 สิ่งที่คุณต้องการสำหรับอินพุตคือข้อมูลส่วนใหญ่อยู่ในช่วงนั้น ค่าที่มากกว่าหรือน้อยกว่าหนึ่งหมายความว่าจุดนั้นมีค่าเบี่ยงเบนมาตรฐานมากกว่าหนึ่งค่าจากค่าเฉลี่ยดังนั้นจุดนั้นจะอยู่ใกล้กับจุดสิ้นสุดของข้อมูลที่สูงกว่า มันควรจะเป็นเรื่องยากสำหรับข้อมูลของคุณที่จะออกไปข้างนอก [-1, 1] และยิ่งยากที่จะออกไปข้างนอก [-2, 2] และหายากมากที่จะออกไปข้างนอก [-3, 3] ดู tanh (x) แล้วคุณจะเห็นว่าช่วงไวไม่ได้อยู่ระหว่าง -1 ถึง 1 เท่านั้น แต่จะไกลออกไปกว่านั้น
Marko Bakić

เกี่ยวกับการเอาท์พุทเอาท์พุทการถอดเปลี่ยน min-max นั่นคือสิ่งที่ฉันทำในการนำไปใช้และการตีความของคุณถูกต้อง แต่คุณไม่จำเป็นต้องทำเช่นนั้น คุณสามารถสร้างมันขึ้นมาเพื่อให้ 1 สอดคล้องกับค่าเฮาส์สูงสุดเป็นสองเท่านั่นคือวิธีที่เครือข่ายของคุณจะสามารถคาดการณ์มูลค่าบ้านได้เหนือสิ่งที่คุณฝึกมา
Marko Bakić
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.