幫臉書馬克打分數!Facebook前工程師鑑定:他的Jarvis寫得還不錯啦 | TechOrange 科技報橘

幫臉書馬克打分數!Facebook前工程師鑑定:他的Jarvis寫得還不錯啦

【我們為什麼挑選這篇文章】Facebook  CEO在去年底完成了他的個人目標——打造居家智慧助理Jarvis。完成後,他也向大家分享了他的心得。而本文作者覃超是前Facebook工程師,針對Jarvis AI做了一篇Code Review。(責任編輯:黃筱雯)

https://www.facebook.com/notes/mark-zuckerberg/building-jarvis/10154361492931634

https://www.youtube.com/watch?v=LZ8x433H5sE

帖子頭圖是一段 Jarvis 的代碼。作為一個技術流作者,我在最後的附錄解讀那段代碼:

文章開頭Zuck先敘述了自己編寫Jarvis的心路歷程:

這個技術架構如下:一個 Jarvis server 在服務端跑,上面主要是做語言處理、語音識別和人臉識別 (Zuck家的大門需要用)。

輸入端為各種家用硬體,也就是上圖中左邊那一列,依次是:

1. Crestron:Crestron Home Automation for SmartHome 此為美國最著名的智能家居控制器的廠商,專門提供一整套硬體和技術方案讓愛折騰的老美實現這些功能:

“Alexa, turn on the kitchen lights”

“Alexa, raise the living room lights by fifty percent”

“Alexa, set the basement thermostat to 70 degrees”

黑人臉 -_- 這也能解釋為什麼在網上看到的智慧家庭的影片來來回回都是這幾個控制指令。

2. Lights:燈

3. Thermostat:調溫度的

4. Doors:門和門禁系統

5. Sonos:老美喜歡的智能音響品牌:Sonos PLAY:1 Compact Wireless Smart Speaker for Streaming Music (White)

6. Spotify:美國版的網易雲端音樂。Spotify由Sean Parker創立(前Facebook CEO和聯合創業人之一;也就是在《社交網絡》電影裡抽大麻的那個。注意:大麻在美國一些州已經合法,另外它的成癮性和危害都小於香煙),Spotify和Facebook關係很好,在2011年深度集成在Facebook中。

7. Cameras:攝影鏡頭

8. Toaster:老美耿直,早餐都吃的是toast,這個機器用來加熱它,然後塗點果醬和黃油,就是一頓豐盛的早餐。

9. T-shirt cannon:T恤加農炮。很多讀者這時估計無解了,問:「小魔王同學,你是不是說錯了?祖克伯沒事在家裡放一個加農炮幹嘛?」 對的,其實他的衣櫃裡安裝了一個T恤的發射器,可以直接把T恤噴射出來,打到他的手裡。

架構圖裡的右側為三個用戶系統:messenger bot、語音app和門禁攝影鏡頭。接下來小扎說了他一步步是如何走過來的:

第一章:連接家裡的家具設備。

這塊Zuck(編按:指Facebook CEO Mark Zuckerberg)坦言做這個AI家庭系統比跑365英里的任務要稍微簡單一些(至少少費時),但是最麻煩的環節就是連接這些家裡的各種設備。他甚至需要「逆向工程」一些硬體設備的API(比如燈和音響),使得可以通過程序來控制它們。Toaster換了一個1950年的硬體,另外Zuck還專門給Beast(Zuck的狗)的餵食器以及T恤的彈射炮做了硬體的改動。

由此可見以後IoT(物聯網)的重要性和前景。

第二章:自然語言處理

分為兩部分:文字消息處理和語音處理。前者處理的難度是同義詞和上下文,而後做音樂控制的時候發現播放指令的處理更加麻煩,比如:

「播放周杰倫」:這句命令在處理的時候要判斷周杰倫到底是人還是歌名;另外Zuck的例子:

