天天看點

百度paddlepaddle入門講解第一周内容Baidu AI Studio

Baidu AI Studio

相關網站:https://aistudio.baidu.com/aistudio/education/group/info/1297

day0 0810

兩個課程推薦:零基礎實踐深度學習 機器學習的思考故事

傳統的課程:線性回歸 感覺機 邏輯回歸

實際應該的思考流程:假設空間:設計網絡,優化目标:評價或損失函數Loss,尋解算法:優化/求解算法

day1 0811

Q1 深度學習與機器學習與人工智能

Subject 1 Overview

人工智能 > 機器學習 > 深度學習

深度學習是機器學習算法中最熱門的一個分支,近些年取得了顯著的進展,并替代了大多數傳統機器學習算法。

If it is written by Python, it’s probably machine learning. If it is written by PPT, it’s probably AI

Subject2 Define Machine Learning

Official Definition

機器學習是專門研究計算機怎樣模拟或實作人類的學習行為,以擷取新的知識或技能,重新組織已有的知識結構,使之不斷改善自身的性能。

類比人的學習過程,觀察現象進行歸納,推到一般規律演繹具體案例。

計算機學習過程:①假設空間,②優化目标,③尋解算法。

  1. Define a Hypothesis Space to fit the relation between INPUT X and OUTPUT Y,which we call the Hypothesis Space Model.
  2. 定義一個衡量标準,用數字化的形式表達參數的好壞,which we call Loss Function.
  3. iterate all the 觀察樣本 until get the most apporporiate parameters, which we called 優化/巡檢 optimization.
百度paddlepaddle入門講解第一周内容Baidu AI Studio

Subject3 Define Deep Learning

THEN How about Deep Learning?

The Hypothesis of DL is much more complicated than the ML, so we introduce Deep Neural Network to help describe it.

假設變得非常非常難的時候就不得不引入深度學習網絡幫忙構造這個假設空間。

In fact, it is because the there are so many layes in Neural Network that we call it DEEP LEARNING

DL consists of ①計算節點/神經元 ②多層連接配接 ③前向計算

  • 神經元:

    神經網絡中每個節點稱為神經元,由兩部分組成:

    • 權重和:将所有輸入權重求和。
    • 非線性變換(激活函數):權重和的結果經過一個非線性函數變換,讓神經元計算具備非線性的能力。
  • 多層連接配接: 大量這樣的節點按照不同的層次排布,形成多層的結構連接配接起來,即稱為神經網絡。
  • 前向計算: 從輸入計算輸出的過程,順序從網絡前至後。
  • 計算圖: 以圖形化的方式展現神經網絡的計算邏輯又稱為計算圖。我們也可以将神經網絡的計算圖以公式的方式表達如下: Y = f 3 ( f 2 ( f 1 ( w 1 ⋅ x 1 + w 2 ⋅ x 2 + w 3 ⋅ x 3 + b ) + … ) … ) … ) Y =f_3 ( f_2 ( f_1 ( w_1\cdot x_1+w_2\cdot x_2+w_3\cdot x_3+b ) + … ) … ) … ) Y=f3​(f2​(f1​(w1​⋅x1​+w2​⋅x2​+w3​⋅x3​+b)+…)…)…)

P1 Boston House Price Prediction Model

13個輸入變量x,一層神經網絡: y = ∑ j = 1 M x j ω j + b , M = 13 y=\sum_{j=1}^{M}x_j\omega_j+b_, M=13 y=∑j=1M​xj​ωj​+b,​M=13

損失函數MSE: m s e = 1 n ∑ i = 1 n ( Y ^ i − Y i ) 2 mse = \frac{1}{n}\sum_{i=1}^n(\hat Y _i - Y_i)^2 mse=n1​∑i=1n​(Y^i​−Yi​)2,n為樣本數量,預測-真實值

