蘋果的機器學習開發日記:如何設計能在 Apple Watch 即時執行的中文手寫辨識系統

作者 | 發布日期 2017 年 10 月 04 日 12:00 | 分類 Apple , Apple Watch , iOS follow us in feedly

隨著蘋果機器學習日記(Apple ML Journal)開放,蘋果分享設計產品、運用機器學習解決問題的故事也越來越多。近日蘋果就放出一篇關於辨識手寫中文的文章,介紹思考和實現這個功能的過程,文章編譯如下。



隨著手機、平板電腦等行動裝置,以及智慧手錶等可穿戴裝置變得流行甚至不可或缺,手寫辨識也變得前所未有地重要。中文包含很大的字符庫,在這些行動裝置支援中文手寫辨識帶來獨特的挑戰。這篇文章蘋果介紹如何在 iPhone、iPad 和 Watch(繪畫模式)應對這些挑戰、達到中文手寫即時辨識。蘋果基於深度學習的辨識系統,可準確處理高達 3 萬個不同字元。為了達到合理的準確度,蘋果開發人員在數據收集模式、書寫方式的代表性和訓練方式等處專門花心思處理。他們發現,只要使用恰當方式,即便更大的字元庫也可以解決得了。實驗表明只要訓練數據的品質夠高、數量夠大,隨著字元庫增大,辨識準確率只會慢慢下降。

簡介

手寫辨識可增強行動裝置的用戶體驗,尤其中文鍵盤輸入比較複雜。中文手寫辨識也有獨特的挑戰性,因為中文背後的字元庫非常大。其他基於字母的語言中,包含字元的數量級通常也在 100 上下,而中文國標 GB18030-2005 含有漢字 27,533 個,在整個中國範圍還有許多圖形式的字元仍在使用。

為了便於電腦處理,常見的做法是只關注一部分字元,一般是選出日常使用最具代表性的字。根據這樣的思路,中文國標字元集 GB2312-80 僅包含 6,763 個字元(其中一級字元 3,755 個,二級字元 3,008 個)。中國科學院自動化研究所也構建了一個嚴密對齊的字元集,運用在 CASIA 資料庫,共 7,356 個字元。SCUT-COUCH 資料庫的容量也在同一水準。

這些字元集基本反映了全中國作家的常用字。然而個人層面上,每個人之間的「常用字」經常有所不同。許多人至少有幾十個自己的「不常用字」,因為這些字會在相關事物名中出現,反倒不用一個個寫出來。這樣,理想狀況下的中文手寫辨識演算法至少要擴充到 GB18030-2005 中 2 萬多個漢字的水準。

早期辨識演算法主要依靠一筆一劃分析的結構化方法,後來有了去除筆劃順序影響的需求,就引發了人們利用整體形狀資訊建立統計學方法的興趣。然而文本類別的數量越多,清晰地把文本分入一個類別就越難,這些方法顯然會大大提升大字元集下的辨識難度。

對於 MNIST 之類的拉丁字元辨識任務,卷積神經網路(CNN)很快就表現出壓倒性的優勢。只要有足夠的訓練數據、適當補充一些需要的生成樣本,CNN 毫無疑問可有頂尖表現。不過,這些研究的字元類別都相當少。

之前,當蘋果研究人員開始研究如何做大規模中文字元辨識時,似乎明擺著就應該選 CNN。但 CNN 的方法需要把網路拓展到包含接近 3 萬個字元,同時還要保證嵌入式裝置有即時辨識的性能。這篇文章的重點就是介紹如何解決延遲、字元覆蓋率、書寫風格的穩定性等方面問題,達到理想的效能表現。

系統配置

蘋果研究人員在這項研究採用一普遍 CNN 架構,跟之前用在 MNIST 手寫辨識實驗的 CNN 類似。系統總體架構如下圖:

▲ 典型的 CNN 架構(帶連續的 2 組卷積 + 子採樣)。

系統輸入是一張中等分辨率 48×48 的圖像(為了更好的效能),其中包含一個手寫中文字元。然後把它送入幾個包含卷積層和子採樣層的特徵提取層。最後一個特徵提取層透過一個全連接層連接到輸出。

在每個卷積層,蘋果研究人員選擇了能從逐漸變粗糙的粒度中盡量提取特徵的卷積核和 feature map 數量。他們運用一個 2×2 的卷積核,透過一個最大池化層做子採樣。最後一個特徵層包含的小 feature map 數量級一般在 1,000 上下。最後,輸出層給每一類都有一個單獨節點,對 GB2312-80 中級別 1 的漢字就有 3,755 個節點,拓展到所有字元的時候就要接近 30,000。

