算術演算子

加算、減算および乗算は、SQLおよびPL/SQLで次元単位でベクトルに適用できます。

加算

ベクトル加算は、多くの場合、自然言語処理(NLP)で使用され、単語は数値形式で意味を捉えるベクトルとして表されます。ベクトルの加算は、これらの意味を結合し、単語間の関係を理解するために使用され、単語の類似性とも呼ばれるタスクです。

2つのベクトルA=(a1, a2, a3)およびB=(b1, b2, b3)がある場合、C = A + BC = (a1+b1, a2+b2, a3+b3)として計算されます。

減算

ベクトル減算は単語の類似性シナリオで使用できますが、顔認識のコンテキストでも役立ちます。それぞれの顔は、顔の特徴(目の距離、目の色など)のベクトルで表すことができます。あるベクトルを別のベクトルから減算すると、2つの顔の間の主な違いがわかり、それらが類似しているかどうかを認識するために必要な情報が提供されます。

2つのベクトルA=(a1, a2, a3)およびB=(b1, b2, b3)がある場合、C = A - BC = (a1-b1, a2-b2, a3-b3)として計算されます。

乗算

2つのベクトルの対応する各座標のベクトル乗算(要素ごとの積)は、アダマール積と呼ばれます。アダマール積は、ニューラル・ネットワークやコンピュータ・ビジョンでよく使用されます。

2つのベクトルA=(a1, a2, a3)およびB=(b1, b2, b3)がある場合、アダマール積A*BA*B = (a1*b1, a2*b2, a3*b3)として計算されます。

セマンティクス

操作の両側は、次元が一致するベクトルに評価される必要があり、BINARYまたはSPARSEベクトルではない必要があります。結果のベクトルは、オペランドと同じ数の次元を持ち、形式は入力の形式に基づいて決定されます。操作の片側がベクトルでない場合は、値をベクトルに変換する試みが自動的に行われます。変換に失敗すると、エラーが発生します。

結果に使用される形式は、柔軟、FLOAT64FLOAT32INT8の順にランク付けされます。同様に、操作のどちらの側にも柔軟な形式がある場合、結果は柔軟になります。それ以外の場合、どちらかの側がFLOAT64という形式の場合、結果はFLOAT64というようになります。

次の値を持つ2つのベクトルについて考えてみます:

v1 = [1, 2, 3]
v2 = [10, 20, 30]
たとえば、v1およびv2に算術演算子を使用すると、次のようになります:
  • v1 + v2[11, 22, 33]です
  • v1 - v2[-9, -18, -27]です
  • v1 * v2[10, 40, 90]です
  • v1 + NULLNULLです

算術演算の両側がNULLの場合、結果はNULLになります。次元オーバーフローの場合、エラーが発生します。たとえば、VECTOR('[1, 127]', 2, INT8)VECTOR('[1, 1]', 2, INT8)に加算すると、127+1=128INT8形式でオーバーフローするため、エラーが発生します。

ベクトルでの除算演算子の使用はサポートされていません。

単語の類似性

単語の埋込みを使用して、「ローマ」と「パリ」の関係を見つけたいとします。「ローマ」のベクトルを取得して「イタリア」のベクトルを減算し、「フランス」のベクトルを追加できます。これにより、「パリ」という単語の意味に近い新しいベクトルが得られます。この計算は、理想的な埋込みモデルを使用すると「ローマ-イタリア+フランス=パリ」である必要があります。



基本ベクトル算術

SELECT VECTOR('[5, 10, 15]') - VECTOR('[2, 4, 6]');

VECTOR('[5,10,15]')-VECTOR('[2,4,6]')
------------------------------------------------------------
[3.0E+000,6.0E+000,9.0E+000]


SELECT VECTOR('[1, 2, 3]', 3, FLOAT64) + VECTOR('[4, 5, 6]', 3, FLOAT32) * '[2, 2, 2]';

VECTOR('[1,2,3]',3,FLOAT64)+VECTOR('[4,5,6]',3,FLOAT32)*'[2,2,2]'
--------------------------------------------------------------------------------
[9.0E+000,1.2E+001,1.5E+001]
DECLARE
  v1 VECTOR := VECTOR('[10, 20, 30]', 3, INT8);
  v2 VECTOR := VECTOR('[6, 4, 2]', 3, INT8);
BEGIN
  DBMS_OUTPUT.PUT_LINE(TO_CHAR(v1 + v2));
  DBMS_OUTPUT.PUT_LINE(TO_CHAR(v1 - v2));
  DBMS_OUTPUT.PUT_LINE(TO_CHAR(v1 * v2));
END;  
/

結果:

[16,24,32]
[4,16,28]
[60,80,60]