《RethinkFun深度学习》2.4 向量的点乘

2.4 向量点乘

2.4.1 物理里的功

首先我们复习一下物理里对的定义。

如果一个物体受到力的作用,并在力的方向上发生了一段位移,我们就说这个力对物体做了功。功是物理学中表示力对位移的累积的物理量。功是标量,没有方向的概念。

0211.png

上图中里的力f和位移s都是向量,它们都既有大小,又有方向,并且它们两个的方向并不相同。这时,计算功时,需要考虑将f投影到s上,得到f’,然后用f’的模长乘以s的模长就是功,用公式表示如下:
W = ∣ f ∣ × c o s θ × ∣ s ∣ W= |f|\times cos\theta \times |s| W=f×cosθ×s

2.4.2 点乘的定义

上边对功的计算得到的结果是一个标量,它等于两个向量的模长与它们之间夹角cos值的乘积。

这实际上就是向量点乘(或者叫做点积、数量积)的定义。用符号 ⋅ \cdot 表示。所以功的定义可以用点积形式表示如下:
W = f ⋅ s = ∣ f ∣ ∣ s ∣ c o s θ W=f \cdot s= |f||s| cos\theta W=fs=f∣∣scosθ
上边在对功的计算中是将力f投影到位移s上,实际上通过观察公式我们可以发现,两个向量是对称的,也就是说将s投影到f上的向量s’的模长乘以f的模长也可以得到一样的结果。总之,点积就是两个向量模长与它们夹角余弦值的乘积。

下边给出线性代数里点乘正式的定义,两个向量ab。它们在同一个向量空间,也就说它们的分量个数相同。它们两个的点乘为:
a ⋅ b = ∣ a ∣ ∣ b ∣ c o s θ a \cdot b = |a||b|cos\theta ab=a∣∣bcosθ

2.4.3 点乘的计算

我们知道了点乘的定义,它等于两个向量的模长与它们之间夹角余弦值的乘积。但是这里又有模长,又有cos,都不好计算。实际上点乘的计算非常简单。我们就根据点乘的定义,一起来推导一下点乘的计算公式。首先看几个点乘的运算法则。

交换律

上边我们讲到过,根据点乘的定义,可以看到,两个向量是对称的,所以满足交换律。
a ⋅ b = b ⋅ a a \cdot b = b \cdot a ab=ba
数乘结合率
( λ a ) ⋅ b = a ⋅ ( λ b ) = λ ( a ⋅ b ) (\lambda a) \cdot b=a \cdot ( \lambda b)= \lambda (a \cdot b) (λa)b=a(λb)=λ(ab)

0212.png

根据上边这张图,可以帮助你理解。对于 a ⋅ b a \cdot b ab 的结果等于a的模长乘以b的模长再乘以cosθ。当b变为原来的 λ倍后,它的模长变为原来的 λ倍,而a的模长和cosθ都不变,所以 a ⋅ ( λ b ) = λ ( a ⋅ b ) = ( λ a ) ⋅ b a \cdot (\lambda b) = \lambda (a \cdot b) = (\lambda a) \cdot b a(λb)=λ(ab)=(λa)b

分配率
点乘的分配率公式为:
( a + b ) ⋅ c = a ⋅ c + b ⋅ c (a+b) \cdot c=a \cdot c + b\cdot c (a+b)c=ac+bc
0213.png
上边的图可以帮助你理解,对于a+bc的点乘,等于a+bc上的投影长度,乘以c的长度。而a+bc上的投影的长度就等于ac上投影的长度加上bc上投影的长度。而ac上投影的长度乘以c的长度就是ac的点乘,对于b也同理。所以上式成立。

有了以上几个向量点乘的计算法则,我们就可以来推导点乘的计算公式了。

以三维向量 a ⋅ b a \cdot b ab为例:
将向量a,b用标准基向量i,j,k表示。比如对于a来说,它在x,y,z轴的分量分别为 a x , a y , a z a_x,a_y,a_z ax,ay,az,则:

a ⋅ b = ( a x i + a y j + a z k ) ⋅ ( b x i + b y j + b z k ) a \cdot b = (a_xi+a_yj+a_zk) \cdot (b_xi+b_yj+b_zk) ab=(axi+ayj+azk)(bxi+byj+bzk)

