1
本文作者: 覃超 | 2017-01-07 11:19 |
雷鋒網(wǎng)按:本文作者覃超,前Facebook軟件工程師,現(xiàn)為FREES資本技術(shù)合伙人。
文章來自@覃超 的知乎回答:如何評價扎克伯格自己寫的 Jarvis AI? 此問題緣起于扎克伯格2016年12月19日發(fā)布的文章Building Jarvis,小扎稱自己打造了一個像鋼鐵俠里 Jarvis 那樣的家庭AI助手。雷鋒網(wǎng)已在第一時間翻譯出這篇筆記:《扎克伯格開發(fā)筆記:打造Jarvis的日子,我慶幸自己從未停止過編程》,建議沒看過的讀者可以先瀏覽一下。
Jarvis demo視頻:Jarvis From the Perspective of Priscilla Chan (is different)
帖子頭圖是一段 Jarvis 的代碼。作為一個技術(shù)流作者,我在最后的附錄解讀那段代碼:
文章開頭Zuck先敘述了自己編寫Jarvis的心路歷程:
這個技術(shù)架構(gòu)如下:一個 Jarvis server 在服務(wù)端跑,上面主要是做語言處理、語音識別和人臉識別 (Zuck家的大門需要用)。
輸入端為各種家用硬件,也就是上圖中左邊那一列,依次是:
1. Crestron:Crestron Home Automation for SmartHome 此為美國最著名的智能家居控制器的廠商,專門提供一整套硬件和技術(shù)方案讓愛折騰的老美實現(xiàn)這些功能:
"Alexa, turn on the kitchen lights"
"Alexa, raise the living room lights by fifty percent"
"Alexa, set the basement thermostat to 70 degrees"
黑人臉 -_- 這也能解釋為什么在網(wǎng)上看到的智能家庭的視頻來來回回都是這幾個控制指令。
2. Lights:燈
3. Thermostat:調(diào)溫度的
4. Doors:門和門禁系統(tǒng)
5. Sonos:老美喜歡的智能音響品牌:Sonos PLAY:1 Compact Wireless Smart Speaker for Streaming Music (White)
6. Spotify:美國版的網(wǎng)易云音樂。Spotify由Sean Parker創(chuàng)立(前Facebook CEO和聯(lián)合創(chuàng)業(yè)人之一;也就是在《社交網(wǎng)絡(luò)》電影里抽大麻的那個。注意:大麻在美國一些州已經(jīng)合法,另外它的成癮性和危害都小于香煙),Spotify和Facebook關(guān)系很好,在2011年深度集成在Facebook中。
7. Cameras:攝像頭
8. Toaster:
老美耿直,早餐都吃的是toast,這個機器用來加熱它,然后涂點果醬和黃油,就是一頓豐盛的早餐。
9. T-shirt cannon:T恤加農(nóng)炮。很多讀者這時估計懵逼了,問:“小魔王同學,你是不是說錯了?扎克伯格沒事在家里放一個加農(nóng)炮干嘛?” 對的,其實他的衣柜里安裝了一個T恤的發(fā)射器,可以直接把T恤噴射出來,打到他的手里。
架構(gòu)圖里的右側(cè)為三個用戶系統(tǒng):messenger bot、語音app和門禁攝像頭。接下來小扎說了他一步步是如何走過來的:
第一章:連接家里的家具設(shè)備。
這塊Zuck坦言做這個AI家庭系統(tǒng)比跑365英里的任務(wù)要稍微簡單一些(至少少費時),但是最麻煩的環(huán)節(jié)就是連接這些家里的各種設(shè)備。他甚至需要“逆向工程”一些硬件設(shè)備的API(比如燈和音響),使得可以通過程序來控制它們。Toaster換了一個1950年的硬件,另外Zuck還專門給Beast(zuck的狗)的喂食器以及T恤的彈射炮做了硬件的改動。
由此可見以后IoT(物聯(lián)網(wǎng))的重要性和前景。
第二章:自然語言處理
分為兩部分:文字消息處理和語音處理。前者處理的難度是同義詞和上下文,而后做音樂控制的時候發(fā)現(xiàn)播放指令的處理更加麻煩,比如:
“播放周杰倫”:這句命令在處理的時候要判斷周杰倫到底是人還是歌名;另外Zuck的例子:
"Play someone like you", "Play someone like Adele",前者是歌名,后者則是進行類似風格的歌曲推薦。Zuck通過不斷訓練和加強Jarvis AI,使得它現(xiàn)在對于Zuck的歌曲喜好有記憶和認知,所以Zuck一般直接說:“Play me some music”。Jarvis便直接開始播放,另外Zuck有時心情不對的時候,想聽輕音樂,便說:“that's not light, play something light”,Jarvis自己換歌曲并且學習。
第三章:視覺和面部識別
人的大腦有1/3的部分專門用來做視覺處理,包括圖像、模式識別和追蹤。Zuck的房子門禁同樣也需要支持視覺和面部識別功能:
這部分在AI領(lǐng)域一直是發(fā)展前沿,所以有不少現(xiàn)成的model和開源框架。Facebook之前就開放了一套API來判斷這個圖片里是否有你fb好友,以及將面部位置可以從圖片中定位出來。
Zuck為了做智能門禁,在大門口裝了好幾個攝像頭,為了可以更好地捕捉人臉圖片。Jarvis系統(tǒng)24小時不斷進行人臉探測和識別,當有人且是Zuck好友的時候,給Zuck發(fā)消息詢問是不是想見的人。
AI視覺還幫助Jarvis做其他事情,比如看Max(Zuck女兒)是否睡醒,如果醒了的話,Jarvis邊自動開始播放Max喜歡的歌曲或者給Max上中文課(從小開始學習中文 -_-)。另外借助視覺系統(tǒng),可以更加有效地知道家里的人的所在位置,這對于更好地執(zhí)行有上下文的指令有巨大幫助。比如當有人說:“Turn on the lights”,肯定最佳的動作是打開此人所在位置的燈。
第四章:Messenger bot
老外現(xiàn)在喜歡用 bot,所以Zuck把各種操作指令都放在手機上,具體說來是 Facebook messenger 的 bot上(類似于Slack的bot或者微信的一個公眾號)。于是Zuck只需要像這個公眾號發(fā)消息即可。如下圖:
Zuck介紹用 messenger bot 開發(fā)的各種便利之處,它比起做一個app來更輕,更容易跨平臺,同時也不同處理push、啟動、注冊等一系列繁瑣routine的事情。平時Zuck可以通過發(fā)文字或者語音消息(原文:audio clip,這個功能是小魔王我當年親手做的~ :D),然后Jarvis AI將其發(fā)送到server上, 進而開始做文字或者語音處理,提煉出需要執(zhí)行的指令來操作Zuck家。同時Jarvis AI還會主動發(fā)消息給Zuck,比如有人在門口時,Jarvis會把照片和識別出的人的信息發(fā)給Zuck,讓他確認是否是自己要見的人。
Zuck自己沒有料想到的是:平時和Jarvis的交流大部分都是通過文字信息;雖然開始Zuck以為自己會是說話為主,但是后來發(fā)現(xiàn)text更加方便更加能保護個人隱私,不打擾別人。這從一個側(cè)面也能反應(yīng)出來 voice message 在北美的messenger流行不起來的一個重要原因:隨著社會進步,人會越來越重視隱私或是變得有些緘默。Zuck還透露不管是FB messenger還是whatsapp上也看出類似的趨勢:文本信息的消息數(shù)量遠比語音消息增長得快。這里給做AI的各位公司一個啟示:雖然現(xiàn)在語音識別仿佛是標配,但是AI系統(tǒng)可能更加需要注意在文本處理上的成熟度,因為人們會大量使用文本控制而不是之前設(shè)想的語音控制。雖然后者讓PM或者CEO覺得好像是更便捷更cool的人機交互方式。
第五章:語音處理
Zuck當然也做了語音識別的模塊來輔助控制 Jarvis:
上圖中的指令就是控制衣柜中的“加農(nóng)炮”給自己發(fā)射體恤(具體可以參考后面的視頻)。這個app是 Zuck專門做的iOS app來進行語音識別和理解的。之所以做一個全新的app,而不是用messenger bot,是因為在messenger里打開語音消息需要太多的步驟,有點繁瑣。而Zuck的使用場景是希望把手機放在桌上,自己可能干其他事,而手機一直在那里聽著。這種使用方式有點類似Amazon Echo:Amazon Echo - Amazon Official Site - Alexa-Enabled
Zuck說之前開發(fā)iOS還是在2012年,現(xiàn)在再次開發(fā),他感受到整個ios和fb的toolchain的改進巨大,語言和xcode的增強使得編程和做app的門檻大大降低。
通過開發(fā)和使用這個voice app,zuck對于AI和語音識別在產(chǎn)品上的思考:
語音識別的算法在上下文和聯(lián)想方面需要加強得還不少;類比人類進行語音識別的時候,不僅在聽你當前說什么并記下來,同時要時刻在預(yù)測你接下來準備說什么,大腦表現(xiàn)得非常自然而且高效。而計算機,即使最近開始使用RNN(recurrent neurol network)好了不少,但是依然有很大的提升空間;
語音識別現(xiàn)在在理解人類的支離片語上表現(xiàn)不佳,另外對于常規(guī)情況下使用的語音識別能力比較弱。大部分的系統(tǒng)都在做特別功能范圍(比如Google Search, Amazon Echo)內(nèi)的語音識別。
語音的加入讓產(chǎn)品和人之間更加有情感交流,Zuck覺得這肯定是以后產(chǎn)品發(fā)展的方向。能用語音進行交流之后,Zuck自己越用越覺得有意思,然后開始改進Jarvis,讓其變得更加幽默有趣。還加入了一些游戲和黑話給Jarvis。
語音的識別和運用方面,zuck認為可以做的創(chuàng)業(yè)才剛剛開始。(所以各位抓住機會?。?/p>
第六章:Facebook的工程師環(huán)境
這一段,Zuck說自己雖然是CEO,但是從未停止過coding,但主要以個人項目為主。通過這次開發(fā) Jarvis,zuck又重新體會了一次整個FB的技術(shù)環(huán)境的魅力,就類似于一個新入職的工程師一樣走完了整個bootcamp的過程。他說不僅上手實踐AI和了解了最新AI方面的進展,同時意外收獲了很多關(guān)于開發(fā)技術(shù)方面的知識。Zuck贊賞FB的代碼非常有條不絮,另外在開源上做得很好,甚至zuck在文章里親自列舉出 Jarvis上使用的開源框架:
Messenger bot: messenger.com/platform
Atom plugin for bot: facebook/nuclide
Buck: A fast build tool
FastText, 文本處理和識別:facebookresearch/fastText
Facebook AI research:facebookresearch
最后zuck歡迎開發(fā)者都來使用下這些開源庫,來感受下AI最新發(fā)展的魅力。另外他一直堅持內(nèi)部工具和技術(shù)的基礎(chǔ)設(shè)施對于一個互聯(lián)網(wǎng)公司的重要性,所以最后他說:“Building internal tools that make engineering more efficient is important to any technology company, but this is something we take especially seriously. So I want to give a shout out to everyone on our infra and tools teams that make this so good.” 所以這里可以看出,硅谷公司把技術(shù)部門真真切切地當做是公司的重要資產(chǎn),去鼓勵去培養(yǎng);而國內(nèi)很多公司對于技術(shù)團隊,更多當成是一種工具,甚至是開支部門。所以各位想單純醉心于技術(shù)鉆研的人,早點去硅谷是一條最好的出路。
第七章:下一步
Zuck的文章到了這里,已經(jīng)進行到了尾聲。Zuck說雖然2016年的挑戰(zhàn)已經(jīng)結(jié)束,但是對于Jarvis的開發(fā)和優(yōu)化會繼續(xù)。具體需要做:
開發(fā)Android下的語音識別app
接入更多的室內(nèi)硬件和更多的應(yīng)用
讓Jarvis擁有學習能力。Zuck原話:“If I spent another year on this challenge, I'd focus more on learning how learning works.” 即希望教會Jarvis如何學習,或者說得更加酷炫:讓Jarvis學習如何學習。(小魔王補充:chunk it up,deliberate practicing,feedbacks,10000 hours theory?。?/p>
最后Zuck準備再抽象一層自己的代碼,然后在明年將其開源(接受小魔王覃超的進一步code review :-D)
第八章:結(jié)論
關(guān)于結(jié)論這部分,Zuck原文相當?shù)镁珶捛矣幸饬x,我實在覺得應(yīng)該把英文貼上來,各位都能閱讀一下:
“Building Jarvis was an interesting intellectual challenge, and it gave me direct experience building AI tools in areas that are important for our future.
I've previously predicted that within 5-10 years we'll have AI systems that are more accurate than people for each of our senses -- vision, hearing, touch, etc, as well as things like language. It's impressive how powerful the state of the art for these tools is becoming, and this year makes me more confident in my prediction.
At the same time, we are still far off from understanding how learning works. Everything I did this year -- natural language, face recognition, speech recognition and so on -- are all variants of the same fundamental pattern recognition techniques. We know how to show a computer many examples of something so it can recognize it accurately, but we still do not know how to take an idea from one domain and apply it to something completely different.
To put that in perspective, I spent about 100 hours building Jarvis this year, and now I have a pretty good system that understands me and can do lots of things. But even if I spent 1,000 more hours, I probably wouldn't be able to build a system that could learn completely new skills on its own -- unless I made some fundamental breakthrough in the state of AI along the way.
In a way, AI is both closer and farther off than we imagine. AI is closer to being able to do more powerful things than most people expect -- driving cars, curing diseases, discovering planets, understanding media. Those will each have a great impact on the world, but we're still figuring out what real intelligence is.
Overall, this was a great challenge. These challenges have a way of teaching me more than I expected at the beginning. This year I thought I'd learn about AI, and I also learned about home automation and Facebook's internal technology too. That's what's so interesting about these challenges. Thanks for following along with this challenge and I'm looking forward to sharing next year's challenge in a few weeks.”
這里可以看出Zuck的執(zhí)行力以及實踐能力。一方面通過寫Jarvis來親自學習了一下AI現(xiàn)在的最近進展,另一方面這種第一手經(jīng)驗很好地反饋回來讓他更加有信心來判斷以后5-10年AI和相關(guān)產(chǎn)品的發(fā)展方向。我覺得我自己以及中國的廣大創(chuàng)業(yè)者特別是投資人都應(yīng)該學習這種實干的態(tài)度,而不是停留在嘴皮上預(yù)測未來。
Zuck認為計算機智能在某些領(lǐng)域做得已經(jīng)很好,但是最關(guān)鍵的“自學能力”和“舉一反三”能力幾乎沒有(原文:We know how to show a computer many examples of something so it can recognize it accurately, but we still do not know how to take an idea from one domain and apply it to something completely different.)。Zuck自己話了100個小時來做Jarvis,但是他認為就算花1000個小時,也無法讓機器能夠有自學能力,除非在人工智能領(lǐng)域可以有學術(shù)、科學上的重大突破。
從demo視頻里來看的話,很多時候Jarvis感覺并不好用。但是畢竟能夠用messenger+聲音來控制自己的家庭設(shè)備是一件非??犰诺氖虑?。
---- 附帶圖片中代碼的解讀 ----
這段代碼是用PHP外加Facebook的FBT寫就,總體邏輯:將異步task設(shè)置好(其中一個task就是做圖片的人臉識別),另外從AI API中取得并設(shè)置好config,最后調(diào)用接口并且等待結(jié)果。
其中代碼細節(jié):
從代碼邏輯來看,這應(yīng)該是Jarvis的源代碼。從代碼細節(jié)看,作者的水平還行,但也不夠完美。可以看出邏輯清晰但是代碼功力不太夠 -_-。 這也合情合理,畢竟Zuck沒時間保持一個高頻次寫代碼的狀態(tài),所以肯定是“三天不寫手生”。舉例來說(如果嚴格的code review的話;哈哈!給Zuck做code review真是三生有幸?。?/p>
最開始兩行:$task這個變量不需要,直接往 "image" => ... 這里灌即可;而且 $task 這個太泛的名字也沒有具體含義。要不就改成:$face_detect_task,當然最好就直接放入map里算了。
這兩句寫得一般,看起來有點學生時代寫大作業(yè)的代碼的風格;同名變量反復(fù)使用,另外對于null的檢查不對稱。
看到這段代碼,我想很多程序員會哭笑不得。首先代碼邏輯有點hacky,初步判斷應(yīng)該是 JARVIS_FACEREC 沒來得及完成。。。所以趕鴨子上架暫時用 RC_MODEL 來頂上;畢竟馬上就Christmas和新年了,Zuck沒做完也要先趕在deadline之前發(fā)布嘛。注意!我覺得這個態(tài)度和做事方式才是對的, 不要拖,也不要等到完美的時候才發(fā)布,因為一個項目一個作業(yè)永遠都無法達到你想要的完美狀態(tài)。正如Zuck自己之前在Facebook里強調(diào):“Done is better than perfect!”
idx是一個helper method,其實就等于 $api_config['detection_tier'],但是用idx的好處是如果 $api_config 為空,那么 idx 不會崩潰,而是返回null,而 $api_config['detection_tier'] 直接觸發(fā)異常。所以這里回頭看,Zuck的80行寫得并不好,最好寫成:$api_config = idx(api_config, 'facer'); 對了,idx還可以支持第三個參數(shù),就是默認值;如果這個key在map中沒有的話,就直接返回默認值。
這句是技術(shù)含量最高的一句。FaceDetectRequestConfig::gen,這里gen代表generator,由于歷史原因,F(xiàn)acebook的代碼用的是generator,所以異步操作就起名gen;但是這里用的是新的 resumable function;也就是 ::gen 返回一個 awaitable object(類似promise,如果你玩js或者其他語言),然后前面的await就將異步操作出發(fā)執(zhí)行,最后得到從 detection_tier 來的 config。具體關(guān)于 async & await,以及 resumable function 可以參考:http://meetingcpp.com/index.php/br/items/resumable-functions-async-and-await.html (這里PHP中的resumable function是Facebook自己做的語法加強;C#里一直就有,而C++會在下一代的C++1y里引入 resumable function)。
print "Configured...\n" 這句話太萌,典型的學生項目代碼。
類似于: console.log(xxx) 或者 System.out.println("Configured...) 或 NSLog(@"Configured..."); 要是公司項目的代碼這么寫,估計要被tech lead直接罵死。
不過這里Zuck敢于自己動手開始寫代碼,并且最后可以有一個prototype上線開始能夠使用,已經(jīng)非常厲害了(畢竟很多CEO一天到晚忙除了開會,幾乎什么都做不了)。
最后Zuck那段代碼的最佳形態(tài)是:
雷峰網(wǎng)特約稿件,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。