精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

究竟Self-Attention結構是怎樣的?

WpOh_rgznai100 ? 來源:lq ? 2019-07-18 14:29 ? 次閱讀

一、Self-Attention概念詳解

了解了模型大致原理,我們可以詳細的看一下究竟Self-Attention結構是怎樣的。其基本結構如下

對于self-attention來講,Q(Query), K(Key), V(Value)三個矩陣均來自同一輸入,首先我們要計算Q與K之間的點乘,然后為了防止其結果過大,會除以一個尺度標度,其中為一個query和key向量的維度。再利用Softmax操作將其結果歸一化為概率分布,然后再乘以矩陣V就得到權重求和的表示。該操作可以表示為

這里可能比較抽象,我們來看一個具體的例子(圖片來源于https://jalammar.github.io/illustrated-transformer/),該博客講解的極其清晰,強烈推薦),假如我們要翻譯一個詞組Thinking Machines,其中Thinking的輸入的embedding vector用表示,Machines的embedding vector用表示。

當我們處理Thinking這個詞時,我們需要計算句子中所有詞與它的Attention Score,這就像將當前詞作為搜索的query,去和句子中所有詞(包含該詞本身)的key去匹配,看看相關度有多高。我們用代表Thinking對應的query vector,及分別代表Thinking以及Machines對應的key vector,則計算Thinking的attention score的時候我們需要計算與的點乘,同理,我們計算Machines的attention score的時候需要計算與的點乘。如上圖中所示我們分別得到了與的點乘積,然后我們進行尺度縮放與softmax歸一化,如下圖所示:

顯然,當前單詞與其自身的attention score一般最大,其他單詞根據與當前單詞重要程度有相應的score。然后我們在用這些attention score與value vector相乘,得到加權的向量。

如果將輸入的所有向量合并為矩陣形式,則所有query, key, value向量也可以合并為矩陣形式表示:

其中是我們模型訓練過程學習到的合適的參數。上述操作即可簡化為矩陣形式:

二、Self_Attention模型搭建

筆者使用Keras來實現對于Self_Attention模型的搭建,由于網絡中間參數量比較多,這里采用自定義網絡層的方法構建Self_Attention。

Keras實現自定義網絡層。需要實現以下三個方法:(注意input_shape是包含batch_size項的)

build(input_shape): 這是你定義權重的地方。這個方法必須設self.built = True,可以通過調用super([Layer], self).build()完成。

call(x): 這里是編寫層的功能邏輯的地方。你只需要關注傳入call的第一個參數:輸入張量,除非你希望你的層支持masking。

compute_output_shape(input_shape): 如果你的層更改了輸入張量的形狀,你應該在這里定義形狀變化的邏輯,這讓Keras能夠自動推斷各層的形狀。

實現代碼如下:

from keras.preprocessing import sequencefrom keras.datasets import imdbfrom matplotlib import pyplot as pltimport pandas as pdfrom keras import backend as Kfrom keras.engine.topology import Layerclass Self_Attention(Layer): def __init__(self, output_dim, **kwargs): self.output_dim = output_dim super(Self_Attention, self).__init__(**kwargs) def build(self, input_shape): # 為該層創建一個可訓練的權重 #inputs.shape = (batch_size, time_steps, seq_len) self.kernel = self.add_weight(name='kernel', shape=(3,input_shape[2], self.output_dim), initializer='uniform', trainable=True) super(Self_Attention, self).build(input_shape) # 一定要在最后調用它 def call(self, x): WQ = K.dot(x, self.kernel[0]) WK = K.dot(x, self.kernel[1]) WV = K.dot(x, self.kernel[2]) print("WQ.shape",WQ.shape) print("K.permute_dimensions(WK, [0, 2, 1]).shape",K.permute_dimensions(WK, [0, 2, 1]).shape) QK = K.batch_dot(WQ,K.permute_dimensions(WK, [0, 2, 1])) QK = QK / (64**0.5) QK = K.softmax(QK) print("QK.shape",QK.shape) V = K.batch_dot(QK,WV) return V def compute_output_shape(self, input_shape): return (input_shape[0],input_shape[1],self.output_dim)

這里可以對照一中的概念講解來理解代碼

如果將輸入的所有向量合并為矩陣形式,則所有query, key, value向量也可以合并為矩陣形式表示

上述內容對應

WQ = K.dot(x, self.kernel[0])WK = K.dot(x, self.kernel[1])WV = K.dot(x, self.kernel[2])

其中是我們模型訓練過程學習到的合適的參數。上述操作即可簡化為矩陣形式:

上述內容對應(為什么使用batch_dot呢?這是由于input_shape是包含batch_size項的)

QK = K.batch_dot(WQ,K.permute_dimensions(WK, [0, 2, 1]))QK = QK / (64**0.5)QK = K.softmax(QK)print("QK.shape",QK.shape)V = K.batch_dot(QK,WV)

這里QK = QK / (64**0.5) 是除以一個歸一化系數,(64**0.5)是筆者自己定義的,其他文章可能會采用不同的方法。

三、訓練網絡

項目完整代碼如下,這里使用的是Keras自帶的imdb影評數據集。

#%%from keras.preprocessing import sequencefrom keras.datasets import imdbfrom matplotlib import pyplot as pltimport pandas as pdfrom keras import backend as Kfrom keras.engine.topology import Layerclass Self_Attention(Layer): def __init__(self, output_dim, **kwargs): self.output_dim = output_dim super(Self_Attention, self).__init__(**kwargs) def build(self, input_shape): # 為該層創建一個可訓練的權重 #inputs.shape = (batch_size, time_steps, seq_len) self.kernel = self.add_weight(name='kernel', shape=(3,input_shape[2], self.output_dim), initializer='uniform', trainable=True) super(Self_Attention, self).build(input_shape) # 一定要在最后調用它 def call(self, x): WQ = K.dot(x, self.kernel[0]) WK = K.dot(x, self.kernel[1]) WV = K.dot(x, self.kernel[2]) print("WQ.shape",WQ.shape) print("K.permute_dimensions(WK, [0, 2, 1]).shape",K.permute_dimensions(WK, [0, 2, 1]).shape) QK = K.batch_dot(WQ,K.permute_dimensions(WK, [0, 2, 1])) QK = QK / (64**0.5) QK = K.softmax(QK) print("QK.shape",QK.shape) V = K.batch_dot(QK,WV) return V def compute_output_shape(self, input_shape): return (input_shape[0],input_shape[1],self.output_dim)max_features = 20000print('Loading data...')(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=max_features)#標簽轉換為獨熱碼y_train, y_test = pd.get_dummies(y_train),pd.get_dummies(y_test)print(len(x_train), 'train sequences')print(len(x_test), 'test sequences')#%%數據歸一化處理maxlen = 64print('Pad sequences (samples x time)')x_train = sequence.pad_sequences(x_train, maxlen=maxlen)x_test = sequence.pad_sequences(x_test, maxlen=maxlen)print('x_train shape:', x_train.shape)print('x_test shape:', x_test.shape)#%%batch_size = 32from keras.models import Modelfrom keras.optimizers import SGD,Adamfrom keras.layers import *from Attention_keras import Attention,Position_EmbeddingS_inputs = Input(shape=(64,), dtype='int32')embeddings = Embedding(max_features, 128)(S_inputs)O_seq = Self_Attention(128)(embeddings)O_seq = GlobalAveragePooling1D()(O_seq)O_seq = Dropout(0.5)(O_seq)outputs = Dense(2, activation='softmax')(O_seq)model = Model(inputs=S_inputs, outputs=outputs)print(model.summary())# try using different optimizers and different optimizer configsopt = Adam(lr=0.0002,decay=0.00001)loss = 'categorical_crossentropy'model.compile(loss=loss, optimizer=opt, metrics=['accuracy'])#%%print('Train...')h = model.fit(x_train, y_train, batch_size=batch_size, epochs=5, validation_data=(x_test, y_test))plt.plot(h.history["loss"],label="train_loss")plt.plot(h.history["val_loss"],label="val_loss")plt.plot(h.history["acc"],label="train_acc")plt.plot(h.history["val_acc"],label="val_acc")plt.legend()plt.show()#model.save("imdb.h5")

四、結果輸出

(TF_GPU) D:FilesDATAsprjspython f_keras ransfromerdemo>C:/Files/APPs/RuanJian/Miniconda3/envs/TF_GPU/python.exe d:/Files/DATAs/prjs/python/tf_keras/transfromerdemo/train.1.pyUsing TensorFlow backend.Loading data...25000 train sequences25000 test sequencesPad sequences (samples x time)x_train shape: (25000, 64)x_test shape: (25000, 64)WQ.shape (?, 64, 128)K.permute_dimensions(WK, [0, 2, 1]).shape (?, 128, 64)QK.shape (?, 64, 64)_________________________________________________________________Layer (type) Output Shape Param #=================================================================input_1 (InputLayer) (None, 64) 0_________________________________________________________________embedding_1 (Embedding) (None, 64, 128) 2560000_________________________________________________________________self__attention_1 (Self_Atte (None, 64, 128) 49152_________________________________________________________________global_average_pooling1d_1 ( (None, 128) 0_________________________________________________________________dropout_1 (Dropout) (None, 128) 0_________________________________________________________________dense_1 (Dense) (None, 2) 258=================================================================Total params: 2,609,410Trainable params: 2,609,410Non-trainable params: 0_________________________________________________________________NoneTrain...Train on 25000 samples, validate on 25000 samplesEpoch 1/525000/25000 [==============================] - 17s 693us/step - loss: 0.5244 - acc: 0.7514 - val_loss: 0.3834 - val_acc: 0.8278Epoch 2/525000/25000 [==============================] - 15s 615us/step - loss: 0.3257 - acc: 0.8593 - val_loss: 0.3689 - val_acc: 0.8368Epoch 3/525000/25000 [==============================] - 15s 614us/step - loss: 0.2602 - acc: 0.8942 - val_loss: 0.3909 - val_acc: 0.8303Epoch 4/525000/25000 [==============================] - 15s 618us/step - loss: 0.2078 - acc: 0.9179 - val_loss: 0.4482 - val_acc: 0.8215Epoch 5/525000/25000 [==============================] - 15s 619us/step - loss: 0.1639 - acc: 0.9368 - val_loss: 0.5313 - val_acc: 0.8106

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 計算
    +關注

    關注

    2

    文章

    445

    瀏覽量

    38736
  • 矩陣
    +關注

    關注

    0

    文章

    422

    瀏覽量

    34502
  • 機制
    +關注

    關注

    0

    文章

    24

    瀏覽量

    9774

原文標題:機器如何讀懂人心:Keras實現Self-Attention文本分類

文章出處:【微信號:rgznai100,微信公眾號:rgznai100】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    面向列的HBase存儲結構究竟有什么樣的不同之處呢?

    HBase是什么?HBase的存儲結構究竟怎樣的呢?面向列的HBase存儲結構究竟有什么樣的不同之處呢?
    發表于 06-16 06:52

    暴風電視拆機圖解 內部結構究竟怎樣

    繼樂視、小米之后,國內另一家互聯網公司--暴風影音也發布了旗下的智能電視產品,而且同樣是分體式設計。而今天我們就來看看愛玩客帶來的暴風電視的內部結構究竟怎樣的。
    的頭像 發表于 09-04 14:32 ?3.1w次閱讀

    BERT模型的PyTorch實現

    BertModel是一個基本的BERT Transformer模型,包含一個summed token、位置和序列嵌入層,然后是一系列相同的self-attention blocks(BERT-base是12個blocks, BERT-large是24個blocks)。
    的頭像 發表于 11-13 09:12 ?1.4w次閱讀

    為什么要有attention機制,Attention原理

    沒有attention機制的encoder-decoder結構通常把encoder的最后一個狀態作為decoder的輸入(可能作為初始化,也可能作為每一時刻的輸入),但是encoder的state
    的頭像 發表于 03-06 14:11 ?1.7w次閱讀
    為什么要有<b class='flag-5'>attention</b>機制,<b class='flag-5'>Attention</b>原理

    AAAI 2019 Gaussian Transformer 一種自然語言推理方法

    自然語言推理 (Natural Language Inference, NLI) 是一個活躍的研究領域,許多基于循環神經網絡(RNNs),卷積神經網絡(CNNs),self-attention 網絡 (SANs) 的模型為此提出。
    的頭像 發表于 05-14 09:45 ?3061次閱讀
    AAAI 2019 Gaussian Transformer 一種自然語言推理方法

    解析Transformer中的位置編碼 -- ICLR 2021

    引言 Transformer是近年來非常流行的處理序列到序列問題的架構,其self-attention機制允許了長距離的詞直接聯系,可以使模型更容易學習序列的長距離依賴。由于其優良的可并行性以及可觀
    的頭像 發表于 04-01 16:07 ?1.3w次閱讀
    解析Transformer中的位置編碼 -- ICLR 2021

    一個LSTM被分解成垂直和水平的LSTM

    Vision Transformer成功的原因被認為是由于Self-Attention建模遠程依賴的能力。然而,Self-Attention對于Transformer執行視覺任務的有效性有多重要還不清楚。事實上,只基于多層感知器(MLPs)的MLP-Mixer被提議作為V
    的頭像 發表于 05-07 16:29 ?1336次閱讀

    全球首個面向遙感任務設計的億級視覺Transformer大模型

    Attention, RVSA)來代替Transformer中的原始完全注意力(Vanilla Full Self-Attention),它可以從生成的不同窗口中提取豐富的上下文信息來學習更好的目標表征,并顯著降低計算成本和內存占用。
    的頭像 發表于 12-09 14:53 ?716次閱讀

    基于視覺transformer的高效時空特征學習算法

    視覺Transofrmer通常將圖像分割為不重疊的塊(patch),patch之間通過自注意力機制(Self-Attention)進行特征聚合,patch內部通過全連接層(FFN)進行特征映射。每個
    的頭像 發表于 12-12 15:01 ?1461次閱讀

    簡述深度學習中的Attention機制

    Attention機制在深度學習中得到了廣泛的應用,本文通過公式及圖片詳細講解attention機制的計算過程及意義,首先從最早引入attention到機器翻譯任務(Bahdanau et al. ICLR2014)的方法講起。
    的頭像 發表于 02-22 14:21 ?1617次閱讀
    簡述深度學習中的<b class='flag-5'>Attention</b>機制

    解析ChatGPT背后的技術演進

    。  2)Transformer模型沒有使用傳統的CNN和RNN結構,其完全是由Attention機制組成,其中Self-Attention(自注意力)是Transformer的核心。  3)OpenAI的GPT模型和Googl
    發表于 03-29 16:57 ?1次下載

    如何入門面向自動駕駛領域的視覺Transformer?

    理解Transformer背后的理論基礎,比如自注意力機制(self-attention), 位置編碼(positional embedding),目標查詢(object query)等等,網上的資料比較雜亂,不夠系統,難以通過自學做到深入理解并融會貫通。
    的頭像 發表于 07-09 14:35 ?543次閱讀
    如何入門面向自動駕駛領域的視覺Transformer?

    基于Transformer的目標檢測算法的3個難點

    理解Transformer背后的理論基礎,比如自注意力機制(self-attention), 位置編碼(positional embedding),目標查詢(object query)等等,網上的資料比較雜亂,不夠系統,難以通過自學做到深入理解并融會貫通。
    發表于 07-18 12:54 ?646次閱讀
    基于Transformer的目標檢測算法的3個難點

    基于Transformer的目標檢測算法難點

    理解Transformer背后的理論基礎,比如自注意力機制(self-attention), 位置編碼(positional embedding),目標查詢(object query)等等,網上的資料比較雜亂,不夠系統,難以通過自學做到深入理解并融會貫通。
    發表于 08-24 11:19 ?297次閱讀
    基于Transformer的目標檢測算法難點

    視覺Transformer基本原理及目標檢測應用

    視覺Transformer的一般結構如圖2所示,包括編碼器和解碼器兩部分,其中編碼器每一層包括一個多頭自注意力模塊(self-attention)和一個位置前饋神經網絡(FFN)。
    發表于 04-03 10:32 ?3249次閱讀
    視覺Transformer基本原理及目標檢測應用