深度學習

兔兔求放过鸭發表於2024-03-10

深度學習

資料是學習的核心

概念梳理:

1.感知機:

感知機是二分類的線性分類模型,感知機的目的是求出將輸入資料劃分為兩類的分離超平面。

他需要合適的,符合預期的權重才能夠正常工作。

感知機是構成神經網路的最小構成單位。可以理解為神經元的仿生結構。

2.神經網路:

歷史:

1958年,計算科學家Rosenblatt提出了由兩層神經元組成的神經網路。他給它起了一個名字--“感知器”(Perceptron)(有的文獻翻譯成“感知機”,下文統一用“感知器”來指代)。

  感知器是當時首個可以學習的人工神經網路。Rosenblatt現場演示了其學習識別簡單影像的過程,在當時的社會引起了轟動。

  人們認為已經發現了智慧的奧秘,許多學者和科研機構紛紛投入到神經網路的研究中。美國軍方大力資助了神經網路的研究,並認為神經網路比“原子彈工程”更重要。這段時間直到1969年才結束,這個時期可以看作神經網路的第一次高潮。

模擬人類神經元的工作機理。由輸入,輸出和計算功能組成,分別照應了人類神經元中樹突,軸突,細胞核的功能。輸入接受訊號由計算做出反應並將反應訊號輸出。--摘抄

在形式上,神經網路是節點與連線構成的網路,每個連線上存在一個“權重”,將輸入的訊號計算加權後輸出給下一個神經元便完成了一次神經傳遞。

神經網路可分為單層神經網路(即為感知機),和多層神經網路,層數=輸入層+隱藏層+輸出層-1在意義上感知機層數與實際與權重有關,也有些人會層數=輸入層+隱藏層+輸出層與層的數目有關,本書使用的是前者。感知機沒有隱藏層,只有單次權重。

3.權重:權重是神經網路中最重要的東西。權重的合適程度直接決定了神經網路是否是優良的。訓練一個神經網路就是使其權重達到最佳的過程。

在權重作用的過程時,即節點與節點間傳輸訊號的過程中偏值也起了一定的作用,偏值會改變神經元被啟動的難易程度。

神經元能否被啟動取決於傳入的訊號是否達到峰值,偏值影響峰值大小。

4.計算:計算在神經元中進行,神經元具備儲存和計算的功能。將輸入(x)與輸出(y)掛鉤的函式(f(x))我們稱之為啟用函式,啟用函式代表的神經元中樞細胞體對輸入的資料進行反應的過程。

正常神經的反應過程是:輸入的訊號傳至細胞體,細胞體對訊號進行判斷後輸出新的訊號並輸出。

5.啟用函式

啟用函式旨在幫助神經網路學習資料中的複雜模式。在神經元中,輸入的input經過一系列加權求和後作用 的另一個函式

----摘抄[深度學習筆記:如何理解啟用函式?(附常用啟用函式) - 知乎 (zhihu.com)]

啟用函式可以適用在複雜環境中,人類神經元的傳遞過程是複雜的,倘若只用權重來改變輸入和輸出,那麼無論電腦神經網路在形式上(隱藏層數目多少)有多麼複雜,其最後的結果仍會是線性相加的結果,其複雜度難以達到人類神經網路的複雜程度。

插入片段:文字內容記錄:

迴歸問題和分類問題。

不管是分類,還是迴歸,其本質是一樣的,都是對輸入做出預測,並且都是監督學習。說白了,就是根據特徵,分析輸入的內容,判斷它的類別(分類),或者預測其值(迴歸)。

兩者的含義近似對立,分類問題即將事物歸類,就像把人按照性別分為男女,按照身高規定大於1.7米為高否則為低,其結果是離散的。而回歸問題則是根據已有資料進行預測

兩者都可以用來判斷:對於身高,分類問題的判斷會根據標準給出這個人是否可以被分到高的一組,其輸出的結果只能為是或否。而回歸問題則是根據視覺感受判斷這個人的身高,其輸出的結果可以是連續的一串數字。

兩者都可以用於預測:在天氣預報中,預測天氣,只能在晴,雨,陰,雪中選擇,此為分類問題。而在預測氣溫時,通常給出的是一個區間,此為迴歸問題。

結果的離散和連續為結果特徵的差別,其本質區別在於損失函式的形式不同

6.損失函式:

當大學生在宿舍中攀比誰的電腦效能更好時,如果我們只是說電腦的價格,電腦的硬體,不太清晰的人是無法聽懂的,也不明白其中的價值,但如果使用類似某大師的跑分程式,我們可以獲得直觀的電腦評分,透過電腦的評分我們能夠輕鬆選看出誰的電腦的效能更高。

損失函式在這裡就起到了一個跑分的作用,不過損失函式的結果表明的是神經網路的惡劣程度,即損失函式的結果越大,神經網路的準確性越差。

損失函式表明的是神經網路返回預測值與真實值的差異程度。預測值與真實值之間的差異值被稱為損失值

損失函式的工作原理:損失函式利用於訓練神經網路的過程中。測試資料()被送入神經網路並且返回預測值,損失函式利用預測值和真實值求出損失值,之後神經網路根據損失函式的結果反向傳播更新各個引數,使得後來的損失值減小,使得神經網路向真實靠攏,達到學習的效果。

將神經網路的準確率具象化為損失函式的結果,透過損失函式計算神經網路調整前後的結果來判定對神經網路的調整是否是進步的。同時,將神經網路進步這個抽象問題轉化為損失函式縮小這個具體的數學問題,同時函式的性質也為如何提高神經網路的準確率提供了依據。

