毫無(wú)疑問(wèn),神經(jīng)網(wǎng)絡(luò)和機(jī)器學(xué)習(xí)在過(guò)去幾年一直是高科技領(lǐng)域最熱門(mén)的話題之一。這一點(diǎn)很容易看出,因?yàn)樗鼈兘鉀Q了很多真正有趣的用例,如語(yǔ)音識(shí)別、圖像識(shí)別、甚至是樂(lè)曲譜寫(xiě)。
PyBrain的概念是將一系列的數(shù)據(jù)處理的算法封裝到被稱(chēng)之為Module的模塊中。一個(gè)最小的Module通常包含基于機(jī)器學(xué)習(xí)算法的可調(diào)整的參數(shù)集合。Modules包含一個(gè)輸入和輸出的buffer,外加誤差buffer用于存在誤差反向傳播的場(chǎng)景。
Modules被嵌入到Network類(lèi)中,并且使用Connection對(duì)象進(jìn)行連接,其中可能包含一系列可調(diào)整的參數(shù),比如連接的權(quán)重。而Network類(lèi)本身又是一個(gè)Module,因此可以基于此構(gòu)建多層網(wǎng)絡(luò)結(jié)構(gòu)。庫(kù)中有快捷的方式構(gòu)造最常用網(wǎng)絡(luò)結(jié)構(gòu),但原則上這個(gè)系統(tǒng)允許嵌入最隨機(jī)的連接方式來(lái)形成一個(gè)無(wú)循環(huán)圖。
網(wǎng)絡(luò)中的參數(shù)通過(guò)Trainer進(jìn)行調(diào)節(jié),它從Dataset中學(xué)習(xí)到最優(yōu)化的參數(shù)。還有的增強(qiáng)方式的實(shí)驗(yàn)是通過(guò)相關(guān)的最優(yōu)化的目標(biāo)構(gòu)造模擬環(huán)境進(jìn)行參數(shù)學(xué)習(xí)。

