日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

【学习笔记】深度学习理论基础

發布時間:2023/12/9 pytorch 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【学习笔记】深度学习理论基础 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

深度學習的基本概念

簡單概括是,使用神經網絡,進行不斷學習訓練和修正的過程。訓練集就是有答案的習題,神經網絡每一次寫完作業都會去對答案,如果有偏差,就自動修正參數,謂之迭代,直到最后錯誤率越接近0越好。

一、單個神經元

數學模型(MP模型)
1943年,心理學家W.S.McCulloch和數理邏輯學家W.Pitts基于神經元的生理特征,建立了單個神經元的數學模型(MP模型)

神經元的數學模型推導公式:
yk=φ(∑i=1mωkixi+bk)y_k = φ(\sum_{i=1}^mω_{ki}x_{i}+b_k)yk?=φ(i=1m?ωki?xi?+bk?)
公式參數:

  • x:輸入
  • ω:權重
  • b:偏置(b絕大部分情況下是一個向量,可以類比一下一元一次方程y=kx+by=kx+by=kx+bbbb,使數值產生整體的偏移。)
  • 激活函數φ:一個非線性函數,目的是將輸入進行變化映射,得出輸出信號。它模擬大腦電信號,對較小的刺激進行弱化甚至抑制,對較明顯的刺激繼續傳遞。

二、神經元的擬合原理

模型每次的學習都是為了調整W和b從而得到一個合適的值,最終由這個值配合運算公式所形成的邏輯就是神經網絡模型。這個調整的過程稱為擬合

正向傳播

數據是從輸入到輸出的流向傳遞過來的。當然,它是在一個假設有合適的w和b的基礎上的,才可以實現對現實環境的正確擬合。但是,在實際過程中我們無法得知w和b的值具體是多少才算是正常。于是,我們加入一個訓練過程,通過反向誤差傳遞的方法讓模型自動來修正,最終得到合適的W和b。

反向傳播:

BP(Back Propagation process),BP是在估計權重的時候的必要過程,可被稱為BP算法。深度學習的目的就是通過最小化損失函數,來估計神經網絡的權重。 在這個過程中,需要用到BP進行反向傳播。(損失函數下文會講)
損失,指神經網絡輸出結果與實際值的差值(可為均方差等形式的差值)。為了讓損失值最小化,我們選擇一個損失函數,讓這個表達式有最小值,接著通過對其求導的方式,找到最小值時刻的函數切線斜率(也就是梯度),讓w和b沿著這個梯度來調整。
至于每次調整多少,我們引入一個叫做 “學習率” 的參數來控制,這樣通過不斷的迭代,使誤差逐步接近最小值,從而達到我們的目標。
通常BP的步驟為:

  • 明確損失函數
  • 明確參數調整策略

可參考博客:多層神經網絡BP算法的推導

激活函數(activation function): (同上文“一個非線性函數,目的是將輸入進行變化映射,得出輸出信號。它模擬大腦電信號,對較小的刺激進行弱化甚至抑制,對較明顯的刺激繼續傳遞。 ”)激活函數(也譯作激勵函數)的主要作用就是加入非線性因素,以解決線性模型表達能力不足的缺陷,在整個神經網絡里起到至關重要的作用。
因為神經網絡的數據基礎是處處可微的,所以選取的激活函數要保證數據輸入與輸出也是可微的。在神經網絡里常用的函數有Sigmoid、Tanh和Relu等,具體實現自行百度。

處理分類: softmax回歸,對一些數據進行多種分類。softmax從字面上來說,可以分成soft和max兩個部分。max故名思議就是最大值的意思。softmax的核心在于soft,而soft有軟的含義,與之相對的是hard硬。很多場景中需要我們找出數組所有元素中值最大的元素,實質上都是求的hardmax。softmax的含義就在于不再唯一的確定某一個最大值,而是為每個輸出分類的結果都賦予一個概率值,表示屬于每個類別的可能性。如果判斷輸入屬于某一個類的概率大于屬于其他類的概率,那么這個類對應的值就逼近于1,其他類的值就逼近于0。該算法主要應用于多分類,而且是互斥的。公式為
softmax(zi)=ezi∑c=1Cezcsoftmax(z_i)=\frac{e^{z_i}}{\sum_{c=1}^Ce^{z_c}}softmax(zi?)=c=1C?ezc?ezi??
其中ziz_izi?為第i個節點的輸出值,C為輸出節點的個數,即分類的類別個數。通過softmax函數就可以將多分類的輸出值轉換為范圍在[0, 1]和為1的概率分布。把所有值的e的n次方計算出來,求和后算每個值占的比率,保證總和為1,一般就可以認為softmax得出的是概率。
可參考:一文詳解Softmax函數