根据分配率和数乘结合律有:

a ⋅ b = a x b x ( i ⋅ i ) + a x b y ( i ⋅ j ) + a x b z ( i ⋅ k ) + a y b x ( j ⋅ i ) + a y b y ( j ⋅ j ) + a y b z ( j ⋅ k ) a \cdot b = a_xb_x(i \cdot i)+a_xb_y(i \cdot j)+a_xb_z(i \cdot k)+a_yb_x(j \cdot i)+a_yb_y(j \cdot j)+a_yb_z(j \cdot k) ab=axbx(ii)+axby(ij)+axbz(ik)+aybx(ji)+ayby(jj)+aybz(jk)
+ a z b x ( k ⋅ i ) + a z b y ( k ⋅ j ) + a z b z ( k ⋅ k ) +a_zb_x(k \cdot i)+a_zb_y(k \cdot j)+a_zb_z(k \cdot k) +azbx(ki)+azby(kj)+azbz(kk)
上式中 a x , a y , a z , b x , b y , b z a_x,a_y,a_z,b_x,b_y,b_z ax,ay,az,bx,by,bz都为标量, i , j , k i,j,k i,j,k为标准基向量。
接下来我们计算上式中括号内的标准基向量之间的点乘。因为标准基向量的模长为1,又加之它们与自身夹角为0度,cos值为1,所以它们与自身的点乘为1。即:

i ⋅ i = 1 i \cdot i = 1 ii=1

j ⋅ j = 1 j \cdot j = 1 jj=1

k ⋅ k = 1 k \cdot k = 1 kk=1

又因为标准基向量之间都互相垂直,cos值为0,所以只要是不同标准基向量的点乘都为0。即:

i ⋅ j = 0 i \cdot j = 0 ij=0

i ⋅ k = 0 i \cdot k = 0 ik=0

j ⋅ k = 0 j \cdot k = 0 jk=0

带入上边式中有:

a ⋅ b = a x b x + a y b y + a z b z a \cdot b = a_xb_x+a_yb_y+a_zb_z ab=axbx+ayby+azbz

可以看到点乘有一个非常简单的计算规则,就是两个向量的点乘等于两个向量各个分量的值相乘再加和,这个规则可以推广到任意维度的向量点乘上,即:

a ⋅ b = ∑ i = 1 n a i b i a \cdot b = \sum_{i=1}^{n}a_ib_i ab=i=1naibi

###2.4.4 点乘的作用
在深度学习里,经常用两个向量之间的夹角的余弦值来表示两个向量的相似度。比如在深度学习里,模型学习到的人脸特征都是用向量来表示,最终如何判断两个人脸向量是否代表同一个人,就是通过计算这两个向量之间的余弦值来判断。如果余弦值接近1。也就是两个向量之间夹角接近0,则认为这两个向量相似,也就是两个人脸照片相似。这里就用到了点乘。

c o s θ = a ⋅ b ∣ a ∣ ∣ b ∣ cos\theta = \frac{a \cdot b}{ |a||b|} cosθ=a∣∣bab

很多情况下都会把特征向量归一化到模长为1,也就是|a||b|都为1。

两个向量的相似性计算就变为:

C o s S i m i l a r i t y = a ⋅ b CosSimilarity= a \cdot b CosSimilarity=ab

所以最终变化为,计算两个向量之间的点乘,就是计算两个向量的相似度。

为什么深度学习会用Cos相似度来衡量向量之间的相似性呢?而不用欧式距离呢?

一是因为点乘计算简单,效率高。

二是不同维度向量之间的Cos相似度有可比性,不论两个向量的维度为多少,只要两个向量方向完全一样,Cos相似度的值就是1; 两个向量垂直,也就是完全无关,值为0;两个向量方向相反,也就是负相关,值为-1。但是欧式距离不同维度向量之间的距离可能相差很远,没有可比性。

这个教程会提供以下资源:

  • 视频教程,在我的B站账号逐步更新。
  • 电子书在我的个人网站
  • 教程附带的数据和源代码,在github可供大家下载。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值