einsum愛因斯坦求和

2022-06-14 18:54:10 字數 1803 閱讀 3317

最近因為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 上,發表了由一位默默無聞的專利審查員愛因斯坦所寫的三篇 三篇 中的任何一篇,都足以使作者享有大物理學家的盛名。而其中最有名的便是 論動體的電動力學 此文宣告了相對論的誕生。在科學...