1. 程式人生 > >【深度學習】神經網路的學習過程

【深度學習】神經網路的學習過程

神經網路的學習

\quad\quad 線上性可分的與非門、或門的感知機模型中,我們可以根據真值表人工設定引數來實現,而此時的引數只有3個。然而,在實際的神經網路中,引數的數量成千上萬,甚至上億,很顯然,人工設定引數是不可能的。從資料中學習就成了解決上面問題的關鍵。

  • “學習”就是指從訓練資料中自動獲取最優權重引數的過程
  • 為了能夠進行學習,需要引入損失函式
  • 學習的目的:使損失函式達到最小值的權重引數
  • 學習過程可以使用梯度法

損失函式

\quad\quad 神經網路的學習需要通過某個指標來表現現在的狀態,然後,以這個指標為基準,尋找最優權重引數。這個指標便是“損失函式”,這個損失函式可以死任意函式,但一般用均方誤差和交叉熵誤差

損失函式是表示神經網路效能的“惡劣程度”的指標,即當前的神經網路對監督資料在多大程度上不擬合,在多大程度上不一致。

  • 均方誤差

E

= 1 2 k ( y k
t k ) 2 E = \frac{1}{2}\sum_k(y_k - t_k)^2

其中, y k y_k 表示神經網路的輸出, t k t_k 表示監督資料(標籤資料), k k 表示資料的維度

# 均方誤差損失函式
def mean_squared_error(y, t):
    return 0.5 * np.sum((y-t)**2)
    
# 測試
# 假設數字"2"為正確解
t = [0,0,1,0,0,0,0,0,0,0]

# 預測為"2"的概率最高
y1 = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]

# 預測為"7"的概率最高
y2 = [0.1, 0.05, 0.1, 0.0, 0.05, 0.1, 0.0, 0.6, 0.0, 0.0]

# 求均方誤差
print(mean_squared_error(np.array(y1),np.array(t)))
print(mean_squared_error(np.array(y2),np.array(t)))
輸出為:
0.09750000000000003
0.5975

結果我們發現, y 1 y1 的損失函式的值更小,和監督資料之間的誤差較小,也就是 y 1 y1 的輸出結果與監督資料更吻合。

  • 交叉熵誤差
    E = k t k l o g   y k E = -\sum_kt_klog\ y_k

其中, y k y_k 表示神經網路的輸出, t k t_k 表示正確解標籤, k k 表示資料的維度
t k t_k 中只有正確解標籤的索引為1,其他為0(one-hot表示

# 交叉熵誤差
def cross_entropy_error(y, t):
    delta = 1e-7
    return -np.sum(t * np.log(y + delta)) 
# 在計算log時,加上了一個微小值,防止出現計算np.log(0)變為負無窮大

# 測試
# 設"2"為正確解
t = [0,0,1,0,0,0,0,0,0,0]

# "2"的概率最高
y1 = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]

# "7"的概率最高
y2 = [0.1, 0.05, 0.1, 0.0, 0.05, 0.1, 0.0, 0.6, 0.0, 0.0]

# 求交叉熵誤差
print(cross_entropy_error(np.array(y1),np.array(t)))
print(cross_entropy_error(np.array(y2),np.array(t)))
輸出為:
0.510825457099338
2.302584092994546

此結果與前面均方誤差討論的內容一樣

mini-batch學習(小批量學習)

\quad\quad 使用訓練資料進行學習,就是針對訓練資料計算損失函式的值,找到是該值儘可能小的引數,因此計算損失函式的值的時候必須將所有訓練資料作為物件,也就是要把所有訓練資料的損失函式值的總和作為學習的指標。

\quad\quad 前面提到的均方誤差和交叉熵誤差都是針對單個數據的損失函式,如果要求所有孫訓練資料的損失函式的總和,這裡僅以交叉熵誤差為例,數學表示式可以寫為:
E = 1 N n k t n k l o g   y n k E = - \frac{1}{N}\sum_n\sum_kt_{nk}log\ y_{nk}

其中,假設資料有 N N 個, t n k t_{nk} 表示第n個數據的第k個元素的值,是監督資料, y n k y_{nk} 是神經網路的輸出

在資料量特別大的時候,如果我們以全部資料為物件來計算,計算過程需要花費很長的時間
因此,我們需要從全部資料中選出一部分,作為全部資料的“近似”
比如,從60000個訓練資料中隨機選擇100個數據,再用這100個數據進行學習,這種學習方式就稱為mini-batch學習

  • 如何選出小批量資料
import numpy as np
import mnist

# load_mnist用於讀入MNIST資料集函式
# 讀入時設定one_hot_label=True,可以得到one-hot表示(即僅正確解標籤為1,其他為0)
(X_train, T_train),(X_test, T_test) = mnist.load_mnist(normalize=False, one_hot_label=True)
print(X_train.shape)  # (60000, 784)

print(T_train.shape)  # (60000, 10)

