前幾天,論智曾報道了這么一個項目:Uber提出CoordConv:解決了普通CNN的坐標變換問題。文中講到,Uber AI的工程師們發現卷積神經網絡無法將空間表示轉換成笛卡爾空間中的坐標和獨熱像素空間中的坐標。更重要的是,他們還對這一限制提出了解決方法,即CoordConv。
論文一經推出,就收獲了不少點贊,連我們的編譯版本閱讀量也很可觀,小編甚是欣慰。可是沒過幾天,一位名叫Filip Piekniewski的朋友在他的個人博客上寫道:“這種微不足道的進步也值得這樣贊美……”這位計算機視覺工程師用52行代碼就做出了和論文同樣的結果,讓我們看看他是如何剖析CoordConv的吧。以下是論智的編譯。
簡介
關于深度學習的論文,我讀的很多,經常一個星期讀好幾篇的樣子,所以目前為止可能讀了幾千份論文。機器學習或深度學習有一個基本的問題,即這些論文總是處在科學和工程之間的“無人之境”上,我將它成為“學術工程(academic engineering)”,具體解釋如下:
我個人認為,一篇科學論文應該傳遞一種觀點,使其有能力解釋某種東西。例如一篇證明一個數學定理的論文或者表示某些物理現象的模型。另外,科學論文應該以實驗為基礎,實驗的結果能告訴我們有關顯示的基本情況。雖然如此,科學論文的中心仍是對自然事實的普遍性和觀察進行總結。
一篇工程類論文應該展示解決某一特殊問題的方法。在不同的應用上,問題的類型也不相同,有時可能很無聊,但是對某些人是很有價值的。對一篇工程論文來說,重點和科學論文有所不同:解決方案的普遍性也許不是最重要的,重要的是這一方案能夠實際運用。也就是說,給定可用條件,該解決方案比之前的方法更便宜、更高效。所以說工程類論文的重點是應用,其余的部分都是用于支撐該方法能解決問題的觀點。
而機器學習介于兩者之間,這一領域既有科學類論文(例如介紹反向傳播的那篇),也有明顯的工程類論文,其中描述了很實用的解決方法。但是大部分論文都更偏向工程一點,為了顯示優越性,其中取消了特別的技巧,經過一些不重要的數據測試之后就宣布這種方法的成功。
除此之外還有第四種論文,它們的確包含某種觀點,這種想法可能是有用的,但卻是不值一提的。為了掩蓋這令人尷尬的事實,作者們美名其曰這是“學術工程”,從而讓論文看上去“高大上”了許多。
好巧不巧,Uber最近就發表了這樣一篇論文——An Intriguing Failing of Convolutional Neural Networks and CoordConv Solution,下面我就要好好剖(shou)析(si)這一成果。
解剖開始
讓我們直接進入正題
現在我們知道,這篇論文的中心是,研究者發現卷積神經網絡在需要坐標的任務中表現得不是很好,詳細地說,即輸出標簽或多或少的是輸入元素坐標的正函數,并不表示輸入的其他屬性。
卷積網絡確實在此類問題上表現的不好,因為特征映射的結構,從福島邦彥提出新認知機(Neocognitron)后,在設計時就忽略了這些坐標的位置。所以Uber AI的作者提出了一種解決方法:在卷積層中加入坐標,將其當做額外的輸入映射。
聽起來這個方法很好,但是作者實際上提出的方法,也是很多從業者經常會想當然的方法——他們添加的特征更適合對想要的輸出進行解碼。任何從事計算機視覺的專家都不會對加入特征感到陌生,雖然這只是深度學習圈子里一個小話題。現如今,深度學習中的研究者們已然脫離了實際應用,聲稱我們應該只使用學到的特征,因為“這種方法更好”。這么說深度學習圈里的人們也開始認同特征工程了啊……
訓練
不管怎樣,這篇論文加入了一個特征,明確表示出了坐標的值。接著作者在一個名為“Not-so-Clevr”的數據集上進行測試(這個數據集的名字很皮),那么他們的試驗是不是真的聰明呢?讓我們進一步分析。
其中一個任務是基于坐標生成獨熱圖像,或者從獨熱圖像中生成坐標。他們表示在卷積網絡中加入坐標的確可以大大提高性能。
等等,冷靜一下,如果他們不直接上手TensorFlow,而是直接創建一個神經網絡來解決獨熱編碼到坐標的變換問題的話……就不用任何訓練啊。對于這個問題我會進行三種操作:卷積、非線性激勵和求和。好在這些都是卷積神經網絡的基礎組成部分:
import scipy.signal as sp
import numpy as np
# Fix some image dimensions
I_width = 100
I_height = 70
# Generate input image
A=np.zeros((I_height,I_width))
# Generate random test position
pos_x = np.random.randint(0, I_width-1)
pos_y = np.random.randint(0, I_height-1)
# Put a pixel in a random test position
A[pos_y, pos_x]=1
# Create what will be the coordinate features
X=np.zeros_like(A)
Y=np.zeros_like(A)
# Fill the X-coordinate value
for x in range(I_width):
X[:,x] = x
# Fill the Y-coordinate value
for y in range(I_height):
Y[y,:] = y
# Define the convolutional operators
op1 = np.array([[0, 0, 0],
[0, -1, 0],
[0, 0, 0]])
opx = np.array([[0, 0, 0],
[0, I_width, 0],
[0, 0, 0]])
opy = np.array([[0, 0, 0],
[0, I_height, 0],
[0, 0, 0]])
# Convolve to get the first feature map DY
CA0 = sp.convolve2d(A, opy, mode='same')
CY0 = sp.convolve2d(Y, op1, mode='same')
DY=CA0+CY0
# Convolve to get the second feature map DX
CA1 = sp.convolve2d(A, opx, mode='same')
CX0 = sp.convolve2d(X, op1, mode='same')
DX=CA1+CX0
# Apply half rectifying nonlinearity
DX[np.where(DX<0)]=0
DY[np.where(DY<0)]=0
# Subtract from a constant (extra layer with a bias unit)
result_y=I_height-DY.sum()
result_x=I_width-DX.sum()
# Check the result
assert(pos_x == int(result_x))
assert(pos_y == int(result_y))
print result_x
print result_y
一個熱點位圖進行坐標轉換、一個卷積層、一個非線性激勵、一個求和以及最后從一個減法,無需學習,50多行Python代碼,搞定。
接下來讓我們試試在GAN上進行合成生成任務,其中一個還有坐標特征,另一個沒有。在論文的附錄中有這么一個表格:
他們嘗試在ImageNet上將坐標特征添加到ResNet-50網絡的第一個圖層上。我猜作者希望在這里看到較大的提升,因為ImageNet的類別讀數并不是位置的函數(如果這里存在偏差,那么訓練時的數據增強過程就應該完全清除)。
所以他們用100個GPU進行了測試(100個啊!),但是直到小數點后第三位,結果才有些許提升。100個GPU就提高了這么一點兒,要不然讓谷歌或者Facebook的人用10000個GPU試試,說不定能在小數點后第二位就看到變化了呢(逃)。
總結
這篇論文的確吸引人,它在當下“一切向計算力看齊”的大背景下還能揭露深度學習的缺陷實屬不易。但為什么是Uber提出這個問題?如果是一些學生做出這樣的成績也就罷了,但是Uber AI不是搞自動駕駛的嗎?
更有意思的是這篇論文在推特上受到很多人,甚至深度學習專家的表揚。他們太過于看重GPU的表現力了,殊不知這明明只需要幾行Python就能解決……
-
神經網絡
+關注
關注
42文章
4774瀏覽量
100904 -
計算機視覺
+關注
關注
8文章
1698瀏覽量
46033 -
深度學習
+關注
關注
73文章
5507瀏覽量
121298
原文標題:Uber成果CoordConv被diss,深度學習上演“皇帝的新衣”
文章出處:【微信號:jqr_AI,微信公眾號:論智】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論