
Pengarang: Carlo Borella
Awalnya diterbitkan di Menuju AI.
Sumber: Gambar yang dihasilkan oleh penulis menggunakan MidJourney
Pembelajaran zero-shot adalah metode pembelajaran mesin yang memungkinkan penggunaan model yang telah dilatih sebelumnya untuk mengklasifikasikan data menurut kumpulan kelas atau label yang belum digunakan untuk melatih model. Zero-shot dapat berguna untuk berbagai aplikasi antara lain:
pelabelan data tanpa menghabiskan waktu melatih atau menyempurnakan model melabeli data karena kami tidak memiliki rangkaian pelatihan untuk melatih atau menyempurnakan model
Secara tradisional, membuat label untuk tugas Klasifikasi Zero-shot melibatkan penentuan secara manual kumpulan kelas atau label potensial yang dapat digunakan model untuk membuat prediksi pada data yang tidak terlihat. Proses ini dapat memakan waktu dan rawan kesalahan, terutama untuk kumpulan data besar atau domain kompleks.
Dengan menggunakan GPT-3 OpenAI untuk menghasilkan label untuk model Klasifikasi Zero-shot, kami dapat secara signifikan mengurangi waktu dan upaya yang diperlukan untuk membuat kumpulan label ini!
Pada artikel ini, saya akan menunjukkan cara membuat model klasifikasi teks zero-shot, mengintegrasikan GPT-3 OpenAI untuk pembuatan label (yaitu, membuat sekumpulan label yang relevan dengan data yang ingin kita kategorikan) dan HuggingFace zero-shot model untuk klasifikasi teks yang sebenarnya (yakni, mengklasifikasikan data menurut rangkaian label ini).
Untuk memulai, kita perlu menginstal transformer dan openai dan mengimpor semua modul yang diperlukan:
!pip instal transformer
!pip instal openai
dari pipa impor transformer
impor obor
dari tqdm impor tqdm
impor panda sebagai pd
impor openai
permintaan impor
Kami juga perlu menginisialisasi klien OpenAI API dengan kunci API kami:
openai.api_key = (“kunci Anda”) #ganti dengan kunci Anda
Sekarang setelah kita memiliki paket dan kunci API yang diperlukan, mari kita definisikan (1) fungsi untuk menghasilkan label yang relevan dengan korpus teks yang ingin kita klasifikasikan dan (2) fungsi untuk mengklasifikasikan korpus berdasarkan kumpulan label yang telah ditentukan sebelumnya.
(1) Pertama, tentukan fungsi untuk menghasilkan label yang akan kami masukkan ke model klasifikasi zero-shot kami:
def get_zero_shot_labels(domain, n_labels = Tidak ada):
jika n_labels adalah Tidak Ada:
prompt = ‘Anda memilih label untuk model klasifikasi zero shot, Buat daftar tema untuk domain: {}’.format(domain)
kalau tidak:
prompt = ‘Anda memilih label untuk model klasifikasi zero shot, Buat daftar dengan minimal {} tema untuk domain: {}’.format(n_labels, domain)
tanggapan = openai.Penyelesaian.buat(
mesin=”teks-davinci-002″,
prompt = prompt,
max_token=40,
n=1,
berhenti=Tidak ada,
suhu = 0,5,
)
teks = tanggapan[“choices”][0][“text”]
label = [label.strip(‘-‘) for label in text.split(‘n’)]
kembalikan(label)
Fungsi ini menggunakan GPT-3 (sebagai alternatif, Anda dapat menggunakan GPT-4) untuk membuat sekumpulan label yang relevan dengan domain tertentu yang kami minati.
get_zero_shot_labels memiliki dua input:
domain adalah string yang berisi deskripsi dari domain yang relevan untuk data yang akan kita masukkan ke model klasifikasi zero-shot (misalnya, ulasan restoran, berita sepak bola, dll.) n_labels adalah jumlah minimum label yang ingin kita hasilkan. Jika n_labels tidak ditentukan, fungsi akan menghasilkan sejumlah label yang tidak ditentukan untuk domain yang ditentukan.
(2) Selanjutnya, kita akan mendefinisikan sebuah fungsi untuk mengklasifikasikan data masukan kita berdasarkan daftar kemungkinan label yang sebelumnya kita buat dengan get_zero_shot_labels:
def zero_shot_classification(text_lst, label ,model, multi_label = Salah):
device = torch.device(“cuda” if torch.cuda.is_available() selain “cpu”)
classifier_pipeline = pipeline(“zero-shot-classification”, model = model, multi_label = multi_label, perangkat=perangkat)
sebelum = []
#loop untuk setiap teks di text_list
untuk input_sequence di tqdm(text_lst, total=len(text_lst)):
pred = classifier_pipeline(input_sequence, label)
label_scores = dict(zip(pred[‘labels’]sebelum[‘scores’]))
preds.append(label_scores)
#simpan probabilitas label dalam df
preds_df = pd.DataFrame(preds)
kembali(preds_df)
Fungsi ini memiliki 4 input:
text_lst: Daftar string yang mewakili data yang akan diklasifikasikan. label: set label untuk mengklasifikasikan data sesuai. model: Sebuah string yang mewakili model klasifikasi zero-shot untuk digunakan. multi_label: Bendera boolean yang menunjukkan apakah model harus menampilkan beberapa label per urutan input.
Setelah kita memiliki fungsi pembuat label dan fungsi untuk mengklasifikasikan teks, kita dapat menggabungkan keduanya menjadi pengklasifikasi zero-shot end-to-end dengan sedikit input manusia.
Jadi sekarang saatnya menggabungkannya: end_to_end_zero_shot menggabungkan kode pembuatan label dengan pengklasifikasi teks untuk memberikan solusi end-to-end untuk klasifikasi teks Zero-shot:
def end_to_end_zero_shot(domain, text_lst , n_labels =Tidak ada , model = “valhalla/distilbart-mnli-12-3”, multi_label = Salah):
label = get_zero_shot_labels(domain, n_label = n_label)
cetak(label)
user_input = input(“lanjutkan dengan label ini (ya/tidak)”).lower()
jika user_input == “ya”:
preds_df = zero_shot_classification(text_lst, label ,model, multi_label = multi_label)
kembali(preds_df)
kalau tidak:
print(‘modifikasi permintaan Anda dan/atau coba lagi.’)
kembalikan(label)
Saya menggunakan “valhalla/distilbart-mnli-12–3”, yang merupakan versi sulingan dari bart-large-mnli (berjalan lebih cepat), sebagai model default saya, tetapi Anda dapat mencobanya dengan yang lain.
Dalam fungsi tersebut, saya juga menyertakan user_input yang meminta pengguna untuk memeriksa label yang diusulkan oleh GPT sebelum melanjutkan dengan memberi label korpus.
Akhirnya, inilah contohnya:
domain = ‘ulasan restoran’
text_lst = [ “The food was amazing!”,
“The service was slow and the staff was unfriendly.”,
“The ambiance was perfect for a romantic dinner.”,
“The prices were too high for the quality of the food.”,
“I highly recommend this restaurant!”]
hasil = end_to_end_zero_shot(domain, text_lst , n_labels =Tidak ada , model = “valhalla/distilbart-mnli-12-3”, multi_label = Salah)
[‘Food quality’, ‘Service quality’, ‘Price’, ‘Atmosphere’, ‘Location’, ‘Menu’, ‘Dietary restrictions’]
lanjutkan dengan label ini (ya/tidak) ya
100%|██████████| 5/5 [00:09<00:00, 1.85s/it]
Prediksi untuk masing-masing dari 5 contoh yang kami klasifikasikan, dengan distribusi probabilitas untuk setiap label. Anda dapat menggunakan probabilitas untuk memberi label pada contoh teks Anda.
Catatan Akhir
Pada artikel ini, kita membahas cara menerapkan algoritme klasifikasi teks Zero-shot yang mengotomatiskan proses pembuatan label menggunakan GPT-3 (atau GPT4, bahkan lebih baik!). Untuk implementasi ini, saya berasumsi bahwa korpus yang kita beri label milik domain tertentu (oleh karena itu, label yang dihasilkan oleh GPT-3 akan relevan)
Saya menghargai umpan balik dan kritik yang membangun! Email saya adalah [email protected]
Diterbitkan melalui Menuju AI