Python是最好的編程語(yǔ)言之一,在科學(xué)計(jì)算中用途廣泛:計(jì)算機(jī)視覺(jué)、人工智能、數(shù)學(xué)、天文等。它同樣適用于機(jī)器學(xué)習(xí)也是意料之中的事。
當(dāng)然,它也有些缺點(diǎn);其中一個(gè)是工具和庫(kù)過(guò)于分散。如果你是擁有unix思維(unix-minded)的人,你會(huì)覺(jué)得每個(gè)工具只做一件事并且把它做好是非常方便的。但是你也需要知道不同庫(kù)和工具的優(yōu)缺點(diǎn),這樣在構(gòu)建系統(tǒng)時(shí)才能做出合理的決策。工具本身不能改善系統(tǒng)或產(chǎn)品,但是使用正確的工具,我們可以工作得更高效,生產(chǎn)率更高。因此了解正確的工具,對(duì)你的工作領(lǐng)域是非常重要的。
在我看來(lái),Python是學(xué)習(xí)(和實(shí)現(xiàn))機(jī)器學(xué)習(xí)技術(shù)最好的語(yǔ)言之一,其原因主要有以下幾點(diǎn):
語(yǔ)言簡(jiǎn)單:如今,Python成為新手程序員首選語(yǔ)言的主要原因是它擁有簡(jiǎn)單的語(yǔ)法和龐大的社區(qū)。
功能強(qiáng)大:語(yǔ)法簡(jiǎn)單并不意味著它功能薄弱。Python同樣也是數(shù)據(jù)科學(xué)家和Web程序員最受歡迎的語(yǔ)言之一。Python社區(qū)所創(chuàng)建的庫(kù)可以讓你做任何你想做的事,包括機(jī)器學(xué)習(xí)。
豐富的ML庫(kù):目前有大量面向Python的機(jī)器學(xué)習(xí)庫(kù)。你可以根據(jù)你的使用情況、技術(shù)和需求從數(shù)百個(gè)庫(kù)中選擇最合適的一個(gè)。
上面最后一點(diǎn)可以說(shuō)是最重要的。驅(qū)動(dòng)機(jī)器學(xué)習(xí)的算法相當(dāng)復(fù)雜,包括了很多的數(shù)學(xué)知識(shí),所以自己動(dòng)手去實(shí)現(xiàn)它們(并保證其正常運(yùn)行)將會(huì)是一件很困難的任務(wù)。幸運(yùn)地是,有很多聰明的、有奉獻(xiàn)精神的人為我們做了這個(gè)困難的工作,因此我們只需要專(zhuān)注于手邊的應(yīng)用程序即可。
最受歡迎的庫(kù)
我已經(jīng)對(duì)一些比較流行的庫(kù)和它們擅長(zhǎng)的方向做了一個(gè)簡(jiǎn)短的描述,在下一節(jié),我會(huì)給出一個(gè)更完整的項(xiàng)目列表。
Tensorflow
這是清單中最新的神經(jīng)網(wǎng)絡(luò)庫(kù)。在前幾天剛剛發(fā)行,Tensorflow是高級(jí)神經(jīng)網(wǎng)絡(luò)庫(kù),可以幫助你設(shè)計(jì)你的網(wǎng)絡(luò)架構(gòu),避免出現(xiàn)低水平的細(xì)節(jié)錯(cuò)誤。重點(diǎn)是允許你將計(jì)算表示成數(shù)據(jù)流圖,它更適合于解決復(fù)雜問(wèn)題。
此庫(kù)主要使用C++編寫(xiě),包括Python綁定,所以你不必?fù)?dān)心其性能問(wèn)題。我最喜歡的一個(gè)特點(diǎn)是它靈活的體系結(jié)構(gòu),允許你使用相同的API將其部署到一個(gè)或多個(gè)CPU或GPU的臺(tái)式機(jī)、服務(wù)器或者移動(dòng)設(shè)備。有此功能的庫(kù)并不多,如果要說(shuō)有,Tensorflow就是其一。
它是為谷歌大腦項(xiàng)目開(kāi)發(fā)的,目前已被數(shù)百名工程師使用,所以無(wú)須懷疑它是否能夠創(chuàng)造有趣的解決方案。
盡管和其它的庫(kù)一樣,你可能必須花一些時(shí)間來(lái)學(xué)習(xí)它的API,但花掉的時(shí)間應(yīng)該是很值得的。我只花了幾分鐘了解了一下它的核心功能,就已經(jīng)知道Tensorflow值得我花更多的時(shí)間讓我來(lái)實(shí)現(xiàn)我的網(wǎng)絡(luò)設(shè)計(jì),而不僅僅是通過(guò)API來(lái)使用。
擅長(zhǎng):神經(jīng)網(wǎng)絡(luò)
scikit-learn
scikit-learn絕對(duì)是其中一個(gè),如果不是最流行的,那么也算得上是所有語(yǔ)言中流行的機(jī)器學(xué)習(xí)庫(kù)之一。它擁有大量的數(shù)據(jù)挖掘和數(shù)據(jù)分析功能,使其成為研究人員和開(kāi)發(fā)者的首選庫(kù)。
其內(nèi)置了流行的NumPy、SciPy,matplotlib庫(kù),因此對(duì)許多已經(jīng)使用這些庫(kù)的人來(lái)說(shuō)就有一種熟悉的感覺(jué)。盡管與下面列出的其他庫(kù)相比,這個(gè)庫(kù)顯得水平層次略低,并傾向于作為許多其他機(jī)器學(xué)習(xí)實(shí)現(xiàn)的基礎(chǔ)。
scikit-learn是我們?cè)贑B Insights選用的機(jī)器學(xué)習(xí)工具。我們用它進(jìn)行分類(lèi)、特征選擇、特征提取和聚集。我們最?lèi)?ài)的一點(diǎn)是它擁有易用的一致性API,并提供了很多開(kāi)箱可用的求值、診斷和交叉驗(yàn)證方法(是不是聽(tīng)起來(lái)很熟悉?Python也提供了“電池已備(譯注:指開(kāi)箱可用)”的方法)。錦上添花的是它底層使用Scipy數(shù)據(jù)結(jié)構(gòu),與Python中其余使用Scipy、Numpy、Pandas和Matplotlib進(jìn)行科學(xué)計(jì)算的部分適應(yīng)地很好。因此,如果你想可視化分類(lèi)器的性能(比如,使用精確率與反饋率(precision-recall)圖表,或者接收者操作特征(Receiver Operating Characteristics,ROC)曲線),Matplotlib可以幫助進(jìn)行快速可視化??紤]到花在清理和構(gòu)造數(shù)據(jù)的時(shí)間,使用這個(gè)庫(kù)會(huì)非常方便,因?yàn)樗梢跃o密集成到其他科學(xué)計(jì)算包上。
另外,它還包含有限的自然語(yǔ)言處理特征提取能力,以及詞袋(bag of words)、tfidf(Term Frequency Inverse Document Frequency算法)、預(yù)處理(停用詞/stop-words,自定義預(yù)處理,分析器)。此外,如果你想快速對(duì)小數(shù)據(jù)集(toy dataset)進(jìn)行不同基準(zhǔn)測(cè)試的話,它自帶的數(shù)據(jù)集模塊提供了常見(jiàn)和有用的數(shù)據(jù)集。你還可以根據(jù)這些數(shù)據(jù)集創(chuàng)建自己的小數(shù)據(jù)集,這樣在將模型應(yīng)用到真實(shí)世界中之前,你可以按照自己的目的來(lái)檢驗(yàn)?zāi)P褪欠穹掀谕?duì)參數(shù)最優(yōu)化和參數(shù)調(diào)整,它也提供了網(wǎng)格搜索和隨機(jī)搜索。如果沒(méi)有強(qiáng)大的社區(qū)支持,或者維護(hù)得不好,這些特性都不可能實(shí)現(xiàn)。我們期盼它的第一個(gè)穩(wěn)定發(fā)布版。
擅長(zhǎng):非常多
Theano
Theano是一個(gè)機(jī)器學(xué)習(xí)庫(kù),允許你定義、優(yōu)化和評(píng)估涉及多維數(shù)組的數(shù)學(xué)表達(dá)式,這可能是其它庫(kù)開(kāi)發(fā)商的一個(gè)挫折點(diǎn)。與scikit-learn一樣,Theano也很好地整合了NumPy庫(kù)。GPU的透明使用使得Theano可以快速并且無(wú)錯(cuò)地設(shè)置,這對(duì)于那些初學(xué)者來(lái)說(shuō)非常重要。然而有些人更多的是把它描述成一個(gè)研究工具,而不是當(dāng)作產(chǎn)品來(lái)使用,因此要按需使用。
Theano最好的功能之一是擁有優(yōu)秀的參考文檔和大量的教程。事實(shí)上,多虧了此庫(kù)的流行程度,使你在尋找資源的時(shí)候不會(huì)遇到太多的麻煩,比如如何得到你的模型以及運(yùn)行等。
擅長(zhǎng):神經(jīng)網(wǎng)絡(luò)和深度學(xué)習(xí)
Pylearn2
大多數(shù)Pylearn2的功能實(shí)際上都是建立在Theano之上,所以它有一個(gè)非常堅(jiān)實(shí)的基礎(chǔ)。
據(jù)Pylearn2網(wǎng)址介紹:
Pylearn2不同于scikit-learn,Pylearn2旨在提供極大的靈活性,使研究者幾乎可以做任何想做的事情,而scikit-learn的目的是作為一個(gè)“黑盒”來(lái)工作,即使用戶不了解實(shí)現(xiàn)也能產(chǎn)生很好的結(jié)果。
記住,Pylearn2在合適的時(shí)候會(huì)封裝其它的庫(kù),如scikit-learn,所以在這里你不會(huì)得到100%用戶編寫(xiě)的代碼。然而,這確實(shí)很好,因?yàn)榇蠖鄶?shù)錯(cuò)誤已經(jīng)被解決了。像Pylearn2這樣的封裝庫(kù)在此列表中有很重要的地位。
擅長(zhǎng):神經(jīng)網(wǎng)絡(luò)
Pyevolve
神經(jīng)網(wǎng)絡(luò)研究更讓人興奮和不同的領(lǐng)域之一是遺傳算法。從根本上說(shuō),遺傳算法只是一個(gè)模擬自然選擇的啟發(fā)式搜索過(guò)程。本質(zhì)上它是在一些數(shù)據(jù)上測(cè)試神經(jīng)網(wǎng)絡(luò),并從一個(gè)擬合函數(shù)中得到網(wǎng)絡(luò)性能的反饋。然后對(duì)網(wǎng)絡(luò)迭代地做小的、隨機(jī)的變化,再使用相同的數(shù)據(jù)進(jìn)行測(cè)試。將具有高度擬合分?jǐn)?shù)的網(wǎng)絡(luò)作為輸出,然后使其作為下一個(gè)網(wǎng)絡(luò)的父節(jié)點(diǎn)。
Pyevolve提供了一個(gè)用于建立和執(zhí)行這類(lèi)算法很棒的框架。作者曾表示,V0.6版本也支持遺傳編程,所以在不久的將來(lái),該框架將更傾向于作為一個(gè)進(jìn)化的計(jì)算框架,而不只是簡(jiǎn)單地遺傳算法框架。
擅長(zhǎng):遺傳算法的神經(jīng)網(wǎng)絡(luò)
NuPIC
Nupic是另一個(gè)庫(kù),與標(biāo)準(zhǔn)的機(jī)器學(xué)習(xí)算法相比,它提供了一些不同的功能。它基于一個(gè)稱(chēng)作層次時(shí)間記憶(HTM)的新皮層理論,。HTMs可以看作是一類(lèi)神經(jīng)網(wǎng)絡(luò),但在一些理論上有所不同。
從根本上說(shuō),HTMs是一個(gè)分層的、基于時(shí)間的記憶系統(tǒng),可以接受各種數(shù)據(jù)。這意味著會(huì)成為一個(gè)新的計(jì)算框架,來(lái)模仿我們大腦中的記憶和計(jì)算是如何密不可分的。對(duì)于理論及其應(yīng)用的詳細(xì)說(shuō)明,請(qǐng)參閱 白皮書(shū)。
擅長(zhǎng):HTMs
Pattern
此庫(kù)更像是一個(gè)“全套”庫(kù),因?yàn)樗粌H提供了一些機(jī)器學(xué)習(xí)算法,而且還提供了工具來(lái)幫助你收集和分析數(shù)據(jù)。數(shù)據(jù)挖掘部分可以幫助你收集來(lái)自谷歌、推特和維基百科等網(wǎng)絡(luò)服務(wù)的數(shù)據(jù)。它也有一個(gè)Web爬蟲(chóng)和HTML DOM解析器?!耙脒@些工具的優(yōu)點(diǎn)就是:在同一個(gè)程序中收集和訓(xùn)練數(shù)據(jù)顯得更加容易。
在文檔中有個(gè)很好的例子,使用一堆推文來(lái)訓(xùn)練一個(gè)分類(lèi)器,用來(lái)區(qū)分一個(gè)推文是“win”還是“fail”。
from pattern.web import Twitter
from pattern.en import tag
from pattern.vector import KNN, count
twitter, knn = Twitter(), KNN()
for i in range(1, 3):
for tweet in twitter.search(‘#win OR #fail’, start=i, count=100):
s = tweet.text.lower()
p = ‘#win’ in s and ‘WIN’ or ‘FAIL’
v = tag(s)
v = [word for word, pos in v if pos == ‘JJ’] # JJ = adjective
v = count(v) # {‘sweet’: 1}
if v:
knn.train(v, type=p)
print knn.classify(‘sweet potato burger’)
print knn.classify(‘stupid autocorrect’)
首先使用twitter.search()通過(guò)標(biāo)簽‘#win’和‘#fail’來(lái)收集推文數(shù)據(jù)。然后利用從推文中提取的形容詞來(lái)訓(xùn)練一個(gè)K-近鄰(KNN)模型。經(jīng)過(guò)足夠的訓(xùn)練,你會(huì)得到一個(gè)分類(lèi)器。僅僅只需15行代碼,還不錯(cuò)。
擅長(zhǎng):自然語(yǔ)言處理(NLP)和分類(lèi)。
Caffe
Caffe是面向視覺(jué)應(yīng)用領(lǐng)域的機(jī)器學(xué)習(xí)庫(kù)。你可能會(huì)用它來(lái)創(chuàng)建深度神經(jīng)網(wǎng)絡(luò),識(shí)別圖像中的實(shí)體,甚至可以識(shí)別一個(gè)視覺(jué)樣式。
Caffe提供GPU訓(xùn)練的無(wú)縫集成,當(dāng)你訓(xùn)練圖像時(shí)極力推薦使用此庫(kù)。雖然Caffe似乎主要是面向?qū)W術(shù)和研究的,但它對(duì)用于生產(chǎn)使用的訓(xùn)練模型同樣有足夠多的用途。
擅長(zhǎng):神經(jīng)網(wǎng)絡(luò)/視覺(jué)深度學(xué)習(xí)
Statsmodels
Statsmodels是另一個(gè)聚焦在統(tǒng)計(jì)模型上的強(qiáng)大的庫(kù),主要用于預(yù)測(cè)性和探索性分析。如果你想擬合線性模型、進(jìn)行統(tǒng)計(jì)分析,或者預(yù)測(cè)性建模,那么Statsmodels非常適合。它提供的統(tǒng)計(jì)測(cè)試相當(dāng)全面,覆蓋了大部分情況的驗(yàn)證任務(wù)。如果你是R或者S的用戶,它也提供了某些統(tǒng)計(jì)模型的R語(yǔ)法。它的模型同時(shí)也接受Numpy數(shù)組和Pandas數(shù)據(jù)幀,讓中間數(shù)據(jù)結(jié)構(gòu)成為過(guò)去!
與其他語(yǔ)言集成
你不了解Python但是很擅長(zhǎng)其他語(yǔ)言?不要絕望!Python(還有其他)的一個(gè)強(qiáng)項(xiàng)就是它是一個(gè)完美的膠水語(yǔ)言,你可以使用自己常用的編程語(yǔ)言,通過(guò)Python來(lái)訪問(wèn)這些庫(kù)。以下適合各種編程語(yǔ)言的包可以用于將其他語(yǔ)言與Python組合到一起:
R -》 RPython
Matlab -》 matpython
Java -》 Jython
Lua -》 Lunatic Python
Julia -》 PyCall.jl
不活躍的庫(kù)
這些庫(kù)超過(guò)一年沒(méi)有發(fā)布任何更新,我們列出是因?yàn)槟阌锌赡軙?huì)有用,但是這些庫(kù)不太可能會(huì)進(jìn)行BUG修復(fù),特別是未來(lái)進(jìn)行增強(qiáng)。
MDP
MlPy
FFnet
PyBrain
電子發(fā)燒友App













評(píng)論