เครือข่ายเดียว
เครือข่ายเดียวสำหรับภาพวาดและบทสนทนาทั้งหมด
เครือข่ายจริงที่สร้างขึ้นที่นี่และฝึกฝนที่นี่: ทั้งชิ้นส่วนของภาพวาด ความลึกที่สีสื่อออกมา และทุกตัวอักษรของการสนทนานี้ ในพื้นที่แบ่งปันหนึ่งเดียว ไม่มีการฝึกฝนมาก่อน (pre-trained)
ภาพวาด ทีละส่วน
เครือข่ายจะมองภาพวาดเป็นส่วนเล็กๆ ซึ่งแต่ละส่วนจะมีแสง สี และตำแหน่งของตัวเอง และเรียนรู้คำเหล่านั้น น้ำหนักชุดเดียวกันนี้จะใช้อ่านตัวอักษรของเส้นด้าย
- ขั้นตอนที่ฝึกฝนแล้ว
- 0
- ข้อผิดพลาดของภาพ
- —
- ข้อผิดพลาดของตัวอักษร
- —
- ข้อผิดพลาดด้านความลึก
- —
- ชิ้นส่วนสีที่ค้นหาคำของตนพบ
- —
- ชิ้นส่วนของสี
- 0
- คำในพื้นที่ของมัน
- 0
- ตัวอักษรที่เรียนรู้แล้ว
- 0
- ตัวอักษรที่รู้จัก
- 0
คำที่มันเรียนรู้คือสิ่งที่สีสามารถสอนได้: ความสว่างของส่วนนั้น สีอะไร และอยู่ที่ไหน ส่วนงานข้อความจะเรียนรู้ลำดับของตัวอักษร ไม่ใช่ความหมาย ไม่มีสิ่งใดในนี้ที่ถูกฝึกมาล่วงหน้า (pre-trained) การคำนวณเกรเดียนต์ (gradients) ทำงานอยู่ในแท็บนี้
การฝึกฝนแบบเรียลไทม์
ระบบจะเริ่มทำงานเองเมื่อเปิดหน้าเว็บและเรียนรู้ในแท็บนี้ โดยจะบันทึกสิ่งที่วัดได้ในทุกๆ หนึ่งร้อยขั้น
กำลังรอการสร้างเครือข่าย…
แอปพลิเคชันทั้งหมด เขียนด้วย Python และ JAX
หน้านี้และโปรแกรมด้านล่างคือเครือข่ายเดียวกัน โปรแกรมนี้คือแอปพลิเคชันฉบับเต็ม: ประกอบด้วยหน้าต่าง GTK4, JAX gradients, ภาพวาด, เธรด, ความลึกที่ทำนาย และพื้นที่ส่วนกลาง คุณสามารถคัดลอกหรือบันทึก แล้วนำไปรันบนเครื่องของคุณเองได้
- แต้มสี
- —
- คำที่เรียนรู้
- —
- ตัวอักษรที่อ่าน
- —
- ไฟล์ที่ต้องเก็บไว้ด้วยกัน
- net_gtk.py
หน้าต่างนี้ทำอะไรได้บ้าง
- ฝึกฝน 300 หรือ 2,000 ขั้นตอน หรือหยุดกลางคัน การเรียนรู้ทำงานในเธรดเพื่อให้หน้าต่างยังคงทำงานอยู่
- คลิกที่แพตช์ใดก็ได้ของภาพวาด แล้วแอปจะบอกคำที่มันมีสำหรับแพตช์นั้น
- ถามด้วยคำพูด — เช่น ทองอบอุ่น, น้ำเงินเข้ม — แล้วมันจะส่องสว่างแพตช์ที่คำถามนั้นระบุถึง
- ใส่ตัวอักษรสองสามตัว แล้วมันจะแสดงรายการตัวอักษรที่คาดว่าจะตามมา พร้อมเปอร์เซ็นต์
- วางข้อความที่คุณเขียนเองแล้วกด 'Learn this instead': ตัวอักษรใหม่จะได้รับแถวใหม่ในตารางเดิม โดยไม่มีข้อมูลเดิมที่เคยรู้ถูกลบออก
- ภาพวาดสองภาพใต้ภาพหลัก: ความลึกที่มันทำนาย และพื้นที่หนึ่งที่จุดคือสีและสี่เหลี่ยมคือคำ
- บันทึกค่าน้ำหนัก (weights) ไปยัง net_weights.json และโหลดกลับมาใช้ในครั้งต่อไป
วิธีรันโปรแกรม
ใช้โฟลเดอร์เดียว ไฟล์เดียว และภาพวาดชื่อ painting.jpg (ถ้ามี) สำหรับ Linux ในโฟลเดอร์นั้นให้ทำดังนี้:
-
ติดตั้งแพ็กเกจ Python
python3 -m pip install jax numpy pillow -
ติดตั้ง GTK4 และ Python bindings
sudo apt install python3-gi gir1.2-gtk-4.0 -
เปิดหน้าต่างโปรแกรม
python3 net_gtk.py
สำหรับ Windows วิธีที่เร็วที่สุดคือ MSYS2: pacman -S mingw-w64-x86_64-python-gobject mingw-w64-x86_64-gtk4 จากนั้น python -m pip install jax numpy pillow แล้วจึงรัน python net_gtk.py ในเทอร์มินัล MSYS2 เดียวกันนั้น
สำหรับ macOS: brew install pygobject3 gtk4 จากนั้น python3 -m pip install jax numpy pillow แล้วจึงรัน python3 net_gtk.py
ไม่มีจอแสดงผล? ใช้ python3 net_gtk.py --selftest เพื่อฝึกฝนในเทอร์มินัลและพิมพ์ตัวเลขชุดเดียวกัน
ตรวจสอบแล้วโดยการรันไฟล์นี้ในเทอร์มินัลด้วย JAX บนภาพวาดนี้และเธรดนี้: 400 ขั้นตอน → 67% ของแพตช์พบคำของตัวเอง (ค่าความผิดพลาดของภาพ 0.68), 2,000 ขั้นตอน → 95% (0.53), 5,000 ขั้นตอน → 97% (0.45) ค่าความผิดพลาดของความลึกสิ้นสุดที่ 0.0003 และค่าความผิดพลาดของตัวอักษรลดลงจาก 3.05 เป็น 2.90
เบราว์เซอร์ไม่สามารถรัน Python ได้ ดังนั้นแท็บนี้จึงแสดงไฟล์แทนที่จะเป็นหน้าต่าง แต่เครือข่ายเดียวกันนี้กำลังทำงานอยู่ด้านบน คำที่มันเรียนรู้คือคำที่ภาพวาดสามารถสอนได้: ภาพวาดนี้ไม่มีสีน้ำเงิน ดังนั้นคำถามเกี่ยวกับสีน้ำเงินจึงไปตกอยู่ที่ส่วนที่เป็นสีทองแทน ส่วนหัวของตัวอักษรจะรู้ลำดับของตัวอักษร แต่ไม่รู้ความหมาย
คอมไพเลอร์สำหรับ Python และ JAX ด้านบน
กล่องนี้บรรจุ forward pass ของเครือข่ายเดียว คอมไพเลอร์จะอ่าน ตรวจสอบ และเขียนออกมาสองครั้ง: Python สำหรับ JAX และ JavaScript ที่รันในแท็บนี้ ทรีเดียว แบ็กเอนด์สองตัว
- โทเคน
- —
- โหนดในต้นไม้
- —
- ฟังก์ชัน
- —
สิ่งที่คำนวณได้
การตรวจสอบจะเปรียบเทียบตัวเลขเหล่านี้กับโปรแกรมเดียวกันที่รันใน numpy และ JAX ด้วยน้ำหนักที่กำหนด seed เดียวกัน — ซึ่งวัดผลไว้ก่อนที่จะมีการสร้างการ์ดนี้ ไม่ใช่การคาดเดา
สิ่งที่ภาษานี้อนุญาต
- def name(a, b): พร้อมเนื้อหาที่ย่อหน้า, name = ..., และ return ...
- ตัวเลข, ชื่อ, วงเล็บ, เครื่องหมายลบเดี่ยว และ + - * / @ สำหรับการคูณเมทริกซ์
- .T สำหรับการทรานสโพส และการเรียกใช้ tanh, sqrt, exp, log, sum, mean, maximum
- สิ่งอื่นใดนอกเหนือจากนี้จะทำให้คอมไพเลอร์หยุดทำงานพร้อมระบุบรรทัดและคอลัมน์ แทนที่จะเป็นการคาดเดา
นี่คือคอมไพเลอร์จริงสำหรับภาษาขนาดเล็ก ไม่ใช่ Python runtime: ไม่มีลูป, ไม่มีคลาส, ไม่มีการนำเข้า forward pass ของเครือข่ายเดียวสามารถบรรจุลงในนี้ได้ ซึ่งเป็นเหตุผลว่าทำไมข้อความเดียวกันจึงกลายเป็น JAX บนเครื่องของคุณ และเป็น JavaScript ในแท็บนี้
ดวงตาเสมือน: มองเห็นเพียงพิกเซลเท่านั้น
ดวงตาที่จ้องมองไปยังจอภาพ: จะได้รับเพียงภาพและไม่มีสิ่งอื่นเลย — ไม่มีหน้าเว็บ ไม่มีข้อมูล ไม่มีเครือข่าย จากพิกเซลเหล่านั้นเพียงอย่างเดียว มันจะค้นหาขอบ มุม และการเลื่อนของแต่ละจุดเมื่อดวงตาขยับไปด้านข้าง และจากจุดนั้นมันจะสร้างตำแหน่งของทุกสิ่งในพื้นที่ขึ้นมาใหม่
- จำนวนเฟรมที่เห็น
- 0
- มุม
- 0
- ติดตามแล้ว
- 0
- การเคลื่อนไหวค่ามัธยฐาน
- —
- ตรวจพบความลึก
- —
- จุดในพื้นที่
- 0
- หนึ่งเฟรม
- —
ความลึกคือเรขาคณิตจริง แต่จะทำได้เพียงเท่ากับขนาดก้าวของดวงตา และเฉพาะในจุดที่ภาพมีพื้นผิวเท่านั้น — สีเรียบๆ จะไม่มีจุดยึดเกาะ การมองเห็นว่าผนังตั้งอยู่ตรงไหนไม่ใช่การรู้ว่ามันคือผนัง และไม่มีอะไรในนี้ที่สร้างโลกขึ้นมา: ห้องด้านบนคือพิกเซลที่ถูกวัดค่า
ไอเดียของคุณ และสิ่งที่ยังคงจำเป็นต้องมี
- ดวงตาที่มองจอภาพคืออินเทอร์เฟซที่แท้จริง: โมเดลที่อ่านหน้าจอเหมือนที่มนุษย์ทำไม่จำเป็นต้องมีปลั๊กอินสำหรับทุกโปรแกรม — อะไรก็ตามที่มองเห็นได้คือข้อมูลนำเข้าอยู่แล้ว
- จากสองเฟรมของดวงตาที่เคลื่อนที่ คุณจะได้เรขาคณิต ซึ่งเป็นสิ่งที่โมเดลโลกต้องสอดคล้องกัน ซึ่งส่วนนี้การ์ดใบนี้ทำได้จริง
- โลกที่ถูกสร้างขึ้นแบบเรียลไทม์ยังต้องการโมเดลที่สร้างสิ่งที่ไม่มีใครเห็น รักษาความสอดคล้องเมื่อคุณหันมอง และทำงานในระดับมิลลิวินาที — สิ่งนี้ไม่ได้อยู่ในแท็บนี้ และหน้าเว็บไม่สามารถฝึกฝนมันได้
- ข้อจำกัดที่แท้จริง: ดวงตานี้กู้คืนตำแหน่งของสิ่งต่างๆ ไม่ใช่ความหมายของสิ่งเหล่านั้น ความเร็วในการมองเห็นไม่ใช่ความเข้าใจ และอย่างหนึ่งนั้นง่ายกว่าอีกอย่างมาก
ภาพ: สแกนสาธารณะของ The Last Supper โดย Leonardo da Vinci จาก Wikimedia Commons
