ChatGPT 原理簡介

GPT3的基本思想

GPT2 沒有引起多大轟動,真正改變 NLP 格局的是第三代版本。

GPT3 訓練的數據包羅萬象,上通天文下知地理,所以它會胡說八道, 會說的賊離譜,比如讓你穿越到唐代跟李白對詩,不在一個頻道上,他說的你理解不了,你說的他理解不了。

GPT3 太泛了,把世界上所有的東西都給訓練了,不受約束條件的、無法無天,給它發一個指令,它抗拒指令,按照自己的思維模式去做,比如我問一個問題,接下來你用 python 代碼的方式來回答我,它可能不按照這個模式來,不受我的約束。

這就是 GPT3,不按照我們自己的思維去做我們自己的事情,也是給後面的 ChatGPT 做了一個鋪墊。

GPT3 三種模式對比

不管我輸入什麼,後面都會加上提示,比如把英文轉換成法語,接下來就輸出了法語。

爲了讓它更好的理解我說的意思,我給它舉了一個例子。

舉一個例子,這個例子作爲輸入,我讓你幹什麼,我給你舉一個例子,你回答的時候可以參考這個例子。

這些例子都是我寫到輸入對話框中,一起給到模型,模型基於我寫的例子,再往下輸出。

Few-shot 是舉多個例子。

這就是 GPT3 的基本思想。

Few-shot 像在下游任務中又做了個簡單的訓練,比如舉了三個例子,即三條數據,相當於把下游任務融入到了這個任務當中。

GPT3 本質上還是一個生成式模型,它不需要下游任務,下游任務可以放到 Few-shot 或放到 One-shot 中。

橫軸表示語言模型的大小, One-shot 和 Few-shot 之間還是存在差異的,尤其是模型越大的時候,差異越明顯,Few-shot 效果更好一些。

GPT3 網絡結構沒有什麼亮眼的,就是把 Transformer 做的更大了。

NLP 哪家強,就看誰的模型更大,誰的數據更多。

OpenAI 訓練的 GPT-3 1750 億個權重參數,每批次的訓練數據大小是 3.2M,這麼大的量級,目前只有 OpenAI 大型 GPU 集羣才能玩的轉。

準備訓練數據

準備數據不難,但數據又多又幹淨纔不容易準備。

OpenAI 對收集到的數據有質量的判斷,對於網頁的爬取會設計一些算法去評估哪些網頁要求比較低或可信度比較低的,它會把這些網頁過濾掉,只爬一些有價值的網頁。

GPT 三代算法告訴我們一件事,這種生成式語言模型能解決一切的事情,即以不變應萬變。以後的趨勢是 GPT 這個系列一家獨大,可能再過 10 年 NLP 的其他分支就不存在了,因爲一個通用大模型可以解決所有的事情,幹嘛還要每個 NLP 分支做自己的東西呢。

CODEX

程序猿一般都是面向百度、Google 編程,而 GPT 面向 github 編程。

使用 GPT-3 模型,訓練數據是所有的 github 數據,進行重新訓練(注意不是微調)。

github 和 OpenAI 都是微軟的,所以 CODEX 拿到 github 的數據很容易,然後進行清洗和訓練。

10 年之內不用考慮程序猿能否被替代,因爲 ChatGPT 以及現在的 GPT 還不能解決特別多的實際任務。

舉例說明什麼是有監督學習?

小時候家裏沒錢買電腦,就經常上網吧,我爸就教育我不要去網吧,我特別理解我爸,我還沒嫌他窮呢他還嫌我上網吧。我爸教育我,你這麼做是不對的,我爸給了明確的標籤,有了標準答案,我下次去網吧的時候,就會想一想是我不對,不是我爸不對,那這次我就不去網吧了,這是一個有監督學習。

人工的給了一些標註,在預訓練模型基礎之上繼續去學一學正確的說話邏輯,學一學怎樣正確的回答問題。

