精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

從理論到實現,手把手實現Attention網絡

網絡 網絡優化
Transformer當中也有attention結構,它就是正兒八經地利用向量之間的相似度來計算的。常理上來說,按照向量相似度來計算權重,這種做法應該更容易理解一些。

作者 | 梁唐

出品 | 公眾號:Coder梁(ID:Coder_LT)

大家好,我是老梁。

我們之前介紹了Transformer的核心——attention網絡,我們之前只是介紹了它的原理,并且沒有詳細解釋它的實現方法。光聊理論難免顯得有些空洞,所以我們來談談它的實現。

為了幫助大家更好地理解, 這里我選了電商場景中的DIN模型來做切入點。

一方面可以幫助大家理解現在電商系統中的推薦和廣告系統中的商品排序都是怎么做的,另外我個人感覺DIN要比直接去硬啃transformer容易理解一些。

我們可以先從attention網絡的數據入手,它的輸入數據有兩個:一個是用戶的歷史行為序列,一個是待打分的item(以下稱為target item)。用戶的歷史行為序列本質上其實就是一個用戶歷史上有過交互的item的數組。這里為了簡化,我們假設已經完成了從item到embedding的轉換。

首先是target item,它的shape應該是[B, E]。這里的B指的是batch_size,即訓練時候一個批量的大小。這里的E指的是embedding的長度。也有一些文章里使用別的字母表示,這也沒有一個硬性的標準,能看懂就行。

我們再來看用戶行為序列,除了batch_size和embedding長度之外,還需要一個額外的參數來表示行為序列的長度,通常我們用字母T。對于所有的樣本,我們都需要保證它的行為序列長度是T,如果不足T的,則使用默認值補足。如果超過T的,則進行截斷。如此,它的shape應該是[B, T, E]。

根據attention網絡的原理,我們需要根據行為序列中的每個item與target item的相似度,再根據相似度計算權重。最后對這T個item的embedding進行加權求和。求和之后,這T個item根據計算得到的權重合并得到一個embedding。論文中說這個集成T個行為序列的embedding就是用戶興趣的表達,我們只需要將它和目標item拼接在一起發送到神經網絡即可,就可以幫助模型更好地決策了。這里用戶興趣的shape應該和item是一樣的,也是[B, E]。

簡單總結一下,我們現在需要一個模塊,它接收兩個輸入,一個是item的embedding,一個是用戶行為序列的embedding。它的輸出應該是[B, T],對應行為序列中T個item的權重。剩下的問題就是怎么生成這個結果。

原理講完了,接下來講講實現,我們可以結合一下下面這兩張論文中的結構圖幫助理解。

圖片

圖片圖片

首先,我們來統一一下輸入的維度,手動將item的embedding這個二維的向量變成三維,即shape變成[B, 1, E]。

這里一種做法是,手動循環T次,每次從行為序列中拿出一個item embedding,和目標item的embedding拼接在一起丟進一個神經網絡中得到一個分數。

這種做法非常不推薦,一般在神經網絡當中,我們不到萬不得已,不手動循環,因為循環是線性計算,沒辦法利用GPU的并行計算來加速。

對于當前問題來說,我們完全可以使用矩陣運算來代替。通過使用expand/tile函數,將[B, 1, E]的item embedding復制T份,形狀也變成[B, T, E]。這樣一來,兩個輸入的shape都變成了[B, T, E],我們就可以把它們拼接到一起變成[B, T, 2E]。

然后經過一個輸入是2E,輸出是1的神經網絡,最終得到[B, T, 1]的結果,我們把它調換一下維度,變成[B, 1, T],這個就是我們想要的權重了。

這里我找來一份Pytorch的代碼,大家代入一下上面的邏輯去看一下,應該不難看懂。

class LocalActivationUnit(nn.Module):

