1 歸一化處理
歸一化是一種數理統計中常用的數據預處理手段,在機器學習中歸一化通常將數據向量每個維度的數據映射到(0,1)或(-1,1)之間的區間或者將數據向量的某個范數映射為1,歸一化好處有兩個:
(1) 消除數據單位的影響:其一可以將有單位的數據轉為無單位的標准數據,如成年人的身高150-200cm、成年人體重50-90Kg,身高的單位是厘米而體重的單位是千克,不同維度的數據單位不一樣,造成原始數據不能直接代入機器學習中進行處理,所以這些數據經過特定方法統一都映射到(0,1)這個區間,這樣所有數據的取值范圍都在同一個區間里的。
(2) 可提深度學習模型收斂速度: 如果不進行歸一化處理,假設深度學習模型接受的輸入向量只有兩個維度x1和x2,其中X1取值為0-2000,x2取值為0-3。這樣數據在進行梯度下降計算時梯度時對應一個很扁的橢圓形,很容易在垂直等高線的方向上走大量的之字形路線,是的迭代計算量大且迭代的次數多,造成深度學習模型收斂慢。
2 L2范數歸一化的概念
L2范數歸一化處理操作是對向量X的每個維度數據x1, x2, …, xn都除以||x||2得到一個新向量,即
\[{{\bf{X}}_2} = \left( {\frac{{{x_1}}}{{{{\left\| {\bf{x}} \right\|}_2}}},\frac{{{x_2}}}{{{{\left\| {\bf{x}} \right\|}_2}}}, \cdots ,\frac{{{x_n}}}{{{{\left\| {\bf{x}} \right\|}_2}}}} \right) = \left( {\frac{{{x_1}}}{{\sqrt {x_1^2 + x_2^2 + \cdots + x_n^2} }},\frac{{{x_2}}}{{\sqrt {x_1^2 + x_2^2 + \cdots + x_n^2} }}, \cdots ,\frac{{{x_n}}}{{\sqrt {x_1^2 + x_2^2 + \cdots + x_n^2} }}} \right) \]
若向量A = (2, 3, 6),易得向量X的L2范數為
\[{\left\| {\bf{A}} \right\|_2} = \sqrt {{2^2} + {3^2} + {6^2}} = \sqrt {4 + 9 + 36} = \sqrt {49} = 7 \]
所以向量A的L2范數歸一化后得到向量為
\[{{\bf{A}}_2} = \left( {\frac{2}{7},\frac{3}{7},\frac{6}{7}} \right) \]
圖1 L2范數可以看作是向量的長度
3 L2范數歸一化的優勢
L2范數有一大優勢:經過L2范數歸一化后,一組向量的歐式距離和它們的余弦相似度可以等價
一個向量X經過L2范數歸一化得到向量X2,同時另一個向量Y經過L2范數歸一化得到向量Y2。此時X2和Y2的歐式距離和余弦相似度是等價的,下面先給出嚴格的數學證明。
假設向量X = (x1, x2, …, xn),向量Y = (y1, y2, …, yn), X2和Y2的歐式距離是
\[\begin{array}{l} D\left( {{{\bf{X}}_{\rm{2}}},{{\bf{Y}}_{\rm{2}}}} \right) = \sqrt {{{\left( {\frac{{{x_1}}}{{{{\left\| {\bf{X}} \right\|}_2}}} - \frac{{{y_1}}}{{{{\left\| {\bf{Y}} \right\|}_2}}}} \right)}^2} + {{\left( {\frac{{{x_2}}}{{{{\left\| {\bf{X}} \right\|}_2}}} - \frac{{{y_2}}}{{{{\left\| {\bf{Y}} \right\|}_2}}}} \right)}^2} + \cdots + {{\left( {\frac{{{x_n}}}{{{{\left\| {\bf{X}} \right\|}_2}}} - \frac{{{y_n}}}{{{{\left\| {\bf{Y}} \right\|}_2}}}} \right)}^2}} \\ \quad \quad \quad \quad \quad \;\;\; = \sqrt {\left( {\frac{{\bf{X}}}{{{{\left\| {\bf{X}} \right\|}_2}}} - \frac{{\bf{Y}}}{{{{\left\| {\bf{Y}} \right\|}_2}}}} \right){{\left( {\frac{{\bf{X}}}{{{{\left\| {\bf{X}} \right\|}_2}}} - \frac{{\bf{Y}}}{{{{\left\| {\bf{Y}} \right\|}_2}}}} \right)}^T}} \\ \quad \quad \quad \quad \quad \;\;\; = \sqrt {\frac{{{\bf{X}}{{\bf{X}}^T}}}{{\left\| {\bf{X}} \right\|_2^2}} - \frac{{{\bf{X}}{{\bf{Y}}^T}}}{{{{\left\| {\bf{X}} \right\|}_2}{{\left\| {\bf{Y}} \right\|}_2}}} - \frac{{{\bf{Y}}{{\bf{X}}^T}}}{{{{\left\| {\bf{X}} \right\|}_2}{{\left\| {\bf{Y}} \right\|}_2}}} + \frac{{{\bf{Y}}{{\bf{Y}}^T}}}{{\left\| {\bf{Y}} \right\|_2^2}}} \\ \quad \quad \quad \quad \quad \;\;\; = \sqrt {\frac{{{\bf{X}}{{\bf{X}}^T}}}{{{\bf{X}}{{\bf{X}}^T}}} - \frac{{2{\bf{X}}{{\bf{Y}}^T}}}{{{{\left\| {\bf{X}} \right\|}_2}{{\left\| {\bf{Y}} \right\|}_2}}} + \frac{{{\bf{Y}}{{\bf{Y}}^T}}}{{{\bf{Y}}{{\bf{Y}}^T}}}} \\ \quad \quad \quad \quad \quad \;\;\; = \sqrt {2 - 2\frac{{{\bf{X}}{{\bf{Y}}^T}}}{{{{\left\| {\bf{X}} \right\|}_2}{{\left\| {\bf{Y}} \right\|}_2}}}} \\ \end{array}\]
X2和Y2的余弦相似度為
\[\begin{array}{l} Sim\left( {{{\bf{X}}_{\rm{2}}},{{\bf{Y}}_{\rm{2}}}} \right) = \frac{{\frac{{{x_1}}}{{{{\left\| {\bf{X}} \right\|}_2}}} \cdot \frac{{{y_1}}}{{{{\left\| {\bf{Y}} \right\|}_2}}}{\rm{ + }}\frac{{{x_{\rm{2}}}}}{{{{\left\| {\bf{X}} \right\|}_2}}} \cdot \frac{{{y_{\rm{2}}}}}{{{{\left\| {\bf{Y}} \right\|}_2}}}{\rm{ + }} \cdots {\rm{ + }}\frac{{{x_n}}}{{{{\left\| {\bf{X}} \right\|}_2}}} \cdot \frac{{{y_n}}}{{{{\left\| {\bf{Y}} \right\|}_2}}}}}{{\sqrt {{{\left( {\frac{{{x_1}}}{{{{\left\| {\bf{X}} \right\|}_2}}}} \right)}^{\rm{2}}}{\rm{ + }}{{\left( {\frac{{{x_{\rm{2}}}}}{{{{\left\| {\bf{X}} \right\|}_2}}}} \right)}^{\rm{2}}}{\rm{ + }} \cdots {{\left( {\frac{{{x_{\rm{n}}}}}{{{{\left\| {\bf{X}} \right\|}_2}}}} \right)}^{\rm{2}}}} \cdot \sqrt {{{\left( {\frac{{{y_1}}}{{{{\left\| {\bf{Y}} \right\|}_2}}}} \right)}^{\rm{2}}}{\rm{ + }}{{\left( {\frac{{{y_{\rm{2}}}}}{{{{\left\| {\bf{Y}} \right\|}_2}}}} \right)}^{\rm{2}}}{\rm{ + }} \cdots {\rm{ + }}{{\left( {\frac{{{y_n}}}{{{{\left\| {\bf{Y}} \right\|}_2}}}} \right)}^{\rm{2}}}} }} \\ \quad \quad \quad \quad \quad \;\;\; = \frac{{\frac{{{x_1}{y_1} + {x_2}{y_2} + \cdots + {x_n}{y_n}}}{{{{\left\| {\bf{X}} \right\|}_2}{{\left\| {\bf{Y}} \right\|}_2}}}}}{{\sqrt {\frac{{x_1^2 + x_2^2 + \cdots + x_n^2}}{{\left\| {\bf{X}} \right\|_2^2}}} \cdot \sqrt {\frac{{y_1^2 + y_2^2 + \cdots y_n^2}}{{\left\| {\bf{Y}} \right\|_2^2}}} }} \\ \quad \quad \quad \quad \quad \;\;\; = \frac{{\frac{{{x_1}{y_1} + {x_2}{y_2} + \cdots + {x_n}{y_n}}}{{{{\left\| {\bf{X}} \right\|}_2}{{\left\| {\bf{Y}} \right\|}_2}}}}}{{\sqrt {\frac{{x_1^2 + x_2^2 + \cdots + x_n^2}}{{x_1^2 + x_2^2 + \cdots + x_n^2}}} \cdot \sqrt {\frac{{y_1^2 + y_2^2 + \cdots y_n^2}}{{y_1^2 + y_2^2 + \cdots y_n^2}}} }} \\ \quad \quad \quad \quad \quad \;\;\; = \frac{{{x_1}{y_1} + {x_2}{y_2} + \cdots + {x_n}{y_n}}}{{{{\left\| {\bf{X}} \right\|}_2}{{\left\| {\bf{Y}} \right\|}_2}}} \\ \quad \quad \quad \quad \quad \;\;\; = \frac{{{\bf{X}}{{\bf{Y}}^T}}}{{{{\left\| {\bf{X}} \right\|}_2}{{\left\| {\bf{Y}} \right\|}_2}}} \\ \end{array}\]
結合兩個表達式易得
\[D\left( {{{\bf{X}}_{\rm{2}}},{{\bf{Y}}_{\rm{2}}}} \right) = \sqrt {2 - 2sim\left( {{{\bf{X}}_{\rm{2}}},{{\bf{Y}}_{\rm{2}}}} \right)} \]
即L2范數歸一化處理后兩個向量歐式距離等於2減去2倍余弦相似度的算術平方根。如果你被上面令人昏頭轉向的數學公式搞暈,而不想看的話,這里還有一種僅需要中學知識的更簡單證明方法證明兩者的等價性:
假設一組二維數據,設經過L2范數歸一化后向量X2 為 (p1, p2),向量Y2 為 (q1, q2)。向量X2是原點(0,0) 指向點P(p1,p2)的有向線段,向量Y2是原點(0,0)指向點Q(q1, q2)的有向線段。易得
X2和Y2的歐式距離為線段PQ長度
X2和Y2的余弦相似度為∠POQ的余弦值
根據余弦定理易得
\[\cos \angle POQ = \frac{{O{P^2} + O{Q^2} - P{Q^2}}}{{2 \cdot OP \cdot OQ}} \]
因為L2范數歸一化向量的長度都是1,因為L2范數歸一化向量的長度都是1,那么向量對應的點肯定都在單位圓上,所以OP=OQ=1
圖2 L2范數歸一化后向量對應的點都在單位圓上
因此
\[\cos \angle POQ = \frac{{{1^2} + {1^2} - P{Q^2}}}{2} = \frac{{2 - P{Q^2}}}{2} \]
即
\[sim\left( {{{\bf{X}}_{\rm{2}}},{{\bf{Y}}_{\rm{2}}}} \right) = \frac{{2 - D{{\left( {{{\bf{X}}_{\rm{2}}},{{\bf{Y}}_{\rm{2}}}} \right)}^2}}}{2} \Rightarrow D\left( {{{\bf{X}}_{\rm{2}}},{{\bf{Y}}_{\rm{2}}}} \right) = \sqrt {2 - 2sim\left( {{{\bf{X}}_{\rm{2}}},{{\bf{Y}}_{\rm{2}}}} \right)} \]
因此經L2范數歸一化后,一組向量的歐式距離和它們的余弦相似度可等價。這一大優勢是當你算得一組經過L2范數歸一化后的向量的歐式距離后,又想計算它們的余弦相似度,可以根據公式在O(1)時間內直接計算得到;反過來也一樣。
另外,在一些機器學習處理包中,只有歐式距離計算沒有余弦相似度計算,如Sklearn的Kmeans聚類包,這個包只能處理歐式距離計算的數據聚類。
而在NLP領域,許多詞語或文檔的相似度定義為數據向量的余弦相似度,如果直接調用Sklearn的Kmeans聚類包則不能進行聚類處理。因此需要將詞語對象的詞向量或者文檔對應的文本向量進行L2范數歸一化處理。因為在L2范數歸一化處理后的歐式距離和余弦相似度是等價的,所以此時可以放心大膽用Sklearn的Kmeans進行聚類處理。