做為基準線,研究人員在 CASIA benchmark 任務評估這個 CNN 模型。雖然這個任務只涵蓋漢字級別 1 的字元,但在以往文獻有豐富的辨識測試準確率結果。他們使用同樣基於 CASIA-OLHWDB、DB1.0-1.2,分為訓練集和測試集,訓練樣本數量約為 100 萬個。

值得注意的是,蘋果這項研究的關注點是針對產品,所以他們的目標並不是在 CASIA 取得盡可能高的準確率,更關注的是模型大小、推理速度和用戶體驗。所以,他們的優化目標是一個緊湊的、能即時計算結果的系統,它要能對付多種不同書寫風格,對於非標準的筆劃順序也需要有較高的穩定性。這樣下來,即便把線上資料庫也加入評估,他們還是選了基於圖像特徵的辨識方法。他們也把實際觀察到的筆劃變化、外形改變也考慮進來。

下表 1 展示前圖中 CNN 模型的測試結果,其中「Hz-1」代表級別 1 的漢字庫(3,755 個字元),「CR (n)」代表模型的前 n 位辨識結果含有正確字符的準確率。除了常用的首選準確率(n=1)和前 10 位辨識準確率(n=10),表格還加入一項前 4 位準確率(n=4),因為蘋果的用戶介面就是顯示 4 個候選字元,前 4 位準確率是一個重要的衡量用戶體驗標誌。

▲ 表 1 :CASIA 線上資料庫 3,755 個中文字元的測試結果。標準訓練,關聯模型大小 1MB。

之前有研究的首選準確率達 93%,前 10 位準確率達 98%。相比之下,雖然蘋果前 10 位準確率和其他研究是同一水準,但第一位準確率稍低。在蘋果看來,這是為了達到更高的前 4 位準確率做出的平衡;且可能更重要的是,這個模型的大小(1MB)比之前任何類似系統都要小。

上圖表 1 中的系統僅用了 CASIA 的數據進行訓練,沒有用到其他訓練數據。研究人員也很感興趣,如果額外加入自家 iOS 裝置實際採集的手寫數據,來訓練系統會達到怎樣的效果。這些數據涵蓋的書寫風格更多樣,每個字元也有更多對應的訓練樣本。如下圖表 2 就是訓練結果,對應的是同一個 3,755 字元的字元庫。

▲ 表 2 :CASIA 線上資料庫 3,755 個中文字元的測試結果。增強訓練,關聯模型大小 15MB。

雖然這個系統的體積大幅增加(達 15MB),準確率卻只提升一點點(前 4 位準確率的絕對值提升了 2%)。這表明,測試集中的多數書寫風格都已在 CASIA 的訓練集有相當的覆蓋率。不過這也說明增加更多訓練數據並沒有什麼壞處:新增加的書寫風格並不會對模型的原有表現帶來負面影響。

拓展到 3 萬個字元

前文有說過,每個人理想狀況下的「常用字」都不一樣,用戶數目大的時候需要的字庫大小也就遠遠不只 3,755 個。準確挑出需要的字庫不是件簡單直接的事。GB2312-80 定義的簡體中文字元,以及 Big5、Big5E、CNS 11643-92 定義的繁體中文字元,覆蓋範圍也各有不同(從 3,755 到 48,027 個漢字)。近期的還有新增 4,568 個字元的 HKSCS-2008,GB18030-2000 甚至更多。

蘋果想保證用戶的日常用語都能寫出來,不管簡體還是繁體中文、名字或歌名,還有其他常用的標記、視覺符號和 emoji 表情,他們也希望能讓用戶無需轉譯就寫出偶爾會在產品或品牌名中出現的拉丁字元。蘋果遵循國際主流的 Unicode 字元集為字元編碼標準,因為幾乎囊括上面提到的所有字元標準(值得一提的是,Unicode 7.0 在 BD 拓展中可區分 7 萬個字元,而且還在考慮增加更多)。所以蘋果的字元辨識系統選擇關注 GB18030-2005、HKSCS-2008、Big5E 中的漢字部分,以及 ASCII 的核心字元集和一組視覺符號和 emoji 表情,總數大約 3 萬個字元。這對大多數中國用戶來說已是最佳取捨了。

選出模型內在的字元庫之後,下一個關鍵點就是採樣用戶真正使用的書寫風格。雖然不同書寫風格之間,有一些正式規則可用來幫助鑑別,但還會有一些區域性的書寫變化,比如 U+2EBF(艹)的幾種寫法,或者 U+56DB(四)寫得潦草時和 U+306E(の)之間的類似性。

螢幕上顯示的字元也會帶來迷惑,因為有些用戶會希望某些字元以特定樣式顯示。寫得快時也會讓風格變潦草,這會增加字元的模糊性,比如 U+738B(王)和 U+4E94(五)。