“Play someone like you”, “Play someone like Adele”,前者是歌名,後者則是進行類似風格的歌曲推薦。Zuck通過不斷訓練和加強Jarvis AI,使得它現在對於Zuck的歌曲喜好有記憶和認知,所以Zuck一般直接說:“Play me some music”。Jarvis便直接開始播放,另外Zuck有時心情不對的時候,想聽輕音樂,便說:“that’s not light, play something light”,Jarvis自己換歌曲並且學習。

第三章:視覺和面部識別

人的大腦有1/3的部分專門用來做視覺處理,包括圖像、模式識別和追蹤。Zuck的房子門禁同樣也需要支持視覺和面部識別功能:

這部分在AI領域一直是發展前沿,所以有不少現成的model和開源框架。Facebook之前就開放了一套API來判斷這個圖片裡是否有你FB好友,以及將面部位置可以從圖片中定位出來。

Zuck為了做智慧門禁,在大門口裝了好幾個攝像頭,為了可以更好地捕捉人臉圖片。Jarvis系統24小時不斷進行人臉探測和識別,當有人且是Zuck好友的時候,給Zuck發消息詢問是不是想見的人。

AI視覺還幫助Jarvis做其他事情,比如看Max(Zuck女兒)是否睡醒,如果醒了的話,Jarvis邊自動開始播放Max喜歡的歌曲或者給Max上中文課(從小開始學習中文 -_-)。另外借助視覺系統,可以更加有效地知道家裡的人的所在位置,這對於更好地執行有上下文的指令有巨大幫助。比如當有人說:“Turn on the lights”,肯定最佳的動作是打開此人所在位置的燈。

第四章:Messenger bot

老外現在喜歡用 bot,所以Zuck把各種操作指令都放在手機上,具體說來是 Facebook messenger 的 bot上(類似於Slack的bot或者微信的一個公眾號)。於是Zuck只需要像這個公眾號發消息即可。如下圖:

Zuck介紹用 messenger bot 開發的各種便利之處,它比起做一個app來更輕,更容易跨平台,同時也不同處理push、啟動、註冊等一系列繁瑣routine的事情。平時Zuck可以通過發文字或者語音消息(原文:audio clip,這個功能是小魔王我當年親手做的~ :D)。

然後Jarvis AI將其發送到server上, 進而開始做文字或者語音處理,提煉出需要執行的指令來操作Zuck家。同時Jarvis AI還會主動發消息給Zuck,比如有人在門口時,Jarvis會把照片和識別出的人的信息發給Zuck,讓他確認是否是自己要見的人。

Zuck自己沒有料想到的是:平時和Jarvis的交流大部分都是通過文字信息,雖然開始Zuck以為自己會是說話為主,但是後來發現text更加方便更加能保護個人隱私,不打擾別人。這從一個側面也能反應出來 voice message 在北美的messenger流行不起來的一個重要原因:隨著社會進步,人會越來越重視隱私或是變得有些緘默。

Zuck還透露不管是FB messenger還是WhatsApp上也看出類似的趨勢:文本信息的消息數量遠比語音消息增長得快。這裡給做AI的各位公司一個啟示:雖然現在語音識別仿佛是標配,但是AI系統可能更加需要注意在文本處理上的成熟度,因為人們會大量使用文本控制而不是之前設想的語音控制。雖然後者讓PM或者CEO覺得好像是更便捷更cool的人機互動方式。

第五章:語音處理

Zuck當然也做了語音識別的模塊來輔助控制 Jarvis:

上圖中的指令就是控制衣櫃中的「加農炮」給自己發射T恤(具體可以參考後面的影片)。這個app是 Zuck專門做的iOS app來進行語音識別和理解的。之所以做一個全新的app,而不是用messenger bot,是因為在messenger裡打開語音消息需要太多的步驟,有點繁瑣。而Zuck的使用場景是希望把手機放在桌上,自己可能幹其他事,而手機一直在那裡聽著。這種使用方式有點類似Amazon Echo:Amazon Echo – Amazon Official Site – Alexa-Enabled

