看到 ChatGPT 的華麗誕生,心情很複雜,既高興、驚喜,也感到恐慌。高興和驚訝的是沒有預料到這麼快就見證了自然語言處理(NLP)技術的重大突破,體驗到通用技術的無限魅力。恐慌的是 ChatGPT 幾乎可以高品質地完成 NLP 中的大多數任務,逐漸認識到許多 NLP 的研究方向遇到了極大挑戰。
總體而言,ChatGPT 最令人非常驚豔的是它的通用性,相較於GPT-3 需要透過設計非常精巧的提示來實現效果不太好的各種NLP能力,ChatGPT 已經讓使用者感受不到提示的存在。
作為對話系統,ChatGPT 讓用戶自然提問便可實現從理解到生成的各種任務,而且性能在開放領域幾乎都達到了當前最佳水平,很多任務超越了針對特定任務單獨設計的模型,並且在程式碼程式設計領域表現卓越。
具體而言,自然語言理解能力(尤其是使用者意圖理解能力)十分突出,無論是問答、聊天、分類、摘要、翻譯等任務,儘管回覆不一定完全正確,但是幾乎都能夠領會用戶意圖,理解能力遠超預期。
相較於理解能力,ChatGPT 的生成能力更加強大,可以針對各種問題產生具有一定邏輯且多樣化的長文本。總的來說,ChatGPT 表現出的更多是驚艷,是通往 AGI 的初步階段,一些技術瓶頸解決後會更強大。
對於 ChatGPT 表現案例的總結已經非常多了,這裡主要總結一下自己對 ChatGPT 技術問題的一些思考,算是與 ChatGPT 斷斷續續交互兩個多月的一個簡單總結。由於無法了解 ChatGPT 的具體實現技術和細節,所以幾乎都是主觀猜想,肯定有很多不對的地方,歡迎一起探討。
只要使用過 ChatGPT,我們就會發現它不是一個傳統意義上的人機對話系統,實際上是一個以自然語言為互動方式的通用語言處理平台。
2020 年的GPT-3 雖然擁有了通用能力的雛形,但是需要精心設計提示語來觸發相應功能,而ChatGPT 允許用戶採用非常自然的提問就可以準確識別意圖完成各種功能。傳統方法往往先進行使用者意圖識別,再針對不同意圖呼叫對應功能的處理模組,例如透過使用者資料辨識出摘要或翻譯意圖,再呼叫文字摘要或機器翻譯模型。
傳統方法在開放域的意圖識別準確率不夠理想,而且不同功能模組各自為戰無法共享訊息,難以形成強大的 NLP 通用平台。 ChatGPT 突破了各自為戰的模式,不再區分不同功能,統一認為是對話過程中的一種特定需求。那麼,ChatGPT 的通用性為何做得如此好呢?一直在思考這個問題,由於沒有條件實驗證實,所以僅能猜想。
根據Google 的Instruction Tuning 研究工作FLAN,當模型達到一定規模(e.g. 68B)且Instruction 任務的類型達到一定數目(e.g. 40),模型就湧現出對新意圖的識別能力。 OpenAI 從其開放的 API 中收集了全球用戶各種任務類型的對話數據,根據意圖分類和標註,然後在 175B 參數 GPT-3.5 上進行 Instruction Tuning,自然就湧現出了通用的意圖識別能力。
災難性遺忘問題一直是深度學習中的一個挑戰,經常因為在某個任務上訓練後就喪失了在其他任務上的表現。例如,一個 30 億參數的基礎模型,先在自動問答資料上微調,然後在多輪對話資料上微調,結果會發現模型的問答能力大幅下降。 ChatGPT 似乎不存在這個問題,其在基礎模型GPT-3.5 上進行了兩次微調,第一次依據人工標註的對話數據進行微調,第二次根據人類反饋的強化學習進行微調,微調使用的數據很少,尤其是人類回饋的評分排序資料較少,微調後竟然仍表現出強大的通用能力,而並沒有完全過度擬合到對話任務。
这是个非常有趣的现象,也是我们没有条件验证的现象。猜测可能有两方面的原因,一方面是 ChatGPT 使用的对话微调数据实际可能包含了非常全面的 NLP 各种任务,正如 InstructGPT 中对用户使用 API 的问题分类可以发现,很多都不是简单的对话,还有分类、问答、摘要、翻译、代码生成等等,因此,ChatGPT 实际是对若干任务同时进行了微调;另一方面,可能当基础模型足够大之后,在较小数据上的微调不会对模型产生很大影响,可能仅在基础模型参数空间非常小的邻域中优化,所以不会显著影响基础模型的通用能力。
使用 ChatGPT 时就会发现它一个让人十分惊讶的能力,即使和 ChatGPT 交互了十多轮,它仍然还记得第一轮的信息,而且能够根据用户意图比较准确地识别省略、指代等细粒度语言现象。这些对我们人来说似乎不算问题,但是在 NLP 的研究历史中,省略、指代等问题一直是一个难以逾越的挑战。此外,在传统对话系统中,对话轮次多了之后,话题的一致性难以保障。
但是,ChatGPT 几乎不存在这个问题,即使轮次再多,似乎都可以保持对话主题的一致性和专注度。猜测这个能力可能有三方面的来源。首先,高质量的多轮对话数据是基础和关键,正如 Google 的 LaMDA,OpenAI 也采用人工标注的方式构造了大量高质量多轮对话数据,在此之上进行的微调将会激发模型的多轮对话能力。
其次,基于人类反馈的强化学习因为提升了模型回复的拟人性,也会间接增强模型多轮对话的一致性能力。最后,模型对 8192 个语言单元(Token)的显式建模能力使其几乎可以记忆普通人一整天的对话数据,在一次对话交流中很难超出这个长度,因此,所有对话历史都已经被有效记忆,从而可以显著提升连续多轮对话的能力。
交互修正能力是智能的一种高级体现,对我们来人说稀松平常的事情却是机器的痛点。在交流过程中,被指出问题后我们会立刻意识到问题所在并及时准确地修正相关信息。对于机器而言,意识到问题、识别问题范围并更正对应信息的每一步都不是一件容易的事情。ChatGPT 出现之前尚未看到过具有较强交互修正能力的通用模型。
与 ChatGPT 交互后就会发现,无论是用户更改自己之前的说法还是指出 ChatGPT 的回复中存在的问题,ChatGPT 都能够捕捉到修改意图,并准确识别出需要修改的部分,最后能够做出正确的修正。
目前为止,没有发现任何模型相关的因素与交互修正能力直接相关,也不相信 ChatGPT 具有实时学习的能力,一方面是重启对话后 ChatGPT 可能还会犯相同错误,另一方面是基础大模型的优化学习从来都是从高频数据中总结频繁模式,一次对话无论如何也难以更新基础模型。
相信更多的是基础语言大模型的一种历史信息处理技巧,不太确定的因素可能包括:
當我們問 ChatGPT 一些邏輯推理相關的問題時,它並不是直接給出答案,而是展示出詳細的邏輯推理步驟,最後給出推理結果。雖然雞兔同籠等很多案例表明 ChatGPT 並沒有學會推理本質,而僅僅學會了推理的表面邏輯,但是展示的推理步驟和框架基本上是正確的。
一個語言模型能夠學習到基本的邏輯推理模式已經極大超越了預期,其推理能力溯源是非常有趣的一個問題。相關對比研究發現,當模型夠大,且程式碼與文字資料混合訓練時,程式碼的完整邏輯鏈就會遷移泛化到語言大模型,從而大模型就擁有了一定的推理能力。
這種推理能力的習得有點神奇,但是也能理解,可能程式碼註解是從邏輯程式碼到語言大模型推理能力遷移泛化的橋樑。多語言能力也應該是類似的道理。 ChatGPT 的訓練資料絕大部分是英文,中文資料佔極少,然而我們發現 ChatGPT 的中文能力雖然比不上英文,但也非常強大。訓練資料中的一些中英對照的平行資料可能是英文能力遷移到中文能力的橋樑。
ChatGPT 有許多驚人的表現,其中一個是它可以針對同一個問題生成多種不同的回复,顯得很睿智。
例如,我們不滿意 ChatGPT 的回答,可以點擊 「重新生成」 按鈕,它立刻會產生另一種回复,若還是不滿意可以繼續讓其重新生成。這點在 NLP 領域並不神秘,對語言模型來說是它的一個基本能力,也就是取樣解碼。
一個文字片段的後面可能接不同的詞語,語言模型會計算每個詞語出現的機率,如果解碼策略選擇機率最大的詞語輸出,那麼每次結果都是確定的,就無法產生多樣性回應。如果依照詞彙輸出的機率分佈進行取樣,例如,「策略」 的機率是0.5,「演算法」 的機率是0.3,然後取樣解碼輸出「策略」 的可能性就是50%,輸出「演算法」 的可能性就是30%,從而保證了輸出的多樣性。因為採樣過程是按照機率分佈進行的,即使輸出結果多樣,但每次都是選擇機率較大的結果,所以多種結果看起來都相對比較合理。在比較不同類型的任務時,我們會發現 ChatGPT 的回覆多樣性針對不同下游任務差異比較大。
針對「如何」、「為什麼」 等「How」、「Why」 型任務時,重新產生的回覆與先前的回應無論是表達方式或具體內容有較大差異,針對機器翻譯、數學應用題等「What」 型任務時,不同回復之間的差異非常細微,有時幾乎沒有變化。如果都是依據機率分佈的取樣解碼,為何不同回復之間的差異如此之小。
猜測一種理想情況可能是「What」 型任務基礎大模型學習到的機率分佈非常尖銳(Sharp),例如學到的「策略」 機率為0.8,「演算法」 機率為0.1,所以大多時候採樣到相同的結果,也就是前面例子中80% 的可能性都會採樣到「策略」;「How」、「Why」 型任務基礎大模型學習到的機率分佈比較平滑(Smooth),例如「策略」 機率為0.4,「演算法」 機率為0.3,所以不同時候可以取樣到差異性較大的結果。
如果 ChatGPT 能夠學習到任務相關的非常理想的機率分佈,那確實非常厲害,基於取樣的解碼策略就可以適用於所有任務。通常,關於機器翻譯、數學計算、事實性問答等答案比較確定或 100% 確定的任務,一般採用基於貪婪解碼,也就是每次輸出機率最高的字詞。如果希望輸出相同語意的多樣性輸出,大多採用基於柱搜尋的解碼方法,但較少採用基於取樣的解碼策略。
從與 ChatGPT 的交互看,所有任務它似乎都採用了基於採樣的解碼方法,真是暴力美學。
答案缺乏可靠性是目前 ChatGPT 面臨的最大挑戰。特別是針對事實性和知識性相關的問答,ChatGPT 有時候會一本正經地胡編亂造,產生虛假資訊。即使讓它給出來源和來源或參考文獻,ChatGPT 通常也會產生一個不存在的網址或從未發表過的文獻。
不過,ChatGPT 通常會給使用者一種比較好的感覺,也就是很多事實和知識它似乎都知道。實際上,ChatGPT 就是一個語言大模型,而語言大模型本質就是一種深度神經網絡,深度神經網路本質就是一種統計模型,就是從高頻資料習得相關模式。很多常見的知識或事實,在訓練資料中出現頻率高,上下文之間的模式比較固定,預測的詞語機率分佈就比較尖銳,熵比較小,大模型容易記住,並在解碼過程中輸出正確的事實或知識。
但是,有許多事件和知識即使在非常龐大的訓練資料中也很少出現,大模型便無法學習到相關模式,上下文之間的模式比較鬆散,詞語預測的機率分佈較為平滑,熵比較大,大模型在推理過程中容易產生不確定性的隨機輸出。
這是包含 ChatGPT 在內所有生成式模型的固有問題。如果仍然延續 GPT 系列架構,基礎模型不做改變,從理論上講是難以解決 ChatGPT 回應的事實可靠性問題。和搜尋引擎的結合目前看是非常務實的一種方案,搜尋引擎負責搜尋可靠的事實資訊來源,ChatGPT 負責總結和歸納。
如果希望ChatGPT 解決事實回答的可靠性問題,可能需要進一步提升模型的拒識能力,也就是過濾掉模型確定無法回答的那些問題,同時還需要事實驗證模組來驗證ChatGPT 回復的正確性。希望下一代 GPT 能夠在這個問題上取得突破。
ChatGPT 的互動修正能力使得它看起來似乎擁有了即時的自主學習能力。
正如上述討論,ChatGPT 可以依據使用者提供的修改意圖或更正訊息,立刻修正相關回复,表現出即時學習的能力。實則不然,學習能力體現的是學到的知識是普適的,可以運用在其他時間和其他場合,但是 ChatGPT 並沒有展現出這個能力。 ChatGPT 只是在目前的對話中能夠根據使用者回饋進行了修正,當我們重啟一個對話,測試相同的問題時,ChatGPT 也會犯相同或類似的錯誤。
一個疑問是為何 ChatGPT 不將修改後正確的資訊儲存到模型中?這裡有兩方面的問題。首先,使用者回饋的資訊不一定是正確的,有時候故意引導ChatGPT 做出不合理的回答,只是因為ChatGPT 在基於人類回饋的強化學習中加深了對使用者的依賴程度,所以ChatGPT 在同一個對話過程中會非常相信用戶的回饋。其次,即使使用者回饋的資訊是正確的,但因為可能出現頻率不高,基礎大模型無法根據低頻資料更新參數,否則大模型就會對某些長尾資料進行過度擬合而失去通用性。
所以,讓 ChatGPT 即時學習非常困難,一個簡單直覺的方案就是每經過一段時間就利用新的資料微調 ChatGPT。或採用觸發機制,當多個使用者提交相同或相似回饋時觸發模型的參數更新,從而增強模型的動態學習能力。
本文作者張家俊是中國科學院自動化研究所研究員,原文連結:
https://zhuanlan .zhihu.com/p/606478660
#以上是關於ChatGPT八個技術問題的猜想的詳細內容。更多資訊請關注PHP中文網其他相關文章!