小白也能機器學習--用tensorflow寫一首「海子」味道的詩
人人皆可機器學習
人工智慧、機器學習、深度學習這樣的流行詞可能很多人早就聽說過,但大多數人都認為這些是高深莫測的技術。
如果現在你問哪些人工智慧裡面的牛人們,如果要從事/轉行人工智慧,需要做些什麼準備的話,他們可能會給你傳達這樣的感受:
- 有紮實的線性代數基礎
- 深入理解神經網路的理論知識(畢竟深度學習就是有很多層的神經網路嘛)
- 有紮實的數理統計和概率論的基礎
- 深入理解機器學習的理論知識
- 最好是博士學位,起碼得是研究生吧
- 10年以上的編碼或者機器學習開發經驗
好像我這種小白就沒辦法趕上機器學習的浪潮了?
很久以前,大家覺得搞IT的人都是「高科技」人才。現在,中國從事網際網路的「高科技」人才已經超過1600萬了。
很多網際網路/科技行業的從業者,不瞭解作業系統的記憶體定址方法,不瞭解TCP/IP的三次握手協議,不瞭解計算機為什麼看到一段程式碼就會「自動幹活」,但一點都不妨礙他們在這個行業幹得風生水起。
人工智慧也是類似的。
理解機器學習的思維模式,能用別人做好的易用工具包做一些小練習,慢慢培養興趣、然後根據實際需要鑽研一些理論,成為人工智慧行業的從業者。
所以,我寫這篇文章的目的就是告訴大家,像我這種小白也能通過tensorflow.keras這樣簡單易用的API,接觸到高深莫測的深度學習來。
我的基礎
- 線性代數只記得矩陣怎麼相乘;
- 概率統計知道正態分佈的概念(表示式已經寫不出來);
- 程式設計從大學畢業以後就丟了,邊寫python還邊查教程;
- 小本畢業,但專業課早已還給老師,頂多是知道個名詞;
如果我也能入門,那麼別擔心:非碼農的小白,也能機器學習!
我們要幹什麼
這次我要來做一件聽起來很酷的事情,「模仿」海子的口吻寫詩。
這件事情很重要,因為:
- 海子已經不在世間,再也沒辦法看到他寫新東西了;
- 聽起來這事很「高深莫測」、很「智慧」;
- 完成後很有成就感,某種程度能「裝逼」;
- 最重要的是,最終「模仿」的效果肯定很爛。但是詩歌爛就爛吧,反正你不能用分數高低評價它;
題外話
不少人搞不清楚人工智慧、機器學習、深度學習這三個次的關係。反正媒體經常混淆來報道。
從嚴謹的學術角度看:

從業界實用的角度看,深度學習(很多層的神經網路)模型是目前應用價值最高的。
所以實踐中可以把深度學習≈人工智慧。於是很多人搞混也就不奇怪了。
「模擬」寫詩的步驟
就想經典的把大象放進冰箱需要三步:把冰箱們開啟->把大象放進去->把冰箱門關上。
我們這次模擬寫詩也需要這麼三步:
1.把詩歌整理成機器需要的格式;
2.讓機器學習海子的詩歌;
3.給機器點靈感,讓機器寫幾句詩歌;
把詩歌整理成機器需要的格式
因為我們的目的是通過這個很酷的例子對機器學習感興趣,所以能少程式設計就少程式設計。
深度學習使用的是矩陣運算,也就是在機器裡面存的是一堆數字。第一件事情就是要把中文變成數字,怎麼辦?
使用一種專業術語叫做one-hot編碼的方式,實質上是有一個字典,記錄每個中文字對應的阿拉伯數字,然後再把這個阿拉伯數字變成010101的向量。

為了簡單且適應自家小機器,不用任何中文分詞功能,就一個個字進行轉換。

