我是一個平平無奇的AI神經元

我是一個AI神經元

我是一個AI神經元,剛剛來到這個世界上,一切對我來講都特別新奇。程序員

之因此叫這個名字,是由於個人工做有點像人類身體中的神經元。web

人體中的神經元能夠傳遞生物信號,給它輸入一個信號,它通過處理後再輸出一個信號傳遞給別的神經元,最終傳遞到大腦完成對一個信號的決策和處理。編程

聰明的計算機科學家們受到啓發,在代碼程序裏發明了我:神經元函數跨域

在咱們的世界裏,我只是普普統統的一員,像我這樣的神經元有成百上千,甚至上萬個,咱們按照的形式,組成了一個龐大的神經網絡數組

很快我和隔壁工位的大白開始混熟了,他比我來得早,對這裏要熟悉的多。微信

聽大白告訴我說,咱們這個神經網絡是一個圖像識別的AI程序,只要給咱們輸入一張狗的照片,咱們就能告訴你這是一隻柯基,仍是泰迪、柴犬、二哈···網絡

神經元結構

在大白的指引下,我很快就學會了怎麼工做。app

雖然咱們叫神經元,名字聽起來挺神祕的,但實際上我就是一個普通函數,有參數,有返回值,普通函數有的我都有:編程語言

def neuron(a):
  w = [...]
  b = ...
  ...

我有一個參數a,這個參數是一個數組,裏面的每個元素我把它分別叫作a1,a2,a3···用這個a來模擬我這個神經元收到的一組信號編輯器

人類的神經元是怎麼處理輸入的生物信號我不知道,我估計挺複雜的。但在我這裏就很簡單:我給每個輸入值設定必定的權重,而後作一個簡單的加權求和,最後再加上一個偏移值就行啦!

因此我還有一個數組叫作w,就是權重weight的意思,裏面的每個元素我叫作w1,w2,w3···,至於那個偏移值,就叫它bias

如此一來個人工做大家也該猜到了,就是把傳進來的a裏面的每一個元素和w裏的每個元素作乘法,再加起來,最後加上偏移值,就像這樣:

說到這裏,我忽然想到一個問題,打算去問問大白。

「大白,這些要計算的數據都是從哪裏來的呢?」

「是上一層的神經元們送過來的」

「那他們的數據又是哪來的呢?」,我刨根問題的問到。

大白帶我來到了門口,指向另一個片區說到,「看到了嗎?那裏是數據預處理部門,他們負責把輸入的圖片中的像素顏色信息提取出來,交給咱們神經網絡部門來進行分析。」

「交給咱們?而後呢」

「我們這個神經網絡就像一臺精密的機器,咱們倆只是其中兩個零件,不一樣的權重值某種意義上表明瞭對圖片上不一樣位置的像素關心程度。一旦開動起來,餵給咱們圖片數據,咱們每個神經元就開始忙活起來,一層層接力,把最終的結果輸出到分類器,最終識別出狗的品種。」

神經網絡訓練

正聊着,忽然,傳來一陣廣播提示音,你們都中止了閒聊,回到了各自工位。

「這是要幹啥,這麼大陣仗?」,我問大白。

「快坐下,立刻要開始訓練了」,大白說到。

「訓練?訓練什麼?」

「我們用到的那些權重值和偏移值你覺得怎麼來的?就是經過不斷的訓練得出來的。」

還沒說到幾句話,數據就開始送過來了。按照以前大白教給個人,我將輸入數據分別乘以各自的權重,而後相加,最後再加上偏移bias,就獲得了最後的結果,整個過程很輕鬆。

我準備把計算結果交給下一層的神經元。

大白見狀趕忙制止了我,「等一下!你不能直接交出去」

「還要幹嗎?」

大白指了一下我背後的另外一個傢伙說到:「那是激活函數,得先交給他處理一下」

「激活函數是幹嗎的?」,我問大白。

激活,就是根據輸入信號量的大小去激活產生對應大小的輸出信號。這是在模仿人類的神經元對神經信號的反應程度大小,比如拿一根針去刺皮膚,隨着力道的加大,身體的疼痛感會慢慢加強,差很少是一個道理。」