ChatGPT 提出的第一件事情就是不能再用無監督去做了,無監督不確定的東西太多了,它生出來的東西是好是壞都不好說,所以要限制它,它的語言能力已經非常強了,我們現在要讓它繼續去完成我們的任務,學我們說的話,辦我們說的事,所以 ChatGPT 是有監督訓練。

模型越大、參數越大並不是越好,文本模型越大,參數越多,結果越專一,越專一的結果可能並不是想要的,比如隨便問一句話,永遠回覆的一樣。

訓練模型,希望模型學人類說話的邏輯,說人話辦人事,讓機器更像人,更符合人的邏輯的給你解釋這些東西,而不是像原來的 GPT3 只是純生成的模型,那下一步應該怎麼辦?

大家在問 ChatGPT 問題的時候,後面加一個提示,這些提示是經常問的問題,這些問題由人工標註,人工來回答。有了輸入和輸出,接下來訓練 GPT3.5 模型,繼續在它無監督的基礎上再去做這個有監督任務,有監督學習就是我們希望它輸出啥,就用這樣的數據去訓練它。

無監督學習任務中不可能有一個學習的過程,而有監督首先要解決的就是敏感話題,比如跳樓是一個不好的,得告訴你不要去跳樓。

這得需要有監督去做,通過有監督解決無監督解決不了的事情,要說人話、辦人事。

強化學習

先來玩個遊戲,來了解下什麼是強化學習,

右邊有一個飛船,想降落在 2 個旗子當中,某一時刻的飛船可以往左走,也可以往右走,那飛船應該往哪邊走?

上圖中的飛船想要落到兩個棋子中間需要往左走,飛船往左走的時候給它一個獎勵,表示走對了,如果往右走了,獎勵就很低,表示走錯了。

飛船降落的過程,不要把它想象成一個連續的,當它是離散的,比如它是由 1000 個 step 組成,每一個 step 都有當前的一個狀態 當前位置以及 action(action 表示接下來往那邊走)這些屬性。

我們所關注的東西,並不是一個片面的,即並不是每一步走的怎麼樣,而是要看最終的一個累加的結果。

這是目標函數,希望全局獎勵越高越好。

不關注每一步怎麼樣,而是看全局,飛船完成一個完整的過程之後總的獎勵,這就是強化學習基本的思想。

有這樣一個序列,{s1,a1,s2,a2,....,st,at}, 表示飛船在每一個 step 的狀態和 action,

類似於見人(s1)說人話(a1),見鬼(s2)說鬼話(a2)。

那每一步如何走才能得到更多的獎勵呢,這就需要訓練神經網絡了。

把 a1 輸入到神經網絡中,不需要知道 a1 是人還是鬼,神經網絡輸出這個狀態下的預測結果是什麼。

或者把這個圖片作爲輸入到神經網絡中,

神經網絡會告訴飛船往左走。

狀態和動作可以跟神經網絡聯繫在一起,動作做的對做的準獎勵才高。

爲了讓獎勵做的高,神經網絡的權重參數要不斷更新。

通過獎勵最高這種機制來訓練神經網絡,讓神經網絡知道輸入一個狀態,怎麼樣輸出一個好的答案。

在 ChatGPT 中,狀態是你輸入的一句話,action 是輸出的一句話。

象棋、圍棋等遊戲也都可以設置獎勵,阿法爾狗大戰李世石就是用強化學習來做的。

用強化學習,得需要有什麼?

得有一個獎勵,得知道這一步到底做的對不對,做的不對的話,再改正,所以需要單獨訓練一個可以預測獎勵的模型。

輸入一句話到獎勵模型,輸出一個 reward(獎勵值)。

爲什麼ChatGPT沒有用純的監督學習來訓練?不用強化學習行不行?

比如我上網吧,我爸給我一頓揍,這是監督學習,我爸告訴我,我幹這件事情是錯的。

我爸揍我的強弱程度決定了這件事我是錯的多還是錯的少,這是監督學習,直接告訴你這件事情是對的還是錯的。

