人工智慧、機器學習和深度學習

2023-07-13 21:00:46

這一年來,AI領域層出不窮的技術和應用,真的有點讓人疲於奔命。其中AIGC領域的diffusion model 和 NLP領域的 ChatGBT 引領了這一輪風潮。AI取代越來越多腦力工作者的趨勢已經不可逆轉,在這經濟下行內卷嚴重的當代,競爭將越發的殘酷。作為走在風口前沿的技術人,用stable diffusion繪製過逼真的畫作,也用ChatGPT生產修改過樣板程式碼,AI帶給我的危機感是實實在在,在ChatGPT風頭正勁的那段時間,焦慮一度讓我夜不能寐。

在AI狂潮告一段落的當下,是時候冷靜下來思考,我們應該怎麼看待AI,對待 AI 的正確態度是什麼,這篇文章觀點我大體上贊同:

  1. ChatGBT像一個吸收了所有人類知識、但需要別人幫忙才能把這些知識串起來的應屆畢業生。看來我今年的工作是安全的。但是,我需要好好學習 ChatGPT,精通它的使用,讓我明年也是安全的。

  2. AI 會大大增強程式設計師的生產力,並創造過去不可能的產品。AI 本質是生產力工具,跟高階語言、雲服務、開原始碼等是一個性質。寫程式碼的門檻會降低,更多的人會進入 IT 行業,軟體市場將變大。

  3. 我們要成為這個過程的一部分,需要讓自己積極主動,不斷更新技能,接受新工具。

是的,我們要成為這個AI落地各行各業過程的一部分,也是我這一年來自學機器學習、深度學習的動力和緣由,也陸陸續續在工作中落地了一些簡單的ai專案,而這個機器學習和深度學習的系列就是我學習過程的一個記錄和總結。

內容大綱

  1. 人工智慧、機器學習和深度學習
  2. 機器學習
  3. 欠擬合、過擬合
  4. 機器學習通用流程
  5. 神經網路

人工智慧、機器學習和深度學習

人工智慧可以被定義為將通常由人類完成的智力任務自動化。因此,人工智慧是一個綜合性的領域,不僅包括機器學習與深度學習,還包括更多不涉及學習的方法。人工智慧的真正挑戰在於解決那些對人來說很容易執行、但很難形式化描述的任務,比如識別人們所說的話或影象中的臉。對於這些問題,我們人類往往可以憑直覺輕易地解決。

那什麼是機器學習?機器學習就是自動發現解決複雜問題的規則的過程。計算機通常的工作方式:程式設計師編寫規則(計算機程式),計算機遵循這些規則將輸入資料轉換為正確的答案。而機器學習卻是把這個過程反過來:機器讀取輸入資料和對應的答案,然後從中找出合適的規則。與統計學不同,機器學習經常要處理複雜的大型資料集(比如包含數百萬張圖片的資料集,每張圖片又包含數萬個畫素),用經典的統計分析(比如貝葉斯分析)來處理這種資料集是不切實際的。因此,機器學習(尤其是深度學習)呈現出相對較少的數學理論,從根本上來說是一門工程學科。機器學習是一門非常注重實踐的學科,由經驗發現所驅動,並深深依賴於軟硬體的發展。

深度學習是機器學習的一個分支領域:它是從資料中學習表示的一種新方法,強調從連續的層(layer)中進行學習,這些層對應于越來越有意義的表示。「深度學習」中的「深度」指的並不是利用這種方法所獲取的更深層次的理解,而是指一系列連續的表示層。資料模型中包含多少層,這被稱為模型的深度(depth)。

機器學習

有三種技術力量在推動著機器學習的進步:

  • 硬體

  • 資料

  • 演演算法

有一句形象的比喻:如果AI的發展是製造火箭,那麼演演算法就是引擎,資料就是燃料,而硬體就是加速器,這三者缺一不可。在機緣巧合的10年前,它們共同推動了一直延續至今的第三波人工智慧的浪潮,雖然我們不知道這次還能持續多久,但在各個領域落地開花後仍然足夠改變這個世界。

機器學習的四個分支

  • 監督學習:指用帶標籤的樣例來逐步減小模型輸出誤差的方法,叫作監督式學習(supervised learning)。主要應用於標量回歸,影象分類,目標檢測,圖形分割等。

  • 無監督學習:指從無標籤的資料中尋找輸入資料的變換,包括聚類和異常檢測,其目的在於資料視覺化、資料壓縮、資料去噪或更好地理解資料中的相關性。

  • 自監督學習:在沒有人工標註的標籤的監督學習,你可以將它看作沒有人類參與的監督學習。標籤仍然存在(因為總要有什麼東西來監督學習過程),但它們是從輸入資料中生成的,通常是使用啟發式演演算法生成的。

  • 強化學習:強調智慧體通過與環境的直接互動來學習,主要應用在遊戲,自動駕駛、機器人等。

訓練和推斷

以監督學習為例,機器學習的工作流程由兩個階段構成:訓練階段和推斷階段。

  • 訓練階段:機器自動發現資料與對應答案之間的規則,這個過程中發現的規則會封裝在訓練好的模型中。它們是訓練階段的成果,並且為推斷階段奠定基礎。根據訓練資料的多少、模型架構的複雜度和硬體的快慢,訓練階段會持續幾毫秒到幾天不等。

  • 推斷階段:運用習得的模型為新的資料獲取答案。

欠擬合與過擬合

如果模型不能很好地捕捉資料中的模式,那麼就稱該現象為欠擬合(underfit);反之,如果模型過度學習這些模式,以至於它不能將所學到規則的泛化到新資料上,那麼就稱該現象為過擬合(overfit)

當模型出現過擬合時,可以通過正則化(regularization)這樣的應對措施將其拉回正軌。

要想應對欠擬合,我們通常會通過加大模型的規模來增加模型的表示能力。一般的應對策略是給模型新增更多使用非線性啟用函數的層,並增加各層的尺寸(比如增加密集層中的單元數)。

模型能力的增強會帶來一個副作用:它會使模型對訓練集的擬合能力遠超出對驗證集的擬合能力,而後者包含模型訓練時未曾見過的資料。這個現象就是過擬合。這種情況下,模型「過度關注」資料集中不相關的細節,以至於它的預測能力不能很好地泛化到未見過的資料上。

機器學習的根本問題在於優化與泛化之間的矛盾。優化(optimization)是指調節模型使其在訓練資料上得到最佳效能的過程(對應機器學習中的學習),泛化(generalization)則是指訓練好的模型在前所未見的資料上的效能。機器學習的目標是得到良好的泛化,但你無法控制泛化,只能讓模型對訓練資料進行擬合。如果擬合得太好,就會出現過擬合,從而影響泛化。

為了實現完美的擬合,你必須首先實現過擬合。由於事先並不知道界線在哪裡,因此你必須穿過界線才能找到它。在開始處理一個問題時,你的初始目標是構建一個具有一定泛化能力並且能夠過擬合的模型。得到這樣一個模型之後,你的重點將是通過降低過擬合來提高泛化能力。

降低或提高學習率。學習率過大,可能會導致權重更新大大超出正常擬合的範圍,就像前面的例子一樣。學習率過小,則可能導致訓練過於緩慢,以至於幾乎停止。增加批次大小。如果批次包含更多樣本,那麼梯度將包含更多資訊且噪聲更少(方差更小)。最終,你會找到一個能夠開始訓練的設定。

機器學習通用流程

  1. 確定機器學習是否是合適的解決方案

  2. 定義機器學習問題和資料預測的目標。

  3. 定義一種能夠可靠地評估模型訓練成功與否的度量指標。對於簡單的任務,使用預測準確率、精確率、召回率、ROC曲線和AUC值就足夠了

  4. 為模型效能評估做準備。設計用於模型評估的驗證過程。具體而言,應該將資料劃分成3個分佈一致但互無重疊的資料集:訓練集、驗證集和測試集。驗證集和測試集的資料一定不能和訓練集重疊。

  5. 向量化資料。將資料轉換為張量,或者說多維陣列。張量中的值應該縮放到較小且居中的範圍,例如在[-1, 1]或[0, 1]區間中。

  6. 設定最後一層的啟用函數:它能對模型的輸出實現有效的約束。啟用函數的選擇應該和當前的問題型別匹配。

  7. 設定損失函數:和最後一層的啟用函數類似,損失函數也應該和當前的問題型別匹配。例如,對於二分類問題應該使用binaryCrossentropy;對於多分類問題應該使用categoricalCrossentropy;對於迴歸問題,則應該使用meanSquaredError。

  8. 設定優化器:優化器負責驅動神經網路的權重更新。

  9. 開發容量充足的模型並刻意地過擬合資料集。通過手動改變超引數,可以逐漸擴充套件模型的架構,最終達到一個剛好過擬合訓練集的模型。之前介紹過,監督式機器學習的一個共通且核心的問題是如何在優化(即擬合訓練時見到的資料)和泛化(即針對未見過的資料進行預測)之間取得平衡。在理想情況下,模型應該介於欠擬合和過擬合之間。也就是說,模型的容量應該在容量過低和容量過高之間取得平衡。但只有先跨過平衡的臨界點,才能找到這個臨界點在哪裡。

通過以下方法開發過擬合的模型:

  • 新增更多層;

  • 增加每層的尺寸;

  • 使用更多的訓練輪次。

  • 應該時常用視覺化手段監測訓練和驗證集上的損失,以及其他你所關心的度量指標(例如AUC)的效能。當你發現模型在驗證集上的準確率開始下降時,就說明模型開始過擬合了。