百度paddlepaddle入門講解第一周内容Baidu AI Studio
  1. 資料處理: 把資料處理成想要的格式 + 初步劃分訓練集測試集 + 資料集根據訓練集歸一化 + 重新劃分訓練集資料集,注意最好最後封裝成一個函數

    load_data()

  2. 模型設計:定義一個類,這個類中包含八個函數,
    class Network(object):
        def __init__(self, num_of_weights):
            # 随機産生w的初始值
            # 為了保持程式每次運作結果的一緻性,此處設定固定的随機數種子
            np.random.seed(0)
            self.w = np.random.randn(num_of_weights, 1)
            self.b = 0.
            
        def model(self.x):
        	z = np.dot(x, self.w) + self.b
            return z
            
        def forward(self, x):
            
            return self.model(x)
        
        def loss(self, z, y):
            error = z - y
            num_samples = error.shape[0]
            cost = error * error
            cost = np.sum(cost) / num_samples
            return cost
        
        def gradient(self, x, y):
            z = self.forward(x)
            gradient_w = (z-y)*x
            gradient_w = np.mean(gradient_w, axis=0)
            gradient_w = gradient_w[:, np.newaxis]
            gradient_b = (z - y)
            gradient_b = np.mean(gradient_b)        
            return gradient_w, gradient_b
        
        def update(self, gradient_w, gradient_b, eta = 0.01):
            self.w = self.w - eta * gradient_w
            self.b = self.b - eta * gradient_b
            
        def train(self, x, y, iterations=100, eta=0.01):
            losses = []
            for i in range(iterations):
                z = self.forward(x)
                L = self.loss(z, y)
                gradient_w, gradient_b = self.gradient(x, y)
                self.update(gradient_w, gradient_b, eta)
                losses.append(L)
                if (i+1) % 10 == 0:
                    print('iter {}, loss {}'.format(i, L))
            return losses
               
  3. 訓練配置:其實就是選擇合适的loss function(MSE)和合适的優化器(梯度下降法/随機梯度下降法),優化過程注意一下廣播機制和epoch,batchsize這些關系

總結,訓練過程:

for epoch:
	for batchsize:
		forward
		compute loss
		backward propagation
		update weights
           

day2 0812

開發paddlepaddle飛槳模型,通用:底層模型,loss函數,優化器配置。

同時包含很多已經封裝好的模型庫。

Q1 動态圖與靜态圖

tensorflow應該是支援靜态圖,pytorch支援動态圖,

類比C++和Python

C++在寫完代碼以後,編譯器統一編譯為一個可執行檔案去運作,這種方法稱之為靜态圖方法。

優點:全局編譯性能更好。

Python每寫一行,動态執行該行指令,這種方法稱之為動态圖方法。

飛槳采用Python原生的控制流。

優點:調試友善,實時檢視結果,可以轉換成靜态圖,推薦使用。

Q2 飛槳處理資料

day3 0813

Q1 Overview

從單層的特征層轉至圖像的處理,手寫數字識别

房價預測相當于是機器學習中的’HelloWorld’,手寫數字識别相當于是深度學習中的’HelloWorld’

資料集了解:MNIST

60000個訓練集,10000個測試集,28 * 28的圖像大小

依然是五個步驟,

  1. 資料處理:讀取資料,轉換格式,初步分類訓練集測試集,歸一化,分類訓練集和測試集。現在應該改一下了,應該是讀取資料集,劃分資料集,shuffle,batch,驗證
  2. 模型設計:定義網絡,定義損失函數。
  3. 訓練配置:定義優化器,定義在CPU還是在GPU上訓練。
  4. 開始訓練:for epoch for batchsize 前向傳播,損失計算,後向傳播,更新權重。
  5. 訓練結束:儲存模型。
百度paddlepaddle入門講解第一周内容Baidu AI Studio

Q2 同步讀取和異步讀取

通過建立倉庫使資料讀取和訓練模型互相解耦

yeild

函數的作用:傳回batch,下次還從停止的位置開始計數,根據老師的解釋是用python生成器的模式保證我們減少記憶體的占用,就是隻有當我們用到一批資料的時候,才會執行這樣一個循環,它并不會占用很大的一個記憶體把資料全部讀入。

day4 0814

上節課學的是處理資料:讀取檔案,劃分資料集,shuffle,batch,驗證。異步處理

這節課學CNN的搭建。

Q1 CNN的設計核心

局部視野:視覺資訊的有效信号是局部的,無論其在什麼位置都可以用相同的方法識别出來。

參數共享:

Q2 損失函數

MSE均方誤差,對于輸出是一個實數的情況下,專業術語叫做回歸問題,很好用。

處理分類問題第一步,softmax标準化,

問題:為什麼不直接求和做分母,還要指數次方?

期望該問題的輸出集中在某一個特定的區域間,這一個小的區域包含臨界值的變化點,而不可以采用線性的輸出,對每一個區域都有相同的變化率。

惡補随機過程,最大似然估計,還是用到貝葉斯後驗機率, P ( H ∣ A ) > P ( H ∣ B ) P(H|A) > P(H|B) P(H∣A)>P(H∣B),得到H,就認為這是A的情況。是以可以推導出分類問題專用的交叉熵損失函數。

