漢字生成模型的那些坑

引言

人工智慧技術目前仍處於技術積累期,人們真正希望看到的人工智慧技術是要能夠融入生活中的,真正為人們帶來便利的技術,但目前能真正做到「實用化」的人工智慧產品並不多。除了大家熟悉的,如機器翻譯、聊天機器人、語音識別與生成、圖像分類、路徑規劃、智能跟蹤等,我認為漢字生成是最具有潛力、最早一批進入市場的人工智慧產品,因為其領域相對較小(與Robot、NLP等比較),而且成本硬體較低,這兩年漢字生成問題也確實受到了越來越多的關注。

目前漢字生成模型主要應用場景包括生成手寫字體以及生成手寫漢字兩個方面。生成手寫字體主要是想解決中文字太多,設計一款新的字體需要巨大工程量的問題,如果設計師僅手工設計少量的字體文字,然後機器就能根據這些問題提取出其中的風格然後自動設計生成剩餘文字,則可以極大減輕設計師的負擔。生成手寫漢字是指採集某人的書寫筆跡,讓計算機學會模仿他的風格進行書寫,我認為這是漢字生成的最終目標,具體而言就是要讓機械臂拿起筆幫我們處理手寫任務,比如代替我們寫親筆信,或幫我們做手寫試卷等。

漢字生成模型在技術上主要可以分為基於筆跡的生成模型以及基於圖像的生成模型。二者的區別來源於應用場景的不同,若以設計一個會寫字的機械臂為目標,則必須得到具體的筆畫;若以生成新的中文字體為目標,則可以僅依賴文字的圖像。

目前研究手寫問題的文章並不是很多,但手寫問題涉及到的領域非常廣,不僅需要RNN而且若想真正做好還需要加入GAN、RL等人工智慧技術。

一、樣本的表示方法

樣本的表示是一個值得探究的問題:

  • 如果樣本是文字圖像:
    • 大家很容易理解,但這種方法會損失書寫的筆畫順序、文字起點與終點、每一個筆畫的起筆與落筆等信息。
    • 該方法也是有優點的,比如容易用CNN處理,比較容易提取風格特徵,生成速度較快(一次生成整張圖片)等。
  • 如果樣本是文字筆跡:
    • 首先考慮是連續問題還是離散問題~

    • 離散問題具體而言就是將文字投影到一個離散的畫布上如100x100像素的畫布,其中的每一個筆畫由若干點組成,每一個點對應一個整數型坐標。更進一步,可以將每一個筆畫分解為若干個關鍵點,關鍵點直接用直線連接,這樣一條直線上就可以僅用起點與終點表示,可以省略掉中間的點。離散問題在生成文字時(每次生成一個點)可以看作一個分類問題,因此比較容易訓練,但其最大問題就是會損失一定精度。
    • 連續問題就是將文字投影到(-1,1)的連續空間,用浮點數來精確表示每個點的坐標,這也是目前主流的方法,其本質上是一個回歸問題,也因此訓練難度較高。
  • 樣本是筆跡,在連續空間上,如何具體表示呢?
    • 如果樣本是筆跡,筆跡是由點組成的,每一個點p可以用{(x,y),(a,b,c)}這種形式來表示,其中(x,y)是坐標,(a,b,c)是一個分類向量,可以設a是一個筆畫的結束,b是一般的點,c是整個文字的結束。因此一個文字就可以用點的序列表示:S=(p_0,p_1,cdots,p_n)
    • 還有一個問題需要考慮,就是應該採用絕對坐標還是相對坐標呢?絕對坐標很容易理解,而相對坐標就是下一個點的(x,y)並不是絕對位置,而是相對於上一個點的偏移。個人以為,兩種方法皆可,但是相對表示表現更好,因為誤差不會躍層向下傳播。

二、用RNN完成最基本的生成任務

我們首先考慮一個最簡單的生成模型:給若干個漢字的訓練樣本(筆跡樣本),然後訓練神經網路來生成風格類似的文字。

