手寫繪圖的分類。 在 Yandex 中報告

幾個月前,我們來自 Google 的同事 實施 Kaggle 上的一項競賽,旨在為聳人聽聞的圖像中獲得的圖像創建分類器 比賽 “快,抽!” 該團隊包括 Yandex 開發人員 Roman Vlasov,在比賽中獲得第四名。 在一月份的機器學習訓練中,Roman 分享了他團隊的想法、分類器的最終實現以及對手的有趣實踐。


- 大家好! 我叫羅馬‧弗拉索夫(Roma Vlasov),今天我將向您介紹《Quick,Draw!》 塗鴉辨識挑戰。

手寫繪圖的分類。 在 Yandex 中報告

我們團隊有五個人。 我是在合併截止日期之前加入的。 我們運氣不好,我們受到了一點動搖,但是我們是從金錢地位上動搖的,他們是從黃金地位上動搖的。 我們光榮地獲得了第四名。

(在比賽期間,各團隊在評分中觀察自己,該評分是根據擬議數據集的一部分顯示的結果形成的。最終的評分又是在數據集的另一部分上形成的。這樣做是為了比賽參與者並沒有針對特定的數據調整自己的演算法,因此,在決賽中,在評分切換時,位置會發生一點震動(來自英文shake up - 混合):在其他數據上,結果可能會是不同的是,羅曼的隊伍是前三名之首,這樣的話,前三名就是金錢、金錢評級區,因為只有前三名才獲得了現金獎勵。改組之後,隊伍已經進入了金錢、金錢的評級區。第四名。同樣,另一隊失去了勝利,失去了金牌位置。-編輯。)

手寫繪圖的分類。 在 Yandex 中報告

這場比賽的意義還在於,葉夫根尼·巴巴赫寧獲得了特級大師,伊万·索辛獲得了大師,羅曼·索洛維耶夫仍然是特級大師,亞歷克斯·帕里諾夫獲得了大師,我成為了專家,現在我已經是大師了。

手寫繪圖的分類。 在 Yandex 中報告

這是什麼“快速繪圖”? 這是谷歌的一項服務。 谷歌的目標是普及人工智慧,並希望透過這項服務展示神經網路的工作原理。 你去那裡,點擊“讓我們畫畫”,然後會彈出一個新頁面,告訴你:畫一個鋸齒形,你有 20 秒的時間來做這件事。 例如,您試圖在 20 秒內畫出一個鋸齒形,如下圖所示。 如果你成功了,網路會說這是一個之字形,你就可以繼續前進。 這樣的照片只有六張。

如果Google的網路無法辨識你畫的內容,該任務就會被打叉。 稍後我會告訴你,一張圖被網路識別與否,將來意味著什麼。

該服務聚集了相當多的用戶,並且所有用戶繪製的圖片都會被記錄下來。

手寫繪圖的分類。 在 Yandex 中報告

我們成功收集了近 50 萬張圖像。 由此,我們比賽的訓練和測試日期就確定了。 順便說一下,測試中的資料量和類別的數量以粗體突出顯示是有原因的。 稍後我會告訴你有關它們的資訊。

資料格式如下。 這些不僅僅是 RGB 圖像,粗略地說,是用戶所做的一切的日誌。 Word 是我們的目標,國家代碼是塗鴉作者的來源地,時間戳是時間。 已識別標籤僅顯示網路是否識別來自 Google 的圖像。 而繪圖本身就是一個序列,是使用者用點繪製的曲線的近似值。 和時間安排。 這是從開始繪製圖畫的時間。

手寫繪圖的分類。 在 Yandex 中報告

資料以兩種格式呈現。 這是第一種格式,第二種是簡化的。 他們從那裡剪掉了時間,並用一組較小的點來近似這組點。 為此他們使用了 道格拉斯-派克演算法。 您有一大堆點可以簡單地近似一條直線,但實際上您可以只用兩個點來近似這條線。 這就是演算法的想法。

數據分佈如下。 一切都很統一,但也有一些異常值。 當我們解決問題的時候,我們並沒有看它。 最主要的是,沒有真正很少的類,我們不必進行加權採樣器和資料過採樣。

手寫繪圖的分類。 在 Yandex 中報告

這些照片是什麼樣子的? 這是“飛機”類及其範例,其中標籤已識別和未識別。 它們的比率約為 1 比 9。如您所見,數據非常吵雜。 我猜這是一架飛機。 如果你看不出來,大多數情況下它只是噪音。 有人甚至試圖寫“飛機”,但顯然是用法語。