def __init__(self, hidden_units=(64, 32), embedding_dim=4, activation='sigmoid', dropout_rate=0, dice_dim=3,
             l2_reg=0, use_bn=False):
    super(LocalActivationUnit, self).__init__()

    self.dnn = DNN(inputs_dim=4 * embedding_dim,
                   hidden_units=hidden_units,
                   activation=activation,
                   l2_reg=l2_reg,
                   dropout_rate=dropout_rate,
                   dice_dim=dice_dim,
                   use_bn=use_bn)

    self.dense = nn.Linear(hidden_units[-1], 1)

def forward(self, query, user_behavior): # query ad : size -> batch_size * 1 * embedding_size # user behavior : size -> batch_size * time_seq_len * embedding_size user_behavior_len = user_behavior.size(1)

queries = query.expand(-1, user_behavior_len, -1)

    attention_input = torch.cat([queries, user_behavior, queries - user_behavior, queries * user_behavior],
                                dim=-1)  # as the source code, subtraction simulates verctors' difference
    attention_output = self.dnn(attention_input)

    attention_score = self.dense(attention_output)  # [B, T, 1]

    return attention_score

其實這一段代碼就是attention網絡的核心,它生成的是attention中最重要的權重。權重有了之后,我們只需要將它和用戶行為序列的embedding相乘。利用矩陣乘法的特性,一個[B, 1. T]的矩陣乘上一個[B, T, E]的矩陣,會得到[B, 1, E]的結果。這個相乘之后的結果其實就是我們需要的加權求和,只不過是通過矩陣乘法來實現了。

我們再看下源碼加深一下理解:

class AttentionSequencePoolingLayer(nn.Module): """The Attentional sequence pooling operation used in DIN & DIEN.

Arguments
      - **att_hidden_units**:list of positive integer, the attention net layer number and units in each layer.

      - **att_activation**: Activation function to use in attention net.

      - **weight_normalization**: bool.Whether normalize the attention score of local activation unit.

      - **supports_masking**:If True,the input need to support masking.

    References
      - [Zhou G, Zhu X, Song C, et al. Deep interest network for click-through rate prediction[C]//Proceedings of the 24th ACM SIGKDD International Conference on Knowledge Discovery & Data Mining. ACM, 2018: 1059-1068.](https://arxiv.org/pdf/1706.06978.pdf)
  """

def __init__(self, att_hidden_units=(80, 40), att_activation='sigmoid', weight_normalization=False,
             return_score=False, supports_masking=False, embedding_dim=4, **kwargs):
    super(AttentionSequencePoolingLayer, self).__init__()
    self.return_score = return_score
    self.weight_normalization = weight_normalization
    self.supports_masking = supports_masking
    self.local_att = LocalActivationUnit(hidden_units=att_hidden_units, embedding_dim=embedding_dim,
                                         activation=att_activation,
                                         dropout_rate=0, use_bn=False)

[docs] def forward(self, query, keys, keys_length, mask=None): """ Input shape - A list of three tensor: [query,keys,keys_length]

- query is a 3D tensor with shape:  ``(batch_size, 1, embedding_size)``

      - keys is a 3D tensor with shape:   ``(batch_size, T, embedding_size)``

      - keys_length is a 2D tensor with shape: ``(batch_size, 1)``

    Output shape
      - 3D tensor with shape: ``(batch_size, 1, embedding_size)``.
    """
    batch_size, max_length, _ = keys.size()

    # Mask
    if self.supports_masking:
        if mask is None:
            raise ValueError("When supports_masking=True,input must support masking")
        keys_masks = mask.unsqueeze(1)
    else:
        keys_masks = torch.arange(max_length, device=keys_length.device, dtype=keys_length.dtype).repeat(batch_size,1)  # [B, T]
        keys_masks = keys_masks < keys_length.view(-1, 1)  # 0, 1 mask
        keys_masks = keys_masks.unsqueeze(1)  # [B, 1, T]

    attention_score = self.local_att(query, keys)  # [B, T, 1]

    outputs = torch.transpose(attention_score, 1, 2)  # [B, 1, T]

    if self.weight_normalization:
        paddings = torch.ones_like(outputs) * (-2 ** 32 + 1)
    else:
        paddings = torch.zeros_like(outputs)

    outputs = torch.where(keys_masks, outputs, paddings)  # [B, 1, T]

    # Scale
    # outputs = outputs / (keys.shape[-1] ** 0.05)

    if self.weight_normalization:
        outputs = F.softmax(outputs, dim=-1)  # [B, 1, T]

    if not self.return_score:
        # Weighted sum
        outputs = torch.matmul(outputs, keys)  # [B, 1, E]

    return outputs

