機(jī)器之心整理
編輯:杜雪
4 月 15 日,楊銘博士在機(jī)器之心線下活動(dòng) Interface 上做了一次題為「深度神經(jīng)網(wǎng)絡(luò)在圖像識(shí)別應(yīng)用中的演化」的演講。這篇文章對(duì)楊銘博士分享的內(nèi)容進(jìn)行了整理,同時(shí)還附有添加了字幕的視頻,希望能為大家學(xué)習(xí)圖像識(shí)別提供幫助。
地平線機(jī)器人技術(shù) ( Horizon Robotics ) 聯(lián)合創(chuàng)始人&軟件副總裁楊銘博士畢業(yè)于清華大學(xué)電子工程系并獲得工學(xué)學(xué)士和碩士學(xué)位,于美國(guó)西北大學(xué)電氣工程與計(jì)算機(jī)科學(xué)系獲得博士學(xué)位。楊銘博士是 Facebook 人工智能研究院創(chuàng)始成員之一,曾任 NEC 美國(guó)研究院高級(jí)研究員,專注于計(jì)算機(jī)視覺(jué)和機(jī)器學(xué)習(xí)領(lǐng)域研究,包括物體跟蹤、人臉識(shí)別、海量圖片檢索、及多媒體內(nèi)容分析。在頂級(jí)國(guó)際會(huì)議 CVPR/ICCV 發(fā)表論文 20 余篇。在 Facebook 工作期間負(fù)責(zé)的深度學(xué)習(xí)研發(fā)項(xiàng)目 DeepFace。多次擔(dān)任 CVPR/ICCV/NIPS/ACMMM 等頂級(jí)國(guó)際會(huì)議程序委員會(huì)成員,T-PAMI/IJCV/T-IP 等頂級(jí)國(guó)際期刊審稿人,申請(qǐng)獲得美國(guó)專利 14 項(xiàng)。2015 年,楊銘博士回國(guó)加入地平線機(jī)器人技術(shù)。
下面是添加了字幕的視頻,以及演講內(nèi)容整理:
大家下午好!我是地平線機(jī)器人的楊銘,非常高興有這樣一個(gè)機(jī)會(huì)跟大家交流和分享。首先感謝機(jī)器之心的邀請(qǐng),更加感謝大家在這樣一個(gè)風(fēng)和日麗、周六的下午來(lái)到這里,聽(tīng)我的分享。
深度神經(jīng)網(wǎng)絡(luò)這幾年非?;馃幔〉昧撕芏嗉夹g(shù)突破。其中最關(guān)鍵的是深度網(wǎng)絡(luò)的網(wǎng)絡(luò)結(jié)構(gòu),網(wǎng)絡(luò)模型本身具有很強(qiáng)的建模能力,能夠完成很多任務(wù),每項(xiàng)任務(wù)也都有很好的結(jié)果。網(wǎng)絡(luò)模型本身也經(jīng)歷了一些發(fā)展,從 80 年代一直到現(xiàn)在。我想把發(fā)展的過(guò)程和一些設(shè)計(jì)的考慮跟大家分享一下。
今天這個(gè)分享不只是我一個(gè)人的總結(jié),也包括我的同事黃暢博士。黃暢博士也是地平線機(jī)器人聯(lián)合創(chuàng)始人,負(fù)責(zé)算法方面。之前在清華大學(xué)計(jì)算機(jī)系讀博,之后去南加州大學(xué)做博士后。我們?cè)诠韫取⒃?NEC Lab 當(dāng)過(guò)一段時(shí)間的同事。后來(lái)他去了百度深度學(xué)習(xí)研究院擔(dān)任主任架構(gòu)師,現(xiàn)在負(fù)責(zé)地平線的算法研發(fā)工作。
還有一位合作者是羅恒博士,在蒙特利爾大學(xué)做過(guò)博士后,后來(lái)去了百度深度學(xué)習(xí)研究院工作,目前在地平線負(fù)責(zé)圖像算法的研發(fā)。
簡(jiǎn)單說(shuō)一下我的背景。我在清華電子系讀的本科和碩士,當(dāng)時(shí)做的是視頻編碼。2000 年左右的時(shí)候,視頻編碼以及 4G 通信是比較火的項(xiàng)目。我讀完碩士之后就去了美國(guó)西北大學(xué)讀博士,那個(gè)時(shí)候轉(zhuǎn)向了計(jì)算機(jī)視覺(jué)、機(jī)器學(xué)習(xí)。畢業(yè)后就去了硅谷,跟黃暢做了同事。后來(lái)他們回國(guó),先去了百度,創(chuàng)立了百度深度學(xué)習(xí)研究院,我去了 Facebook,F(xiàn)acebook 那幾年決定加大投入做 AI 相關(guān)的研發(fā)。
2013 年的 8、9 月份,我們成立了 Facebook AI research,開(kāi)始叫做 Facebook AI Lab。當(dāng)年 12 月份的 NIPS 上,Yann LeCun 被 Mark 說(shuō)服后就加入了我們。之后改名為 Facebook AI Research。在 Facebook,我主要負(fù)責(zé)的人臉識(shí)別后端系統(tǒng)跟算法。2015 年,我回國(guó)和余凱、黃暢一塊創(chuàng)立了地平線機(jī)器人。這一波 AI 浪潮來(lái)勢(shì)兇猛,我們想在這個(gè)浪潮之中,順應(yīng)歷史發(fā)展潮流,做一些事情。
這可能是我之前做的比較重要的工作,就是人臉識(shí)別。我的感覺(jué)是說(shuō),深度學(xué)習(xí)開(kāi)始在 ImageNet 做的非常好,在人臉識(shí)別也表現(xiàn)的非常好。我們之前做的人臉識(shí)別工作,DeepFace 是第一次把深度學(xué)習(xí)在互聯(lián)網(wǎng)上應(yīng)用、落地的產(chǎn)品。我們?cè)?2013 年底差不多做完的,2014 年上線。
當(dāng)時(shí) DeepFace 每天處理 Facebook 上大約 4 億張人臉識(shí)別,現(xiàn)在應(yīng)該更多了?;旧厦恳粡埳蟼鞯?Facebook 的人臉會(huì)先經(jīng)過(guò)一個(gè)人臉檢測(cè),再進(jìn)行后端的比對(duì)識(shí)別,向用戶推薦一下說(shuō)這是不是人臉。如果我們識(shí)別出來(lái)了之后,就會(huì)打一個(gè)名字,如果沒(méi)有識(shí)別準(zhǔn)的話,我們可能會(huì)列 4、5 個(gè)選項(xiàng)。如果說(shuō)我們比較有把握,F(xiàn)acebook 就會(huì)把照片向用戶的朋友推薦或者發(fā)一些消息,提高用戶的活躍度。
這個(gè)工作我們只敢說(shuō)接近人眼的性能,后來(lái)很多人它說(shuō)超過(guò)了人的能力,但我覺(jué)得還沒(méi)到完全超過(guò)人的能力那個(gè)程度,還是有一定的差別。因?yàn)橛?jì)算機(jī)非常適合在大規(guī)模的情況下做人臉識(shí)別,這其中還有一些限制,需要人臉偏正面、偏清晰。但是對(duì)于人說(shuō),如果是熟悉的親戚、朋友,甚至你看到一個(gè)背影,看到一點(diǎn)點(diǎn),看到一撇,就可以看出這個(gè)人是誰(shuí)。
整體來(lái)講,在一定規(guī)模下的人臉識(shí)別,機(jī)器肯定超過(guò)人的水平,但是遇上非常難和極端的條件,機(jī)器可能還是不能達(dá)到人的水準(zhǔn)。這個(gè)工作是深度學(xué)習(xí)之后,人臉識(shí)別領(lǐng)域中應(yīng)用最多的工作,也被 Science 等很多媒體報(bào)道過(guò)。
再稍微簡(jiǎn)單介紹一下地平線機(jī)器人。地平線機(jī)器人成立于 2015 年 6 月,目前的總部在北京。我們?cè)谀暇┯醒邪l(fā)中心,另外在深圳、上海都有辦公室。在深圳,我們主要是做人工智能跟硬件相結(jié)合,在深圳是非常適合做硬件相關(guān)的生產(chǎn)的。我們上個(gè)月在上海剛剛成立了一個(gè)聚焦于汽車(chē)自動(dòng)駕駛方面研發(fā)的分公司,位于上海汽車(chē)城,產(chǎn)業(yè)很聚集,進(jìn)行相應(yīng)測(cè)試也非常方便。
主要的員工和同事來(lái)自于百度、Facebook。我們硬件團(tuán)隊(duì)主要來(lái)自于 NOKIA,也有很多同事來(lái)自于微軟、TI 和英偉達(dá)。目前我們還是偏研發(fā)的公司,超過(guò) 80% 的同事都是在做算法、軟件硬件研發(fā)的工作。很多人有海外求學(xué)的經(jīng)歷,14-15% 是有博士學(xué)位的。
目前我們所做的事情主要是希望把深度學(xué)習(xí)的方法跟硬件相結(jié)合,跟嵌入式系統(tǒng)相結(jié)合,能夠成功落地,影響大家生活。目前的主要目標(biāo)是希望通過(guò)十年、二十年的努力,能夠讓世界上上千種設(shè)備都具有智能的功能,讓大家生活更加安全、更加便捷、更加有序,具體來(lái)講我們現(xiàn)在聚焦一下幾個(gè)業(yè)務(wù)方向:
第一個(gè),自動(dòng)駕駛或者智能汽車(chē)。這個(gè)方向大家也有所了解,這幾年非常火熱,不斷有大新聞曝出來(lái)。我們相信這個(gè)領(lǐng)域不僅僅可以國(guó)家整個(gè)社會(huì)的運(yùn)行、整個(gè)社會(huì)的生活,而且也是人工智能能夠發(fā)揮很大作用的場(chǎng)景。
第二個(gè),智能家居或者智能生活。2015 年之前,大家聽(tīng)到的智能家居,歸結(jié)于一個(gè)詞就是 WIFI,家里的設(shè)備能夠進(jìn)行聯(lián)網(wǎng)控制,我們認(rèn)為其實(shí)這是不夠的,還是非常不方便的。大家在外出工作的時(shí)候,經(jīng)常會(huì)用手機(jī)溝通、打車(chē)。但是回家之后如果再掏出手機(jī),點(diǎn)開(kāi) APP,再找到幾個(gè)按紐,對(duì)家里的東西進(jìn)行操控,這是挺不方便,挺不自然的。在家里,人們希望手機(jī)可以放在一邊,能夠更自然地跟家里各種電器、各種設(shè)備交互,這是我們的第二個(gè)方向,能夠在智能家居的場(chǎng)景下,將人工智能鑲嵌到設(shè)備里面去,給大家提供更便捷的交互方式。
第三個(gè),智能安防或者智能安全。這是跟攝像頭相關(guān)的,也是一個(gè)很好的場(chǎng)景,能夠讓圖像識(shí)別技術(shù)真正地幫助大家,讓這個(gè)社會(huì)更安全,讓這個(gè)城市更安全。
這是我們主要做的三個(gè)業(yè)務(wù)方向??偟脕?lái)說(shuō),我們希望把人工智能、深度學(xué)習(xí)、深度網(wǎng)絡(luò)這些技術(shù)放到嵌入式系統(tǒng)中去,提供一個(gè)從軟件到硬件,甚至到芯片的全套解決方案,幫助這些產(chǎn)品、設(shè)備都具有這種人工智能的功能。
我們公司叫做地平線機(jī)器人,但是我們對(duì)機(jī)器人的定義稍微有點(diǎn)不一樣。我們其實(shí)并不特別關(guān)注那些長(zhǎng)得很像人的,有手有腳,能跑能跳的機(jī)器人。我們認(rèn)為只要是一個(gè)機(jī)器,有感知環(huán)境,自主決策的功能,慢慢就發(fā)展成機(jī)器人。我們業(yè)務(wù)或者努力方向,更多是把大家生活中的設(shè)備變得更聰明,慢慢向機(jī)器人的方向發(fā)展。這是我們希望做的事情和正在做的事情。
我們從成立之后,也得到了很多世界知名 VC 的支持,包括晨興資本、紅杉資本、也包括李開(kāi)復(fù)老師。去年,我們完成了 A 輪融資。吳亞軍老師對(duì)我們也很支持,她是中國(guó)非常著名的女企業(yè)家;還有 YuriMiiner,他是硅谷里非常傳奇的俄羅斯大亨,他投資的早期 Facebook 等等公司,基本上屬于投了就能中的。
什么是人工智能?
我們大家經(jīng)常說(shuō)人工智能。但什么是人工智能,希望大家有一個(gè)共識(shí)和定義。如果我們查一查百科或者說(shuō)官方的權(quán)威定義,人工智能是學(xué)習(xí)和設(shè)計(jì)一種 Intelligent Agents 的學(xué)科。這個(gè) Agent 本身能夠感知環(huán)境,能夠采取一些行動(dòng),提高自己成功或者是做出一件事的機(jī)會(huì)。
這個(gè)定義本身有幾個(gè)點(diǎn)可以注意一下。首先是 Intelligent Agent 這個(gè)詞,這個(gè)詞語(yǔ)說(shuō)明能夠執(zhí)行 AI 的載體并不是一個(gè)簡(jiǎn)單的機(jī)器或者一個(gè)電腦,有可能是一個(gè)非常大規(guī)模的、非常抽象的,能完成這些功能的設(shè)備的集合,甚至可能并不是設(shè)備,而只是一些程序。總之,這是一個(gè)非常寬泛的詞。
另外,它能對(duì)環(huán)境主動(dòng)感知,采取行動(dòng),實(shí)現(xiàn)自己一定的目標(biāo)。這里包含三個(gè)含義,作為一個(gè) AI,首先對(duì)物理世界感知(sensing),sensing 之后,相當(dāng)于把這些獲得的信息納入數(shù)字化的世界,在數(shù)字化的世界之內(nèi)對(duì)這些信息進(jìn)行理解、分析、思考。重要的是最后一步,去反饋這個(gè)物理世界,做一些控制和行動(dòng),反過(guò)來(lái)影響物理世界,這是整個(gè) AI 系統(tǒng)和人工智能系統(tǒng)所具備的最全面的三個(gè)階段。
如果我們做的工作跟某一個(gè)階段相關(guān),我覺(jué)得這也是屬于 AI 的研究。這三個(gè)環(huán)境包括 Sensing 、Thinking、Acting,也包括了很廣的概念。比如說(shuō) PC 上網(wǎng),敲鍵盤(pán)打字,是把物理環(huán)境的信息輸入到了數(shù)字世界中,在比如當(dāng)攝像頭、麥克風(fēng),還有在汽車(chē)中的激光雷達(dá)或者是其它的傳感器,這些設(shè)備把我們物理世界的信號(hào)轉(zhuǎn)換到了計(jì)算機(jī)能夠處理的信號(hào)。在計(jì)算機(jī)的處理中,可以對(duì)這些數(shù)據(jù)進(jìn)行分類、搜索、排序,這些都是理解的過(guò)程。再之后,我們對(duì)這個(gè)世界有一個(gè)反饋,包括可以根據(jù)搜索的內(nèi)容,建議一些廣告,或者是對(duì)于語(yǔ)言的理解之后,比如說(shuō)要打車(chē)哪里,它可以自動(dòng)給你導(dǎo)航,也包括圖像或者人臉識(shí)別之后,也許可以讓大家找到你的名字,找到你的一些偏好,做一些科學(xué)化的設(shè)置,包括像無(wú)人機(jī)、無(wú)人車(chē)可以根據(jù)信號(hào)自主避障、尋徑,這是反饋到物理世界進(jìn)行控制。這些都是人工智能研究的方面。
這個(gè)不多說(shuō)了,確實(shí)很火,所有大公司還有一些政府都投入了很多的精力。谷歌原來(lái)是移動(dòng)為先的公司,后來(lái)說(shuō)要成為 AI 為先的公司,這個(gè)趨勢(shì)很多公司都看到了。Mobile 文化可能是一個(gè)很重要的浪潮了,下一個(gè)競(jìng)爭(zhēng)會(huì)升級(jí),升級(jí)到智能,比的是誰(shuí)自動(dòng)化的控制、自動(dòng)化數(shù)據(jù)分析能夠更快、更好。
稍微總結(jié)一下,為什么人工智能比較重要?從計(jì)算的角度可以看到,過(guò)去計(jì)算機(jī)的發(fā)展經(jīng)歷了大概兩個(gè)時(shí)代。2000 年-2010 年左右或者更早是 PC 互聯(lián)網(wǎng)時(shí)代。就是我們有電腦、網(wǎng)絡(luò),可以上網(wǎng)瀏覽。這個(gè)時(shí)代其實(shí)催生了比如說(shuō)像搜索引擎、門(mén)戶網(wǎng)站,催生了很多很偉大的公司,這是一個(gè)時(shí)代。
第二個(gè)時(shí)代是我們正在經(jīng)歷了的移動(dòng)互聯(lián)網(wǎng)時(shí)代,手機(jī)的發(fā)展以及 4G 網(wǎng)絡(luò)通訊的發(fā)展。手機(jī)我們幾乎是離不開(kāi)的,每天不知道有多少比例的時(shí)間花在手機(jī)上看消息、去打車(chē)、找路、看小說(shuō)、看電影。
未來(lái)會(huì)是什么樣的時(shí)代?大家看到互聯(lián)網(wǎng)催生了很多公司,比如說(shuō)高通、蘋(píng)果這些公司在那個(gè)時(shí)代做的很好,現(xiàn)在移動(dòng)互聯(lián)網(wǎng)的發(fā)展已經(jīng)比較成熟了,機(jī)會(huì)可能并不像 5 年前那么多了。再往下看,我相信這個(gè)時(shí)代還沒(méi)有結(jié)束,還會(huì)延續(xù)很多年。
新的時(shí)代也慢慢興起,就是物聯(lián)網(wǎng)+智能,IoT。IoT 是指所有的設(shè)備,不僅僅都要上網(wǎng)而且也會(huì)具有一定的智能,讓這個(gè)世界更緊密地聯(lián)系起來(lái)。從這個(gè)角度來(lái)講,這會(huì)是今后 5 年到 10 年會(huì)有大的發(fā)展。
總得來(lái)說(shuō),從大的發(fā)展來(lái)看,計(jì)算機(jī)的角度有三個(gè)因素,計(jì)算、連接、智能。連接和計(jì)算現(xiàn)在有很大的發(fā)展,我們覺(jué)得下一步時(shí)代就是關(guān)于智能,也是關(guān)于軟件方面智能的發(fā)展。
什么是深度學(xué)習(xí)?
大家都提深度學(xué)習(xí),什么是深度學(xué)習(xí)?有一個(gè)非常簡(jiǎn)單的定義。我們有一些沒(méi)有經(jīng)過(guò)處理的原始數(shù)據(jù),可能是語(yǔ)音、文字、圖像,也可能是一些傳感器得到了沒(méi)有經(jīng)過(guò)處理的數(shù)據(jù)。而深度學(xué)習(xí)本身的任務(wù)就是對(duì)這些原始數(shù)據(jù)進(jìn)行數(shù)字化的表達(dá),表達(dá)完成之后就可以做很多事情。做什么事情?這就跟應(yīng)用相關(guān)了。
深度學(xué)習(xí)的主要定義或者是要做的事情就是端到端的學(xué)習(xí),能夠把原始數(shù)據(jù)轉(zhuǎn)化為某種程度上的表征的方法,只要不是最簡(jiǎn)單的數(shù)模轉(zhuǎn)換,其實(shí)都可以放到數(shù)據(jù)的框架里面來(lái)。
深度學(xué)習(xí)的歷史沿革
這里還是要簡(jiǎn)單回顧一下歷史,最早起源于 1957 年的 Mark I perception。從數(shù)學(xué)上來(lái)講是一個(gè)很簡(jiǎn)單的形式,就是你有若干個(gè)輸入,每一個(gè)信號(hào)輸入乘上一些權(quán)重,然后經(jīng)過(guò)一個(gè)函數(shù)輸出,這個(gè)函數(shù)也是線性函數(shù)。這是神經(jīng)網(wǎng)絡(luò)或者是深度學(xué)習(xí)最最簡(jiǎn)單的起源了。比較有意思的是,這個(gè)數(shù)據(jù)模型當(dāng)時(shí)是通過(guò)硬件的方式提出來(lái)的,用物理的連線去聯(lián)接這些信號(hào)進(jìn)行輸出的。但是為什么它算是神經(jīng)網(wǎng)絡(luò)的起源?因?yàn)檫@些聯(lián)線的權(quán)重不是固定設(shè)好的,如果固定設(shè)好的,那就是電路系統(tǒng),這些權(quán)重通過(guò)數(shù)據(jù)自動(dòng)調(diào)節(jié)改進(jìn)來(lái)確定的,所以它就是 learning machine 的雛形。
當(dāng)年的紐約時(shí)報(bào)就報(bào)道說(shuō)這是計(jì)算機(jī)能夠很快學(xué)習(xí)、走路、談話、理解、寫(xiě)字,甚至繁殖的前兆吧。我們經(jīng)過(guò)了60 年的發(fā)展,現(xiàn)在大概在 See 和 Write 左右。
當(dāng)時(shí)大家對(duì)這個(gè)東西感到很興奮,覺(jué)得這個(gè)東西潛力很大。但是這個(gè)感知機(jī)還是線性的,經(jīng)過(guò)實(shí)驗(yàn)發(fā)現(xiàn),它對(duì)一些基本的函數(shù)都沒(méi)有辦法建?;蛘呙枋?,比如說(shuō)異或 SOR。所以之后十年神經(jīng)網(wǎng)絡(luò)迎來(lái)了一個(gè)低谷期,大家覺(jué)得用途可能不是很大。1980 年,F(xiàn)ukushima 提出了神經(jīng)網(wǎng)絡(luò)多層的結(jié)構(gòu),但是并沒(méi)有提出如何學(xué)習(xí)這個(gè)結(jié)構(gòu)。1980 年包括 Yann LeCun 等,大概有三、四個(gè)人,他們都提出了類似反向傳播的方式,能夠把這個(gè)神經(jīng)網(wǎng)絡(luò)學(xué)出來(lái),這就是一個(gè)非常重大的進(jìn)展里程碑了。
之后,80 年代到 90 年代有一個(gè)非??焖俚陌l(fā)展時(shí)期,大家的期望值也很高,希望可以做很多的事情,但是由于種種的限制,其實(shí)沒(méi)有辦法做很復(fù)雜的功能,只能做到簡(jiǎn)單的圖像識(shí)別,簡(jiǎn)單的手寫(xiě) OCR,之后發(fā)展趨勢(shì)又掉下來(lái)了。在學(xué)術(shù)界,大概有差不多 7、8 年的時(shí)間,神經(jīng)網(wǎng)絡(luò)相關(guān)的研究基本上是很難發(fā)表的。大家都不在乎,認(rèn)為神經(jīng)網(wǎng)絡(luò)不就是這樣子嘛!
神經(jīng)網(wǎng)絡(luò)的再度興起始于 2006 年,G.Hinton 提出深度神經(jīng)網(wǎng)絡(luò)。不過(guò)他當(dāng)時(shí)不敢提深度神經(jīng)網(wǎng)絡(luò)這個(gè)名字。這種結(jié)構(gòu)可以通過(guò)一層一層來(lái)學(xué)習(xí),來(lái)得到一個(gè)比較好的結(jié)果。之前的網(wǎng)絡(luò)太深,大家是學(xué)不了的。這種網(wǎng)絡(luò)結(jié)構(gòu)給大家的啟發(fā)是并不需要逐層地學(xué)習(xí),通過(guò)端到端的學(xué)習(xí)也可以實(shí)現(xiàn),而且學(xué)到一定深度之后,建模能力也是比較強(qiáng)的。
自那之后,深度神經(jīng)網(wǎng)絡(luò)的優(yōu)越性能就不斷爆發(fā)。語(yǔ)音識(shí)別是第一個(gè)被突破的領(lǐng)域。IBM、微軟以及谷歌等等幾個(gè)公司發(fā)表了一些文章,有了很大的突破,因?yàn)橹盎?HMM(隱馬爾科夫)的識(shí)別大概有 10 年、15 年沒(méi)有本質(zhì)性的改進(jìn)了。再之后 Jeff Dean 在谷歌率先實(shí)現(xiàn)了大規(guī)模的深度學(xué)習(xí)網(wǎng)絡(luò)的基礎(chǔ)架構(gòu),當(dāng)時(shí)是基于一萬(wàn)個(gè) CPU,比較重要的結(jié)果就是自動(dòng)學(xué)習(xí)識(shí)別出是貓臉還是狗臉。谷歌做這個(gè)事情是有示范作用的。
再之后大家就很清晰了,2012 年 ImageNet 中,微軟將識(shí)別率降了 10 個(gè)百分點(diǎn),這是很大的突破。之后,大家將這個(gè)技術(shù)應(yīng)用到人臉識(shí)別和圖像識(shí)別中。到 2014 年、2015 年時(shí) RNN 或者帶有一定記憶的程度網(wǎng)絡(luò)開(kāi)始流行,對(duì)于序列學(xué)習(xí),以及生成文字上都有很大的提高。再之后應(yīng)用到自動(dòng)駕駛。
2016 年的 AlphaGO,基本上算是橫空出世,一下子就把 AI 從學(xué)術(shù)界推到了公眾領(lǐng)域中,做了一個(gè)很好的科普。2016 年、2017 年其實(shí)還在迅速的發(fā)展,包括 2016 年之前就有的對(duì)抗生成網(wǎng)絡(luò),2017 年谷歌剛剛公布了用 TPU 芯片方式做成網(wǎng)絡(luò)的結(jié)構(gòu)。他們應(yīng)該是 2015 年就做出來(lái)了,估計(jì)這個(gè) TPU 不是他們第一代的產(chǎn)品,估計(jì)是把第一代的架構(gòu)公布了,現(xiàn)在已經(jīng)做第二代。
總之從 2006 年開(kāi)始,深度學(xué)習(xí)進(jìn)入波瀾壯闊的快速發(fā)展時(shí)期。我們希望 2020 年以后或者是神經(jīng)網(wǎng)絡(luò)不光運(yùn)行在云端,用上百臺(tái)的 GPU 跟大家下圍棋,而是希望真正運(yùn)用到設(shè)備端,來(lái)影響大家的生活。這是一些簡(jiǎn)單的歷史,大家可以看到 ANN、CNN、RNN、LSTM 等等,它們基本上都屬于神經(jīng)網(wǎng)絡(luò),神經(jīng)網(wǎng)絡(luò)本身屬于深度學(xué)習(xí),深度學(xué)習(xí)屬于 AI,這是一個(gè)大體的范疇。
在我們講這些神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)之前,先簡(jiǎn)單介紹一下架構(gòu),讓大家有一個(gè)統(tǒng)一的認(rèn)識(shí)。這是最簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò),只要超過(guò)兩層三層以上,都算是深的網(wǎng)絡(luò)。
這種一般叫做 Multi-layer Perceptron(MLP,多層感知機(jī))。有一些輸入層,輸入層是某種數(shù)據(jù),最終會(huì)得到一個(gè)輸出,輸出可以是一個(gè)數(shù),也可能是一個(gè)矢量,是一個(gè)二維的或者是 tensor,你希望學(xué)到神經(jīng)網(wǎng)絡(luò)達(dá)到一定目的,實(shí)現(xiàn)你模擬所達(dá)到那個(gè)目的的函數(shù),比如一個(gè)函數(shù) F 從輸入到輸出。這個(gè)網(wǎng)絡(luò)本身有很多的隱層,每一層有很多的節(jié)點(diǎn),節(jié)點(diǎn)都是線性的,互相相聯(lián)的,就是一個(gè)簡(jiǎn)單的 MLP。有這個(gè)結(jié)構(gòu)之后,我們需要定義這個(gè)輸入,然后定義這個(gè)輸出,再定義一個(gè) Loss Function(損失函數(shù)),來(lái)評(píng)價(jià)神經(jīng)網(wǎng)絡(luò)測(cè)算出來(lái)的結(jié)果跟你希望的結(jié)果是不是一致的。有了輸出、輸入、評(píng)價(jià)這三個(gè)過(guò)程,就實(shí)現(xiàn)了機(jī)器學(xué)習(xí)。
在這個(gè)學(xué)習(xí)的過(guò)程中,大量的數(shù)據(jù)放到輸入層,給這個(gè)網(wǎng)絡(luò)隨機(jī)分配一些初始的非常小的數(shù)來(lái)算,算出來(lái)之后結(jié)果肯定不對(duì)。也沒(méi)有理由是對(duì)的,有了這個(gè)不對(duì)的結(jié)果之后,可以反向根據(jù)這個(gè)結(jié)果與期望之間的差異,對(duì)每一個(gè)節(jié)點(diǎn)的參數(shù)求導(dǎo)。求導(dǎo)了之后沿著這個(gè)梯隊(duì)方向,稍微修改一點(diǎn)點(diǎn),希望能讓這個(gè)結(jié)果有一點(diǎn)點(diǎn)變化,其實(shí)這個(gè)變化是沒(méi)有保證的。但是只要反復(fù)按照這個(gè)方式運(yùn)行,給它一個(gè)結(jié)果去前向計(jì)算,得到一個(gè)輸出,跟你的希望結(jié)果去比較,計(jì)算這個(gè)誤差,通過(guò)誤差反過(guò)來(lái)調(diào)整這個(gè)參數(shù)以及權(quán)重,反復(fù)運(yùn)行,之后就可以實(shí)現(xiàn)一個(gè)比較好的函數(shù)的擬和效果,擬和出你想實(shí)現(xiàn)的目標(biāo)。
概念上說(shuō),這個(gè)每一步現(xiàn)在都已經(jīng)發(fā)展出很多算法,你用一個(gè)數(shù)據(jù)點(diǎn)去算\去修改網(wǎng)絡(luò),可能是很不穩(wěn)定的,因?yàn)槟氵@個(gè)點(diǎn)的 lable 可能是錯(cuò)的。這時(shí)候你可能需要一個(gè) minibatch 的方法,把一批數(shù)據(jù)結(jié)果平均一下,根據(jù)它們的方向去修改。修改的過(guò)程中,修改力度(learning rate)可以調(diào)整。開(kāi)始的時(shí)候,拿不準(zhǔn)的就學(xué)得快一慢,慢慢有把握了,就學(xué)得慢一點(diǎn)。
后來(lái)有一些比較新的方法,可以在這個(gè)過(guò)程中做出一些規(guī)劃,讓這個(gè)數(shù)值不要太大,數(shù)值上比較穩(wěn)定,能快速地收斂。
這個(gè)網(wǎng)絡(luò)的結(jié)構(gòu)以及學(xué)習(xí)方法在上世紀(jì)八九十年代就有了,當(dāng)時(shí)它有一些問(wèn)題導(dǎo)致大家覺(jué)得它可能不是那么有用。包括 over-fitting(過(guò)擬合),意思是在數(shù)據(jù)不是很多的情況下,網(wǎng)絡(luò)參數(shù)很多。這種情況,雖然可以學(xué)到一個(gè)非常好的結(jié)果,但是來(lái)了一個(gè)新的結(jié)果未必能夠正確處理,這就是 Over-fitting。還有就是數(shù)據(jù)結(jié)果可能會(huì)有一些標(biāo)注的錯(cuò)誤,你不能保證你所有的標(biāo)注都是 100% 正確的。另外,網(wǎng)絡(luò)結(jié)構(gòu)本身是一個(gè)黑盒子,它做什么事情,大家很難理解。
現(xiàn)在有了很多改進(jìn)。首先 Over-fitting 不再是問(wèn)題了,因?yàn)閿?shù)據(jù)足夠多。比如說(shuō)人臉識(shí)別,如果有世界上所有的人臉來(lái)做訓(xùn)練,就已經(jīng)沒(méi)有必要 Over-fitting 了,因?yàn)槟阋呀?jīng)沒(méi)有更新的數(shù)據(jù)了。如果數(shù)據(jù)足夠多的話,Over-fitting 這個(gè)事情并不是那么重要。
第二,大量數(shù)據(jù)的處理需要很高的性能,大家發(fā)現(xiàn)用 GPU 這種新架構(gòu),并行去練,可以處理很多數(shù)據(jù),比 CPU 效率高很多,這確實(shí)能夠推動(dòng)神經(jīng)網(wǎng)絡(luò)發(fā)展的一個(gè)很重要的關(guān)鍵因素。
剛才提到的訓(xùn)練中的很多新改進(jìn),包括 dropout、batchnormalization 等都對(duì)處理更多數(shù)據(jù),快速收斂有所改進(jìn)等,這些是算法上的提高。
但有一件事沒(méi)有本質(zhì)性的改變,這個(gè)網(wǎng)絡(luò)結(jié)構(gòu)還是屬于 black magic。但是本質(zhì)上還是實(shí)驗(yàn)出來(lái)。實(shí)驗(yàn)出來(lái)得到一些比較好的結(jié)構(gòu)、功能,然后再反過(guò)來(lái)給大家解釋一下,它總是會(huì)有一些道理。
所以今天我可能稍微回顧一下各種網(wǎng)絡(luò)結(jié)構(gòu)和它設(shè)定的原則和思考。應(yīng)該指出的是,確實(shí)還沒(méi)有放置四海皆可用的結(jié)構(gòu)或者一個(gè)絕對(duì)正確的設(shè)計(jì)原則。有一些思考,但是這些思考是不是全面和正確,現(xiàn)在還不好說(shuō)。這也是一個(gè)領(lǐng)域,大家可以繼續(xù)探索研究的。
為什么深度學(xué)習(xí)現(xiàn)在能夠獲得這么大的關(guān)注,跟其他的方法是有一些區(qū)別,隨著數(shù)據(jù)的,增加別的方法的性能在某一個(gè)點(diǎn)上不會(huì)再提升了,某種意義上飽和了,但是深度學(xué)習(xí)目前為止還沒(méi)有明顯地發(fā)現(xiàn)這種情況,增速會(huì)減慢,但不會(huì)停止。這是深度學(xué)習(xí)最吸引人的地方。對(duì)于各大公司來(lái)說(shuō),如果數(shù)據(jù)足夠多,能帶來(lái)性能提升,這就是非常好的事情。
網(wǎng)絡(luò)結(jié)構(gòu)越深越好?
從網(wǎng)絡(luò)結(jié)構(gòu)本身發(fā)展來(lái)看,第一個(gè)關(guān)鍵的問(wèn)題還在深度。但是不是越深就越好?我覺(jué)得從物理上看,不應(yīng)該越深越好,但是目前情況還是網(wǎng)絡(luò)越深,性能越好。我在這里打一個(gè)問(wèn)號(hào),但是這個(gè)趨勢(shì)發(fā)展還是很好的。
第二,深度學(xué)習(xí)很強(qiáng)大,它的模型或者說(shuō)網(wǎng)絡(luò)結(jié)構(gòu)很深,參數(shù)很多,其實(shí)運(yùn)算復(fù)雜度以及存儲(chǔ)復(fù)雜度很高了。我們能否把模型的規(guī)模精簡(jiǎn),這也是一個(gè)發(fā)展的方向。
另外這兩年大家重視的是,有沒(méi)有可能把這些適合于 GPU 運(yùn)行的神經(jīng)網(wǎng)絡(luò)能夠用硬件加速?能夠進(jìn)行更快的計(jì)算?能不能用嵌入式系統(tǒng)運(yùn)算?這也是我們現(xiàn)在的努力的方向。
這里有幾個(gè)里程碑式的工作,包括 80 年代 Yann LeCun 等人做的 LeNet5,2012 年 AlexNet 能突破性地把圖像識(shí)別的錯(cuò)誤率降了 10%。再之后谷歌 GoogLeNet 能夠把網(wǎng)絡(luò)結(jié)構(gòu)的復(fù)雜程度突破大家的想象。在那之前,大家還是按照 LeCun 的方式去做。微軟的 Residual Net 也是一個(gè)很好的工作,可以讓網(wǎng)絡(luò)結(jié)構(gòu)變得更深,效果也更好。
通過(guò)最初的工作,大家看到 CNN 或神經(jīng)網(wǎng)絡(luò)大概的工作過(guò)程。剛才說(shuō)那種多層的線性的神經(jīng)網(wǎng)絡(luò),每一層都有很多節(jié)點(diǎn),每一個(gè)節(jié)點(diǎn)都會(huì)連接到下一層的一個(gè)節(jié)點(diǎn)中去那么這就是用來(lái)處理一維數(shù)據(jù)的最簡(jiǎn)單方法。
LeNet-5
卷積神經(jīng)網(wǎng)絡(luò)有兩個(gè)角度的改進(jìn)。第一個(gè)是下一層的節(jié)點(diǎn)并不是連接上一層的所有節(jié)點(diǎn),它只連接一個(gè)區(qū)域的幾個(gè)節(jié)點(diǎn)。比如說(shuō)如果你第 1 層有 10 個(gè)節(jié)點(diǎn),第 2 層有 10 個(gè)節(jié)點(diǎn),那么第 2 層一個(gè)節(jié)點(diǎn)連接一個(gè)小區(qū)域,一個(gè)局部的小區(qū)域,比如 3 個(gè)節(jié)點(diǎn)。在圖像中就意味著你可能只是連接圖像中一個(gè)小區(qū)域,一個(gè)小 patch。
第二個(gè)改進(jìn)是連接這個(gè)小區(qū)域中,你的這個(gè)小區(qū)域跟連接的下個(gè)小區(qū)域的所有的連接的 weight 是一樣的,這個(gè)叫做 weight sharing(權(quán)重共享)?;蛘哒f(shuō)你有一個(gè)線性的卷積核(convolutional kernel)。這個(gè)卷積核,比如說(shuō) 3×3 的卷積核,有 9 個(gè)數(shù),這 9 個(gè)數(shù)拍在這個(gè)空間上去算一個(gè)卷積,平均一下再拍到另一個(gè)空間,也算一個(gè)卷積。這幾個(gè)卷積中的卷積核本身是一樣的。所以從原來(lái)最開(kāi)始那個(gè) MLP 向下發(fā)展到 CNN,定義出了一個(gè)卷積的概念。就是這兩點(diǎn)不同。
第一,下一個(gè)節(jié)點(diǎn),就是第二層節(jié)點(diǎn)只連接上一層的局部的幾個(gè)輸入。第二,這幾個(gè)局部輸入位置在空間上是共享的、固定的。你有一個(gè)輸入之后可能會(huì)有幾個(gè)卷積核。如果你有一個(gè)卷積,一個(gè) filter,然后通過(guò)掃描方式,或者放一個(gè)點(diǎn),乘加一次就算出一個(gè)數(shù)來(lái),就會(huì)得到這邊的一個(gè)點(diǎn)。你有一個(gè)卷積函數(shù)的話,就可以得到這邊的一個(gè)區(qū)域,叫 feature map。如果你有六個(gè)卷積的話就是 6 ×28×28,那就是你做了 6 個(gè)卷積把輸入圖像從 32×32 變成了 28×28,那是第一層的卷積操作。然后你需要一些降采樣。
當(dāng)時(shí) LeCun 為了計(jì)算量比較小,立刻就降采樣了。降采樣之后還是 6 個(gè) feature map。之后他在 C3 層定義了 10 個(gè) feature map。這 10 個(gè) feature map,每一個(gè)卷積核在這 6 個(gè)卷積核的 6 個(gè) feature map 上,上一層的 6 個(gè) feature map 上也進(jìn)行卷積。空間上不斷地移動(dòng)。卷積了之后把結(jié)果線性組合一下。線性組合本身的所有參數(shù)都是學(xué)習(xí)到的。線性組合得到下一個(gè)層的 feature map。你有 10 個(gè),那么就重復(fù) 10 次這個(gè)過(guò)程,就把這 6 個(gè) feature map 變成了 10 個(gè)。
事實(shí)上,LeCun 在處理這個(gè)工作的時(shí)候是處理不了這么多的。就是說(shuō) 6 個(gè) feature map 對(duì)應(yīng) 10 個(gè) feature map,他其實(shí)是隨機(jī)選了一下。可能只有一個(gè) C3 層的一個(gè) feature map 是對(duì)應(yīng)于 6 個(gè),其他幾個(gè)是對(duì)應(yīng)之前的 3 個(gè)或 4 個(gè)。
當(dāng)時(shí) LeCun 的文章解釋說(shuō)是為了破壞對(duì)稱性,就說(shuō)不要完全對(duì)稱。
但我覺(jué)得主要還是計(jì)算量的原因。最后類似地你可以再把規(guī)模降小一點(diǎn),進(jìn)行降采樣,然后做一些全連接。全連接就是指每個(gè)輸入跟下一層每個(gè)輸出全連接在一起,這不是一種卷積形式。
當(dāng)時(shí)這個(gè)結(jié)構(gòu)有大概是 6 萬(wàn)個(gè)參數(shù),能識(shí)別手寫(xiě)體的數(shù)字或者是郵編。LeCun 他們把這做完之后還真的實(shí)現(xiàn)產(chǎn)品化了。當(dāng)時(shí)它發(fā)展到可以處理美國(guó) 1/3 的郵件的手寫(xiě)體識(shí)別,這應(yīng)該是八九十年代最巔峰的工作了。
到了 2012 年的 AlexNet,結(jié)構(gòu)本身沒(méi)有本質(zhì)性的提高,但是規(guī)模大了很多。
AlexNet
LeNet-5 是 6 萬(wàn)個(gè)參數(shù),那么 AlexNet 是 6000 萬(wàn)個(gè)參數(shù)。
分成上下兩層,輸入的是 24×24 的圖像,之后第一層是 11×11 卷積,也是一個(gè) 11×11 的卷積的濾波器,放到圖像上去,開(kāi)始平移,乘加,平移一次,算出一個(gè)點(diǎn),算出來(lái)之后做一次采樣。
采樣是指你有幾個(gè)點(diǎn),你挑一個(gè)點(diǎn)使用。這個(gè)采樣叫 pooling。比如你有 4 個(gè)點(diǎn),取 1 個(gè)最大的,那就叫 Max pooling。如果說(shuō)有 4 個(gè)點(diǎn),平均一下就是一個(gè)值,那就是 average pooling。只要能夠把多個(gè)點(diǎn)變成一個(gè)點(diǎn),那么這種某種方式就叫 pooling。
做完 Max Pooling 之后,繼續(xù)卷積,去做 Pooling。
本質(zhì)上結(jié)構(gòu)跟原來(lái)是一樣的,只是大了很多,以至于當(dāng)時(shí)的 GPU,用一塊是訓(xùn)練不了的,所以同時(shí)用兩塊去訓(xùn)練。當(dāng)時(shí)一個(gè) GPU 的內(nèi)存可能是 3G。訓(xùn)練的時(shí)候開(kāi)始對(duì)輸入進(jìn)行一些歸一化,要加一些 dropout,就是隨機(jī)的在訓(xùn)練過(guò)程中把一些節(jié)點(diǎn)設(shè)置為 0。
在神經(jīng)網(wǎng)絡(luò)中,很多連接、很多節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)可能都會(huì)輸出一個(gè)值,做一個(gè) Activation,輸給下一層。那么本來(lái)是說(shuō)每個(gè)節(jié)點(diǎn)都會(huì)對(duì)最終結(jié)果有貢獻(xiàn),那么 dropout 就是在這過(guò)程中隨機(jī)性把 50% 或者 40% 的節(jié)點(diǎn)的輸出置為 0,讓它沒(méi)有貢獻(xiàn),那這樣你訓(xùn)練得到的分類結(jié)果,就不能依賴于所有節(jié)點(diǎn)都正常工作,或者所有的信息都能收集到。這種情況下,如果還要得到一個(gè)好結(jié)果,那么你在測(cè)試的時(shí)候,就不會(huì)非常依賴于這些數(shù)據(jù)要跟之前的數(shù)據(jù)很像,或者是見(jiàn)過(guò)的數(shù)據(jù),這樣的話你就能處理一些未知的數(shù)據(jù)。這是當(dāng)時(shí)就是 AlexNet 的改進(jìn),但是本質(zhì)網(wǎng)絡(luò)結(jié)構(gòu)本身還是相當(dāng)。
VGG
這之后一個(gè)有名的工作是牛津大學(xué)做出來(lái)的 VGG。他們其實(shí)是把 AlexNet 這種網(wǎng)絡(luò)結(jié)構(gòu)推到了極致。
一個(gè)主要的一個(gè)變化是基本上主要采取最簡(jiǎn)單的 3×3 的卷積。他們覺(jué)得 3×3 的卷積就可以完成任務(wù)了,此時(shí)的層數(shù)是到了 19 層,參數(shù)又多了很多,之前可能是八九層?;旧蟻?lái)說(shuō),VGG 某種意義上就是把 CNN 推到了極致。
Network in network
2014 年的一個(gè)比較重要的工作是顏水成他們?cè)谛录悠伦龅?Network in Network。
之前的網(wǎng)絡(luò)是一層一層去卷積,還是比較規(guī)則的。而顏水成做的工作是設(shè)計(jì)一些小的網(wǎng)絡(luò)。大的網(wǎng)絡(luò)是由一些小的網(wǎng)絡(luò)來(lái)組成的。小的網(wǎng)絡(luò),比如 11×11 的卷積,在卷積之后加了一些 MLP,多層的 Perceptron,就是說(shuō)每個(gè)輸入層跟輸出層都是全連接的、線性的網(wǎng)絡(luò)連接。
另外一種意義上講,可以把它看成一種叫 1×1 的卷積。1×1 的卷積就是指它在空域上就是一個(gè)點(diǎn),所以它就沒(méi)有把周?chē)目臻g信息做聚合了。但是它在不同的 feature map 之間做了一個(gè)線性組合。比如說(shuō)你有 96 個(gè) feature map,那么你可以把 96 個(gè) feature map 在某一個(gè)點(diǎn)上進(jìn)行組合,再生成下一層的 feature map 一個(gè)點(diǎn)。采取比較少的 1×1 的卷積,你就可以把這種 96 個(gè) feature map 的個(gè)數(shù)變小。你也可以考慮把它變多,比如你用這層是 96 個(gè),下層用 128。但比較有意義的一個(gè)作用是,在這種結(jié)果下變小了之后,再進(jìn)行下一級(jí)的一個(gè)小的 In Network。
我覺(jué)得這個(gè)工作一個(gè)重要的價(jià)值在于把大家的思維給稍微解放了一點(diǎn)。原來(lái)純粹就是不斷地去加層數(shù),加 feature map 個(gè)數(shù)、濾波器的個(gè)數(shù),像 VGG 那樣可能也已經(jīng)差不多到頭了。VGG 的參數(shù)已經(jīng)非常多非常重了?,F(xiàn)在我們加一些小的網(wǎng)絡(luò),在小的網(wǎng)絡(luò)中間,我可以把一些維數(shù),再降低一點(diǎn),降低了之后,我們可以再加點(diǎn)網(wǎng)絡(luò),就可以使網(wǎng)絡(luò)變得更深。變深之后確實(shí)是還是有些提高的。
GoogLeNet
受 Network In Network 的啟發(fā),2015 年,谷歌某種意義上講就 go crazy 了,他們當(dāng)時(shí)做的應(yīng)該是有 30 多層網(wǎng)絡(luò),很復(fù)雜。但其實(shí)基本上是分成兩個(gè)部分。一部分是開(kāi)始這一部分,還是比較傳統(tǒng)的卷積,然后 pooling 的方式,之后就是累加了很多這種 Inception model。
Inception model 是什么樣的呢?就是你有一個(gè) Previous layer ,就是上一層,那么你做一個(gè) 1×1 的卷積,就相當(dāng)于把很多 feature map 給平均了一下,或者線性組合了一下。
這個(gè)過(guò)程可以減少 feature map,再做一些個(gè) 3×3 跟 5×5,做一些 pooling,再把這些個(gè)卷積層、卷積的 feature map 的結(jié)果拼在一起,作為下次的輸出。它能把這個(gè)單元作為一個(gè)獨(dú)立單元放在后面,后面都是類似結(jié)構(gòu)單元。
每個(gè)單元其實(shí)蠻復(fù)雜的,這個(gè)復(fù)雜的一個(gè)小單元,從設(shè)計(jì)上講,借鑒了剛才那個(gè) Network in Network 的思路,放了一些 1×1 的卷積,必須把這 feature map 減小,否則都用 3×3、5×5,那么其實(shí)還是會(huì)很大的,會(huì)很難訓(xùn)練的。
一個(gè)小單元內(nèi)部考慮了 1×1 考慮 3×3,或者 5×5,實(shí)際上是說(shuō)捕捉到了不同 scale 大小的圖像信息。有的分類問(wèn)題可能需要要看非常 local,或者非常小的圖像的結(jié)構(gòu),而有的分類問(wèn)題需要看到大一點(diǎn),那么它的一個(gè)小單元其實(shí)是包括了不同的信息,1×1、3×3、5×5。但是如果直接這么用,可能會(huì)出現(xiàn) feature map 太多,參數(shù)太多,學(xué)得比較困難,所以先用 1×1 卷積把它稍微降一點(diǎn),把 feature map 層數(shù)降一點(diǎn),組成這么一個(gè)單元,在這個(gè)單元拼到后面,拼出 30 多層來(lái)。
層數(shù)越深,性能是會(huì)提高的,但是訓(xùn)練的難度會(huì)增加。當(dāng)時(shí)為了能夠快速地訓(xùn)練,去收斂,不會(huì)把訓(xùn)練給訓(xùn)崩了,就加了幾個(gè)分支,在那個(gè)分支上,把正確圖像分類的信息也加上去。先訓(xùn)練一些個(gè)小的網(wǎng)絡(luò),再不斷加深,做了幾個(gè)分支。這是當(dāng)時(shí)所需要的,后面一些改進(jìn)可能,也就不需要這些分支了。不需要這些個(gè)分支,也可以訓(xùn)練出來(lái)比較深的網(wǎng)絡(luò),那時(shí)候是 30 幾層。
這是第一個(gè)是 GoogLeNet 是他們的第一個(gè)版本。之后他們又推出了幾個(gè)版本。在這個(gè)過(guò)程中他們對(duì)網(wǎng)絡(luò)結(jié)構(gòu)做了一些思考和總結(jié)。
第一,在網(wǎng)絡(luò)結(jié)構(gòu)過(guò)程中有很多層,你盡量避免在早期的時(shí)候觸碰瓶頸,或者說(shuō) information bottleneck。比如說(shuō)你有你有 10 層網(wǎng)絡(luò),第 1 層有很多卷積,第 2 層就放 1 個(gè)卷積核,就 1 個(gè) feature map。甚至再極端一點(diǎn),那個(gè)點(diǎn)就一個(gè)輸出,也就是說(shuō)一層之后,到第二層就只有一個(gè)數(shù)。那么你可以想象,后面無(wú)論加多少層,結(jié)果都不會(huì)好,因?yàn)樾畔⒍急粷饪s到了一個(gè)數(shù)之后,就不可能再把它發(fā)散出來(lái)。
所以他的第一個(gè)想法就是說(shuō),你盡量避免在比較早的時(shí)候有一些信息的瓶頸,導(dǎo)致信息傳遞不出去。其實(shí)這也是一個(gè)比較直觀的想法,因?yàn)槲覀儸F(xiàn)在需要多層的網(wǎng)絡(luò),是希望它通過(guò)訓(xùn)練之后,到最后一層抽象出比較好的一個(gè)表達(dá),去做分類、檢測(cè)或識(shí)別,而不是在開(kāi)始的時(shí)候,信息就沒(méi)有了,后面就更不可能得到了。
舉個(gè)例子。比如說(shuō)是圖像是一個(gè)小 patch,就是 35×35,其實(shí)不一定是圖像,就是一個(gè)二維的數(shù)據(jù),35×35 的,你有 320 個(gè) feature map,那么到第二層,把它限制成 17×17,然后有 320 feature map,之后后面一級(jí),把它升成 17×17,有 640 個(gè) feature map,那么這 640 個(gè) feature map 就很有可能學(xué)不到特別多的信息了,因?yàn)槟阋呀?jīng)把它縮到 320 了。所以這是他這個(gè)圖的意思是,如果中間加了一個(gè)瓶頸,后面學(xué)到東西可能就不會(huì)那么多。
這個(gè)怎么改變。如果不想有瓶頸限制,那么第二子集也還是 35×35×640。信息是增加了,沒(méi)有瓶頸,再縮減下去,變成 17×17×640,所以最后輸出都是 17×17。左邊有瓶頸,右邊沒(méi)瓶頸。雖然沒(méi)有瓶頸,但是 35×35×640 是一個(gè)非常大的 tensor,有很多參數(shù)要學(xué),比左邊那個(gè) 17×17×320 圖多了八倍。
所以說(shuō)如果是簡(jiǎn)單地為了沒(méi)有瓶頸加很多 feature,可能解決這個(gè)問(wèn)題了,但是代價(jià)就是要學(xué)很多參數(shù)。你的數(shù)據(jù)要求很多,其實(shí)很慢。
怎么去解決?首先左邊這一個(gè)結(jié)構(gòu)是用 1×1 的去降維,這樣縮小 feature map 的個(gè)數(shù),再統(tǒng)統(tǒng)去做卷積,另外就是說(shuō)我可以把它拆成兩個(gè)并行的小網(wǎng)絡(luò),左邊是 17×17×320,右邊是 17×17×320,然后把它們拼在一起,結(jié)果還是 17×17×640 個(gè) feature map。但是中間那兩個(gè)小網(wǎng)絡(luò)是并行的,它們的參數(shù)是相加的關(guān)系,能夠容納信息的量也比原來(lái)的 17×17×320,翻了兩倍。通過(guò)這種方式同時(shí)保證了參數(shù)不是特別多,也沒(méi)有信息瓶頸。這是他們當(dāng)時(shí)關(guān)于設(shè)計(jì)網(wǎng)絡(luò)結(jié)構(gòu)的思考。
第二個(gè)是思考是,做一個(gè) 3×3 的卷積或者 5×5 的卷積,實(shí)際上是把圖像中 spatial 的信息聚合到一起了。這種聚合其實(shí)是可以用低維的卷積核來(lái)實(shí)現(xiàn)的。這就回到了 3×3 的卷積有什么特殊的這個(gè)問(wèn)題上。
其實(shí)沒(méi)什么特殊的。那為什么用 3×3,不用 5×5 、7×7 的卷積?這個(gè)時(shí)候有一個(gè)解釋是說(shuō),用 5×5 、7×7 的卷積是可以的,但是這些卷積本身其實(shí)可以,用 3×3 的卷積來(lái)表示,因?yàn)榫矸e本身其實(shí)是線性的。你用兩個(gè) 3×3 去做,是可以等價(jià)于一個(gè) 5×5。
與其用一個(gè) 5×5,不如用兩個(gè) 3×3 的兩級(jí)。好處是每一級(jí)的計(jì)算量減小了,每級(jí)最后作為卷積之后,還會(huì)有一個(gè) activation function,還能加入一些非線性的信息和變換。所以與其用比較大的卷積核去做網(wǎng)絡(luò),還不如用多層、多個(gè)小的卷積核去等價(jià)它,這樣節(jié)省了參數(shù),又增加了網(wǎng)絡(luò)的非線性。整個(gè)神經(jīng)網(wǎng)絡(luò)它能夠?qū)W習(xí),能夠去能建模很多東西很多內(nèi)容,是因?yàn)樗鼌?shù)很多,同時(shí)也因?yàn)檎麄€(gè)網(wǎng)絡(luò)是非線性的函數(shù)而不是一個(gè)線性函數(shù)。
到這個(gè)時(shí)候大家對(duì) VGG 用 3×3 的 kernel,有一個(gè)更好的解釋,用小的 kernel,用多級(jí),其實(shí)比用較大的卷積核有好處。進(jìn)一步推一下,3×3 其實(shí)還可以進(jìn)一步去等價(jià)于一個(gè) 1×3 和一個(gè) 3×1,就是一個(gè)水平的一個(gè)卷積,再加一個(gè)豎直卷積,用進(jìn)一步拆分的卷積去聚合空間上的信息。所以他們?cè)谠O(shè)計(jì)這個(gè)網(wǎng)絡(luò)的時(shí)候,就用了一個(gè)在 17×17 的那一級(jí)上,用 1×7 跟 7×1 的卷積,這樣一來(lái),聚合了比較多的信息,但是一個(gè) 1×7 再加上一個(gè) 7×1,是 14 個(gè)量級(jí)的參數(shù),比直接一個(gè) 7×7,參數(shù)小很多,但是層數(shù)就深了很多。
所以這也是后來(lái)我們?yōu)槭裁纯梢赃M(jìn)一步看到,網(wǎng)絡(luò)越來(lái)越深的一個(gè)理由. 用更深的網(wǎng)絡(luò)、更少的參數(shù)去近似一些比較大的 kernel 很有可能是有好處的。
第三個(gè)總結(jié)是指導(dǎo)原則。在高層的一些網(wǎng)絡(luò)的最后幾層中,一個(gè)點(diǎn)代表著最開(kāi)始輸入圖像當(dāng)中的一大塊區(qū)域。如果說(shuō)原始圖像中哪些區(qū)域可以影響到最后的一個(gè)點(diǎn),那么在最后幾層的一個(gè)點(diǎn),是有一大片區(qū)域可以影響的。這個(gè)區(qū)域,某種意義上來(lái)說(shuō),是這個(gè)點(diǎn)的 receptive field,意思是它能夠去影響的區(qū)域。那么在最后幾層的時(shí)候,你就不應(yīng)該去用一些很大的卷積核,盡量用一些小的卷積核,他寫(xiě)的是:
Higher dimensional representations are easier to process locally.
所以你最好有些小卷積核,可以總結(jié)很多空間上的信息。他們當(dāng)時(shí)在最后幾級(jí) 8×8 的規(guī)則上面是用這種很小的卷積核。
總體來(lái)看,第一代的 GoogLeNet 中,他們估計(jì)也沒(méi)有搞清楚為什么要這么設(shè)計(jì),之后就做了很多實(shí)驗(yàn),總結(jié)出一些設(shè)計(jì)的指導(dǎo)思路。
最后一個(gè)總結(jié)是,要平衡網(wǎng)絡(luò)的寬度跟深度,你當(dāng)然可以搞得非常深,非常窄或者是非常寬。但是基本上應(yīng)該有一個(gè)大體的平衡。
ResNet
下面一個(gè)是微軟 MSRA 的非常好的工作:Residual Network。他們當(dāng)時(shí)發(fā)現(xiàn)用一個(gè)神經(jīng)網(wǎng)絡(luò)去模擬一個(gè)函數(shù),雖然說(shuō)無(wú)論多復(fù)雜的函數(shù),我們都可以模擬,但是發(fā)現(xiàn)層數(shù)很深之后,性能提升就會(huì)變慢。這并不是由于 Over Fitting 引起的,而是由于訓(xùn)練中可能有些數(shù)值的問(wèn)題引起的。微軟的一個(gè)很好的想法是,與其去模擬一個(gè)函數(shù),還可以模擬函數(shù)跟原始數(shù)據(jù)的差。我們不去模擬輸出 y=F(x) 的 F (x),模擬這個(gè) F(x)-x,模擬殘差。
這個(gè)是一個(gè)很好的想法,反應(yīng)到網(wǎng)絡(luò)結(jié)構(gòu)上去,就是這邊可能還有一些常規(guī)的卷積,有一些矩陣操作。那么有一條通路,豎向本身直接到最后,去跟模擬的結(jié)果做一個(gè)加法,之后再有一個(gè) activation function,一般都用 ReLU,就是說(shuō)負(fù)的地方是零,正的地方是線性,通過(guò)一個(gè)非線性函數(shù)去輸出。通過(guò)這種方式,你在右邊分支,這個(gè)小的網(wǎng)絡(luò)結(jié)構(gòu)模擬的就是輸出-x,是殘差。所以這叫 Residual Network。通過(guò)這種方式,你就可以進(jìn)一步的把網(wǎng)絡(luò)加深,他們都嘗試了。有一個(gè)版本是 101 層,還有一個(gè)版本是 152 層,這是微軟做出的很好的工作。
Inception V4
后來(lái),谷歌的人覺(jué)得,我們要說(shuō)明我們的 Inception 網(wǎng)絡(luò)結(jié)構(gòu)一樣可以做得很深,一樣可以做到很好。這就有了 Inception V4。
整體結(jié)構(gòu)是這樣的,第一步輸入圖像,有一個(gè)叫 STEM。開(kāi)始的幾層是比較常規(guī)的,做一些 3×3 的卷積。之后涉及到 Inception A B C。讓 A 在 35×35 的 grid(網(wǎng)格)上去做卷積,B 是在 17×17,后面那個(gè) C 是在那個(gè) 8×8 的 grid 上做卷積,然后再設(shè)計(jì)出這個(gè)結(jié)構(gòu)。這些結(jié)構(gòu)就符合他們之前說(shuō)的那幾個(gè)設(shè)計(jì)的思想。就是盡量用 1×7、7×1 的這些卷積,去把大的卷積核拆開(kāi)。第二層是用 1×7、7×1 的卷積。在 8×8 最后那幾層,要盡量用小的卷積核,這樣也把網(wǎng)絡(luò)結(jié)構(gòu)變得非常深。
他們做了一些實(shí)驗(yàn),跟 Residual Network 去比,認(rèn)為加入 Residual Network 一個(gè)連線直接把輸入信號(hào)傳下去,是會(huì)有幫助的,但是也不是必須的。這個(gè)結(jié)論本身不好評(píng)價(jià)。只是說(shuō)他們至少在 ImageNet 任務(wù)上,錯(cuò)誤率只有 3.5%-3.6% 左右。但是是不是用了 Inception Network 就可以提高呢?我覺(jué)得這還是沒(méi)有結(jié)論的。
稍微總結(jié)一下。至少在 ImageNet 上,設(shè)計(jì)神經(jīng)網(wǎng)絡(luò)時(shí)要考慮以下因素。一個(gè)是性能,就是準(zhǔn)確度怎么樣;一個(gè)是網(wǎng)絡(luò)模型的大小,就是有多少參數(shù);一個(gè)是運(yùn)算量,就是有多少個(gè) operation。下面的圖就把剛才提到的所有網(wǎng)絡(luò)結(jié)構(gòu)做了一個(gè)很好的總結(jié)。
可以看到,至少到目前為止,Inception V4 設(shè)計(jì)得很復(fù)雜,用了那幾個(gè)原則去指導(dǎo)去設(shè)計(jì),性能確實(shí)是略高一點(diǎn),參數(shù)至少比 AlexNet、ResNet 還少一些,計(jì)算量也是相當(dāng)。所以設(shè)計(jì)復(fù)雜的結(jié)構(gòu)還是能夠獲得一些收益的。
全卷積網(wǎng)絡(luò)
還有一個(gè)比較重要的工作是全卷積網(wǎng)絡(luò)(Fully Convolutional Network),它可以做比較合理的分割。這種網(wǎng)絡(luò)結(jié)構(gòu)本身是正常的,但是最后輸出到一個(gè)跟輸入是相當(dāng)大小的 pixel-wise prediction。它就可以去對(duì)每個(gè) pixel 做一個(gè) lable,就是給一個(gè)分類,比較適合做分割。我覺(jué)得這個(gè)工作比較好,雖然網(wǎng)絡(luò)結(jié)構(gòu)并不是特別特殊,但是我還是把它列在這里。
以上這一系列網(wǎng)絡(luò)結(jié)構(gòu)的發(fā)展都是在 CNN 框架下。基本上是你給我一個(gè)輸入,我就算出了一個(gè)輸出,你再給我一個(gè)輸入,我又算出了一個(gè)輸出。這兩個(gè)輸入跟輸出,跟結(jié)果之間是沒(méi)有關(guān)系,沒(méi)有任何記憶的。所以在這個(gè)范圍內(nèi),我們可以看到,從 AlexNet9 層,到 GoogLeNet 30 層,到后來(lái)現(xiàn)在 ResNet100 多層,到 Inception。
從 RNN 到 LSTM 和 GRU
與 CNN 相對(duì)的另一種思路是把網(wǎng)絡(luò)中加入一些記憶的單元,某種意義上講,也是使網(wǎng)絡(luò)深了很多。
我們可以看到原來(lái)的一個(gè)神經(jīng)元,就是說(shuō)你有一個(gè)輸入 X,你有一個(gè)輸出,這個(gè)過(guò)程本身是無(wú)狀態(tài),無(wú)記憶的。第一個(gè)想法就是,我們是不是可以加入記憶,或者加入一些狀態(tài)。每個(gè)神經(jīng)元本身有一個(gè)狀態(tài),那么你的輸出就不止決定于當(dāng)前時(shí)刻的輸入,還決定于本身實(shí)際上存的數(shù)據(jù),兩個(gè)數(shù)決定出一個(gè)輸出。如果你做這方面的改進(jìn)之后,本身有個(gè)狀態(tài),狀態(tài)本身 X 乘上一個(gè) W,跟你輸入 X 乘上一個(gè) U,最后經(jīng)過(guò) V 輸出 O。這個(gè)結(jié)構(gòu)本身也可以等價(jià)的看成一個(gè)很深的網(wǎng)絡(luò),從時(shí)間上講它是一個(gè)很深的網(wǎng)絡(luò)。Xt-1 是 t-1 時(shí)刻的輸入,有個(gè)狀態(tài) St-1,那么下一個(gè)時(shí)刻就相當(dāng)于,St-1 跟 St 決定輸出,同時(shí)也決定狀態(tài) St,再?zèng)Q定下一個(gè)時(shí)刻。如果你考慮神經(jīng)元有了狀態(tài)跟記憶之后,從邏輯上講或者概念上講神經(jīng)網(wǎng)絡(luò)本身就等效于一個(gè)非常非常深的網(wǎng)絡(luò)。
所以這是另外一個(gè)角度把網(wǎng)絡(luò)變得 deeper 的一個(gè)方面。這種方式被稱為 Recurrent Neural Network——RNN,后面有一些發(fā)展,一個(gè)就是 LSTM——長(zhǎng)短時(shí)間記憶,還有一個(gè)簡(jiǎn)化版就是 gated recurrent network。
概念上簡(jiǎn)單地來(lái)說(shuō),我們加了一個(gè)狀態(tài),那么每個(gè)神經(jīng)網(wǎng)絡(luò)神經(jīng)元就記住了一個(gè)數(shù),那么這個(gè)數(shù)會(huì)對(duì)多長(zhǎng)時(shí)間的預(yù)測(cè)有影響呢?是可以記住一個(gè)時(shí)間單位,還是十個(gè)時(shí)間單位還是一百個(gè)時(shí)間單位?從道理上講,其實(shí)沒(méi)有限制,你可以記錄很多時(shí)間單位,但實(shí)際上其實(shí)是很難控制的。這里的一個(gè)改進(jìn)就是 LSTM,它把長(zhǎng)時(shí)間的記憶跟短時(shí)間記憶比較顯式地在網(wǎng)絡(luò)結(jié)構(gòu)中描述出來(lái)。
這是 LSTM 網(wǎng)絡(luò)??瓷先バU復(fù)雜的,它有三個(gè)門(mén),或者說(shuō)三個(gè)小的神經(jīng)網(wǎng)絡(luò)單元,來(lái)決定什么信息去記憶到這個(gè)神經(jīng)元里去,什么信息去輸出,什么信息去更新自己的狀態(tài)。這個(gè) Xt 就是指 t 時(shí)刻的輸入,Ht 是 t 時(shí)刻的輸出,還有一個(gè) Ct 是這個(gè) cell 或者結(jié)構(gòu)本身記錄的信息的內(nèi)容。
首先,你有一個(gè)輸入,就是上一個(gè)時(shí)刻的輸出跟現(xiàn)在時(shí)刻的輸入來(lái)決定你有多少信息會(huì)繼續(xù)保留在這個(gè)單元,叫 forgetting gate,在這里是 Ft。下一個(gè)需要的是上一時(shí)刻的輸出和現(xiàn)在時(shí)刻輸入來(lái)決定當(dāng)前的內(nèi)容,就是 Ct。C 是 cell 本身的內(nèi)容,意思是有多少信息是繼續(xù)保留。所以通過(guò)那個(gè) [Ht-1,Xt],算出來(lái)一個(gè) It 那個(gè) Sigma 就是 whatever 一個(gè)函數(shù)了,一個(gè) activation function。Wt 是某種意義上你會(huì)學(xué)到一個(gè) weight,一個(gè)矩陣。重要是 Ht-1 跟 Xt 決定了一個(gè) it,it 去決定 Ct。也就是說(shuō)什么信息能繼續(xù)保留下來(lái)。ft 是指需要多少記憶去忘記,它和 Ct 這一時(shí)刻,這二者會(huì)做一個(gè)線性組合去決定 Ct,決定繼續(xù)保留在這個(gè)時(shí)刻這個(gè)單元里的信息內(nèi)容。最后還有一個(gè) Ot,就是輸出的 gate,就是說(shuō)決定一下 Ht-1 跟 Xt,去學(xué)習(xí)一些參數(shù),去決定哪些作為下一個(gè)時(shí)刻輸出。
雖然看上去是很復(fù)雜的,但是總的來(lái)說(shuō),從概念上講,就是上一時(shí)刻的輸出,跟現(xiàn)在當(dāng)前時(shí)刻的外界的輸入,去決定哪些信息是繼續(xù)保留的,哪些信息是需要遺忘的,哪些信息是需要輸出的。那么這個(gè)建模能力就比較強(qiáng),可以說(shuō)是很全面很綜合了。更重要的是,這些函數(shù)本身都是可以根據(jù)你的輸入數(shù)據(jù)學(xué)出來(lái)的,也就是說(shuō),對(duì)于每一個(gè)這樣的單元,哪些是記性型記憶,哪些記憶型輸出 哪些是保留都是可以學(xué)出來(lái)的。
其實(shí)后面會(huì)有很多變種,比如說(shuō)你可以看到這些所有的信息輸入的函數(shù)都是 ht-1 的一個(gè) It,就是說(shuō)只由上一時(shí)刻的輸出,跟當(dāng)前時(shí)刻輸入決定。那么你可能也考慮到當(dāng)前那個(gè)狀態(tài) Ct,那就是一系列 RNN 變種了。
一個(gè)比較有意義的變種是它可以把這個(gè) RNN 進(jìn)一步簡(jiǎn)化,而且它的性能可能接近的就是 gated recurrent network、gated recurrent unit。就相當(dāng)于把剛才有三個(gè)這種控制的門(mén),forgetting gate、input、output。把它合并成兩個(gè),變成 zt 跟 rt,其中一個(gè)還是控制輸出。另外一個(gè)就是說(shuō),原來(lái)是 ft 跟那個(gè) rt 兩個(gè)數(shù)字去控制哪些信息繼續(xù)保留,那么現(xiàn)在要合并成一個(gè) zt。就是說(shuō)我只考慮這一個(gè)因素。你哪些信息保留,1-Zt 跟那個(gè) Zt 平均一下。我覺(jué)得目前看來(lái)這是比較 promising(有前途)的一個(gè)改進(jìn)了。它進(jìn)一步簡(jiǎn)化了,而且建模能力還是相當(dāng)?shù)摹?/span>
這一系列工作為的是如何讓 network 更深,而且是在時(shí)間運(yùn)用角度上更深。
Fixed point neural network
前面兩塊內(nèi)容基本上介紹了一下神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)如何變得更深或者網(wǎng)絡(luò)結(jié)構(gòu)的發(fā)展。下面再簡(jiǎn)單介紹一下另一個(gè)方向,讓網(wǎng)絡(luò)變小,或者是參數(shù)量變得更簡(jiǎn)單或者參數(shù)量變少。簡(jiǎn)單的意義是講原來(lái)那些參數(shù)都是,比如說(shuō) floating point,32 位的 floating point,或者是 16 位的 floating point。那么下一步的工作是我們能不能把這些參數(shù)用一些 8 位的定點(diǎn),或甚至一些二值化(Binary)的+1 和-1 這些數(shù)來(lái)表示。這些工作可以讓網(wǎng)絡(luò)變得更輕量級(jí),所需的存儲(chǔ)更小。
所以這一個(gè)工作是把這個(gè)網(wǎng)絡(luò)定點(diǎn)化,第一步主要是把這些參數(shù)進(jìn)行量化,這一系列的工作我覺(jué)得到極致了,就是可以 binary——二值化的網(wǎng)絡(luò)。如果你把網(wǎng)絡(luò)結(jié)構(gòu)每個(gè)參數(shù)、每個(gè)權(quán)重都二值化,這樣就非常非理想,適合用硬件去實(shí)現(xiàn),而且效率就會(huì)高很多。
這里有一個(gè)簡(jiǎn)單的比較。之前如果是浮點(diǎn)運(yùn)算的話,那每個(gè)卷積其實(shí)就是乘加運(yùn)算,就是一個(gè)核往那一放,對(duì)應(yīng)位置相乘,乘完之后累加,得出一個(gè)數(shù)。如果是二值化的網(wǎng)絡(luò),就變成了一種 XNOR 的操作,加上 bit count 相乘,就是做一些反的亦或,然后去累加,其實(shí)就是去數(shù)到底有多少個(gè) 0,多少個(gè) 1,是奇數(shù)個(gè) 1,還是偶數(shù)個(gè) 1,決定出結(jié)果。這個(gè)操作不僅簡(jiǎn)化了而且也更適合硬件來(lái)實(shí)現(xiàn)。
一個(gè)比較好的一個(gè)工作是它如何去訓(xùn)練這樣的一個(gè)二值化的網(wǎng)絡(luò)。二值化網(wǎng)絡(luò)在訓(xùn)練過(guò)程中的梯度還是用浮點(diǎn)來(lái)表示的,否則你沒(méi)辦法去計(jì)算梯度,去更新這些 weight 了。在反向傳播的時(shí)候仍然要用浮點(diǎn)去表示,但網(wǎng)絡(luò)在正向去算的時(shí)候,就強(qiáng)迫它們每個(gè)節(jié)點(diǎn)、每個(gè) activation 輸出都是二值化的,可以通過(guò)進(jìn)行限制一下范圍或者做一個(gè)直接的量化來(lái)變成二值。所以正向的是二值,反向的時(shí)候可以用浮點(diǎn)操作,去更新這些參數(shù)。
有一些比較新的工作證明至少目前在一些小的集合上,比如 Cifar 10,它的性能跟浮點(diǎn)是很接近的。它的存儲(chǔ)空間可以想象一下,如果從 32 位浮點(diǎn)直接變成二值,大約是能夠簡(jiǎn)化 32 倍了。
所這也是現(xiàn)在神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)發(fā)展一個(gè)很重要的方向,用網(wǎng)絡(luò)結(jié)構(gòu)表示精度,去簡(jiǎn)化,能夠更適合硬件的使用。
下面有一些比較具體的操作,能保證訓(xùn)練成功。因?yàn)楸硎镜木茸儾詈?,還要訓(xùn)練出來(lái)一個(gè)比較穩(wěn)定的性能比較好的網(wǎng)絡(luò)結(jié)構(gòu)是需要一些 trick 的。
這些技巧跟網(wǎng)絡(luò)結(jié)構(gòu)本身沒(méi)有關(guān)系。實(shí)際上深度神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)本身有改進(jìn)之后,它對(duì)很多工作都是有幫助的。我沒(méi)有談具體的分類、檢測(cè)或者分割但是,實(shí)際在很多任務(wù)上,任務(wù)本身的 formulation 是沒(méi)有變的。
什么變了呢?變的是這種最復(fù)雜的需要建模那個(gè)部分替換成神經(jīng)網(wǎng)絡(luò),這邊就舉一個(gè)簡(jiǎn)單的例子,強(qiáng)化學(xué)習(xí)。
強(qiáng)化學(xué)習(xí)
強(qiáng)化學(xué)習(xí),Reinforcement Learning 是現(xiàn)在相當(dāng)火的一個(gè)概念。強(qiáng)化學(xué)習(xí)、監(jiān)督學(xué)習(xí)、非監(jiān)督學(xué)習(xí)都屬于機(jī)器學(xué)習(xí)。監(jiān)督學(xué)習(xí)(supervised learning)的每個(gè)數(shù)據(jù)都有一個(gè)標(biāo)注的結(jié)果后,你學(xué)到一個(gè)集合函數(shù)。無(wú)監(jiān)督學(xué)習(xí)(unsupervised learning)沒(méi)有標(biāo)注,就要學(xué)出一個(gè)函數(shù)來(lái)去擬合。強(qiáng)化學(xué)習(xí)(reinforcement learning)不是給定了標(biāo)注之后再學(xué)習(xí),而是一步一步在一種 online 的狀態(tài)下去學(xué)習(xí),這種學(xué)習(xí)你告訴它好壞,它每次去做一點(diǎn)改進(jìn)。所以 Reinforcement Learning 跟 Deep Learning 之間不屬于隸屬的關(guān)系,而是不同的 learning Paradigm——學(xué)習(xí)范式。
Reinforcement Learning 存在很多年了,最近我們看到它在圍棋,或者一些自動(dòng)控制的任務(wù)中,都有很大的改進(jìn)。改進(jìn)的本身是指最核心的一些部分現(xiàn)在用了深度神經(jīng)網(wǎng)絡(luò)去做近似。
所以 Reinforcement Learning 這個(gè)概念本身就是說(shuō)我是一個(gè) agent,是能夠去自主做決策的實(shí)體。我用一個(gè)大腦來(lái)表示,它可以感知周?chē)臓顟B(tài)、環(huán)境,它會(huì)挑選一些它能選擇的 action 去影響環(huán)境。影響環(huán)境之后,環(huán)境的狀態(tài)會(huì)改變,同時(shí)給出反饋,一個(gè) reward,也會(huì)更新自己的狀態(tài)。這個(gè)過(guò)程是一步一步的:給一個(gè) action,得到一個(gè)反饋改變了環(huán)境,改變了自己,再不斷地去改進(jìn)——希望我的 reward 能夠最大化。這就是強(qiáng)化學(xué)習(xí)的過(guò)程。
Agent 在學(xué)習(xí)如何最大化自己的利益時(shí),有兩個(gè)很重要的函數(shù)。一個(gè)是如何去選擇采取 action 的方法,到底是用什么策略去選擇采取什么行動(dòng),這個(gè)一般叫策略函數(shù)(policy function)。另外一個(gè)是能夠去選擇這些方法的原因。它自己對(duì)這個(gè) action 能帶來(lái)的這種反饋,會(huì)有一個(gè)評(píng)估,這個(gè)評(píng)估叫 value function(價(jià)值函數(shù))。
這些概念其實(shí)都是早就有了?,F(xiàn)在 policy function 和 value function 本身就是比較復(fù)雜的函數(shù)。用深度神經(jīng)網(wǎng)絡(luò)去模擬深度的 DNN,讓 DNN 去模擬去近似。最著名的應(yīng)用是在 AlphaGo 里了,我就不多講了。它將 policy network 和 value network 都用 CNN 去表示、去近似。
這里就把它作為一個(gè)例子,說(shuō)明這些深度神經(jīng)網(wǎng)絡(luò)本身的結(jié)構(gòu)在不斷發(fā)展,它的建模能力不斷提高。提高之后,它就可以用來(lái)近似任何任意的比較復(fù)雜的函數(shù)。如果具有近似復(fù)雜函數(shù)的能力,那么對(duì)很多任務(wù)就有很大的幫助,包括增強(qiáng)學(xué)習(xí)、圖像識(shí)別、語(yǔ)音控制。比如在今后的無(wú)人車(chē)控制中,可能會(huì)用這種強(qiáng)化學(xué)習(xí)的方式去不斷地改進(jìn)、去選擇自己的路徑。但是對(duì)于路徑本身,其實(shí)沒(méi)辦法用一個(gè)很簡(jiǎn)單的一個(gè)函數(shù)去規(guī)定好每次獲得什么輸入之后要去做什么樣的改變什么規(guī)劃什么路徑。
這個(gè)肯定是很復(fù)雜的函數(shù)。這些函數(shù)可以用之前所介紹的那些神經(jīng)網(wǎng)絡(luò)中比較好的一些來(lái)做。也就是說(shuō),你有一個(gè)很好的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)之后,你就可以潛在地用它去做一個(gè)非常復(fù)雜的非線性函數(shù)的模擬,然后可以完成很多任務(wù),這個(gè)在很多應(yīng)用中都會(huì)有幫助。
OK,這基本上就是我今天想分享的內(nèi)容。
聯(lián)系客服