具體而言,就是用一個RNN訓練,RNN的輸入是要書寫文字的高維特徵向量和一個開始標識

  • 高維特徵向量代表我需要生成哪一個文字,其實也可以用一個one-hot向量表示,但由於漢字的數量很多,用一太長的向量表示比不上用一個更有意義的維度較低的向量表示,這也是借鑒了NLP中的word2vec的思想,這個更有意義的向量應該可以反映出要生成的漢字的固有特徵。另外高維特徵向量需要預先訓練,可以採用自編碼技術,或截取一個已訓練神經網路的特徵提取部分。

  • 開始標類似於NLP中的一段話的開始標誌,如<begin>Hello world<end>,中的<begin>,具體到文字生成中,開始標誌是一個特殊的點如{(0,0),(0,1,0)}

具體的生成方法採用一次生成一個點的方式進行,直到生成結束點為止,舉例而言就是給出一個文字比如「宋」,然後一筆一划地生成一個手寫的「宋」,生成流程如圖所示:

在訓練中,Loss的定義至關重要,在連續空間中採用傳統的L2損失函數可能會導致無法擬合多值函數的問題,因此建議採用Mixture Density Loss,具體可以參考這裡。

總體而言,做到這一步就算實現了一個簡單的demo了,但是還有很多地方需要優化,離實用還有很多工作要做,我們將繼續往前探索。

三、風格提取與遷移

風格提取與遷移問題最近比較熱,比如生成風格化的圖片,生成某人的聲音等。風格提取主要是為了解決樣本少的問題,我們希望我們設計的手寫機器人能夠僅訓練某個用戶的少量手寫文字就能自動分析出該用戶的手寫風格,然後再根據先驗知識(所有中文文字的書寫規則)就可以生成訓練集中未出現過的文字。

風格遷移就是強制神經網路學習到目標字體與參考字體間風格的異同,具體來說就是求出風格轉移函數font_2=f(font_1),比如輸入一個宋體的「我」字,輸出楷體的「我」。最早的基於圖像的風格遷移演算法採用了傳統的CNN模型,在訓練時,輸入參考字體(如宋體),輸出目標字體(如楷體),訓練完後在生成時輸入新的參考字體,生成對應的目標字體,網路結構和生成示例如下:

(圖片來源:Rewrite: Neural Style Transfer For Chinese Fonts)

這種僅採用CNN的基於圖像的風格遷移演算法整體表現並不是很好,在差異比較大的字體之間的遷移效果欠佳,這說明只通過字體的圖像,神經網路難以學習到漢字風格的深度特徵。

所以最近又有研究者將樣本由圖片表示替換為筆跡表示,現已較好地解決了風格遷移問題,風格遷移效果如下圖所示:

(圖片來源: Automatic Generation of Large-scale Handwriting Fonts via Style Learning)

這種演算法首先對參考文字進行筆跡(點)的提取,然後再對目標字體也提取相等數量的點,然後求二者的誤差,作為最終的Loss。但現有的這種基於筆跡的演算法仍有改進空間,因為該演算法在提取筆跡(關鍵點的個數)和loss的定義上都還是人為設定的,在這兩個方面應該還有較大優化的空間,真正的人工智慧應該儘可能地減少人為干預。

總之風格提取在文字生成演算法中還有一段較長的路要走,其主要研究點應該包括如何更好地定義風格的異同,如何設計一種盡量少依賴人工干預的,魯棒性更強的表示方法;以及如何優化存儲風格的神經網路結構。

四、更真實的文字

我們人在書寫的過程中,哪怕寫100個「我」字,也不會出現兩個完全相同的。但是傳統的神經網路無法解決差異化輸出的問題,我們用一個訓練好的神經網路,輸出的文字總是一模一樣的,因此這樣的手寫機器人仍不能代替人來寫字。