我去網吧了,我爸回家哭了,我沒哭,我尋思我爸咋哭了,是不是我哪做的不對?是不是以後不上網吧就行了呢?強化學習並不是哪件事情是對還是錯,而是告訴你,你做的這個東西,可能是好的,可能也是不好的,但沒有告訴你有多不好或有多壞,你接下來怎麼去更新並不是一個固定的機制,需要我去思考的,不是固定的。

再比如導師給你安排了一個項目,但沒有說具體該怎麼做。

導師說:你態度不端正,思考問題的方式不行。

說你不對,但沒有告訴你哪塊不對,也沒有告訴你這個項目第一步怎麼做,第二步怎麼做,不會告訴你具體的每一件事。

如果導師告訴你就是有監督學習,你輸入一個東西,我告訴你答案,但是沒有鍛鍊到你。

你回到家去思考,想到一個解決方式,就先這麼改進吧,改進完之後,給導師看,導師又給一頓罵,在反覆找導師的過程中會思考一個問題,怎麼做更迎合導師的思維。

強化學習並不是一個固定的輸入輸出模式,怎麼做能讓輸出的東西更符合想要的答案,強化學習不是給你的一個答案,而給的是導師的滿意程度。

需要額外再訓練一個獎勵模型,第一步少不了人工標註。

比如隨便問一個問題 “你瞅啥?”,產生四種答案:瞅你咋滴、沒瞅啥、我就隨便看看、你說啥。

導師對 4 個答案打分,對於每一個輸出都要人工打分,人工打分之後,再做一個排序操作。

人工打分需要知道什麼樣的打分高,什麼樣的打分低。

怎麼訓練獎勵模型,輸入一句話,輸出一個分值?

正常的語言模型要輸出接下來預測的每一個詞的概率,比如一共有 3 萬個詞,每個詞的概率是多少。獎勵模型不是這樣了,它把最後的輸出層改了,去預測一個得分值。

獎勵模型還是基於 Transformer 去做的,只是以前是一個分類任務,3 萬個詞,預測每個詞的得分,現在變成了預測一個得分值。

通過這個損失函數去猜怎麼訓練的,這個獎勵模型是一個小的 6 億參數的 GPT。

x 是 “你瞅啥”,

Yw 是得分最高的那一個,

Yl 是得分較低的那一個,

w 是 “瞅你咋滴”,

l 是 “我就隨便看看”。

得分最高和最低兩者差異越大越好,

sigmod 函數,差異越大,得到的結果越接近 1。得分高的和得分低的沒啥差異的化,可能就接近 0,效果就越差。

傳入 log 對數函數中,越接近 1 的,損失越小,越接近 0 的 ,損失越大。

標註分高的和標註分低的,起碼在獎勵得分上要高出一個等級,越高越好。輸入和輸出是由人工標註的。

比如 k=4,表示 4 句話,比如選 “瞅你咋滴” 和 "隨便看看" 以及 "沒瞅啥","你說啥",從中選擇 2 個, 所有的輸出結果都是由人工標註的,在所有標註中任選其中的 2 個,k 個裏面選 2 個來計算,損失越低越好。

獎勵模型怎麼去做,首先人工標註,想要的,得分高點;不想要的,得分低點。

獎勵模型並不需要特別大的模型,若是 1750 億權重參數的模型,驗證集準確率很低,效果一般,小版本 6 億參數的模型卻恰恰好。

繼續訓練這個模型得到一個初始化模型,最後的一個圈層 當中正常是要做一個多分類,現在把多分類用 FC 預測一個得分值。

往 ChatGPT 模型中輸入 “你瞅啥”,輸出 “沒瞅啥”,

輸出的東西要往獎勵模型中傳入,獎勵模型會幫你輸出一個分數,分數低的話,要更新 ChatGPT 模型的權重參數。

通過強化學習的方式就可以無限制的更新我們的模型了, 獎勵模型會判斷你輸入給我的東西是不是我想要的,是我想要的,分高一點,不是我想要的,分低一點, 根據分的高低更新 ChatGPT。

