เลเยอร์การฝังในเครือข่ายประสาทคืออะไร


92

ในหลายห้องสมุดเครือข่ายประสาทมี 'ชั้นฝัง' เหมือนในKerasหรือลาซัน

ฉันไม่แน่ใจว่าฉันเข้าใจฟังก์ชั่นของมันแม้จะอ่านเอกสาร ตัวอย่างเช่นในเอกสาร Keras มันบอกว่า:

เปลี่ยนจำนวนเต็มบวก (ดัชนี) เป็นเวกเตอร์ที่มีขนาดคงที่เช่น [[4], [20]] -> [[0.25, 0.1], [0.6, -0.2]]

คนที่มีความสามารถสามารถอธิบายสิ่งที่มันทำและเมื่อคุณจะใช้มันได้หรือไม่


แก้ไข: เกี่ยวกับการวางในเอกสารมีไม่มากวางจากเอกสารดังนั้นคำถามของฉัน ฉันไม่เข้าใจการเปลี่ยนแปลงที่เกิดขึ้นหรือทำไมจึงควรใช้

อย่างไรก็ตามนี่คือวิธีอธิบายใน Keras:

การฝัง

keras.layers.embeddings.Embedding (input_dim, output_dim, init = 'uniform', input_length = None, น้ำหนัก = None, W_regularizer = None, W_constraint = None, mask_zero = False) เปลี่ยนจำนวนเต็มบวก (ดัชนี) , เช่น. [[4], [20]] -> [[0.25, 0.1], [0.6, -0.2]]

รูปร่างอินพุต: 2D เทนเซอร์พร้อมรูปร่าง: (nb_samples, sequence_length) รูปร่างเอาท์พุท: ตัวนับ 3D ที่มีรูปร่าง: (nb_samples, sequence_length, output_dim) อาร์กิวเมนต์:

input_dim: int> = 0 ขนาดของคำศัพท์เช่น 1 + ดัชนีจำนวนเต็มสูงสุดที่เกิดขึ้นในข้อมูลอินพุต output_dim: int> = 0 มิติของการฝังหนาแน่น

และนี่คือวิธีอธิบายในลาซานญ่า:

ชั้นสำหรับงานแต่งงานคำ อินพุตควรเป็นตัวแปร Tensor ชนิดจำนวนเต็ม

พารามิเตอร์: ขาเข้า: อินสแตนซ์ของเลเยอร์หรือทูเปิล

เลเยอร์ป้อนเข้าไปในเลเยอร์นี้หรือรูปร่างอินพุตที่คาดไว้

input_size: int

จำนวนชุดแต่งงานที่แตกต่างกัน การฝังครั้งสุดท้ายจะมีดัชนี input_size - 1

output_size: int

ขนาดของการฝังแต่ละอัน

W: Theano แบ่งปันตัวแปร, การแสดงออก, อาร์เรย์ที่มีค่าหรือเรียกได้

ค่าเริ่มต้นการแสดงออกหรือการเริ่มต้นสำหรับเมทริกซ์การฝัง นี่ควรเป็นเมทริกซ์ที่มีรูปร่าง (input_size, output_size) ดู lasagne.utils.create_param () สำหรับข้อมูลเพิ่มเติม

ตัวอย่าง

>>> from lasagne.layers import EmbeddingLayer, InputLayer, get_output
>>> import theano
>>> x = T.imatrix()
>>> l_in = InputLayer((3, ))
>>> W = np.arange(3*5).reshape((3, 5)).astype('float32')
>>> l1 = EmbeddingLayer(l_in, input_size=3, output_size=5, W=W)
>>> output = get_output(l1, x)
>>> f = theano.function([x], output)
>>> x_test = np.array([[0, 2], [1, 2]]).astype('int32')
>>> f(x_test) array([[[  0.,   1.,   2.,   3.,   4.],
                      [ 10.,  11.,  12.,  13.,  14.]],
                     [[  5.,   6.,   7.,   8.,   9.],
                      [ 10.,  11.,  12.,  13.,  14.]]], dtype=float32)

1
โปรดวางสิ่งใดก็ตามที่จำเป็นเพื่อทำความเข้าใจและตอบคำถามของคุณ ผู้คนจะไม่ต้องการไปที่อื่น & อ่านเอกสารเพื่อตอบคำถามของคุณ
gung

1
ฉันได้ทำการเปลี่ยนแปลงที่คุณถาม
ฟรานเชสโก