這段代碼當中加入了mask以及normalization等邏輯,全部忽略掉的話,真正核心的主干代碼就只有三行:

attention_score = self.local_att(query, keys) # [B, T, 1] outputs = torch.transpose(attention_score, 1, 2) # [B, 1, T] outputs = torch.matmul(outputs, keys) # [B, 1, E] 到這里我們關于attention網絡的實現方法就算是講完了,對于DIN這篇論文也就理解差不多了,不過還有一個細節值得聊聊。就是關于attention權重的問題。

在DIN這篇論文當中,我們是使用了一個單獨的LocalActivationUnit來學習的兩個embedding拼接之后的權重,也就是上圖代碼當中這個部分:

圖片圖片

我們通過一個單獨的神經網絡來對兩個向量打分給出權重,這個權重的運算邏輯并不一定是根據向量的相似度來計算的。畢竟神經網絡是一個黑盒,我們無從猜測內部邏輯。只不過從邏輯上或者經驗上來說,我們更傾向于它是根據向量的相似度來計算的。

而Transformer當中也有attention結構,它就是正兒八經地利用向量之間的相似度來計算的。常理上來說,按照向量相似度來計算權重,這種做法應該更容易理解一些。但實際上學習的過程當中的感受卻并不一定如此,這也是為什么我先來分享DIN而不是直接上transformer self-attention的原因。

責任編輯:武曉燕 來源: Coder梁
相關推薦

2023-04-26 12:46:43

DockerSpringKubernetes

2009-11-09 14:57:37

WCF上傳文件

2011-01-06 10:39:25

.NET程序打包

2021-03-12 10:01:24

JavaScript 前端表單驗證

2020-05-15 08:07:33

JWT登錄單點

2011-04-21 10:32:44

MySQL雙機同步

2011-10-06 14:32:43

2011-02-22 14:36:40

ASP.NETmsdnC#

2015-07-15 13:18:27

附近的人開發

2022-07-28 16:06:08

app分身

2016-05-12 11:54:39

2021-01-15 13:28:53

RNNPyTorch神經網絡

2021-11-09 09:01:36

Python網絡爬蟲Python基礎

2021-04-01 09:02:38

Python小說下載網絡爬蟲

2021-12-11 20:20:19

Python算法線性

2025-01-13 09:07:12

2021-04-02 10:01:00

JavaScript前端Web項目

2023-11-24 16:57:53

2019-11-13 14:39:56

EdgeBoard

2019-06-17 16:47:54

網絡協議DNS
點贊
收藏

51CTO技術棧公眾號

