作為《跟我一起學機器學習》的姊妹篇,兩年之后《跟我一起學深度學習》一書也終于出版了。北宋大家張載有言: 為天地立心,為生民立命,為往圣繼絕學,為萬世開太平。這兩部著作雖然沒有這樣的宏偉愿景,但在它們的編寫過程中我們自始至終都秉持著為往圣繼絕學的想法在進行。
作為機器學習方向的一個重要分支,深度學習在近年來的發展可謂大放異彩。隨著深度學習技術的不斷發展,與之相關的技術應用已經深入滲透到了我們日常生活的方方面面,從醫療保健、金融服務到零售,以及從交通再到智能助理、智能家居等,尤其是在以GPT為代表的大語言模型出現以后,深度學習技術的影子更是無處不在。如今,利用ChatGPT來作為日常生產力工具更是成為一種共識。例如在本書的成文過程中ChatGPT就為我們提供了不少的靈感和啟示,部分內容也是在ChatGPT的輔助下完成的,而這在10年乃至5年前都是難以想象的。也正因如此,對于這些熱門應用背后技術的探索便逐漸成為計算機行業及高校所追捧的對象,但對于絕大多數初學者來講,想要跨入深度學習這一領域依舊存在著較高的門檻,所以一本數 形結合、動機原理并重、細致考究的入門圖書就顯得十分必要了。
盡管目前市面上已經存在著大量類似圖書,但現有圖書的不足之處在于往往太過高估了學生的學習能力。首先,這類圖書往往都只是羅列了一堆名詞概念、抽象晦澀的數學公式或是枯燥冗長的代碼,而這對于初學者或是數學基礎比較薄弱的學生來講是極為糟糕的,作為過來人我們對此深有體會; 其次,這類圖書在介紹各個算法時僅僅做到了知其然而不知其所以然,并沒有介紹每個算法模型出現的背景和動機,仿佛它們都是一個個從天而降的獨立個體,彼此之間毫無前因后果的聯系; 最后,對于算法原理或實現的細節之處并沒有充分把握,往往會一筆帶過,而這就導致了初學者總有一種似是而非、朦朦朧朧的感覺。
數無形時少直覺,形少數時難入微,數形結合百般好,這是本書在編寫過程中所遵循的第一大原則。在學習深度學習相關內容的過程中,如果只看論文,則只能了解到算法模型的整體思想而無法精確刻畫其中的細節之處; 如果只看代碼,則會發現均是各種矩陣之間的四則運算,并不知道其中的含義。因此,本書在寫作之初就始終秉持著要以數 形結合的方式來介紹每個算法模型,即先通過圖示直觀地來介紹模型的整體思想和原理,再通過實際的數學計算過程或代碼來刻畫其中的細節和模糊之處。用圖形去形像化,用代碼去唯一化,真正做到數 形結合,讓各位讀者能夠真正地做到看得懂、學得會、寫得出。為了將各個算法的建模原理表述清楚,本書使用了近400幅示意插圖。
為了直觀地感受卷積操作的計算過程,我們繪制了全部4種情況下的卷積計算示意圖; 為了厘清GoogLeNet中各個網絡層的參數及輸出信息,我們重新繪制了更加詳細的網絡結構圖并全方位地進行了標記; 為了講清楚多頭注意力中多頭的概念,我們完整繪制了整個注意力機制的計算流程圖; 為了講清楚BERT模型的預訓練任務和4大經典下游任務的構建原理,我們對于每個任務模型和數據集構建流程都進行了圖例繪制; 為了介紹百川大模型內部的原理機制,我們又根據官方開源的代碼繪制了其網絡結構圖,以便讀者從第一眼就能把握其整體的技術架構; 為了講清楚大模型對話場景中的KeyValue緩存機制,我們根據Transformers框架中的實現代碼繪制了對應原理圖。這樣的圖示還有很多,因為我們始終相信,能夠用眼睛看到的一定是最直觀、最容易理解的。
知其然,更要知其所以然,這是本書在編寫過程中所遵循的第二大原則。任何一個算法的提出都不會是憑空捏造或無中生有的,它要么是為了解決新場景下的問題,要么是為了對已有算法模型進行改進,因此明白一個算法模型背后的動機就顯得格外重要了。一方面我們能更好地理解作者的想法及與其他算法模型之間的聯系; 另一方面也可以學習如何去講好一個故事,所以我們不僅需要知道一項技術的原理,還需要知道為什么出現了這種技術、它的動機是什么、它需要解決什么樣的問題等。這樣才更有利于我們了解整個技術的發展脈絡并形成一個合理的思考方向。
因此,本書在行文過程中對于每個算法模型的介紹都遵循了動機 原理的方式進行,即先梳理其提出時的背景動機,然后介紹其具體的實現原理,而不是直愣愣地開始就某個算法模型進行介紹,以至于前后銜接生硬。這也將使各位讀者不僅能學會一個算法的原理和使用方法,同時還能知道它所提出的契機,養成這樣的思維習慣對于一些讀者后續的論文寫作也是百利而無一害的。
如履薄冰,有理有據,這是本書在編寫過程中所遵循的第三大原則。在本書簽訂出版合同之初我們就預留了充分的時間,約定15個月交稿,計劃12個月完稿,而實際上14個月就完成了,目的就是能在一個輕松的氛圍下完成寫作。不過如果再算上之前在理解Transformer(2021年38月)和BERT(2021年8月2022年4月)這兩個模型所花費的13個月時間,整本書總共歷經了27個月,所以我們也時常告誡自己切莫心急浮躁、切莫急功近利、切莫誤人子弟,要為我們寫下的每一句話、每個字負責。同時,在本書的編寫過程中對于每個重要細節的把握我們也會進行多方求證,力爭在理解上不會出現太大偏差。對于同一個模型的實現過程我們通常會參考不同框架中的實現源碼,例如參考TensorFlow、PyTorch、Transformers及論文作者的實現等,然后根據這些代碼整理出一份保留核心邏輯且適合初學者學習的示例代碼。
例如在介紹BERT模型的實現過程時,先后閱讀了GoogleResearch、PyTorch和Transformers框架中的相關實現過程; 為了弄清楚fastText模型中關于中文Ngram的構建方式,我們在官方開源項目的dictionary.cc文件中找到了佐證; 為了畫出ELMo模型的真實結構圖,我們在官方的Allennlp庫中見到了答案; 為了弄清楚大語言模型對話場景中模型在推理時的具體解碼過程,我們歷經幾番周折終于在Transformer庫的generation/utils.py模塊中找到了示例,甚至就連GPT這個簡稱的來歷我們也都細致地進行了考究,而這些本可以一筆帶過。
對于GPT這個簡稱的來歷,它到底應該是Generative PreTraining的縮寫,還是Generative Pretraining Transformer的縮寫,我們也曾反復思考過很多次。此時有讀者可能會說: 這還用想?當然是后者,因為GPT用到的是Transformer中解碼器的部分。可當時我們并不這樣認為。首先GPT表示生成式預訓練模型Generative PreTraining也并無不可,因為它的確是第1個大規模語料下的生成式預訓練模型; 其次GPT1的論文中并沒有明確交代T的代指,甚至全文中根本沒有出現GPT這一縮寫,反而從標題Improving Language Understanding by Generative PreTraining來看它更符合是Generative PreTraining的縮寫; 最后,我們檢索OpenAI 官網的所有論文和內容后,仍沒有明確發現GPT的來由,但對于這件事的疑惑并沒有停止。在我們寫作GPT2的相關內容時意外發現了論文的第二作者 Jeffrey Wu 的 GitHub賬戶。在瀏覽他的所有項目時我們意外發現了一個名為minGPT的工程,其簡介中赫然寫到一句描述: A minimal PyTorch reimplementation of the OpenAI GPT(Generative Pretrained Transformer)training,到這里總算是找到了官方對于GPT簡稱的認證。
當然,上面提到的細節之處本書中還有很多,讀者可以在閱讀學習的過程中自行慢慢體會。本書的目的只有一個,那就是所有的坑都讓我們先來踩,所有的錯都先讓我們來犯,各位讀者只需跟隨本書的足跡一步一步踏入深度學習的大門。不過遺憾的是,這本書也只能剛好帶領各位讀者進入深度學習的大門,至于怎么將這些技術用得更好、用得更出色還需要各位讀者在實際使用中進行反復錘煉。
掃描目錄上方的二維碼可下載本書配套資源。
致謝
首先感謝清華大學出版社趙佳霓編輯的耐心指點,以及對本書出版的推動。其次感謝在本書中所引用文獻的作者,沒有你們的付出也不會有本書的出版。如果說我們看得比別人更遠一些,那只是因為我們站在了巨人的肩膀上。在本書的寫作過程中從《動手學深度學習》《神經網絡與深度學習》,以及斯坦福大學的CS224N和CS231N中獲得了不少靈感,在此特意向李沐老師和邱錫鵬老師及相關作者表示感謝,感謝這些深度學習領域中的巨人。同時我們也要感謝我們的家人在身后默默地支持我們。最后要感謝我自己,感謝那個曾經無數次想要放棄但依舊堅持下來的自己。
寫好一本書不容易,寫好一本能讓初學者讀懂且有所裨益的書更不容易。由于我們才學和資歷尚淺,書中難免存在著這樣或那樣目前尚未發現的錯誤,因此還請各位讀者海涵與見諒。同時,也歡迎各位同行前輩對本拙作不吝指教。在今后的歲月里,我們也將不遺余力地持續去打磨這兩本書中的內容,力爭以最直觀、最簡潔和最有新意的語言將各個算法的原理與實現呈現在各位讀者面前,繼續秉持著為往圣繼絕學的初心。
王成
2024年12月于上海