ฉันมีข้อสงสัยเดียวกันและพบเอกสารสองสามฉบับที่พูดถึงมัน ต่อไปนี้เป็นสิ่งที่น่าสนใจ: cs.cmu.edu/afs/cs/academic/class/15782-f06/slides/ ...... fromthebottomoftheheap.net/2011/01/21/…เห็นได้ชัดว่ามันใช้ความล่าช้าในอนุกรมเวลาที่ป้อนและพิจารณาว่า ความล่าช้าเป็นเวกเตอร์ใหม่
abutremutante

ดูวิดีโอนี้: youtube.com/watch?v=bvZnphPgz74 ประมาณ 30 นาทีเขาพูดถึงงานแต่งงาน
ปีเตอร์

คำตอบ:


69

เกี่ยวข้องกับ Word2Vec

==========================================

Word2Vec ในภาพง่าย ๆ :

รูป word2vec

คำอธิบายเชิงลึกเพิ่มเติม:

ฉันเชื่อว่ามันเกี่ยวข้องกับนวัตกรรม Word2Vec ล่าสุดในการประมวลผลภาษาธรรมชาติ โดยประมาณ Word2Vec หมายถึงคำศัพท์ของเราไม่ต่อเนื่องและเราจะได้เรียนรู้แผนที่ซึ่งจะฝังแต่ละคำลงในพื้นที่เวกเตอร์อย่างต่อเนื่อง การใช้การแทนพื้นที่เวกเตอร์นี้จะช่วยให้เรามีการนำเสนอคำศัพท์ของเราอย่างต่อเนื่องและกระจาย หากตัวอย่างเช่นชุดข้อมูลของเราประกอบด้วย n-gg เราอาจใช้คุณลักษณะคำต่อเนื่องของเราเพื่อสร้างการนำเสนอแบบกระจายของ n-g ของเรา ในขั้นตอนของการฝึกอบรมรูปแบบภาษาเราจะได้เรียนรู้คำนี้ฝังแผนที่ ความหวังคือการใช้การเป็นตัวแทนอย่างต่อเนื่องการฝังของเราจะแมปคำที่คล้ายกันกับภูมิภาคที่คล้ายคลึงกัน ตัวอย่างเช่นในกระดาษสถานที่สำคัญการกระจายคำและวลีและองค์ประกอบของพวกเขาสังเกตในตารางที่ 6 และ 7 ว่าวลีบางวลีมีวลีเพื่อนบ้านที่ดีที่สุดจากมุมมองทางความหมาย การแปลงเป็นพื้นที่ต่อเนื่องนี้ช่วยให้เราสามารถใช้แนวคิดการวัดอย่างต่อเนื่องของความคล้ายคลึงกันเพื่อประเมินคุณภาพความหมายของการฝังของเรา

คำอธิบายการใช้รหัส Lasagne

ลองแบ่งส่วนย่อยของรหัส Lasagne:

x = T.imatrix()

x คือเมทริกซ์ของจำนวนเต็ม ได้ไม่มีปัญหา. แต่ละคำในคำศัพท์สามารถแทนค่าจำนวนเต็มหรือการเข้ารหัสแบบเบาบางร้อน ดังนั้นถ้า x คือ 2x2 เรามีสองดาต้าพอยน์แต่ละตัวมี 2 กรัม

l_in = InputLayer((3, ))

ชั้นการป้อนข้อมูล 3 หมายถึงขนาดของคำศัพท์ของเรา ดังนั้นเราจึงมีคำตัวอย่างเช่นw0,w1,w2

W = np.arange(3*5).reshape((3, 5)).astype('float32')

นี่คือเมทริกซ์การฝังคำของเรา มันคือเมทริกซ์คอลัมน์ 3 แถวคูณ 5 พร้อมรายการ 0 ถึง 14

จนถึงตอนนี้เรามีการตีความดังต่อไปนี้ คำศัพท์ของเรามี 3 คำและเราจะฝังคำของเราลงในช่องว่างแบบเวกเตอร์ 5 มิติ ตัวอย่างเช่นเราอาจแสดงหนึ่งคำและอีกคำหนึ่งและคำอื่น ๆเช่นการเข้ารหัสเบาบางร้อน เราสามารถดู matrix เป็นการฝังคำเหล่านี้ผ่านการคูณเมทริกซ์ ดังนั้นคำแรกSimmilarly9] w0=(1,0,0)w1=(0,1,0)w2=(0,0,1)Ww0w0W=[0,1,2,3,4].w1w1W=[5,6,7,8,9]