損失函數: 損失函數是決定網絡學習質量的關鍵。無論什么樣的網絡結構,如果使用的損失函數不正確,最終都將難以訓練出正確的模型。使用于描述模型預測值與真實值的差距大小。一般有兩種比較常見的算法——均值平方差(MSE)和交叉熵。

  • 均值平方差(Mean Squared Error,MSE):y為真實標簽,p即predict值。均方誤差的值越小,表明模型越好。類似的損失算法還有均方根誤差(RMSE)(將MSE開平方),平均絕對值誤差(MAD)(對一個真實值與預測值相減的絕對值取平均值)等。
    1n∑i=1n(y?p)2\frac{1}{n}\sum_{i=1}^n(y-p)^2n1?i=1n?(y?p)2
  • 交叉熵損失函數(Cross Entropy Loss Function):交叉熵一般用于分類問題上,表達的意思為預測輸入樣本屬于某一類的概率。公式中y代表真實值分類(0或1),a代表預測值。交叉熵也是值越小,代表預測結果越準。
    注意:這里用于計算的a也是通過分布統一化處理的(或者是經過Sigmoid函數激活等),取值范圍在0~1之間。
    c=1n∑x[ylna+(1?y)ln(1?a)]c=\frac{1}{n}\sum_{x}[ylna+(1-y)ln(1-a)]c=n1?x?[ylna+(1?y)ln(1?a)]

注意:損失算法的選取
損失函數的選取取決于輸入標簽數據的類型:如果輸入的是實數、無界的值,損失函數使用MSE;如果輸入標簽是位矢量(分類label),使用交叉熵會更合適。

三、多層神經網絡

1、傳統前饋神經網絡——對隱藏層概念的引入

單個神經元的擬合僅適用于線性可分(可被直線或平面分割)的情況。