天天干天天爽天天操| 欧美极品aaaaabbbbb| 日产精品一区| 国产精品第13页| 99国产视频| 好吊色在线视频| 久久精品一区二区不卡| 亚洲国产精品视频在线观看 | 亚洲激情一区| 一本一道久久a久久精品逆3p| 小早川怜子一区二区三区| 99久久精品免费看国产小宝寻花| 久久蜜桃一区二区| 91精品在线观| www.久久精品视频| 欧美三级午夜理伦三级中文幕| 亚洲欧美变态国产另类| 亚洲精品在线网址| 日韩高清中文字幕一区二区| 夜夜爽夜夜爽精品视频| 亚洲 国产 欧美一区| 刘亦菲毛片一区二区三区| 日本免费新一区视频| 欧美激情国产高清| 国产在线免费av| 四虎5151久久欧美毛片| 日韩午夜在线观看| 中文字幕亚洲乱码| 性欧美1819sex性高清| 亚洲综合色区另类av| 亚洲精蜜桃久在线| 国产在线黄色| 久久亚洲一级片| 国产精品美女xx| 99视频在线观看免费| 蜜桃精品视频在线| 国产成人在线精品| 成人免费a视频| 影音先锋久久| 久久久久久久一| 国产极品国产极品| 香蕉精品视频在线观看| 最好看的2019的中文字幕视频| 中文字幕日韩三级片| 老司机精品在线| 精品国产制服丝袜高跟| 韩国三级与黑人| 国产人与zoxxxx另类91| 4438x成人网最大色成网站| 欧美三级理论片| 成人在线黄色| 欧美色图12p| 手机看片福利盒子久久| 台湾佬成人网| 欧亚一区二区三区| 亚洲成人av免费看| 国产激情久久| 精品视频一区三区九区| 高清av免费看| 天堂综合在线播放| 69av一区二区三区| www.桃色.com| 999在线精品| 亚洲第一在线视频| 熟妇高潮精品一区二区三区| 色吊丝一区二区| 亚洲女人天堂网| 免费在线观看a视频| 精品免费在线| www.亚洲天堂| 欧美三根一起进三p| 伊人久久亚洲美女图片| 97精品视频在线播放| 日本久久综合网| 青青草一区二区三区| 国产欧美中文字幕| 精品人妻久久久久一区二区三区 | 欧美精品久久久久久久多人混战| 国产又黄又猛的视频| 欧美视频精品全部免费观看| 精品国产91九色蝌蚪| 中文字幕在线免费看线人| 国产一区二区三区日韩精品| 日韩视频精品在线| 久久精品国产亚洲av香蕉| 午夜一区不卡| 成人久久18免费网站图片| 成人毛片视频免费看| 久久网站热最新地址| 亚洲一卡二卡区| 久久国产精品黑丝| 在线视频欧美区| 久久婷婷中文字幕| 亚洲人成精品久久久 | 午夜精品福利一区二区| a级影片在线观看| 欧美性少妇18aaaa视频| 亚洲另类第一页| 美女一区二区在线观看| 中文日韩电影网站| www.av视频在线观看| 美女网站一区二区| 国产专区一区二区三区| 欧洲日本在线| 欧美性极品xxxx做受| 国产乱码一区二区三区四区| 综合成人在线| 日韩中文在线中文网三级| 国产一级在线免费观看| 久久成人免费日本黄色| 精品一区二区三区视频日产| 黄色成年人视频在线观看| 欧美色xxxx| 亚洲天堂一区二区在线观看| 亚洲97av| 欧美激情三级免费| 亚洲综合精品国产一区二区三区 | 久久精品国产一区二区三区日韩| 日本中文在线| 色婷婷av一区二区三区大白胸| 香蕉视频色在线观看| 欧美日韩精品一区二区视频| 8050国产精品久久久久久| 国产欧美一级片| 国产精品免费aⅴ片在线观看| 欧美亚洲精品一区二区| 亚洲va欧美va人人爽成人影院| 中国人与牲禽动交精品| 无码人妻久久一区二区三区 | 乱人伦精品视频在线观看| 亚洲iv一区二区三区| av在线日韩国产精品| 欧美性xxxxxx| 亚洲第一页av| 一区二区三区福利| 国产一区再线| av男人的天堂在线观看| 日韩女优电影在线观看| 欧美风情第一页| 麻豆极品一区二区三区| 日韩三级电影免费观看| 久久sese| 亚洲性日韩精品一区二区| 欧产日产国产69| 26uuu精品一区二区| 精品少妇一区二区三区在线| 国产一区在线电影| 国产69精品99久久久久久宅男| 国内精品久久久久久久久久 | 香蕉视频在线网址| 日韩毛片网站| 日韩在线观看av| 国产美女三级无套内谢| 亚洲欧美激情插| 丰满少妇中文字幕| 国产字幕视频一区二区| 古典武侠综合av第一页| 123区在线| 国产视频亚洲视频| 亚洲av无码不卡| 欧美国产禁国产网站cc| 杨幂毛片午夜性生毛片 | 成人一级生活片| 91国内精品| 97在线观看免费高清| 深夜福利在线视频| 在线视频一区二区三| 久草手机视频在线观看| 国产资源在线一区| av一区二区三区免费观看| 国产精品天天看天天狠| 日韩女在线观看| 亚洲成a人v欧美综合天堂麻豆| 欧美剧情片在线观看| 亚洲国产精品久| 99精品黄色片免费大全| 亚洲色图38p| 91成人观看| 好吊妞www.84com只有这里才有精品| 日韩精品极品| 最近2019免费中文字幕视频三| 国产欧美日韩综合精品一区二区三区| 亚洲国产一区视频| 日韩中文字幕有码| 狠狠色丁香九九婷婷综合五月| 久久久久久久久久伊人| 日本欧美高清| 国产日韩在线播放| free性欧美| 亚洲视频一区二区| www天堂在线| 色悠悠久久综合| 希岛爱理中文字幕| 久久综合九色综合欧美亚洲| 午夜剧场在线免费观看| 99精品国产在热久久下载| 图片区小说区区亚洲五月| 97se亚洲国产一区二区三区| 国产精品扒开腿做爽爽爽视频| 26uuu亚洲电影在线观看| 亚洲人成77777在线观看网| 97人妻人人澡人人爽人人精品| 激情av一区二区| 色偷偷www8888| 久久亚洲捆绑美女| 一个人看的视频www| 免费成人你懂的| 欧美深夜福利视频| 91精品国产乱码久久久久久| 国产一级二级三级精品| 亚洲精品成a人ⅴ香蕉片| 91po在线观看91精品国产性色| 精品国产99久久久久久| 精品视频偷偷看在线观看| av在线资源观看| 欧美亚洲国产bt| 日韩免费视频一区二区视频在线观看 | 国产精品久久久91| а√天堂8资源在线| www.欧美三级电影.com| 岛国大片在线观看| 日韩av影视在线| 亚洲av色香蕉一区二区三区| 欧美日韩一区不卡| 69视频免费看| 韩曰欧美视频免费观看| 日韩精品一区三区| 一区二区三区在线视频免费 | 亚洲啊v在线观看| 亚洲欧美日韩另类精品一区二区三区 | 日韩精品丝袜在线| 高h放荡受浪受bl| 日韩欧美色综合| 国产日韩一级片| 欧美久久久影院| 在线中文字幕网站| 欧美中文字幕亚洲一区二区va在线| 97免费在线观看视频| 亚洲午夜av在线| 国产一级理论片| 亚洲一区二区免费视频| 久久久久亚洲天堂| 一区二区三区日韩精品| caoporn91| 亚洲欧美电影一区二区| 色偷偷www8888| 亚洲视频在线一区二区| 麻豆天美蜜桃91| 亚洲欧洲制服丝袜| 中文字幕手机在线观看| 一级特黄大欧美久久久| 久久久久久久久久久97| 午夜电影网一区| 久久午夜免费视频| 欧美午夜激情在线| 久久影视中文字幕| 欧美亚洲动漫制服丝袜| 亚洲一区中文字幕永久在线| 欧美久久久一区| 国产av精国产传媒| 亚洲成人xxx| 天堂资源中文在线| 国产一区二区三区视频免费| 在线看黄色av| 美女视频黄免费的亚洲男人天堂| 在线中文免费视频| 91精品国产91久久久久久不卡| 在线手机中文字幕| 国产精品久久久久国产a级| 香蕉成人在线| 国产成人免费观看| 九九久久成人| 在线视频不卡一区二区三区| 黄色日韩在线| 国产欧美高清在线| 久久er99热精品一区二区| 91人妻一区二区三区| aaa亚洲精品| 手机免费观看av| 一区二区三区加勒比av| 国产精品久久久久久久久久久久久久久久久| 一本大道久久a久久精品综合| 中文字幕在线观看视频一区| 欧美成人综合网站| 精品久久av| 欧美大成色www永久网站婷| 天堂av中文在线观看| 国产在线999| 欧美一区二区三区久久| 中文字幕av日韩精品| 亚洲激精日韩激精欧美精品| 久久久精品麻豆| 丁香激情综合国产| 三年中国中文观看免费播放| 夜夜嗨av一区二区三区中文字幕| 国产伦精品一区二区三区视频我| 欧美一区二区三区人| 六十路在线观看| 欧美疯狂xxxx大交乱88av| 外国成人直播| 国产高清精品一区二区三区| 精品国产乱码| 无码专区aaaaaa免费视频| 久久99热这里只有精品| 亚洲av无码一区二区三区网址 | 午夜欧美一区二区三区免费观看| 国产精品草草| 亚洲精品第三页| 久久午夜羞羞影院免费观看| 欧美日韩免费一区二区| 欧美日韩国产高清一区二区| 五月婷婷免费视频| 久久99久久99精品中文字幕 | 亚洲国产二区| 伊人色在线视频| 国产欧美一区二区精品久导航 | 国内揄拍国内精品久久| 色综合天天色综合| 久久精品人人爽人人爽| 日本一级淫片色费放| 日韩一区二区三区四区| 2019中文字幕在线视频| 26uuu国产精品视频| 岛国av一区| 国产精品无码免费专区午夜| 久久精品久久精品| 黄大色黄女片18免费| 91久久精品一区二区三| 日韩福利一区二区| 97久久国产精品| 亚洲不卡在线| 成人午夜免费剧场| 精品伊人久久久久7777人| www.涩涩爱| 欧美视频一区二区| 成在在线免费视频| 国产激情综合五月久久| 免费久久久久久久久| 欧美牲交a欧美牲交aⅴ免费真 | 牛人盗摄一区二区三区视频| 日韩视频一区| 噜噜噜在线视频| 日韩欧美成人精品| 五月激情婷婷综合| 2019亚洲日韩新视频| 欧美网色网址| 一本大道熟女人妻中文字幕在线 | 国产亚洲人成a在线v网站| 欧美午夜精品久久久久久蜜| 每日更新成人在线视频| 国产精品亚洲无码| 在线观看亚洲专区| 午夜不卡视频| 96pao国产成视频永久免费| 欧美在线看片| 尤物网站在线观看| 欧美色道久久88综合亚洲精品| 精品av中文字幕在线毛片| 国产精品一二三在线| 亚洲综合婷婷| 亚洲精品激情视频| 欧美性极品xxxx做受| a黄色在线观看| 91夜夜未满十八勿入爽爽影院| 欧美激情一级片一区二区| 911亚洲精选| 欧美视频不卡中文| jzzjzzjzz亚洲成熟少妇| 成人在线视频网| 欧美日韩三级| 成人网站免费观看| 欧美日韩不卡视频| 视频在线观看入口黄最新永久免费国产| 国产精品视频免费观看| 性一交一乱一区二区洋洋av| 色屁屁草草影院ccyy.com| 在线电影院国产精品| heyzo高清中文字幕在线| 日韩av不卡播放| 国产精品一区二区三区网站| 日本污视频在线观看| 亚洲丝袜一区在线| 榴莲视频成人app| 黄色片视频在线免费观看| 亚洲欧洲精品天堂一级| 色一情一乱一乱一区91av| 国产精品久久不能| 欧美成人久久| 免费在线观看污| 欧美一卡在线观看| 一区一区三区| 在线观看污视频| 国产亚洲一区字幕| 亚洲爆乳无码一区二区三区| 国产97在线播放| 欧美色一级片| 老司机福利在线观看| 亚洲а∨天堂久久精品9966| 久久青草视频| 欧美三级一级片|