時間序列表示


自然界的數據類型(用於神經網絡處理)大致可分為兩種,一種是未知相關的數據(如卷積神經網絡中處理的二維圖片),另一種叫做序列信號(也可以理解為時間軸上的數據)。

比如一段語音,就是一個序列信號,因為它的數據之間有一個時間的先后順序;再比如聊天記錄,它可能並不是一個時間序列,但是我們閱讀的時候會有一個先后順序。這種沿着一個時間序列不停的產生信號的數據我們就稱之為序列(信號)。

 

在深度學習中就有一種網絡使用了這種數據處理方式,它就是RNN(循環神經網絡,結構如上圖),RNN的應用之一就是自然語言處理。在自然語言處理中(拿文本翻譯來說),我們總是需要一個單詞一個單詞的按先后順序讀入,從而產生和翻譯結果中一一對應的關系。

現假設某一英文句子有十個單詞,每個單詞用長度為4的一維向量來表示,那么這個句子就可以用一個shape[10,4]的tensor來表達。

Sequence embedding的一種表示方法為[b,seq_len,feature_len],其中b代表句子個數,seq_len代表每句話中的單詞個數,feature_len代表每個單詞表示成數據的長度。

另一種表示方法為[seq_len,b,feature_len],這種表達方式可以理解為每次在第seq_len時刻(某單詞出現的時刻,seq_len進行時間上的滑動處理)有b條信號曲線(波形曲線),每條曲線上對應一個feature_len向量

序列並不限於自然語言處理等直觀的含序列關系的數據處理,它也可以用於圖像處理,因為圖像的像素與像素之間本身就存在一個上下文關系。

序列是從String類型到數據類型的轉換,但是數值中存在大小關系,而String句子中往往不存在大小關系而是存在語義關系。那么如何實現一個這樣的轉換呢(不僅僅是邏輯上的轉化還有語義上的轉化)?

對於不同的需求,也有不同的處理方式。

比如,如果系統只需要處理一些特定的地點信號(從文本中提取地名),這樣的任務就可以通過簡單的onehot編碼實現,即每一個地名對應一個label,但是這種方式的缺點也是顯而易見的——浪費儲存空間(onehot編碼中大部分都是0,只有一個位置是1)、高維度(日常交流中人的詞匯量上萬甚至上十萬),而優點就是可以保留語義相似度並且可訓練,即語義相似的單詞之間可以通過概率的方式展示出來,比如,“男性”一詞,我們可以訓練使得“男人”,“男生”與它進行高相似度匹配,通過onehot處理的結果就是以top概率展示出來。

對於Word embedding,最常見的有兩種embadding方式,一種叫Word2Vec,顧名思義,就是將單詞轉化為向量,另一種叫GloVe(關於它可參考文章:https://blog.csdn.net/u014665013/article/details/79642083

在tensorflow中提供了一個很簡單的層來幫助我們學習語言文字的表示方法,使用過程如下:

import tensorflow as tf
from tensorflow import keras

x = tf.range(5)
x = tf.random.shuffle(x)
print(x)

net = keras.layers.Embedding(10,4)
print(net(x))

 

可以理解為我們要分析十個地名,每個地名使用長度為4的數據表示

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM