iT邦幫忙

2023 iThome 鐵人賽

DAY 2
0
AI & Data

AI白話文運動系列之「A!給我那張Image!」系列 第 2

AI的關鍵利器--梯度下降法在Pytorch中的運作方式

  • 分享至 

  • xImage
  •  

前言

在昨天的內容中,我們討論到微分在AI中扮演重要的角色,透過微分找出參數的更新方向,我們就可以使用梯度下降演算法讓我們的模型在每一次更新後,產生出更靠近我們想要的結果。
今天我們Pytorch這個工具的介紹開始,看看實際建立一個AI模型時,要如何利用梯度下降演算法來訓練模型。

先備知識

  1. Python程式基礎(至少對Python語法不陌生)
  2. 微積分(你必須知道一個函數對某個變數為分會長甚麼樣子)\
  3. 向量(你必須要知道1D, 2D, 3D...代表甚麼)

看完今天的內容你可能會知道...

  1. Pytorch怎麼實現梯度下降演算法
  2. 如何利用Pytorch來更新模型參數

一、Pytorch是甚麼?

  • 網路上已經有許多Pytorch的討論與教學,因此這裡不再贅述,大家只需要知道在Python中,有許多已經包裝好的模組/庫,這些工具讓我們可以像疊積木一樣,通過定義好的語法,一塊一塊堆疊出我們需要的東西。而Pytorch也是這樣的工具,不過他是專門針對AI/機器學習/深度學習的工具,因此有需多特性是針對AI模型專門設計的,這讓很多人在建立AI模型的時候第一選擇就是使用Pytorch。
  • Pytorch的特性之一就是可以使用GPU協助訓練AI模型,最近生成式AI模型的發展,連帶著NVIDA的產品廣為人知,這是因為我們可以利用GPU或TPU等工具加速AI模型的訓練,至於使用CPU可不可以?當然可以,不過這兩者的時間差異可能是好幾百倍以上。光是有好的硬體還不夠,如果沒有辦法呼叫這些硬體支援運算的話,相當於沒有使用到這些工具,Pytorch幫我們處理了這個問題,只要按照Pytorch定義的格式建立AI模型,裡面的運算會自動使用底層的硬體支援來幫忙,這會比起我們自己處理來的快。
  • Pytorch另一個好用的特性是「自動計算梯度」,在梯度下降法中我們介紹過,所謂的「梯度是反映一個函數增長或減少的方向」,因此如果想要讓模型的輸出結果與理想結果的差異減少,我們就必須要讓模型中的參數沿著梯度的方向更新。在數學的推導過程中,如果一個模型非常的複雜,我們需要利用微積分的概念一個一個推導出所有參數的更新公式。然而,以chatGPT這種模型來說,他所需要的參數量可是以「億」來計,如果要手動推導這麼多更新公式想必是不太合理的吧!這樣就是所謂的工人智慧了(笑。Pytorch中就利用了「動態計算圖」的概念來處理這樣的問題,讓我們可以任意建立一個模型,交由Pytorch求出所有參數的更新方式,替我們消除了許多的麻煩。

二、Pytorch的基本單位

  • 一維是線,二維是面,三維是立體的,而四維甚至以上,我們稱之為「張量(Tensors)」,這也是Pytorch的基礎運算單位。
  • 為甚麼要使用張量呢?單純一維、二維或三維的資料不行嗎?
  • 通常在電腦中我們要儲存一張黑白色的圖,我們會使用一個二維的陣列(array),裡面的每個元素為圖片中對應點的像素值。那如果今天圖片是彩色的呢?我們都知道光有三原色,也就是RGB三個顏色,這三個顏色每一個都需要一個二維的陣列來儲存對應的數值,所以總共需要三個二為陣列,也可以整合在一起形成一個三維的資料。然而,在訓練AI模型時,我們很少是一筆資料一筆資料的訓練,通常會一次使用很多筆資料,延續上面的例子來說,我們在一次訓練時會使用好幾個三維個資料,而這,會被我們整理成一組四維的新資料。
  • 在線性代數這門課中,我們會學到不同維度的特性與他的運算規則,不過對於沒有學過的各位也不需要太緊張,在Pytorch官網裡面有列出他有支援的所有Tensor運算給大家參考:
  • https://pytorch.org/tutorials/beginner/basics/tensorqs_tutorial.html -->> Tensor教學
  • https://pytorch.org/docs/stable/torch.html -->>Tensor操作列表

三、動態計算圖

  • 計算圖是甚麼?動態的又是甚麼樣子?
  • 計算圖是一種描述運算過程的圖,也就是說每個步驟的輸入輸出以及運算方式都需要標示出來,計算圖的畫法不唯一,同一個公式每個人都繪畫出不同的結果,以下圖為例至少就有兩種畫法
  • https://ithelp.ithome.com.tw/upload/images/20230917/20163299f6hX7qJ17v.png
  • 註:正常的畫法是將運算方式標於每條線上,這邊是方便理解所以將其獨立出來
  • 接著我們要來談談何謂動態,既然有動態就代表說也有靜態圖,Python另一大AI工具Tensorflow一開始使用的就是靜態圖的觀念,靜態代表著模型的計算圖建構與實際計算是分開的,先建立好一個計算圖,接著根據所需要的數值計算出結果,也就是所謂的「先編譯後執行」,這樣的方法雖然執行上較為快速,但是當我們的輸入資料有變(例如圖片的大小改變)時便需要重新生成一次計算圖,並且如果需要Debug的話也需要等待整個計算圖執行完畢,因此要找出具體錯誤發生在哪裡必較困難。而動態圖的話則相反,建構計算圖與實際計算是同時發生的(一邊編譯一邊執行),雖然這樣的方式略為耗時,但是更為靈活,讓我們建立模型時更方便,Pytorch正是使用這樣的方式。

四、利用Pytorch Autograd自動求梯度

  • 在Pytorch中,只要是使用torch所建立出來的資料皆會在建構計算圖時一同考慮進去,所以不需使用額外的工具處理,以下方程式碼為例,我們透過torch建立兩個張量a與b,接著我們給定一個目標:希望3倍的a平均減去b平均的平均值可以接近50,再來「我們使用.backward()這個函數告訴電腦:我現在需要你計算出所有參數的梯度」,這樣一來我們便可查看我們所建立的a與b兩個張量需要往哪個方向更新才可以使結果更接近我們要的目標。
import torch

# requires_grad=True表示需要算出梯度,在建立計算圖之後可以使用backward來查看計算出來的梯度
a = torch.tensor([1., 2., 3.], requires_grad=True)
b = torch.tensor([4., 5., 6.], requires_grad=True)

# 假設我們希望3a^2-b^2的平均盡量接近50
loss = 50 - (3*a**2 - b**2).mean()

loss.backward()

# 查看經由計算圖所算出的梯度
print(a.grad)
print(b.grad) 

五、總結

  • 在今天的內容中,我們主要介紹了Pytorch這個好用的工具,並且帶大家了解為甚麼許多人會選擇使用Pytorch建立AI模型的原因,同時我們也接續昨天的內容,實際利用Pytorch看看所謂的梯度下降是怎麼運作的。
  • 在程式碼中我們有使用到一個參數loss,這個參數是用來描述「模型輸出結果與所期望的結果之間的差異」,差異只是字面上的意思,在數學中我們會有不同的公式來衡量「差異的大小」,不同的模型使用情境會需要不同的公式,這些內容可以先留個懸念給大家思考一下,為甚麼不同的情境要使用不同的公式?答案會留在之後的系列中討論。

上一篇
危機就是轉機--微積分在AI中扮演怎樣的角色?
下一篇
理想跟現實不一樣有甚麼損失?AI的訓練目標--損失函數
系列文
AI白話文運動系列之「A!給我那張Image!」30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言