Spark Mlib-BP
Q:什么是人工神經(jīng)網(wǎng)絡(luò)?
A:人工神經(jīng)網(wǎng)絡(luò)是科學(xué)及模擬人類大腦的神經(jīng)神經(jīng)網(wǎng)絡(luò)建立的數(shù)學(xué)模型物臂。人工神經(jīng)網(wǎng)絡(luò)由一個(gè)個(gè)“人工神經(jīng)元”組合而成∶遗“人工神經(jīng)元”也是一個(gè)數(shù)學(xué)模型扭仁,其本質(zhì)是一個(gè)函數(shù)。所以人工神經(jīng)網(wǎng)絡(luò)的本質(zhì)也是一個(gè)函數(shù)展蒂,而且是一個(gè)復(fù)雜的又活,包含很多變量和參數(shù)的函數(shù)。
- {failImgCache = [];}if(failImgCache.indexOf(src) == -1 && src.trim().length){failImgCache.push(src);}$(this).closest('.md-image').addClass('md-img-error').removeClass('md-img-loaded'); " onload="var src = window.removeLastModifyQuery(this.getAttribute('src'));if(!src.trim()) return;if(loadedImgCache.indexOf(src) == -1 && src.trim().length){loadedImgCache.push(src);}$(this).closest('.md-image').addClass('md-img-loaded').removeClass('md-img-error');" style="box-sizing: border-box; border-width: 0px 4px 0px 2px; border-right-style: solid; border-left-style: solid; border-right-color: transparent; border-left-color: transparent; vertical-align: middle; max-width: 100%; cursor: default;">
Q:什么是人工神經(jīng)元锰悼?
A:人工神經(jīng)元是人工神經(jīng)網(wǎng)絡(luò)的基本單元柳骄,其本質(zhì)也是一個(gè)函數(shù)。類似人類大腦的神經(jīng)元箕般,人工神經(jīng)元模型也有樹(shù)突耐薯、軸突、神經(jīng)元中心等結(jié)構(gòu)丝里。最經(jīng)典的神經(jīng)元模型是“M-P神經(jīng)元模型”曲初。 - {failImgCache = [];}if(failImgCache.indexOf(src) == -1 && src.trim().length){failImgCache.push(src);}$(this).closest('.md-image').addClass('md-img-error').removeClass('md-img-loaded'); " onload="var src = window.removeLastModifyQuery(this.getAttribute('src'));if(!src.trim()) return;if(loadedImgCache.indexOf(src) == -1 && src.trim().length){loadedImgCache.push(src);}$(this).closest('.md-image').addClass('md-img-loaded').removeClass('md-img-error');" style="box-sizing: border-box; border-width: 0px 4px 0px 2px; border-right-style: solid; border-left-style: solid; border-right-color: transparent; border-left-color: transparent; vertical-align: middle; max-width: 100%; cursor: default;">
一個(gè)神經(jīng)元接收來(lái)自其他神經(jīng)元傳來(lái)的信號(hào)(變量),通過(guò)樹(shù)突傳輸(參數(shù))到神經(jīng)元中心(參數(shù))杯聚,經(jīng)過(guò)轉(zhuǎn)換后(映射f)臼婆,通過(guò)突觸傳遞出去(函數(shù)值)。上圖中紅色的函數(shù)表達(dá)式就是一個(gè)人工神經(jīng)元的數(shù)學(xué)表達(dá)幌绍。
由上述神經(jīng)元工作過(guò)程可知目锭,一個(gè)神經(jīng)元的可以接受多個(gè)變量评汰,輸出一個(gè)結(jié)果。一個(gè)神經(jīng)元的輸出也可能是另一個(gè)神經(jīng)元的輸入痢虹。所以一個(gè)由多個(gè)神經(jīng)元組成的神經(jīng)網(wǎng)絡(luò)被去,本質(zhì)上就是一個(gè)復(fù)雜的、多層嵌套的符合函數(shù)奖唯。
Q:神經(jīng)元有哪些分類惨缆?
A:按照神經(jīng)元的層數(shù)來(lái)分,可以分為只有輸入丰捷、輸出層的單層網(wǎng)絡(luò)(不計(jì)算輸入層)坯墨,代表是感知機(jī);以及包含隱含層的多層網(wǎng)絡(luò)病往。
按照網(wǎng)絡(luò)結(jié)構(gòu)來(lái)分捣染,可以分為徑向基函數(shù)網(wǎng)絡(luò)(RBF)、競(jìng)爭(zhēng)學(xué)習(xí)網(wǎng)絡(luò)(ART)停巷、自組織映射網(wǎng)絡(luò)(SOM)耍攘、級(jí)聯(lián)相關(guān)網(wǎng)絡(luò)、遞歸神經(jīng)網(wǎng)絡(luò)(RNN)畔勤、Boltzman機(jī)等各種各樣紛繁復(fù)雜的種類蕾各。
Q:感知機(jī)有什么作用?怎么訓(xùn)練一個(gè)感知機(jī)庆揪?
A:感知機(jī)是最簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò)式曲,只有輸入和輸出層。一般來(lái)說(shuō)缸榛,感知機(jī)用來(lái)進(jìn)行二分類任務(wù)吝羞,或者實(shí)現(xiàn)邏輯“與”、“或”内颗、“非”的操作钧排。 - {failImgCache = [];}if(failImgCache.indexOf(src) == -1 && src.trim().length){failImgCache.push(src);}$(this).closest('.md-image').addClass('md-img-error').removeClass('md-img-loaded'); " onload="var src = window.removeLastModifyQuery(this.getAttribute('src'));if(!src.trim()) return;if(loadedImgCache.indexOf(src) == -1 && src.trim().length){loadedImgCache.push(src);}$(this).closest('.md-image').addClass('md-img-loaded').removeClass('md-img-error');" style="box-sizing: border-box; border-width: 0px 4px 0px 2px; border-right-style: solid; border-left-style: solid; border-right-color: transparent; border-left-color: transparent; vertical-align: middle; max-width: 100%; cursor: default;">
感知機(jī)模型 f(x)=sign(w?x+b) 的輸出一般是二值的,即1或-1起暮。當(dāng)自變量小于0時(shí)輸出-1卖氨,否則輸出1。感知機(jī)的學(xué)習(xí)的學(xué)習(xí)規(guī)則很簡(jiǎn)單负懦,也是類似與線性回歸一樣筒捺,使用梯度下降的思想,每讀取一個(gè)樣本纸厉,計(jì)算一次預(yù)測(cè)值系吭,就調(diào)整一次參數(shù)(權(quán)值)。 - {failImgCache = [];}if(failImgCache.indexOf(src) == -1 && src.trim().length){failImgCache.push(src);}$(this).closest('.md-image').addClass('md-img-error').removeClass('md-img-loaded'); " onload="var src = window.removeLastModifyQuery(this.getAttribute('src'));if(!src.trim()) return;if(loadedImgCache.indexOf(src) == -1 && src.trim().length){loadedImgCache.push(src);}$(this).closest('.md-image').addClass('md-img-loaded').removeClass('md-img-error');" style="box-sizing: border-box; border-width: 0px 4px 0px 2px; border-right-style: solid; border-left-style: solid; border-right-color: transparent; border-left-color: transparent; vertical-align: middle; max-width: 100%; cursor: default;">
x_i表示第i個(gè)輸入颗品,w_i表示第i個(gè)輸入對(duì)應(yīng)的參數(shù)(權(quán)值)肯尺。
Q:多層網(wǎng)絡(luò)其訓(xùn)練過(guò)程是怎樣的沃缘?
A:多層神經(jīng)網(wǎng)絡(luò)由于神經(jīng)元層數(shù)比單層多,所欲參數(shù)更多则吟,也意味著學(xué)習(xí)能力更強(qiáng)槐臀,所以能夠勝任圖像處理、語(yǔ)音識(shí)別等任務(wù)氓仲。
最經(jīng)典的多層網(wǎng)絡(luò)徐連算法是“誤差逆?zhèn)鞑ニ惴ǎ˙P)”水慨。其基本思想也是通過(guò)構(gòu)建關(guān)于參數(shù)的損失函數(shù)來(lái)衡量神經(jīng)網(wǎng)絡(luò)的誤差,然后通過(guò)梯度下降等方法令損失函數(shù)取最小值敬扛,求得參數(shù)的取值晰洒。
多層神經(jīng)網(wǎng)絡(luò)的參數(shù)也是按層劃分的,所以參數(shù)的求解也要一層一層地進(jìn)行啥箭。首先求出輸出層的各個(gè)參數(shù)谍珊。然后通過(guò)輸出層的參數(shù)求接觸倒數(shù)第二層的參數(shù),再通過(guò)過(guò)倒數(shù)第二層的參數(shù)求解出倒數(shù)第三層的參數(shù)急侥,以此類推砌滞,求解出所有層的參數(shù)。
由于參數(shù)是從輸出層往后求解的缆巧,并且是通過(guò)損失函數(shù)計(jì)算出來(lái)的布持,因此成為誤差逆?zhèn)鞑ニ惴ㄍ阕尽R蚱渫茖?dǎo)過(guò)程無(wú)比繁瑣陕悬,在此不做贅述“锤担可以參考以下博文:http://www.cnblogs.com/wentingtu/archive/2012/06/05/2536425.html
應(yīng)用
import org.apache.spark.ml.classification.MultilayerPerceptronClassifierimport org.apache.spark.ml.evaluation.MulticlassClassificationEvaluator?// Load the data stored in LIBSVM format as a DataFrame.val data = spark.read.format("libsvm") .load("data/mllib/sample_multiclass_classification_data.txt")?// Split the data into train and testval splits = data.randomSplit(Array(0.6, 0.4), seed = 1234L)val train = splits(0)val test = splits(1)?// specify layers for the neural network:// input layer of size 4 (features), two intermediate of size 5 and 4// and output of size 3 (classes)val layers = Array[Int](4, 5, 4, 3)?// create the trainer and set its parametersval trainer = new MultilayerPerceptronClassifier() .setLayers(layers) .setBlockSize(128) .setSeed(1234L) .setMaxIter(100)?// train the modelval model = trainer.fit(train)?// compute accuracy on the test setval result = model.transform(test)val predictionAndLabels = result.select("prediction", "label")val evaluator = new MulticlassClassificationEvaluator() .setMetricName("accuracy")?println("Test set accuracy = " + evaluator.evaluate(predictionAndLabels))