最後,增大國際化的程度有時候也會帶來沒有預料到的衝突,比如 U+4E8C(二),寫成連筆的時候就會和拉丁字母「2」和「Z」產生衝突。

蘋果的設計準是給用戶提供全部的輸入可能性,不管像印刷字體,還是潦草、不受約束的寫法。為了囊括盡可能多的字體變形,蘋果研究人員從全中國不同區域的作家處收集數據。讓他們驚訝的是,有不少不常用的字,大多數用戶連見都沒有見過。由於對不常用字的不熟悉,用戶在書寫時可能會猶豫、寫錯筆劃順序,以及造成其他錯誤,都需要納入考慮。

研究人員雇了許多不同年齡段、性別、教育程度的普通中國人,讓他們寫字,收集數據;最終得到的手寫數據也有許多別的數據庫不具的特點:包含多達幾千名用戶的數據,在 iOS 裝置用手指書寫(而不是手寫筆),數據也有許多小批的。其中還有一個好處是 iOS 裝置的採樣會形成非常清晰的手寫筆跡。

研究人員發現非常多樣的書寫方式。如下圖是其中一些 U+82B1(花)的寫法,有的接近列印,有的很潦草,有的變化很大。

實際上,日常生活中用戶經常寫得很快、變化很大,潦草、變形的筆跡看起來會有很大的差別。比如 U+7684(的)和 U+4EE5(以)。

反過來說,有時候不同字也會看起來很相似,造成迷惑。以下 U+738(王)、U+4E94(五)的數據就是明顯的例子。值得注意的是,要能區分潦草的變化就一定需要足夠的訓練數據。

根據前面討論的設計準則,蘋果採集了上千萬個手寫漢字實例用作訓練數據。下面表 3 的結果就是把可辨識的字元數量從前面的 3,755 個字元拓展到接近 3 萬之後得到的。仍然是前文的同一個 CASIA 線上測試。

▲ 表 3 :CASIA 線上資料庫中 30K 個字元的測試結果。

這裡保持同樣的模型大小。前文表 2 的系統只是限制在級別 1 漢字範圍,其他都與表 3 的系統相同。準確率有略微下降,這倒比較符合研究人員的期待,因為大幅增加的覆蓋範圍會帶來額外的混淆,比如前面提過的「二」和「Z」。

比較表 1 到表 3 的結果,可以看到把字元覆蓋範圍擴大 10 倍並不會把錯誤率也擴大 10 倍,或把模型大小變大 10 倍。實際上,對於更大的模型,錯誤率升高慢得多。所以,構建一個覆蓋 3 萬個字元(而不是僅 3,755 字元),同時還有高準確率的中文手寫字元辨識系統,不僅可能,還很可行。

為了說明系統在所有 3 萬個字元中的表現如何,研究人員用一系列不同測試集測試,其中包含所有支援的字元、用上各種書寫風格。表 4(見下圖)是結果的平均值。

當然,表 3 和表 4 的結果不能直接比較,因為是用不同測試集得到的數字。不過,它們的第一位準確率和前四位準確率對整個字元庫都在同一水準。這樣的結果是透過較均衡的訓練模式達到的。

討論

在表意文字工作組 IRG 不斷從不同來源收集文字、提出新的增加建議下,目前大小約為 75,000 的 Unicode 字元集含有的中日韓文表義文字,未來還可能繼續增加。坦白講,之後新增加的字元都是非常罕見的字元(比如歷史出現過的名字或詩歌)。不過,對名字裡剛好有罕見字的人來說,這些工作還是很有意義。

那麼,蘋果未來打算如何應付更大的字元庫呢?這篇文章的實驗展示不同數量的訓練數據下的訓練和測試錯誤率狀況。這樣就可以做近似的推斷,預測更多訓練數據、更多字元需要辨識時的準確率表現如何。

比如,從表 1 到表 3 可以看到,對於增大 10 倍的字元庫和模型相關資源的大小,準確率僅下降(不到)2%。那麼就有理由猜測,對於數目達 10 萬個的字元庫和同倍增加的訓練數據,完全有可能仍然達到 84% 左右的首選準確率和 97% 的前 10 位準確率(對於同樣的網路架構)。

總結來說,構造一個覆蓋多達 3 萬個中文字元的高準確率手寫辨識系統,即便對嵌入式裝置也可以達成。進一步說,隨著字元庫增大,辨識準確率下降非常慢,只要有足夠數量的高品質訓練數據,這對未來可能基於更大字元庫的手寫辨識來說是一個好消息。

(本文由 雷鋒網 授權轉載;首圖來源:蘋果)