給模型新增正則化並調整超引數

給模型新增正則化並調整超引數,從而儘可能接近介於欠擬合和過擬合之間的理想模型。在這一步中,你會需要不斷地修改模型,訓練它,在驗證集上評估它(這一步還不需要在測試集上評估)。然後再重複這一過程,直到模型足夠接近其理想狀態。就正則化而言,可以嘗試以下步驟。

  • 新增使用不同丟棄率的dropout層。

  • 嘗試L1或L2正則化。

  • 嘗試不同的模型架構,比如對層數稍加調整。

  • 調整其他超引數(例如密集層的單元數)。

神經網路

神經網路就是函數的級聯。神經網路的每一層都可以看作一個函數,將這些層疊加在一起就意味著級聯這些函數,這樣得到的更復雜的函數就是神經網路。在深度學習的語境下,將輸入特徵對映到輸出目標上的函數叫作模型(model),模型還可以叫作網路(network)。

構建多層神經網路時注意要在隱藏層中新增非線性啟用函數,最常用的是relu函數。引入了非線性(nonlinearity)目的是增強神經網路的表示能力,使用得當可以提高各種預測任務的準確率。

神經網路的核心組成部分是層(layer),它是一個資料處理模組,可以看作張量之間的一個可調函數。

從本質上講,密集層就是執行每組輸入與輸出之間的可調的乘積累加(multiply-add)運算。因為只有一個輸入和一個輸出,所以這個模型就是簡單的線性方程:y = m * x + b。在密集層中,m叫作核(kernel),b叫作偏差(bias)。

為了得到較好的預測值,必須讓模型從資料中學習,自動為核與偏差尋找恰當的數值。這個尋找的過程就是訓練過程(training process)。
訓練神經網路主要圍繞以下四個方面。

  • 層,多個層組合成網路(或模型)。
  • 輸入資料和相應的目標。
  • 損失函數,即用於學習的反饋訊號。
  • 優化器,決定學習過程如何進行。

你可以將深度網路看作多級資訊蒸餾操作:資訊穿過連續的過濾器,其純度越來越高(即對任務的幫助越來越大)。

神經網路的資料表示

  • 張量(tensor)是一個資料容器。它包含的資料幾乎總是數值資料。我們很熟悉的矩陣就是二維張量。張量是將矩陣概念泛化到任意維度的結果。
  • 標量(0D張量):僅包含一個數位的張量叫作標量(scalar,也叫標量張量、零維張量、0D張量)。標量張量有0個軸(ndim==0)。張量軸的個數也叫作階(rank)。
  • 向量(1D張量):數位組成的陣列叫作向量(vector)或一維張量(1D張量)。一維張量只有一個軸。
  • 矩陣(2D張量):向量組成的陣列叫作矩陣(matrix)或二維張量(2D張量)。矩陣有2個軸(通常叫作行和列)。你可以將矩陣直觀地理解為數位組成的矩形網格。第一個軸上的元素叫作行(row),第二個軸上的元素叫作列(column)。
  • 3D張量與更高維張量:將多個矩陣組合成一個新的陣列,可以得到一個3D張量,可以將其直觀地理解為數位組成的立方體。將多個3D張量組合成一個陣列,可以建立一個4D張量,以此類推。深度學習處理的一般是0D到4D的張量,但處理視訊資料時可能會遇到5D張量。
  • 梯度:梯度(gradient)是張量運算的導數。它是導數這一概念向多元函數導數的推廣。多元函數是以張量作為輸入的函數。
  • 隨機梯度下降:給定一個可微函數,理論上可以用解析法找到它的最小值(函數的最小值是導數為0的點),因此你只需找到所有導數為0的點,然後計算函數在其中哪個點具有最小值。將這一方法應用於神經網路,就是用解析法求出最小損失函數對應的所有權重值。可以通過對方程gradient(f)(W)=0求解W來實現。

總結

在深度學習中,一切都是向量,一切都是幾何空間中的點。首先將模型的輸入(文字、影象等)和目標向量化,即將其轉換為初始輸入向量空間和目標向量空間。深度學習模型的每一層都對通過該層的資料做簡單的幾何變換。模型中的一連串層共同構成了一個非常複雜的幾何變換,它可以分解為一系列簡單的幾何變換。這個複雜的幾何變換試圖將輸入空間逐點對映到目標空間。它由層的權重來引數化,權重是根據模型當前的表現來迭代更新的。深度學習的神奇之處:將意義轉化為向量,再轉化為幾何空間,然後逐步學習將一個空間對映到另一個空間的複雜幾何變換。你需要的只是維度足夠大的空間,以便捕捉到原始資料中的所有關係。

參考資料
《Python深度學習》
《Javascript深度學習》