train_size = X_train.shape[0]  # 訓練資料的數量
batch_size = 10 # 設定批量數為10
# 使用np.random.choice()可以從指定數字中隨機選擇想要的數字
# 比如,np.random.choice(60000, 10)會從0-59999之間隨機選擇10個數字
batch_mask = np.random.choice(train_size, batch_size)
x_batch = X_train[batch_mask]
t_batch = T_train[batch_mask]
  • 同時處理單個數據和批量資料的交叉熵誤差的實現
# 可以同時處理單個數據和批量資料
# 監督資料為非one-hot表示
def cross_entropy_error(y, t):
	# y為1維時,即
    if y.ndim == 1:
        t = t.reshape(1, t.size)
        y = y.reshape(1, y.size)
        
    # 監督資料是one-hot-vector的情況下,轉換為正確解標籤的索引
    if t.size == y.size:
        t = t.argmax(axis=1)
             
    batch_size = y.shape[0]
    return -np.sum(np.log(y[np.arange(batch_size), t] + 1e-7)) / batch_size

np.arange(5)表示生成一個NumPy陣列[0, 1, 2, 3, 4],假設監督資料為[2, 7, 0, 9, 4]
y[np.arange(5), t]會生成[y[0, 2], y[1, 7], y[2, 0], y[3, 9], y[4, 4]]

導數、數值微分和偏導數

  • 導數數學表示式如下:
    d f ( x ) d x = lim h 0 f ( x + h ) f ( x ) h \frac{df(x)}{dx} = \lim_{h\rightarrow 0} \frac{f(x+h) - f(x) }{h}

關於導數,可自行參考高等數學

  • 數值微分
def numerical_diff(f,x):
    h = 1e-4 # 0.0001
    return (f(x+h) - f(x-h)) / (2 * h)  # 這邊使用的是中心差分

根據導數的定義,我們可以向h中賦入一個微小值,讓h無限接近0,但是不能太小,太小可能會導致舍入誤差(指因省略小數的精細部分的數值,小數點第8位以後的數值),導致最終結果的計算上的誤差

  • 舉例

y = 0.01 x 2 + 0.1 x y = 0.01x^2+0.1x

import numpy as np
import matplotlib.pylab as plt

def function_1(x):
    return 0.01*x**2 + 0.1*x 

x = np.arange(0.0, 20.0, 0.1)
y = function_1(x)
plt.xlabel("x")
plt.ylabel("f(x)")
plt.plot(x, y)
plt.show()

print(numerical_diff(function_1, 5)) # 0.1999999999990898
print(numerical_diff(function_1, 10)) # 0.2999999999986347

在這裡插入圖片描述

上面函式的導數為:
d f ( x ) d x = 0.02 x + 0.1 \frac{df(x)}{dx}= 0.02x + 0.1
在x=5和10處,“真的導數為”0.2和0.3,和上面的結果相比,誤差很小。

  • 偏導數
    上面我們只是針對單一變數的函式的導數,如果有多個變數的函式的導數,我們稱為偏導數。

用數學式表示為:

f x 0 f x 1 \frac{\partial f}{\partial x_0}、\frac{\partial f}{\partial x_1}

相關推薦

深度學習神經網路學習過程

神經網路的學習 \quad\quad 線上性可分的與非門、或門的感知機模型中,我們可以根據真值表人工設定引數來實現,

深度學習神經網路的優化方法

前言 \quad\quad 我們都知道,神經網路的學習目的是找到使損失函式的值儘可能小的引數,這是一個尋找最優引數的

2014.10神經網路中的深度學習綜述

本綜述的主要內容包括: 神經網路中的深度學習簡介 神經網路中面向事件的啟用擴充套件表示法 信貸分配路徑(CAPs)的深度及其相關問題 深度學習的研究主題 有監督神經網路/來自無監督神經網路的幫助 FNN與RNN中用於強化學習RL

深度學習神經網路

原址:http://tieba.baidu.com/p/3013551686?pid=49703036815&see_lz=1# 我們先從迴歸(Regression)問題說起,要讓機器學會觀察並總結規律的言論。具體地說,要讓機器觀察什麼是圓的,什麼是方的,區分各種顏

機器學習神經網路DNN的正則化

和普通的機器學習演算法一樣,DNN也會遇到過擬合的問題,需要考慮泛化,之前在【Keras】MLP多層感知機中提到了過擬合、欠擬合等處理方法的問題,正則化是常用的手段之一,這裡我們就對DNN的正則化方法做一個總結。 1. DNN的L1&L2正則化 想到正則化,我們首先想到的就是L1正則化和L2正則化

CV知識學習神經網路梯度與歸一化問題總結+highway network、ResNet的思考

目錄   一、梯度消失/梯度爆炸的問題 二、選擇其他啟用函式 三、層歸一化 四、權值初始化 五、調整網路的結構 一、梯度消失/梯度爆炸的問題 首先來說說梯度消失問題產生的原因吧,雖然是已經被各大牛說爛的東西。不如先看一個簡單的網路

機器學習神經網路(一)——多類分類問題

