神經網絡術語大百科:優化函數、激活函數、損失函數、正則方法的簡介

簡述關於神經網絡的各種優化函數(SGD,Adagrad,Adadelta,Adam,Adamax,Nadam)、各種激活函數(Sigmoid,Tanh、Hard Sigmoid、Softplus、ReLU、ElU、PReLU、RReLU)、各種損失函數以及正則方法的簡述,並附帶代碼實現例子。 優化函數先上兩張圖激活函數沒有激活函數,神經元就只是一個線性函數,那麼無論多少層的神經元疊加是沒有意義的。而主流激活函數也隨著神經網絡、深度學習的發展迭代進化了許多次代。 Sigmoid Sigmoid是S形狀的意思,又因為它是邏輯回歸的激活函數又叫logistic函數,函數式為$值域位於0-1,那麼對於邏輯回歸,這是對於二分類的一個很自然的表達,也就是概率處處連續可導不過呢,我們觀察它的形狀,可以得出,Sigmoid函數在兩端(靠近0和1的部分)梯度很小,這也意味著,如果神經元的輸出落到了這個地方,那麼它幾乎沒什麼梯度可以傳到後面,而隨著神經網絡的層層削弱,後面的層(靠近輸入的層)沒有多少梯度能傳過來,幾乎就“學不到什麼”了。這叫做梯度消失問題,一度是阻礙神經網絡往更深的層進化的主要困難,導致深度學習專家們絞盡腦汁想了許多方法來對抗這個問題,比如“Xavier and He Initialization”,比如我們要把weight隨機初始化為如下的範圍, sigmoid的另一個問題是它不是0均值的,Sigmoid函數的輸出值恆大於0,這會導致模型訓練的收斂速度變慢。舉例來講,對,如果所有均為正數或負數,那麼其對的導數總是正數或負數,這會導致如下圖紅色箭頭所示的階梯式更新,這顯然並非一個好的優化路徑。深度學習往往需要大量時間來處理大量數據,模型的收斂速度是尤為重要的。所以,總體上來講,訓練深度學習網絡盡量使用zero-centered數據(可以經過數據預處理實現) 和zero-centered輸出。如今,sigmoid函數應用最廣泛的在於其變種softmax在多元分類中,比如手寫數字識別,經過卷積神經網絡的處理,最後我們需要網絡輸出每個預測的概率值,最後預測為某一個數字,這裡就需要用到softmax,以下是softmax的Keras代碼,注意其中一個trick, 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20…

0 Comments

數據的標準化與歸一化

聊一聊Normalization and Standardization什麼是Normalization就是歸一化,是最小-最大縮放(min-max scaling)的特例,指的是將數據縮放到指定range,這個range通常是0 1或者-1 +1,直觀來講就是下圖,在數據不包含離群點時很有用, 公式則是$$ x^{(i)} $$若要縮放至-1~+1,則是$$ x' = frac{x - min}{max - min} $$代碼實現 1 2 3 4 5 6 7 8 #導入數據預處理庫from #範圍縮放標準化min_max_scaler = preprocessing.MinMaxScaler() #訓練集縮放標準化min_max_scaler.fit_transform(X_train)…

0 Comments

Data Science Pipelines | 特徵工程中的管道

暫定為記錄各式數據科學項目、Kaggle競賽里面常用、有用的代碼片段、API、神操作等,通常是Numpy、Pandas、Matplotlib、Seaborn等相關,通常來說,項目基本步驟可以分為EDA、特徵工程以及調參。 基本流程以一個Kaggle上的House Price為案例,機器學習流程分成兩個大步驟:即EDA與特徵工程(只使用Pandas, StatsModel,scipy,numpy, seaborn等庫)輸入: 原始Train, Test 數據集,將原始Train和Test 合併成一個數據集combined處理: Pandas Pipe根據各種可能和各種特徵工程方法定義各種函數(輸入combined, 輸入pre_combined)用PandasPipe 將這個函數像搭積木一樣連在一起。用列表按序存放這些函數)這個列表就是,1. 基本的填充空值, 2. 轉換數據類型, 3. 空白函數(為了對齊美觀而以,啥事不做),4. log 轉換,類別數據啞元處理, 5. 導出到hdf5文件, 6.檢查R2值利用各種排列組合,或者各種參數組合,可以產生豐富的pipes,每一個pipes都可以產生一個預處理過的文件。輸出:某文件夾下的N個預處理過的hdf5文件。針對各種特徵工程的排列組合,或者是Kaggle上面的各種新奇的特徵工程方法。機器學習階段(訓練和產生模型,目標是盡可能獲得盡可能低的RMSE值(針對訓練數據),同時要具有範化的能力(針對測試數據))第一步,建立基準,篩選出最好的一個(幾個)預處理文件(隨機數設成固定值)第二步,針對篩選出來的預處理文件,進行調參。找到最合適的幾個算法(通常是RMSE值最低,且不同Kernel)(隨機數設成固定值)第三步,用調好的參數來預處理文件中的Traing數據的做average 和stacking第四部,生成csv文件,提交到Kaggle 看看得分如何。 準備階段與NoteBook Head過濾warning:有句話說的好,在計算機科學裡,我們只在意錯誤不在意warning 1 2 import…

0 Comments

處理大數據集的建議

最近的一些比賽如 1.及時刪除無用變量並垃圾回收通常我們在特徵工程中會涉及大量的轉換操作,產生很多的中間變量等,除了使用1 2 3 4 5 6 7 8 temp = pd.read_csv( #do something to the file temp[ #delete when no longer needed del #collect residual garbage gc.collect() 2.預定義數據類型pandas一般會自己推斷數據類型,不過傾向於使用耗費空間大的,如下面例子所示,預定義數據類型節省了超過一半的空間。 1…

0 Comments

機器學習之sklearn中的pipeline

如圖所示,利用pipeline我們可以方便的減少代碼量同時讓機器學習的流程變得直觀,例如我們需要做如下操作,容易看出,訓練測試集重複了代碼, 1 2 3 4 5 6 7 8 9 10 11 12 vect = CountVectorizer() tfidf = TfidfTransformer() clf = SGDClassifier() vX = vect.fit_transform(Xtrain) tfidfX = tfidf.fit_transform(vX) predicted =…

0 Comments

如何理解Pandas 和Numpy裡的axis

簡述一種如何直觀的理解Pandas 和Numpy裡面的axis參數的方法。 Numpy 和Pandas裡的sort、mean、drop等操作,不是分行或者列分別用一個method來定義,而是一個method裡面用戶指定axis來操作的,舉例來說:我們先在如下是pandas裡按axis 0和1進行drop的操作示例,我們很容易看出,axis 0是按行drop,而axis 1是按列drop: 但是,mean操作呢? 容易看出,axis 0得出了每一列的均值,而axis 1得出了則是每一行的均值。那麼,在Numpy裡呢? 容易看出,axis為1的時候得出的是每行的sum,axis為0的時候得出了每列的sum。由上面的例子,我們似乎可以看出,axis為1代表水平方向上的操作,axis為0代表垂直方向上的操作,比如axis為1的sum得出的就是每一行的和。但是,在Pandas的Dataframe裡面,為什麼axis=1代表的是drop整個列呢?以下這個例子也可以說明一些情況: 聯繫這個視頻0 is the row axis, and 1 is the column axis. When you drop with axis=1, that means…

0 Comments