minGPT-TF
การใช้งาน TensorFlow ของ mingpt อีกครั้ง
โน๊ตบุ๊ค
play_math.ipynb
และ play_char.ipynb
ได้รับการฝึกใน colab ลิงก์จะอยู่ที่ด้านบนของสมุดบันทึกแต่ละเครื่องเพื่อฝึกโมเดลบน colab play_char.ipynb
notebook batch_size
ถูกลดขนาดให้พอดีกับหน่วยความจำ GPU
ของ colab เปลี่ยนพารามิเตอร์ตามหน่วยความจำ GPU
minGPT - Readme
PyTorch นำการฝึกอบรม GPT ไปใช้ใหม่ minGPT พยายามที่จะมีขนาดเล็ก สะอาด ตีความได้ และให้ความรู้ เนื่องจากสิ่งที่มีอยู่ในปัจจุบันส่วนใหญ่ยังขยายออกไปเล็กน้อย GPT ไม่ใช่โมเดลที่ซับซ้อน และการใช้งานนี้มีโค้ดประมาณ 300 บรรทัดอย่างเหมาะสม รวมถึงต้นแบบและโมดูลการเอาใจใส่ตนเองเชิงสาเหตุแบบกำหนดเองที่ไม่จำเป็นโดยสิ้นเชิง อย่างไรก็ตาม ทั้งหมดที่เกิดขึ้นคือลำดับของดัชนี เข้าสู่ลำดับของบล็อกหม้อแปลงไฟฟ้า และการกระจายตัวของดัชนีถัดไปจะออกมา ความซับซ้อนที่เหลือเป็นเพียงการฉลาดในการแบทช์ (ทั้งข้ามตัวอย่างและความยาวลำดับ) เพื่อให้การฝึกอบรมมีประสิทธิภาพ
"library" หลักของ minGPT (hah) คือสองไฟล์: mingpt/model.py
มีคำจำกัดความของโมเดล Transformer จริง และ mingpt/trainer.py
คือแผ่นสำเร็จรูป PyTorch (ไม่ขึ้นกับ GPT) ที่ฝึกฝนโมเดล สมุดบันทึก Jupyter ที่แนบมาจะแสดงให้เห็นว่า "ไลบรารี" (ฮ่า) สามารถใช้ในการฝึกโมเดลลำดับได้อย่างไร:
-
play_math.ipynb
ฝึก GPT ที่เน้นไปที่การบวก (ได้รับแรงบันดาลใจจากส่วนเพิ่มเติมในเอกสาร GPT-3) -
play_char.ipynb
ฝึก GPT ให้เป็นโมเดลภาษาระดับอักขระบนข้อความที่กำหนดเอง คล้ายกับ char-rnn รุ่นเก่าของฉัน แต่มีหม้อแปลงแทน RNN -
play_words.ipynb
เป็นเวอร์ชัน BPE ที่ยังไม่มี
ด้วยตัวเข้ารหัส bpe การฝึกอบรมแบบกระจาย และบางที fp16 การใช้งานนี้อาจสามารถสร้างผลลัพธ์ GPT-1/GPT-2 ได้ แม้ว่าฉันจะไม่ได้ลอง $$$ ก็ตาม GPT-3 ไม่น่าจะเข้าถึงได้เนื่องจากความเข้าใจของฉันคือ มันไม่พอดีกับหน่วยความจำ GPU และต้องมีการจัดการโมเดลขนานอย่างระมัดระวังมากขึ้น
ตัวอย่างการใช้งาน
รหัสนี้ง่ายพอที่จะแฮ็กแบบอินไลน์ ไม่ใช่ "ใช้แล้ว" แต่ API ปัจจุบันมีลักษณะดังนี้:
# you're on your own to define a class that returns individual examples as PyTorch LongTensors
from torch . utils . data import Dataset
train_dataset = MyDataset (...)
test_dataset = MyDataset (...)
# construct a GPT model
from mingpt . model import GPT , GPTConfig
mconf = GPTConfig ( vocab_size , block_size , n_layer = 12 , n_head = 12 , n_embd = 768 ) # a GPT-1
model = GPT ( mconf )
# construct a trainer
from mingpt . trainer import Trainer , TrainerConfig
tconf = TrainerConfig ( max_epochs = 10 , batch_size = 256 )
trainer = Trainer ( model , train_dataset , test_dataset , tconf )
trainer . train ()
# (... enjoy the show for a while... )
# sample from the model (the [None, ...] and [0] are to push/pop a needed dummy batch dimension)
from mingpt . utils import sample
x = torch . tensor ([ 1 , 2 , 3 ], dtype = torch . long )[ None , ...] # context conditioning
y = sample ( model , x , steps = 30 , temperature = 1.0 , sample = True , top_k = 5 )[ 0 ]
print ( y ) # our model filled in the integer sequence with 30 additional likely integers
อ้างอิง
รหัส:
- openai/gpt-2 มีโมเดลแต่ไม่มีโค้ดการฝึกอบรม และใน TensorFlow
- openai/image-gpt มี gpt-3 ที่ทันสมัยกว่าเช่นการแก้ไขในโค้ด ซึ่งเป็นข้อมูลอ้างอิงที่ดีเช่นกัน
- Huggingface/Transformers มีตัวอย่างการสร้างแบบจำลองภาษา มันมีคุณลักษณะครบถ้วนแต่ผลที่ได้ก็ค่อนข้างท้าทายในการติดตาม เช่น ฟังก์ชันขนาดใหญ่บางฟังก์ชันมีโค้ดที่ไม่ได้ใช้มากถึง 90% อยู่เบื้องหลังคำสั่งแยกย่อยต่างๆ ซึ่งไม่ได้ใช้ในการตั้งค่าเริ่มต้นของการสร้างแบบจำลองภาษาอย่างง่าย
เอกสาร + บันทึกการใช้งานบางส่วน:
การปรับปรุงความเข้าใจภาษาโดย Generative Pre-Training (GPT-1)
- โมเดลของเราเป็นไปตามงานหม้อแปลงดั้งเดิมเป็นส่วนใหญ่
- เราได้ฝึกอบรมหม้อแปลงที่ใช้ตัวถอดรหัสเท่านั้น 12 ชั้น พร้อมด้วยหัวควบคุมการเอาใจใส่ตัวเองแบบสวมหน้ากาก (สถานะ 768 มิติและหัวควบคุม 12 หัว) สำหรับเครือข่ายฟีดไปข้างหน้าตามตำแหน่ง เราใช้สถานะภายในมิติ 3072
- อัตราการเรียนรู้สูงสุดของอดัมคือ 2.5e-4 (ภายหลัง GPT-3 สำหรับรุ่นนี้ขนาดใช้ 6e-4)
- การสลายตัวของ LR: เพิ่มขึ้นเชิงเส้นจากศูนย์ในช่วงการอัปเดต 2,000 ครั้งแรกและอบอ่อนเป็น 0 โดยใช้กำหนดการโคไซน์
- เราฝึกฝน 100 epochs บนมินิแบทช์ที่สุ่มตัวอย่าง 64 ลำดับต่อเนื่องกันด้วยโทเค็น 512 อัน
- เนื่องจากมีการใช้เลเยอร์นอร์มอย่างกว้างขวางตลอดทั้งโมเดล การกำหนดค่าเริ่มต้นน้ำหนักอย่างง่ายที่ N(0, 0.02) ก็เพียงพอแล้ว
- คำศัพท์การเข้ารหัสไบต์คู่ (BPE) พร้อมการผสาน 40,000 รายการ
- สิ่งตกค้าง การฝัง และการลดความสนใจด้วยอัตรา 0.1 สำหรับการทำให้เป็นมาตรฐาน
- เวอร์ชันแก้ไขของการทำให้เป็นมาตรฐาน L2 ที่เสนอใน (37) โดยมี w = 0.01 ในทุกอคติหรือรับน้ำหนัก
- สำหรับฟังก์ชันการเปิดใช้งาน เราใช้ Gaussian Error Linear Unit (GELU)
- เราใช้การฝังตำแหน่งที่เรียนรู้แทนเวอร์ชันไซน์ซอยด์ที่เสนอในงานต้นฉบับ
- สำหรับการปรับแต่ง: เราเพิ่มการออกกลางคันให้กับตัวแยกประเภทด้วยอัตรา 0.1 อัตราการเรียนรู้ 6.25e-5 และขนาดแบทช์ 32. 3 ยุค เราใช้ตารางการสลายตัวของอัตราการเรียนรู้เชิงเส้นโดยมีการวอร์มอัพมากกว่า 0.2% ของการฝึก แลมถูกตั้งค่าเป็น 0.5
- รุ่น GPT-1 มี 12 เลเยอร์และ d_model 768, ~117M พารามิเตอร์
โมเดลภาษาเป็นผู้เรียนมัลติทาสก์แบบไม่ได้รับการดูแล (GPT-2)
- LayerNorm ถูกย้ายไปยังอินพุตของแต่ละบล็อกย่อย คล้ายกับเครือข่ายที่เหลือก่อนการเปิดใช้งาน
- มีการเพิ่มการทำให้เป็นมาตรฐานของเลเยอร์เพิ่มเติมหลังจากบล็อกการเอาใจใส่ตนเองขั้นสุดท้าย
- มีการใช้การกำหนดค่าเริ่มต้นที่แก้ไขซึ่งพิจารณาการสะสมบนเส้นทางที่เหลือพร้อมความลึกของแบบจำลอง เราปรับขนาดน้ำหนักของชั้นที่เหลือเมื่อเริ่มต้นเป็นปัจจัย 1/√N โดยที่ N คือจำนวนชั้นที่เหลือ (แปลกเพราะในโค้ดที่ปล่อยออกมา ฉันพบเพียงการใช้งานอย่างง่าย ๆ ของ 0.02... ในการเปิดตัว image-gpt ฉันพบว่ามันใช้สำหรับ c_proj และแม้กระทั่งสำหรับ attn เท่านั้น ไม่ใช่สำหรับ mlp หือ https: //github.com/openai/image-gpt/blob/master/src/model.py)
- คำศัพท์ขยายเป็น 50,257
- เพิ่มขนาดบริบทจาก 512 เป็น 1,024 โทเค็น
- ใช้ขนาดแบตช์ที่ใหญ่กว่า 512
- GPT-2 ใช้ 48 เลเยอร์และ d_model 1600 (เทียบกับ 12 เลเยอร์ดั้งเดิมและ d_model 768) ~1.542B พารามิเตอร์
โมเดลภาษาเป็นผู้เรียนเพียงไม่กี่คน (GPT-3)
- GPT-3: 96 เลเยอร์ 96 หัว พร้อม d_model 12,288 (พารามิเตอร์ 175B)
- GPT-1-like: 12 ชั้น 12 หัว d_model 768 (125M)
- เราใช้โมเดลและสถาปัตยกรรมเดียวกันกับ GPT-2 รวมถึงการกำหนดค่าเริ่มต้นที่แก้ไข การทำให้เป็นมาตรฐานล่วงหน้า และโทเค็นแบบย้อนกลับที่อธิบายไว้ในนั้น
- เราใช้รูปแบบความสนใจแบบกระจัดกระจายสลับหนาแน่นและมีแถบสีเฉพาะในชั้นของหม้อแปลง คล้ายกับ Sparse Transformer
- เรามีเลเยอร์ feedforward สี่เท่าของขนาดของเลเยอร์คอขวดเสมอ dff = 4 ∗ dmodel
- ทุกรุ่นใช้หน้าต่างบริบทของโทเค็น nctx = 2048
- อดัมที่มี β1 = 0.9, β2 = 0.95 และ eps = 10−8
- ทุกรุ่นใช้น้ำหนักที่ลดลง 0.1 เพื่อให้มีการปรับให้เป็นมาตรฐานเล็กน้อย (หมายเหตุ: GPT-1 ใช้ 0.01 ฉันเชื่อว่าดูด้านบน)
- ตัดบรรทัดฐานสากลของการไล่ระดับสีที่ 1.0
- การอุ่นเครื่อง Linear LR ใน 375 ล้านโทเค็นแรก จากนั้นใช้การสลายตัวของโคไซน์สำหรับอัตราการเรียนรู้ลดลงเหลือ 10% ของมูลค่า มากกว่า 260 พันล้านโทเค็น
- ค่อยๆ เพิ่มขนาดแบตช์เชิงเส้นจากค่าเล็กน้อย (32,000 โทเค็น) ไปเป็นมูลค่าเต็มในช่วง 4-12 พันล้านโทเค็นแรกของการฝึก ขึ้นอยู่กับขนาดของโมเดล
- หน้าต่างบริบทเวลาขนาดเต็ม 2048 จะถูกใช้เสมอ โดยมีตัวคั่นโทเค็น END OF DOCUMENT พิเศษ
ใบอนุญาต
เอ็มไอที