Zuck說之前開發iOS還是在2012年,現在再次開發,他感受到整個iOS和FB的toolchain的改進巨大,語言和xcode的增強使得編程和做app的門檻大大降低。

通過開發和使用這個voice app,Zuck對於AI和語音識別在產品上的思考:

語音識別的算法在上下文和聯想方面需要加強得還不少;類比人類進行語音識別的時候,不僅在聽你當前說什麼並記下來,同時要時刻在預測你接下來准備說什麼,大腦表現得非常自然而且高效。而計算機,即使最近開始使用RNN(recurrent neurol network)好了不少,但是依然有很大的提升空間;

語音識別現在在理解人類的支離片語上表現不佳,另外對於常規情況下使用的語音識別能力比較弱。大部分的系統都在做特別功能範圍(比如Google Search, Amazon Echo)內的語音識別。

語音的加入讓產品和人之間更加有情感交流,Zuck覺得這肯定是以後產品發展的方向。能用語音進行交流之後,Zuck自己越用越覺得有意思,然後開始改進Jarvis,讓其變得更加幽默有趣。還加入了一些遊戲和黑話給Jarvis。

語音的識別和運用方面,zuck認為可以做的創業才剛剛開始。(所以各位抓住機會!)

第六章:Facebook的工程師環境

這一段,Zuck說自己雖然是CEO,但是從未停止過coding,但主要以個人項目為主。通過這次開發 Jarvis,Zuck又重新體會了一次整個FB的技術環境的魅力,就類似於一個新入職的工程師一樣走完了整個bootcamp的過程。他說不僅上手實踐AI和了解了最新AI方面的進展,同時意外收獲了很多關於開發技術方面的知識。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歡迎開發者都來使用下這些開源庫,來感受下AI最新發展的魅力。另外他一直堅持內部工具和技術的基礎設施對於一個互聯網公司的重要性,所以最後他說:“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.”

所以這裡可以看出,矽谷公司把技術部門真真切切地當做是公司的重要資產,去鼓勵去培養;而國內很多公司對於技術團隊,更多當成是一種工具,甚至是開支部門。所以各位想單純醉心於技術鑽研的人,早點去矽谷是一條最好的出路。

第七章:下一步

Zuck的文章到了這裡,已經進行到了尾聲。Zuck說雖然2016年的挑戰已經結束,但是對於Jarvis的開發和優化會繼續。具體需要做:

  • 開發Android下的語音識別app
  • 接入更多的室內硬體和更多的應用
  • 讓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!)

最後Zuck準備再抽像一層自己的代碼,然後在明年將其開源(接受小魔王覃超的進一步code review :-D)

第八章:結論

關於結論這部分,Zuck原文相當得精煉且有意義,我實在覺得應該把英文貼上來,各位都能閱讀一下:

“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的執行力以及實踐能力。一方面通過寫Jarvis來親自學習了一下AI現在的最近進展,另一方面這種第一手經驗很好地反饋回來讓他更加有信心來判斷以後5-10年AI和相關產品的發展方向。我覺得我自己以及中國的廣大創業者特別是投資人都應該學習這種實幹的態度,而不是停留在嘴皮上預測未來。