對于這類高維非線性問題,我們引入了一個隱藏層概念用來解決問題。
對于這個隱藏層來說,它的作用就是將“線性不可分”的數據映射到高維空間來,使映射后的數據變得“線性可分”。
我們通過異或數據集來介紹這種隱藏層的作用:

  • 異或數據:來源于異或操作,兩個數相同時,輸出為0,不相同時輸出為1。表示為兩類數據就是(0,0)和(1,1)為一類,(0,1)和(1,0)為一類。
  • 網絡模型:本例使用了一個隱藏層來解決這個問題(如圖)
  • 定義變量
    第一步定義變量,在網絡參數的定義中,輸入是“2”代表兩個數,輸出是“1”代表最終的結果,再放一個隱藏層,該隱藏層里有兩個節點。輸入占位符為x,輸出為y,學習率為0.0001。
  • 定義學習參數
    這里以字典的方式定義權重W和b,里面的h1代表隱藏層,h2代表最終的輸出層。
  • 定義網絡模型
    該例中模型的正向結構入口為x,經過與第一層的w相乘再加上b,通過Relu函數(大于0的留下,否則一律為0)進行激活轉化,最終生成layer_1,再將layer_1代入第二層,使用Tanh激活(-1~1)函數生成最終的輸出y_pred。
    模型的反向使用均值平方差(即對預測值與真實值的差取平均值)計算loss,最終使用AdamOptimizer進行優化。
  • 以下用Tensorflow進行代碼演示:
  • # 定義變量 import tensorflow as tf import numpy as nplearning_rate = 1e-4 # 0.0001 n_input = 2 # 輸入層節點個數 n_label = 1 # 最終的結果 n_hidden = 2 # 隱藏層節點個數x = tf.placeholder(tf.float32, [None,n_input]) y = tf.placeholder(tf.float32, [None, n_label])# 定義學習參數 weights = {'h1': tf.Variable(tf.truncated_normal([n_input, n_hidden],stddev=0.1)),'h2': tf.Variable(tf. truncated_normal ([n_hidden, n_label],stddev=0.1)) } biases = {'h1': tf.Variable(tf.zeros([n_hidden])),'h2': tf.Variable(tf.zeros([n_label])) }# 定義網絡模型 layer_1 = tf.nn.relu(tf.add(tf.matmul(x, weights['h1']), biases['h1'])) y_pred = tf.nn.tanh(tf.add(tf.matmul(layer_1, weights['h2']),biases['h2']))loss=tf.reduce_mean((y_pred-y)**2) train_step = tf.train.AdamOptimizer(learning_rate).minimize(loss)# 構建模擬數據:手動建立X和Y數據集,形成對應的異或關系。 X=[[0,0],[0,1],[1,0],[1,1]] Y=[[0],[1],[1],[0]] X=np.array(X).astype('float32') Y=np.array(Y).astype('int16')# 運行session,生成結果:首先通過迭代10000次,將模型訓練出來,然后將做好的X數據集放進去生成結果,接著再生成第一層的結果。 # 加載session sess = tf.InteractiveSession() sess.run(tf.global_variables_initializer())# 訓練 for i in range(10000): sess.run(train_step,feed_dict={x:X,y:Y} )# 計算預測值 print(sess.run(y_pred,feed_dict={x:X})) # 輸出:已訓練100000次# 查看隱藏層的輸出 print(sess.run(layer_1,feed_dict={x:X}))

    運行上面的程序,得到如下結果:

    [[ 0.10773809] [ 0.60417336] [ 0.76470393] [ 0.26959091]] [[ 0.00000000e+00 2.32602470e-05] [ 7.25074887e-01 0.00000000e+00] [ 0.00000000e+00 9.64471161e-01] [ 2.06250161e-01 1.69421546e-05]]

    第一個是4行1列的數組,用四舍五入法來取值,與我們定義的輸出Y完全吻合。
    第二個為4行2列的數組,為隱藏層的輸出。其中第一列為隱藏層第一個節點的輸出,第二列為隱藏層第二個節點的輸出,將它們四舍五入取整顯示如下:

    [[ 0 0] [ 1 0] [ 0 1] [ 0 0]]

    可以很明顯地看出,最后一層輸出層其實是對隱藏層的AND運算,因為最終結果為[0,1,1,0]。這樣就很清楚地表現了,這一個隱藏層將數據轉化為線性可分的數據集,然后在輸出層使用一個神經元將其分開。

    在幾何空間里,兩個點可以定位一條直線,兩條直線可以定位一個平面,兩個平面可以定位一個三維空間,兩個三維空間可以定位更高維的空間……
    在線性可分問題上也可以這樣擴展,線性可分是在一個平面里,通過一條線來分類,那么同理,如果線所在的平面升級到了三維空間,則需要通過一個平面將問題分類。如圖所示,把異或數據集的輸入x1、x2當成平面的兩個點,輸出y當作三維空間里的z軸上的坐標,那么所繪制的圖形就是這樣的。

    很明顯,這樣的數據集是很好分開的。圖中,右面的比例尺指示的是縱坐標。0刻度往下,顏色由淺藍逐漸變為深藍;0刻度往上,顏色由淺紅逐漸變為深紅。作一個平行于底平面、高度為0的平面,即可將數據分開,如圖中的虛平面。我們前面使用的隱藏層的兩個節點,可以理解成定位中間平面的兩條直線。其實,一個隱藏層的作用,就是將線性可分問題轉化成平面可分問題。更多的隱藏層,就相當于轉化成更高維度的空間可分問題。所以理論上通過升級空間可分的結構,是可以將任何問題分開的。

    那么,是不是隱藏層越多就越好呢,可以特征劃分的更清楚?
    理論上是這樣的,但實際這樣會帶來兩個問題

    • 層數越多參數會爆炸式增多
    • 到了一定層數,再往深了加隱藏層,分類效果的增強會越來越不明顯。上面那個例子,一層足以劃分異或集,再加幾層是要得到什么特征呢?這些特征對劃分沒有什么提升了。

    可參考:使用隱藏層解決非線性問題 - Tensorflow

    2、卷積神經網絡——隱藏層的常見功能層

    但隨著神經網絡發展到以卷積神經網絡為基礎的階段,除了輸入層與輸出層之外,都可以被泛稱隱藏層。隱藏層不直接接受外界的信號,也不直接向外界發送信號。
    隱藏層在神經網絡中的作用,就是中間的黑盒子,可以認為是其他的不同功能層的一個總稱。
    隱藏層的形式是任意自定義的,我們在此只介紹最基礎的幾種隱藏層。

    卷積層(convolutional layer)

  • 卷積核(convolutional kernel)
    卷積層的功能是對輸入數據進行特征提取,其內部包含多個卷積核,組成卷積核的每個元素都對應一個權重系數W和一個偏差量b(bias vector),類似于一個前饋神經網絡的神經元(neuron)。
    卷積層內每個神經元都與前一層中位置接近的區域的多個神經元相連,區域的大小取決于卷積核的大小,在文獻中被稱為“感受野(receptive field)”,卷積核在工作時,會有規律地掃過輸入特征,在感受野內對輸入特征做矩陣元素乘法求和并疊加偏差量。

  • 卷積層參數
    卷積層參數包括卷積核大小、步長和填充,三者共同決定了卷積層輸出特征圖的尺寸,是卷積神經網絡的超參數。

    其中卷積核大小可以指定為小于輸入圖像尺寸的任意值,卷積核越大,可提取的輸入特征越復雜。

    卷積步長定義了卷積核相鄰兩次掃過特征圖時位置的距離,卷積步長為1時,卷積核會逐個掃過特征圖的元素,步長為n時會在下一次掃描跳過n-1個像素 。
    由卷積核的交叉相關計算可知,隨著卷積層的堆疊,特征圖的尺寸會逐步減小,例如16×16的輸入圖像在經過單位步長、無填充的5×5的卷積核后,會輸出12×12的特征圖。為此,填充是在特征圖通過卷積核之前人為增大其尺寸以抵消計算中尺寸收縮影響的方法。常見的填充方法為按0填充和重復邊界值填充(replication padding)。

    填充(padding)依據其層數和目的可分為四類:
    · 有效填充(valid padding):即完全不使用填充,卷積核只允許訪問特征圖中包含完整感受野的位置。輸出的所有像素都是輸入中相同數量像素的函數。使用有效填充的卷積被稱為“窄卷積(narrow convolution)”,窄卷積輸出的特征圖尺寸為(L-f)/s+1。
    · 相同填充/半填充(same/half padding):只進行足夠的填充來保持輸出和輸入的特征圖尺寸相同。相同填充下特征圖的尺寸不會縮減但輸入像素中靠近邊界的部分相比于中間部分對于特征圖的影響更小,即存在邊界像素的欠表達。使用相同填充的卷積被稱為“等長卷積(equal-width convolution)”。
    · 全填充(full padding):進行足夠多的填充使得每個像素在每個方向上被訪問的次數相同。步長為1時,全填充輸出的特征圖尺寸為L+f-1,大于輸入值。使用全填充的卷積被稱為“寬卷積(wide convolution)”
    · 任意填充(arbitrary padding):介于有效填充和全填充之間,人為設定的填充,較少使用。
    帶入先前的例子,若16×16的輸入圖像在經過單位步長的5×5的卷積核之前先進行相同填充,則會在水平和垂直方向填充兩層,即兩側各增加2個像素( )變為20×20大小的圖像,通過卷積核后,輸出的特征圖尺寸為16×16,保持了原本的尺寸。

  • 激勵函數(activation function)
    (實現方法同上文神經元的擬合原理)
    卷積神經網絡通常使用線性整流函數(Rectified Linear Unit, ReLU),其它類似ReLU的變體包括有斜率的ReLU(Leaky ReLU, LReLU)、參數化的ReLU(Parametric ReLU, PReLU)、隨機化的ReLU(Randomized ReLU, RReLU)、指數線性單元(Exponential Linear Unit, ELU)等。在ReLU出現以前,Sigmoid函數和雙曲正切函數(hyperbolic tangent)也有被使用。
    激勵函數操作通常在卷積核之后,一些使用預激活(preactivation)技術的算法將激勵函數置于卷積核之前。

  • 池化層(convolutional kernel)

    在卷積層進行特征提取后,輸出的特征圖會被傳遞至池化層進行特征選擇和信息過濾。池化層包含預設定的池化函數,其功能是將特征圖中單個點的結果替換為其相鄰區域的特征圖統計量。池化層選取池化區域與卷積核掃描特征圖步驟相同,由池化大小、步長和填充控制。
    池化(pooling) 的本質,其實就是降采樣。Pooling 對于輸入的 Feature Map,選擇某種方式對其進行降維壓縮,以加快運算速度。
    采用較多的一種池化過程叫最大池化(Max Pooling),其具體操作過程如下:

    池化還有平均池化、隨機混合池化、譜池化等類型,具體的實現方法在此不在贅述。
    【池化層沒有參數、池化層沒有參數、池化層沒有參數】 (重要的事情說三遍)
    池化的作用:
    (1)保留主要特征的同時減少參數和計算量,防止過擬合。
    (2)invariance(不變性),這種不變性包括translation(平移),rotation(旋轉),scale(尺度)。
    Pooling 層說到底還是一個特征選擇,信息過濾的過程。也就是說我們損失了一部分信息,這是一個和計算性能的一個妥協,隨著運算速度的不斷提高,我認為這個妥協會越來越小。

    現在有些網絡都開始少用或者不用pooling層了。

    全連接層(convolutional layer)

    卷積神經網絡中的全連接層等價于,上文所述傳統前饋神經網絡中的隱藏層。
    每一個結點都與上一層的所有結點相連,用來把前邊提取到的特征綜合起來。由于其全相連的特性,一般全連接層的參數也是最多的。在卷積神經網絡的最后,往往會出現一兩層全連接層,全連接一般會把卷積輸出的二維特征圖轉化成一維的一個向量。

    3、過擬合與欠擬合問題

    過擬合(overfitting)與欠擬合(underfitting)是統計學中的一組現象。過擬合是在統計模型中,由于使用的參數過多而導致模型對觀測數據(訓練數據)過度擬合,以至于用該模型來預測其他測試樣本輸出的時候與實際輸出或者期望值相差很大的現象。欠擬合則剛好相反,是由于統計模型使用的參數過少,以至于得到的模型難以擬合觀測數據(訓練數據)的現象。

    我們總是希望在機器學習訓練時,機器學習模型能在新樣本上很好的表現。過擬合時,通常是因為模型過于復雜,學習器把訓練樣本學得“太好了”,很可能把一些訓練樣本自身的特性當成了所有潛在樣本的共性了,這樣一來模型的泛化性能就下降了。欠擬合時,模型又過于簡單,學習器沒有很好地學到訓練樣本的一般性質,所以不論在訓練數據還是測試數據中表現都很差。

    過擬合產生的原因與解決方法

    • 欠擬合產生的原因:
      1. 模型復雜度過低
      2. 特征量過少

    • 過擬合產生的原因:
      1. 模型太復雜,對神經網絡來說,參數太多或特征提取能力太強,模型學到了一些偶然的特征。
      2. 數據分布太單一,例如訓練用的所有鳥類都在籠子里,模型很容易把籠子當成識別鳥的特征。
      3. 數據噪聲太大或干擾信息太多,如人臉檢測,訓練圖像的分辨率都是幾百乘幾百,而人臉只占了幾十到幾百個像素,此時背景太大,背景信息都屬于干擾信息或噪聲。
      4. 訓練迭代次數太多,對數據反復地訓練也會讓模型學到偶然的特征。

    • 欠擬合的解決方法:
      1. 增加新特征,可以考慮加入進特征組合、高次特征,來增大假設空間
      2. 添加多項式特征,這個在機器學習算法里面用的很普遍,例如將線性模型通過添加二次項或者三次項使模型泛化能力更強
      3. 減少正則化參數,正則化的目的是用來防止過擬合的,但是模型出現了欠擬合,則需要減少正則化參數
      4. 使用非線性模型,比如核SVM 、決策樹、深度學習等模型
      5. 調整模型的容量(capacity),通俗地,模型的容量是指其擬合各種函數的能力
      6. 容量低的模型可能很難擬合訓練集;使用集成學習方法,如Bagging ,將多個弱學習器Bagging

    • 過擬合的解決方法:
      1. 換一個復雜度低一點的模型或正則化,對神經網絡來說,使用參數量少一點的網絡。或使用正則化,通過引入范數,增強模型的泛化能力。
      2. 使用不同分布的數據來訓練。如數據增強,預訓練等。
      3. 使用圖像裁剪等方法對圖像進行預處理。
      4. 及時地停止訓練。如何判斷什么時候該停止訓練?使用K折交叉驗證,若訓練損失還在減少,而驗證損失開始增加,則說明開始出現過擬合。
      5. 通過每次訓練時舍去一些節點來增強泛化能力(dropout)。

    這篇文章只是對深度學習的基礎理論做一個綱要式的概況,更多的內容,筆者能力有限,請讀者自行深入探索。

    總結

    以上是生活随笔為你收集整理的【学习笔记】深度学习理论基础的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。