計算機雖然有了人工智能的程序支持,但事實上也不能將其機器學習的功能等同于像人類那樣。至少,到目前還不是這樣。那么,向Google的圖片識別或者Facebook的M應用等一類系統,它們是怎么能夠理解自然語言或視覺的呢?下面,是人工智能系統Josh的自我獨白:
簡而言之,我們將單詞和短語的含義以數字的形式儲存在計算機上。目前,市場上有許多這類產品,比如將單詞轉換成向量形式的工具word2vec,該工具使用淺人工神經網絡來計算文字嵌入。此外也有一些諸如記憶網絡的技術,能夠自主學習文本,進行一些簡單有限的問答。
在過去的幾年中,由于先進的人工神經網絡算法有了許多驚人的成果,圖像識別和數字信號處理技術異常火爆。但是相比較之下,同是人工智能領域的理解自然語言方面似乎顯得困難得多,為什么呢?
自然語言處理本質上是另一種約束關系的問題
研究自然語言是困難的,很多時候甚至超過了我們的想象——因為語言永遠不變的是改變,因為全世界有千萬種語言……無論你的觀點是什么,自然語言難以為算法所處理的最大原因是——我們沒有足夠多的樣本。
確實,我們擁有大量的文本資源,包括書籍、博客、社交媒體等。但即便如此,我們得到的用以分析的文本相對來說還顯得不足。看一看以下圖片:
當我們分析音頻數據,或者圖像數據時,事實上我們得到的數據信息比人類意識中的要多。以佳能5D Mark III相機為例,攝影領域的人通常會說這是一個令人尊敬的相機,因為它有著5760 x 3840的分辨率。因為每個顏色像數都分別由紅、藍、綠、α值(RGBA)來表示,所以每個像素擁有4個標準數值。在其原始格式當中,一張這種像素的圖片大約含有88.47 MB數據。相比較之下,莎士比亞的所有作品也只有4.4 MB。一個像數等于4個字節,一個字符則占一個字節。
這意味著:
1、解析文本的時候,每一個令牌(字詞的NLP術語)更多的是影響文本的整體分析。
2、生成文本的時候,每一個被選出來的令牌才能影響結果。
換句話說,在文本當中,字符和令牌才是占據主要成分的元素,和像素不同。
好了,那我們是如何處理文本的呢?在一個嚴格的解析系統中,我們需要用數值格式來表示文本,提示為向量形式。現在我們還是要繼續理解很簡單的向量表示,而未來則可以處理更為復雜的表達了。
我們來以幾個詞組為例:
1.Turn on the lights(開燈)
2.Power on the lights(打開燈的電源)
3.What time is it?(現在幾點?)
4.What is the current time?(當前時間是幾點?)
我們需要做的是創建一個叫詞典的東西。換句話說,我們想要將現有的詞組用特有的令牌技術來創建一個詞匯表。然后,我們需要對信息做一些隱式預處理,去掉標點符號等。最后,我們給每一個唯一碼賦予其各自的索引,從而生成自己的詞匯向量:
0 turn
1 on
2 the
3 lights
4 power
5 what
6 time
7 is
8 it
9 current
由于每一個字代表一個索引,因此我們可以使用反向散列數據結構來得到每個單詞的索引,然后無論是否每一個字都是給定文本,我們都可以將這些字表示為一系列的布爾值(布爾值:是“真” True 或“假” False 中的一個)。比如,上述例句就可以表示為:
1.{ 1, 1, 1, 1, 0, 0, 0, 0, 0, 0 }
2.{ 0, 1, 1, 1, 1, 0, 0, 0, 0, 0 }
3.{ 0, 0, 0, 0, 0, 1, 1, 1, 1, 0 }
4.{ 0, 0, 1, 0, 0, 1, 1, 1, 0, 1}
有了這些向量,我們可以使用向量點積得到一個粗略的相似度計算。所謂點積,就是接受在實數R上的兩個向量并返回一個實數值標量的二元運算。
所以,上述前兩個例句的點積就是:
1 * 0 = 0
1 * 1 = 1
1 * 1 = 1
1 * 1 = 1
0 * 0 = 0
0 * 0 = 0
0 * 0 = 0
0 * 0 = 0
0 * 0 = 0
0 * 0 = 0
這些數值加起來和是3。而如果將第一個和第三個句子做同樣的處理:
1 * 0 = 0
1 * 0 = 0
1 * 0 = 0
1 * 0 = 0
0 * 0 = 0
0 * 1 = 0
0 * 1 = 0
0 * 1 = 0
0 * 1 = 0
0 * 0 = 0
那么和為0。這就是說,“Turn on the lights”和“What time is it”沒有絲毫的相似。
你也許會發現,我們目前的詞匯處理規模小到只有10個詞。不過,未來當我們探索更多語義詞嵌入時,我們還可以壓縮向量,獲得更準確的上下文理解和表達。