Day 28 利用transformer自己实作一个翻译程序(十) Encoder layer

Transformer跟用attention的Seq2Seq的模型有着一样的pattern

  • 输入的句子通过N个Encoder layer,把序列中的每一个token都标记成输出
  • Decoder用Encoder的输出和自己的输入来预测下一个文字

Encoder layer

每个encoder layer都是由几个子层组成的

  1. Multi-head attention
  2. Point wise feed forward network

这些子层的周围都有一个残差连接,然後做正规化

残差连接有助於避免深度网路中的梯度消失问题

每一个子层的输出是LayerNorm(x + Sublayer(x))

正规化是在d_model的轴上完成的

Transformer中共有N个Encoder layer

class EncoderLayer(tf.keras.layers.Layer):
  def __init__(self, d_model, num_heads, dff, rate=0.1):
    super(EncoderLayer, self).__init__()

    self.mha = MultiHeadAttention(d_model, num_heads)
    self.ffn = point_wise_feed_forward_network(d_model, dff)

    self.layernorm1 = tf.keras.layers.LayerNormalization(epsilon=1e-6)
    self.layernorm2 = tf.keras.layers.LayerNormalization(epsilon=1e-6)

    self.dropout1 = tf.keras.layers.Dropout(rate)
    self.dropout2 = tf.keras.layers.Dropout(rate)

  def call(self, x, training, mask):

    attn_output, _ = self.mha(x, x, x, mask)  # (batch_size, input_seq_len, d_model)
    attn_output = self.dropout1(attn_output, training=training)
    out1 = self.layernorm1(x + attn_output)  # (batch_size, input_seq_len, d_model)

    ffn_output = self.ffn(out1)  # (batch_size, input_seq_len, d_model)
    ffn_output = self.dropout2(ffn_output, training=training)
    out2 = self.layernorm2(out1 + ffn_output)  # (batch_size, input_seq_len, d_model)

    return out2
sample_encoder_layer = EncoderLayer(512, 8, 2048)

sample_encoder_layer_output = sample_encoder_layer(
    tf.random.uniform((64, 43, 512)), False, None)

sample_encoder_layer_output.shape  # (batch_size, input_seq_len, d_model)
TensorShape([64, 43, 512])

<<:  day13 Kotlin coroutine channel操作

>>:  30天轻松学会unity自制游戏-粒子系统

[前端暴龙机,Vue2.x 进化 Vue3 ] Day5. Vue的起手开发

接下来,开始看看如何着手进行 Vue 的开发吧 这边都是透过最原始、最简单的网页开发模式进行,所以不...

Parser Generator (二)

上一篇我们讲解怎麽产生目标 parser 的 parse 方法,这篇来讲解 generator 的内...

Day 01 阿修补坑中

第一天先来聊聊我的背景以及为什麽我会想写这个主题 原本我是一名品保工程师,做了3、4年发现这份工作开...

Day07 - 【入门篇】什麽是OAuth

本系列文之後也会置於个人网站 先来回忆一下,何爲「授权」。试想像有一座宅邸,里头有无数房间。而你作...

Day13-"练习二维阵列"

今天练了一下二维阵列 利用scanf将输入的数值与自己相乘後,并将结果反着印出,最後一个输入的数值第...