目前,尚未看到有關手寫漢字領域的差異化輸出相關研究。但是在圖像生成領域有一些相關的解決方案,那就是對抗網路生成模型GAN。該模型包括生成器(G)和鑒別器(D),前者用一個隨機的100維向量作為輸入,目的是為了生成一個與訓練集中的圖像類似(風格相似)的一張圖像,後者是一個二元分類器,用於鑒別該圖像是否是在訓練集中,每次訓練時將生成的圖像與訓練集中的圖像各取50%,進行有監督的學習,標籤就是該圖像是真實的還是偽造的。生成器需要儘可能生成具有類似風格的圖片,而鑒別器要儘可能區分偽造的和真實的,具體公式可以表示為:

min limits_G max limits_D D(x)-D(G(z))

該方法有些類似RL中的policy方法,兩個網路同時訓練,同時優化。訓練完畢後,生成器可以看成是將訓練樣本的高維特徵提取出來了,其輸入的向量就是高維特徵向量,根據該向量生成一張圖片。

在手寫問題上,我們可以採用該方法提取同一個文字的高維表示,然後在其中添加偽隨機因子,由此生成各對應文字的不同副本。

五、數據來源問題

漢字生成模型由Demo到實用化還有較長的一段路要走,其中一個重要的問題就數據樣本採集問題。目前表現最佳的演算法主要採用具備更豐富信息的基於筆跡的樣本數據,但是通常採集這種具有筆跡信息的樣本是比較困難的,要麼需要特製的手寫筆,要麼需要手寫板,最經濟的也需要裝一個手機APP(用手寫筆在手機屏幕上寫)。但是實際上每個人都有大量的現成的寫在紙上的字跡(圖片樣本),如果能夠利用這些手寫數據則可以獲得更好的用戶體驗,同時也節約了人力物力。有些論文中提出了用人工的方法或一些特定的演算法來提取筆跡但這顯然不是良策,更好的方法應該是採用增強學習的方法,讓機器自己學習如何由圖片樣本提取筆跡,然後在此基礎上進行進一步的訓練,目前與這個點相關的研究較少,筆者也正在探索之中。

另外,若要盡一步減小人為干預,在增強學習之前還需要進行預處理,要有一個定位器和一個識別器,用於定位和識別已有圖片樣本中的每一個文字。(這些都是坑啊~~~)

六、小結

最後總結一下漢字生成模型的那些坑以及每個坑需要用什麼土來填:

  1. 如何表示文字:建議採用基於點的序列來表示,每個點可表示為{(x,y),(a,b,c)}的形式。

  2. 如何生成文字:採用RNN網路每次生成一個點,直到生成具有結束標誌的點。

  3. 如何提取文字風格:用已有的數據訓練一個風格遷移網路,保存風格信息。

  4. 如何讓生成的文字更真實(各不相同):用對抗網路(GAN)提取每個文字的高維特徵,並在此基礎上加入偽隨機因子。
  5. 如何充分利用已有的圖片樣本數據:採用增強學習(RL)的方法,讓機器自己學習如何由圖片樣本提取筆跡。

參考文獻:

  1. Generating Sequences with Recurrent Neural Networks.

  2. Generating online fake Chinese characters with LSTM-RNN,」 2015. [Online]. Available: Recurrent Net Dreams Up Fake Chinese Characters in Vector Format with TensorFlow
  3. Automatic Generation of Personal Chinese Handwriting by Capturing the Characteristics of Personal Handwriting.

  4. Drawing and Recognizing Chinese Characters with Recurrent Neural Network.

  5. Automatic Generation of Large-scale Handwriting Fonts via Style Learning.

  6. Learning Typographic Style.

  7. Rewrite: Neural Style Transfer For Chinese Fonts [Online]. Available:kaonashi-tyc/Rewrite
  8. Generative Adversarial Nets.

推薦閱讀:

關於AI學習方法的思考——產品經理入門人工智慧
不用人類知識成為圍棋大師:AlphaGo Zero 【附 AlphaGo Zero ,AlphaGo 論文下載】
CNN入門講解:如何理解卷積神經網路的結構
做自己喜歡的遊戲就像在陽光燦爛的下午打開一本書

TAG:汉字 | 人工智能 | 自动生成 |