1. 程式人生 > >cs231n-(5)神經網路-2:設定資料和Loss

cs231n-(5)神經網路-2:設定資料和Loss

資料預處理

神經網路輸入的資料往往要經過預處理。假設資料X大小為[N x D],其中N表示元素個數,D表示維度。

減去均值

最長用的就是減去每個特徵的均值(均值常常有訓練集計算得到),減去均值的幾何意義是將資料中心大致移到零點。。使用python時,可以用X-=np.mean(X, axis = 0)算得均值。如果是影象,常常減去RGB通道的均值。

正則化

正則化是指將資料各個維度歸一化,即變化範圍相同。一般有兩種方法:1、將資料均值設為零(如減去均值),之後除以標準差:X /= np.std(X, axis=0)。2、不同維度的資料範圍相差很大,且重要性相同,將其最大值和最小值分別變換為+1和-1。

下去就是原始資料,零中心化,正則化處理的效果。 
cs231n6_01.jpeg

PCA and Whitening

PCA是用來降維,假設已經完成了零中心化和歸一化,降維過程如下: 
先計算協方差矩陣

# Assume input data matrix X of size [N x D]
X -= np.mean(X, axis = 0) # zero-center the data (important)
cov = np.dot(X.T, X) / X.shape[0] # get the data covariance matrix

協方差矩陣中(i,j)位的資料表示i維度和j維度資料的協方差;對角線上資料表示某一維度的方差。協方差矩陣是對稱的半正定矩陣,對它進行SVD分解:

U,S,V = np.linalg.svd(cov)

得到U是特徵向量矩陣,它的每一列都是一個特徵向量,S是特徵值向量,因為協方差矩陣是對稱的半正定矩陣,所以它等於特徵值平方。為了去除相關性,將已經中心化的資料對映到特徵向量上

Xrot = np.dot(X, U) # decorrelate the data

其中U的每一列都是標準正交特徵向量,且已經按照特徵值由大到小排列(np.linalg.svg返回時已經排列)。與特徵向量相乘,相當於對X的資料做一個旋轉對映,對映到特徵向量對應的正交基上。可以只保留前面較大特徵值對應的特徵向量,丟棄較小值對應的特徵向量,以此來降維。這種方法叫做Principal component analysis

Xrot_reduced = np.dot(X, U[:,:100
]) # Xrot_reduced becomes [N x 100]
  • 1

通過這個操作,保留了前100維度資料(以方差大小為標準)。

經過PCA處理的資料,可以再經過白化Whitening處理。白化是指PCA處理後的資料,每個維度除以其特徵值。幾何解釋就是服從多維度高斯分佈的資料,經過白化處理後,服從均值為零,協方差相等的分佈。

# whiten the data:
# divide by the eigenvalues (which are square roots of the singular values)
Xwhite = Xrot / np.sqrt(S + 1e-5)

上面處理為白化操作,分母加上1e-5為防止分母為零。這樣的操作把所有維度資料拉伸到相同範圍,可能會放大噪聲,實際中可以通過增大分母(加上比1e-5更大的值)來平滑。 
cs231n6_02.jpeg

上圖左邊分佈為原始資料。中間為PAC處理後的資料,可以看出PCA處理後,將座標軸旋轉,可以看出橫軸資訊量大,如果只保留一維資料,要丟棄縱軸資料。右邊為白化處理後的資料,資料範圍相同了

使用CIFAR-10來展示PCA和白化 
cs231n6_03.jpeg
上圖中,最左邊為原始資料,每張圖片可以看做是3072的列向量。第二張為特徵向量中,前144個(按照特徵值排列)。第三張為經過PAC降維處理後,只保留144維特徵的圖片;圖片變模糊了,說明只保留了低頻部分。最後一張為白化後的圖片。

注意:CNN不需要進行PCA和白化操作,這裡提到只是講解資料處理的一般方法。 
資料預處理,只能在訓練集上應用。應該先將資料分為訓練集、驗證集、測試集,之後在訓練集上應用資料預處理。

權重初始化

訓練神經網路前,要先初始化權重。

全部初始化為零

權重最終的值我們不知道,但是根據前面資料預處理過程,大概可以猜到,權重最終應該是一般為正,一般為負。但是權重不能全部初始化為零。如果全部初始化為零,那麼所有神經元輸出將相同,計算得到所有梯度都相同,權重更新相同,最終得到的權重也相同。

小的隨機數

因為正則化,權重要比較小,但是又不能對稱;那麼可以用小的隨機數來初始化。這樣計算得到不同梯度,迭代更新權重會趨向不同。例如這樣初始化。W = 0.01 * np.random.randn(D, H)randn是生成零均值單位方差的高斯分佈。這樣初始化,每個神經權重向量是從高維高斯分佈隨機取樣而來;也可是使用隨機生成的隨機數。但是在實際中,這樣初始化效果不好。

小的權重並不一定會得到好的效果。神經網路中,如果權重比較小,那麼反向傳播時,梯度就比較小。這樣會減小梯度傳播的訊號,在深度神經網路中也是個問題。

