Giới thiệu¶
Embedding là một trong những chuyên môn trả một vector với số chiều rộng lớn, thông thường ở dạng thưa, về một vector với số chiều nhỏ, thông thường ở dạng dày quánh. Phương pháp này quan trọng đặc biệt hữu ích với những đặc thù khuôn khổ với số thành phần rộng lớn ở tê liệt cách thức hầu hết nhằm trình diễn từng độ quý hiếm thông thường là một trong những vector dạng one-hot. Một cơ hội hoàn hảo, những độ quý hiếm tăng thêm ý nghĩa tương tự động nhau ở ngay sát nhau nhập không khí embedding.
Ví dụ nổi trội nhất là trình diễn những kể từ nhập một cỗ tự vị bên dưới dạng số. Khi tự vị với mặt hàng triệu kể từ, trình diễn những kể từ bên dưới dạng one-hot vector dẫn cho tới số chiều vô nằm trong rộng lớn. Hơn nữa, những kể từ này sẽ có được khoảng cách đều nhau cho tới từng kể từ không giống (căn bậc nhị của 2), dẫn theo việc thiếu hụt vấn đề độ quý hiếm mang lại việc huấn luyện và giảng dạy quy mô machine learning. Chẳng hạn, một cơ hội trình diễn đảm bảo chất lượng những kể từ giờ Việt cần thiết tế bào miêu tả đảm bảo chất lượng sự tương quan thân thiết cặp kể từ (vua, hoàng hậu) và (chồng, vợ) vì như thế bọn chúng tăng thêm ý nghĩa ngay sát nhau.
Bạn đang xem: embed là gì
Biểu trình diễn toán học¶
Giả sử một tự vị này tê liệt chỉ mất sáu độ quý hiếm (Hà Nội, TP. Hải Phòng, Tp Sài Gòn, Bình Dương, Tỉnh Lào Cai, Sóc Trăng). Fig. 7 thể hiện tại cơ hội trình diễn của những độ quý hiếm này nhập không khí one-hot và không khí embedding hai phía.
Fig. 7 Biểu trình diễn những độ quý hiếm khuôn khổ bên dưới dạng one-hot vector và embedding¶
Ở phía trên, những độ quý hiếm nhập không khí embedding được lấy ví dụ bằng tay thủ công với chiều loại nhất thể hiện tại dân sinh và chiều loại nhị thể hiện tại vĩ phỏng đang được chuẩn chỉnh hóa của từng độ quý hiếm. Vị trí của từng vector embedding nhập không khí hai phía được minh hoạ nhập Fig. 8. Trong không khí này, Thành Phố Hà Nội, TP. Hải Phòng và Hà Giang ngay sát nhau về vùng địa lý. Nếu tất cả chúng ta với cùng một vấn đề này này mà dân sinh hoàn toàn có thể là một trong những đặc thù đảm bảo chất lượng, tớ chỉ việc teo trục tung và giãn trục hoành là hoàn toàn có thể đem những thành phố với dân sinh kiểu như nhau ngay sát cùng nhau rộng lớn.
Fig. 8 Biểu trình diễn những vector embedding nhập ko gian¶
Với một tự vị ngẫu nhiên với \(N\) kể từ \((w_1, w_2, \dots, w_{N})\). Giả sử số chiều của không khí embedding là \(d\), tớ hoàn toàn có thể trình diễn toàn cỗ những embedding mang lại \(N\) kể từ này bên dưới dạng một quỷ trận \(\mathbf{E} \in \mathbb{R}^{N\times k}\) với mặt hàng loại \(i\) là trình diễn embedding mang lại kể từ \(w_{i}\).
Nếu vector \(\mathbf{o}_i \in \mathbb{R}^{N \times 1}\) là trình diễn one-hot của kể từ \(w_i\), tớ với ngay lập tức \(\mathbf{e} = \mathbf{o}_i^T\mathbf{E} \in \mathbb{R}^{1 \times k}\) là trình diễn của kể từ tê liệt nhập không khí embedding.
Tạo embedding như vậy nào?¶
Cách trình diễn những thành phố nhập ví dụ bên trên phía trên chỉ là một trong những ví dụ minh họa Khi tất cả chúng ta hoàn toàn có thể khái niệm những trục một cơ hội ví dụ nhờ vào kỹ năng và kiến thức chắc chắn đang được với về tài liệu. Cách thực hiện này sẽ không khả đua với những tài liệu vô cùng rất nhiều chiều và không tồn tại những chân thành và ý nghĩa từng trục rõ nét như bên trên. Việc dò thám rời khỏi quỷ trận \(\mathbf{E}\) cần thiết trải qua một quy trình “học” dựa vào quan hệ vốn liếng với của tài liệu.
Ta hoàn toàn có thể thấy rằng quỷ trận \(\mathbf{E}\) hoàn toàn có thể được xem là một quỷ trận trọng số của một tầng tuyến tính nhập một mạng neural tự tạo như nhập Fig. 9.
Fig. 9 Ma trận embedding hoàn toàn có thể xem là một quỷ trận trọng số nhập một mạng neural tự tạo.¶
Như vậy, quỷ trận này cũng hoàn toàn có thể được xây đắp bằng phương pháp bịa nó vào một trong những mạng neural với cùng một hàm tổn thất đuối này tê liệt. Trong Tensorflow (phiên phiên bản 2.5), tầng embedding hoàn toàn có thể được khai báo vày tf.keras.layers.Embedding
. Trong Pytorch 1.8.1, tớ hoàn toàn có thể sử dụng torch.nn.Embedding
. Trong cuốn sách này, tất cả chúng ta sẽ có được một ví dụ về sự xây đắp embedding cho những thành phầm dựa vào nền tảng Pytorch.
Embedding hoàn toàn có thể được học tập nhập cả một vấn đề tổng thể hoặc học tập riêng biệt rẽ không giống trước lúc trả vào một trong những vấn đề ví dụ. Embedding nhận được hoàn toàn có thể được sử dụng như 1 đặc thù nhiều chiều và hoàn toàn có thể trong số quy mô ko cần học tập thâm thúy.
Word2vec là một trong những trong mỗi cách thức tiền phong về sự xây đắp embedding cho những kể từ dựa vào một mạng học tập thâm thúy. Các vector embedding này được học tập chỉ dựa vào trật tự những kể từ nhập câu của một cỗ tài liệu rộng lớn tuy nhiên ko nên biết chân thành và ý nghĩa ví dụ của từng câu hoặc quan hệ quan trọng đặc biệt này thân thiết bọn chúng. Các vector embedding này hoàn toàn có thể được dùng làm tạo nên những trình diễn cho 1 câu hay như là 1 văn phiên bản nhằm giải quyết và xử lý những vấn đề không giống.
Độ tương tự động thân thiết nhị embedding¶
Quay lại với mục tiêu chủ yếu của việc tạo nên embedding là trả những độ quý hiếm khuôn khổ về một không khí số sao mang lại embedding của những độ quý hiếm tương tự động ở gần nhau nhập không khí. Vậy khoảng cách này thông thường được xem ra sao.
Có phụ vương quy tắc đo thông thường được dùng nhằm tính khoảng cách thân thiết nhị embedding là khoảng cách Euclid, tích vô vị trí hướng của nhị vector, và phỏng tương tự động cosine.
Khoảng cơ hội Euclid¶
Công thức tính khoảng cách Euclid thân thiết nhị vector embedding
\[ d_1(\mathbf{e}_1, \mathbf{e}_2) = \|\mathbf{e}_1 - \mathbf{e}_2\| = \sqrt{\|\mathbf{e}_1\|^2 + \|\mathbf{e}_2\|^2 - 2\mathbf{e}_1^T\mathbf{e}_2} \]
Khoảng cơ hội này sẽ không âm và càng nhỏ thì nhị vector embedding càng ngay sát nhau. Tại phía trên, \(\|\mathbf{e}\| = \sqrt{\sum_{i=1}^d e_i^2}\) là kích thước của vector \(\mathbf{e} \in \mathbb{R}^d\).
Xem thêm: sau khi cá mặn thật thiếu gia nộp lên hệ thống
Để hạn chế sự phức tạp Khi khai căn, bình phương khoảng cách Euclid thông thường được dùng. Việc lấy bình phương ko tác động cho tới việc đối chiếu khoảng cách vì như thế bình phương là một trong những hàm đồng đổi mới.
\[ d_2(\mathbf{e}_1, \mathbf{e}_2) = \|\mathbf{e}_1 - \mathbf{e}_2\|^2 = \|\mathbf{e}_1\|^2 + \|\mathbf{e}_2\|^2 - 2\mathbf{e}_1^T\mathbf{e}_2 \]
Tích vô hướng¶
Công thức tính phỏng tương tự động theo đòi tích vô phía (dot product) thân thiết nhị vector embedding:
\[ \textrm{similar_dot}(\mathbf{e}_1, \mathbf{e_2}) = \mathbf{e}_1^T\mathbf{e_2} \]
Tính vô phía thân thiết nhị vector càng tốt thể hiện tại những embedding càng kiểu như nhau. Giá trị này rộng lớn nếu như góc thân thiết nhị vector nhỏ và những vector này còn có phỏng lâu năm rộng lớn.
Tương tự động cosine¶
Tương tự động cosin cũng rất được dùng nhằm đo phỏng tương tự động thân thiết nhị vector:
\[ \textrm{similar_cosine}(\mathbf{e}_1, \mathbf{e}_2) = \frac{\mathbf{e}_1^T\mathbf{e}_2}{\|\mathbf{e}_1\| \|\mathbf{e}_2\|} \]
Góc thân thiết nhị vector càng nhỏ thì phỏng tương tự động cosin càng tốt. Độ tương tự động cosin nhỏ nhất vày -1 nếu như nhị vector này ngược vệt nhau.
Trong phụ vương phỏng đo bên trên phía trên, tích vô phía với công thức giản dị và đơn giản nhất và thông thường được dùng trong số vấn đề quy tế bào rộng lớn. Tương tự động cosine ko quan hoài cho tới kích thước của nhị vector tuy nhiên chỉ xét cho tới góc thân thiết bọn chúng, quy tắc đo này phù phù hợp với những vấn đề đòi hỏi dò thám sự ngược ngược Một trong những độ quý hiếm khuôn khổ. Nếu những vector embedding với nằm trong phỏng lâu năm, phụ vương quy tắc đo này còn có chân thành và ý nghĩa như nhau.
Tìm embedding ngay sát nhất¶
Embedding được sử dụng nhiều nhập vấn đề dò thám tìm tòi những điểm nhập hạ tầng tài liệu (item embeddings) sớm nhất với cùng một embedding truy vấn (query embedding) này tê liệt.
Giả sử \(\mathbf{E} \in \mathbb{R}^{N\times d}\) và \(\mathbf{q} \in \mathbb{R}^d\) thứu tự là quỷ trận embedding của những độ quý hiếm nhập hạ tầng tài liệu và vector truy vấn.
Với khoảng cơ hội Euclid, khoảng cách thân thiết \(\mathbf{q}\) và một embedding \(\mathbf{e}_i\) nhập \(\mathbf{E}\) được xem bởi:
\[ d_2(\mathbf{q}, \mathbf{e}_i) = \|\mathbf{q}\|^2 + \|\mathbf{e}_i\|^2 - 2\mathbf{q}^T\mathbf{e}_i \]
Chỉ số của embedding ngay sát \(\mathbf{q}\) được xem bởi:
\[ \arg \min_{i} d_2(\mathbf{q}, \mathbf{e}_i) = \arg \min_{i} \left(\|\mathbf{e}_i\|^2 - 2\mathbf{q}^T\mathbf{e}_i \right) \]
Với độ tương tự động tích vô hướng, chỉ số của embedding ngay sát \(\mathbf{q}\) được xem như sau:
\[ \arg \max_i \mathbf{q}^T\mathbf{e}_i = \arg \min_i \left(- \mathbf{q}^T\mathbf{e}_i\right) \]
Với độ tương tự động cosine, chỉ số của embedding ngay sát \(\mathbf{q}\) được xem bởi:
Xem thêm: hệ thống tu luyện toàn năng
\[ \arg \max_i \frac{\mathbf{q}^T\mathbf{e}_i}{\|\mathbf{q}\| \|\mathbf{e}_i\|} = \arg \min_i \left(- \frac{\mathbf{q}^T\mathbf{e}_i}{\|\mathbf{e}_i\|}\right) \]
Bài toán đi tìm kiếm những điểm nhập hạ tầng tài liệu với embedding ngay sát với cùng một embedding mang lại trước hoàn toàn có thể được thực hiện như sau:
import numpy as np class NearestNeighbor: """Class supporting finding neareast embeddings of a query embeddings. Attrubutes: item_embeddings: a matrix of shape [N, k], such that row i is the embedding of item i. measure: One of ("cosine", "dot", "l2") specifying the similarity measure lớn be used """ def __init__(self, item_embeddings, measure="cosine"): assert measure in ("dot", "cosine", "l2") self.measure = measure self.item_embeddings = item_embeddings if self.measure == "cosine": # nomalize embeding self.item_embeddings = item_embeddings / np.linalg.norm( item_embeddings, axis=1, keepdims=True ) elif self.measure == "l2": self.squared_item_embedding = (item_embeddings ** 2).sum(axis=1) def find_nearest_neighbors(self, query_embedding, k=10): """Returns indices of k nearest neighbors""" # Denote q as query_emebdding vector, V as item_embeddings matrix. dot_products = query_embedding.dot(self.item_embeddings.T) if self.measure in ("dot", "cosine"): scores = dot_products elif self.measure == "l2": # ignore squared_query_embedding since it's the same for all item_embeddings scores = -(self.squared_item_embedding - 2 * dot_products) return (-scores).argsort()[:k] def test_nearest_neighbors(): query = np.array([1, 2]) items = np.array( [ [1, 2.2], # neareast in l2 [10, 21], # neareast in dot product similarity [2, 4], # nearest in cosine similarity ] ) assert NearestNeighbor(items, "l2").find_nearest_neighbors(query, 1)[0] == 0 assert NearestNeighbor(items, "dot").find_nearest_neighbors(query, 1)[0] == 1 assert NearestNeighbor(items, "cosine").find_nearest_neighbors(query, 1)[0] == 2 print("All tests passed") test_nearest_neighbors()
Ở những phần sau của cuốn sách, tất cả chúng ta tiếp tục thẳng dùng module tabml.utils.embedding
cho những tác vụ tương quan cho tới embedding.
Bình luận