Embedding理解
嵌入層將正整數(下標)轉換為具有固定大小的向量 ------官網
詞嵌入是一種語意空間到向量空間的映射,簡單說就是把每個詞語都轉換為固定維數的向量,并且保證語意接近的兩個詞轉化為向量后,這兩個向量的相似度也高,
舉例說明embedding程序:
“Could have done better”
- 通過索引對該句子進行編碼,每個單詞分配一個索引,上面的句子就會變成這樣:
122 8 114 12
- 創建嵌入矩陣,即每一個索引需要分配多少維向量,也就是說每個詞需要轉化為多少維向量,這里設定為5,嵌入矩陣就會變成這樣:
索引122對應的詞向量:0.0190721 -0.04473796 0.03923314 0.04681129 -0.02183579
索引8對應的詞向量:0.01421751 -0.00090249 0.01750712 -0.03774468 0.04996594
索引114對應的詞向量:-0.04607415 0.04186441 0.02681447 -0.00218643 0.03448829
索引12對應的詞向量:-0.03162882 0.03427991 0.0324514 0.03953638 0.01771886
下面參考蘇神的一段話,我理解的是經常一起出現的詞詞向量數值會比較接近,也就是說經常一起共線的詞語意是相似的,天吶,我是理解錯了,還是這不在我的常識范圍內呀,任重道遠!!!
最后,解釋一下為什么這些字詞向量會有一些性質,比如向量的夾角余弦、向量的歐氏距離都能在一定程度上反應字詞之間的相似性?這是因為,我們在用語言模型無監督訓練時,是開了視窗的,通過前n個字預測下一個字的概率,這個n就是視窗的大小,同一個視窗內的詞語,會有相似的更新,這些更新會累積,而具有相似模式的詞語就會把這些相似更新累積到可觀的程度,我舉個例子,“忐”、“忑”這兩個字,幾乎是連在一起用的,更新“忐”的同時,幾乎也會更新“忑”,因此它們的更新幾乎都是相同的,這樣“忐”、“忑”的字向量必然幾乎是一樣的,“相似的模式”指的是在特定的語言任務中,它們是可替換的,比如在一般的泛化語料中,“我喜歡你”中的“喜歡”,以及一般語境下的“喜歡”,替換為“討厭”后還是一個成立的句子,因此“喜歡”與“討厭”必然具有相似的詞向量,但如果詞向量是通過情感分類任務訓練的,那么“喜歡”與“討厭”就會有差異較大的詞向量,-----蘇神,來自參考資料2
Keras中embedding引數詳解
from keras.layers.embeddings import Embedding
keras.layers.Embedding(input_dim, #詞匯表大小,就是你的文本里你感興趣詞的數量
output_dim, #詞向量的維度
embeddings_initializer='uniform',# Embedding矩陣的初始化方法
embeddings_regularizer=None,# Embedding matrix 的正則化方法
activity_regularizer=None,
embeddings_constraint=None, # Embedding matrix 的約束函式
mask_zero=False, #是否把 0 看作"padding" 值,取值為True時,接下來的所有層都必須支持 masking,詞匯表的索引要從1開始(因為檔案填充用的是0,如果詞匯表索引從0開始會產生混淆,input_dim
=vocabulary + 1)
input_length=None)# 輸入序列的長度,就是檔案經過padding后的向量的長度,
'''
函式輸入:尺寸為(batch_size, input_length)的2D張量,
batch_size就是你的mini batch里的樣本量,
input_length就是你的檔案轉化成索引向量(每個詞用詞索引表示的向量)后的維數,
函式輸出:尺寸為(batch_size, input_length,output_dim)的3D張量,
上面說了,output_dim就是詞向量的維度,就是詞轉化為向量,這個向量的維度,
比如word2vec把“哈哈”轉化為向量[1.01,2.9,3],那么output_dim就是3.
'''
代碼案例說明
舉例1:
#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
@author:
@contact:
@time:
@context:
"""
from keras.layers.embeddings import Embedding
from keras.models import Sequential
import numpy as np
#我們隨機生成第一層輸入,即每個樣本存盤于單獨的list,此list里的每個特征或者說元素用正整數索引表示,同時所有樣本構成list
input_array = np.random.randint(1000, size=(32, 10))
'''
[[250 219 228 56 572 110 467 214 173 342]
[678 13 994 406 678 995 966 398 732 715]
...
[426 519 254 180 235 707 887 962 834 269]
[775 380 706 784 842 369 514 265 797 976]
[666 832 821 953 369 836 656 808 562 263]]
'''
model = Sequential()
model.add(Embedding(1000, 64, input_length=10))#詞匯表里詞999,詞向量的維度64,輸入序列的長度10
# keras.layers.Embedding(input_dim, output_dim, input_length)#詞匯表大小,詞向量的維度,輸入序列的長度
print(model.input_shape)
print(model.output_shape)
'''
(None, 10) #其中 None的取值是batch_size
(None, 10, 64)
input_shape:函式輸入,尺寸為(batch_size, 10)的2D張量(矩陣的意思)
output_shape:函式輸出,尺寸為(batch_size, 10,64)的3D張量
'''
model.compile('rmsprop', 'mse')
output_array = model.predict(input_array)
assert output_array.shape == (32, 10, 64)
print(output_array)
print(len(output_array))
print(len(output_array[1]))
print(len(output_array[1][1]))
'''
[
[[] [] [] ... [] [] []]
[[] [] [] ... [] [] []]
...
[[] [] [] ... [] [] []]
]
32:最外層維數32,32個樣本
10:第二層維數10,每個樣本用10個詞表示
64:最內層維數64,每個詞用64維向量表示
'''
舉例2:
#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
@author:
@contact:
@time:
@context:
"""
from keras.preprocessing.text import one_hot
from keras.preprocessing.sequence import pad_sequences
from keras.models import Sequential
from keras.layers.embeddings import Embedding
#我們定義一個檔案集合存盤于List,每個檔案為list的一個元素,每個檔案都對應一個標簽,存盤于labels
docs = ['Well done!',
'Good work',
'Great effort',
'nice work',
'Excellent!',
'Weak',
'Poor effort!',
'not good',
'poor work',
'Could have done better.']
labels = [1,1,1,1,1,0,0,0,0,0]
vocab_size = 50#估計的詞匯表大小,設定時要比真實的詞匯量大,不然會產生不同單詞分配了相同的索引,
#通過索引對上面10個句子進行編碼,one_hot編碼映射到[1,vocab_size],不包括0
encoded_docs = [one_hot(d, vocab_size) for d in docs]
print(encoded_docs)
'''
[[3, 38], [20, 9], [36, 28], [15, 9], [21], [5], [45, 28], [1, 20], [45, 9], [31, 37, 38, 10]]
'''
# 文本編碼成數字格式并padding到相同長度,這里長度設定為4,在后面補0,這也是為什么前面one-hot不會映射到0的原因,
max_length = 4
padded_docs = pad_sequences(encoded_docs, maxlen=max_length, padding='post')
print(padded_docs)
'''
[[ 3 38 0 0]
[20 9 0 0]
[36 28 0 0]
[15 9 0 0]
[21 0 0 0]
[ 5 0 0 0]
[45 28 0 0]
[ 1 20 0 0]
[45 9 0 0]
[31 37 38 10]]
'''
# define the model
model = Sequential()
model.add(Embedding(vocab_size, 8, input_length=max_length))
print(model.input_shape)
print(model.output_shape)
'''
(None, 4)
(None, 4, 8)
'''
model.compile('rmsprop', 'mse')
output_array = model.predict(padded_docs)
assert output_array.shape == (10, 4, 8)
print(len(output_array))
print(len(output_array[1]))
print(len(output_array[1][1]))
print(output_array)
'''
10
4
8
[[[ 0.04572607 -0.03112372 0.01548124 0.0287031 0.03369636
-0.00907223 -0.02674365 0.0497326 ]
[ 0.02971635 0.01706659 0.01427769 0.02391822 0.02066484
0.03235774 0.00140371 -0.01571052]
[-0.00396045 -0.04596293 0.00576807 -0.0294588 -0.03388958
-0.0161563 -0.03131516 0.02193661]
[-0.00396045 -0.04596293 0.00576807 -0.0294588 -0.03388958
-0.0161563 -0.03131516 0.02193661]]
[[ 0.00637207 0.01458801 -0.02587212 0.0391363 0.04890009
-0.00473984 0.01941831 -0.03002635]
[ 0.02272599 0.01335565 -0.03088844 0.01404381 -0.00329325
0.0016606 0.00242132 -0.04546838]
[-0.00396045 -0.04596293 0.00576807 -0.0294588 -0.03388958
-0.0161563 -0.03131516 0.02193661]
[-0.00396045 -0.04596293 0.00576807 -0.0294588 -0.03388958
-0.0161563 -0.03131516 0.02193661]]
[[-0.02061187 -0.01111162 0.04552659 0.0447114 -0.02017692
0.04908471 0.00620199 0.04637216]
[ 0.04651392 -0.01801343 0.01927176 -0.03393314 -0.02526757
-0.00044692 0.01945822 0.01561001]
[-0.00396045 -0.04596293 0.00576807 -0.0294588 -0.03388958
-0.0161563 -0.03131516 0.02193661]
[-0.00396045 -0.04596293 0.00576807 -0.0294588 -0.03388958
-0.0161563 -0.03131516 0.02193661]]
[[ 0.04023353 -0.04503194 -0.01476847 0.04025214 -0.01467079
-0.04541937 0.00791662 0.04561491]
[ 0.02272599 0.01335565 -0.03088844 0.01404381 -0.00329325
0.0016606 0.00242132 -0.04546838]
[-0.00396045 -0.04596293 0.00576807 -0.0294588 -0.03388958
-0.0161563 -0.03131516 0.02193661]
[-0.00396045 -0.04596293 0.00576807 -0.0294588 -0.03388958
-0.0161563 -0.03131516 0.02193661]]
[[ 0.03823347 -0.01298066 -0.01494864 -0.00328387 -0.00303971
0.02827323 0.0077986 0.02893318]
[-0.00396045 -0.04596293 0.00576807 -0.0294588 -0.03388958
-0.0161563 -0.03131516 0.02193661]
[-0.00396045 -0.04596293 0.00576807 -0.0294588 -0.03388958
-0.0161563 -0.03131516 0.02193661]
[-0.00396045 -0.04596293 0.00576807 -0.0294588 -0.03388958
-0.0161563 -0.03131516 0.02193661]]
[[-0.00584649 -0.03266752 -0.043061 0.02855167 -0.0270277
0.01577503 -0.03172879 0.03462131]
[-0.00396045 -0.04596293 0.00576807 -0.0294588 -0.03388958
-0.0161563 -0.03131516 0.02193661]
[-0.00396045 -0.04596293 0.00576807 -0.0294588 -0.03388958
-0.0161563 -0.03131516 0.02193661]
[-0.00396045 -0.04596293 0.00576807 -0.0294588 -0.03388958
-0.0161563 -0.03131516 0.02193661]]
[[ 0.04572607 -0.03112372 0.01548124 0.0287031 0.03369636
-0.00907223 -0.02674365 0.0497326 ]
[ 0.04651392 -0.01801343 0.01927176 -0.03393314 -0.02526757
-0.00044692 0.01945822 0.01561001]
[-0.00396045 -0.04596293 0.00576807 -0.0294588 -0.03388958
-0.0161563 -0.03131516 0.02193661]
[-0.00396045 -0.04596293 0.00576807 -0.0294588 -0.03388958
-0.0161563 -0.03131516 0.02193661]]
[[ 0.04651392 -0.01801343 0.01927176 -0.03393314 -0.02526757
-0.00044692 0.01945822 0.01561001]
[ 0.00637207 0.01458801 -0.02587212 0.0391363 0.04890009
-0.00473984 0.01941831 -0.03002635]
[-0.00396045 -0.04596293 0.00576807 -0.0294588 -0.03388958
-0.0161563 -0.03131516 0.02193661]
[-0.00396045 -0.04596293 0.00576807 -0.0294588 -0.03388958
-0.0161563 -0.03131516 0.02193661]]
[[ 0.04572607 -0.03112372 0.01548124 0.0287031 0.03369636
-0.00907223 -0.02674365 0.0497326 ]
[ 0.02272599 0.01335565 -0.03088844 0.01404381 -0.00329325
0.0016606 0.00242132 -0.04546838]
[-0.00396045 -0.04596293 0.00576807 -0.0294588 -0.03388958
-0.0161563 -0.03131516 0.02193661]
[-0.00396045 -0.04596293 0.00576807 -0.0294588 -0.03388958
-0.0161563 -0.03131516 0.02193661]]
[[ 0.04632286 -0.03914303 -0.00696329 0.04238543 0.04322089
-0.02889879 0.0167807 0.03662675]
[ 0.03823347 -0.01298066 -0.01494864 -0.00328387 -0.00303971
0.02827323 0.0077986 0.02893318]
[ 0.02971635 0.01706659 0.01427769 0.02391822 0.02066484
0.03235774 0.00140371 -0.01571052]
[ 0.04477728 -0.02921386 0.03259372 -0.04354361 -0.02253401
0.04778937 0.03554988 0.01400479]]]
'''
參考資料
參考資料1 keras官網
參考資料2 蘇神博客
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/20046.html
標籤:其他
上一篇:知網爪巴蟲 2.0
