本文目錄一覽:
- 1、如何用梯度下降法求函數y = c+((1-c)/(1+exp(-1.7*a*(x-b))))中的參數a,b,c,已知x和y?
- 2、轉行深度學習,如何解決自己在學習中遇到的瓶頸問題?
- 3、怎麼用C++編寫梯度下降法?
如何用梯度下降法求函數y = c+((1-c)/(1+exp(-1.7*a*(x-b))))中的參數a,b,c,已知x和y?
給的條件有點少,我多點假設。
已知X,Y,我認為是已知給定X輸入和對應期望的Y輸出。
對於優化目標函數,也就是最後的訓練誤差函數,視為最簡單的實際輸出Y’和期望輸出Y的均方差。
已知學習率n(可以自行設置)。
假設輸出層激活函數為線性。
1.設置初始的a,b,c(任取)
2.計算實際的Y’輸出
3.根據期望Y和實際Y’,得到對應的均方差J
4.使用誤差函數J對a,b,c分別求偏導(鏈式法則),並代值計算出數字
5.對初始的a,b,c減去(學習率*對應的偏導),得到新的a,b,c
6.重複第二步,迭代一定的輪數或誤差小於一個期望值。
7.輸出a,b,c.
轉行深度學習,如何解決自己在學習中遇到的瓶頸問題?
大數據和高性能的計算能力,讓深度學習技術開始超越人類。隨著深度學習技術在應用上已經取得的快速發展,有人開始認為,科技既然能夠通過互聯網,讓全世界實現信息共享,那麼,隨著以深度學習為代表的人工智慧技術的發展,有理由相信,未來將會有比人的智力更高的新物種被創造出來。
不過,在眾人普遍看好深度學習技術的發展前景時,也有業內專業人士指出,深度技術在發展方面還存在著不少問題。這些問題主要體現在以下幾個方面。
(1)理論問題。
深度學習的理論問題主要體現在統計學和計算兩個方面。對於任意一個非線性函數,都能找到一個淺層網路和深度網路來表示。深度模型比淺層模型對非線性函數具有更好的表現能力。但深度網路的可表示性並不代表可學習性。要了解深度學習樣本的複雜度,要了解需要多少訓練樣本才能學習到足夠好的深度模型,就必須知道,通過訓練得到更好的模型需要多少計算資源,理想的計算優化是什麼。由於深度模型都是非凸函數,也就讓深度學習在這方面的理論研究變得非常困難。
(2)建模問題。
工業界曾經有一種觀點:「在大數據條件下,簡單的機器學習模型會比複雜模型更有效。」在實際的大數據應用中,很多最簡單的模型得到大量使用的情形也在一定程度上印證著這種觀點。
但是,隨著深度學習的快速發展,人們不得不重新思考這種觀點。因為在大數據情形下,往往只有比較複雜或表達能力強的模型,才能充分挖掘海量數據中的信息。隨著深度模型變得更強大,從大數據中發掘出的信息往往更有價值。大數據需要深度模型。比如說,語音識別所涉及的是大數據機器學習問題。其聲學建模所面臨的是高達十億到千億級別的樣本訓練。Google公司在一個語音識別實驗中發現,訓練後的DNN,訓練樣本上的預測誤差,竟然與測試樣本的預測誤差基本相當。而在通常模型上,訓練樣本上的預測誤差要明顯小於測試樣本。這是因為大數據里含有豐富的信息維度,從而讓DNN這樣高容量的複雜模型處於欠擬合狀態。由此也就表明大數據需要深度學習。淺層模型模擬人工經驗抽取樣本特徵,其功能主要是負責分類或預測。在這種情形下,特徵的好壞就成為整個系統性能的關鍵。為此,為了發掘更好的特徵,開發人員就得對需要解決的問題有深入的理解。要做到這一點,就需要反覆摸索,這在時間上往往要花費數年。這就表明,人工設計樣本特徵在可擴展性上欠佳。
深度學習的實質是學習更有用的特徵,最終提升分類或預測的準確性。其方法是構建深度模型和海量訓練數據。可以說,特徵學習是目的,深度模型是手段。相對淺層學習來說,深度學習具有多達5層、6層,甚至是10多層的隱層節點,還突出了特徵學習的重要性。深度學習通過逐層特徵變換,讓分類或預測變得更容易。
利用大數據來學習特徵,比通過人工規則來構造規則更能刻畫數據的內在信息。那麼,在推進深度學習的學習理論與計算理論時,能不能提出新的具有強大表示能力的分層模型呢?在具體應用上,又該怎樣設計一個用來解決問題的最合適的深度模型呢?還有,是否存在可能建立一個通用的深度模型或者是建模語言呢?這些都是深度學習必須面對的問題。
(3)工程問題。
對於從事深度學習技術研發的人來說,首先要解決的是利用並行計算平台來實現海量數據訓練的問題。深度學習需要頻繁迭代,傳統的大數據平台無法適應這一點。隨著互聯網服務的深入,海量數據訓練的重要性日益凸顯。而現有的DNN訓練技術通常所採用的隨機梯度法,不能在多個計算機之間並行。採用CPU進行傳統的DNN模型訓練,訓練時間非常漫長,一般訓練聲學模型就需要幾個月的時間。這樣緩慢的訓練速度明顯不能滿足互聯網服務應用的需要。目前,提升模型訓練速度,成為許多大公司研發者的主攻方向。比如谷歌公司,搭建起了DistBelief這個深度學習並行計算平台。通過採用非同步演算法,實現隨機梯度下降演算法的並行化,從而加快模型訓練速度。不過,工程方面儘管取得了一定的進展,但對解決各種服務需求來說,仍然有很長的一段路要走。
深度學習引領著「大數據+深度模型」時代的到來。尤其是在推動人工智慧和人機交互方面取得了長足的進步。同時也應該看到,深度學習在理論、建模和工程方面仍面臨著一系列的難題。而在具體應用方面,深度學習也面臨著一些挑戰。
人工智慧神經網路建設從最初的設想到成為信息技術中的應用,花了超過50年的時間。在克服傳統計算機性能不足方面,神經網路演算法較其他演算法更具有先進性。在早期的實驗中,網路訓練方法是:「迭代地調整每個神經元施加到其輸入的數據,來盡量減少整個網路的輸出與所希望的結果之間的誤差。」這樣的訓練雖然較過去有所改善,但讓深度學習在規模上面臨著一個挑站。
2006年,多倫多大學開發的訓練技術能用於包含多個隱藏層的網路,其中的一種技術叫作「預訓練」。這種方法能讓上層提取高級特徵,但無法解決規模問題。處在較高層的神經元,需要巨大的計算能力。如用於圖像處理應用程序的第一層所需要分析的像素就多達一百萬個。深度網路的多個層連接的數量非常巨大,每個圖像的連接就達幾十億甚至上千億。訓練這樣的大型網路,需要數千億的浮點運算。這樣的巨大規模,讓神經網路的訓練變得非常緩慢
怎麼用C++編寫梯度下降法?
#includeiostream
#includecmath
#includectime
using namespace std;
double f(double x);
double g(double x);
double gd(double xs,double s)
{
double x=xs;
double y;
for(int i=0;i!=20;++i)
{
double grad= -1*g(x);
x+=grad*s;
y=f(x);
cout “EPOCH “i” grad = ” setprecision(15) grad ” x = ” x ” y = ” y endl;
if(abs(grad) 1e-6)
break;
}
return x;
}
int main()
{
double xk=-5,ak=0.1;
gd(xk,ak);
}
double f(double x)
{
return x*x-2*x+1;
}
double g(double x)
{
return 2*x-2;
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/153596.html