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

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

My personal challenge for 2016 was to build a simple AI — like Jarvis in Iron Man. Now that it's working and the…

Posted by Mark Zuckerberg on Monday, 19 December 2016

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)

點關鍵字看更多相關文章: