Skip to content

Commit f9c5109

Browse files
authored
Add files via upload
1 parent 2e57ad7 commit f9c5109

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

58 files changed

+867
-23
lines changed

bert4keras3/Layers_add/Attentions.py

+398-3
Large diffs are not rendered by default.

bert4keras3/Layers_add/Embeddings.py

+78-1
Original file line numberDiff line numberDiff line change
@@ -481,4 +481,81 @@ def compute_output_spec(self, inputs, reverse=False):
481481
output_shape[-1] = self.input_dim
482482
else:
483483
output_shape += [self.output_dim]
484-
return keras.KerasTensor(output_shape, dtype=self.dtype)
484+
return keras.KerasTensor(output_shape, dtype=self.dtype)
485+
486+
class DebertaRelativeEmbedding(keras.layers.Layer):
487+
"""Relative embedding layer.
488+
this code from keras_nlp
489+
This is an implementation of relative embedding as described in the
490+
paper ["DeBERTaV3: Improving DeBERTa using ELECTRA-Style Pre-Training with Gradient-Disentangled Embedding Sharing"](https://arxiv.org/abs/2111.09543).
491+
This layer initializes an embedding matrix (of shape
492+
`(2 * batch_size, hidden_dim)`) for relative position encoding. It then
493+
applies layer normalization on the embedding matrix and returns the relative
494+
embedding matrix.
495+
496+
Args:
497+
hidden_dim: int. The size of the dense embedding.
498+
bucket_size: int. The size of the relative position buckets.
499+
layer_norm_epsilon: float. Epsilon value to initialize the layer
500+
normalization layer.
501+
kernel_initializer: string or `keras.initializers` initializer.
502+
The kernel initializer for the dense embedding.
503+
Defaults to `"glorot_uniform"`.
504+
"""
505+
506+
def __init__(
507+
self,
508+
hidden_dim,
509+
bucket_size,
510+
layer_norm_epsilon=1e-05,
511+
kernel_initializer="glorot_uniform",
512+
**kwargs,
513+
):
514+
super().__init__(**kwargs)
515+
516+
self.hidden_dim = hidden_dim
517+
self.bucket_size = bucket_size
518+
self.layer_norm_epsilon = layer_norm_epsilon
519+
self.kernel_initializer = keras.initializers.get(kernel_initializer)
520+
521+
self.rel_embeddings = self.add_weight(
522+
shape=(self.bucket_size * 2, self.hidden_dim),
523+
initializer=self.kernel_initializer,
524+
name="rel_embedding",
525+
)
526+
self.layer_norm = keras.layers.LayerNormalization(
527+
epsilon=layer_norm_epsilon,
528+
dtype=self.dtype_policy,
529+
name="rel_embeddings_layer_norm",
530+
)
531+
532+
def call(self, inputs):
533+
batch_size = ops.shape(inputs)[0]
534+
535+
rel_embeddings = ops.expand_dims(
536+
ops.convert_to_tensor(self.rel_embeddings), axis=0
537+
)
538+
rel_embeddings = self.layer_norm(rel_embeddings)
539+
540+
# Repeat `rel_embeddings` along axis = 0 `batch_size` times. The
541+
# resultant shape is `(batch_size, bucket_size * 2, hidden_dim)`.
542+
rel_embeddings = ops.repeat(rel_embeddings, repeats=batch_size, axis=0)
543+
544+
return rel_embeddings
545+
546+
def get_config(self):
547+
config = super().get_config()
548+
config.update(
549+
{
550+
"hidden_dim": self.hidden_dim,
551+
"bucket_size": self.bucket_size,
552+
"layer_norm_epsilon": self.layer_norm_epsilon,
553+
"kernel_initializer": keras.initializers.serialize(
554+
self.kernel_initializer
555+
),
556+
}
557+
)
558+
return config
559+
560+
def compute_output_shape(self, input_shape):
561+
return (input_shape[0],) + (self.bucket_size * 2, self.hidden_dim)
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

0 commit comments

Comments
 (0)