Zuck認為電腦智能在某些領域做得已經很好,但是最關鍵的「自學能力」和「舉一反三」能力幾乎沒有(原文: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個小時,也無法讓機器能夠有自學能力,除非在人工智慧領域可以有學術、科學上的重大突破。

從demo影片裡來看的話,很多時候Jarvis感覺並不好用。但是畢竟能夠用messenger+聲音來控制自己的家庭設備是一件非常酷炫的事情。

—- 附帶圖片中代碼的解讀 —-

這段代碼是用PHP外加Facebook的FBT寫就,總體邏輯:將異步task設置好(其中一個task就是做圖片的人臉識別),另外從AI API中取得並設置好config,最後調用接口並且等待結果。

其中代碼細節:

從代碼邏輯來看,這應該是Jarvis的源代碼。從代碼細節看,作者的水平還行,但也不夠完美。可以看出邏輯清晰但是代碼功力不太夠 -_-。 這也合情合理,畢竟Zuck沒時間保持一個高頻次寫代碼的狀態,所以肯定是「三天不寫手生」。舉例來說(如果嚴格的code review的話;哈哈!給Zuck做code review真是三生有幸!):

1.最開始兩行:$task這個變量不需要,直接往 “image” => … 這裡灌即可;而且 $task 這個太泛的名字也沒有具體含義。要不就改成:$face_detect_task,當然最好就直接放入map裡算了。

2.

這兩句寫得一般,看起來有點學生時代寫大作業的代碼的風格;同名變量反復使用,另外對於null的檢查不對稱。

3. 

看到這段代碼,我想很多程序員會哭笑不得。首先代碼邏輯有點hacky,初步判斷應該是 JARVIS_FACEREC 沒來得及完成。。。所以趕鴨子上架暫時用 RC_MODEL 來頂上;畢竟馬上就Christmas和新年了,Zuck沒做完也要先趕在deadline之前發布嘛。

注意!我覺得這個態度和做事方式才是對的,不要拖,也不要等到完美的時候才發布,因為一個項目一個作業永遠都無法達到你想要的完美狀態。正如Zuck自己之前在Facebook裡強調:“Done is better than perfect!”

4.

idx是一個helper method,其實就等於 $api_config[‘detection_tier’],但是用idx的好處是如果 $api_config 為空,那麼 idx 不會崩潰,而是返回null,而 $api_config[‘detection_tier’] 直接觸發異常。所以這裡回頭看,Zuck的80行寫得並不好,最好寫成:$api_config = idx(api_config, ‘facer’); 對了,idx還可以支持第三個參數,就是默認值;如果這個key在map中沒有的話,就直接返回默認值。

5.

這句是技術含量最高的一句。FaceDetectRequestConfig::gen,這裡gen代表generator,由於歷史原因,Facebook的代碼用的是generator,所以異步操作就起名gen;但是這裡用的是新的 resumable function;也就是 ::gen 返回一個 awaitable object(類似promise,如果你玩js或者其他語言),然後前面的await就將異步操作出發執行,最後得到從 detection_tier 來的 config。

具體關於 async & await,以及 resumable function 可以參考:https://goo.gl/bzA4kR(這裡PHP中的resumable function是Facebook自己做的語法加強;C#裡一直就有,而C++會在下一代的C++1y裡引入 resumable function)。

6.print “Configured…n” 這句話太萌,典型的學生項目代碼。

類似於: console.log(xxx) 或者 System.out.println(“Configured…) 或 NSLog(@”Configured…”); 要是公司項目的代碼這麼寫,估計要被tech lead直接罵死。

不過這裡Zuck敢於自己動手開始寫代碼,並且最後可以有一個prototype上線開始能夠使用,已經非常厲害了(畢竟很多CEO一天到晚忙除了開會,幾乎什麼都做不了)。

最後Zuck那段代碼的最佳形態是:

延伸閱讀

憑一己之力打造智慧管家 Jarvis,臉書 CEO 表示:就像當初學中文一樣有挑戰
Mark Zuckerberg 實踐他的 2016 承諾:《鋼鐵人》的智慧管家「Jarvis」被他做出來了!
解密臉書創辦人 Mark Zuckerberg 年度挑戰:他如何用 100 小時開發出人工智慧系統?

(本文經合作夥伴雷鋒網授權轉載,並同意 TechOrange 編寫導讀與修訂標題,原文標題為〈Facebook早期員工評價扎克伯格的Jarvis AI代碼——富可敵國之後尚能飯否? | 深度〉。首圖來源:TechCrunch,CC licensed)