校準方差

如果神經元輸出有著相似的分佈,那麼收斂速度回加快。前面提到的權重初始化方法,隨著輸入增大,輸出的方差會增大。通過除以sqrt(n),其中n是輸入個數,可以將輸出方差歸一化到1;例如這樣初始化w = np.random.randn(n) / sqrt(n)

不考慮非線性啟用函式,假設輸出s=niwixis=∑inwixi,那麼計算輸出方差和輸入關係如下:

Var(s)=Var(inwixi)=inVar(wixi)=in[E(wi)]2Var(xi)+E[(xi)]2Var(wi)+Var(xi)Var(wi)=inVar(xi)Var(wi)=(nVar(w))Var(x)Var(s)=Var(∑inwixi)=∑inVar(wixi)=∑in[E(wi)]2Var(xi)+E[(xi)]2Var(wi)+Var(xi)Var(wi)=∑inVar(xi)Var(wi)=(nVar(w))Var(x)

上面第三步中,用到了假設E[xi]=E[wi]=0E[xi]=E[wi]=0(注意,有些並不等於零,例如ReLU),最後一步假設了x,wx,w服從相同分佈。如果想要輸出和xx有相同的方差,那麼nVar(w)nVar(w)必須為1,所以得到上面初始化方式w = np.random.randn(n) / sqrt(n)

稀疏初始化

首先將所有權重初始化為零,但是為了避免對稱,隨機在層之間連線個別神經全,權重初始化可以使用小的高斯分佈,連線個數常常設定為10.

實際應用

目錄,使用ReLU啟用函式的,建議初始化為w = np.random.randn(n) * sqrt(2.0/n),參考He et al

批歸一化 Batch Normalization

這是個最近出現的技術,參考論文。它在一定程度上減輕瞭如何初始化網路權重的問題。具體做法為讓資料在輸入啟用函式前先通過一個網路,通過這個網路之後,輸出資料(即輸入啟用函式的資料)服從標準高斯分佈。因為歸一化是一個可以簡單的求導操作,因此方案可行。實際應用中,常常在全連線層(卷積層)和啟用函式(非線性操作)之間插入一個BatchNormalization層。批歸一化可以理解為在網路每一層之前都做了預處理。

正則化

正則化用來阻止網路過擬合,有以下幾種方法:

L2 regularization

L2正則化是最常用的方法;它可以直接懲罰目標函式中任何一個權重平方的幅度。具體實現時對於每一個權重ww在目標函式都加上一項12λw212λw2,其中λλ常常等於1212,這樣方便求導運算。L2正則化可以直觀理解為,它限制單個較大的權重,在權重和不變時,它把權重大概均勻分不到每個權重上。使用L2正則化後,在反向傳播梯度更新時,權重會以W+=-lambda * W速度向0靠近。

L1 regularization

L1正則化也是常用的一種方法,在目標函式中,它給每個權重加上一項λ|w|λ|w|。可以把L1和L2正則化結合起來λ

相關推薦

cs231n-(5)神經網路-2設定資料Loss

