ถอดรหัส CAPTCHA ของ 4Chan
(nullpt.rs)- โปรเจกต์นี้สร้าง โมเดล TensorFlow.js เพื่อแก้ CAPTCHA ของ 4Chan โดยอัตโนมัติในเบราว์เซอร์ และทำได้ตามเป้าหมายขั้นต่ำที่ตั้งไว้คือความแม่นยำ 80% รวมถึงเป้าหมายที่ต้องการคือมากกว่า 90%
- การเก็บ CAPTCHA ทำได้ยากด้วยการสเครปจำนวนมากแบบง่าย ๆ เนื่องจาก
ttl,cd, Cloudflare Turnstile ของ API คำขอ และเวลารอที่เพิ่มขึ้นเรื่อย ๆ - การใช้บริการแก้โดยคนเชิงพาณิชย์และการติดป้ายกำกับด้วยมือเจอปัญหาความผิดพลาดและการ throttle จึงสร้าง ข้อมูลสังเคราะห์ ประมาณ 50,000 ภาพจากพื้นหลังจริงราว 2,500 ภาพและภาพตัวอักษรอย่างละ 50~150 ภาพ เพื่อให้มีขนาดข้อมูลเพียงพอสำหรับฝึก
- โมเดลใช้โครงสร้าง CNN+LSTM และ CTC encoding หลังจากฝึกด้วย Keras/TensorFlow แล้วจึงแปลงผ่าน Python 3.10, Keras 2 และฟอร์แมต
.h5ไปเป็น TensorFlow.js - ในเบราว์เซอร์จริง การโหลดครั้งแรกใช้เวลาประมาณ 1 วินาที ส่วนการรันครั้งถัด ๆ ไปให้ความรู้สึกว่าเสร็จทันที และจาก CAPTCHA จริงหลายร้อยรายการพบว่า อัตราสำเร็จเกิน 90%
เป้าหมายและโค้ดที่เปิดเผย
- เป้าหมายคือสร้างโมเดลที่แก้ CAPTCHA ของ 4Chan ในเบราว์เซอร์ได้อย่างเสถียร พร้อมกับได้ฝึกแมชชีนเลิร์นนิงและ TensorFlow ไปด้วย
- เกณฑ์คือความแม่นยำอย่างน้อย 80% และถ้าเป็นไปได้ให้เกิน 90% ซึ่งสุดท้ายทำได้สำเร็จ
- โค้ดที่เกี่ยวข้องเผยแพร่บน GitHub ที่ 4chan-captcha-playground
วิธีการทำงานของ CAPTCHA ของ 4Chan
- 4Chan กำหนดให้กรอก CAPTCHA ก่อนเขียนโพสต์หรือตอบกลับ
- CAPTCHA แบบทั่วไปเป็นภาพที่มี ตัวอักษรและตัวเลข 5~6 ตัว และผู้ใช้ต้องกรอกทุกตัวให้ถูกต้อง
- CAPTCHA แบบสไลเดอร์เป็นวิธีที่จัดภาพพื้นหลังซึ่งดูเหมือนชิ้นส่วนตัวอักษรแบบสุ่มให้ตรงกับภาพด้านหน้าที่มีช่องโปร่งใส เพื่อให้เห็นข้อความ CAPTCHA
ข้อจำกัดที่พบในการเก็บ CAPTCHA
- เมื่อสังเกตคำขอ CAPTCHA ใหม่ เบราว์เซอร์จะส่งคำขอไปที่
https://sys.4chan.org/captcha?framed=1&board={board} - หากลบ
framed=1ออก จะได้ JSON ดิบ กลับมาแทนpostMessage()ใน HTML- JSON มี
challenge,ttl,cd,img,img_width,img_height,bg,bg_widthฯลฯ ttlดูเหมือนเป็นเวลาที่ CAPTCHA จะหมดอายุหลังจากประมาณ 2 นาทีcdถูกตีความว่าเป็นค่า คูลดาวน์ ที่ต้องรอก่อนขอ CAPTCHA ถัดไป
- JSON มี
- หากส่งคำขอต่อเนื่อง ค่า
cdจะค่อย ๆ เพิ่มขึ้น- ช่วงแรก ๆ สามารถขอได้ทุก 5 วินาที
- หลังจากนั้นเพิ่มเป็น 8 วินาที และต่อไปก็เพิ่มขึ้นประมาณสองเท่าเรื่อย ๆ
- สุดท้ายชนเพดานที่ 280 วินาที
- หลังจากถึงตัวจับเวลา 280 วินาที CAPTCHA จะยากขึ้น
- มีภาพที่เพิ่มเส้นแนวนอนหลายเส้นและองค์ประกอบรบกวนรูปวงรี
- คุณภาพข้อมูลลดลง แต่ก็ยังใช้งานได้
- ก่อนขอ CAPTCHA จำเป็นต้องผ่าน Cloudflare Turnstile
- วิธีใช้พร็อกซีจำนวนมากและสคริปต์ง่าย ๆ ไม่เหมาะกับการใช้งานจริง
- สคริปต์เก็บข้อมูลคัดลอกคุกกี้ Cloudflare จากเบราว์เซอร์มาใช้ และเปลี่ยนด้วยมือเมื่อหมดอายุ
- ด้วยวิธีนี้เก็บ CAPTCHA ได้หลายร้อยรายการ แต่ยังไม่เพียงพอต่อการฝึก และไม่มีป้ายกำกับคำตอบ
ข้อจำกัดของการติดป้ายกำกับโดยคน
- การจัดแนว CAPTCHA แบบสไลเดอร์ด้วยสคริปต์ heuristic ใน
trainer/captcha_aligner.pyมี อัตราสำเร็จ 100% - เขียน
trainer/labeler.pyเพื่อส่ง CAPTCHA ไปยังบริการแก้ CAPTCHA เชิงพาณิชย์และให้คนจริงกรอกคำตอบ - CAPTCHA หลายสิบรายการแรกที่ส่งไป ส่วนใหญ่ถูกแก้ผิดอย่างน้อยหนึ่งตัวอักษร
- ใช้ฟีเจอร์ “100% Recognition” ของบริการ เพื่อให้รับผลลัพธ์เฉพาะเมื่อคำตอบจากผู้ปฏิบัติงานหลายคนตรงกัน
- ค่าที่ตั้งคือ
n = 2,x = 2,y = 3 - เริ่มจากส่งให้ 2 คนก่อน หากทั้งสองไม่ตรงกัน จะส่งเพิ่มได้สูงสุด 3 คนจนกว่าจะมีคำตอบของสองคนตรงกัน
- ค่าที่ตั้งคือ
- ด้วยการตั้งค่านี้ แก้ CAPTCHA ได้ประมาณ 80% และในกลุ่มนั้นประมาณ 90% ถูกต้อง แต่ราว 10% ยังมีข้อผิดพลาด
- มีกรณีที่ผู้ปฏิบัติงานหลายคนทำผิดแบบเดียวกัน
- ยังใช้ userscript สำหรับให้ตนเองหรือคนรู้จักช่วยแก้ CAPTCHA แล้วบันทึกภาพกับคำตอบด้วย
- ได้ภาพเพิ่มอีกหลายร้อยภาพและนำเข้า training set
- แนวทางนี้ถูกยุติเนื่องจากการ throttle คำขอซ้ำและความยากของ CAPTCHA ที่เพิ่มขึ้น
การสร้างข้อมูลสังเคราะห์
- 4Chan และโค้ด CAPTCHA ดังกล่าวไม่ใช่โอเพนซอร์ส จึงไม่สามารถรันโค้ดเดียวกันในเครื่อง local ได้
- จึงสร้าง CAPTCHA สังเคราะห์ โดยประมาณโครงสร้างของ CAPTCHA จริงแทน
- CAPTCHA ถูกจัดการโดยแบ่งเป็นสองส่วนคือพื้นหลังและตัวอักษร
- พื้นหลังได้มาจากการหา contour ขนาดใหญ่ในภาพจริง แล้วลบพื้นที่ตัวอักษรออก
- หลังจากลบตัวอักษรแล้ว จะเหลือเพียงพื้นหลังที่มี noise
- ตัวอักษรแต่ละตัวได้จากการติดป้ายกำกับด้วยมือ
- ใช้ VoTT ในการแท็กตัวอักษร
- ใช้สคริปต์ง่าย ๆ แยกตัวอักษรออกมาและทำ post-processing
- ได้ภาพตัวอักษรเดี่ยวอย่างละ 50~150 ภาพ
- CAPTCHA ของ 4Chan มีเฉพาะ
0, 2, 4, A, D, G, H, J, K, M, N, P, R, S, T, W, X, Y- น่าจะเป็นการเลือกเพื่อหลีกเลี่ยงความกำกวม
- นำตัวอักษรและพื้นหลังที่สกัดได้มาผสมกัน และสร้างภาพสังเคราะห์ตามรูปแบบการจัดวางตัวอักษรที่สังเกตได้
- เนื่องจากตัวอักษรขาเข้ามีป้ายกำกับอยู่แล้ว จึงสร้างคำตอบของ CAPTCHA สังเคราะห์ได้โดยอัตโนมัติ
โครงสร้างโมเดลและการเตรียมข้อมูล
- ข้อมูลฝึกใช้ CAPTCHA แบบสไลเดอร์ที่จัดแนวไว้ล่วงหน้า, CAPTCHA แบบทั่วไป และ CAPTCHA สังเคราะห์ผสมกัน
- สคริปต์ฝึกปรับภาพทั้งหมดให้เป็น 300x80 พิกเซล และแปลงเป็นขาวดำล้วน
- โมเดลเป็นโครงสร้าง LSTM CNN ที่ประกอบขึ้นโดยอ้างอิงบทความหลายบทเกี่ยวกับการแก้ CAPTCHA
- ใช้ convolution/max-pooling 3 เลเยอร์
- ใช้ LSTM 2 เลเยอร์
- ทดลอง convolution เลเยอร์ที่ 4 ด้วย แต่ประสิทธิภาพไม่ดีขึ้น
- เนื่องจากความยาวเอาต์พุตแปรผันได้เป็น 5 หรือ 6 ตัว จึงใช้ CTC encoding
- การพัฒนาใช้ Keras และ TensorFlow
ปัญหาลำดับอาร์กิวเมนต์ของ tf.image.resize()
- CAPTCHA แบบสไลเดอร์ที่จัดแนวแล้วบางส่วนจากช่วงเก่าไม่ได้มีความละเอียดหรืออัตราส่วนภาพตรงกับ 300x80
- สคริปต์ฝึกใช้
tf.image.resize()เพื่อรองรับอินพุตหลากหลายรูปแบบ - ตอนแรกสันนิษฐานว่าอาร์กิวเมนต์ขนาดเป็น tuple
(width, height)แต่จริง ๆ แล้วtf.image.resize()ต้องการลำดับ(height, width) - ความผิดพลาดนี้ทำให้ภาพถูกยืดในแนวตั้งจนอ่านไม่ได้ เช่นกลายเป็น 80x300
- แม้ฝึกไปมากกว่า 32 epoch ประสิทธิภาพบนภาพที่เห็นมาก่อนก็แทบไม่ออกมา
- สำหรับ CAPTCHA ใหม่ โมเดลทำนายใกล้เคียงการสุ่ม
- ตรวจพบปัญหาโดย visualise ภาพอินพุตที่ผ่านการประมวลผลแล้ว และหลังแก้ไข ประสิทธิภาพการฝึกดีขึ้นอย่างมาก
ขนาดการฝึกและผลลัพธ์
- ชุดข้อมูลสุดท้ายประกอบด้วย ภาพที่แก้ด้วยมือประมาณ 500 ภาพ และ ภาพสังเคราะห์ประมาณ 50,000 ภาพ
- ภาพสังเคราะห์สร้างจากการสุ่มตัวอย่างพื้นหลังประมาณ 2,500 ภาพ และภาพตัวอักษรอย่างละ 50~150 ภาพ
- สับชุดข้อมูลแบบสุ่ม แล้วแบ่งเป็น training set และ evaluation set ในสัดส่วน 90/10
- บน NVIDIA RTX A4000 Laptop GPU เวลาในการฝึกต่อ epoch อยู่ที่ประมาณ 45 วินาที
- เมื่อจบ epoch แรก loss อยู่ระดับ 19 และการทำนายแทบไม่ถูกต้อง
- เมื่อจบ epoch ที่ 4 loss ลดลงเหลือ 0.55 และการทำนายทดสอบแบบสุ่มถูก 5 จาก 5 รายการ
- 8~16 epoch เป็นจุดประนีประนอมที่ดีระหว่างเวลาและประสิทธิภาพสุดท้าย
- loss เริ่มนิ่งแถว epoch ที่ 8
- หลังเกิน 16 epoch การปรับปรุงลดลงมาก
- ทดสอบ inference ใน Python ด้วย
trainer/infer.pyและผลลัพธ์บนภาพที่ไม่เคยเห็นก็ดูมีแนวโน้มดี
การแปลงเป็น TensorFlow.js และการรันในเบราว์เซอร์
- userscript เขียนด้วย TensorFlow.js และ TypeScript
- นำอัลกอริทึมจัดแนว CAPTCHA และโค้ดเตรียมภาพจาก Python มา implement ใหม่
- โค้ดที่เกี่ยวข้องอยู่ในไดเรกทอรี
user-scripts/ของ repository - ฟอร์แมตโมเดลของ Python TensorFlow/Keras ไม่เข้ากันกับฟอร์แมตที่ TensorFlow.js คาดหวัง
- ต้องใช้ สคริปต์แปลง ทางการ แต่มีปัญหาอยู่สองอย่าง
- ตัวแปลง TensorFlow-to-TFJS ทางการไม่ทำงานบน Python 3.12 และข้อความผิดพลาดก็ไม่ชัดเจน
- เมื่อใช้ Python 3.10 ผ่าน PyEnv การแปลงสำเร็จ
- สคริปต์แปลงสามารถแปลงโมเดล Keras 3 เป็นฟอร์แมต TensorFlow.js ได้ แต่ TensorFlow.js กลับอ่านโมเดลที่แปลงแล้วนั้นไม่ได้จริง
- ตรวจสอบปัญหาที่เกี่ยวข้องจาก forum post
- วิธีแก้คือใช้ Keras 2
- ติดตั้งแพ็กเกจ legacy
tf_keras - ตั้งค่าตัวแปรสภาพแวดล้อม
TF_USE_LEGACY_KERAS=1แล้วฝึก - export เป็นฟอร์แมตโมเดล legacy
.h5และระบุฟอร์แมตอินพุตให้สคริปต์แปลง - การแก้โค้ดต้องเปลี่ยนเพียงบรรทัดเดียว
- ติดตั้งแพ็กเกจ legacy
ประสิทธิภาพกับ CAPTCHA ของ 4Chan จริง
- โมเดลทำงานได้ดีแม้กับ CAPTCHA ของ 4Chan จริง
- การโหลดโมเดลครั้งแรกใช้เวลาประมาณ 1 วินาที
- การรันหลังจากนั้นให้ความรู้สึกว่าเสร็จทันที
- จากประสบการณ์แก้ CAPTCHA จริงหลายร้อยรายการในเบราว์เซอร์ อัตราสำเร็จ เกิน 90%
- กรณีที่ตัวอักษรผิดเองมีน้อย และเมื่อไม่แม่น มักเป็นการตกหล่นตัวอักษรไปทั้งตัว
- ยังมีช่องให้ปรับปรุงได้ด้วยการเพิ่มข้อมูลจริงในการฝึก หรือปรับ layout CAPTCHA ของตัวสร้างข้อมูลสังเคราะห์
- ความแม่นยำของโมเดลนี้สูงกว่าบริการแก้ CAPTCHA โดยคนเชิงพาณิชย์อย่างมาก
CAPTCHA 4 ตัวอักษรและสรุป
- หลังจบโปรเจกต์ ระหว่างเขียนและแก้ไขบทความ 4Chan เริ่มปล่อย CAPTCHA 4 ตัวอักษร เป็นบางครั้ง
- แม้โมเดลจะฝึกมาเฉพาะ CAPTCHA 5 และ 6 ตัวอักษร แต่ก็ให้ประสิทธิภาพระดับเดียวกันกับ CAPTCHA 4 ตัวอักษร
- ตลอดโปรเจกต์นี้ได้เรียนรู้แมชชีนเลิร์นนิงและคอมพิวเตอร์วิทัศน์ไปมาก และทำโมเดลแก้ CAPTCHA บนเบราว์เซอร์ซึ่งเป็นเป้าหมายตั้งแต่ต้นได้สำเร็จ
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
ส่วนที่ การเชื่อมต่อ Keras กับ TensorFlow.js เละเทะนี่ให้ความรู้สึกเป็น TensorFlow แบบคลาสสิก
เวลาใช้ TensorFlow มักรู้สึกเหมือนเอาเครื่องมือที่ดูพอเกี่ยวข้องกันมากองไว้ใต้ร่มเดียวกัน มากกว่าจะเป็นผลิตภัณฑ์ที่รวมเป็นหนึ่งและลื่นไหล
จริง ๆ อาจพูดได้ด้วยซ้ำว่าไลบรารีหรือเครื่องมือโอเพนซอร์สของ Google ทั้งหมดให้ความรู้สึกแบบนี้
คำตอบต่อคำถามว่า “ทำไมถึงตัดสินใจรวม Keras เข้า TensorFlow ในปี 2019?” คือ “ผมไม่ได้เป็นคนตัดสินใจ นั่นเป็นการตัดสินใจของผู้นำ TF ในปี 2018 ตอนนั้นผมเป็น individual contributor ระดับ L5 และนั่นเป็นการตัดสินใจระดับ L8”
ผมต้องใช้ CAPTCHA เพื่อกันสแปมฟอร์มคอมเมนต์บนเว็บของผม[0] เลยลองนำวิธีสนุก ๆ ที่เคยเห็นมาก่อนกลับมาใช้
มันไม่สมบูรณ์แบบและไม่ได้ยากเลย แต่ผมชอบขั้นตอนการสร้างมันมากจริง ๆ
[0] https://www.hybridlogic.co.uk/contact
https://vivirenremoto.github.io/doomcaptcha/
มีเหตุผลที่ผู้คนเริ่มเลิกใช้ CAPTCHA แบบข้อความบิดเบี้ยว
ตอนนี้เกือบถึงจุดที่คอมพิวเตอร์แก้ได้ดีกว่ามนุษย์แล้ว
https://www.usenix.org/system/files/conference/woot14/woot14... เป็นงานวิจัยเกี่ยวกับหัวข้อนี้ ซึ่งผมว่าค่อนข้างน่าสนใจ
ถึงอย่างนั้น CAPTCHA แบบข้อความจำนวนมากอย่างน่าประหลาดใจก็ยังแก้ได้ด้วยเชลล์สคริปต์ไม่กี่บรรทัด: ใช้ ImageMagick แปลงเป็น grayscale ทำ dilation กับ erosion แล้วส่งต่อให้ Tesseract
แต่ก็มีเว็บอย่าง https://2captcha.net อยู่ด้วย ดังนั้นสุดท้าย CAPTCHA จึงใกล้เคียงกับเครื่องมือที่บังคับให้ต้องลงแรงเล็กน้อยขั้นต่ำ
วิธีแก้ในบทความนี้ก็ต้องใช้เวลา ทักษะ และความพยายามไม่น้อย และผลลัพธ์ก็ทั่วไปได้ไม่ดี ถ้าเป็น CAPTCHA ชนิดอื่นก็ต้องเริ่มใหม่ตั้งแต่ต้น
สแปมเมอร์ส่วนใหญ่ทำซ้ำแบบนี้ไม่ได้ และคนที่ทำได้ก็น่าจะหาเงินอย่างถูกกฎหมายหรือไปเล็งเป้าหมายที่ทำเงินได้มากกว่า
CAPTCHA แบบนี้ยังทำงานได้ดีในการทำให้ต้นทุนของสแปมที่สำเร็จสูงกว่ารายได้ที่คาดหวัง
จะสร้างฟอรัมที่สมาชิกทุกคนต้อง สัมภาษณ์วิดีโอกับผู้ดูแล 15 นาที ได้ไหม? รู้แหละว่า “สเกลไม่ได้” แต่ถ้าเป็นกลไกกวน ๆ ขำ ๆ ก็ดูเป็นไปได้
มันไม่ใช่ทางออก เป็นเหมือนป้อมเล็ก ๆ ที่ค่อย ๆ ล้าสมัยลง
ตามลิงก์ reCAPTCHA v3 ใช้เวลา 10–15 วินาที และมีค่าใช้จ่าย 1.3 ดอลลาร์ต่อ CAPTCHA 1000 ครั้ง
สำหรับงานจำนวนมากที่อยากข้าม CAPTCHA เช่น การดึงข้อมูลเว็บไซต์ใหญ่ ๆ ในวงกว้าง ค่าใช้จ่ายนี้จริง ๆ แล้วสูงมากและรับมือได้ยาก
mCaptcha.org ก็เป็นหนึ่งในนั้น และยังมี implementation อื่น ๆ ด้วย
CAPTCHA แบบดั้งเดิม ถ้ามีประสิทธิภาพแม้เพียงเล็กน้อย ก็มักกลายเป็นฝันร้ายด้าน accessibility
ถ้าสนใจหัวข้อแบบนี้ ผมเคยรวบรวมการวิเคราะห์ Silk Road CAPTCHA ไว้เมื่อปี 2014 ด้วย: https://github.com/mieko/sr-captcha
การตอบสนองของ 4chan ดูเหมาะสมดี
ยังไง neural network ก็แก้ได้ง่ายอยู่แล้ว จึงหันไปทำให้งานที่ให้มนุษย์ทำง่ายลง
ตอนนี้ต่อให้ออกแบบ CAPTCHA ที่ยากมาก ๆ ก็ไม่น่าทำให้เครื่องแก้ยากขึ้นมากนัก แต่มีแนวโน้มสูงว่าจะทำให้มนุษย์หงุดหงิดกว่าเดิมเท่านั้น
https://4chan.org/pass
ตอนนี้ก็มีให้เป็นตัวเลือกสำหรับโพสต์โดยไม่ต้องใช้ CAPTCHA อยู่แล้ว
ถ้า CAPTCHA หมดประสิทธิภาพอย่างสิ้นเชิง ข้อสรุปที่ตามมาก็คือควรเลิกใช้ CAPTCHA และเลิกให้โพสต์ฟรี แล้วทุกคนที่อยากโพสต์ต้องซื้อ 4chan Pass
ช่วงหลังเขาเพิ่งนำ การหน่วงเวลาโพสต์ 15 นาที มาใช้ ซึ่งน่าโมโหมาก
ผมต้องเพิ่ม 4chan เข้า allowlist ใน Cookie AutoDelete
ผมคิดว่าบางทีแกล้งทำเหมือนมี CAPTCHA แต่จริง ๆ แล้วไปวิเคราะห์ จังหวะเวลาและพฤติกรรม ของผู้ใช้น่าจะดีกว่า
พูดตามตรง ผมก็รู้สึกว่าเรื่องแบบนั้นน่าจะเกิดขึ้นอยู่แล้วด้วยซ้ำ
ถ้าจะไปให้สุดในเชิงเมตา ก็อาจฝึก AI ให้ตัดสินได้ว่าฝั่งตรงข้ามเป็นมนุษย์หรือไม่
กล่าวคือเหมือนเป็นการประดิษฐ์การทดสอบทัวริงแบบกลับด้าน โดยถ้า AI แยกไม่ออกจากการตอบสนองของคนปกติ ก็ถือว่าเป็นมนุษย์
ต่างกันตรงที่ไม่ได้แยกจากการตอบสนองของคนแบบที่ใช้เพื่อการตลาด
แค่คิดแบบนี้ก็รู้สึกไม่ค่อยสบายแล้ว คงต้องไปนอนพัก
ก่อนจะแสดง CAPTCHA เขาจะระบุ TLS fingerprint, IP, HTTP/2, request, สภาพแวดล้อม JavaScript, ความสามารถในการเรนเดอร์ฟอนต์และภาพ รวมถึงตัวเบราว์เซอร์เองก่อน
จากข้อมูลเหล่านี้จะคำนวณ คะแนนความน่าเชื่อถือ แล้วตัดสินใจตั้งแต่แรกว่าจะแสดง CAPTCHA หรือไม่
หลังจากนั้นจึงค่อยมีความหมายที่จะวิเคราะห์การกรอก CAPTCHA แต่ถึงตอนนั้นก็เท่ากับจับบอตได้ไปแล้ว 90%
ปริมาณข้อมูลที่เบราว์เซอร์สามารถแจ้งให้เซิร์ฟเวอร์รู้ได้โดยแทบไม่รู้ตัวนั้นมากจนน่าขัน จนลายนิ้วมือดิจิทัลของเราแต่ละคนอาจมีเอกลักษณ์ยิ่งกว่าลายนิ้วมือจริงเสียอีก
กรณีต้นตำรับระดับบุกเบิกของการเจาะ CAPTCHA ของ 4chan ผมยังมองว่าเป็นกรณีที่ Yannick Kilcher fine-tune GPT-J ด้วยชุดข้อมูล “Raiders of the Lost Kek”
อาจเป็นหนึ่งในตัวอย่างการใช้โมเดลภาษาขนาดใหญ่ที่เจ๋งที่สุดที่เคยออกมาเป็นวิดีโอ: https://youtu.be/efPrtcLdcdM?si=errY0PrEhnX9ylDw
สมควรถูกบันทึกไว้จริง ๆ
เพราะเรื่องอย่าง “ตัวแปลงโมเดล TensorFlow-to-TFJS อย่างเป็นทางการใช้กับ Python 3.12 ไม่ได้ และเอกสารก็ไม่ได้เขียนไว้ให้ดี”, “TensorFlow.js ไม่รองรับ Keras 3” ทำให้เมื่อหลายปีก่อนตอนลองแตะ machine learning แบบเบา ๆ ผมเกือบถอดใจไปเลย
บ่อยครั้ง tutorial ล่าสุดก็ล้าสมัยไปแล้ว มีกับดักสุ่ม ๆ เต็มไปหมด และคู่มือ “เริ่มต้นใช้งาน” จำนวนมากสมมติว่าคุณเป็นผู้เชี่ยวชาญอยู่แล้วจนน่าตกใจ
เรียนพื้นฐานจากตำรา สถิติแบบเบย์ เก่า ๆ แล้วค่อยขยับไปใช้เฟรมเวิร์กหลักอย่าง PyTorch จะดีกว่า
ช่วงแรกควรลองเขียนทุกส่วนของสถาปัตยกรรม CNN, RNN, Transformer และ pipeline การฝึกด้วยตัวเอง
รวมถึง data loader ด้วย แต่ไม่จำเป็นต้องเขียน CUDA matrix kernel ก็ได้
ควรอยู่ให้ห่างจาก wrapper ที่ไปห่อ wrapper ของคนอื่นอีกทีแบบ LangChain
เอกสารจำนวนมากไม่ใช่แค่ล้าสมัย แต่บางครั้งผิดตั้งแต่เรื่องพื้นฐานเลยด้วยซ้ำ
Hugging Face นั้นยอดเยี่ยม ถ้าคุณรู้พื้นฐานและสามารถแก้ได้เมื่อ wrapper มาตรฐานพัง
นี่คล้ายกับการใช้เวลาหลายชั่วโมงไปเรียน วิธีเปิดฝาถังบำบัดน้ำเสีย
ถ้าตามลิงก์บริการแก้ CAPTCHA ไป จะอ่านโปรไฟล์ของคนที่ทำงานนั้นได้
มีการโฆษณาในทำนองว่างานนี้มีจริยธรรมมากกว่าการทำงานในโรงงานอันตราย