今天給大家科普一下 AI 大模型的訓練過程是什麼樣的。
之前在和一些同學溝通的過程中,經常被問到“一個大模型到底是如何被訓練出來的?",在交流完畢後,發現一個非常容易困擾大家的點,那就是——
大模型的訓練是無監督學習還是有監督學習?在大模型訓練過程中,資料的標籤是什麼?如何計算損失然後進行反向傳播的呢?
1、是有監督還是無監督
事實上,很多自然語言處理(NLP)的模型,尤其是上文提到的大語言模型(如 GPT 系列),都是透過無監督學習或自監督學習的方式進行訓練的。
也就是說它們不需要人工標註的標籤來進行訓練。
試想一下,訓練 GPT 的資料樣本大多來自於網際網路,如果需要對這些資料進行標註的話,會花費大量的人力,並且很多長文字是沒有辦法或者很難去標註的。
因此這類模型的訓練採用的基本是自監督學習的模式。
自監督學習可以認為是無監督學習的一種特殊方式。
模型透過從輸入資料本身生成的偽標籤來進行訓練,這些偽標籤不是由人工標註的,而是由模型根據一定的規則自動生成的。
常見的自監督學習任務模型有以下兩種。
第一種是掩碼語言模型(Masked Language Model, MLM),這是 BERT 等模型使用的一種訓練方法。
它將其中一部分輸入詞進行隨機掩碼(替換為一個特殊的掩碼符號),模型的任務就是是預測這些被掩碼的詞。
這樣,模型就能學習到詞與上下文之間的關係,有點類似於讓模型不斷進行完形填空的意思。
第二種是因果語言模型(Causal Language Model, CLM),這是 GPT 系列模型使用的一種訓練方法。
在這種訓練模式下,模型被訓練來預測給定前文的下一個詞,這樣,模型就能學習到文字的順序結構和語言的生成過程。
說到這你可能還不完全清楚,看下面的例子就明白了。
2、GPT 的訓練過程
以因果語言模型的訓練為例,假設給模型的輸入資料是:The quick brown fox jumps over the lazy 這句話。
當然實際訓練時,輸入給模型的資料還會經過 Tokenization、詞嵌入和位置編碼這些步驟,但是我們這裏先繞過,不影響理解。
在 GPT 等模型的訓練時,如果給定上述句子作為模型的輸入,是希望模型可以預測出下一個詞是什麼,這是模型的任務。
因此,每給定一個單詞(Token),模型都要預測下一個詞,然後將預測出來的詞加上原來已有的詞作為新的輸入,繼續預測下一個詞,如此反覆迭代。
將訓練過程寫出虛擬碼是如下形式。
# 假設: # - input_tokens 是輸入序列 # - target_tokens 是目標序列 # - transformer_model 是一個Transformer模型 # - optimizer 是用於最佳化模型引數的最佳化器 # - loss_function 是損失函式,例如交叉熵損失 for epoch in range(num_epochs): # 迭代多個訓練週期 for input_tokens, target_tokens in data_loader: # 1. 模型輸入 # 將輸入token轉換為嵌入向量,進行詞嵌入和位置編碼 input_embeddings = embedding_layer(input_tokens) position_embeddings = get_position_embeddings(input_embeddings) transformer_input = input_embeddings + position_embeddings # 2. Transformer模型 # 透過Transformer模型得到輸出 transformer_output = transformer_model(transformer_input) # 3. 模型輸出和損失計算 # 將Transformer輸出轉換為logits logits = output_layer(transformer_output) loss = loss_function(logits, target_tokens) # 計算損失 # 4. 梯度下降和反向傳播 optimizer.zero_grad() # 清除之前的梯度 loss.backward() # 反向傳播,計算梯度 optimizer.step() # 更新模型引數
上面的 input_tokens 就可以認為是輸入的一句話。
可以看到在計算損失的時候,比較的是模型的輸出和 target_tokens 的損失。
模型的輸出我們好理解,就是模型預測的下一個詞,那麼 target_tokens 是什麼呢?
上面說到自監督學習的時候,說到一句話:“自監督學習中的偽標籤是模型透過一定的規則生成的”。
**target_tokens 就是偽標籤,**因為模型需要預測下一個詞,因此“一定的規則”就是對輸入 token 往後移一位來實現的,如下所示。
input_tokens 是原始句子中的單詞序列,而 target_tokens 是這個序列向右移動一個位置的結果。
在訓練過程中,模型會試圖根據 input_tokens 中的每個詞來預測 target_tokens 中的下一個詞。
例如,給定輸入 "The",模型應該預測輸出 "quick";然後將 "The" 和 "quick "合成新的輸入 "The quick" 給模型,模型應該預測出 "brown",以此類推。
這樣經過大量甚至是海量的文字資料的自監督學習,模型就可以學到很多自然語言的結構和句式了。
大語言模型也就訓練完成了。
當然上面的過程說的很粗糙,僅僅是想讓大家先搞清楚自監督學習這個概念,以及實際模型訓練時,模型是如何自我監督的。
相信看完之後,你會對大模型的訓練有一個更加清晰的認識了吧。