OpenAI 的聊天機器人ChatGPT最近可謂是火到出圈,這也讓大家對ChatGPT背后的技術(shù)非常好奇。GPT-3是OpenAI 產(chǎn)品歷程中的一個重要里程碑,也是其 Codex (或Github CoPilot) 和ChatGPT等應(yīng)用的基石(ChatGPT 基于GPT-3的加強版GPT-3.5)。近期,機器學(xué)習(xí)平臺Weights & Biases(W&B)發(fā)表了OpenAI的產(chǎn)品與合作伙伴關(guān)系副總裁Peter Welinder接受(W&B)員工Lukas和Boris的采訪:“Fine-tuning OpenAI's GPT-3”。
Peter Welinder 現(xiàn)任 OpenAI 產(chǎn)品與合作伙伴副總裁,負(fù)責(zé)GPT-3的運行和其他業(yè)務(wù),在此之前,他曾是OpenAI的研發(fā)主管。在采訪中Peter Welinder比較全面地解密了OpenAI 背后的故事,并對GPT-3的研發(fā)和商用情況做了詳細(xì)介紹,特別是OpenAI 怎樣訓(xùn)練 GPT-3 使得它在文章摘要、翻譯以及問題回答等任務(wù)中展現(xiàn)出色的能力;以及用戶應(yīng)該如何利用GPT-3進行微調(diào)來更好地將其應(yīng)用于翻譯、文案寫作和其他商業(yè)任務(wù)中;最后Peter Welinder還介紹了 OpenAI 團隊對于GPT-3 API 產(chǎn)品研發(fā)和工程實施的一些思路。
摘要 (由ChatGPT 產(chǎn)生):
Lukas:GPT-3的優(yōu)點之一似乎是它可以開箱即用。但我也可以想象,對于一些團隊來說,如果出現(xiàn)問題,他們可能會擔(dān)心該怎么辦。我想我很好奇,你通常與公司內(nèi)部的ML團隊合作,還是更多的工程師認(rèn)為這里的好處是,他們不必弄清楚機器學(xué)習(xí)是如何工作的,以獲得自然語言處理的好處,或者你是否傾向于將其與ML團隊集成到一種更大的ML工作流中?
Peter:我得說,這是一種混合,我們有多個機器學(xué)習(xí)團隊。他們已經(jīng)有了自己的模型,他們會在網(wǎng)上下載模型等等,他們會根據(jù)任務(wù)對模型進行調(diào)整,然后他們找到了我們的API并開始使用我們的API做同樣的事情,結(jié)果證明你可以從我們的模型中獲得更好的性能。就像我們所擁有的最大的模型或最好的模型都沒有開源版本,對于很多任務(wù)來說,這是最有效的方法。
但我認(rèn)為,我們的大多數(shù)客戶可能更傾向于另一個陣營,即“真正聰明的開發(fā)者”。當(dāng)我說“開發(fā)人員”時,這是一個相當(dāng)廣泛的群體,從程序員到工程師,從設(shè)計師到項目經(jīng)理。許多人告訴我們OpenAI API是他們進入編程的原因,因為他們從我們的游樂場得到了非常好的結(jié)果,在那里你可以與我們的模型交互。他們有了想法,就開始學(xué)習(xí)如何編碼,并接觸到像Bubble IO之類的無代碼工具。這真的降低了障礙,你不必成為一名機器學(xué)習(xí)專家,也能從這些模型中得到非常好的結(jié)果。你只需要善于迭代并弄清楚如何向模型編寫指令。
這有點像每個人都能成為管理者,如果你想讓你的員工按照你的想法去完成任務(wù),你就必須給他們很好的指導(dǎo),這和這些模型非常相似。比如,如果你不明確你的任務(wù),你就會在輸出中得到非常高的差異,但是,如果你真的很擅長具體說明,甚至提供幾個例子,那么你就會得到非常好的結(jié)果。這不是一種機器學(xué)習(xí)技能,這幾乎更像是一種任務(wù)規(guī)范,管理技能,我覺得很多人都能很快學(xué)會。
我真的很興奮,看到這么多人都能接觸到這些模型,以前好像只有機器學(xué)習(xí)博士學(xué)位才能使用。
Lukas:我覺得我聽人說過一個叫做“提示工程師 (Prompt Engineer) ”的新角色可能與此有關(guān),清楚如何提示GPT-3讓它做你想讓它做的事情。
Peter:這個很有趣,因為早期,當(dāng)我們有第一個版本的API時,我們有一個非常聰明的人,他是一位世界知名的作者,也是一個程序員:安德魯·梅恩(Andrew Mayne)。他是該API的早期用戶之一,他的內(nèi)部名稱是“提示耳語者 (Prompt Whisperer) ”,或“GPT-3耳語者”,他真的知道如何精心設(shè)計提示以獲得最好的結(jié)果。
因為它是在互聯(lián)網(wǎng)上訓(xùn)練的,你需要把你的思想放在這樣的想法中,“互聯(lián)網(wǎng)上的文本是如何開始的”,如果你想要一個真正好的食譜,你必須開始用食譜書或美食博客之類的東西來寫作,這并不是說你可以讓模型做你想讓它做的事。我認(rèn)為,這其中有很大一部分開始是這樣的。你真的必須善于理解GPT-3的復(fù)雜性,并設(shè)計出真正好的提示。
在我們推出后的一年半時間里,我們看到人們在這方面有很多困難,所以我們開發(fā)了一套新的模型,我們稱它為InstructGPT。這實際上就像上周一樣,它成為我們API中的默認(rèn)值,我們稱其為InstructGPT的原因,是因為它只提供說明。
所以我想說,提示設(shè)計現(xiàn)在已經(jīng)不那么重要了。你可以告訴模型你想讓它做什么,并提供一些例子,還有一點關(guān)于格式可能會影響你提供示例的方式等等。GPT-3在這方面非常強大,但有時它確實有點問題,一些調(diào)整很重要。但我想說的是,與一年前相比,現(xiàn)在已經(jīng)不那么重要了,我的希望是,它變得越來越不重要,而是變得更有互動性。
Lukas:你對模型還啟動了微調(diào)的功能,這個想法是什么,它在什么地方有用?
Peter:GPT-3令人驚訝的是通過零下 (zero-shot) 就得到了非常好的結(jié)果。你只需要提供一個例子,或沒有例子,只是說,“嘿,把這個句子從德語翻譯成英語”就可以了,或者你提供了幾個 (few-shot) 示例,比如幾對德語和英語實例。只需幾個 (few-shot) 示例,你就可以得到令人驚訝的好結(jié)果。但這實際上意味著準(zhǔn)確性是非常依賴于具體任務(wù)的,對于一些任務(wù),也許30%的時間你得到的輸出是可以接受的,而對于其他更簡單的任務(wù),你可能70%的時間都能做到。
當(dāng)它不是每次都很好時,你必須非常聰明地在你的產(chǎn)品中暴露它。這就是為什么,比如它對很多文案公司都很有效,你可以只提供一些例子,你知道其中至少有一個是好的,這就是用戶所需要的。但是通過微調(diào),你能做的基本上你可以自定義你的模型,你可以為它提供更多你希望它執(zhí)行的輸入和輸出示例。如果你想做翻譯,或者如果你想總結(jié)文章,你可以提供幾百篇已經(jīng)做過人工編寫總結(jié)的文章例子,你可以更新GPT-3來更好地完成這項任務(wù)。
你不能把所有這些例子都放在你的提示中,提示符的空間有限,但是通過微調(diào),你把這些例子轉(zhuǎn)化為神經(jīng)網(wǎng)絡(luò)的連接,轉(zhuǎn)化為神經(jīng)網(wǎng)絡(luò)的權(quán)重。在某種程度上,你就像有了一個無限的提示,你可以提供盡可能多的例子。顯然,示例越多,微調(diào)所需的時間就越長,成本也就越高。但微調(diào)基本上是一個概念,取一堆輸入和輸出的例子,把它們放入模型中,然后得到一個模型的新版本,該版本非常適合你提供例子的任務(wù)。事實證明,只需幾百個例子,或者大約100個例子你就能顯著提高準(zhǔn)確性。
我們有很多客戶使用過它,就像Keeper Tax一樣,他們正在分析交易以找到這些稅收注銷之類的東西,他們所做的是提取相關(guān)的文本片段,進行分類等等。例如,他們對模型進行微調(diào),并通過微調(diào)模型得到了更好的結(jié)果。我們在客戶身上一再看到這種情況。他們可以得到非常好的結(jié)果,這些結(jié)果通常對于原型來說已經(jīng)足夠好了,但是為了讓其達到足夠高的精度以將其投入生產(chǎn)——通常超過90%或95%或99%,使用他們擁有的數(shù)據(jù)集對模型進行微調(diào),這樣一直進行下去。這可以讓他們比以前啟用更多的應(yīng)用程序。我們只是讓這種微調(diào)變得很簡單。
Lukas:我想對你來說,你們可以調(diào)整的參數(shù)是什么,因為你描述的方式,聽起來好像沒有任何參數(shù),參數(shù)在這里如何參與呢?
Peter:對于你關(guān)于參數(shù)的問題,我們試圖在我們的API中使它變得非常簡單。我們試著讓默認(rèn)值非常非常好。一般來說,你可以通過微調(diào)獲得非常好的結(jié)果,而根本不需要過多地修改參數(shù),但有些參數(shù)會有所不同。例如,你可以設(shè)置學(xué)習(xí)率,這是你在每個學(xué)習(xí)步驟中更新權(quán)重的程度。
你可以設(shè)置你想要通過多少次數(shù)據(jù)的內(nèi)容,事實證明,如果你把數(shù)據(jù)調(diào)整太多次,你就會對數(shù)據(jù)集進行過度擬合。這些GPT-3模型非常大,通常只需要對數(shù)據(jù)進行2到5次迭代就能得到非常好的結(jié)果,如果你走得更遠(yuǎn),你有時會過度擬合。還有更高級的參數(shù),但我有點喜歡玩一點你想訓(xùn)練它的時代數(shù)量和他們的學(xué)習(xí)率,這讓你達到了90%的目的,如果你開始擺弄其他參數(shù),它不會給你更多。
Lukas:這是考慮將參數(shù)留給其他人的想法嗎,你能從擺弄參數(shù)中得到樂趣嗎?
Peter:說實話,如果這是完全自動的,我會很高興,也就是說,我們確實有一些更注重研究的客戶,他們真的喜歡擺弄,所以我認(rèn)為我們很難刪除它。但是,就像我說的,我們有兩大陣營的用戶:研究人員和開發(fā)者,開發(fā)者總是告訴我們:“嘿,我只想要一個按鈕,我只想要最好的模型出來。”然后很多研究人員想要擺弄更多的參數(shù),我想我們可以長期滿足雙方的需求。
Lukas:Boris (Boris 是一個 ML 技術(shù)人員),我不知道你把自己歸哪一類了,你做了一些驚人的,漂亮的演示,你也喜歡調(diào)整參數(shù),我很好奇你使用GPT-3模型的經(jīng)驗。
Boris:我當(dāng)然喜歡有一個好的默認(rèn)值,因為最初你真的不知道你應(yīng)該在它上面改變什么,假設(shè)你選擇了錯誤的參數(shù),結(jié)果什么都沒用??刹皇鞘裁从淇斓慕?jīng)歷。所以我喜歡如果你不選擇任何東西,它就已經(jīng)很好了。然后,我真的很喜歡調(diào)整參數(shù),看看“好吧,會有什么效果”并試著用直覺來調(diào)。
除了Peter提到的參數(shù)之外,還有兩個參數(shù)也讓我很感興趣,你可以決定微調(diào)哪個模型,有不同尺寸的模型。如果你使用一個更大的模型,也許你的API會慢一點,但是你的效果會更好。也許有時你不需要它,也許有時確實需要,所以我想看看我使用哪種模式的效果。
我還喜歡看到“我可以給出多少個訓(xùn)練樣本”的效果,就像我只給出20個樣本,而不是100或200個,因為這樣你就能知道我的模型在我開發(fā)一個更大的數(shù)據(jù)集時會變得更好。我喜歡擺弄各種各樣的參數(shù),看看基于這些參數(shù)能做出什么樣的預(yù)測。
Peter:對,最后一條,其實非常重要,我認(rèn)為這是我們一遍又一遍地給人們的最常見的建議之一。
這就像從一小組例子開始,然后把它翻倍,看看你能得到多少改進。如果你將訓(xùn)練數(shù)據(jù)量翻倍,那么你,就會看到錯誤率的線性改善,如果你有10%的錯誤率,你把訓(xùn)練數(shù)據(jù)翻倍,你可能會得到8%的錯誤率。然后再翻倍,錯誤率降至6%等等。如果你能看到這種趨勢,那么你就會突然有一種感覺,“就標(biāo)記更多的數(shù)據(jù)等等而言,我需要花多少錢才能得到我想要的結(jié)果”等等。
這是一件非常強大的事情。
Lukas:訓(xùn)練這些模型的結(jié)果是否可重現(xiàn)?每次對它進行微調(diào)時,有多少可變性?如果你對相同的數(shù)據(jù)進行兩次不同的微調(diào),你會得到相同的模型嗎?
Peter:原則上,你可以把它設(shè)置成非??蓮?fù)制的。如果你在同一天訓(xùn)練,基本上你在訓(xùn)練時想要做的是,在每次訓(xùn)練迭代中,你有一批數(shù)據(jù),比如一些例子,你實際上可以把API設(shè)置批量大小,每次更新需要多少個示例。我認(rèn)為它默認(rèn)是32或類似的東西,當(dāng)你這樣做時,你還希望對數(shù)據(jù)進行隨機排序,你希望對訓(xùn)練數(shù)據(jù)進行隨機抽樣。
只要你在訓(xùn)練中保持這些隨機化一致,你最終會得到相同的模型。這將是相當(dāng)可復(fù)制的。唯一需要注意的是,在實踐中,即使是推論,這也是正確的。我們有一個叫做溫度 (Temperature) 的參數(shù),你可以設(shè)置輸出的可變性。溫度越高,變異性就越大,即使你把值設(shè)為0也不能保證你會得到完全確定的輸出。
在這些大型模型的GPU中,有足夠多的噪音和一些奇怪的浮點運算等等,都很難保證完全確定性的決定。
很多人問我們這個問題,答案總是這樣,“很不幸,我們不能提供這個,但你可以得到一些公平的東西?!钡悄銘?yīng)該讓你的實驗足夠強大,這樣你就不用太在意決定論了。
Lukas:我認(rèn)為,從操作上講,讓每個人都有自己的微調(diào)模型比每個人都使用符合相同模型的API在基礎(chǔ)設(shè)施方面面臨的挑戰(zhàn)要大得多。允許這種情況發(fā)生是一項艱巨的任務(wù)嗎?比如,當(dāng)人們開始使用不同的模型時,你需要換入和換出不同的模型嗎?
Peter:剛開始的時候,我們做微調(diào)的方式基本上是在某種程度上。你幾乎租了一組運行模型的GPU,在某種程度上,對于一些最早期的微調(diào)客戶,我們基本上是按GPU小時收費的,比如每小時,他們使用模型的次數(shù)。甚至從一開始,我想在推出API后的六個月內(nèi),我們就有一些精選的客戶,他們有微調(diào)過的模型和類似的東西,這就是它的工作方式。
問題是,如果你想嘗試一些新的東西,GPU的時間是很昂貴的。你不會真的想要花錢去保留一個GPU,哪怕只有不到一個小時,這一切都累積得非常非常快。我們只是設(shè)定了一個目標(biāo)說“好吧,一旦你微調(diào)了你的模型,你應(yīng)該立即能夠使用那個模型,你只需要為推理時進入它的token付錢”,就像無論你在提示符里輸入什么。
要使這種體驗真正出色,這無疑是一個巨大的工程挑戰(zhàn)。你只需開始微調(diào),當(dāng)它完成時,得到一個微調(diào)的模型名稱。現(xiàn)在你可以在API中使用那個模型來立即得到一個結(jié)果,而且你不會按小時或其他方式收費,你只會以相同的方式為API收費。這真的很棘手,我們在OpenAI有一個了不起的工程團隊,他們真的想出了很多技巧來平衡這些模型的最終位置,并以正確的方式緩存它們等等,以創(chuàng)造一個很棒的體驗。
Boris:我很好奇你是對整個模型進行微調(diào),還是只對部分模型進行微調(diào),讓它更有效率。
Peter:我們用了很多技巧來實現(xiàn)這一點,我們一直在努力尋找新的方法。如果你想對整個750億個參數(shù)模型進行微調(diào),這是有挑戰(zhàn)的。它可能會變得非常昂貴和困難等等,有一些技巧可以讓它更快。
Lukas:你覺得你和所有使用GPT-3進行自然語言任務(wù)的每個人之間的區(qū)別是模型本身的質(zhì)量和性能嗎?還是其他原因?是關(guān)于集成,還是生產(chǎn)中的監(jiān)控,或者類似的東西?
Peter:當(dāng)然,我們在構(gòu)建API時所關(guān)注的關(guān)鍵事情是最重要的是模型的能力。
其次,你需要有快速的推理能力。在我們創(chuàng)建API之前,對于語言模型,沒有人關(guān)心推理。每個人都關(guān)心你能多快地訓(xùn)練他們,因為這才是最重要的。因此,你可以在一天結(jié)束時解決基準(zhǔn)測試問題。我們做了大量的工程設(shè)計來讓推理超級超級快。我還記得在最初的幾個月里,我們將API的第一個原型交付客戶開始使用,我們將推理速度提高了200倍之類的。我們做了很多努力來讓它超快。
第三件事是圍繞安全的事情。我們投資這些InstructGPT模型的原因之一是,我們看到有時你可以得到出乎意料的模型輸出。例如,你可能寫了一個非常無辜的句子,但由于某些原因,它可能會變得非常黑暗,或者你可能會以不同的方式得到一些有偏見的輸出。使用我們的推薦指令的模型,默認(rèn)情況下,它們的行為更符合預(yù)期,但你也可以以更好的方式指定行為。事實證明,當(dāng)安全和能力齊頭并進時,當(dāng)你能更好地控制它時,它就會變成一個更好的產(chǎn)品。這些肯定是我們一直關(guān)注的事情,我認(rèn)為我們在這方面做得比現(xiàn)有的其它替代方案要好得多。
最后,我們非常關(guān)注的事情是讓它使用起來非常簡單,事實上,你不需要加載模型,你只需要調(diào)用一個微調(diào)模型,只需要一行Python來調(diào)用API,這也是我們的核心,我們希望每個人都能輕松使用它。
Lukas:太棒了。好的,非常感謝,很高興與你交談,祝賀你做出了如此成功的產(chǎn)品。
聯(lián)系客服