大多數參與者只是簡單地採用網格,從這一系列線條中提取資料作為 RGB 圖片,然後將它們放入網路中。 我以大致相同的方式繪製:我拿了一個顏色調色板,用一種顏色繪製了第一條線,該顏色位於該調色板的開頭,最後一條線用另一種顏色繪製,該顏色位於調色板的末尾,並在它們之間我使用這個調色板在任何地方進行插值。 順便說一句,這比在第一張幻燈片上繪製(僅用黑色)提供了更好的結果。

其他團隊成員,例如 Ivan Sosin,嘗試了略有不同的繪畫方法。 在一個通道中,他簡單地繪製了一張灰色圖片,在另一個通道中,他從頭到尾繪製了從32 到255 的每個筆劃的漸變,在第三個通道中,他在所有筆劃上繪製了從32 到255 的漸變。

另一件有趣的事情是 Alex Parinov 使用國家代碼將資訊上傳到網路。

手寫繪圖的分類。 在 Yandex 中報告

比賽中使用的指標是平均精度。 這個競爭指標的本質是什麼? 您可以給出三個謂詞,如果這三個謂詞中沒有正確的謂詞,則得到 0。如果有正確的謂詞,則考慮其順序。 目標結果將被計算為 1 除以您的預測順序。 例如,您建立了三個預測變量,正確的是第一個,然後將 1 除以 1 得到 1。如果預測變數正確且階數為 2,則將 1 除以 2,得到 0,5。 嗯,等等。

手寫繪圖的分類。 在 Yandex 中報告

有了資料預處理——如何畫圖等等——我們已經決定了一點。 我們使用了什麼架構? 我們嘗試使用PNASNet、SENet等胖架構,以及SE-Res-NeXt等已經經典的架構,它們越來越多地進入新的競爭。 還有 ResNet 和 DenseNet。

手寫繪圖的分類。 在 Yandex 中報告

手寫繪圖的分類。 在 Yandex 中報告

手寫繪圖的分類。 在 Yandex 中報告

我們是如何教這個的? 我們採用的所有模型都是在 imagenet 上預先訓練的。 雖然資料量很大,有 50 萬張圖像,但如果你在 imagenet 上預先訓練一個網絡,它會比你從頭開始訓練它顯示出更好的結果。

我們使用了哪些教學技巧? 這就是帶有熱重啟的 Cosing 退火,稍後我將討論它。 這是我在最近的幾乎所有比賽中使用的一種技術,事實證明,用它們可以很好地訓練網格,以達到良好的最小值。

手寫繪圖的分類。 在 Yandex 中報告

接下來降低高原的學習率。 你開始訓練網絡,設定一定的學習率,繼續訓練它,你的損失逐漸收斂到某個值。 例如,您檢查一下,十個時期的損失根本沒有改變。 您將學習率降低一些值並繼續學習。 它再次下降一點,收斂到某個最小值,然後您再次降低學習率,依此類推,直到您的網路最終收斂。

接下來是一個有趣的技術:不要降低學習率,而是增加大量大小。 有一篇同名文章。 當你訓練網路時,你不必降低學習率,你可以簡單地增加批量大小。

順便說一句,這種技術是由亞歷克斯·帕里諾夫(Alex Parinov)使用的。 他一開始的批次大小等於 408,當他的網路達到某個穩定水平時,他只是將批次大小加倍,等等。

事實上,我不記得他的batch size達到了什麼值,但有趣的是Kaggle上有團隊使用了相同的技術,他們的batch size大約是10000。順便說一句,現代的深度學習框架,例如例如, PyTorch 可以讓您輕鬆做到這一點。 您產生批次並將其提交到網絡,而不是按原樣完整提交,而是將其分成塊,以便它適合您的顯卡,計算梯度,並在計算整個批處理的梯度後,更新重量。

順便說一句,本次比賽仍然包含大批量,因為數據非常嘈雜,大批量可以幫助您更準確地近似梯度。

也使用了偽標籤,主要由羅曼·索洛維耶夫使用。 他分批對測試中大約一半的資料進行了採樣,並在這些批次上訓練了網格。

圖片的大小很重要,但事實是你有很多數據,你需要訓練很長時間,如果你的圖片尺寸很大,那麼你會訓練很長時間。 但這並沒有對最終分類器的質量增加太多,因此值得進行某種權衡。 而且我們只嘗試了尺寸不是很大的圖片。

這一切是如何學會的? 首先,拍攝小尺寸的照片,對它們運行幾個epoch,這花費了相當多的時間。 然後給出大尺寸的圖片,訓練網絡,然後更多,更多,以免從頭開始訓練,不浪費很多時間。