資料預處理神經網路輸入的資料往往要經過預處理。假設資料X大小為[N x D],其中N表示元素個數,D表示維度。減去均值最長用的就是減去每個特徵的均值(均值常常有訓練集計算得到),減去均值的幾何意義是將資料中心大致移到零點。。使用python時,可以用X-=np.mean(X,

機器學習與深度學習系列連載 第二部分 深度學習(十四)迴圈神經網路 2(Gated RNN - LSTM )

迴圈神經網路 2(Gated RNN - LSTM ) simple RNN 具有梯度消失或者梯度爆炸的特點,所以,在實際應用中,帶有門限的RNN模型變種(Gated RNN)起著至關重要的作用,下面我們來進行介紹: LSTM (Long Short-term Memory )

機器學習與深度學習系列連載 第二部分 深度學習(十一)卷積神經網路 2 Why CNN for Image?

卷積神經網路 2 Why CNN 為什麼處理圖片要用CNN? 原因是: 一個神經元無法看到整張圖片 能夠聯絡到小的區域,並且引數更少 圖片壓縮畫素不改變圖片內容 1. CNN 的特點 卷積: 一些卷積核遠遠小於圖片大小; 同樣的pat

# [cs231n (八)神經網路總結最小網路案例研究 ][1]

標籤(空格分隔): 神經網路 0.回顧 cs231n (一)影象分類識別講了KNN cs231n (二)講了線性分類器:SVM和SoftMax cs231n (三)優化問題及方法 cs231n (四)反向傳播 cs231n (五)神經網路 part 1:

機器學習與深度學習系列連載 第二部分 深度學習(十四)迴圈神經網路 2(Gated RNN

迴圈神經網路 2(Gated RNN - LSTM ) simple RNN 具有梯度消失或者梯度爆炸的特點,所以,在實際應用中,帶有門限的RNN模型變種(Gated RNN)起著至關重要的作用,下面我們來進行介紹: LSTM (Long Short-term

神經網路+工作圖譜+大資料+類人工智慧+內容視覺化一款企業軟體裡的逆天思維

如今市面上的CRM普遍以機械式的記錄和歸納為主,沒有一款真正實現智慧化的CRM管理軟體為企業所用。想象一下,如果我們使用了融合類神經網路、工作圖譜、大資料、類人工智慧和內容視覺化等理念的CRM,那麼,我們的工作會變成什麼樣子? 人脈關係管理是企業CRM的主要功能,目前的C

斯坦福cs231n學習筆記(8)------神經網路訓練細節(資料預處理、權重初始化)

神經網路訓練細節系列筆記: 這一篇,我們將繼續介紹神經網路訓練細節。 一、Data Preprocessing(資料預處理) 如圖是原始資料,資料矩陣X有三種常見的資料預處理形式,其中我們假定X的大小為[N×D](N是資料的數量,D是它們的維數

【opencv3--ANN神經網路訓練識別OCR資料集】

#include <string> #include <iostream> #include <opencv2\opencv.hpp> #include <opencv2\ml.hpp> #include<fstream> using n

5.神經網路演算法

1.背景 1.1以人腦的神經網路為啟發,歷史上出現過很多不同的版本 1.2最著名的演算法是1980年的是backpropagation 2.多層向前神經網路(Multilayer Feed-Forward Neural Network) 2.1 Backpropagation被使用在

神經網路優化病態矩陣與條件數

一、病態矩陣 求解方程組時如果對資料進行較小的擾動,則得出的結果具有很大波動,這樣的矩陣稱為病態矩陣。 病態矩陣是一種特殊矩陣。指條件數很大的非奇異矩陣。病態矩陣的逆和以其為係數矩陣的方程組的界對微小擾動十分敏感,對數值求解會帶來很大困難。 例如: 現在有線性方程組: Ax =

神經網路優化指數衰減計算平均值(滑動平均)

Polyak平均會平均優化演算法在引數空間訪問中的幾個點。如果t次迭代梯度下降訪問了點,那麼Polyak平均演算法的輸出是。 當應用Polyak平均於非凸問題時,通常會使用指數衰減計算平均值:              

【深度學習】Tensorflow——CNN 卷積神經網路 2

轉自https://morvanzhou.github.io/tutorials/machine-learning/tensorflow/5-05-CNN3/ 目錄 圖片處理  建立卷積層  建立全連線層  選優化方法  完整程式碼

[譯]在 Keras 中使用一維卷積神經網路處理時間序列資料

原文地址:Introduction to 1D Convolutional Neural Networks in Keras for Time Sequences 原文作者:Nils Ackermann 譯文出自:掘金翻譯計劃 本文永久連結:github.com/xitu/go

吳恩達改善深層神經網路引數超引數除錯、正則化以及優化——優化演算法

機器學習的應用是一個高度依賴經驗的過程,伴隨著大量的迭代過程,你需要訓練大量的模型才能找到合適的那個,優化演算法能夠幫助你快速訓練模型。 難點:機器學習沒有在大資料發揮最大的作用,我們可以利用巨大的資料集來訓練網路,但是在大資料下訓練網路速度很慢; 使用快速的優化演算法大大提高效率

實戰生成對抗網路[2]生成手寫數字

在開始本文之前,讓我們先看看一則報道: 人民網訊 據英國廣播電視公司10月25日報道,由人工智慧創作的藝術作品以432000美元(約合300萬人民幣)的高價成功拍賣。 看起來一則不起眼的新聞,其實意義深遠,它意味著人們開始認可計算機創作的藝術價值,那些沾沾自喜認為不會被人工智慧取代的藝術家也要瑟

Caffe原始碼理解2SyncedMemory CPUGPU間的資料同步

目錄 寫在前面 成員變數的含義及作用 構造與析構 記憶體同步管理 參考 部落格:blog.shinelee.me | 部落格園 | CSDN 寫在前面 在Caffe原始碼理解1中介紹了Blob類,其中的資料成員有 shared_ptr<SyncedMemory>

TensorFlow之神經網路簡單實現MNIST資料集分類

import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data mnist=input_data.read_data_sets("MNIST_data",one_hot=True) ba

TensorFlow之卷積神經網路(CNN)實現MNIST資料集分類

import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data mnist=input_data.read_data_sets('MNIST_data',one_hot=True) #每

Python面向物件基礎2設定物件屬性

用類儲存資料 類實際上就是一個數據結構,對於python而言,它是一個類似於字典的結構。當根據類建立了物件之後,這個物件就有了一個數據結構,包含一些賦值了的屬性。在這一點上,它和其它語言的struct的作用是類似的:儲存資料並提供資料檢索功能。 例如,下面是史上最簡單的類: class Person

神經網路識別數字相關資料

資料集 測試集                                              除了0其他的都能識別出來 ---------1--------- 0.003922 0.003922 0.003922 0.003922 0.003922