作為函式,損失函式可以透過求某一點的導數(具體來說是梯度)來了解該點的走勢,然後以這個導數為指引,逐漸更新引數。

one-hot表示

y =  [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
t = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]
# t是用one-hot表示的真實值,y是用softmax函式生成的預測值(機率值)。
# one-hot表示中只有正確選項標記為1錯誤選項標記為0
# 在10個數中,只有“2”數字是正確的(從0開始數)其機率是0.6也就是說該神經網路在
# <此次>測試中有0.6機率正確。

梯度法:

為了瞭解梯度,我們先了解導數以及導數在程式中的實現。

導數表明可以表明函式圖形中某個點的變化趨勢,包括變化方向(增大還是減小),導數大於0,則此處的函式值隨著自變數的增大有增大的趨勢;變化速率,導數的絕對值越大,則表明該點函式值的變化快。

如果要在程式中利用導數,瞭解導數的圖形含義是必要的,因為程式中求導的方法就是利用的圖形意義。

導數的圖形意義:導數的值等於函式影像中以該點為切點的切線的斜率。

如果是直線,該點的切線斜率也就是直線斜率,曲線的斜率我們會利用微分的方法求得

      		f(x+Δx) - f(x)
k =  lim	---------------# 將x+Δx 和x兩個函式點連線,當Δx趨向於0時,該
	Δx->0	       Δx		 連線近似趨向於點x處的切線。
	
	
上式為導數的圖形理解
但是在深度學習中,我們一般使用下式


      		f(x+Δx) - f(x-Δx)
k =  lim	---------------
	Δx->0	       2*Δx		 
	

OIP-C

導數的程式實現:
def numerical_diff(f, x):
	h = 0.0001
	return (f(x+h) - f(x-h)) / 2h
	
在上面的解讀中,我們提出要求h無限趨近於0,但是因為在程式中存在舍入誤差的緣故(是指因省略小數的精細部分的數值(比如,小數點第8位以後的數值)而造成最終的計算結果上的誤差)
即 h = 1e-50
   print(h)
   >>>0.0
   因為h數字極小導致最後結果變為0.0使得導數的結果與正確值相差甚遠。
   同時,因為h並不能像理想的那羊無限接近於0,所以如果最後➗h的結果的誤差也會變大,為了縮小誤差,取x前後各一個h的距離的兩個點所連成的直線的斜率近似表示為x處的切線的斜率。這種演算法也成為中心差分。

批mini-batch(小批次處理):

批是一種處理資料的方式,用透過樣本近似代替整體的方法縮小計算量。

批大小的選擇必須合適,過小的資料量難題代表整體,過大的資料量又無法顯著達到減小計算量的目的。

減小計算量的益處:

1.當有1000個測試資料時,如果直接把1000個資料投入神經網路中計算,可能會對計算機的配置提出更高的需求,其次即便配置過關,其執行速度也不一定能達到理想狀態。但如果將1000個資料分成10組,每次只投入100個資料,其對電腦的配置要求更低,同時,透過矩陣的並行性來縮短計算的時間,也可以使用多執行緒的方法來縮短計算時間(同時進行多個批次的處理,佔用不同的程序,所以時間線上不衝突)。(當然,如果你只有10個小資料,那麼再分成10個1份明顯有些畫蛇添足,所以要考慮每批的大小,和資料總量的大小問題)

2.如果資料的量級過大,比如上百萬,上千萬甚至是上億的程度,我們也可以用分批的方法,隨機選擇一部分資料作為樣本資料,用這部分樣本資料作為測試資料進行操作。即將測試資料分批,但是隻選取其中幾批進行操作。

常用啟用函式:

恆等函式:將輸入的值原封不動的輸出

階躍函式:

# 類比人類神經元,可以理解為只有當傳入神經元的訊號強度高於闕值才會使細胞體做出相應的反應。

而在階躍函式中,階躍代表這裡輸出的結果是具有跳躍性的,於分類問題性質類似。

softmax函式:

>>> a = np.array([0.3, 2.9, 4.0])
>>>
>>> exp_a = np.exp(a) # 指數函式
>>> print(exp_a)
[  1.34985881  18.17414537  54.59815003]
>>>
>>> sum_exp_a = np.sum(exp_a) # 指數函式的和
>>> print(sum_exp_a)
74.1221542102 >>>
>>> y = exp_a / sum_exp_a
>>> print(y)
"""
		e**ak
yk =  --------   分母代表所有輸入資料經此括號內運算後求和
		sum(e**ai)  
		
將上一層的原始資料進行處理,返回一個介於0.1之間的數字,通常用來標識機率問題。

"""
常用的損失函式:

均方誤差損失函式:

# t 為真實值 
# y 為測試值

res = 0 
for i in range(t):
	res += (y-t)**2
return res/2
"""

"""
	

交叉熵誤差損失函式:

神經網路的學習:

關於資料對於神經網路學習的重要性:

神經網路的特徵就是可以從資料中學習,資料是神經網路學習的基礎。

從資料中尋找答案、從資料中發現模式、根據資料講故事……這些機器學習所做的事情,如果沒有資料的話,就無從談起。因此,資料是機器學習的核心。這種資料驅動的方法,也可以說脫離了過往以人為中心的方法。--《深度學習》

學習意味著神經網路可以根據已有資料對網路中的權重進行調整。

相關文章