embed là gì

Giới thiệu¶

Embedding là một trong những nghệ thuật 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 đặc trưng hữu ích với những đặc thù khuôn khổ với số thành phần rộng lớn ở cơ cách thức đa số nhằm màn 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 ý nghĩa tương tự động nhau ở ngay gần nhau nhập không khí embedding.

Ví dụ nổi trội nhất là màn trình diễn những kể từ nhập một cỗ tự điển bên dưới dạng số. Khi tự điển với mặt hàng triệu kể từ, màn 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 thốn vấn đề độ quý hiếm mang đến việc đào tạo quy mô machine learning. Chẳng hạn, một cơ hội màn trình diễn chất lượng tốt những kể từ giờ đồng hồ Việt cần thiết tế bào miêu tả chất lượng tốt sự tương quan thân ái cặp kể từ (vua, hoàng hậu) và (chồng, vợ) vì thế bọn chúng ý nghĩa ngay gần nhau.

Bạn đang xem: embed là gì

Biểu thao diễn toán học¶

Giả sử một tự điển nào là cơ chỉ mất sáu độ quý hiếm (Hà Nội, Hải Phòng Đất Cảng, Tp Hồ Chí Minh, Bình Dương, Tỉnh Lào Cai, Sóc Trăng). Fig. 7 thể hiện nay cơ hội màn 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.

../_images/emb1.png

Fig. 7 Biểu thao 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ụ thủ công với chiều loại nhất thể hiện nay số lượng dân sinh và chiều loại nhị thể hiện nay vĩ chừng tiếp tụ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, TP Hà Nội, Hải Phòng Đất Cảng và Hà Giang ngay gần nhau về vùng địa lý. Nếu tất cả chúng ta với cùng 1 Việc nào là này mà số lượng dân sinh hoàn toàn có thể là một trong những đặc thù chất lượng tốt, 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 số lượng dân sinh như thể nhau ngay gần cùng nhau rộng lớn.

../_images/emb2.png

Fig. 8 Biểu thao diễn những vector embedding nhập ko gian

Với một tự điển 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ể màn trình diễn toàn cỗ những embedding mang đến \(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à màn trình diễn embedding mang đến kể từ \(w_{i}\).

Nếu vector \(\mathbf{o}_i \in \mathbb{R}^{N \times 1}\) là màn trình diễn one-hot của kể từ \(w_i\), tớ với tức thì \(\mathbf{e} = \mathbf{o}_i^T\mathbf{E} \in \mathbb{R}^{1 \times k}\) là màn trình diễn của kể từ cơ nhập không khí embedding.

Tạo embedding như vậy nào?¶

Cách màn 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ụ phụ thuộc kỹ năng và kiến thức chắc chắn tiếp tụ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 ý nghĩa sâu sắc từng trục rõ nét như bên trên. Việc lần 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 như 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.

../_images/emb3.png

Fig. 9 Ma trận embedding hoàn toàn có thể xem như 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 thi công bằng phương pháp bịa nó vào một trong những mạng neural với cùng 1 hàm tổn thất non nào là cơ. Trong Tensorflow (phiên bạn dạng 2.5), tầng embedding hoàn toàn có thể được khai báo bởi vì tf.keras.layers.Embedding. Trong Pytorch 1.8.1, tớ hoàn toàn có thể người 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ự việc thi công 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 Việc tổng thể hoặc học tập riêng rẽ rẽ không giống trước lúc trả vào một trong những Việc 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 những quy mô ko cần học tập sâu sắc.

Word2vec là một trong những trong mỗi cách thức tiền phong về sự việc thi công embedding cho những kể từ dựa vào một mạng học tập sâu sắc. 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 nhưng mà ko nên biết ý nghĩa sâu sắc ví dụ của từng câu hoặc quan hệ đặc trưng nào là thân ái bọn chúng. Các vector embedding này hoàn toàn có thể được dùng để làm tạo ra những màn trình diễn cho 1 câu hay là 1 văn bạn dạng nhằm xử lý những Việc không giống.

Độ tương tự động thân ái nhị embedding¶

Quay lại với mục tiêu chủ yếu của việc tạo ra embedding là trả những độ quý hiếm khuôn khổ về một không khí số sao mang đến 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ụ thân phép tắc đo thông thường được dùng nhằm tính khoảng cách thân ái nhị embedding là khoảng cách Euclid, tích vô vị trí hướng của nhị vector, và chừ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 ái 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 gần nhau. Tại phía trên, \(\|\mathbf{e}\| = \sqrt{\sum_{i=1}^d e_i^2}\) là khuôn khổ của vector \(\mathbf{e} \in \mathbb{R}^d\).

Xem thêm: metro là gì

Để tá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ì thế bình phương là một trong những hàm đồng biến đổ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 chừng tương tự động theo dõi tích vô phía (dot product) thân ái 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 ái nhị vector càng tốt thể hiện nay những embedding càng như thể nhau. Giá trị này rộng lớn nếu như góc thân ái nhị vector nhỏ và những vector này còn có chừng nhiều năm rộng lớn.

Tương tự động cosine¶

Tương tự động cosin cũng khá được dùng nhằm đo chừng tương tự động thân ái 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 ái nhị vector càng nhỏ thì chừng tương tự động cosin càng tốt. Độ tương tự động cosin nhỏ nhất bởi vì -1 nếu như nhị vector này trái khoáy vết nhau.

Trong phụ thân chừng đo bên trên phía trên, tích vô phía với công thức giản dị nhất và thông thường được dùng trong những Việc quy tế bào rộng lớn. Tương tự động cosine ko quan hoài cho tới khuôn khổ của nhị vector nhưng mà chỉ xét cho tới góc thân ái bọn chúng, phép tắc đo này phù phù hợp với những Việc đòi hỏi lần sự trái khoáy ngược Một trong những độ quý hiếm khuôn khổ. Nếu những vector embedding với nằm trong chừng nhiều năm, phụ thân phép tắc đo này còn có ý nghĩa sâu sắc như nhau.

Tìm embedding ngay gần nhất¶

Embedding được sử dụng nhiều nhập Việc lần 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 1 embedding truy vấn (query embedding) nào là cơ.

Giả sử \(\mathbf{E} \in \mathbb{R}^{N\times d}\)\(\mathbf{q} \in \mathbb{R}^d\) theo thứ 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 ái \(\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 gần \(\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 gần \(\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 gần \(\mathbf{q}\) được xem bởi:

Xem thêm: paint thinner là gì

\[ \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 gần với cùng 1 embedding mang đến trước hoàn toàn có thể được tổ chứ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 to 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.

Tác giả

Bình luận