演算法的強大
1. iPhone 現在的拍照直出演算法到底有多強
實際上,主流手機廠商的攝像頭供貨商就是那麼幾家。而 Sony 就是 iPhone 的主要攝像頭供貨商的一家。(另外一家是 omnivision ,他也向三星供貨) 但是無可否認,近幾代 iPhone 實際使用中的拍照效果是超越同期的 Sony 和 三星 的手機的。類似甚至一樣的攝像頭,結果有差的原因如下: 1 低像素 市場有個極為腦殘的認識,就是像素越高拍照效果越好。而事實是,至少 iPhone5 的時期, 1200 萬,無法超越 800 萬。 但是 Sony 和 三星 這樣的日韓廠家沒有對用戶說不的勇氣。你們想要高像素?我就給你。 而蘋果敢:蘋果在攝像頭的選擇上總是青睞低像素。還記得喬布斯在 iPhone4(?) 發布會上計算單個像素大小的 keynote 嗎?他就是想告訴用戶,高像素並不一定有好的效果。 可惜強勢如喬布斯,其實也沒有扭轉市場的認識。只懂小學算數的消費者,還是熱衷於比較像素多少。今天這個腦殘認識仍然深入人心。好在, iPhone 出色的單個像素質量為一張優秀的照片提供了更多保障, 他的拍照效果慢慢得到了用戶的認可。(但是不可否認,一部分重視拍照的用戶可能因為像素少,去買了 Sony 。) 2 軟體優化 不同的廠家拿到攝像頭,會通過軟體調整各種功能和出片效果。這方面就見功力了。 蘋果在 Mac 上做了多年圖像處理軟體,這方面的水準是足夠的。(白平衡,銳度,噪點。。。) 而自己掌控的系統也應該讓他更容易優化相機的各種功能。(快門延遲,對焦速度。。。) Android 廠家一般是買第三方的軟體演算法和功能自己集成。各種調整上感覺沒有 iOS 細致用心。 (吃透一個攝像頭的特性是需要時間的,他們出機的頻率也不允許) 3 屏幕配合 蘋果的軟體調整再出色,比如他調整出了一流的白平衡,屏幕不給力也都白搭。 而 iPhone 搭載的是業界最高水準的屏幕。蘋果絕不會拿偏色嚴重的」未來」技術忽悠用戶。因為所有在攝像頭,軟體上下的功夫,都必須通過屏幕表現出來。 4 最後的話 所以,蘋果真的是良心企業。 他既不會利用消費者在像素多少上面的無知,也不會在消費者看不到的演算法調整上偷懶,也不會讓消費者為半成品的屏幕技術埋單。 他所有的努力,都指向一個單純的結果,他的手機用戶對著家人按下快門的時候,可以留下一個美好的回憶。即使,為此犧牲營銷上的優勢,也在所不惜。 所以蘋果能贏得我的尊敬,因為作為業內人士,我知道抵禦銷量的誘惑為用戶做這種受累不討好的事情有多難。
2. 人工智慧有強大的演算法不會出錯對嗎
不對。藍皮書指出:「人工智慧演算法並不是萬能的。」其准確度並無法達到百分之百,它向用戶提供的信息有可能存在偏差桐姿。所以人工智慧有強大的演算法不會出錯是不對的,依靠演算法的掘橘人工智慧,對人工輸入的原始數據准確局散絕性要求極高,如果原始數據出錯,則演算法生成的產品就會出錯。
3. 人工智慧有強大的演算法,一定不會出錯對嗎
不對。
人類是不完美的無法超越大自然,也必然設計不錯完美的不會出錯的人工智慧,因此不如接受這個現實,人工智慧必然會出錯,就像人類會生病一樣。
人工智慧,英文縮寫為AI。它是研究、開發用於顫蔽渣模擬、延伸和擴展人的智能的理論、方法、技術及應用系統的一門新的技術科學。人工智慧是計算機科學的一個分支,它企圖了解智能的實質,並生產出一種新的能茄悄以人類智能相似的方式做出反應的智能機器,該領域的研究包括機器人、語言識別、圖像識別、自然語並殲言處理和專家系統等。
4. 大數據時代 無處不在的演算法應用
大數據時代 無處不在的演算法應用
能不能講講演算法在工作中的運用?你個人學習演算法的過程是怎樣的?我對演算法還是有點怕。除此之外,你認為大學是應該多花時間學應用技術還是理論知識呢?
今天就來聊聊我自己學習演算法的過程,以及演算法在實際工作中的應用。
以前,我們認為大數據總是優於好演算法。也就是說,只要數據量足夠大,即使演算法沒有那麼好,也會產生好的結果。
前一陣子「極客時間」 App 發布了一條極客新聞:「演算法比數據更重要,AlphaGo Zero 完勝舊版。」新聞的內容是谷歌人工智慧團隊 DeepMind 發布了新版的 AlphaGo 計算機程序,名為 AlphaGo Zero。這款軟體能夠從空白狀態開始,不需要人類輸入任何命令,便可以迅速自學圍棋,並以 100 比 0 的戰績擊敗了上一代 AlphaGo。
AlphaGo Zero 最大的突破在於實現了「白板理論」。白板理論認為:嬰兒是一塊白板,可以通過後天學習和訓練來提高智力。AI 的先驅圖靈認為,只要能用機器製造一個類似於小孩的 AI,然後加以訓練,就能得到一個近似成人智力,甚至超越人類智力的 AI。
自學成才的 AlphaGo Zero 正是實現了這一理論。AlphaGo 的首席研究員大衛·席爾瓦(David Silver)認為,從 AlphaGo Zero 中可以發現,演算法比所謂的計算或數據量更為重要。事實上,AlphaGo Zero 使用的計算要比過去的版本少一個數量級,但是因為使用了更多原理和演算法,它的性能反而更加強大。
由此可見,在大數據時代,演算法的重要性日漸明晰。一個合格的程序員,必須掌握演算法。
我不知道大家是怎樣一步步開始精通演算法和數據結構的。大二時,我第一次接觸到了《數據結構》,因為從來沒有過這方面的思維訓練,當時的我學習這門課比較費力。那時候接觸到的編程比較少,所以並沒有很多實際經驗讓我欣賞和體味:一個好的數據結構和演算法設計到底 「美」 在哪裡。
開始學習的時候,我甚至有點死記硬背的感覺,我並不知道 「如果不這樣設計」,實際上會出現哪些問題。各種時間和空間復雜度對我而言,也僅僅是一些不能融入到實際問題的數學游戲。至於「每種最壞情況、平均情況的時間空間復雜度與各種排序」,這些內容為什麼那麼重要,當時我想,可能因為考試會考吧。
沒想到後來的時日,我又與演算法重新結緣。可能是因為萊斯大學給的獎學金太高了,所以每個研究生需要無償當五個學期的助教 。好巧不巧,我又被演算法老師兩次挑中當助教。所以,在命運強制下,一本《演算法導論》就這樣被我前前後後仔細學習了不下四遍。這樣的結果是,我基本做過整本書的習題,有些還不止做了一遍。我學習演算法的過程,就是反復閱讀《演算法導論》的過程。
那麼,學習演算法到底有什麼用處呢?
首先,演算法是面試的敲門磚國內的情況我不太清楚,但就矽谷的 IT 公司而言,不但電話面試偏演算法,現場面試至少有兩輪都是考演算法和編程的。
大一些老一些的公司,像谷歌、Facebook、領英、Dropbox 等,都是直接在白板上寫程序。小一些新一些的公司,如 Square、Airbnb 等,都是需要現場上機寫出可運行的程序。Twitter、Uber 等公司則是白板上機兼備,視情況而定。
雖說還有其它考系統設計等部分,但如果演算法沒有打好基礎,第一關就很難過,而且演算法要熟悉到能夠現場短時間內寫出正解,所以很多人准備面試前都需要刷題。
有一次我當面試官,電話面試另外一個人,當時是用 Codepad 共享的方式,讓對方寫一個可運行的正則表達式解析器。45 分鍾過去了,對方並沒有寫出來。我就例行公事地問:「你還有什麼問題想問或者想了解么?」 對方估計因為寫不出程序很有挫敗感,就反問:「你們平時工作難道就是天天寫正則表達式的解析器么?」
一瞬間,我竟無言以對。想了想,我回復說:「不用天天寫。那我再給你 15 分鍾,你證明給我看你還會什麼,或者有什麼理由讓我給你進一步面試的機會?」 對方想了一會,默默掛掉了電話。
老實說,我對目前面試中偏重演算法的程度是持保留意見的。演算法題答得好,並不能說明你有多牛。牛人也有因為不願刷題而馬失前蹄的時候。但是除了演算法測試,顯然也沒有更好的方法佐證候選人的實力;然而怎樣才能最優化面試流程,這也是個討論起來沒完的話題,並且每次討論必定無果而終。
其次,編程時用到的更多是演算法思想,而不是寫具體的演算法說到實際工作中真正需要使用演算法的機會,讓我想一想 —— 這個范圍應該在 10% 的附近遊走。
有些朋友在工作中遇到演算法場景多些,有的少些。更多的時候,是對業務邏輯的理解,對程序語言各種特性的熟練使用,對代碼風格和模式的把握,各種同步非同步的處理,包括代碼測試、系統部署是否正規化等等。需要設計甚至實現一個演算法的機會確實很少,即使用到,現學可能都來得及。
但是熟悉基本演算法的好處在於:如果工作需要讀的一段代碼中包含一些基本演算法思想,你會比不懂演算法的人理解代碼含義更快。讀到一段爛代碼,你知道為什麼爛,爛在哪,怎麼去優化。
當真的需要在程序中設計演算法的時候,熟悉演算法的你會給出一個更為完備的方案,對程序中出現的演算法或比較復雜的時間復雜度問題你會更有敏感性。熟悉演算法你還可以成為一個更優秀的面試官,可以和別的工程師聊天時候不被鄙視。
最後,不精通演算法的工程師永遠不是好工程師當然,除了演算法導論中那些已成為經典的基本演算法以及演算法思想(Divide-and-conquer,Dynamic programming)等,其實我們每天接觸到的各種技術中,演算法無處不在。
就拿人人都會接觸的存儲為例吧,各種不同的資料庫或者鍵值存儲的實現,就會涉及各種分片(Sharding)演算法、緩存失敗(Cache Invalidation)演算法、 鎖定(Locking)演算法,包括各種容錯演算法(多復制的同步演算法)。 雖然說平時不太會去寫這些演算法 —— 除非你恰恰是做資料庫實現的 —— 但是真正做到了解這項技術的演算法細節和實現細節,無論對於技術選型還是對自己程序的整體性能評估都是至關重要的。
舉個例子,當你在系統里需要一個鍵值存儲方案的時候,面對可供選擇的各種備選方案,到底應該選擇哪一種呢?
永遠沒有一種方案在所有方面都是最佳的。就拿 Facebook 開源的 RocksDB 來說吧。了解它歷史的人都知道,RocksDB 是構建在 LevelDB 之上的,可以在多 CPU 伺服器上高效運行的一種鍵值存儲。而 LevelDB 又是基於谷歌的 BigTable 資料庫系統概念設計的。
早在 2004 年,谷歌開始開發 BigTable,其代碼大量的依賴谷歌內部的代碼庫,雖然 BigTable 很牛,卻因此無法開源。2011 年,谷歌的傑夫·迪恩和桑傑·格瑪沃爾特開始基於 BigTable 的思想,重新開發一個開源的類似系統,並保證做到不用任何谷歌的代碼庫,於是就有了 LevelDB。這樣一個鍵值存儲的實現也用在了谷歌瀏覽器的 IndexedDB 中,對於谷歌瀏覽器的開源也提供了一定的支持。
我曾經在文章中提到過 CockroachDB,其實又可以看作是基於 RocksDB 之上的一個分布式實現。從另一個層面上講,CockroachDB 又可以說是 Spanner 的一個開源實現。知道這些,就知道這些資料庫或鍵值存儲其實都同出一系。再來看看 LevelDB 底層的 SSTable 演算法,就知道他們都是針對高吞吐量(high throughput),順序讀 / 寫工作負載(sequential read/write workloads)有效的存儲系統。
當然,一個系統里除了最基本的演算法,很多的實現細節和系統架構都會對性能及應用有很大的影響。然而,對演算法本身的理解和把握,永遠是深入了解系統不可或缺的一環。
類似的例子還有很多,比如日誌分析、打車軟體的調度演算法。
拿我比較熟悉的支付領域來說吧,比如信用卡 BIN 參數的壓縮,從服務端到移動 App 的數據傳輸,為了讓傳輸數據足夠小,需要對數據進行壓縮編碼。
每個國家,比如中國、韓國、墨西哥信用卡前綴格式都不一樣,如何盡量壓縮同時又不會太復雜,以至於影響移動 App 端的代碼復雜度,甚至形成 Bug 等,也需要對各種相關演算法有詳盡地了解,才有可能做出最優的方案。
關於演算法我們來總結一下:
在大數據時代,數據和演算法都同等重要,甚至演算法比計算能力或數據量更為重要。
如何學習演算法呢?讀經典著作、做題,然後在實踐中閱讀和使用演算法。
演算法是面試的敲門磚,可以幫助你得到一份自己喜歡的工作。
寫程序中用到的更多是演算法思想,不是寫具體的演算法。
不精通演算法的工程師永遠不會是一個優秀的工程師,只有對各種相關演算法有詳盡理解,才有可能做出最優的方案。
5. 人工智慧有強大的演算法不會出錯對還是錯
人工智慧有強大的演算法不會出錯是錯誤的談搭。根據查詢相關公開信息顯示:人畢則工智能會犯錯,而且一旦犯錯,往往會導致巨大的手侍棚危險。