關於優化器。 我們使用了 SGD 和 Adam。 這樣就可以得到一個單一模型,在公共排行榜上的速度為0,941-0,946,這是相當不錯的。

如果以某種方式整合模型,您將得到 0,951 左右的值。 如果您再使用一種技術,您將在公共板上獲得 0,954 的最終分數,就像我們得到的一樣。 但稍後會詳細介紹。 接下來我會告訴你我們是如何組裝模型的,以及我們如何能夠達到這樣的最終速度。

接下來我想談談帶有熱重啟的餘熱退火或帶有熱重啟的隨機梯度下降。 粗略地說,原則上,你可以使用任何優化器,但要點是:如果你只訓練一個網絡並逐漸收斂到某個最小值,那麼一切都好,你將得到一個網絡,它會犯某些錯誤,但你可以稍微不同地訓練它。 您將設定一些初始學習率,並根據此公式逐漸降低它。 你降低它,你的網路達到某個最小值,然後你保存權重,並再次設定訓練開始時的學習率,從而從這個最小值向上,並再次降低你的學習率。

因此,您可以同時存取多個最小值,其中您的損失(正負)將相同。 但事實是,具有這些權重的網路會在您的約會上給出不同的錯誤。 透過對它們進行平均,您將得到某種近似值,並且您的速度會更高。

手寫繪圖的分類。 在 Yandex 中報告

關於我們如何組裝模型。 在演講開始時,我說要注意測驗中的資料量和類別的數量。 如果將測試集中的目標數量加 1,然後除以類別數,您將得到數字 330,這是在論壇上寫的 - 測試中的類別是平衡的。 這個可以用。

基於此,Roman Soloviev 提出了一個指標,我們稱之為“代理得分”,它與排行榜相關性非常好。 重點是:您進行預測,取前 1 個預測變數並計算每個類別的物件數量。 接下來,從每個值中減去 330,並將所得絕對值相加。

獲得以下值。 這幫助我們不是創建一個探測排行榜,而是在本地進行驗證並為我們的整合選擇係數。

透過合奏你可以獲得這樣的速度。 我還能做什麼? 假設您使用了測試中的類別是平衡的資訊。

平衡是不同的。 其中之一的例子 ——與第一名的人保持平衡。

我們做了什麼? 我們的平衡非常簡單,這是葉夫根尼·巴巴赫寧(Evgeny Babakhnin)建議的。 我們首先按前1 個對我們的預測進行排序,並從中選擇候選者- 這樣類的數量不會超過330 個。但是對於某些類,最終的預測變數會少於330 個。好吧,讓我們也按前2 個和前​​3 個進行排序,我們也會選擇候選人。

我們的平衡與最初的平衡有何不同? 他們使用迭代方法,選取最受歡迎的類別,並將該類別的機率減少一些,直到該類別不再是最受歡迎的。 我們參加了下一個最受歡迎的課程。 於是他們繼續降低等級,直到所有班級的人數都相等。

每個人都使用正負一種方法來訓練網絡,但並不是每個人都使用平衡。 透過平衡,你可以投資黃金,如果幸運的話,還可以投資金錢。

如何預處理日期? 每個人都以相同的方式預處理日期,無論是正數還是負數——製作手工製作的特徵,嘗試用不同的描邊顏色對時間進行編碼等等。這正是獲得第八名的Alexey Nozdrin-Plotnitsky所說的。

手寫繪圖的分類。 在 Yandex 中報告

他的做法有所不同。 他說,你所有這些手工製作的功能都不起作用,你不需要這樣做,你的人脈應該自己學習這一切。 相反,他提出了可以預處理資料的學習模組。 他將原始資料直接放入其中,沒有進行預處理——點座標和時間。

然後他根據座標計算差異,並根據時間計算平均值。 他想出了一個相當長的矩陣。 他對其應用了幾次一維卷積,以獲得大小為 1xn 的矩陣,其中 n 是點的總數,64 是為了將所得矩陣饋送到任何卷積網絡的層,該層接受通道數- 64.他得到了一個64xn 矩陣,然後由此需要創建一個一定大小的張量,使得通道數等於64。他將所有點X、Y 在64 到0 範圍內歸一化,以創建一個大小為32x32 的張量。 我不知道他為什麼想要 32x32,事情就是這樣發生的。 在這個座標處,他放置了一個大小為 32xn 的矩陣的片段。 所以它最終得到了一個 64x32x32 張量,您可以將其進一步放入卷積神經網路中。 這就是我想說的話。

來源: www.habr.com

添加評論