ควรสังเกตเนื่องจากการเข้ารหัสเบาบางหนึ่งร้อนที่เราใช้คุณยังเห็นสิ่งนี้เรียกว่าการค้นหาตาราง

l1 = EmbeddingLayer(l_in, input_size=3, output_size=5, W=W)

ชั้นฝัง

 output = get_output(l1, x)

การแสดงออกของสัญลักษณ์ Theano สำหรับการฝัง

f = theano.function([x], output)

ฟังก์ชัน Theano ที่คำนวณการฝัง

x_test = np.array([[0, 2], [1, 2]]).astype('int32')

การหยุดที่นี่เพื่อหารือเกี่ยวกับความหมายของ x_test การแจ้งเตือนครั้งแรกว่ารายการ x_test ทั้งหมดอยู่ใน {0, 1, 2}, ช่วงที่ (3) x_test มี 2 ดาต้าพอยน์ ครั้งแรก DataPoint [0, 2] หมายถึง 2 กรัมและครั้งที่สอง DataPoint หมายถึง 2 กรัมw_2)( w 1 , w 2 )(w0,w2)(w1,w2)

เราต้องการฝัง 2 กรัมโดยใช้เลเยอร์การฝังคำของเราตอนนี้ ก่อนที่เราจะทำอย่างนั้นให้แน่ใจว่าเราชัดเจนเกี่ยวกับสิ่งที่ควรส่งคืนโดยฟังก์ชันการฝัง f 2 กรัมเทียบเท่ากับเมทริกซ์ [[1, 0, 0], [0, 0, 1]] การใช้เมทริกซ์การฝัง W ของเรากับเมทริกซ์กระจัดกระจายนี้ควรให้ผลลัพธ์: [[0, 1, 2, 3, 4], [10, 11, 12, 13, 14] หมายเหตุเพื่อให้การคูณเมทริกซ์เป็นไปได้เราต้องใช้คำว่าการฝังเมทริกซ์ผ่านการคูณที่ถูกต้องกับการแสดงเมทริกซ์แบบกระจายของ 2 กรัมของเราW(w0,w2)W

f(x_test) 

ผลตอบแทน:

          array([[[  0.,   1.,   2.,   3.,   4.],
                  [ 10.,  11.,  12.,  13.,  14.]],
                 [[  5.,   6.,   7.,   8.,   9.],
                  [ 10.,  11.,  12.,  13.,  14.]]], dtype=float32)

เพื่อโน้มน้าวให้คุณทราบว่า 3 x_test = [[5, 0], [1, 2]]ไม่แน่นอนแสดงขนาดคำศัพท์ให้ลองป้อนเมทริกซ์ คุณจะเห็นว่ามันทำให้เกิดข้อผิดพลาดเมทริกซ์ที่ตรงกัน


2
คำตอบนี้ดี ฉันมีส่วนขยายหนึ่งคำถามนี้ซึ่งฝังชั้นเลเยอร์แปลงตัวอย่างความเชื่อมั่นของ Imdb (หรือชุดข้อมูลอื่น ๆ ) เป็นเวกเตอร์ เหล่านี้คือชุดของคำ
ลางสังหรณ์

1

ในhttps://stackoverflow.com/questions/45649520/explain-with-example-how-embedding-layers-in-keras-works/ฉันพยายามที่จะเตรียมตัวอย่างโดยใช้ 2 ประโยคเป็นตำราของ keras_to_sequences

'This is a text' --> [0 0 1 2 3 4]

และฝังชั้น ขึ้นอยู่กับเลเยอร์ Keras 'การฝัง' ทำงานอย่างไร เลเยอร์การฝังแรกเริ่มต้นเวกเตอร์การฝังที่สุ่มและจากนั้นใช้เครื่องมือเพิ่มประสิทธิภาพเครือข่ายเพื่ออัปเดตในทำนองเดียวกันเหมือนกับที่มันทำกับเลเยอร์เครือข่ายอื่น ๆ ใน keras

[0 0 1 2 3 4] --> 
[-0.01494285, -0.007915  ,  0.01764857],
[-0.01494285, -0.007915  ,  0.01764857],
[-0.03019481, -0.02910612,  0.03518577],
[-0.0046863 ,  0.04763055, -0.02629668],
[ 0.02297204,  0.02146662,  0.03114786],
[ 0.01634104,  0.02296363, -0.02348827]

ด้านบนจะเป็นเวกเตอร์การฝังเริ่มต้นสำหรับประโยค (สูงสุด) 6 คำและ output_dim ของ 3

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.