說個最夸張的例子。假如我們已知X要預(yù)測Y,Python做的工作就是找到Y(jié)=aX+b這測關(guān)系式,特別是a和b的具體數(shù)值最值錢。而除此之外的所有工作,從數(shù)據(jù)采集,軟件架構(gòu)設(shè)計,數(shù)據(jù)庫設(shè)計與讀寫,后臺運(yùn)作,分布式處理一直到前端展示可能都是用的Python以外的技術(shù)(比如C++)來實現(xiàn)。Python的工作僅僅是得到a和b,僅此而已!
早起人工智能概念還很模糊的時候,很多人也很不解,為什么莫名其妙的,Python怎么就成了開發(fā)人工智能的第一語言呢?
人工智能為什么不用C++
事實上,用什么編程語言跟人工智能完全沒有關(guān)系,只要你愿意,用C++也沒有問題。至于為什么Python成為了人工智能的編程語言,原因有很多,這里簡單說一下。
01
谷歌的搜索引擎源自Page和Brin的博士論文,當(dāng)時他們的程序就是用Python寫的,當(dāng)日他們兩就決定讓谷歌投入做AI時,首選的語言就是Python。在收購DeepMind之后,谷歌開始發(fā)布大量的論文,放出的代碼也基本上是基于Python的,所以自然而然……
02
這是由于Python的優(yōu)點決定的,它具有多平臺兼容性,代碼簡潔、可讀性強(qiáng),豐富的開源庫等等。
C++在人工智能方面毫無用處?
恰恰相反,C++在人工智能方面的用處很大。目前機(jī)器學(xué)習(xí)的底層框架和所以來的支持庫,幾乎都是在使用C++。只是相比之下,Python的需求量更大,并不代表C++就沒有市場了。
如果你寫的是底層的庫,那么C語言是最佳的選擇,如果是代碼量巨大,且有大量底層庫支持,保證速度不至于慢到不能接受的程度,Python還是最佳的選擇。
為什么招聘的需求不同?
再看一個例子,你就明白了。來自騰訊人工智能職位的招聘。
招聘崗位有:語言識別/合成研究員,機(jī)器學(xué)習(xí)研究員、自然語言處理研究員、計算機(jī)視覺研究員、語音識別開發(fā)工程師……
閱讀一下這些崗位要求,你會發(fā)現(xiàn)一條幾乎通用:至少精通一種技術(shù)語言,包括但不限于Java、C/C++、C#、Python等。
另外,要么就是要求你同時精通C++和Python。
結(jié)合上面對C++和Python的闡述,你應(yīng)該知道為什么有些企業(yè)會招聘C++,有些企業(yè)會招Python了吧。
編程語言,誰是核心?
不妨再舉個例子,下圖是TIOBE編程語言排行榜:
這個榜單被很多人解讀為“誰才是編程語言的老大”。這可能是最大的誤讀了,其實這個榜單更多的是反應(yīng)各類編程語言的熱門程度,亦或是市場需求,僅此而已。
每種編程語言,都有他們的優(yōu)勢和劣勢,他們可能因為市場的需求而有了冷熱之分。如果你非得分出誰才是最重要的編程語言,我只能告訴你:
“PHP是世界上最好的語言”
——摘自W3Cshool學(xué)員的回答
https://www.toutiao.com/a6575036124362703112/
人工智能,就是讓機(jī)器可以像人一樣思考問題。典型的場景有:圖像識別、自然語言處理、語音處理、動態(tài)物體跟蹤、可運(yùn)動的機(jī)器人,等等。
智能,就是人類可以很容易作出判斷,但是卻根本描述不清楚為什么是這樣。比方說,一張人臉,人類盯上不超過一秒鐘,然后幾乎不需要思考,就立刻認(rèn)出這是誰。但是人類卻根本無法用文字作出該臉特征的描述。讀文章,有“語感”,聽音樂,有“樂感”。為什么某首樂曲聽上去悲傷?感覺,樂感,真的說不清楚悲傷的原因。開車,也是講“感覺”。只有學(xué)駕照的時候,教練才教很多公式,教很多特殊點(雨刷鉚釘,右邊玻璃的右下角等等)。AlphaGo為什么是人工智能?對了,就是“棋感”。
而早期的深藍(lán)下國際象棋,勝過人類,就不能叫智能。因為它基本上是以窮舉為主,深藍(lán)的每一步操作都是精確可描述的,是“可知”的,是機(jī)器思維而不是人類思維。相反,AlphaGo就連開發(fā)者都搞不清楚這機(jī)器是怎么運(yùn)作的。它就是個“黑匣子”。它模擬的是人的“感覺”而不是一堆人類發(fā)明的精確圍棋算法公式。感覺是無法用語言描述的。
簡單算術(shù)運(yùn)算也不是智能,因為人類列算式計算的每一步都是可精確描述的。同樣電子計算器在算術(shù)運(yùn)算時的每一個步驟同樣也是如此(雖然它用的是二進(jìn)制計算,數(shù)字電路,泰勒級數(shù)展開等與人類不太一樣的方法)。
人工智能要模擬人的“感覺”,就必須訓(xùn)練,也可以叫做“學(xué)習(xí)”。比如讓它區(qū)分貓和狗,就給它幾萬張貓和狗的圖片,讓它自己去慢慢學(xué)習(xí)。在學(xué)習(xí)前,人類只需要告訴它某張圖是貓或是狗,其他信息一概不用多說。比如完全沒有必要提醒它有胡子的就是貓。
從目前的技術(shù)來看,訓(xùn)練是非??简灱夹g(shù)和花費(fèi)時間的。以致于大家一提到人工智能,就是以為在說機(jī)器訓(xùn)練(機(jī)器學(xué)習(xí))。
訓(xùn)練是個反復(fù)迭代的過程,就是說需要不斷地探索,此路不通,就換一條路,非常艱辛?,F(xiàn)實中,往往是不斷地調(diào)整神經(jīng)網(wǎng)絡(luò)的參數(shù),不斷地對比訓(xùn)練結(jié)果。多數(shù)時候還要數(shù)據(jù)預(yù)處理,以及輔助傳統(tǒng)的機(jī)器學(xué)習(xí)、傳統(tǒng)圖像處理、模式識別等技術(shù)。
那么,上述過程,誰最擅長?現(xiàn)在公認(rèn)的就是Python。
Python是解釋性語言而,弱類型,用起來很方便,開發(fā)效率大大高過C++、JAVA等語言,而且有很多現(xiàn)成的機(jī)器學(xué)習(xí)、深度學(xué)習(xí)、科學(xué)計算庫,這些都是它作為人工智能語言的優(yōu)勢。AlphaGo的頂層代碼大部分是用的Python,AlphaGo的成功,也對Python起了很大的推動作用。
數(shù)據(jù)的訓(xùn)練還可以細(xì)分為兩類。一是前期的算法探索和小樣本數(shù)據(jù)訓(xùn)練,二是后期正式的大規(guī)模數(shù)據(jù)訓(xùn)練。比如實驗的1萬個樣本,可能要訓(xùn)練1個小時才能得到理想的網(wǎng)絡(luò)。而最終的100萬個樣本時,可能就需要100個小時。這已經(jīng)很長了。這時候,C++的作用就體現(xiàn)出來了??梢杂肅++花很多的人力成本投入去優(yōu)化算法。概括說來就是,前期用Python進(jìn)行算法探索,待算法和相關(guān)參數(shù)確定,后期用C++重寫算法實現(xiàn)生產(chǎn)環(huán)境的真實的正式的訓(xùn)練。
訓(xùn)練是人工智能的很難的一部分,但是絕對不是人工智能的全部。人工智能還包括前期的數(shù)據(jù)獲取、數(shù)據(jù)預(yù)處理和后期的實際應(yīng)用。
訓(xùn)練得到的只是一個巨大的神經(jīng)網(wǎng)絡(luò),有了它以后就可以預(yù)測了。預(yù)測所需要花的時間遠(yuǎn)遠(yuǎn)短于訓(xùn)練。比如訓(xùn)練花100個小時,而用訓(xùn)練好后的網(wǎng)絡(luò)預(yù)測可能只需要5秒。可別小看這5秒的短時間。我們?nèi)匀挥斜匾獌?yōu)化,比如是否可以1秒就完成,0.1秒完成?試想,設(shè)計一個無人駕駛系統(tǒng),那可是分秒必爭?。∩晕⒎磻?yīng)遲緩就可能釀成事故。
這時候,C++的作用又一次體現(xiàn)出來了!
這還沒完。人工智能的載體可能會很精簡。比方說嵌入到人體,嵌入到汽車,這么小的系統(tǒng),不是Python的天下。還有機(jī)器人,是可以運(yùn)動的,如何驅(qū)動機(jī)器動,這不還是C++的強(qiáng)項嘛。
另外,還涉及到前期的數(shù)據(jù)采集和預(yù)處理。比如圖像、音頻、視頻,需要實時感知,包括必要的預(yù)處理(比如灰度化、關(guān)鍵部位快速定位)。這就要用到音頻視頻的高效處理,數(shù)據(jù)通信,物聯(lián)網(wǎng)等技術(shù)。這不還是C++的強(qiáng)項嗎?
總之,在人工智能開發(fā)的整個過程中,Python主要處理算法模型部分,而具體的前期數(shù)據(jù)獲取和后期與外部設(shè)備部分的交互則可以用C++來實現(xiàn)。
說個最夸張的例子。假如我們已知X要預(yù)測Y,Python做的工作就是找到Y(jié)=aX+b這測關(guān)系式,特別是a和b的具體數(shù)值最值錢。而除此之外的所有工作,從數(shù)據(jù)采集,軟件架構(gòu)設(shè)計,數(shù)據(jù)庫設(shè)計與讀寫,后臺運(yùn)作,分布式處理一直到前端展示可能都是用的Python以外的技術(shù)(比如C++)來實現(xiàn)。Python的工作僅僅是得到a和b,僅此而已!
不過,從目前來看,人工智能最主要和最難的部分依然是由Python來實現(xiàn)的。
2評論工程學(xué)之美12贊
踩
這個問題我有答案,頂我上去。
因為這兩個崗位要干的活完全不一樣。
第一個要求python和tensorflow說明整個工作主要在設(shè)計模型,訓(xùn)練模型,最后可能的輸出形式是用模型離線算一批數(shù)據(jù)或者用GPU在服務(wù)器部署;所以不需要太多的C/C++工程能力。
第二個工作要求C/C++,特別有一條要在手機(jī)客戶端部署,這個要求就高很多了,不只是模型訓(xùn)練,你還需要在手機(jī)上實現(xiàn)模型,手機(jī)上可沒有CUDA生態(tài)的GPU,主要是一些協(xié)處理器,沒法直接上tensorflow。所以此時,比較好的方案就是用C/C++來進(jìn)行CPU編程實現(xiàn)模型。
評論ohfaint1贊
踩
這個主要看這個崗位招收的人員是需要進(jìn)行哪個層次的編程工作。
C++在繼承了C語言的優(yōu)點的同時加入了面向?qū)ο蟮膬?nèi)容。所以C++語言不但可以構(gòu)建效率較高的底層具體的算法實現(xiàn),又有良好的擴(kuò)展性和代碼重用性。所以一般在追求高效運(yùn)行的底層算法中,我們一般使用C或C++來進(jìn)行構(gòu)建。
python語言作為一種解釋性語言,運(yùn)行效率比較低。但是python上已經(jīng)具有了大量構(gòu)建好的人工智能算法庫。所以python語言更適于構(gòu)建上層框架。這樣不但構(gòu)建效率高,容易調(diào)試。因此在上層算法中通常使用python語言構(gòu)建應(yīng)用層框架。
通過兩種語言的配合方式充分利用了兩種開發(fā)語言的長處和有點,也利于保持原有語言類型上所進(jìn)行的原有開發(fā)。
因此,在人工智能崗位的招聘中,大一些的公司都會分開來進(jìn)行招聘。需要底層算法實現(xiàn)的招熟悉C或C++的人,需要高層算法實現(xiàn)的招熟悉python的人。
評論吳大爺?shù)娜粘?/a>3贊踩這么說吧,C++學(xué)精了,上手其他編程語言會簡單許多,有很多優(yōu)勢,python主要是上手簡單,但是精通也不容易。程序語言也沒有哪個更重要,只有哪個更適合。人工智能的開發(fā)的核心庫一般都也是C++寫的,只是提供了python程序語言接口,因為它更便捷。在開發(fā)過程中遇到性能調(diào)優(yōu)的問題時還是會繞回到C++的。 評論從不加班的程序猿6贊
踩
其實人工智能可以用到很多種語言,不只是Python和C/C++,還有Java,以及l(fā)isp,prolog.不過目前來看,還是Python和C++用得更多。
而Python其實是人工智能的首選語言,而且想要入門Python比其他語言都會容易些。當(dāng)然了,不是說C++在人工智能中就毫無用處了,而是相比Python,它更不適合用在人工智能上。為什么?
看看它的缺點:1.遵循自上而下的方法,語言比較復(fù)雜;2.僅僅是更適合實現(xiàn)特定系統(tǒng)或者是算法核心/基礎(chǔ)。
而Python呢?優(yōu)勢更多:1.開發(fā)速度明顯比C++更快;2.有各種各樣的庫和工具;3.它面向?qū)ο螅?.它還支持算法測試。
2評論碼農(nóng)視界3贊
踩
C++是所有語言的基礎(chǔ),現(xiàn)在很多編程語言都是由此衍生過來的,因為精通C++太難了,其語言的繁瑣性,很多人都在半路上就放棄了,所以才出現(xiàn)了之后的很多簡潔版的編程語言。
所以就當(dāng)前的學(xué)習(xí)趨勢來看,很多人都會選擇Python,不僅僅是因為Python具有強(qiáng)大的數(shù)據(jù)庫,對人工智能技術(shù)有著更多的優(yōu)勢,還因為相對于C++語言來說,是簡單容易入門,容易上手的!很多零基礎(chǔ)的同學(xué)也是可以學(xué)會的!
評論隔壁的老王說事0贊
踩
平常訓(xùn)練使用python,真正上線的時候用cpp。因為如果用python環(huán)境是個問題,一臺機(jī)器一臺機(jī)器的搭建paddle or tensorflow太麻煩了,況且效率也不高。將預(yù)測的代碼寫成cpp的,只把依賴的庫拷貝出來放到每臺機(jī)器上就行了。