聽完大白的解釋,我點了點頭,好像明白了,又好像不太明白。

後來我才知道,這激活函數還有好幾種,常常會打交道的有這麼幾個:

  • sigmoid
  • tanh
  • relu
  • leaky relu

激活函數處理完後,總算能夠交給下一層的神經元了,我準備稍事休息一下。

剛坐下,就聽到大廳的廣播:

隨後,又來了一組新的數據,看來我是沒時間休息了,趕忙再次忙活了起來。

這一忙沒關係,一直搞了好幾個小時,來來回回重複工做了幾萬次,我都快累癱了。

損失函數 & 優化方法

趁着休息的空當,我又和大白聊了起來。

「大白,剛剛我們這麼來來回回折騰了幾萬次,這是在幹啥啊?」

大白也累的上氣不接下氣,緩了緩才說到:「這叫作網絡訓練,經過讓咱們分析大量不一樣品種狗的圖片,讓咱們訓練出合適的權重和偏移值,這樣,咱們就變得會認識狗品種了,之後正式工做的時候給咱們新的狗的圖片,我們也能用學到的知識去分辨啦!

「那究竟是怎麼訓練的,你給我說說唄」,我繼續問到。

「你剛纔也看到了,廣播裏不斷通知更新權重和偏移值。這訓練就是經過不斷的嘗試修改每一層神經元的權重值和偏移值,來不斷優化,找到最合適的數值,讓咱們對狗的種類識別準確率最好!」,大白說到。

「不斷嘗試修改?這麼多神經元,難不成看運氣瞎碰?」

大白給了我一個白眼,「怎麼可能瞎試,那得試到猴年馬月去了。我們這叫深度學習神經網絡,是可以自學習的!」

他這麼一說我更疑惑了,「怎麼個學習法呢?」

「其實很簡單,我們先選一組權重偏移值,作一輪圖片識別,而後看識別結果和實際結果之間的差距有多少,把差距反饋給我們後,再不斷調整權重和偏移,讓這個差距不斷縮小,直到差距接近於0,這樣我們的識別準確率就越接近100%」

「額,聽上去好像很簡單,不過我還有好多問題啊。怎麼去衡量這個差距呢?具體怎麼調整權重偏移呢?調整幅度該多大好呢?」,我小小的腦殼一下冒出了許多的問號。

大白臉上露出了難以想象的表情,「小夥子,不錯嘛!你一下問出了神經網絡的三個核心概念。」

「是哪三個?快給我說說」

大白喝了口水,頓了頓接着說到,「首先,怎麼去衡量這個差距?這個活,我們部門有我的專門幹這活,他就是損失函數,他就是專門來量化我們的輸出結果和實際結果之間的差距。量化的辦法有不少種,你空了能夠去找他聊聊」

「那第二個呢?」

「第二個,具體怎麼調整,這也涉及到我們神經網絡中一個核心概念,他就是優化方法,我們部門用的最多的是一個叫梯度降低的方法。那玩意兒有點複雜,一時半會兒給你說不清楚,大概差很少就是用求導數的方式尋找如何讓損失函數的損失值變小」,大白繼續耐心的解釋着。

「好吧,那第三個核心概念是什麼?」

「你剛不是問調整幅度嗎?這個調整幅度過小了不行,這樣我們訓練的太慢了,那得多訓練不少回。太大了也不行,要是一不當心錯過了那個最優值,損失函數的結果就會來回搖擺,不能收斂,因此有一個叫學習速率的數值,一般須要程序員們憑藉經驗去設定」

我還沉浸在大白的講解中,廣播聲再次響起:

看來程序員修改了學習速率,我只好打起精神,繼續去忙了,真不知道什麼時候才能訓練達標啊~

往期TOP5文章

我是Redis,MySQL大哥被我害慘了!

CPU明明8個核,網卡爲啥拼命折騰一號核?

由於一個跨域請求,我差點丟了飯碗

完了!CPU一味求快出事兒了!

哈希表哪家強?幾大編程語言吵起來了!


本文分享自微信公衆號 - 編程技術宇宙(xuanyuancoding)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索