<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          RWKV – transformer 與 RNN 的強強聯(lián)合

          共 8000字,需瀏覽 16分鐘

           ·

          2023-06-06 14:12

          在 NLP (Natural Language Processing, 自然語言處理) 領域,ChatGPT 和其他的聊天機器人應用引起了極大的關注。每個社區(qū)為構建自己的應用,也都在持續(xù)地尋求強大、可靠的開源模型。自 Vaswani 等人于 2017 年首次提出 Attention Is All You Need 之后,基于 transformer 的強大的模型一直在不斷地涌現(xiàn),它們在 NLP 相關任務上的表現(xiàn)遠遠超過基于 RNN (Recurrent Neural Networks, 遞歸神經(jīng)網(wǎng)絡) 的 SoTA 模型,甚至多數(shù)認為 RNN 已死。而本文將介紹一個集 RNN 和 transformer 兩者的優(yōu)勢于一身的全新網(wǎng)絡架構——RWKV!現(xiàn)已在 HuggingFace transformers 庫中支持。

          RWKV 項目概覽

          RWKV 項目已經(jīng)啟動,由 Bo Peng 主導、貢獻和維護。同時項目成員在官方 Discord 也開設了不同主題的討論頻道: 如性能 (RWKV.cpp、量化等),擴展性 (數(shù)據(jù)集收集和處理),相關研究 (chat 微調、多模態(tài)微調等)。該項目中訓練 RWKV 模型所需的 GPU 資源由 Stability AI 提供。

          讀者可以加入 官方 discord 頻道 了解詳情或者參與討論。如想了解 RWKV 背后的思想,可以參考這兩篇博文:

          • https://johanwind.github.io/2023/03/23/rwkv_overview.html
          • https://johanwind.github.io/2023/03/23/rwkv_details.html

          Transformer 與 RNN 架構對比

          RNN 架構是最早廣泛用于處理序列數(shù)據(jù)的神經(jīng)網(wǎng)絡架構之一。與接收固定輸入尺寸的經(jīng)典架構不同,RNN 接收當前時刻的 “token”(即數(shù)據(jù)流中的當前數(shù)據(jù)點) 和先前時刻的 “狀態(tài)” 作為輸入,通過網(wǎng)絡預測輸出下一時刻的 “token” 和 ?“狀態(tài)”,同時輸出的 “狀態(tài)” 還能繼續(xù)用到后續(xù)的預測中去,一直到序列末尾。RNN 還可以用于不同的 “模式”,適用于多種不同的場景。參考 Andrej Karpathy 的博客,RNN 可以用于: 一對一 (圖像分類),一對多 (圖像描述),多對一 (序列分類),多對多 (序列生成),等等。

          4e480b4c5ee24e2841b41aa58a1fca4f.webp

          由于 RNN 在計算每一時刻的預測值時使用的都是同一組網(wǎng)絡權重,因此 RNN 很難解決長距離序列信息的記憶問題,這一定程度上也是訓練過程中梯度消失導致的。為解決這個問題,相繼有新的網(wǎng)絡架構被提出,如 LSTM 或者 GRU,其中 transformer 是已被證實最有效的架構。

          在 transformer 架構中,不同時刻的輸入 token 可以在 self-attention 模塊中并行處理。首先 token 經(jīng)過 Q、K、V 權重矩陣做線性變換投影到不同的空間,得到的 Q、K 矩陣用于計算注意力分數(shù) (通過 softmax,如下圖所示),然后乘以 V 的隱狀態(tài)得到最終的隱狀態(tài),這種架構設計可以有效緩解長距離序列問題,同時具有比 RNN 更快的訓練和推理速度。

          7c4faee27f2e68e5acfe2a73dc51bd4a.webpbb264ec4734285e03207d783a069f481.webp

          在訓練過程中,Transformer 架構相比于傳統(tǒng)的 RNN 和 CNN 有多個優(yōu)勢,最突出的優(yōu)勢是它能夠學到上下文特征表達。不同于每次僅處理輸入序列中一個 token 的 RNN 和 CNN,transformer 可以單次處理整個輸入序列,這種特性也使得 transformer 可以很好地應對長距離序列 token 依賴問題,因此 transformer 在語言翻譯和問答等多種任務中表現(xiàn)非常亮眼。

          在推理過程中,RNN 架構在推理速度和內存效率方面會具有一些優(yōu)勢。例如計算簡單 (只需矩陣 - 向量運算) 、內存友好 (內存不會隨著推理階段的進行而增加),速度穩(wěn)定 (與上下文窗口長度一致,因為 RNN 只關注當前時刻的 token 和狀態(tài))。

          RWKV 架構

          RWKV 的靈感來自于 Apple 公司的 Attention Free Transformer。RWKV 該架構經(jīng)過精心簡化和優(yōu)化,可以轉換為 RNN。除此此外,為使 RWKV 性能媲美 GPT,還額外使用了許多技巧,例如 TokenShift 和 ?SmallInitEmb (使用的完整技巧列表在 官方 GitHub 倉庫的 README 中 說明)。對于 RWKV 的訓練,現(xiàn)有的項目倉庫可以將參數(shù)量擴展到 14B,并且迭代修了 RWKV-4 的一些訓練問題,例如數(shù)值不穩(wěn)定性等。

          RWKV 是 RNN 和 Transformer 的強強聯(lián)合

          如何把 transformer 和 RNN 優(yōu)勢結合起來?基于 transformer 的模型的主要缺點是,在接收超出上下文長度預設值的輸入時,推理結果可能會出現(xiàn)潛在的風險,因為注意力分數(shù)是針對訓練時的預設值來同時計算整個序列的。

          RNN 本身支持非常長的上下文長度。即使在訓練時接收的上下文長度有限,RNN 也可以通過精心的編碼,來得到數(shù)百萬長度的推理結果。目前,RWKV 模型使用上下文長度上為 8192 ( ctx8192) 和 ?ctx1024 時的訓練速度和內存需求均相同。

          傳統(tǒng) RNN 模型的主要缺陷,以及 RWKV 是如何避免的:

          1. 傳統(tǒng)的 RNN 模型無法利用很長距離的上下文信息 (LSTM 用作語言模型時也只能有效處理約 100 個 token),而 RWKV 可以處理數(shù)千個甚至更多的 token,如下圖所示:
          ad99a84a5d261216475d2ad75450e29a.webp
          1. 傳統(tǒng)的 RNN 模型無法并行訓練,而 RWKV 更像一個 “線性 GPT”,因此比 GPT 訓練得更快。

          通過將這兩個優(yōu)勢強強聯(lián)合,希望 RWKV 可以實現(xiàn) “1 + 1 > 2” 的效果。

          RWKV 注意力公式

          RWKV 模型架構與經(jīng)典的 transformer 模型架構非常相似 (例如也包含 embedding 層、Layer Normalization、用于預測下一 token 的因果語言模型頭、以及多個完全相同的網(wǎng)絡層等),唯一的區(qū)別在于注意力層,它與傳統(tǒng)的 transformer 模型架構完全不同,因此 RWKV 的注意力計算公式也不一樣。

          本文不會對注意力層過多的介紹,這里推薦一篇 Johan Sokrates Wind 的博文,里面有對注意力層的分數(shù)計算公式等更全面的解釋。

          現(xiàn)有檢查點

          純語言模型: RWKV-4 模型

          大多數(shù)采用 RWKV 架構的語言模型參數(shù)量范圍從 170M 到 14B 不等。據(jù) RWKV 概述博文 介紹,這些模型已經(jīng)在 Pile 數(shù)據(jù)集上完成訓練,并進行了多項不同的基準測試,取得了與其他 SoTA 模型表現(xiàn)相當?shù)男阅芙Y果。

          99a9369e21d030f3163b7ea3aea84cee.webp

          指令微調/Chat 版: RWKV-4 Raven

          Bo 還訓練了 RWKV 架構的 “chat” 版本: RWKV-4 Raven 模型。RWKV-4 Raven 是一個在 Pile 數(shù)據(jù)集上預訓練的模型,并在 ALPACA、CodeAlpaca、Guanaco、GPT4All、ShareGPT 等上進行了微調。RWKV-4 Raven 模型有多個版本,如不同語言 (僅英文、英文 + 中文 + 日文、英文 + 日文等) 和不同大小 (1.5B 參數(shù)、7B 參數(shù)、14B 參數(shù)) 等。

          所有 HF 版的模型都可以在 Hugging Face Hub 的 RWKV 社區(qū)主頁 找到。

          集成 ?? Transformers 庫

          感謝這個 Pull Request 的貢獻,RWKV 架構現(xiàn)已集成到 ?? transformers 庫中。在作者撰寫本文之時,您已經(jīng)可以通過從源代碼安裝 transformers 庫,或者使用其 main 分支。RWKV 架構也會與 transformers 庫一起更新,您可以像使用任何其他架構一樣使用它。

          下面讓我們來看一些使用示例。

          文本生成示例

          要在給定 prompt 的情況下生成文本,您可以使用 pipeline:

          from?transformers?import?pipeline
          model_id?=?"RWKV/rwkv-4-169m-pile"
          prompt?=?"\nIn?a?shocking?finding,?scientist?discovered?a?herd?of?dragons?living?in?a?remote,?previously?unexplored?valley,?in?Tibet.?Even?more?surprising?to?the?researchers?was?the?fact?that?the?dragons?spoke?perfect?Chinese."
          pipe?=?pipeline("text-generation",?model=model_id)
          print(pipe(prompt,?max_new_tokens=20))
          >>>?[{'generated_text':?'\nIn?a?shocking?finding,?scientist?discovered?a?herd?of?dragons?living?in?a?remote,?previously?unexplored?valley,?in?Tibet.?Even?more?surprising?to?the?researchers?was?the?fact?that?the?dragons?spoke?perfect?Chinese.\n\nThe?researchers?found?that?the?dragons?were?able?to?communicate?with?each?other,?and?that?they?were'}]

          或者可以運行下面的代碼片段:

          import?torch
          from?transformers?import?AutoModelForCausalLM,?AutoTokenizer
          model?=?AutoModelForCausalLM.from_pretrained("RWKV/rwkv-4-169m-pile")
          tokenizer?=?AutoTokenizer.from_pretrained("RWKV/rwkv-4-169m-pile")
          prompt?=?"\nIn?a?shocking?finding,?scientist?discovered?a?herd?of?dragons?living?in?a?remote,?previously?unexplored?valley,?in?Tibet.?Even?more?surprising?to?the?researchers?was?the?fact?that?the?dragons?spoke?perfect?Chinese."
          inputs?=?tokenizer(prompt,?return_tensors="pt")
          output?=?model.generate(inputs["input_ids"],?max_new_tokens=20)
          print(tokenizer.decode(output[0].tolist()))
          >>>?In?a?shocking?finding,?scientist?discovered?a?herd?of?dragons?living?in?a?remote,?previously?unexplored?valley,?in?Tibet.?Even?more?surprising?to?the?researchers?was?the?fact?that?the?dragons?spoke?perfect?Chinese.\n\nThe?researchers?found?that?the?dragons?were?able?to?communicate?with?each?other,?and?that?they?were

          使用 Raven 模型 (chat 模型) 示例

          您可以以 alpaca 風格使用提示 chat 版模型,示例如下:

          from?transformers?import?AutoTokenizer,?AutoModelForCausalLM
          model_id?=?"RWKV/rwkv-raven-1b5"
          model?=?AutoModelForCausalLM.from_pretrained(model_id).to(0)
          tokenizer?=?AutoTokenizer.from_pretrained(model_id)
          question?=?"Tell?me?about?ravens"
          prompt?=?f"###?Instruction:?{question}\n###?Response:"
          inputs?=?tokenizer(prompt,?return_tensors="pt").to(0)
          output?=?model.generate(inputs["input_ids"],?max_new_tokens=100)
          print(tokenizer.decode(output[0].tolist(),?skip_special_tokens=True))
          >>>?###?Instruction:?Tell?me?about?ravens
          ###?Response:?RAVENS?are?a?type?of?bird?that?is?native?to?the?Middle?East?and?North?Africa.?They?are?known?for?their?intelligence,?adaptability,?and?their?ability?to?live?in?a?variety?of?environments.?RAVENS?are?known?for?their?intelligence,?adaptability,?and?their?ability?to?live?in?a?variety?of?environments.?They?are?known?for?their?intelligence,?adaptability,?and?their?ability?to?live?in?a?variety?of?environments.

          據(jù) Bo 所述,這條 discord 消息 (訪問超鏈接時請確保已加入 discord 頻道) ?中有更詳細的書寫指令技巧。

          a9a20694075f27f000a07d39bcf818b9.webp

          權重轉換

          任何用戶都可以使用 transformers 庫中提供的轉換腳本輕松地將原始 RWKV 模型權重轉換為 HF 格式。具體步驟為: 首先,將 “原始” 權重 push 到 Hugging Face Hub (假定目標倉庫為 RAW_HUB_REPO,目標權重文件為 RAW_FILE),然后運行以下轉換腳本:

          python?convert_rwkv_checkpoint_to_hf.py?--repo_id?RAW_HUB_REPO?--checkpoint_file?RAW_FILE?--output_dir?OUTPUT_DIR

          如果您想將轉換后的模型 push 到 Hub 上 (假定推送目錄為 dummy_user/converted-rwkv),首先請確保在 push 模型之前使用 huggingface-cli login 登錄 HF 賬號,然后運行:

          python?convert_rwkv_checkpoint_to_hf.py?--repo_id?RAW_HUB_REPO?--checkpoint_file?RAW_FILE?--output_dir?OUTPUT_DIR?--push_to_hub?--model_name?dummy_user/converted-rwkv

          未來工作

          多語言 RWKV

          Bo 目前正在研究在多語言語料庫上訓練 RWKV 模型,最近發(fā)布了一個新的 多語言分詞器。

          社區(qū)后續(xù)研究方向

          RWKV 社區(qū)非?;钴S,致力于幾個后續(xù)研究方向。項目清單可以在 RWKV 的 discord 專用頻道中找到 (訪問超鏈接時請確保已加入 discord 頻道)。歡迎加入這個 RWKV 研究頻道,以及對 RWKV 的積極貢獻!

          模型壓縮與加速

          由于只需要矩陣 - 向量運算,對于非標準化和實驗性的計算硬件,RWKV 是一個非常理想的架構選擇,例如光子處理器/加速器。

          因此自然地,RWKV 架構也可以使用經(jīng)典的加速和壓縮技術 (如 ONNX、4 位/8 位量化等)。我們希望集成了 transformer 的 RWKV 架構能夠使更多開發(fā)者和從業(yè)者受益。

          在不久的將來,RWKV 還可以使用 optimum 庫提出的加速技術。rwkv.cpp 或 rwkv-cpp-cuda 倉庫涉及的其中一些技術在庫中已標明。

          致謝

          我們 Hugging Face 團隊非常感謝 Bo 和 RWKV 社區(qū)抽出寶貴時間來回答關于架構的問題,以及非常感謝他們的幫助和支持。我們很期待在 HF 生態(tài)中看到更多 RWKV 模型的應用。我們還要感謝 Johan Wind 發(fā)布的關于 RWKV 的博文,這對我們理解架構本身和其潛力有很大幫助。最后,我們著重感謝 ArEnSc 開啟 RWKV 集成到 transformers 庫的 PR 所做的工作,以及感謝 Merve Noyan、Maria Khalusova 和 Pedro Cuenca 審閱和校對本篇文章!

          引用

          如果您希望在工作中使用 RWKV,請使用此 cff 引用。https://github.com/BlinkDL/RWKV-LM/blob/main/CITATION.cff



          英文原文:?https://hf.co/blog/rwkv

          作者: BlinkDL, Harrison Vanderbyl, Sylvain Gugger, Younes Belkada

          譯者: SuSung-boy

          審校/排版: zhongdongy (阿東)




          推薦閱讀

          使用PyTorch 2.0加速Transformer:訓練推理均拿下!

          硬核解讀Stable Diffusion(系列三)

          硬核解讀Stable Diffusion(系列二)

          硬核解讀Stable Diffusion(系列一)

          帶你入門擴散模型:DDPM


          機器學習算法工程師


          ? ??? ? ? ? ? ? ? ? ? ? ????????? ??一個用心的公眾號

          600ef686ae4d0a936ecd9898e36ab3a4.webp





          瀏覽 65
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  五月婷婷丁香综合 | 中文字幕成人 | 在线国产激情视频 | 成人网站在线看 | 午夜在线观看视频18 |