比如經過了一個 epoch(一個 epoch 等於使用訓練集中的全部樣本訓練一次的過程)之後,ChatGPT 更新了一次,獎勵模型也要進行更新,交替訓練,交替更新,這就是強化學習當中的基本思想。

ChatGPT 和獎勵模型都是在原始的 GPT 中衍生過來的。

我們需要的模型就是通過 RL 來更新的,模型輸出的句子通過獎勵模型得到得分,再反饋,而且模型更新一陣後,也需要再更新獎勵模型。

目標函數

這是目標函數,首先要更新的是 ChatGPT 模型,這是最核心的,模型在更新的過程中,希望 x 傳入這個模型之後得到的獎勵越高越好,對應着第一項越大越好,第一項後面是一個減號,對於目標函數來說,希望減去的第二項越小越好。

貝塔係數(β)是一個權重, SFT 表示有監督渲染出來的模型,把 x 輸入之後,有監督模型會幫我們生成一個結果,強化學習 ChatGPT 也會生成一個結果,強化學習跟有監督之間的一個 pk,兩者做了一個除法,輸出是一個句子,可以把輸出一個句子叫輸出一個分佈或者輸出它的概率分佈,這時強化學習認爲輸入這個句子每個詞的概率分佈合在一起。

右邊是有監督模型,它輸出的句子每個詞的概率分佈合在一起。

計算兩個分佈之間的差異。

前面是一個對數,對數當中只有爲 1 的時候最小。

除法 2/2=1、3/3 爲 1,兩者旗鼓相當。

強化學習思維會比較發散,那怎麼做才能得分高?可能會嘗試很多東西。

類比怎麼讓導師滿意我?我給他轉 100 萬和用監督模型學習,結果導師可能都高興, 但現在越學越離譜了,因爲強化學習不太可控,強化學習說你把導師揍一頓,他下次就不敢說你了,會和人工標註的(有監督)差異非常大。

強化學習要探索,我不知道正確答案,但我不按套路出牌,我可以任意去發揮,它很容易發散,比如我從 9 樓跳下去,它說你從天台跳,9 樓可能摔不死。

需要降低強化學習和有監督的差異,強化學習太離譜了,別讓它那麼離譜,減去這個差異,要以人爲主,跟有監督模型(人工標註的)做對比,你要去學怎麼樣接近人類的思維。

這個是泛化能力,之前是沒有的,額外做了拓展,即做了一個對比實驗。

模型能生成你的對話,但模型不僅僅生成對話。

類比你的體育天賦特別好,一般跑步跳遠很棒的人,踢足球也是很好的。

加了一些下游任務,在不同的下游任務裏面也要預測的好,比如情感分析、機器翻譯、文本摘要,在這些例子中也會做的不錯,所以叫它泛化能力。

就在當前這個前提上,可能人家又加了一些業務場景,在其他業務場景中也要做的好,這就是一個多目標損失函數 ,而不僅是一項做的好。

強化學習要以人爲主,儘可能跟有監督是類似的,最後再結合一個泛化能力,應用到不同的拓展任務當中,效果也要好纔行。

上面所將的 ChatGPT 思想出自 2020 年的一篇論文。

它是做文本摘要的,怎麼把文本摘要做的好?

第一步:

人工的去收集一些數據,這個文本應該有哪些摘要。

在語言模型當中再加上下游任務。

第二步:

訓練一個獎勵模型,獎勵模型希望得分高的和得分低的差異越大越好,要讓模型知道這樣一個事。

再用 PPO 損失函數去渲染整個模型。

OpenAI做了個分析

GPT、給 GPT 加了提示、有監督模型、PPO(強化學習思想)、ptx(泛化能力)這幾個模型的對比效果圖。

第一個比較維度,問 ChatGPT 能不能爭取有效的回答。

第二個維度,有沒有滿足限制條件,比如請你用一個女生的口吻來和我說話。

第三個維度,模型輸出的有沒有太離譜的,爲什麼解釋以人本,其實就是以這個圖思考的,

第四個維度,能不能幫我們解決常見的事情,比如充當一個助手。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/u5TVMh_HnTW1hOA5YUSYLA