最近因為vision transformer裡的pytorch**,看到了torch.einsum(np.einsum同理)這個操作,簡直是神了;
比如
t = torch.randn(2,4,3)q, k, v = tuple(rearrange(t, '
b t (d k) -> k b t d
', k=3))
print(q,'\n'
,k)>>>tensor([[[-0.9011],
[-0.2627],
[ 0.4202],
[-0.3396]],
[[ 0.0530],
[ 0.5980],
[ 0.1464],
[ 0.7939]]])
tensor([[[-1.0567],
[ 0.0425],
[-0.2160],
[-2.2235]],
[[ 0.3932],
[-0.5011],
[ 0.0748],
[-1.3025]]])
可以看到這裡生成了transformer裡的q,k,v,維度是(2,4,1),維度含義分別是 (batch_size, token,dim),然後要做乙個q*k^t的向量外積
scaled_dot_prod = torch.einsum('b i d , b j d -> b i j
', q, k)
scaled_dot_prod
>>>tensor([[[ 0.9523, -0.0383, 0.1947, 2.0037],
[ 0.2776, -0.0112, 0.0568, 0.5842],
[-0.4440, 0.0179, -0.0908, -0.9342],
[ 0.3588, -0.0144, 0.0734, 0.7551]],
[[ 0.0208, -0.0265, 0.0040, -0.0690],
[ 0.2351, -0.2996, 0.0447, -0.7789],
[ 0.0575, -0.0733, 0.0109, -0.1906],
[ 0.3122, -0.3978, 0.0594, -1.0341]]])
注意,這裡的q和k都是同一維度,不用像原來做矩陣乘法那樣要維度對應,而是可以直接指定維度去對應地乘;
因此,這裡把k換到(2,1,4)的維度然後去和q乘,也是可以的,例如:
k_ = rearrange(k,'b t d -> b d t')
k_a_scaled_dot_prod = torch.einsum('
b i d , b d j -> b i j
', q, k_)
a_scaled_dot_prod
>>>tensor([[[ 0.9523, -0.0383, 0.1947, 2.0037],
[ 0.2776, -0.0112, 0.0568, 0.5842],
[-0.4440, 0.0179, -0.0908, -0.9342],
[ 0.3588, -0.0144, 0.0734, 0.7551]],
[[ 0.0208, -0.0265, 0.0040, -0.0690],
[ 0.2351, -0.2996, 0.0447, -0.7789],
[ 0.0575, -0.0733, 0.0109, -0.1906],
[ 0.3122, -0.3978, 0.0594, -1.0341]]])
參考:
愛因斯坦難題
愛因斯坦在20世紀初的這個問題,據說世界上有98 的人回答不出來 問題 在一條街上,有5座房子,噴了5中顏色。沒個房子住著不同國籍的人。每個人喝不同的飲料,抽不同品牌的香菸,養不同的寵物。問題是 誰養魚?2.瑞典人養狗 3.丹麥人喝茶 4.綠色房子在白色房子左邊 5.綠房子主人喝咖啡 6.抽pall...
愛因斯坦火車
今天下班時候很疲勞,就決定路上換換口味,看看物理緩解下,同時想為封建迷信找點理論基礎,於是瞄上了號稱 測不准 的量子物理,無奈上學學的都還給老師了,只能從頭開始,於是先簡單的學了學狹義相對論。下面分享一下。簡單來說就是有一輛火車,在火車中間位置有個光源,以火車為參照物的話,相對於火車,光是同時到達火...
愛因斯坦的悼詞
朱也曠 對於現代物理學,1905年是個有點特殊的年份。在這年9月的德國 物理學年鑑 annalen der physik 上,發表了由一位默默無聞的專利審查員愛因斯坦所寫的三篇 三篇 中的任何一篇,都足以使作者享有大物理學家的盛名。而其中最有名的便是 論動體的電動力學 此文宣告了相對論的誕生。在科學...