一、問題引入 早在監督學習中我們已經使用Logistic迴歸很好地解決二類分類問題。但現實生活中,更多的是多類分類問題(比如識別10個手寫數字)。本文引入神經網路模型解決多類分類問題。 二、神經網路模型介紹 神經網路模型是一個非常強大的模型,起源於嘗試讓機

機器學習神經網路及BP推導

1 前向傳播 這裡的推導都用矩陣和向量的形式,計算單個變數寫起來太麻煩。矩陣、向量求導可參見上面參考的部落格,個人覺得解釋得很直接很好。 前向傳播每一層的計算如下: z(l+1)=W(l,l+1)a(l)+b(l,l+1)(1.1) a(l+

機器學習--神經網路(NN)

簡單介紹:      神經網路主要是預設人類腦結構進行的一種程式碼程式結構的表現,同時是RNN,CNN,DNN的基礎。結構上大體上分為三個部分(輸入,含隱,輸出),各層都有個的講究,其中,輸入層主要是特徵處理後的入口,含隱層用來訓練相應函式,節點越多,訓練出的函式就越複雜,

實習日誌TSN 網路學習與實驗記錄/Constructor returned NULL && protobuf import error

  實驗目標:復現TSN網路結果 程式碼:https://github.com/yjxiong/temporal-segment-networks TSN介紹:https://zhuanlan.zhihu.com/p/32777430 到video-level testin

深度卷積神經網路學習(一)

卷積神經網路的基礎模組為卷激流包括卷積(用於維數拓展)、非線性(洗屬性、飽和、側抑制)、池化(空間或特徵型別的聚合)和批量歸一化(優化操作,目的是為了加快訓練過程中的收斂速度,同事避免陷入區域性最優)等四種操作。下面簡單介紹這四種操作。 1、卷積:利用卷積核對輸入影象進行處

深度卷積神經網路學習筆記(一)

1.卷積操作實質:       輸入影象(input volume),在深度方向上由很多slice組成,對於其中一個slice,可以對應很多神經元,神經元的weight表現為卷積核的形式,即一個方形的濾波器(filter)(如3X3),這些神經元各自分別對應影象中的某一個區域性區域(local region

機器學習神經網路計算過程的矩陣化與向量化

為什麼需要矩陣化向量化運算過程? numpy在實現內部運算的時候,對矩陣運算過程進行了優化,且優化效果特別明顯。如果我們使用的是原始的for迴圈雖然也可以完成任務,但是頻繁的使用for迴圈將會大大的增加計算時間。我們應該儘量把運算向量化,交給numpy去完成。

電腦科學2005.12神經網路在生物資料中的應用

本文為英國倫敦大學(作者:Aristoklis.D. Anastasiadis)的博士論文,共184頁。 在分類問題中訓練神經網路,特別是當涉及生物資料時,是一項非常具有挑戰性的任務。到目前為止,已經提出了許多訓練演算法來改善神經網路的效能。一種流行的方法是使用批量學習,對每個權值

手撕神經網路反向傳播

神經網路前向傳播一般用於搭建整個神經網路的結構框架,形成整個網路的邏輯通路。反向傳播用於更新每層之間的權重,減少損失,進而提升預測準確度。 下面是一個神經網路的結構圖: 第一層是輸入層,包含兩個神經元i1,i2,和截距項b1;第二層是隱含層,包含兩個神經元h1,h2和截距項b2,第

機器學習神經網路學習中的一些體會

隨著AI的快速崛起,學習AI的人越來越多,但發現好多人貌似學習了好久,但還是不太明白自己在學習什麼,感覺AI很厲害但不知道究竟是在幹些什麼? 我們總結AI的本質,其實主要就是兩大方面:一:我們首先要有一個目標函式,如:以均方差定義的目標函式(所謂的目標函式雖然衡量的標準表示

Python-ML神經網路-多層感知器增加梯度檢驗

# -*- coding: utf-8 -*- ''' Created on 2018年1月26日 @author: Jason.F @summary: 多層感知器實現,加梯度檢驗 訓練集:http://yann.lecun.com/exdb/mnist/ train-im

火爐煉AI深度學習001-神經網路的基本單元-感知器

【火爐煉AI】深度學習001-神經網路的基本單元-感知器 (本文所使用的Python庫和版本號: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 ) 在人工智慧領域,深度學習已經脫穎而出,越來越成為大型複雜問題的首選解決方案。深度學習相對

深度學習介紹(下)Coursera deeplearning.ai 神經網路深度學習

1. shallow NN 淺層神經網路 2. 為什麼需要activation function? 如下圖所示,如果不用啟用函式,那麼我們一直都在做線性運算,對於複雜問題沒有意義。linear 其實也算一類啟用函式,但是一般只用在機器學習的迴歸問題,例如預測房價等。 3.

深度學習基礎1神經網路基礎--邏輯迴歸

  本博文根據 coursera 吳恩達 深度學習整理。作為理解神經網路的基礎。 一、知識點        深度學習本質上是對資料的一種擬合。使用非線性的函式集合作為模型,對樣本對進行損失最小的模擬。首先理解單個神經元的作用和原理,可以從