飛槳預設的标簽的資料類型是

int64

Q3 優化器選擇

梯度下降(不帶batch的那種),随機梯度下降SGD(帶batch的那種)

還有Momentum,AdaGrad,Adam等其他的優化方法。

  • SGD: 随機梯度下降算法,每次訓練少量資料,抽樣偏差導緻參數收斂過程中震蕩。
  • Momentum: 引入實體“動量”的概念,累積速度,減少震蕩,使參數更新的方向更穩定。

每個批次的資料含有抽樣誤差,導緻梯度更新的方向波動較大。如果我們引入實體動量的概念,給梯度下降的過程加入一定的“慣性”累積,就可以減少更新路徑上的震蕩,即每次更新的梯度由“曆史多次梯度的累積方向”和“當次梯度”權重相加得到。曆史多次梯度的累積方向往往是從全局視角更正确的方向,這與“慣性”的實體概念很像,也是為何其起名為“Momentum”的原因。類似不同品牌和材質的籃球有一定的重量差别,街頭籃球隊中的投手(擅長中遠距離投籃)喜歡稍重籃球的比例較高。一個很重要的原因是,重的籃球慣性大,更不容易受到手勢的小幅變形或風吹的影響。

  • AdaGrad: 根據不同參數距離最優解的遠近,動态調整學習率。學習率逐漸下降,依據各參數變化大小調整學習率。

通過調整學習率的實驗可以發現:當某個參數的現值距離最優解較遠時(表現為梯度的絕對值較大),我們期望參數更新的步長大一些,以便更快收斂到最優解。當某個參數的現值距離最優解較近時(表現為梯度的絕對值較小),我們期望參數的更新步長小一些,以便更精細的逼近最優解。類似于打高爾夫球,專業運動員第一杆開球時,通常會大力打一個遠球,讓球盡量落在洞口附近。當第二杆面對離洞口較近的球時,他會更輕柔而細緻的推杆,避免将球打飛。與此類似,參數更新的步長應該随着優化過程逐漸減少,減少的程度與目前梯度的大小有關。根據這個思想編寫的優化算法稱為“AdaGrad”,Ada是Adaptive的縮寫,表示“适應環境而變化”的意思。RMSProp是在AdaGrad基礎上的改進,AdaGrad會累加之前所有的梯度平方,而RMSprop僅僅是計算對應的梯度平均值,因而可以解決AdaGrad學習率急劇下降的問題。

  • Adam: 由于動量和自适應學習率兩個優化思路是正交的,是以可以将兩個思路結合起來,這就是目前廣泛應用的算法。
百度paddlepaddle入門講解第一周内容Baidu AI Studio

day5 0815

回顧

資料處理

模型定義:定義CNN,定義loss MSE/交叉熵

訓練配置:優化器,用CPU還是GPU以及多GPU

多GPU配置,這個距離我太遙遠了

訓練過程優化思路主要有如下五個關鍵環節:

1. 計算分類準确率,觀測模型訓練效果。

交叉熵損失函數隻能作為優化目标,無法直接準确衡量模型的訓練效果。準确率可以直接衡量訓練效果,但由于其離散性質,不适合做為損失函數優化神經網絡。

2. 檢查模型訓練過程,識别潛在問題。

如果模型的損失或者評估名額表現異常,通常需要列印模型每一層的輸入和輸出來定位問題,分析每一層的内容來擷取錯誤的原因。

3. 加入校驗或測試,更好評價模型效果。

理想的模型訓練結果是在訓練集和驗證集上均有較高的準确率,如果訓練集上的準确率高于驗證集,說明網絡訓練程度不夠;如果驗證集的準确率高于訓練集,可能是發生了過拟合現象。通過在優化目标中加入正則化項的辦法,解決過拟合的問題。

4. 加入正則化項,避免模型過拟合。

飛槳架構支援為整體參數加入正則化項,這是通常的做法。此外,飛槳架構也支援為某一層或某一部分的網絡單獨加入正則化項,以達到精細調整參數訓練的效果。

5. 可視化分析。

使用者不僅可以通過列印或使用matplotlib庫作圖,飛槳還提供了更專業的可視化分析工具VisualDL,提供便捷的可視化分析方法。

Q1 過拟合的成因

存在噪音

模型太大資料太少

day7 課程答疑

繼續閱讀