新聞中心

EEPW首頁 > 智能計算 > 設計應用 > AI神奇魅力的源點:相似度

AI神奇魅力的源點:相似度

作者:高煥堂時間:2024-03-13來源:電子產品世界收藏


本文引用地址:http://www.casasmaravilha.com/article/202403/456309.htm

1 前言

在本專欄去年的文章《從隱空間認識 多模態模型》里,已經介紹過了: 的核心設計概念是,把各文句和圖像映射到隱空間里的一個點( 以向量表示)。其針對每一個文句和圖像都會提取其特征,并映射到這個隱空間里的某一點。然后經由矩陣計算出向量夾角的余弦(Cosine) 值,來估計它們之間的(Similarity)。

此外,在 里扮演核心角色的點積注意力(Dot-Product attention) 機制,其先透過點積運算,從Q與K矩陣計算出的其(Similarity) 矩陣,然后繼續計算出注意力(Attention) 矩陣。

于是本期就從簡單的出發,再延伸到注意力機制,并循序漸漸地擴大為典型的 模型。然后就能理解當今 等大模型的魅力源頭。例如,Sora 也采用注意力(Attention) 機制,以便于在影片生成過程中,能專注于文字提示的關注意圖。這確保了相關細節被優先考慮,從而更準確、更忠實地表示人們所期待的場景。

2 簡介余弦(Cosine)相似度

當人們看到事物( 如圖像) 的特征時,很容易依據其特征來看出其相似性( 又稱:相似度),然后依據其特征的相似性,進行分門別類。例如有三張圖像:

1710375943361372.png

圖1 三張簡單圖像

人們一眼就能分辨出來左邊兩張圖(img01與img02) 的色彩比較相近( 相似);而右邊圖與其他兩者就比較不相似。AI也具有這樣的能力,就是您已經熟悉的AI分類器( 模型) 了。由于AI 經常需要處理高維度的數據,例如常將圖像、文句或文件表達為高維度歐式空間里的向量。此時,就常常使用余弦相似度(Cosine Similarity) 算法??蓱糜趥蓽y圖像(Image) 之間的相似度( 又稱:相似性);也能應用于計算兩個文句之間的相似度( 例如,同義詞等)。

經由這算法,可以計算出事物( 表達為向量) 之間的相似程度,其值介于[-1, 1] 之間。數值愈高就表示兩個向量愈相似。余弦相似度是基于兩個向量的夾角來度量的。其計算兩個向量之間夾角的余弦(Cosine) 值,來衡量它們之間的相似度。例如下圖:

1710333693287022.png

圖2 Consine相似度

觀察上圖1-2里,其中的左上方的小圖里,兩個向量的夾角小于90 度,其余弦值大于0。而左下方的小圖里,兩個向量互相垂直,夾角是90 度,其余弦值等于0。至于右方的小圖里兩個向量的夾角大于90 度,其余弦值小于0。所以,余弦相似度的值是介于 -1與1之間。其值為-1,表示向量相反;其值為0,表示正交向量( 不相似);而其值為1,表示相似向量。

上述圖1-2 的范例是在二維空間里,計算二維向量的余弦相似度。此外,在AI( 機器學習) 里常將圖像、文句或文件表達為高維度歐式空間里的向量。此時,也非常適合用余弦值來表達這些高維向量之間的相似度。

例如,從上圖-1 里的各小圖,取出其中心點( 像素)的RGB值,成為各小圖的特征,就得到三維空間里的3個向量:

image.png image.png

image.png

圖3 萃取圖像特征

RGB 值就成為各張圖的特征了,也即是三維空間里的3個向量:

[ [255, 0, 0], [255, 105, 180], [0, 255, 0] ]

那么,如何表示上述3 個向量之間的余弦相似度呢?

3 認識相似度矩陣(Matrix)

首先來觀摩一個Python 小程序,其代碼如下:

# simi_01.py

import numpy as np

from sklearn.metrics.pairwise import cosine_similarity

# 定義三個3 維向量

x = np.array([[255,0,0],[255,105,180],[0,255,0]])

# 將向量歸一化,這對于計算cosine similarity 很重要

normalized_x = x / np.linalg.norm(x, axis=1, keepdims=

True)

# 使用cosine_similarity 計算相似度

similarity_matrix = cosine_similarity(normalized_x)

print(“nCosine Similarity Matrix:”)

print(‘n’, similarity_matrix)

#END

接著,就執行這個程序。此時輸入3 維向量:[[255,0, 0], [255, 105, 180], [0, 255, 0]],然后計算出它們之間的余弦相似度,并輸出相似度矩陣:

1710342456147740.png

這個矩陣所表達的涵意是:

1710342491284344.png

請看最上面一列(Row) 數值的意義是:針對左邊圖像(紅色)而言,它與自己的相似度為1.0( 完全相似);它與中間圖像(粉紅色) 的相似度約為0.77( 很相似);而它與右邊圖像(綠色) 的相似度約為0.0( 不相似)。

再看第二列數值的意義是:針對中間圖像(粉紅色)而言,它與左邊圖像(紅色) 的相似度約為0.77(很相似);它與自己的相似度為1.0(完全相似);而它與右邊圖像(綠色) 的相似度約為0.31(有一些相似)。

余弦相似度矩陣是直接計算向量的點積(Dotproduct),即將兩向量對應元素相乘再相加,再除以它們的歐氏長度的乘積,這樣可以將相似度的值正規化,使之不受向量長度的影響,即不考慮向量長度,只考慮其夾角的余弦值。

4 延伸到注意力權重(Attention-weights)

剛才說明了,在計算余弦相似度時,我們先計算向量之間的點積,再進行正規化:除以它們的歐氏長度的乘積。

現在,我們將采取另一種途徑:先計算向量之間的點積,再計算出注意力權重(Attention-weights)?,F在,來觀摩一個Python 小程序,其代碼如下:

#simi_02.py

import torch

import torch.nn as nn

import torch.nn.functional as F

# 定義三個3 維向量

x = torch.tensor([

[255, 0, 0],

[255,105,180],

[0, 0, 255]], dtype=torch.fl oat32)

scores = x.matmul(x.T)

# 使用Attention-weights

attention_weights = F.softmax(scores, dim=1)

print(“nAttention-weights:”)

print(attention_weights)

#END

在注意力權重中,我們應用 Softmax() 函數,將點積相似度矩陣的每一行轉換為概率分布,以表示每個向量對于其他向量的關注程度。這可以看作是一種注意力權重。

至于在余弦相似度中,不一定需要進行Softmax()轉換,因為余弦相似度通常已經被正規化,它的范圍在-1到1之間,所以不需要再轉換為概率分布。于是,此程序執行時,就輸出注意力權重矩陣,如下:

1710342614188861.png

總之,注意力權重通常用于序列到序列模型的注意力機制,而余弦相似度,則更常用于評估向量之間的相似度而不涉及到注意力的權重分配。兩者的選擇取決于特定應用的需求。

1710342720727858.png

5 結束語

本期說明了余弦相似度與注意力權重的概念,以及其計算方法。下一期將繼續延伸到Self-Attention 機制、Cross-Attention機制和模型等。

(本文來源于《EEPW》2024.3)



評論


相關推薦

技術專區

關閉
无码国产偷倩在线播放0|国产真实自在自偷|heyzo高清|国产一级一级牲活片|97人妻人人揉人人躁人人