1. 隨機梯度下降為什麼比梯度下降快
原始的隨機梯度下降(SGD)適合於低精度的任務,而梯度下降演算法適合用於高精度的任務。
如果接受一個比較低的精度(應用問題中往往不要求高精度),那麼由於SGD每次只利用一個或部分樣本的梯度做更新,所以前期迭代較快,導致前期一段時間內比梯度下降演算法下降得多。
但是由於原始的SGD演算法在目標函數強凸的情況下依舊無法做到線性收斂,所以當執行的時候足夠長的時候SGD的精度會被梯度下降演算法趕超,因為梯度下降演算法可以在目標函數強凸的時候有線性收斂速度。
2. 人工智慧一些術語總結
隨著智能時代慢慢的到來,有一些基本概念都不知道真的是要落伍了,作為正在積極學習向上的青年,我想總結一份筆記,此份筆記會記錄眾多AI領域的術語和概念,當然,學一部分記錄一部分,並且可能會夾雜著自己的一些理解,由於能力有限,有問題希望大家多多賜教。當然,由於內容太多,僅僅只是記錄了中英名對照,有的加上了簡單的解釋,沒加的後續大家有需求,我會慢慢完善~~。目錄暫定以首字母的字典序排序。可以當作目錄方便以後查閱~~建議收藏加點贊哈哈哈
------------------------------------------------這里是分割線--------------------------------------------------
A
准確率(accuracy)
分類模型預測准確的比例。
二分類問題中,准確率定義為:accuracy = (true positives +true negatives)/all samples
多分類問題中,准確率定義為:accuracy = correctpredictions/all samples
激活函數(activation function)
一種函數,將前一層所有神經元激活值的加權和 輸入到一個非線性函數中,然後作為下一層神經元的輸入,例如 ReLU 或 Sigmoid
AdaGrad
一種復雜的梯度下降演算法,重新調節每個參數的梯度,高效地給每個參數一個單獨的學習率。
AUC(曲線下面積)
一種考慮到所有可能的分類閾值的評估標准。ROC 曲線下面積代表分類器隨機預測真正類(Ture Positives)要比假正類(False Positives)概率大的確信度。
Adversarial example(對抗樣本)
Adversarial Networks(對抗網路)
Artificial General Intelligence/AGI(通用人工智慧)
Attention mechanism(注意力機制)
Autoencoder(自編碼器)
Automatic summarization(自動摘要)
Average gradient(平均梯度)
Average-Pooling(平均池化)
B
反向傳播(Backpropagation/BP)
神經網路中完成梯度下降的重要演算法。首先,在前向傳播的過程中計算每個節點的輸出值。然後,在反向傳播的過程中計算與每個參數對應的誤差的偏導數。
基線(Baseline)
被用為對比模型表現參考的簡單模型。
批量(Batch)
模型訓練中一個迭代(指一次梯度更新)使用的樣本集。
批量大小(Batch size)
一個批量中樣本的數量。例如,SGD 的批量大小為 1,而 mini-batch 的批量大小通常在 10-1000 之間。
偏置(Bias)
與原點的截距或偏移量。
二元分類器(Binary classification)
一類分類任務,輸出兩個互斥類別中的一個。比如垃圾郵件檢測。
詞袋(Bag of words/Bow)
基學習器(Base learner)
基學習演算法(Base learning algorithm)
貝葉斯網路(Bayesian network)
基準(Bechmark)
信念網路(Belief network)
二項分布(Binomial distribution)
玻爾茲曼機(Boltzmann machine)
自助采樣法/可重復采樣/有放回採樣(Bootstrap sampling)
廣播(Broadcasting)
C
類別(Class)
所有同類屬性的目標值作為一個標簽。
分類模型(classification)
機器學習模型的一種,將數據分離為兩個或多個離散類別。
收斂(convergence)
訓練過程達到的某種狀態,其中訓練損失和驗證損失在經過了確定的迭代次數後,在每一次迭代中,改變很小或完全不變。
凸函數(concex function)
一種形狀大致呈字母 U 形或碗形的函數。然而,在退化情形中,凸函數的形狀就像一條線。
成本(cost)
loss 的同義詞。深度學習模型一般都會定義自己的loss函數。
交叉熵(cross-entropy)
多類別分類問題中對 Log 損失函數的推廣。交叉熵量化兩個概率分布之間的區別。
條件熵(Conditional entropy)
條件隨機場(Conditional random field/CRF)
置信度(Confidence)
共軛方向(Conjugate directions)
共軛分布(Conjugate distribution)
共軛梯度(Conjugate gradient)
卷積神經網路(Convolutional neural network/CNN)
餘弦相似度(Cosine similarity)
成本函數(Cost Function)
曲線擬合(Curve-fitting)
D
數據集(data set)
樣本的集合
深度模型(deep model)
一種包含多個隱藏層的神經網路。深度模型依賴於其可訓練的非線性性質。和寬度模型對照(widemodel)。
dropout 正則化(dropoutregularization)
訓練神經網路時一種有用的正則化方法。dropout 正則化的過程是在單次梯度計算中刪去一層網路中隨機選取的固定數量的單元。刪去的單元越多,正則化越強。
數據挖掘(Data mining)
決策樹/判定樹(Decisiontree)
深度神經網路(Deep neural network/DNN)
狄利克雷分布(Dirichlet distribution)
判別模型(Discriminative model)
下采樣(Down sampling)
動態規劃(Dynamic programming)
E
早期停止法(early stopping)
一種正則化方法,在訓練損失完成下降之前停止模型訓練過程。當驗證數據集(validationdata set)的損失開始上升的時候,即泛化表現變差的時候,就該使用早期停止法了。
嵌入(embeddings)
一類表示為連續值特徵的明確的特徵。嵌入通常指將高維向量轉換到低維空間中。
經驗風險最小化(empirical risk minimization,ERM)
選擇能使得訓練數據的損失函數最小化的模型的過程。和結構風險最小化(structualrisk minimization)對照。
集成(ensemble)
多個模型預測的綜合考慮。可以通過以下一種或幾種方法創建一個集成方法:
設置不同的初始化;
設置不同的超參量;
設置不同的總體結構。
深度和廣度模型是一種集成。
樣本(example)
一個數據集的一行內容。一個樣本包含了一個或多個特徵,也可能是一個標簽。參見標注樣本(labeledexample)和無標注樣本(unlabeled example)。
F
假負類(false negative,FN)
被模型錯誤的預測為負類的樣本。例如,模型推斷一封郵件為非垃圾郵件(負類),但實際上這封郵件是垃圾郵件。
假正類(false positive,FP)
被模型錯誤的預測為正類的樣本。例如,模型推斷一封郵件為垃圾郵件(正類),但實際上這封郵件是非垃圾郵件。
假正類率(false positive rate,FP rate)
ROC 曲線(ROC curve)中的 x 軸。FP 率的定義是:假正率=假正類數/(假正類數+真負類數)
特徵工程(feature engineering)
在訓練模型的時候,挖掘對模型效果有利的特徵。
前饋神經網路(Feedforward Neural Networks/FNN )
G
泛化(generalization)
指模型利用新的沒見過的數據而不是用於訓練的數據作出正確的預測的能力。
廣義線性模型(generalized linear model)
最小二乘回歸模型的推廣/泛化,基於高斯雜訊,相對於其它類型的模型(基於其它類型的雜訊,比如泊松雜訊,或類別雜訊)。廣義線性模型的例子包括:
logistic 回歸
多分類回歸
最小二乘回歸
梯度(gradient)
所有變數的偏導數的向量。在機器學習中,梯度是模型函數的偏導數向量。梯度指向最陡峭的上升路線。
梯度截斷(gradient clipping)
在應用梯度之前先修飾數值,梯度截斷有助於確保數值穩定性,防止梯度爆炸出現。
梯度下降(gradient descent)
通過計算模型的相關參量和損失函數的梯度最小化損失函數,值取決於訓練數據。梯度下降迭代地調整參量,逐漸靠近權重和偏置的最佳組合,從而最小化損失函數。
圖(graph)
在 TensorFlow 中的一種計算過程展示。圖中的節點表示操作。節點的連線是有指向性的,表示傳遞一個操作(一個張量)的結果(作為一個操作數)給另一個操作。使用 TensorBoard 能可視化計算圖。
高斯核函數(Gaussian kernel function)
高斯混合模型(Gaussian Mixture Model)
高斯過程(Gaussian Process)
泛化誤差(Generalization error)
生成模型(Generative Model)
遺傳演算法(Genetic Algorithm/GA)
吉布斯采樣(Gibbs sampling)
基尼指數(Gini index)
梯度下降(Gradient Descent)
H
啟發式(heuristic)
一個問題的實際的和非最優的解,但能從學習經驗中獲得足夠多的進步。
隱藏層(hidden layer)
神經網路中位於輸入層(即特徵)和輸出層(即預測)之間的合成層。一個神經網路包含一個或多個隱藏層。
超參數(hyperparameter)
連續訓練模型的過程中可以擰動的「旋鈕」。例如,相對於模型自動更新的參數,學習率(learningrate)是一個超參數。和參量對照。
硬間隔(Hard margin)
隱馬爾可夫模型(Hidden Markov Model/HMM)
層次聚類(Hierarchical clustering)
假設檢驗(Hypothesis test)
I
獨立同分布(independently and identicallydistributed,i.i.d)
從不會改變的分布中獲取的數據,且獲取的每個值不依賴於之前獲取的值。i.i.d. 是機器學習的理想情況——一種有用但在現實世界中幾乎找不到的數學構建。
推斷(inference)
在機器學習中,通常指將訓練模型應用到無標注樣本來進行預測的過程。在統計學中,推斷指在觀察到的數據的基礎上擬合分布參數的過程。
輸入層(input layer)
神經網路的第一層(接收輸入數據)。
評分者間一致性(inter-rater agreement)
用來衡量一項任務中人類評分者意見一致的指標。如果意見不一致,則任務說明可能需要改進。有時也叫標注者間信度(inter-annotator agreement)或評分者間信度(inter-raterreliability)。
增量學習(Incremental learning)
獨立成分分析(Independent Component Analysis/ICA)
獨立子空間分析(Independent subspace analysis)
信息熵(Information entropy)
信息增益(Information gain)
J
JS 散度(Jensen-ShannonDivergence/JSD)
K
Kernel 支持向量機(KernelSupport Vector Machines/KSVM)
一種分類演算法,旨在通過將輸入數據向量映射到更高維度的空間使正類和負類之間的邊際最大化。例如,考慮一個輸入數據集包含一百個特徵的分類問題。為了使正類和負類之間的間隔最大化,KSVM 從內部將特徵映射到百萬維度的空間。KSVM 使用的損失函數叫作 hinge 損失。
核方法(Kernel method)
核技巧(Kernel trick)
k 折交叉驗證/k 倍交叉驗證(K-fold cross validation)
K - 均值聚類(K-MeansClustering)
K近鄰演算法(K-Nearest NeighboursAlgorithm/KNN)
知識圖譜(Knowledge graph)
知識庫(Knowledge base)
知識表徵(Knowledge Representation)
L
L1 損失函數(L1 loss)
損失函數基於模型對標簽的預測值和真實值的差的絕對值而定義。L1 損失函數比起 L2 損失函數對異常值的敏感度更小。
L1 正則化(L1regularization)
一種正則化,按照權重絕對值總和的比例進行懲罰。在依賴稀疏特徵的模型中,L1 正則化幫助促使(幾乎)不相關的特徵的權重趨近於 0,從而從模型中移除這些特徵。
L2 損失(L2 loss)
參見平方損失。
L2 正則化(L2regularization)
一種正則化,按照權重平方的總和的比例進行懲罰。L2 正則化幫助促使異常值權重更接近 0 而不趨近於 0。(可與 L1 正則化對照閱讀。)L2 正則化通常改善線性模型的泛化效果。
標簽(label)
在監督式學習中,樣本的「答案」或「結果」。標注數據集中的每個樣本包含一或多個特徵和一個標簽。在垃圾郵件檢測數據集中,特徵可能包括主題、發出者何郵件本身,而標簽可能是「垃圾郵件」或「非垃圾郵件」。
標注樣本(labeled example)
包含特徵和標簽的樣本。在監督式訓練中,模型從標注樣本中進行學習。
學習率(learning rate)
通過梯度下降訓練模型時使用的一個標量。每次迭代中,梯度下降演算法使學習率乘以梯度,乘積叫作 gradient step。學習率是一個重要的超參數。
最小二乘回歸(least squares regression)
通過 L2 損失最小化進行訓練的線性回歸模型。
線性回歸(linear regression)
對輸入特徵的線性連接輸出連續值的一種回歸模型。
logistic 回歸(logisticregression)
將 sigmoid 函數應用於線性預測,在分類問題中為每個可能的離散標簽值生成概率的模型。盡管 logistic 回歸常用於二元分類問題,但它也用於多類別分類問題(這種情況下,logistic回歸叫作「多類別 logistic 回歸」或「多項式 回歸」。
對數損失函數(Log Loss)
二元 logistic 回歸模型中使用的損失函數。
損失(Loss)
度量模型預測與標簽距離的指標,它是度量一個模型有多糟糕的指標。為了確定損失值,模型必須定義損失函數。例如,線性回歸模型通常使用均方差作為損失函數,而 logistic 回歸模型使用對數損失函數。
隱狄利克雷分布(Latent Dirichlet Allocation/LDA)
潛在語義分析(Latent semantic analysis)
線性判別(Linear Discriminant Analysis/LDA)
長短期記憶(Long-Short Term Memory/LSTM)
M
機器學習(machine learning)
利用輸入數據構建(訓練)預測模型的項目或系統。該系統使用學習的模型對與訓練數據相同分布的新數據進行有用的預測。機器學習還指與這些項目或系統相關的研究領域。
均方誤差(Mean Squared Error/MSE)
每個樣本的平均平方損失。MSE 可以通過平方損失除以樣本數量來計算。
小批量(mini-batch)
在訓練或推斷的一個迭代中運行的整批樣本的一個小的隨機選擇的子集。小批量的大小通常在10 到 1000 之間。在小批量數據上計算損失比在全部訓練數據上計算損失要高效的多。
機器翻譯(Machine translation/MT)
馬爾可夫鏈蒙特卡羅方法(Markov Chain Monte Carlo/MCMC)
馬爾可夫隨機場(Markov Random Field)
多文檔摘要(Multi-document summarization)
多層感知器(Multilayer Perceptron/MLP)
多層前饋神經網路(Multi-layer feedforward neuralnetworks)
N
NaN trap
訓練過程中,如果模型中的一個數字變成了 NaN,則模型中的很多或所有其他數字最終都變成 NaN。NaN 是「Not aNumber」的縮寫。
神經網路(neural network)
該模型從大腦中獲取靈感,由多個層組成(其中至少有一個是隱藏層),每個層包含簡單的連接單元或神經元,其後是非線性。
神經元(neuron)
神經網路中的節點,通常輸入多個值,生成一個輸出值。神經元通過將激活函數(非線性轉換)應用到輸入值的加權和來計算輸出值。
歸一化(normalization)
將值的實際區間轉化為標准區間的過程,標准區間通常是-1 到+1 或 0 到 1。例如,假設某個特徵的自然區間是 800 到 6000。通過減法和分割,你可以把那些值標准化到區間-1 到+1。參見縮放。
Numpy
Python 中提供高效數組運算的開源數學庫。pandas 基於 numpy 構建。
Naive bayes(樸素貝葉斯)
Naive Bayes Classifier(樸素貝葉斯分類器)
Named entity recognition(命名實體識別)
Natural language generation/NLG(自然語言生成)
Natural language processing(自然語言處理)
Norm(范數)
O
目標(objective)
演算法嘗試優化的目標函數。
one-hot 編碼(獨熱編碼)(one-hotencoding)
一個稀疏向量,其中:一個元素設置為 1,所有其他的元素設置為 0。。
一對多(one-vs.-all)
給出一個有 N 個可能解決方案的分類問題,一對多解決方案包括 N 個獨立的二元分類器——每個可能的結果都有一個二元分類器。例如,一個模型將樣本分為動物、蔬菜或礦物,則一對多的解決方案將提供以下三種獨立的二元分類器:
動物和非動物
蔬菜和非蔬菜
礦物和非礦物
過擬合(overfitting)
創建的模型與訓練數據非常匹配,以至於模型無法對新數據進行正確的預測
Oversampling(過采樣)
P
pandas
一種基於列的數據分析 API。很多機器學習框架,包括 TensorFlow,支持 pandas 數據結構作為輸入。參見 pandas 文檔。
參數(parameter)
機器學習系統自行訓練的模型的變數。例如,權重是參數,它的值是機器學習系統通過連續的訓練迭代逐漸學習到的。注意與超參數的區別。
性能(performance)
在軟體工程中的傳統含義:軟體運行速度有多快/高效?
在機器學習中的含義:模型的准確率如何?即,模型的預測結果有多好?
困惑度(perplexity)
對模型完成任務的程度的一種度量指標。例如,假設你的任務是閱讀用戶在智能手機上輸入的單詞的頭幾個字母,並提供可能的完整單詞列表。該任務的困惑度(perplexity,P)是為了列出包含用戶實際想輸入單詞的列表你需要進行的猜測數量。
流程(pipeline)
機器學習演算法的基礎架構。管道包括收集數據、將數據放入訓練數據文件中、訓練一或多個模型,以及最終輸出模型。
Principal component analysis/PCA(主成分分析)
Precision(查准率/准確率)
Prior knowledge(先驗知識)
Q
Quasi Newton method(擬牛頓法)
R
召回率(recall)
回歸模型(regression model)
一種輸出持續值(通常是浮點數)的模型。而分類模型輸出的是離散值。
正則化(regularization)
對模型復雜度的懲罰。正則化幫助防止過擬合。正則化包括不同種類:
L1 正則化
L2 正則化
dropout 正則化
early stopping(這不是正式的正則化方法,但可以高效限制過擬合)
正則化率(regularization rate)
一種標量級,用 lambda 來表示,指正則函數的相對重要性。從下面這個簡化的損失公式可以看出正則化率的作用:
minimize(loss function + λ(regularization function))
提高正則化率能夠降低過擬合,但可能會使模型准確率降低。
表徵(represention)
將數據映射到有用特徵的過程。
受試者工作特徵曲線(receiver operatingcharacteristic/ROC Curve)
反映在不同的分類閾值上,真正類率和假正類率的比值的曲線。參見 AUC。
Recurrent Neural Network(循環神經網路)
Recursive neural network(遞歸神經網路)
Reinforcement learning/RL(強化學習)
Re-sampling(重采樣法)
Representation learning(表徵學習)
Random Forest Algorithm(隨機森林演算法)
S
縮放(scaling)
特徵工程中常用的操作,用於控制特徵值區間,使之與數據集中其他特徵的區間匹配。例如,假設你想使數據集中所有的浮點特徵的區間為 0 到 1。給定一個特徵區間是 0 到 500,那麼你可以通過將每個值除以 500,縮放特徵值區間。還可參見正則化。
scikit-learn
一種流行的開源機器學習平台。網址:www.scikit-learn.org。
序列模型(sequence model)
輸入具有序列依賴性的模型。例如,根據之前觀看過的視頻序列對下一個視頻進行預測。
Sigmoid 函數(sigmoid function)
softmax
為多類別分類模型中每個可能的類提供概率的函數。概率加起來的總和是 1.0。例如,softmax 可能檢測到某個圖像是一隻狗的概率為 0.9,是一隻貓的概率為 0.08,是一匹馬的概率為 0.02。(也叫作 full softmax)。
結構風險最小化(structural risk minimization/SRM)
這種演算法平衡兩個目標:
構建預測性最強的模型(如最低損失)。
使模型盡量保持簡單(如強正則化)。
比如,在訓練集上的損失最小化 + 正則化的模型函數就是結構風險最小化演算法。更多信息,參見 http://www.svms.org/srm/。可與經驗風險最小化對照閱讀。
監督式機器學習(supervised machine learning)
利用輸入數據及其對應標簽來訓練模型。監督式機器學習類似學生通過研究問題和對應答案進行學習。在掌握問題和答案之間的映射之後,學生就可以提供同樣主題的新問題的答案了。可與非監督機器學習對照閱讀。
Similarity measure(相似度度量)
Singular Value Decomposition(奇異值分解)
Soft margin(軟間隔)
Soft margin maximization(軟間隔最大化)
Support Vector Machine/SVM(支持向量機)
T
張量(tensor)
TensorFlow 項目的主要數據結構。張量是 N 維數據結構(N 的值很大),經常是標量、向量或矩陣。張量可以包括整數、浮點或字元串值。
Transfer learning(遷移學習)
U
無標簽樣本(unlabeled example)
包含特徵但沒有標簽的樣本。無標簽樣本是推斷的輸入。在半監督學習和無監督學習的訓練過程中,通常使用無標簽樣本。
無監督機器學習(unsupervised machine learning)
訓練一個模型尋找數據集(通常是無標簽數據集)中的模式。無監督機器學習最常用於將數據分成幾組類似的樣本。無監督機器學習的另一個例子是主成分分析(principal componentanalysis,PCA)
W
Word embedding(詞嵌入)
Word sense disambiguation(詞義消歧)
3. 10的三次方怎麼稀釋梯度
這個復雜,需要了解方法。可以用到兩三種方法。
十倍梯度稀釋法(倍比稀釋和梯度稀釋):
梯度下降是尋找函數極小值的優化方法,在深度學習模型中常用於在反向傳播過程中更新神經網路的權重。
梯度下降優化演算法功能是什麼?
梯度下降,優化演算法發揮了以下三個主要方面的作用:
1、學習率成分、或
2、修正坡度成分L/W
3或2者
讓我們看看下面的公式1。
方程1 :隨機梯度下降中的各種量
學習率調度器vs梯度下降優化的主要區別在於,梯度下降優化是將學習率乘以梯度的函數即因子來調整學習率成分,而學習率調度器是將學習率乘以一定的常數或關於時間步的函數的因子來更新學習率。
第一種方法主要是通過將學習率(learning rate )乘以0到1之間的因子來降低學習率)例如RMSprop。 第二種方法通常使用坡度(Gradient )的滑動平均(也稱為動量)而不是純坡度來確定下降方向。 第三種方法是將Adam和AMSGrad這樣的兩者結合起來。
Fig.2 )各類梯度下降優化演算法、其發表年和使用的核心思路。
Fig.3自上而下,展示了這些優化演算法是如何從最簡單的簡單梯度下降(SGD )進化到Adam的各種變種的。 SGD最初分別向兩個方向發展,一個是AdaGrad,主要調整學習率(learning rate )。 另一個是Momentum,主要調整梯度的構成要素。 隨著進化的發展,Momentum和RMSprop一體化,「QS dch」(Adam )誕生了。 你可能會對我這樣的組織方式提出異議,但我一直以來都是這樣理解的。
Fig.3 )各種最優化演算法的進化圖(gist ) ) ) ) ) )。
符號表示
t -迭代步數
w -需要更新的權重和參數
-學習率
L/w - L (損失函數)相對於w的梯度
因為我統一了論文中出現的希臘文字和符號表示,所以可以用統一的「進化」的觀點來看這些優化演算法
1. 隨機梯度下降(Stochastic Gradient Descend)
最原始的隨機梯度下降演算法主要是將當前梯度l/w乘以一個系數學習率來更新模型的權重w。
2. 動量演算法(Momentum)
動量演算法使用具有動量的坡度(坡度的指數滑動平均、Polyak、1964 )而不是當前坡度來更新w。 在後續的文章中,我們會發現採用指數滑動平均作為動量更新方法幾乎已經成為行業標准。
另外,v初始化值為0。 通常設定為0.9。
值得注意的是,許多文章在引用Momemtum演算法時都使用年輕花瓣Qian,1999的文章。 但是,該演算法的原始來源是Sutskever et al。 另一方面,經典動量演算法是1964年由Polyak提出的,因此上述也引用了Polyak的文章。 (謝謝James指出這一點)
3.Nesterov加速梯度下降法(NAG)
是在Polyak提出動量法後(雙關: Polyak勢)
頭正盛),一個使用Nesterov加速梯度下降法(Sutskever et al., 2013)的類似更新方法也被實現了。此更新方法使用V,即我稱之為投影梯度的指數移動平均值。
其中
且V 初始化為0。
第二個等式中的最後一項就是一個投影梯度。這個值可以通過使用先前的速度「前進一步」獲得(等式4)。這意味著對於這個時間步驟t,我們必須在最終執行反向傳播之前執行另一個前向傳播。這是步驟:
1.使用先前的速度將當前權重w更新為投影權重w*
(等式4)
2. 使用投影權重計算前向傳播
3.獲得投影梯度∂L/∂w*
4.計算相應的V和w
常見的默認值:
β = 0.9
請注意,原始的Nesterov 加速梯度下降法論文( Nesterov, 1983 )並不是關於隨機梯度下降,也沒有明確使用梯度下降方程。因此,更合適的參考是上面提到的Sutskever等人的出版物。在2013年,它描述了NAG在隨機梯度下降中的應用。(再一次,我要感謝James對HackerNews的評論中指出這一點。)
4. 根號a-+5的最小值和a的值
梯度下降是非常常用的優化演算法。作為機器學習的基礎知識,這是一個必須要掌握的演算法。藉助本文,讓我們來一起詳細了解一下這個演算法。
前言
本文的代碼可以到我的Github上獲取:
https://github.com/paulQuei/gradient_descent
本文的演算法示例通過Python語言實現,在實現中使用到了numpy和matplotlib。如果你不熟悉這兩個工具,請自行在網上搜索教程。
關於優化
大多數學習演算法都涉及某種形式的優化。優化指的是改變x以最小化或者最大化某個函數的任務。
我們通常以最小化指代大多數最優化問題。最大化可經由最小化來實現。
我們把要最小化或最大化的函數成為目標函數(objective function)或准則(criterion)。
我們通常使用一個上標*表示最小化或最大化函數的x值,記做這樣:
[x^* = arg; min; f(x)]
優化本身是一個非常大的話題。如果有興趣,可以通過《數值優化》和《運籌學》的書籍進行學習。
模型與假設函數
所有的模型都是錯誤的,但其中有些是有用的。– George Edward Pelham Box
模型是我們對要分析的數據的一種假設,它是為解決某個具體問題從數據中學習到的,因此它是機器學習最核心的概念。
針對一個問題,通常有大量的模型可以選擇。
本文不會深入討論這方面的內容,關於各種模型請參閱機器學習的相關書籍。本文僅以最簡單的線性模型為基礎來討論梯度下降演算法。
這里我們先介紹一下在監督學習(supervised learning)中常見的三個符號:
m,描述訓練樣本的數量
x,描述輸入變數或特徵
y,描述輸出變數或者叫目標值
訓練集會包含很多的樣本,我們用 表示其中第i個樣本。
x是數據樣本的特徵,y是其目標值。例如,在預測房價的模型中,x是房子的各種信息,例如:面積,樓層,位置等等,y是房子的價格。在圖像識別的任務中,x是圖形的所有像素點數據,y是圖像中包含的目標對象。
我們是希望尋找一個函數,將x映射到y,這個函數要足夠的好,以至於能夠預測對應的y。由於歷史原因,這個函數叫做假設函數(hypothesis function)。
學習的過程如下圖所示。即:首先根據已有的數據(稱之為訓練集)訓練我們的演算法模型,然後根據模型的假設函數來進行新數據的預測。
線性模型(linear model)正如其名稱那樣:是希望通過一個直線的形式來描述模式。線性模型的假設函數如下所示:
[h_{ heta}(x) = heta_{0} + heta_{1} * x]
這個公式對於大家來說應該都是非常簡單的。如果把它繪制出來,其實就是一條直線。
下圖是一個具體的例子,即: 的圖形:
在實際的機器學習工程中,你會擁有大量的數據。這些數據會來自於某個數據源。它們存儲在csv文件中,或者以其他的形式打包。
但是本文作為演示使用,我們通過一些簡單的代碼自動生成了需要的數據。為了便於計算,演示的數據量也很小。
import numpy as np
max_x = 10
data_size = 10
theta_0 = 5
theta_1 = 2
def get_data:
x = np.linspace(1, max_x, data_size)
noise = np.random.normal(0, 0.2, len(x))
y = theta_0 + theta_1 * x + noise
return x, y
這段代碼很簡單,我們生成了x范圍是 [1, 10] 整數的10條數據。對應的y是以線性模型的形式計算得到,其函數是:。現實中的數據常常受到各種因素的干擾,所以對於y我們故意加上了一些高斯雜訊。因此最終的y值為比原先會有輕微的偏離。
最後我們的數據如下所示:
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y = [6.66, 9.11, 11.08, 12.67, 15.12, 16.76, 18.75, 21.35, 22.77, 24.56]
我們可以把這10條數據繪制出來這樣就有一個直觀的了解了,如下圖所示:
雖然演示用的數據是我們通過公式計算得到的。但在實際的工程中,模型的參數是需要我們通過數據學習到的。所以下文我們假設我們不知道這里線性模式的兩個參數是什麼,而是通過演算法的形式求得。
最後再跟已知的參數進行對比以驗證我們的演算法是否正確。
有了上面的數據,我們可以嘗試畫一條直線來描述我們的模型。
例如,像下面這樣畫一條水平的直線:
很顯然,這條水平線離數據太遠了,非常的不匹配。
那我們可以再畫一條斜線。
我們初次畫的斜線可能也不貼切,它可能像下面這樣:
最後我們通過不斷嘗試,找到了最終最合適的那條,如下所示:
梯度下降演算法的計算過程,就和這種本能式的試探是類似的,它就是不停的迭代,一步步的接近最終的結果。
代價函數
上面我們嘗試了幾次通過一條直線來擬合(fitting)已有的數據。
二維平面上的一條直線可以通過兩個參數唯一的確定,兩個參數的確定也即模型的確定。那如何描述模型與數據的擬合程度呢?答案就是代價函數。
代價函數(cost function)描述了學習到的模型與實際結果的偏差程度。以上面的三幅圖為例,最後一幅圖中的紅線相比第一條水平的綠線,其偏離程度(代價)應該是更小的。
很顯然,我們希望我們的假設函數與數據盡可能的貼近,也就是說:希望代價函數的結果盡可能的小。這就涉及到結果的優化,而梯度下降就是尋找最小值的方法之一。
對於每一個樣本,假設函數會依據計算出一個估算值,我們常常用來表示。即 。
很自然的,我們會想到,通過下面這個公式來描述我們的模型與實際值的偏差程度:
[(h_ heta(x^i) - y^i)^2 = (widehat{y}^{i} - y^i)^2 = ( heta_{0} + heta_{1} * x^{i} - y^{i})^2]
請注意, 是實際數據的值, 是我們的模型的估算值。前者對應了上圖中的離散點的y坐標,後者對應了離散點在直線上投影點的y坐標。
每一條數據都會存在一個偏差值,而代價函數就是對所有樣本的偏差求平均值,其計算公式如下所示:
[L( heta) = frac {1}{m} sum_{i=1}^{m}(h_ heta(x^i) - y^i)^2 = frac {1}{m} sum_{i=1}^{m}( heta_{0} + heta_{1} * x^{i} - y^{i})^2]
當損失函數的結果越小,則意味著通過我們的假設函數估算出的結果與真實值越接近。這也就是為什麼我們要最小化損失函數的原因。
藉助上面這個公式,我們可以寫一個函數來實現代價函數:
def cost_function(x, y, t0, t1):
cost_sum = 0
for i in range(len(x)):
cost_item = np.power(t0 + t1 * x[i] - y[i], 2)
cost_sum += cost_item
return cost_sum / len(x)
這個函數的代碼應該不用多做解釋,它就是根據上面的完成計算。
我們可以嘗試選取不同的 和 組合來計算代價函數的值,然後將結果繪制出來:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
theta_0 = 5
theta_1 = 2
def draw_cost(x, y):
fig = plt.figure(figsize=(10, 8))
ax = fig.gca(projection='3d')
scatter_count = 100
radius = 1
t0_range = np.linspace(theta_0 - radius, theta_0 + radius, scatter_count)
t1_range = np.linspace(theta_1 - radius, theta_1 + radius, scatter_count)
cost = np.zeros((len(t0_range), len(t1_range)))
for a in range(len(t0_range)):
for b in range(len(t1_range)):
cost[a][b] = cost_function(x, y, t0_range[a], t1_range[b])
t0, t1 = np.meshgrid(t0_range, t1_range)
ax.set_xlabel('theta_0')
ax.set_ylabel('theta_1')
ax.plot_surface(t0, t1, cost, cmap=cm.hsv)
在這段代碼中,我們對 和 各自指定了一個范圍進行100次的采樣,然後以不同的 組合對來計算代價函數的值。
如果我們將所有點的代價函數值繪制出來,其結果如下圖所示:
從這個圖形中我們可以看出,當 越接近 [5, 2]時其結果(偏差)越小。相反,離得越遠,結果越大。
直觀解釋
從上面這幅圖中我們可以看出,代價函數在不同的位置結果大小不同。
從三維的角度來看,這就和地面的高低起伏一樣。最高的地方就好像是山頂。
而我們的目標就是:從任意一點作為起點,能夠快速尋找到一條路徑並以此到達圖形最低點(代價值最小)的位置。
而梯度下降的演算法過程就和我們從山頂想要快速下山的做法是一樣的。
在生活中,我們很自然會想到沿著最陡峭的路往下行是下山速度最快的。如下面這幅圖所示:
針對這幅圖,細心的讀者可能很快就會有很多的疑問,例如:
對於一個函數,怎麼確定下行的方向?
每一步該往前走多遠?
有沒有可能停留在半山腰的平台上?
這些問題也就是本文接下來要討論的內容。
演算法描述
梯度下降演算法最開始的一點就是需要確定下降的方向,即:梯度。
我們常常用 來表示梯度。
對於一個二維空間的曲線來說,梯度就是其切線的方向。如下圖所示:
而對於更高維空間的函數來說,梯度由所有變數的偏導數決定。
其表達式如下所示:
[ abla f({ heta}) = ( frac{partial f({ heta})}{partial heta_1} , frac{partial f({ heta})}{partial heta_2} , ... , frac{partial f({ heta})}{partial heta_n} )]
在機器學習中,我們主要是用梯度下降演算法來最小化代價函數,記做:
[ heta ^* = arg min L( heta)]
其中,L是代價函數,是參數。
梯度下降演算法的主體邏輯很簡單,就是沿著梯度的方向一直下降,直到參數收斂為止。
記做:
[ heta ^{k + 1}_i = heta^{k}_i - lambda abla f( heta^{k})]
這里有幾點需要說明:
收斂是指函數的變化率很小。具體選擇多少合適需要根據具體的項目來確定。在演示項目中我們可以選擇0.01或者0.001這樣的值。不同的值將影響演算法的迭代次數,因為在梯度下降的最後,我們會越來越接近平坦的地方,這個時候函數的變化率也越來越小。如果選擇一個很小的值,將可能導致演算法迭代次數暴增。
公式中的 稱作步長,也稱作學習率(learning rate)。它決定了每一步往前走多遠,關於這個值我們會在下文中詳細講解。你可以暫時人為它是一個類似0.01或0.001的固定值。
在具體的項目,我們不會讓演算法無休止的運行下去,所以通常會設置一個迭代次數的最大上限。
線性回歸的梯度下降
有了上面的知識,我們可以回到線性模型代價函數的梯度下降演算法實現了。
首先,根據代價函數我們可以得到梯度向量如下:
[ abla f({ heta}) = (frac{partial L( heta)}{ partial heta_{0}}, frac{ partial L( heta)}{ partial heta_{1}}) = (frac {2}{m} sum_{i=1}^{m}( heta_{0} + heta_{1} * x^{i} - y^{i}) , frac {2}{m} sum_{i=1}^{m}( heta_{0} + heta_{1} * x^{i} - y^{i}) x^{i})]
接著,將每個偏導數帶入迭代的公式中,得到:
[ heta_{0} := heta_{0} - lambda frac{partial L( heta_{0})}{ partial heta_{0}} = heta_{0} - frac {2 lambda }{m} sum_{i=1}^{m}( heta_{0} + heta_{1} * x^{i} - y^{i}) heta_{1} := heta_{1} - lambda frac{partial L( heta_{1})}{ partial heta_{1}} = heta_{1} - frac {2 lambda }{m} sum_{i=1}^{m}( heta_{0} + heta_{1} * x^{i} - y^{i}) x^{i}]
由此就可以通過代碼實現我們的梯度下降演算法了,演算法邏輯並不復雜:
learning_rate = 0.01
def gradient_descent(x, y):
t0 = 10
t1 = 10
delta = 0.001
for times in range(1000):
sum1 = 0
sum2 = 0
for i in range(len(x)):
sum1 += (t0 + t1 * x[i] - y[i])
sum2 += (t0 + t1 * x[i] - y[i]) * x[i]
t0_ = t0 - 2 * learning_rate * sum1 / len(x)
t1_ = t1 - 2 * learning_rate * sum2 / len(x)
print('Times: {}, gradient: [{}, {}]'.format(times, t0_, t1_))
if (abs(t0 - t0_) < delta and abs(t1 - t1_) < delta):
print('Gradient descent finish')
return t0_, t1_
t0 = t0_
t1 = t1_
print('Gradient descent too many times')
return t0, t1
這段代碼說明如下:
我們隨機選擇了 都為10作為起點
設置最多迭代1000次
收斂的范圍設為0.001
學習步長設為0.01
如果我們將演算法迭代過程中求得的線性模式繪制出來,可以得到下面這幅動態圖:
最後演算法得到的結果如下:
Times: 657, gradient: [5.196562662718697, 1.952931052920264]
Times: 658, gradient: [5.195558390180733, 1.9530753071808193]
Times: 659, gradient: [5.194558335124868, 1.9532189556399233]
Times: 660, gradient: [5.193562479839619, 1.9533620008416623]
Gradient descent finish
從輸出中可以看出,演算法迭代了660次就收斂了。這時的結果[5.193562479839619, 1.9533620008416623],這已經比較接近目標值 [5, 2]了。如果需要更高的精度,可以將delta的值調的更小,當然,此時會需要更多的迭代次數。
高維擴展
雖然我們舉的例子是二維的,但是對於更高維的情況也是類似的。同樣是根據迭代的公式進行運算即可:
[ heta_{i} = heta_{i} - lambda frac {partial L( heta)}{partial heta_i} = heta_{i} - frac{2lambda}{m} sum_{i=1}^{m}(h_ heta(x^{k})-y^k)x_i^k]
這里的下標i表示第i個參數,上標k表示第k個數據。
梯度下降家族BGD
在上面的內容中我們看到,演算法的每一次迭代都需要把所有樣本進行遍歷處理。這種做法稱為之Batch Gradient Descent,簡稱BGD。作為演示示例只有10條數據,這是沒有問題的。
但在實際的項目中,數據集的數量可能是幾百萬幾千萬條,這時候每一步迭代的計算量就會非常的大了。
於是就有了下面兩個變種。
SGD
Stochastic Gradient Descent,簡稱SGD,這種演算法是每次從樣本集中僅僅選擇一個樣本來進行計算。很顯然,這樣做演算法在每一步的計算量一下就少了很多。
其演算法公式如下:
[ heta_{i} = heta_{i} - lambda frac {partial L( heta)}{partial heta_i} = heta_{i} - lambda(h_ heta(x^k)-y^k)x_i^k]
當然,減少演算法計算量也是有代價的,那就是:演算法結果會強依賴於隨機取到的數據情況,這可能會導致演算法的最終結果不太令人滿意。
MBGD
以上兩種做法其實是兩個極端,一個是每次用到了所有數據,另一個是每次只用一個數據。
我們自然就會想到兩者取其中的方法:每次選擇一小部分數據進行迭代。這樣既避免了數據集過大導致每次迭代計算量過大的問題,也避免了單個數據對演算法的影響。
這種演算法稱之為Mini-batch Gradient Descent,簡稱MBGD。
其演算法公式如下:
[ heta_{i} = heta_{i} - lambda frac {partial L( heta)}{partial heta_i} = heta_{i} - frac{2lambda}{m} sum_{i=a}^{a + b}(h_ heta(x^k)-y^k)x_i^k]
當然,我們可以認為SGD是Mini-batch為1的特例。
針對上面提到的演算法變種,該如何選擇呢?
下面是Andrew Ng給出的建議:
如果樣本數量較小(例如小於等於2000),選擇BGD即可。
如果樣本數量很大,選擇 來進行MBGD,例如:64,128,256,512。
下表是 Optimization for Deep Learning 中對三種演算法的對比
方法准確性更新速度內存佔用在線學習BGD好慢高否SGD好(with annealing)快低是MBGD好中等中等是
演算法優化
式7是演算法的基本形式,在這個基礎上有很多人進行了更多的研究。接下來我們介紹幾種梯度下降演算法的優化方法。
Momentum
Momentum是動量的意思。這個演算法的思想就是藉助了動力學的模型:每次演算法的迭代會使用到上一次的速度作為依據。
演算法的公式如下:
[v^t = gamma v^{t - 1} + lambda abla f( heta) heta = heta - v_t]
對比式7可以看出,這個演算法的主要區別就是引入了,並且,每個時刻的受前一個時刻的影響。
從形式上看,動量演算法引入了變數 v 充當速度角色——它代表參數在參數空間移動的方向和速率。速度被設為負梯度的指數衰減平均。名稱動量來自物理類比,根據牛頓運動定律,負梯度是移動參數空間中粒子的力。動量在物理學上定義為質量乘以速度。在動量學習演算法中,我們假設是單位質量,因此速度向量 v 也可以看作是粒子的動量。
對於可以取值0,而是一個常量,設為0.9是一個比較好的選擇。
下圖是momentum演算法的效果對比:
對原來的演算法稍加修改就可以增加動量效果:
def gradient_descent_with_momentum(x, y):
t0 = 10
t1 = 10
delta = 0.001
v0 = 0
v1 = 0
gamma = 0.9
for times in range(1000):
sum1 = 0
sum2 = 0
for i in range(len(x)):
sum1 += (t0 + t1 * x[i] - y[i])
sum2 += (t0 + t1 * x[i] - y[i]) * x[i]
v0 = gamma * v0 + 2 * learning_rate * sum1 / len(x)
v1 = gamma * v1 + 2 * learning_rate * sum2 / len(x)
t0_ = t0 - v0
t1_ = t1 - v1
print('Times: {}, gradient: [{}, {}]'.format(times, t0_, t1_))
if (abs(t0 - t0_) < delta and abs(t1 - t1_) < delta):
print('Gradient descent finish')
return t0_, t1_
t0 = t0_
t1 = t1_
print('Gradient descent too many times')
return t0, t1
以下是該演算法的輸出:
Times: 125, gradient: [4.955453758569991, 2.000005017897775]
Times: 126, gradient: [4.955309381126545, 1.9956928964532015]
Times: 127, gradient: [4.9542964317327005, 1.9855674828684156]
Times: 128, gradient: [4.9536358220657, 1.9781180992510465]
Times: 129, gradient: [4.95412496254411, 1.9788858350530971]
Gradient descent finish
從結果可以看出,改進的演算法只用了129次迭代就收斂了。速度比原來660次快了很多。
同樣的,我們可以把演算法計算的過程做成動態圖:
對比原始的演算法過程可以看出,改進演算法最大的區別是:在尋找目標值時會在最終結果上下跳動,但是越往後跳動的幅度越小,這也就是動量所產生的效果。
Learning Rate 優化
至此,你可能還是好奇該如何設定學習率的值。
事實上,這個值的選取需要一定的經驗或者反復嘗試才能確定。
關鍵在於,這個值的選取不能過大也不能過小。
如果這個值過小,會導致每一次迭代的步長很小,其結果就是演算法需要迭代非常多的次數。
那麼,如果這個值過大會怎麼樣呢?其結果就是:演算法可能在結果的周圍來回震盪,卻落不到目標的點上。下面這幅圖描述了這個現象:
事實上,學習率的取值未必一定要是一個常數,關於這個值的設定有很多的研究。
下面是比較常見的一些改進演算法。
AdaGrad
AdaGrad是Adaptive Gradient的簡寫,該演算法會為每個參數設定不同的學習率。它使用歷史梯度的平方和作為基礎來進行計算。
其演算法公式如下:
[ heta_i = heta_i - frac{lambda}{sqrt{G_t + epsilon}} abla f( heta)]
對比式7,這里的改動就在於分號下面的根號。
根號中有兩個符號,第二個符號比較好理解,它就是為了避免除0而人為引入的一個很小的常數,例如可以設為:0.001。
第一個符號的表達式展開如下:
[G_t = sum_{i = 1}^{t} abla f( heta){i} abla f( heta){i}^{T}]
這個值其實是歷史中每次梯度的平方的累加和。
AdaGrad演算法能夠在訓練中自動的對learning rate進行調整,對於出現頻率較低參數採用較大的學習率;相反,對於出現頻率較高的參數採用較小的學習率。因此,Adagrad非常適合處理稀疏數據。
但該演算法的缺點是它可能導致學習率非常小以至於演算法收斂非常的慢。
關於這個演算法的直觀解釋可以看李宏毅教授的視頻課程:ML Lecture 3-1: Gradient Descent。
RMSProp
RMS是Root Mean Square的簡寫。RMSProp是AI教父Geoff Hinton提出的一種自適應學習率方法。AdaGrad會累加之前所有的梯度平方,而RMSProp僅僅是計算對應的平均值,因此可緩解Adagrad演算法學習率下降較快的問題。
該演算法的公式如下:
[E[ abla f( heta_{i})^2]^{t} = gamma E[ abla f( heta_{i})^2]^{t - 1} + (1-gamma)( abla f( heta_{i})^{t})^{2} heta_i = heta_i - frac{lambda}{sqrt{E[g^2]^{t+1} + epsilon}} abla f( heta_{i})]
類似的,是為了避免除0而引入。 是衰退參數,通常設為0.9。
這里的 是t時刻梯度平方的平均值。
Adam
Adam是Adaptive Moment Estimation的簡寫。它利用梯度的一階矩估計和二階矩估計動態調整每個參數的學習率。
Adam的優點主要在於經過偏置校正後,每一次迭代學習率都有個確定范圍,使得參數比較平穩。
該演算法公式如下:
[m^{t} = eta_{1} m^{t-1} + (1-eta_{1}) abla f( heta) v^{t} = eta_{2} v^{t-1} + (1-eta_{2}) abla f( heta)^2 widehat{m}^{t} = frac{m^{t}}{1 - eta^{t}_1} widehat{v}^{t} = frac{v^{t}}{1 - eta^{t}_2} heta = heta - frac{lambda}{sqrt{widehat{v}^{t}} + epsilon}widehat{m}^{t}]
,分別是對梯度的一階矩估計和二階矩估計。, 是對,的校正,這樣可以近似為對期望的無偏估計。
Adam演算法的提出者建議 默認值為0.9,默認值為0.999,默認值為 。
在實際應用中 ,Adam較為常用,它可以比較快地得到一個預估結果。
優化小結
這里我們列舉了幾種優化演算法。它們很難說哪種最好,不同的演算法適合於不同的場景。在實際的工程中,可能需要逐個嘗試一下才能確定選擇哪一個,這個過程也是目前現階段AI項目要經歷的工序之一。
實際上,該方面的研究遠不止於此,如果有興趣,可以繼續閱讀 《Sebastian Ruder: An overview of gradient descent optimization algorithms》 這篇論文或者 Optimization for Deep Learning 這個Slides進行更多的研究。
由於篇幅所限,這里不再繼續展開了。
演算法限制
梯度下降演算法存在一定的限制。首先,它要求函數必須是可微分的,對於不可微的函數,無法使用這種方法。
除此之外,在某些情況下,使用梯度下降演算法在接近極值點的時候可能收斂速度很慢,或者產生Z字形的震盪。這一點需要通過調整學習率來迴避。
另外,梯度下降還會遇到下面兩類問題。
局部最小值
局部最小值(Local Minima)指的是,我們找到的最小值僅僅是一個區域內的最小值,而並非全局的。由於演算法的起點是隨意取的,以下面這個圖形為例,我們很容易落到局部最小值的點裡面。
這就是好像你從上頂往下走,你第一次走到的平台未必是山腳,它有可能只是半山腰的一個平台的而已。
演算法的起點決定了演算法收斂的速度以及是否會落到局部最小值上。
壞消息是,目前似乎沒有特別好的方法來確定選取那個點作為起點是比較好的,這就有一點看運氣的成分了。多次嘗試不同的隨機點或許是一個比較好的方法,這也就是為什麼做演算法的優化這項工作是特別消耗時間的了。
但好消息是:
對於凸函數或者凹函數來說,不存在局部極值的問題。其局部極值一定是全局極值。
最近的一些研究表明,某些局部極值並沒有想像中的那麼糟糕,它們已經非常的接近全局極值所帶來的結果了。
鞍點
除了Local Minima,在梯度下降的過程中,還有可能遇到另外一種情況,即:鞍點(Saddle Point)。鞍點指的是我們找到點某個點確實是梯度為0,但它卻不是函數的極值,它的周圍既有比它小的值,也有比它大的值。這就好像馬鞍一樣。
如下圖所示:
多類隨機函數表現出以下性質:在低維空間中,局部極值很普遍。但在高維空間中,局部極值比較少見,而鞍點則很常見。
不過對於鞍點,可以通過數學方法Hessian矩陣來確定。關於這點,這里就不再展開了,有興趣的讀者可以以這里提供的幾個鏈接繼續探索。
參考資料與推薦讀物
Wikipeida: Gradient descent
Sebastian Ruder: An overview of gradient descent optimization algorithms
吳恩達:機器學習
吳恩達:深度學習
Peter Flach:機器學習
李宏毅 - ML Lecture 3-1: Gradient Descent
PDF: 李宏毅 - Gradient Descent
Intro to optimization in deep learning: Gradient Descent
Intro to optimization in deep learning: Momentum, RMSProp and Adam
Stochastic Gradient Descent – Mini-batch and more
劉建平Pinard - 梯度下降(Gradient Descent)小結
多元函數的偏導數、方向導數、梯度以及微分之間的關系思考
[Machine Learning] 梯度下降法的三種形式BGD、SGD以及MBGD
5. 梯度下降法是什麼
梯度下降是通過迭代搜索一個函數極小值的優化演算法。使用梯度下降,尋找一個函數的局部極小值的過程起始於一個隨機點,並向該函數在當前點梯度(或近似梯度)的反方向移動。梯度下降演算法是一種非常經典的求極小值的演算法。
比如邏輯回歸可以用梯度下降進行優化,因為這兩個演算法的損失函數都是嚴格意義上的凸函數,即存在全局唯一極小值,較小的學習率和足夠的迭代次數,一定可以達到最小值附近,滿足精度要求是完全沒有問題的。並且隨著特徵數目的增多,梯度下降的效率將遠高於去解析標准方程的逆矩陣。
常用的梯度下降法有3種不同的形式:
(1)批量梯度下降法,簡稱BGD,使用所有樣本,比較耗時。
(2)隨機梯度下降法,簡稱SGD,隨機選擇一個樣本,簡單高效。
(3)小批量梯度下降法,簡稱MBGD,使用少量的樣本,這是一個折中的辦法。
機梯度下降法優點:
1、更容易跳出局部最優解。
2、具有更快的運行速度。
6. 常用激活函數比較
本文結構:
如下圖,在神經元中,輸入的 inputs 通過加權,求和後,還被作用了一個函數,這個函數就是激活函數 Activation Function。
如果不用激勵函數,每一層輸出都是上層輸入的線性函數,無論神經網路有多少層,輸出都是輸入的線性組合。
如果使用的話,激活函數給神經元引入了非線性因素,使得神經網路可以任意逼近任何非線性函數,這樣神經網路就可以應用到眾多的非線性模型中。
公式:
曲線:
也叫 Logistic 函數,用於隱層神經元輸出
取值范圍為(0,1)
它可以將一個實數映射到(0,1)的區間,可以用來做二分類。
在特徵相差比較復雜或是相差不是特別大時效果比較好。
sigmoid缺點:
激活函數計算量大,反向傳播求誤差梯度時,求導涉及除法
反向傳播時,很容易就會出現梯度消失的情況,從而無法完成深層網路的訓練
下面解釋為何會出現梯度消失:
反向傳播演算法中,要對激活函數求導,sigmoid 的導數表達式為:
sigmoid 原函數及導數圖形如下:
由圖可知,導數從 0 開始很快就又趨近於 0 了,易造成「梯度消失」現象
公式
曲線
也稱為雙切正切函數
取值范圍為[-1,1]。
tanh在特徵相差明顯時的效果會很好,在循環過程中會不斷擴大特徵效果。
與 sigmoid 的區別是,tanh 是 0 均值的,因此實際應用中 tanh 會比 sigmoid 更好
Rectified Linear Unit(ReLU) - 用於隱層神經元輸出
公式
曲線
輸入信號 <0 時,輸出都是0,>0 的情況下,輸出等於輸入
ReLU 的優點:
Krizhevsky et al. 發現使用 ReLU 得到的 SGD 的收斂速度會比 sigmoid/tanh 快很多
ReLU 的缺點:
訓練的時候很」脆弱」,很容易就」die」了
例如,一個非常大的梯度流過一個 ReLU 神經元,更新過參數之後,這個神經元再也不會對任何數據有激活現象了,那麼這個神經元的梯度就永遠都會是 0.
如果 learning rate 很大,那麼很有可能網路中的 40% 的神經元都」dead」了。
Softmax - 用於多分類神經網路輸出
公式
舉個例子來看公式的意思:
就是如果某一個 zj 大過其他 z, 那這個映射的分量就逼近於 1,其他就逼近於 0,主要應用就是多分類。
為什麼要取指數,第一個原因是要模擬 max 的行為,所以要讓大的更大。
第二個原因是需要一個可導的函數。
Sigmoid 和 ReLU 比較:
sigmoid 的梯度消失問題,ReLU 的導數就不存在這樣的問題,它的導數表達式如下:
曲線如圖
對比sigmoid類函數主要變化是:
1)單側抑制
2)相對寬闊的興奮邊界
3)稀疏激活性。
Sigmoid 和 Softmax 區別:
softmax is a generalization of logistic function that 「squashes」(maps) a K-dimensional vector z of arbitrary real values to a K-dimensional vector σ(z) of real values in the range (0, 1) that add up to 1.
sigmoid將一個real value映射到(0,1)的區間,用來做二分類。
而 softmax 把一個 k 維的real value向量(a1,a2,a3,a4….)映射成一個(b1,b2,b3,b4….)其中 bi 是一個 0~1 的常數,輸出神經元之和為 1.0,所以相當於概率值,然後可以根據 bi 的概率大小來進行多分類的任務。
二分類問題時 sigmoid 和 softmax 是一樣的,求的都是 cross entropy loss,而 softmax 可以用於多分類問題
softmax是sigmoid的擴展,因為,當類別數 k=2 時,softmax 回歸退化為 logistic 回歸。具體地說,當 k=2 時,softmax 回歸的假設函數為:
利用softmax回歸參數冗餘的特點,從兩個參數向量中都減去向量θ1 ,得到:
最後,用 θ′ 來表示 θ2−θ1,上述公式可以表示為 softmax 回歸器預測其中一個類別的概率為
另一個類別概率的為
這與 logistic回歸是一致的。
softmax建模使用的分布是多項式分布,而logistic則基於伯努利分布
多個logistic回歸通過疊加也同樣可以實現多分類的效果,但是 softmax回歸進行的多分類,類與類之間是互斥的,即一個輸入只能被歸為一類;多個logistic回歸進行多分類,輸出的類別並不是互斥的,即"蘋果"這個詞語既屬於"水果"類也屬於"3C"類別。
選擇的時候,就是根據各個函數的優缺點來配置,例如:
如果使用 ReLU,要小心設置 learning rate,注意不要讓網路出現很多 「dead」 神經元,如果不好解決,可以試試 Leaky ReLU、PReLU 或者 Maxout.
參考資料:
http://feisky.xyz/machine-learning/neural-networks/active.html
http://jishu.y5y.com.cn/qq_17754181/article/details/56495406
https://www.hu.com/question/29021768
http://blog.csdn.net/cyh_24/article/details/50593400
http://www.itda.com/articles/c15a1000722p0.html
https://www.hu.com/question/23765351
推薦閱讀 歷史技術博文鏈接匯總
也許可以找到你想要的
我是 不會停的蝸牛 Alice
85後全職主婦
喜歡人工智慧,行動派
創造力,思考力,學習力提升修煉進行中
歡迎您的喜歡,關注和評論!
7. 100維度用什麼優化演算法
神經網路中常用的優化演算法。
優化演算法的目的:
1. 跳出局部極值點或鞍點,尋找全局最小值;
2.使訓練過程更加穩定,更加容易收斂。
優化演算法:深度學習優化學習方法(一階、二階)
一階方法:隨機梯度下降(SGD)、動量(Momentum)、牛頓動量法(Nesterov動量)、AdaGrad(自適應梯度)、RMSProp(均方差傳播)、Adam、Nadam。
二階方法:牛頓法、擬牛頓法、共軛梯度法(CG)、BFGS、L-BFGS。
自適應優化演算法有哪些?(Adagrad(累積梯度平方)、RMSProp(累積梯度平方的滑動平均)、Adam(帶動量的RMSProp,即同時使用梯度的一、二階矩))。
梯度下降陷入局部最優有什麼解決辦法?可以用BGD、SGD、MBGD、momentum,RMSprop,Adam等方法來避免陷入局部最優。
8. 梯度下降法是什麼
梯度下降法,是一種基於搜索的最優化方法,它其實不是一個機器學習演算法,但是在機器學習領域,許多演算法都是以梯度下降法為基礎的,它的主要作用是尋找目標函數的最優解。
在求解損失函數的最小值時,可以通過梯度下降法來一步步的迭代求解,得到最小化的損失函數和模型參數值。反過來,如果我們需要求解損失函數的最大值,這時就需要用梯度上升法來迭代了。在機器學習中,基於基本的梯度下降法發展了兩種梯度下降方法,分別為隨機梯度下降法和批量梯度下降法。
常用的梯度下降法有3種不同的形式:
(1)批量梯度下降法,簡稱 BGD,使用所有樣本,比較耗時;
(2)隨機梯度下降法,簡稱 SGD,隨機選擇一個樣本,簡單高效;
(3)小批量梯度下降法,簡稱 MBGD,使用少量的樣本,這是一個折中的辦法。
9. e的x減一次方的導數
e的x減一次方的導數是e^(x-1)。
具體解法如下:
e的x減一次方,即為e^(x-1)
e的x減一次方的導數,即為e^(x-1)的導數
e^(x-1)'=e^(x-1)*(1)=e^(x-1)
所以e的x減一次方的導數是e^(x-1)。
(9)sgd演算法擴展閱讀
導數的求解注意點:
1、理解並牢記導數定義。導數定義中一定要出現這一點的函數值,如果已知告訴等於零,那極限表達式中就可以不出現,否就不能推出在這一點可導。
2、導數定義相關計算。這里有幾種題型:1)已知某點處導數存在,計算極限,這需要掌握導數的廣義化形式,還要注意是在這一點處導數存在的前提下,否則是不一定成立的。
3、導數、可微與連續的關系。函數在一點處可導與可微是等價的,可以推出在這一點處是連續的,反過來則是不成立的。
4、導數的計算。導數的計算可以說在每一年的考研數學中都會涉及到,而且形式不一,考查的方法也不同。
5、高階導數計算。需要同學們記住幾個常見的高階導數公式,將其他函數都轉化成我們這幾種常見的函數,代入公式就可以了,也有通過求一階導數,二階,三階的方法來找出他們之間關系的。
10. 有目標函數,怎麼用sgd演算法優化
<pre t="code" l="java">function main()
clc;clear all;close all;
tic; %程序運行計時
E0=0.001; %允許誤差
MaxNum=100; %粒子最大迭代次數
narvs=1; %目標函數的自變數個數
particlesize=30; %粒子群規模
c1=2; %每個粒子的個體學習因子,也稱為加速常數
c2=2; %每個粒子的社會學習因子,也稱為加速常數
w=0.6; %慣性因子
vmax=0.8; %粒子的最大飛翔速度
x=-5+10*rand(particlesize,narvs); %粒子所在的位置
v=2*rand(particlesize,narvs); %粒子的飛翔速度
%用inline定義適應度函數以便將子函數文件與主程序文件放在一起,
%目標函數是:y=1+(2.1*(1-x+2*x.^2).*exp(-x.^2/2))
%inline命令定義適應度函數如下:
fitness=inline('1/(1+(2.1*(1-x+2*x.^2).*exp(-x.^2/2)))','x');
%inline定義的適應度函數會使程序運行速度大大降低
for i=1:particlesize
for j=1:narvs
f(i)=fitness(x(i,j));
end
end
personalbest_x=x;
personalbest_faval=f;
[globalbest_faval i]=min(personalbest_faval);
globalbest_x=personalbest_x(i,:);
k=1;
while k<=MaxNum
for i=1:particlesize
for j=1:narvs
f(i)=fitness(x(i,j));
end
if f(i)<personalbest_faval(i) %判斷當前位置是否是歷史上最佳位置
personalbest_faval(i)=f(i);
personalbest_x(i,:)=x(i,:);
end
end
[globalbest_faval i]=min(personalbest_faval);
globalbest_x=personalbest_x(i,:);
for i=1:particlesize %更新粒子群里每個個體的最新位置
v(i,:)=w*v(i,:)+c1*rand*(personalbest_x(i,:)-x(i,:))
+c2*rand*(globalbest_x-x(i,:));
for j=1:narvs %判斷粒子的飛翔速度是否超過了最大飛翔速度
if v(i,j)>vmax;
v(i,j)=vmax;
elseif v(i,j)<-vmax;
v(i,j)=-vmax;
end
end
x(i,:)=x(i,:)+v(i,:);
end
if abs(globalbest_faval)<E0,break,end
k=k+1;
end
Value1=1/globalbest_faval-1; Value1=num2str(Value1);
% strcat指令可以實現字元的組合輸出
disp(strcat('the maximum value','=',Value1));
%輸出最大值所在的橫坐標位置
Value2=globalbest_x; Value2=num2str(Value2);
disp(strcat('the corresponding coordinate','=',Value2));
x=-5:0.01:5;
y=2.1*(1-x+2*x.^2).*exp(-x.^2/2);
plot(x,y,'m-','linewidth',3);
hold on;
plot(globalbest_x,1/globalbest_faval-1,'kp','linewidth',4);
legend('目標函數','搜索到的最大值');xlabel('x');ylabel('y');grid on;toc;