(程式碼部分忽略不影響閱讀)
讓機器學習海子的詩歌
機器學習的思維方式跟我們傳統的寫程式碼不同。
傳統的寫程式碼是我寫好了一堆規則:
- 如果看到了「面朝大海」,那麼下一句規則就應該是「春暖花開」;
- 如果看到了「餵馬」,下一句規則就應該是「劈柴」;
- 如果看到了「陌生人」,下一句規則就應該是「我也為你祝福」;
所以你為了能寫詩這個「裝逼」的行為,你要研究非常多文法、文學、寫作的知識,然後用計算機把這些東西變成規則。如果xxx,那麼就yyy。
而機器學習的思維方式不是這樣。機器學習的思維方式是給他看很多的資料:
- 如果看到了「面朝大海」,那麼海子寫的下一個字是「春」;
- 如果看到了「我的青」,那麼海子寫的下一個字也是「春」;
- 如果看到了「殘酷的」,那麼海子寫的下一個字還是「春」;
然後讓機器去學大量這樣的資料,那麼下次再出現「殘酷的」三個字的時候,機器就會根據它過往學過的經驗, 預測下一個字「最有可能」是哪個漢字 。

(傳統程式設計是人寫演算法,然後算出答案;機器學習是給大量的資料和答案,機器學規則,再將規則用於預測新資料的答案)
在這次的練習裡面,我們採用的方式是讓機器看40個字(資料),然後告訴它海子寫的下一個字(答案),然後試圖讓機器總結出這裡面的規則,然後用這個規則來寫點新東西。
在這裡我採用了RNN模型中的LSTM模型,要介紹它的內涵已經超過了我的能力,大體邏輯是這樣的:

由第一個字「面」計算引數1,然後由引數1和第二個字「朝」計算引數2,由引數2和第三個字「大」計算引數3,由引數3和最後一個字「海」得到引數4。
可以看到,引數4依次受到了面、朝、大三個字所計算引數的影響,最後得到預測漢字為「春」。

(同樣可以忽略這些程式碼,keras提供的高階API,使得機器學習就想樂高搭積木一樣容易。這是我在有GPU的伺服器上跑的時間。速度是我筆記本的20倍)

(acc是準確率,99%的準確率。忽略過擬合、測試集、交叉驗證集等問題)。
在經過50次訓練以後,機器找規則這件事情已經準確率很高了。
給點靈感,讓機器寫幾句詩歌
在前面的機器學習思維裡面,我們知道了給機器一句話,然後機器就會輸出它認為概率最高的下一個字。
- 比如我們給機器「面朝大海」,機器認為下一個字從概率上最高的是A;
- 把「朝大海A」作為輸入,機器預測下一個字概率最高的是B;
- 我們再把「大海AB」作為輸入,機器預測下一個字為C;
- 把「海ABC」作為輸入,得到下一個預測字D;
如此重複,我們就可以看到機器寫的詩歌「面朝大海ABCD」了。
不過我們在這裡加一點點靈感,就是不讓機器返回概率最高的那個字,而是在概率都比較高的字裡面隨機選一個新的字,產生一個有靈感變化的新作品。
你可以想象,因為我沒有任何的語言學知識,這樣隨機選的結果應該不會有太好的結果。

(同樣可以繼續忽略程式碼)
讓我們看看機器寫的詩歌有多麼匪夷所思吧:

再找一首看看:

你看,雖然是「狗屁不通」的文法,但是我們沒有用到複雜的語言學知識,程式碼也沒有什麼高等數學或者python的高階功能,整個程式下來不過100來行程式碼而已。
希望你能通過這個方式,打消機器學習「高深莫測」的恐懼,一起來「玩」吧。
臭不要臉的自我介紹
我叫黎晨,英文名LC,是我中文拼音的簡稱,跟LV並無關係;
性別男,遵紀守法,無不良前科。我的很多朋友都說我是「死變態」。所以我經常宅在家裡不出去禍害社會。
為此,我向政府申請維護社會公序良俗的獎勵,但還沒有獲得任何回覆;
00年開始接觸網際網路,可是很年輕。在網際網路牛市造福浪潮中連小小的牛尾巴都沒沾到,不過,我會繼續努力的;
我知乎的所有文章均為無版權宣告。無須徵求本人意見,可以隨意修改轉載。
當然歡迎關注我的微信公眾號交流:小晨想太多